module Versionist::Routing

Public Instance Methods

api_version(config, &block) click to toggle source

Allows you to constrain routes to specific versions of your api using versioning strategies. Supported formats:

HTTP Header api_version(:module => “V1”, :header => {:name => “Accept”, :value => “application/vnd.mycompany.com; version=1”}})

Path api_version(:module => “V1”, :path => {:value => “v1”}})

Request Parameter api_version(:module => “V1”, :parameter => {:name => “version”, :value => “1”}})

Specifying default version: api_version(:module => “V1”, :default => true, :header => {:name => “Accept”, :value => “application/vnd.mycompany.com; version=1”}})

Multiple Strategies per version api_version(:module => “V1”, :header => {:name => “Accept”, :value => “application/vnd.mycompany.com; version=1”}, :path => {:value => “v1”})

# File lib/versionist/routing.rb, line 22
def api_version(config, &block)
  raise ArgumentError, "you must pass a configuration Hash to api_version" if config.nil? || !config.is_a?(Hash)
  config.symbolize_keys!
  raise ArgumentError, "you must specify :header, :path, or :parameter in configuration Hash passed to api_version" if !config.has_key?(:header) && !config.has_key?(:path) && !config.has_key?(:parameter)
  [:header, :path, :parameter].each do |s|
    raise ArgumentError, "#{s} key in configuration Hash passed to api_version must point to a Hash" if config.has_key?(s) && !config[s].is_a?(Hash)
  end
  raise ArgumentError, "you must specify :module in configuration Hash passed to api_version" if !config.has_key?(:module)
  raise ArgumentError, ":defaults must be a Hash" if config.has_key?(:defaults) && !config[:defaults].is_a?(Hash)
  rails_quirks(config, &block)
  configure_header(config, &block) if config.has_key?(:header)
  configure_path(config, &block) if config.has_key?(:path)
  configure_parameter(config, &block) if config.has_key?(:parameter)
  configure_default(config, &block) if config.has_key?(:default) && config[:default]
end

Private Instance Methods

configure_default(config, &block) click to toggle source
# File lib/versionist/routing.rb, line 65
def configure_default(config, &block)
  default = Versionist::VersioningStrategy::Default.new(config)
  route_hash = {:module => config[:module], :constraints => default, :as => 'default'}
  route_hash.merge!({:defaults => config[:defaults]}) if config.has_key?(:defaults)
  scope(route_hash, &block)
end
configure_header(config, &block) click to toggle source
# File lib/versionist/routing.rb, line 41
def configure_header(config, &block)
  header = Versionist::VersioningStrategy::Header.new(config)
  route_hash = {:module => config[:module], :constraints => header}
  route_hash.merge!({:defaults => config[:defaults]}) if config.has_key?(:defaults)
  scope(route_hash, &block)
end
configure_parameter(config, &block) click to toggle source
# File lib/versionist/routing.rb, line 58
def configure_parameter(config, &block)
  parameter = Versionist::VersioningStrategy::Parameter.new(config)
  route_hash = {:module => config[:module], :constraints => parameter, :as => config[:parameter][:value].gsub(/\W/, '_')}
  route_hash.merge!({:defaults => config[:defaults]}) if config.has_key?(:defaults)
  scope(route_hash, &block)
end
configure_path(config, &block) click to toggle source
# File lib/versionist/routing.rb, line 48
def configure_path(config, &block)
  config[:path][:value].slice!(0) if config[:path][:value] =~ /^\//
  path = Versionist::VersioningStrategy::Path.new(config)
  # Use the :as option and strip out non-word characters from the path to avoid this:
  # https://github.com/rails/rails/issues/3224
  route_hash = {:module => config[:module], :as => config[:path][:value].gsub(/\W/, '_')}
  route_hash.merge!({:defaults => config[:defaults]}) if config.has_key?(:defaults)
  namespace(config[:path][:value], route_hash, &block)
end
rails_quirks(config, &block) click to toggle source

deals with quirks in routing among the various Rails versions

# File lib/versionist/routing.rb, line 73
def rails_quirks(config, &block)
  # Rails 4 no longer allows constant syntax in routing.
  # https://github.com/bploetz/versionist/issues/39
  # call underscore on the module so it adheres to this convention
  config[:module] = config[:module].underscore if Rails::VERSION::MAJOR >= 4
end