require 'ajaxlibs/exceptions' require 'ajaxlibs/versions_tools' # Represents an ajaxlib library, regroups available version of a particular library # and a few functions to generate either a filepath to local library or javascript loading code # for Google CDN. class Ajaxlibs::Library # Available versions for this library. Versions = [] Requirements = {} attr_reader :version, :source, :secure @@subclasses = {} def self.inherited(child) #:nodoc: @@subclasses[child.library_name.to_sym] = child end # Returns all available libraries (instance of Ajaxlibs::Library). def self.all @@subclasses.values end # Search a specific library by its name (could be either a string or a symbol) and initialized it with given version and source. # See initialize method for available options. def self.by_name(name, options = {}) @@subclasses[name.to_sym].new options rescue NoMethodError raise Ajaxlibs::Exception::LibraryNotFound end # Library name based on class name def self.library_name name.match(/::(\w+)$/)[1].downcase end # Initialize a new instance of a specific library. # options can take the following arguments : # * :version : specify a version (ex: "1.8.1"). # * :source : force the source to use, default to :local. # * :secure : specify if the generated link should be secured (https) or not. Default is false. def initialize(options = {}) @version = check_version_or_latest_version(options[:version]) @source = options[:source] || :local @secure = options[:secure] || false end # Returns requirements for a library (for example, prototype for scriptaculous) def requires self.class::Requirements[@version] || self.class::Requirements[:all] || {} end # Library name based on class name def library_name self.class.library_name end # Javascript library filename, can be different from library_name (jqueryui / jquery-ui for example) def file_name library_name end # Search for the latest version available using given Versions def latest_version self.class::Versions.max {|a, b| Ajaxlibs::VersionsTools.compare a, b} end # Local path for a particular version, or the latest if given version is nil. def local_path File.join('ajaxlibs', library_name, version, file_name) end # Include path using google CDN def google_cdn_include_path scheme = secure ? "https" : "http" "#{scheme}://ajax.googleapis.com/ajax/libs/#{library_name}/#{version}/#{file_name}.js" end # Javascript include path regarding source (call either local_path or google_cdn_include_path) def include_path (source == :local or local_only?) ? local_path : google_cdn_include_path end def local_only? false end def ==(other) self.class == other.class and self.version == other.version and self.source == other.source end private # Checks if given version is available for this library, # raises Ajaxlibs::Exception::VersionNotFound if not and returns it. # Passing a nil value will returns the latest available version def check_version_or_latest_version(version = nil) version ||= latest_version raise Ajaxlibs::Exception::VersionNotFound unless self.class::Versions.include?(version) version end end