paraphrase 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,6 +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
+ require 'paraphrase/syntax'
8
+
7
9
  extend Paraphrase::Syntax
8
10
  end
9
11
  end
@@ -0,0 +1,36 @@
1
+ module Paraphrase
2
+ class Repository
3
+ attr_reader :relation, :mapping, :params
4
+
5
+ def self.chain(relation, mapping, params)
6
+ new(relation, mapping, params).chain
7
+ end
8
+
9
+ def initialize(relation, mapping, params)
10
+ @relation, @mapping, @params = relation, mapping, params
11
+ end
12
+
13
+ def chain
14
+ if mapping.satisfied?(params)
15
+
16
+ if scope.arity.zero?
17
+ relation.scoping { scope.call }
18
+ else
19
+ values = mapping.values(params)
20
+ relation.scoping { scope.call(*values) }
21
+ end
22
+ else
23
+ relation
24
+ end
25
+ end
26
+
27
+ def scope
28
+ @scope ||=
29
+ if respond_to?(mapping.name)
30
+ method(mapping.name)
31
+ else
32
+ relation.klass.method(mapping.name)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -7,7 +7,7 @@ module Paraphrase
7
7
  name.constantize
8
8
  rescue NameError => e
9
9
  if e.message =~ /uninitialized constant/
10
- raise Paraphrase::NoQueryDefined.new("No query class found. #{name} must be defined as a subclass of Paraphrase::Query")
10
+ raise Paraphrase::NoQueryDefined.new(name)
11
11
  end
12
12
  end
13
13
 
@@ -15,7 +15,17 @@ module Paraphrase
15
15
  #
16
16
  # @param [Hash] params query parameters
17
17
  def paraphrase(params = {})
18
- paraphraser.new(params, self).result
18
+ paraphraser.new(params, default_paraphrase_relation).result
19
+ end
20
+
21
+ def default_paraphrase_relation
22
+ if is_a? ActiveRecord::Relation
23
+ self
24
+ elsif ActiveRecord::VERSION::MAJOR > 3
25
+ all
26
+ else
27
+ scoped
28
+ end
19
29
  end
20
30
  end
21
31
 
@@ -1,3 +1,3 @@
1
1
  module Paraphrase
2
- VERSION = "0.9.0"
2
+ VERSION = "0.10.0"
3
3
  end
data/paraphrase.gemspec CHANGED
@@ -24,14 +24,14 @@ Gem::Specification.new do |gem|
24
24
 
25
25
  gem.required_ruby_version = '>= 1.9.3'
26
26
 
27
- gem.add_dependency 'activerecord', '>= 3.0', '< 4.2'
28
- gem.add_dependency 'activesupport', '>= 3.0', '< 4.2'
29
- gem.add_dependency 'activemodel', '>= 3.0', '< 4.2'
27
+ gem.add_dependency 'activerecord', '>= 3.1', '< 4.2'
28
+ gem.add_dependency 'activesupport', '>= 3.1', '< 4.2'
29
+ gem.add_dependency 'activemodel', '>= 3.1', '< 4.2'
30
30
 
31
- gem.add_development_dependency 'actionpack', '>= 3.0', '< 4.2'
31
+ gem.add_development_dependency 'actionpack', '>= 3.1', '< 4.2'
32
32
  gem.add_development_dependency 'bundler', '~> 1.0'
33
33
  gem.add_development_dependency 'yard', '~> 0.7'
34
- gem.add_development_dependency 'rspec', '~> 2.14'
34
+ gem.add_development_dependency 'rspec', '~> 3.0'
35
35
  gem.add_development_dependency 'rake', '~> 0.9.2'
36
36
  gem.add_development_dependency 'appraisal', '~> 0.4'
37
37
  gem.add_development_dependency 'pry', '~> 0.9'
@@ -9,28 +9,38 @@ module Paraphrase
9
9
  map :authors, to: :by_users
10
10
  map :start_date, :end_date, to: :published_between
11
11
 
12
- class Params < Paraphrase::Params
12
+ class ParamsFilter
13
13
  def start_date
14
- @start_date ||= Time.parse(params[:start_date]) rescue nil
14
+ Time.parse(params[:start_date]) rescue nil
15
15
  end
16
+ end
16
17
 
17
- def end_date
18
- @end_date ||= Time.parse(params[:end_date]) rescue nil
18
+ class Repository
19
+ def published_between(start_date, end_date)
20
+ where(published_at: start_date..end_date)
19
21
  end
20
22
  end
23
+
24
+ param :end_date do
25
+ Time.parse(params[:end_date]) rescue nil
26
+ end
27
+
28
+ scope :by_users do |authors|
29
+ relation.joins(:user).where(users: { name: authors })
30
+ end
21
31
  end
22
32
 
23
33
  describe ".map" do
24
34
  it "adds information to Query.scopes" do
25
- expect(PostQuery.scopes).not_to be_empty
35
+ expect(PostQuery.mappings).not_to be_empty
26
36
  end
27
37
 
28
38
  it "raises an error if a scope is added twice" do
29
- expect { PostQuery.map :name, to: :titled }.to raise_error Paraphrase::DuplicateScopeError
39
+ expect { PostQuery.map :name, to: :titled }.to raise_error Paraphrase::DuplicateMappingError
30
40
  end
31
41
 
32
42
  it 'defines readers for each key' do
33
- query = PostQuery.new
43
+ query = PostQuery.new(Hash.new)
34
44
 
35
45
  expect(query).to respond_to :title
36
46
  expect(query).to respond_to :is_published
@@ -45,15 +55,15 @@ module Paraphrase
45
55
 
46
56
  describe '#source' do
47
57
  it 'is determined via query class name' do
48
- expect(PostQuery.new.result).to eq Post
58
+ expect(PostQuery.source).to eq 'Post'
49
59
  end
50
60
 
51
61
  it 'can be manually specified in the class' do
52
62
  klass = Class.new(Query) do
53
- source :User
63
+ self.source = :User
54
64
  end
55
65
 
56
- expect(klass.new.result).to eq User
66
+ expect(klass.source).to eq :User
57
67
  end
58
68
  end
59
69
 
@@ -93,6 +103,25 @@ module Paraphrase
93
103
  )
94
104
  end
95
105
 
106
+ it 'supports defining scopes in the query class' do
107
+ robert = User.create!(name: 'Robert')
108
+ frank = User.create!(name: 'Frank')
109
+ susie = User.create!(name: 'Susie')
110
+
111
+ # Combination of all three attributes ensures that the scope is preserved
112
+ # before and after the call to the method on the query class
113
+ Post.create!(title: 'Summer', published: false, user: robert)
114
+ Post.create!(title: 'Summer', published: true, user: frank)
115
+ susie_post = Post.create!(title: 'Summer', published: true, user: susie)
116
+
117
+ params = { authors: ['Robert', 'Susie'], title: 'Summer', is_published: '1' }
118
+ query = PostQuery.new(params)
119
+ result = Post.paraphrase(params)
120
+
121
+ expect(query.result).to eq [susie_post]
122
+ expect(result).to eq [susie_post]
123
+ end
124
+
96
125
  it 'preserves the original scope used to initialize the query' do
97
126
  user = User.create!
98
127
  blue_post = Post.create!(user: user, title: 'Blue', published: false)
@@ -11,7 +11,7 @@ module Paraphrase
11
11
  expect_any_instance_of(AccountQuery).to receive(:result).and_call_original
12
12
 
13
13
  result = Account.paraphrase
14
- expect(result).to eq Account
14
+ expect(result).to eq Account.all
15
15
  end
16
16
 
17
17
  it 'raises if query class is not defined' do
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
- require 'codeclimate-test-reporter'
2
- CodeClimate::TestReporter.start
1
+ if ENV.key?('CODECLIMATE_REPO_TOKEN')
2
+ require 'codeclimate-test-reporter'
3
+ CodeClimate::TestReporter.start
4
+ end
3
5
 
4
6
  require 'rspec'
5
7
  require 'pry'
@@ -19,7 +21,8 @@ ActiveRecord::Base.establish_connection(
19
21
 
20
22
  ActiveRecord::Migration.verbose = false
21
23
  ActiveRecord::Schema.define do
22
- create_table :users, force: true do
24
+ create_table :users, force: true do |t|
25
+ t.string :name
23
26
  end
24
27
 
25
28
  create_table :posts, force: true do |t|
@@ -35,8 +38,8 @@ ActiveRecord::Schema.define do
35
38
  end
36
39
  end
37
40
 
41
+ require 'paraphrase/syntax'
38
42
  ActiveRecord::Base.extend Paraphrase::Syntax
39
- ActiveRecord::Relation.send(:include, Paraphrase::Syntax)
40
43
 
41
44
  class User < ActiveRecord::Base
42
45
  has_many :accounts
@@ -55,10 +58,6 @@ class Post < ActiveRecord::Base
55
58
  def self.by_users(names)
56
59
  joins(:user).where(users: { name: names })
57
60
  end
58
-
59
- def self.published_between(start_date, end_date)
60
- where(published_at: start_date..end_date)
61
- end
62
61
  end
63
62
 
64
63
  class Account < ActiveRecord::Base
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paraphrase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Gutierrez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-05 00:00:00.000000000 Z
11
+ date: 2014-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '3.1'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '4.2'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '3.0'
29
+ version: '3.1'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '4.2'
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '3.0'
39
+ version: '3.1'
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '4.2'
@@ -46,7 +46,7 @@ dependencies:
46
46
  requirements:
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: '3.0'
49
+ version: '3.1'
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '4.2'
@@ -56,7 +56,7 @@ dependencies:
56
56
  requirements:
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: '3.0'
59
+ version: '3.1'
60
60
  - - "<"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '4.2'
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: '3.0'
69
+ version: '3.1'
70
70
  - - "<"
71
71
  - !ruby/object:Gem::Version
72
72
  version: '4.2'
@@ -76,7 +76,7 @@ dependencies:
76
76
  requirements:
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: '3.0'
79
+ version: '3.1'
80
80
  - - "<"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '4.2'
@@ -86,7 +86,7 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '3.0'
89
+ version: '3.1'
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
92
  version: '4.2'
@@ -124,14 +124,14 @@ dependencies:
124
124
  requirements:
125
125
  - - "~>"
126
126
  - !ruby/object:Gem::Version
127
- version: '2.14'
127
+ version: '3.0'
128
128
  type: :development
129
129
  prerelease: false
130
130
  version_requirements: !ruby/object:Gem::Requirement
131
131
  requirements:
132
132
  - - "~>"
133
133
  - !ruby/object:Gem::Version
134
- version: '2.14'
134
+ version: '3.0'
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rake
137
137
  requirement: !ruby/object:Gem::Requirement
@@ -235,8 +235,6 @@ files:
235
235
  - LICENSE.txt
236
236
  - README.md
237
237
  - Rakefile
238
- - gemfiles/3.0.gemfile
239
- - gemfiles/3.0.gemfile.lock
240
238
  - gemfiles/3.1.gemfile
241
239
  - gemfiles/3.1.gemfile.lock
242
240
  - gemfiles/3.2.gemfile
@@ -247,16 +245,15 @@ files:
247
245
  - gemfiles/4.1.gemfile.lock
248
246
  - lib/paraphrase.rb
249
247
  - lib/paraphrase/active_model.rb
250
- - lib/paraphrase/errors.rb
251
- - lib/paraphrase/params.rb
248
+ - lib/paraphrase/mapping.rb
249
+ - lib/paraphrase/params_filter.rb
252
250
  - lib/paraphrase/query.rb
253
251
  - lib/paraphrase/rails.rb
254
- - lib/paraphrase/scope.rb
252
+ - lib/paraphrase/repository.rb
255
253
  - lib/paraphrase/syntax.rb
256
254
  - lib/paraphrase/version.rb
257
255
  - paraphrase.gemspec
258
256
  - spec/paraphrase/query_spec.rb
259
- - spec/paraphrase/scope_spec.rb
260
257
  - spec/paraphrase/syntax_spec.rb
261
258
  - spec/spec_helper.rb
262
259
  homepage: https://github.com/ecbypi/paraphrase
@@ -285,7 +282,6 @@ specification_version: 4
285
282
  summary: Map query params to model scopes
286
283
  test_files:
287
284
  - spec/paraphrase/query_spec.rb
288
- - spec/paraphrase/scope_spec.rb
289
285
  - spec/paraphrase/syntax_spec.rb
290
286
  - spec/spec_helper.rb
291
287
  has_rdoc:
data/gemfiles/3.0.gemfile DELETED
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 3.0"
6
- gem "activesupport", "~> 3.0"
7
- gem "actionpack", "~> 3.0"
8
-
9
- gemspec :path=>"../"
@@ -1,100 +0,0 @@
1
- PATH
2
- remote: /Users/edd_d/Work/paraphrase
3
- specs:
4
- paraphrase (0.9.0)
5
- activemodel (>= 3.0, < 4.2)
6
- activerecord (>= 3.0, < 4.2)
7
- activesupport (>= 3.0, < 4.2)
8
-
9
- GEM
10
- remote: https://rubygems.org/
11
- specs:
12
- actionpack (3.2.16)
13
- activemodel (= 3.2.16)
14
- activesupport (= 3.2.16)
15
- builder (~> 3.0.0)
16
- erubis (~> 2.7.0)
17
- journey (~> 1.0.4)
18
- rack (~> 1.4.5)
19
- rack-cache (~> 1.2)
20
- rack-test (~> 0.6.1)
21
- sprockets (~> 2.2.1)
22
- activemodel (3.2.16)
23
- activesupport (= 3.2.16)
24
- builder (~> 3.0.0)
25
- activerecord (3.2.16)
26
- activemodel (= 3.2.16)
27
- activesupport (= 3.2.16)
28
- arel (~> 3.0.2)
29
- tzinfo (~> 0.3.29)
30
- activesupport (3.2.16)
31
- i18n (~> 0.6, >= 0.6.4)
32
- multi_json (~> 1.0)
33
- appraisal (0.5.2)
34
- bundler
35
- rake
36
- arel (3.0.3)
37
- builder (3.0.4)
38
- codeclimate-test-reporter (0.3.0)
39
- simplecov (>= 0.7.1, < 1.0.0)
40
- coderay (1.1.0)
41
- diff-lcs (1.2.5)
42
- docile (1.1.3)
43
- erubis (2.7.0)
44
- hike (1.2.3)
45
- i18n (0.6.9)
46
- journey (1.0.4)
47
- method_source (0.8.2)
48
- multi_json (1.8.4)
49
- pry (0.9.12.4)
50
- coderay (~> 1.0)
51
- method_source (~> 0.8)
52
- slop (~> 3.4)
53
- rack (1.4.5)
54
- rack-cache (1.2)
55
- rack (>= 0.4)
56
- rack-test (0.6.2)
57
- rack (>= 1.0)
58
- rake (0.9.6)
59
- redcarpet (2.1.1)
60
- rspec (2.14.1)
61
- rspec-core (~> 2.14.0)
62
- rspec-expectations (~> 2.14.0)
63
- rspec-mocks (~> 2.14.0)
64
- rspec-core (2.14.7)
65
- rspec-expectations (2.14.4)
66
- diff-lcs (>= 1.1.3, < 2.0)
67
- rspec-mocks (2.14.4)
68
- simplecov (0.8.2)
69
- docile (~> 1.1.0)
70
- multi_json
71
- simplecov-html (~> 0.8.0)
72
- simplecov-html (0.8.0)
73
- slop (3.4.7)
74
- sprockets (2.2.2)
75
- hike (~> 1.2)
76
- multi_json (~> 1.0)
77
- rack (~> 1.0)
78
- tilt (~> 1.1, != 1.3.0)
79
- sqlite3 (1.3.8)
80
- tilt (1.4.1)
81
- tzinfo (0.3.38)
82
- yard (0.8.7.3)
83
-
84
- PLATFORMS
85
- ruby
86
-
87
- DEPENDENCIES
88
- actionpack (~> 3.0)
89
- activerecord (~> 3.0)
90
- activesupport (~> 3.0)
91
- appraisal (~> 0.4)
92
- bundler (~> 1.0)
93
- codeclimate-test-reporter (~> 0.3)
94
- paraphrase!
95
- pry (~> 0.9)
96
- rake (~> 0.9.2)
97
- redcarpet (~> 2.1.1)
98
- rspec (~> 2.14)
99
- sqlite3 (~> 1.3.6)
100
- yard (~> 0.7)