passive_record 0.3.17 → 0.3.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 57f65c2807d7cfe4fdedb6ed50a176e4d93f6372
4
- data.tar.gz: e2ec1ce8b73eee02815c22acf0ce143a7388bfc4
3
+ metadata.gz: 55612b91f34d4ac833ad318343274c028a7d9db3
4
+ data.tar.gz: ee4c132e59ab5c9c2eef23fa7ad6a643b50e9419
5
5
  SHA512:
6
- metadata.gz: c3507ad80dd941d6d6afb5a5efe3542ae4b8052d53c31dfaa2c58ac737c5825d16c02b1189677e60ca80949d2e505e926c652ee46883da5ec9dcd0af3f07f055
7
- data.tar.gz: 49c26b8bdfb5ffbfd4c8f4a0b152ea19763214ee8edae5ee4ed65be561e9ad7c4f15bc223c38dcd28c6c2a09ca1ab51d78ae938496b191282c746a452df687c0
6
+ metadata.gz: aad41fefd6877ee5d43bbba3f42efd03c89e86e2600aca84f83a69a66a1186f974beb731c8a2ae2e9aa4de7b5b1958b10df557d95bf00c6b0303cda4bfa664ad
7
+ data.tar.gz: e331d278b6dcc08bfdb31312018dc8aa727dc7af6d7dd0a49e7f1205e672c6589fdd7d24672dde8d2bae09c4dee07d60158c5385c9d4a90ce6daf2f512c2952d
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  * [Email](mailto:joe at deepc.io)
6
6
 
7
7
  [![Code Climate GPA](https://codeclimate.com/github/deepcerulean/passive_record/badges/gpa.svg)](https://codeclimate.com/github/deepcerulean/passive_record)
8
- [![Codeship Status for deepcerulean/passive_record](https://www.codeship.io/projects/66bb2d90-ba61-0133-af95-025ac38368ea/status)](https://codeship.com/projects/128700)
8
+ [![Codeship Status for deepcerulean/passive_record](https://www.codeship.io/projects/66bb2d90-ba61-0133-af95-025ac38368ea/status)](https://codeship.com/projects/135673)
9
9
  [![Test Coverage](https://codeclimate.com/github/deepcerulean/passive_record/badges/coverage.svg)](https://codeclimate.com/github/deepcerulean/passive_record/coverage)
10
10
  [![Gem Version](https://badge.fury.io/rb/passive_record.svg)](https://badge.fury.io/rb/passive_record)
11
11
  [![Join the chat at https://gitter.im/deepcerulean/passive_record](https://badges.gitter.im/deepcerulean/passive_record.svg)](https://gitter.im/deepcerulean/passive_record?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
@@ -38,6 +38,6 @@ module PassiveRecord
38
38
  end
39
39
 
40
40
  def self.drop_all
41
- (model_classes + model_classes.flat_map(&:descendants)).each(&:destroy_all)
41
+ (model_classes + model_classes.flat_map(&:descendants)).uniq.each(&:destroy_all)
42
42
  end
43
43
  end
@@ -9,7 +9,8 @@ module PassiveRecord
9
9
  end
10
10
 
11
11
  def ==(other_id)
12
- self.value == other_id.value rescue self.value == other_id
12
+ self.value == other_id ||
13
+ (other_id.is_a?(SecureRandomIdentifier) && self.value == other_id&.value)
13
14
  end
14
15
 
15
16
  def inspect
@@ -4,41 +4,43 @@ module PassiveRecord
4
4
  include Enumerable
5
5
  extend Forwardable
6
6
 
7
- attr_accessor :klass, :conditions
8
-
9
- def initialize(klass,conditions={})
7
+ def initialize(klass,conditions={},scope=nil)
10
8
  @klass = klass
11
9
  @conditions = conditions
12
- @scope = nil
10
+ @scope = scope
11
+ end
12
+
13
+ def not(new_conditions={})
14
+ NegatedQuery.new(@klass, new_conditions)
13
15
  end
14
16
 
15
- def not(conditions={})
16
- NegatedQuery.new(@klass, conditions)
17
+ def or(query=nil)
18
+ DisjoinedQuery.new(@klass, self, query)
17
19
  end
18
20
 
19
21
  def all
20
- return [] unless conditions
22
+ return [] unless @conditions
21
23
  matching = method(:matching_instances)
22
24
  if @scope
23
25
  if negated?
24
- klass.reject(&@scope.method(:matching_instances))
26
+ @klass.reject(&@scope.method(:matching_instances))
25
27
  else
26
- klass.select(&@scope.method(:matching_instances))
28
+ @klass.select(&@scope.method(:matching_instances))
27
29
  end
28
30
  else
29
- klass.select(&matching)
31
+ @klass.select(&matching)
30
32
  end
31
33
  end
32
34
  def_delegators :all, :each
33
35
 
34
36
  def matching_instances(instance)
35
- conditions.all? do |(field,value)|
37
+ @conditions.all? do |(field,value)|
36
38
  evaluate_condition(instance, field, value)
37
39
  end
38
40
  end
39
41
 
40
42
  def create(attrs={})
41
- klass.create(conditions.merge(attrs))
43
+ @klass.create(@conditions.merge(attrs))
42
44
  end
43
45
 
44
46
  def first_or_create
@@ -46,24 +48,31 @@ module PassiveRecord
46
48
  end
47
49
 
48
50
  def where(new_conditions={})
49
- @conditions = new_conditions.merge(conditions)
51
+ @conditions = new_conditions.merge(@conditions)
50
52
  self
51
53
  end
52
54
 
53
- def ==(other_query)
54
- @klass == other_query.klass && @conditions == other_query.conditions
55
+ def negated?
56
+ false
55
57
  end
56
58
 
57
- def negated?
59
+ def disjoined?
58
60
  false
59
61
  end
60
62
 
63
+ def and(scope_query)
64
+ ConjoinedQuery.new(@klass, self, scope_query)
65
+ end
66
+
61
67
  def method_missing(meth,*args,&blk)
62
- if klass.methods.include?(meth)
63
- # okay, so this thing is a query
64
- # and we need to 'compose' with it somehow
65
- @scope = klass.send(meth,*args,&blk)
66
- self
68
+ if @klass.methods.include?(meth)
69
+ scope_query = @klass.send(meth,*args,&blk)
70
+ if negated? && @scope.nil? && @conditions.empty?
71
+ @scope = scope_query
72
+ self
73
+ else
74
+ scope_query.and(self)
75
+ end
67
76
  else
68
77
  super(meth,*args,&blk)
69
78
  end
@@ -94,7 +103,7 @@ module PassiveRecord
94
103
 
95
104
  class NegatedQuery < Query
96
105
  def matching_instances(instance)
97
- conditions.none? do |(field,value)|
106
+ @conditions.none? do |(field,value)|
98
107
  evaluate_condition(instance, field, value)
99
108
  end
100
109
  end
@@ -103,5 +112,33 @@ module PassiveRecord
103
112
  true
104
113
  end
105
114
  end
115
+
116
+ class DisjoinedQuery < Query
117
+ def initialize(klass, first_query, second_query)
118
+ @klass = klass
119
+ @first_query = first_query
120
+ @second_query = second_query
121
+ end
122
+
123
+ def all
124
+ (@first_query.all + @second_query.all).uniq
125
+ end
126
+
127
+ def disjoined?
128
+ true
129
+ end
130
+ end
131
+
132
+ class ConjoinedQuery < Query
133
+ def initialize(klass, first_query, second_query)
134
+ @klass = klass
135
+ @first_query = first_query
136
+ @second_query = second_query
137
+ end
138
+
139
+ def all
140
+ @first_query.all & @second_query.all
141
+ end
142
+ end
106
143
  end
107
144
  end
@@ -1,4 +1,4 @@
1
1
  module PassiveRecord
2
2
  # passive_record version
3
- VERSION = "0.3.17"
3
+ VERSION = "0.3.18"
4
4
  end
@@ -205,9 +205,35 @@ describe "passive record models" do
205
205
  end
206
206
  end
207
207
 
208
+ context 'queries with disjunctions' do
209
+ it 'should find where attributes match EITHER query' do
210
+ pom = Family::Dog.create breed: 'pom'
211
+ pug = Family::Dog.create breed: 'pug'
212
+ Family::Dog.create breed: 'mutt'
213
+ Family::Dog.create breed: 'lab'
214
+ Family::Dog.create breed: 'papillon'
215
+
216
+ expect(
217
+ Family::Dog.
218
+ where(breed: 'pom').or(Family::Dog.where(breed: 'pug')).all
219
+ ).to eq([pom, pug])
220
+ end
221
+ end
222
+
223
+ context 'query chaining' do
224
+ it 'should handle conjoining scopes together' do
225
+ Post.create published_at: 10.days.ago, active: true
226
+ Post.create active: false
227
+ recent_and_active = Post.create active: true
228
+
229
+ expect(Post.active.recent.all).to eq([recent_and_active])
230
+ expect(Post.recent.active.all).to eq([recent_and_active])
231
+ end
232
+ end
233
+
208
234
  context 'queries with scopes' do
209
- let(:post) { Post.create(published_at: 10.days.ago) }
210
- let(:another_post) {Post.create(published_at: 2.days.ago)}
235
+ let!(:post) { Post.create(published_at: 10.days.ago) }
236
+ let!(:another_post) {Post.create(published_at: 2.days.ago)}
211
237
 
212
238
  describe 'should restrict using class method' do
213
239
  it 'should use a class method as a scope' do
@@ -341,11 +367,11 @@ describe "passive record models" do
341
367
 
342
368
  expect(
343
369
  child.dogs.
344
- where(breed: 'mutt')
370
+ where(breed: 'mutt').all
345
371
  ).to eq(
346
372
  Family::Dog.
347
373
  where(child_id: child.id).
348
- where(breed: 'mutt')
374
+ where(breed: 'mutt').all
349
375
  )
350
376
  end
351
377
 
data/spec/spec_helper.rb CHANGED
@@ -105,9 +105,13 @@ class Post < Model
105
105
  has_many :comments
106
106
  has_many :commenters, :through => :comments, :class_name => "User"
107
107
 
108
- attr_accessor :published_at
108
+ attr_accessor :active, :published_at
109
109
  before_create { @published_at = Time.now }
110
110
 
111
+ def self.active
112
+ where(active: true)
113
+ end
114
+
111
115
  def self.recent
112
116
  where(:published_at => 3.days.ago..Time.now)
113
117
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passive_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.17
4
+ version: 0.3.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Weissman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-03 00:00:00.000000000 Z
11
+ date: 2016-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport