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:
|