lib/rack/jquery_ui.rb in rack-jquery_ui-2.2.0 vs lib/rack/jquery_ui.rb in rack-jquery_ui-3.0.0

- old
+ new

@@ -15,11 +15,11 @@ # Namespaced for convenience, to help with checking # which CDN supports what. module CDNs # Script tags for the Media Temple CDN - MEDIA_TEMPLE = "http://code.jquery.com/ui/#{JQUERY_UI_VERSION}/jquery-ui.js" + MEDIA_TEMPLE = "http://code.jquery.com/ui/#{JQUERY_UI_VERSION}/jquery-ui.min.js" # Script tags for the Google CDN GOOGLE = "//ajax.googleapis.com/ajax/libs/jqueryui/#{JQUERY_UI_VERSION}/jquery-ui.min.js" # Script tags for the Microsoft CDN @@ -28,62 +28,86 @@ # Script tags for the Cloudflare CDN CLOUDFLARE = "//cdnjs.cloudflare.com/ajax/libs/jqueryui/#{JQUERY_UI_VERSION}/jquery-ui.min.js" end + + # path to the fallback script + FALLBACK_PATH = "/js/jquery-ui/#{JQUERY_UI_VERSION}/#{JQUERY_UI_FILE_NAME}" + # This javascript checks if the jQuery-UI object has loaded. If not, that most likely means the CDN is unreachable, so it uses the local minified jQuery. FALLBACK = <<STR <script type="text/javascript"> - !window.jQuery.ui && document.write(unescape("%3Cscript src='/js/jquery-ui/#{JQUERY_UI_VERSION}/#{JQUERY_UI_FILE_NAME}' type='text/javascript'%3E%3C/script%3E")) + !window.jQuery.ui && document.write(unescape("%3Cscript src='#{FALLBACK_PATH}' type='text/javascript'%3E%3C/script%3E")) </script> STR - # @param [Symbol] organisation Choose which CDN to use, either :google, :microsoft or :media_temple, or :cloudflare + # @param [Hash] env The rack env hash. + # @param [Hash] options + # @option options [Symbol,false,nil] :organisation Choose which CDN to use, either :google, :microsoft or :media_temple, or :cloudflare. Pass in `false` to force use of the local jQuery script. `nil` will force choosing the default CDN. + # @option options [true, false] :debug If you need the unminified version from the CDN for debugging then pass this in. The unminified scripts aren't included via the fallback to keep the library light, so this won't change anything if fallback is used. # @return [String] The HTML script tags to get the CDN. - def self.cdn( organisation=:media_temple, options={} ) + # @example + # # in a Haml fileā€¦ (but could be any type of template) + # # For the default + # Rack::JQueryUI.cdn env + # + # # Choose the organisation + # Rack::JQueryUI.cdn env, :organisation => :cloudflare + # + # # Raise an error if the organisation doesn't + # # support this version of jQuery UI + # Rack::JQueryUI.cdn env, :raise => true + # + # # Use the unminified version from the CDN + # Rack::JQueryUI.cdn env, :debug => true + # + def self.cdn( env, options={} ) + if env.nil? || env.has_key?(:organisation) + fail ArgumentError, "The Rack::JQueryUI.cdn method needs the Rack environment passed to it, or at the very least, an empty hash." + end raise = (opt = options[:raise]).nil? ? - raise? : - opt - script = if organisation === :media_temple - CDNs::MEDIA_TEMPLE - elsif organisation === :microsoft - CDNs::MICROSOFT - elsif organisation === :cloudflare - CDNs::CLOUDFLARE - elsif organisation === :google - CDNs::GOOGLE - else - CDNs::MEDIA_TEMPLE + opt : + (env["rack.jquery_ui.raise"] || false) + + organisation = options[:organisation] + if organisation.nil? # because false is valid + organisation = env["rack.jquery_ui.organisation"] || + :media_temple end - "<script src='#{script}'></script>\n#{FALLBACK}" + + unless organisation == false + script_src = if organisation === :media_temple + CDNs::MEDIA_TEMPLE + elsif organisation === :microsoft + CDNs::MICROSOFT + elsif organisation === :cloudflare + CDNs::CLOUDFLARE + elsif organisation === :google + CDNs::GOOGLE + else + CDNs::MEDIA_TEMPLE + end + + debug = options.fetch :debug, false + + script_src = "#{script_src[0..-7]}js" if debug + "<script src='#{script_src}'></script>\n#{FALLBACK}" + else + "<script src='#{FALLBACK_PATH}'></script>" + end end # Default options hash for the middleware. DEFAULT_OPTIONS = { :http_path => "/js/jquery-ui/#{JQUERY_UI_VERSION}", :raise => false } - # Whether to raise an exception if the chosen CDN - # does not support the jQuery UI version this library is using - # @param [TrueClass] bool - def self.raise=( bool ) - @raise = bool - end - - - # @see raise= - # @return [TrueClass] - def self.raise? - @raise = false if @raise.nil? - @raise - end - - # @param [#call] app # @param [Hash] options # @option options [String] :http_path If you wish the jQuery fallback route to be "/js/jquery-ui/1.10.1/jquery-ui.min.js" (or whichever version this is at) then do nothing, that's the default. If you want the path to be "/assets/javascripts/jquery-ui/1.10.1/jquery-ui.min.js" then pass in `:http_path => "/assets/javascripts/#{Rack::JQueryUI::JQUERY_UI_VERSION}". # @note ***Don't leave out the version number!***. The scripts provided by jQuery don't contain the version in the filename like the jQuery scripts do, which means that organising them and sending the right headers back is bound to go wrong unless you put the version number somewhere in the route. You have been warned! # @option options [TrueClass] :raise If one of the CDNs does not support then raise an error if it is chosen. Defaults to false. @@ -93,11 +117,12 @@ # # With a different route to the fallback: # use Rack::JQueryUI, :http_path => "/assets/js/#{Rack::JQueryUI::JQUERY_UI_VERSION}" def initialize( app, options={} ) @app, @options = app, DEFAULT_OPTIONS.merge(options) @http_path_to_jquery = ::File.join @options[:http_path], JQUERY_UI_FILE_NAME - self.class.raise = @options[:raise] + @raise = @options.fetch :raise, false + @organisation = options.fetch :organisation, :media_temple end # @param [Hash] env Rack request environment hash. def call( env ) @@ -107,9 +132,11 @@ # For thread safety # @param (see #call) def _call( env ) request = Rack::Request.new(env.dup) + env.merge! "rack.jquery_ui.organisation" => @organisation + env.merge! "rack.jquery_ui.raise" => @raise if request.path_info == @http_path_to_jquery response = Rack::Response.new # for caching response.headers.merge! caching_headers( "#{JQUERY_UI_FILE_NAME}-#{JQUERY_UI_VERSION}", JQUERY_UI_VERSION_DATE)