paraphrase 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +7 -0
- data/README.md +27 -17
- data/gemfiles/3.0.gemfile.lock +1 -1
- data/gemfiles/3.1.gemfile.lock +1 -1
- data/gemfiles/3.2.gemfile.lock +1 -1
- data/lib/paraphrase/query.rb +17 -22
- data/lib/paraphrase/rails.rb +2 -1
- data/lib/paraphrase/scope_mapping.rb +13 -29
- data/lib/paraphrase/syntax.rb +53 -19
- data/lib/paraphrase/version.rb +1 -1
- data/paraphrase.gemspec +9 -7
- data/spec/paraphrase/query_spec.rb +20 -6
- data/spec/paraphrase/scope_mapping_spec.rb +5 -5
- data/spec/paraphrase/syntax_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -21
- data/spec/support/database.rb +34 -0
- metadata +88 -35
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,3 +1,10 @@ | |
| 1 | 
            +
            0.5.0 / 8-7-2012
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Cleanup ScopeMapping class
         | 
| 4 | 
            +
            * Add ability to query from an existing ActiveRecord::Relation instance
         | 
| 5 | 
            +
            (typically an association).
         | 
| 6 | 
            +
            * Update syntax for generating mappings.
         | 
| 7 | 
            +
             | 
| 1 8 | 
             
            0.4.0 / 7-6-2012
         | 
| 2 9 |  | 
| 3 10 | 
             
            * Setup Query#params to be HashWithIndifferentAccess.
         | 
    
        data/README.md
    CHANGED
    
    | @@ -36,7 +36,7 @@ $ gem install paraphrase | |
| 36 36 | 
             
            ```ruby
         | 
| 37 37 | 
             
            class Post < ActiveRecord::Base
         | 
| 38 38 | 
             
              register_mapping do
         | 
| 39 | 
            -
                 | 
| 39 | 
            +
                map :by_user, :to => :author
         | 
| 40 40 | 
             
              end
         | 
| 41 41 |  | 
| 42 42 | 
             
              def self.by_user(author_name)
         | 
| @@ -53,7 +53,7 @@ class PostQuery < Paraphrase::Query | |
| 53 53 | 
             
              # into a constant name
         | 
| 54 54 | 
             
              paraphrases Post
         | 
| 55 55 |  | 
| 56 | 
            -
               | 
| 56 | 
            +
              map :by_user, :to => :author
         | 
| 57 57 | 
             
            end
         | 
| 58 58 | 
             
            ```
         | 
| 59 59 |  | 
| @@ -75,17 +75,35 @@ class PostsController < ApplicationController | |
| 75 75 | 
             
            end
         | 
| 76 76 | 
             
            ```
         | 
| 77 77 |  | 
| 78 | 
            -
             | 
| 78 | 
            +
            You can scope queries from an association, useful if you have nested resources:
         | 
| 79 79 |  | 
| 80 | 
            -
             | 
| 80 | 
            +
            ```ruby
         | 
| 81 | 
            +
            class PostsController < ApplicationController
         | 
| 82 | 
            +
              respond_to :html, :json
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              # GET /users/1/posts
         | 
| 85 | 
            +
              def index
         | 
| 86 | 
            +
                @user = User.find(params[:user_id])
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                # This will do a join on the users table, scoping posts to the current user
         | 
| 89 | 
            +
                @posts = @users.posts.paraphrase(params)
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                respond_with(@posts)
         | 
| 92 | 
            +
              end
         | 
| 93 | 
            +
            end
         | 
| 94 | 
            +
            ```
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            ### Configuring Mappings
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            In any of these contexts, the `:to` option of the `:map` method registers
         | 
| 81 99 | 
             
            attribute(s) to extract from the params supplied and what method to pass them
         | 
| 82 100 | 
             
            to. An array of keys can be supplied to pass multiple arguments to a scope.
         | 
| 83 101 |  | 
| 84 102 | 
             
            ```ruby
         | 
| 85 103 | 
             
            class Post < ActiveRecord::Base
         | 
| 86 104 | 
             
              register_mapping do
         | 
| 87 | 
            -
                 | 
| 88 | 
            -
                 | 
| 105 | 
            +
                map :by_user, :to => [:first_name, :last_name]
         | 
| 106 | 
            +
                map :published_on, :to => :pub_date
         | 
| 89 107 | 
             
              end
         | 
| 90 108 |  | 
| 91 109 | 
             
              def self.by_user(first_name, last_name)
         | 
| @@ -107,8 +125,8 @@ rest of the attributes will be allowed to be nil. | |
| 107 125 | 
             
            ```ruby
         | 
| 108 126 | 
             
            class Post < ActiveRecord::Base
         | 
| 109 127 | 
             
              register_mapping do
         | 
| 110 | 
            -
                 | 
| 111 | 
            -
                 | 
| 128 | 
            +
                map :published_on, :to => :pub_date, :require => true
         | 
| 129 | 
            +
                map :by_author, :to => [:first_name, :last_name], :require => :last_name # requires :last_name, whitelists :first_name
         | 
| 112 130 | 
             
              end
         | 
| 113 131 | 
             
            end
         | 
| 114 132 |  | 
| @@ -120,15 +138,7 @@ Alternatively, a scope can be whitelisted allowing nil values to be passed to th | |
| 120 138 | 
             
            ```ruby
         | 
| 121 139 | 
             
            class Post < ActiveRecord::Base
         | 
| 122 140 | 
             
              register_mapping do
         | 
| 123 | 
            -
                 | 
| 141 | 
            +
                map :by_author, :to => [:first_name, :last_name], :allow_nil => :first_name # :first_name does not need to be specified
         | 
| 124 142 | 
             
              end
         | 
| 125 143 | 
             
            end
         | 
| 126 144 | 
             
            ```
         | 
| 127 | 
            -
             | 
| 128 | 
            -
            ## Plans / Thoughts for the Future
         | 
| 129 | 
            -
             | 
| 130 | 
            -
            * Support nested hashes in params.
         | 
| 131 | 
            -
             | 
| 132 | 
            -
            ```ruby
         | 
| 133 | 
            -
            scope :by_author, :key => { :author => [:first_name, :last_name] }
         | 
| 134 | 
            -
            ```
         | 
    
        data/gemfiles/3.0.gemfile.lock
    CHANGED
    
    
    
        data/gemfiles/3.1.gemfile.lock
    CHANGED
    
    
    
        data/gemfiles/3.2.gemfile.lock
    CHANGED
    
    
    
        data/lib/paraphrase/query.rb
    CHANGED
    
    | @@ -8,32 +8,28 @@ module Paraphrase | |
| 8 8 | 
             
              class Query
         | 
| 9 9 | 
             
                extend ActiveModel::Naming
         | 
| 10 10 |  | 
| 11 | 
            -
                # @!attribute [r]  | 
| 12 | 
            -
                #   @return [Array<ScopeMapping>]  | 
| 11 | 
            +
                # @!attribute [r] mappings
         | 
| 12 | 
            +
                #   @return [Array<ScopeMapping>] mappings for query
         | 
| 13 13 | 
             
                #
         | 
| 14 14 | 
             
                # @!attribute [r] source
         | 
| 15 15 | 
             
                #   @return [ActiveRecord::Relation] source to apply scopes to
         | 
| 16 | 
            -
                class_attribute : | 
| 17 | 
            -
             | 
| 16 | 
            +
                class_attribute :mappings, :source, :instance_writer => false
         | 
| 18 17 |  | 
| 19 18 | 
             
                # Delegate enumerable methods to results
         | 
| 20 19 | 
             
                delegate :collect, :map, :each, :select, :to_a, :to_ary, :to => :results
         | 
| 21 20 |  | 
| 22 | 
            -
             | 
| 23 21 | 
             
                # @!attribute [r] errors
         | 
| 24 22 | 
             
                #   @return [ActiveModel::Errors] errors from determining results
         | 
| 25 23 | 
             
                #
         | 
| 26 24 | 
             
                # @!attribute [r] params
         | 
| 27 | 
            -
                #   @return [HashWithIndifferentAccess] filters parameters based on keys defined in  | 
| 25 | 
            +
                #   @return [HashWithIndifferentAccess] filters parameters based on keys defined in mappings
         | 
| 28 26 | 
             
                attr_reader :errors, :params
         | 
| 29 27 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
                # Set `scopes` on inheritance to ensure they're unique per subclass
         | 
| 28 | 
            +
                # Set `mappings` on inheritance to ensure they're unique per subclass
         | 
| 32 29 | 
             
                def self.inherited(klass)
         | 
| 33 | 
            -
                  klass. | 
| 30 | 
            +
                  klass.mappings = []
         | 
| 34 31 | 
             
                end
         | 
| 35 32 |  | 
| 36 | 
            -
             | 
| 37 33 | 
             
                # Specify the ActiveRecord model to use as the source for queries
         | 
| 38 34 | 
             
                #
         | 
| 39 35 | 
             
                # @param [String, Symbol, ActiveRecord::Base] klass name of the class to
         | 
| @@ -46,24 +42,25 @@ module Paraphrase | |
| 46 42 | 
             
                  self.source = klass
         | 
| 47 43 | 
             
                end
         | 
| 48 44 |  | 
| 49 | 
            -
             | 
| 50 | 
            -
                # Add a {ScopeMapping} instance to {@@scopes .scopes}
         | 
| 45 | 
            +
                # Add a {ScopeMapping} instance to {@@mappings .mappings}
         | 
| 51 46 | 
             
                #
         | 
| 52 47 | 
             
                # @see ScopeMapping#initialize
         | 
| 53 | 
            -
                def self. | 
| 54 | 
            -
                  if  | 
| 48 | 
            +
                def self.map(name, options)
         | 
| 49 | 
            +
                  if mappings.map(&:method_name).include?(name)
         | 
| 55 50 | 
             
                    raise DuplicateScopeError, "scope :#{name} has already been added"
         | 
| 56 51 | 
             
                  end
         | 
| 57 52 |  | 
| 58 | 
            -
                   | 
| 53 | 
            +
                  mappings << ScopeMapping.new(name, options)
         | 
| 59 54 | 
             
                end
         | 
| 60 55 |  | 
| 61 | 
            -
             | 
| 62 56 | 
             
                # Filters out parameters irrelevant to the query
         | 
| 63 57 | 
             
                #
         | 
| 64 58 | 
             
                # @param [Hash] params query parameters
         | 
| 65 | 
            -
                def initialize(params = {})
         | 
| 66 | 
            -
                  keys =  | 
| 59 | 
            +
                def initialize(params = {}, relation = nil)
         | 
| 60 | 
            +
                  keys = mappings.map(&:keys).flatten.map(&:to_s)
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  @relation = relation || source.scoped
         | 
| 63 | 
            +
             | 
| 67 64 | 
             
                  @params = HashWithIndifferentAccess.new(params)
         | 
| 68 65 | 
             
                  @params.select! { |key, value| keys.include?(key) }
         | 
| 69 66 | 
             
                  @params.freeze
         | 
| @@ -71,22 +68,20 @@ module Paraphrase | |
| 71 68 | 
             
                  @errors = ActiveModel::Errors.new(self)
         | 
| 72 69 | 
             
                end
         | 
| 73 70 |  | 
| 74 | 
            -
             | 
| 75 | 
            -
                # Loops through {#scopes} and apply scope methods to {#source}. If values
         | 
| 71 | 
            +
                # Loops through {#mappings} and apply scope methods to {#source}. If values
         | 
| 76 72 | 
             
                # are missing for a required key, an empty array is returned.
         | 
| 77 73 | 
             
                #
         | 
| 78 74 | 
             
                # @return [ActiveRecord::Relation, Array]
         | 
| 79 75 | 
             
                def results
         | 
| 80 76 | 
             
                  return @results if @results
         | 
| 81 77 |  | 
| 82 | 
            -
                  results =  | 
| 78 | 
            +
                  results = mappings.inject(@relation) do |query, scope|
         | 
| 83 79 | 
             
                    scope.chain(self, @params, query)
         | 
| 84 80 | 
             
                  end
         | 
| 85 81 |  | 
| 86 82 | 
             
                  @results = @errors.any? ? [] : results
         | 
| 87 83 | 
             
                end
         | 
| 88 84 |  | 
| 89 | 
            -
             | 
| 90 85 | 
             
                def respond_to?(name)
         | 
| 91 86 | 
             
                  super || results.respond_to?(name)
         | 
| 92 87 | 
             
                end
         | 
    
        data/lib/paraphrase/rails.rb
    CHANGED
    
    | @@ -4,7 +4,8 @@ module Paraphrase | |
| 4 4 | 
             
              class Railtie < Rails::Railtie
         | 
| 5 5 | 
             
                initializer 'paraphrase.extend_active_record' do
         | 
| 6 6 | 
             
                  ActiveSupport.on_load :active_record do
         | 
| 7 | 
            -
                    extend Paraphrase::Syntax
         | 
| 7 | 
            +
                    extend Paraphrase::Syntax::Base
         | 
| 8 | 
            +
                    ActiveRecord::Relation.send(:include, Paraphrase::Syntax::Relation)
         | 
| 8 9 | 
             
                  end
         | 
| 9 10 | 
             
                end
         | 
| 10 11 | 
             
              end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            module Paraphrase
         | 
| 2 2 | 
             
              class ScopeMapping
         | 
| 3 | 
            -
                # @!attribute [r]  | 
| 3 | 
            +
                # @!attribute [r] keys
         | 
| 4 4 | 
             
                #   @return [Array<Symbol>] param keys to extract
         | 
| 5 5 | 
             
                #
         | 
| 6 6 | 
             
                # @!attribute [r] method_name
         | 
| @@ -12,10 +12,9 @@ module Paraphrase | |
| 12 12 | 
             
                # @!attribute [r] required_keys
         | 
| 13 13 | 
             
                #   @return [Array] keys required for query
         | 
| 14 14 | 
             
                #
         | 
| 15 | 
            -
                # @!attribute [r]  | 
| 15 | 
            +
                # @!attribute [r] whitelist_keys
         | 
| 16 16 | 
             
                #   @return [Array] keys allowed to be nil
         | 
| 17 | 
            -
                attr_reader : | 
| 18 | 
            -
             | 
| 17 | 
            +
                attr_reader :keys, :method_name, :options, :required, :whitelist
         | 
| 19 18 |  | 
| 20 19 | 
             
                # @param [Symbol] name name of the scope
         | 
| 21 20 | 
             
                # @param [Hash] options options to configure {ScopeMapping ScopeMapping} instance
         | 
| @@ -23,35 +22,20 @@ module Paraphrase | |
| 23 22 | 
             
                # @option options [true] :require lists scope as required
         | 
| 24 23 | 
             
                def initialize(name, options)
         | 
| 25 24 | 
             
                  @method_name = name
         | 
| 26 | 
            -
                  @ | 
| 25 | 
            +
                  @keys = Array(options.delete(:to))
         | 
| 27 26 |  | 
| 28 | 
            -
                  @ | 
| 29 | 
            -
                  @ | 
| 27 | 
            +
                  @required = register_keys(options[:require])
         | 
| 28 | 
            +
                  @whitelist = register_keys(options[:allow_nil])
         | 
| 30 29 |  | 
| 31 | 
            -
                  if @ | 
| 32 | 
            -
                    @ | 
| 30 | 
            +
                  if @whitelist.empty? && !@required.empty?
         | 
| 31 | 
            +
                    @whitelist = @keys - @required
         | 
| 33 32 | 
             
                  end
         | 
| 34 33 |  | 
| 35 34 | 
             
                  @options = options.freeze
         | 
| 36 35 | 
             
                end
         | 
| 37 36 |  | 
| 38 | 
            -
             | 
| 39 | 
            -
                # True if scope is required for query
         | 
| 40 | 
            -
                # @param [Symbol, String] key param key being checked
         | 
| 41 | 
            -
                def required?(key)
         | 
| 42 | 
            -
                  required_keys.include?(key)
         | 
| 43 | 
            -
                end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
                # True if nil param values can be passed to scope
         | 
| 47 | 
            -
                # @see #required?
         | 
| 48 | 
            -
                def whitelisted?(key)
         | 
| 49 | 
            -
                  whitelisted_keys.include?(key)
         | 
| 50 | 
            -
                end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 37 | 
             
                # Sends {#method_name} to `chain`, extracting arguments from `params`.  If
         | 
| 54 | 
            -
                # values are missing for any {# | 
| 38 | 
            +
                # values are missing for any {#keys}, return the `chain` unmodified.
         | 
| 55 39 | 
             
                # If {#required? required}, errors are added to the {Query} instance as
         | 
| 56 40 | 
             
                # well.
         | 
| 57 41 | 
             
                #
         | 
| @@ -60,11 +44,11 @@ module Paraphrase | |
| 60 44 | 
             
                # @param [ActiveRecord::Relation, ActiveRecord::Base] chain current model scope
         | 
| 61 45 | 
             
                # @return [ActiveRecord::Relation]
         | 
| 62 46 | 
             
                def chain(query, params, chain)
         | 
| 63 | 
            -
                  inputs =  | 
| 47 | 
            +
                  inputs = keys.map do |key|
         | 
| 64 48 | 
             
                    input = params[key]
         | 
| 65 49 |  | 
| 66 | 
            -
                    if input.nil? && ( required?(key) || ! | 
| 67 | 
            -
                      query.errors.add(key, 'is required') if required?(key)
         | 
| 50 | 
            +
                    if input.nil? && ( required.include?(key) || !whitelist.include?(key) )
         | 
| 51 | 
            +
                      query.errors.add(key, 'is required') if required.include?(key)
         | 
| 68 52 | 
             
                      break []
         | 
| 69 53 | 
             
                    end
         | 
| 70 54 |  | 
| @@ -77,7 +61,7 @@ module Paraphrase | |
| 77 61 | 
             
                private
         | 
| 78 62 |  | 
| 79 63 | 
             
                def register_keys(option)
         | 
| 80 | 
            -
                  option == true ? Array( | 
| 64 | 
            +
                  option == true ? Array(keys) : Array(option)
         | 
| 81 65 | 
             
                end
         | 
| 82 66 | 
             
              end
         | 
| 83 67 | 
             
            end
         | 
    
        data/lib/paraphrase/syntax.rb
    CHANGED
    
    | @@ -1,29 +1,63 @@ | |
| 1 1 | 
             
            module Paraphrase
         | 
| 2 2 | 
             
              module Syntax
         | 
| 3 | 
            +
                module Base
         | 
| 4 | 
            +
                  def self.extended(klass)
         | 
| 5 | 
            +
                    klass.instance_eval do
         | 
| 6 | 
            +
                      class_attribute :paraphraser, :instance_writer => false, :instance_reader => false
         | 
| 7 | 
            +
                    end
         | 
| 8 | 
            +
                  end
         | 
| 3 9 |  | 
| 4 | 
            -
             | 
| 5 | 
            -
                   | 
| 6 | 
            -
             | 
| 10 | 
            +
                  # Register a {Query} class mapped to `self`. If the mapping has already
         | 
| 11 | 
            +
                  # been registered, calling again will clear existing scopes and evaluate
         | 
| 12 | 
            +
                  # the block.
         | 
| 13 | 
            +
                  #
         | 
| 14 | 
            +
                  # @param [Proc] &block block to define scope mappings
         | 
| 15 | 
            +
                  def register_mapping(&block)
         | 
| 16 | 
            +
                    klass = Class.new(Query, &block)
         | 
| 17 | 
            +
                    klass.source = self
         | 
| 18 | 
            +
                    self.paraphraser = klass
         | 
| 7 19 | 
             
                  end
         | 
| 8 | 
            -
                end
         | 
| 9 20 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
                  klass = Class.new(Query, &block)
         | 
| 17 | 
            -
                  klass.source = self
         | 
| 18 | 
            -
                  self.paraphraser = klass
         | 
| 21 | 
            +
                  # Instantiate the {Query} class that is mapped to `self`.
         | 
| 22 | 
            +
                  #
         | 
| 23 | 
            +
                  # @param [Hash] params query parameters
         | 
| 24 | 
            +
                  def paraphrase(params)
         | 
| 25 | 
            +
                    self.paraphraser.new(params)
         | 
| 26 | 
            +
                  end
         | 
| 19 27 | 
             
                end
         | 
| 20 28 |  | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                   | 
| 29 | 
            +
                module Relation
         | 
| 30 | 
            +
                  # Creates a paraphrase {Query query}, supplying `self` as the base for the
         | 
| 31 | 
            +
                  # query. Intended for scoping a query from an association:
         | 
| 32 | 
            +
                  #
         | 
| 33 | 
            +
                  # Given the following models:
         | 
| 34 | 
            +
                  #
         | 
| 35 | 
            +
                  # ```ruby
         | 
| 36 | 
            +
                  # class User < ActiveRecord::Base
         | 
| 37 | 
            +
                  #   has_many :posts
         | 
| 38 | 
            +
                  # end
         | 
| 39 | 
            +
                  #
         | 
| 40 | 
            +
                  # class Post < ActiveRecord::Base
         | 
| 41 | 
            +
                  #   belongs_to :user
         | 
| 42 | 
            +
                  #
         | 
| 43 | 
            +
                  #   register_mapping
         | 
| 44 | 
            +
                  #     map :title_like, :to => :title
         | 
| 45 | 
            +
                  #   end
         | 
| 46 | 
            +
                  # end
         | 
| 47 | 
            +
                  # ```
         | 
| 48 | 
            +
                  #
         | 
| 49 | 
            +
                  # It is possible to do the following:
         | 
| 50 | 
            +
                  #
         | 
| 51 | 
            +
                  # ```ruby
         | 
| 52 | 
            +
                  # user.posts.paraphrase({ :title => 'Game of Thrones Finale' }).to_sql
         | 
| 53 | 
            +
                  # # => SELECT `posts`.* FROM `posts` INNER JOIN `users` ON `users`.`post_id` = `posts`.`id` WHERE `posts`.`title LIKE "%Game of Thrones Finale%";
         | 
| 54 | 
            +
                  # ```
         | 
| 55 | 
            +
                  #
         | 
| 56 | 
            +
                  # @param [Hash] params query params
         | 
| 57 | 
            +
                  # @return [Paraphrase::Query]
         | 
| 58 | 
            +
                  def paraphrase(params)
         | 
| 59 | 
            +
                    klass.paraphraser.new(params, self)
         | 
| 60 | 
            +
                  end
         | 
| 27 61 | 
             
                end
         | 
| 28 62 | 
             
              end
         | 
| 29 63 | 
             
            end
         | 
    
        data/lib/paraphrase/version.rb
    CHANGED
    
    
    
        data/paraphrase.gemspec
    CHANGED
    
    | @@ -5,10 +5,12 @@ require File.expand_path('../lib/paraphrase/version', __FILE__) | |
| 5 5 | 
             
            Gem::Specification.new do |gem|
         | 
| 6 6 | 
             
              gem.name          = "paraphrase"
         | 
| 7 7 | 
             
              gem.version       = Paraphrase::VERSION
         | 
| 8 | 
            -
              gem.summary       = %q{Map  | 
| 8 | 
            +
              gem.summary       = %q{Map params to model scopes}
         | 
| 9 9 | 
             
              gem.description   = %q{
         | 
| 10 | 
            -
                                     | 
| 11 | 
            -
                                     | 
| 10 | 
            +
                                    Map query parameters to model scopes, pairing one or
         | 
| 11 | 
            +
                                    more keys to a scope. Parameters can be required, or
         | 
| 12 | 
            +
                                    whitelisted providing fine tuned control over how
         | 
| 13 | 
            +
                                    scopes are run.
         | 
| 12 14 | 
             
                                  }
         | 
| 13 15 | 
             
              gem.license       = "MIT"
         | 
| 14 16 | 
             
              gem.authors       = ["Eduardo Gutierrez"]
         | 
| @@ -27,8 +29,8 @@ Gem::Specification.new do |gem| | |
| 27 29 | 
             
              gem.add_development_dependency 'bundler', '~> 1.0'
         | 
| 28 30 | 
             
              gem.add_development_dependency 'yard', '~> 0.7'
         | 
| 29 31 | 
             
              gem.add_development_dependency 'rspec', '~> 2.10'
         | 
| 30 | 
            -
              gem.add_development_dependency 'redcarpet'
         | 
| 31 | 
            -
              gem.add_development_dependency 'rake'
         | 
| 32 | 
            -
              gem.add_development_dependency 'sqlite3'
         | 
| 33 | 
            -
              gem.add_development_dependency 'appraisal'
         | 
| 32 | 
            +
              gem.add_development_dependency 'redcarpet', '~> 2.1.1'
         | 
| 33 | 
            +
              gem.add_development_dependency 'rake', '~> 0.9.2'
         | 
| 34 | 
            +
              gem.add_development_dependency 'sqlite3',  '~> 1.3.6'
         | 
| 35 | 
            +
              gem.add_development_dependency 'appraisal', '0.4'
         | 
| 34 36 | 
             
            end
         | 
| @@ -3,6 +3,9 @@ require 'spec_helper' | |
| 3 3 | 
             
            module Paraphrase
         | 
| 4 4 | 
             
              describe Query do
         | 
| 5 5 |  | 
| 6 | 
            +
                class AccountSearch < Query
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 6 9 | 
             
                describe ".paraphrases" do
         | 
| 7 10 | 
             
                  it "stores the class being queried" do
         | 
| 8 11 | 
             
                    AccountSearch.paraphrases :account
         | 
| @@ -11,23 +14,23 @@ module Paraphrase | |
| 11 14 | 
             
                end
         | 
| 12 15 |  | 
| 13 16 | 
             
                describe ".scope" do
         | 
| 14 | 
            -
                  it "adds information to Query. | 
| 17 | 
            +
                  it "adds information to Query.mappings" do
         | 
| 15 18 | 
             
                    AccountSearch.instance_eval do
         | 
| 16 | 
            -
                       | 
| 19 | 
            +
                      map :name_like, :to => :name
         | 
| 17 20 | 
             
                    end
         | 
| 18 21 |  | 
| 19 | 
            -
                    AccountSearch. | 
| 22 | 
            +
                    AccountSearch.mappings.should_not be_empty
         | 
| 20 23 | 
             
                  end
         | 
| 21 24 |  | 
| 22 25 | 
             
                  it "raises an error if a scope is added twice" do
         | 
| 23 | 
            -
                    expect { AccountSearch.instance_eval {  | 
| 26 | 
            +
                    expect { AccountSearch.instance_eval { map :name_like, :to => :name } }.to raise_error Paraphrase::DuplicateScopeError
         | 
| 24 27 | 
             
                  end
         | 
| 25 28 | 
             
                end
         | 
| 26 29 |  | 
| 27 30 | 
             
                describe "#initialize" do
         | 
| 28 31 | 
             
                  let(:query) { AccountSearch.new(:name => 'Tyrion Lannister', :nickname => 'Half Man') }
         | 
| 29 32 |  | 
| 30 | 
            -
                  it "filters out params not specified in  | 
| 33 | 
            +
                  it "filters out params not specified in mappings" do
         | 
| 31 34 | 
             
                    query.params.should_not have_key :nickname
         | 
| 32 35 | 
             
                    query.params.should have_key :name
         | 
| 33 36 | 
             
                  end
         | 
| @@ -35,12 +38,23 @@ module Paraphrase | |
| 35 38 | 
             
                  it "sets up params with indifferent access" do
         | 
| 36 39 | 
             
                    query.params.should have_key 'name'
         | 
| 37 40 | 
             
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  it "accepts an ActiveRecord::Relation to use as the base scope" do
         | 
| 43 | 
            +
                    user = User.create!
         | 
| 44 | 
            +
                    associated_account = Account.create!(:user => user)
         | 
| 45 | 
            +
                    lonely_account = Account.create!
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    results = AccountSearch.new({ :name => 'Tyrion Lannister'}, user.accounts).results
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    results.should include associated_account
         | 
| 50 | 
            +
                    results.should_not include lonely_account
         | 
| 51 | 
            +
                  end
         | 
| 38 52 | 
             
                end
         | 
| 39 53 |  | 
| 40 54 | 
             
                describe "#results" do
         | 
| 41 55 | 
             
                  before :all do
         | 
| 42 56 | 
             
                    AccountSearch.instance_eval do
         | 
| 43 | 
            -
                       | 
| 57 | 
            +
                      map :title_like, :to => :title, :require => true
         | 
| 44 58 | 
             
                    end
         | 
| 45 59 | 
             
                  end
         | 
| 46 60 |  | 
| @@ -2,8 +2,8 @@ require 'spec_helper' | |
| 2 2 |  | 
| 3 3 | 
             
            module Paraphrase
         | 
| 4 4 | 
             
              describe ScopeMapping do
         | 
| 5 | 
            -
                let(:mapping) { ScopeMapping.new(:name_like, : | 
| 6 | 
            -
                let(:compound_mapping) { ScopeMapping.new(:name_like, : | 
| 5 | 
            +
                let(:mapping) { ScopeMapping.new(:name_like, :to => :name) }
         | 
| 6 | 
            +
                let(:compound_mapping) { ScopeMapping.new(:name_like, :to => [:first_name, :last_name], :require => :last_name) }
         | 
| 7 7 | 
             
                let(:query) do
         | 
| 8 8 | 
             
                  query = double('query')
         | 
| 9 9 | 
             
                  query.stub(:errors).and_return(double('errors'))
         | 
| @@ -22,14 +22,14 @@ module Paraphrase | |
| 22 22 | 
             
                  end
         | 
| 23 23 |  | 
| 24 24 | 
             
                  it "adds errors to query object if missing and required" do
         | 
| 25 | 
            -
                    required_mapping = ScopeMapping.new(:name_like, : | 
| 25 | 
            +
                    required_mapping = ScopeMapping.new(:name_like, :to => :name, :require => true)
         | 
| 26 26 |  | 
| 27 27 | 
             
                    query.errors.should_receive(:add)
         | 
| 28 28 | 
             
                    required_mapping.chain(query, {}, Account)
         | 
| 29 29 | 
             
                  end
         | 
| 30 30 |  | 
| 31 31 | 
             
                  it "passes through nil values if scope has been whitelisted" do
         | 
| 32 | 
            -
                    mapping = ScopeMapping.new(:name_like, : | 
| 32 | 
            +
                    mapping = ScopeMapping.new(:name_like, :to => :name, :allow_nil => true)
         | 
| 33 33 |  | 
| 34 34 | 
             
                    Account.should_receive(:name_like).with(nil)
         | 
| 35 35 | 
             
                    mapping.chain(query, {}, Account)
         | 
| @@ -42,7 +42,7 @@ module Paraphrase | |
| 42 42 | 
             
                end
         | 
| 43 43 |  | 
| 44 44 | 
             
                it "whitelists the the non-required keys of a compound key" do
         | 
| 45 | 
            -
                  compound_mapping. | 
| 45 | 
            +
                  compound_mapping.whitelist.include?(:first_name).should be_true
         | 
| 46 46 | 
             
                end
         | 
| 47 47 | 
             
              end
         | 
| 48 48 | 
             
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -1,23 +1,3 @@ | |
| 1 1 | 
             
            require 'rspec'
         | 
| 2 2 | 
             
            require 'paraphrase'
         | 
| 3 | 
            -
            require ' | 
| 4 | 
            -
             | 
| 5 | 
            -
            ActiveRecord::Base.establish_connection(
         | 
| 6 | 
            -
              :adapter => 'sqlite3',
         | 
| 7 | 
            -
              :database => ':memory:'
         | 
| 8 | 
            -
            )
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            ActiveRecord::Base.silence do
         | 
| 11 | 
            -
              ActiveRecord::Migration.verbose = false
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              ActiveRecord::Schema.define do
         | 
| 14 | 
            -
                create_table(:accounts, :force => true) {}
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
            end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            class Account < ActiveRecord::Base
         | 
| 19 | 
            -
              extend Paraphrase::Syntax
         | 
| 20 | 
            -
            end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            class AccountSearch < Paraphrase::Query
         | 
| 23 | 
            -
            end
         | 
| 3 | 
            +
            require 'support/database'
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require 'active_record'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ActiveRecord::Relation.send(:include, Paraphrase::Syntax::Relation)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ActiveRecord::Base.establish_connection(
         | 
| 6 | 
            +
              :adapter => 'sqlite3',
         | 
| 7 | 
            +
              :database => ':memory:'
         | 
| 8 | 
            +
            )
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            ActiveRecord::Base.silence do
         | 
| 11 | 
            +
              ActiveRecord::Migration.verbose = false
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              ActiveRecord::Schema.define do
         | 
| 14 | 
            +
                create_table :users, :force => true do
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                create_table :accounts, :force => true do |t|
         | 
| 18 | 
            +
                  t.references :user
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            class User < ActiveRecord::Base
         | 
| 24 | 
            +
              has_many :accounts
         | 
| 25 | 
            +
            end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            class Account < ActiveRecord::Base
         | 
| 28 | 
            +
              extend Paraphrase::Syntax::Base
         | 
| 29 | 
            +
              belongs_to :user
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def self.name_like(*args)
         | 
| 32 | 
            +
                scoped
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: paraphrase
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.5.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012- | 
| 12 | 
            +
            date: 2012-08-08 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: activerecord
         | 
| 16 | 
            -
              requirement:  | 
| 16 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ~>
         | 
| @@ -21,10 +21,15 @@ dependencies: | |
| 21 21 | 
             
                    version: '3.0'
         | 
| 22 22 | 
             
              type: :runtime
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements:  | 
| 24 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 25 | 
            +
                none: false
         | 
| 26 | 
            +
                requirements:
         | 
| 27 | 
            +
                - - ~>
         | 
| 28 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            +
                    version: '3.0'
         | 
| 25 30 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 31 | 
             
              name: activesupport
         | 
| 27 | 
            -
              requirement:  | 
| 32 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 28 33 | 
             
                none: false
         | 
| 29 34 | 
             
                requirements:
         | 
| 30 35 | 
             
                - - ~>
         | 
| @@ -32,10 +37,15 @@ dependencies: | |
| 32 37 | 
             
                    version: '3.0'
         | 
| 33 38 | 
             
              type: :runtime
         | 
| 34 39 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements:  | 
| 40 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 41 | 
            +
                none: false
         | 
| 42 | 
            +
                requirements:
         | 
| 43 | 
            +
                - - ~>
         | 
| 44 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            +
                    version: '3.0'
         | 
| 36 46 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 37 47 | 
             
              name: activemodel
         | 
| 38 | 
            -
              requirement:  | 
| 48 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 39 49 | 
             
                none: false
         | 
| 40 50 | 
             
                requirements:
         | 
| 41 51 | 
             
                - - ~>
         | 
| @@ -43,10 +53,15 @@ dependencies: | |
| 43 53 | 
             
                    version: '3.0'
         | 
| 44 54 | 
             
              type: :runtime
         | 
| 45 55 | 
             
              prerelease: false
         | 
| 46 | 
            -
              version_requirements:  | 
| 56 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 57 | 
            +
                none: false
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - ~>
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '3.0'
         | 
| 47 62 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 63 | 
             
              name: bundler
         | 
| 49 | 
            -
              requirement:  | 
| 64 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 50 65 | 
             
                none: false
         | 
| 51 66 | 
             
                requirements:
         | 
| 52 67 | 
             
                - - ~>
         | 
| @@ -54,10 +69,15 @@ dependencies: | |
| 54 69 | 
             
                    version: '1.0'
         | 
| 55 70 | 
             
              type: :development
         | 
| 56 71 | 
             
              prerelease: false
         | 
| 57 | 
            -
              version_requirements:  | 
| 72 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 73 | 
            +
                none: false
         | 
| 74 | 
            +
                requirements:
         | 
| 75 | 
            +
                - - ~>
         | 
| 76 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 77 | 
            +
                    version: '1.0'
         | 
| 58 78 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 59 79 | 
             
              name: yard
         | 
| 60 | 
            -
              requirement:  | 
| 80 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 61 81 | 
             
                none: false
         | 
| 62 82 | 
             
                requirements:
         | 
| 63 83 | 
             
                - - ~>
         | 
| @@ -65,10 +85,15 @@ dependencies: | |
| 65 85 | 
             
                    version: '0.7'
         | 
| 66 86 | 
             
              type: :development
         | 
| 67 87 | 
             
              prerelease: false
         | 
| 68 | 
            -
              version_requirements:  | 
| 88 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 89 | 
            +
                none: false
         | 
| 90 | 
            +
                requirements:
         | 
| 91 | 
            +
                - - ~>
         | 
| 92 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 93 | 
            +
                    version: '0.7'
         | 
| 69 94 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 95 | 
             
              name: rspec
         | 
| 71 | 
            -
              requirement:  | 
| 96 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 97 | 
             
                none: false
         | 
| 73 98 | 
             
                requirements:
         | 
| 74 99 | 
             
                - - ~>
         | 
| @@ -76,54 +101,80 @@ dependencies: | |
| 76 101 | 
             
                    version: '2.10'
         | 
| 77 102 | 
             
              type: :development
         | 
| 78 103 | 
             
              prerelease: false
         | 
| 79 | 
            -
              version_requirements:  | 
| 104 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 105 | 
            +
                none: false
         | 
| 106 | 
            +
                requirements:
         | 
| 107 | 
            +
                - - ~>
         | 
| 108 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            +
                    version: '2.10'
         | 
| 80 110 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 81 111 | 
             
              name: redcarpet
         | 
| 82 | 
            -
              requirement:  | 
| 112 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 83 113 | 
             
                none: false
         | 
| 84 114 | 
             
                requirements:
         | 
| 85 | 
            -
                - -  | 
| 115 | 
            +
                - - ~>
         | 
| 86 116 | 
             
                  - !ruby/object:Gem::Version
         | 
| 87 | 
            -
                    version:  | 
| 117 | 
            +
                    version: 2.1.1
         | 
| 88 118 | 
             
              type: :development
         | 
| 89 119 | 
             
              prerelease: false
         | 
| 90 | 
            -
              version_requirements:  | 
| 120 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 | 
            +
                none: false
         | 
| 122 | 
            +
                requirements:
         | 
| 123 | 
            +
                - - ~>
         | 
| 124 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 125 | 
            +
                    version: 2.1.1
         | 
| 91 126 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 92 127 | 
             
              name: rake
         | 
| 93 | 
            -
              requirement:  | 
| 128 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 94 129 | 
             
                none: false
         | 
| 95 130 | 
             
                requirements:
         | 
| 96 | 
            -
                - -  | 
| 131 | 
            +
                - - ~>
         | 
| 97 132 | 
             
                  - !ruby/object:Gem::Version
         | 
| 98 | 
            -
                    version:  | 
| 133 | 
            +
                    version: 0.9.2
         | 
| 99 134 | 
             
              type: :development
         | 
| 100 135 | 
             
              prerelease: false
         | 
| 101 | 
            -
              version_requirements:  | 
| 136 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 137 | 
            +
                none: false
         | 
| 138 | 
            +
                requirements:
         | 
| 139 | 
            +
                - - ~>
         | 
| 140 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 141 | 
            +
                    version: 0.9.2
         | 
| 102 142 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 103 143 | 
             
              name: sqlite3
         | 
| 104 | 
            -
              requirement:  | 
| 144 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 105 145 | 
             
                none: false
         | 
| 106 146 | 
             
                requirements:
         | 
| 107 | 
            -
                - -  | 
| 147 | 
            +
                - - ~>
         | 
| 108 148 | 
             
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            -
                    version:  | 
| 149 | 
            +
                    version: 1.3.6
         | 
| 110 150 | 
             
              type: :development
         | 
| 111 151 | 
             
              prerelease: false
         | 
| 112 | 
            -
              version_requirements:  | 
| 152 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 153 | 
            +
                none: false
         | 
| 154 | 
            +
                requirements:
         | 
| 155 | 
            +
                - - ~>
         | 
| 156 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 157 | 
            +
                    version: 1.3.6
         | 
| 113 158 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 114 159 | 
             
              name: appraisal
         | 
| 115 | 
            -
              requirement:  | 
| 160 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 116 161 | 
             
                none: false
         | 
| 117 162 | 
             
                requirements:
         | 
| 118 | 
            -
                - -  | 
| 163 | 
            +
                - - '='
         | 
| 119 164 | 
             
                  - !ruby/object:Gem::Version
         | 
| 120 | 
            -
                    version: '0'
         | 
| 165 | 
            +
                    version: '0.4'
         | 
| 121 166 | 
             
              type: :development
         | 
| 122 167 | 
             
              prerelease: false
         | 
| 123 | 
            -
              version_requirements:  | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 168 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 169 | 
            +
                none: false
         | 
| 170 | 
            +
                requirements:
         | 
| 171 | 
            +
                - - '='
         | 
| 172 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 173 | 
            +
                    version: '0.4'
         | 
| 174 | 
            +
            description: ! "\n                        Map query parameters to model scopes, pairing
         | 
| 175 | 
            +
              one or\n                        more keys to a scope. Parameters can be required,
         | 
| 176 | 
            +
              or\n                        whitelisted providing fine tuned control over how\n
         | 
| 177 | 
            +
              \                       scopes are run.\n                      "
         | 
| 127 178 | 
             
            email: edd_d@mit.edu
         | 
| 128 179 | 
             
            executables: []
         | 
| 129 180 | 
             
            extensions: []
         | 
| @@ -156,6 +207,7 @@ files: | |
| 156 207 | 
             
            - spec/paraphrase/scope_mapping_spec.rb
         | 
| 157 208 | 
             
            - spec/paraphrase/syntax_spec.rb
         | 
| 158 209 | 
             
            - spec/spec_helper.rb
         | 
| 210 | 
            +
            - spec/support/database.rb
         | 
| 159 211 | 
             
            homepage: https://github.com/ecbypi/paraphrase
         | 
| 160 212 | 
             
            licenses:
         | 
| 161 213 | 
             
            - MIT
         | 
| @@ -177,13 +229,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 177 229 | 
             
                  version: '0'
         | 
| 178 230 | 
             
            requirements: []
         | 
| 179 231 | 
             
            rubyforge_project: 
         | 
| 180 | 
            -
            rubygems_version: 1.8. | 
| 232 | 
            +
            rubygems_version: 1.8.23
         | 
| 181 233 | 
             
            signing_key: 
         | 
| 182 234 | 
             
            specification_version: 3
         | 
| 183 | 
            -
            summary: Map  | 
| 235 | 
            +
            summary: Map params to model scopes
         | 
| 184 236 | 
             
            test_files:
         | 
| 185 237 | 
             
            - spec/paraphrase/query_spec.rb
         | 
| 186 238 | 
             
            - spec/paraphrase/scope_mapping_spec.rb
         | 
| 187 239 | 
             
            - spec/paraphrase/syntax_spec.rb
         | 
| 188 240 | 
             
            - spec/spec_helper.rb
         | 
| 241 | 
            +
            - spec/support/database.rb
         | 
| 189 242 | 
             
            has_rdoc: 
         |