ardm 0.1.0 → 0.2.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.
Files changed (40) hide show
  1. data/.ruby-version +1 -0
  2. data/Gemfile +14 -2
  3. data/ardm.gemspec +1 -1
  4. data/lib/ardm.rb +8 -0
  5. data/lib/ardm/active_record.rb +0 -5
  6. data/lib/ardm/active_record/associations.rb +27 -10
  7. data/lib/ardm/active_record/predicate_builder/rails4.rb +12 -5
  8. data/lib/ardm/active_record/property.rb +4 -3
  9. data/lib/ardm/active_record/record.rb +10 -6
  10. data/lib/ardm/active_record/relation.rb +67 -2
  11. data/lib/ardm/data_mapper.rb +2 -0
  12. data/lib/ardm/data_mapper/record.rb +19 -22
  13. data/lib/ardm/property/support/paranoid_base.rb +1 -1
  14. data/lib/ardm/query/expression.rb +5 -15
  15. data/lib/ardm/query/operator.rb +3 -3
  16. data/lib/ardm/version.rb +1 -1
  17. data/spec/fixtures/article.rb +1 -1
  18. data/spec/fixtures/resource_blog.rb +53 -0
  19. data/spec/integration/comma_separated_list_spec.rb +4 -4
  20. data/spec/integration/dirty_minder_spec.rb +1 -1
  21. data/spec/integration/enum_spec.rb +2 -2
  22. data/spec/integration/epoch_time_spec.rb +2 -2
  23. data/spec/integration/file_path_spec.rb +4 -4
  24. data/spec/integration/flag_spec.rb +5 -3
  25. data/spec/integration/json_spec.rb +3 -3
  26. data/spec/public/model_spec.rb +78 -8
  27. data/spec/public/property_spec.rb +10 -6
  28. data/spec/public/resource_spec.rb +9 -64
  29. data/spec/shared/{finder_shared_spec.rb → finder_shared.rb} +134 -128
  30. data/spec/shared/{flags_shared_spec.rb → flags_shared.rb} +0 -0
  31. data/spec/shared/{public_property_spec.rb → public_property.rb} +0 -0
  32. data/spec/shared/{resource_spec.rb → resource.rb} +46 -31
  33. data/spec/shared/{semipublic_property_spec.rb → semipublic_property.rb} +0 -0
  34. data/spec/spec_helper.rb +11 -5
  35. data/spec/support/logger.rb +38 -0
  36. data/spec/unit/dirty_minder_spec.rb +4 -2
  37. data/spec/unit/paranoid_boolean_spec.rb +3 -3
  38. data/spec/unit/paranoid_datetime_spec.rb +3 -3
  39. metadata +59 -30
  40. checksums.yaml +0 -7
data/lib/ardm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ardm
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -16,7 +16,7 @@ module Ardm
16
16
 
17
17
  timestamps :at
18
18
 
19
- before_validation do
19
+ before(:valid?) do
20
20
  self.slug = self.title
21
21
  end
22
22
  end # Article
@@ -0,0 +1,53 @@
1
+ module ::ResourceBlog
2
+ class User < Ardm::Record
3
+ self.table_name = "users"
4
+
5
+ property :name, String, key: true
6
+ property :age, Integer
7
+ property :summary, Text
8
+ property :description, Text
9
+ property :admin, Boolean, :accessor => :private
10
+
11
+ belongs_to :parent, self, :required => false
12
+ has n, :children, self, :inverse => :parent
13
+
14
+ belongs_to :referrer, self, :required => false
15
+ has n, :comments
16
+
17
+ # FIXME: figure out a different approach than stubbing things out
18
+ def comment=(*)
19
+ # do nothing with comment
20
+ end
21
+ end
22
+
23
+ class Author < User; end
24
+
25
+ class Comment < Ardm::Record
26
+ self.table_name = "comments"
27
+
28
+ property :id, Serial
29
+ property :body, Text
30
+
31
+ belongs_to :user
32
+ end
33
+
34
+ class Article < Ardm::Record
35
+ self.table_name = "articles"
36
+
37
+ property :id, Serial
38
+ property :body, Text
39
+
40
+ has n, :paragraphs
41
+ end
42
+
43
+ class Paragraph < Ardm::Record
44
+ self.table_name = "paragraphs"
45
+
46
+ property :id, Serial
47
+ property :text, String
48
+
49
+ belongs_to :article
50
+ end
51
+ end
52
+
53
+ Ardm::Record.finalize
@@ -16,7 +16,7 @@ try_spec do
16
16
 
17
17
  describe 'when dumped and loaded again' do
18
18
  before do
19
- expect(@resource.save).to be true
19
+ expect(@resource.save).to be_truthy
20
20
  @resource.reload
21
21
  end
22
22
 
@@ -33,7 +33,7 @@ try_spec do
33
33
 
34
34
  describe 'when dumped and loaded again' do
35
35
  before do
36
- expect(@resource.save).to be true
36
+ expect(@resource.save).to be_truthy
37
37
  @resource.reload
38
38
  end
39
39
 
@@ -60,7 +60,7 @@ try_spec do
60
60
 
61
61
  describe 'when dumped and loaded again' do
62
62
  before do
63
- expect(@resource.save).to be true
63
+ expect(@resource.save).to be_truthy
64
64
  @resource.reload
65
65
  end
66
66
 
@@ -77,7 +77,7 @@ try_spec do
77
77
  end
78
78
 
79
79
  it 'has blank entries removed' do
80
- expect(@resource.interests.any? { |i| Ardm::Ext.blank?(i) }).to be false
80
+ expect(@resource.interests.any? { |i| Ardm::Ext.blank?(i) }).to be_falsey
81
81
  end
82
82
  end
83
83
  end
@@ -54,7 +54,7 @@ try_spec do
54
54
  end
55
55
 
56
56
  it "should remember the new attribute" do
57
- expect(@resource.positions['pays_buttloads_of_money']).to be true
57
+ expect(@resource.positions['pays_buttloads_of_money']).to be_truthy
58
58
  end
59
59
  end
60
60
 
@@ -14,7 +14,7 @@ try_spec do
14
14
  :status => 'confirmed'
15
15
  )
16
16
 
17
- expect(@resource.save).to be true
17
+ expect(@resource.save).to be_truthy
18
18
  @resource.reload
19
19
  end
20
20
 
@@ -41,7 +41,7 @@ try_spec do
41
41
  :body => "Note that at the very least, there should be a check to see whether or not the user is created before chown'ing a file to the user.",
42
42
  :status => 'confirmed'
43
43
  )
44
- expect(@resource.save).to be true
44
+ expect(@resource.save).to be_truthy
45
45
  end
46
46
 
47
47
  it 'supports queries with equality operator on enumeration property' do
@@ -22,7 +22,7 @@ try_spec do
22
22
 
23
23
  describe 'when dumped and loaded again' do
24
24
  before do
25
- expect(@resource.save).to be true
25
+ expect(@resource.save).to be_truthy
26
26
  @resource.reload
27
27
  end
28
28
 
@@ -45,7 +45,7 @@ try_spec do
45
45
 
46
46
  describe 'when dumped and loaded again' do
47
47
  before do
48
- expect(@resource.save).to be true
48
+ expect(@resource.save).to be_truthy
49
49
  @resource.reload
50
50
  end
51
51
 
@@ -53,7 +53,7 @@ try_spec do
53
53
 
54
54
  describe 'when saved and reloaded' do
55
55
  before do
56
- expect(@resource.save).to be true
56
+ expect(@resource.save).to be_truthy
57
57
  @resource.reload
58
58
  end
59
59
 
@@ -95,7 +95,7 @@ try_spec do
95
95
 
96
96
  describe 'when saved and reloaded' do
97
97
  before do
98
- expect(@resource.save).to be true
98
+ expect(@resource.save).to be_truthy
99
99
  @resource.reload
100
100
  end
101
101
 
@@ -113,7 +113,7 @@ try_spec do
113
113
 
114
114
  describe 'when saved and reloaded' do
115
115
  before do
116
- expect(@resource.save).to be true
116
+ expect(@resource.save).to be_truthy
117
117
  @resource.reload
118
118
  end
119
119
 
@@ -131,7 +131,7 @@ try_spec do
131
131
 
132
132
  describe 'when saved and reloaded' do
133
133
  before do
134
- expect(@resource.save).to be true
134
+ expect(@resource.save).to be_truthy
135
135
  @resource.reload
136
136
  end
137
137
 
@@ -16,7 +16,9 @@ try_spec do
16
16
 
17
17
  describe 'with the default value' do
18
18
  it 'returns it as an array', skip: true do
19
- expect(@resource.size).to eq([Ardm::Fixtures::TShirt.properties[:size].default])
19
+ skip "FIXME: This probably should pass" do
20
+ expect(@resource.size).to eq([Ardm::Fixtures::TShirt.properties[:size].default])
21
+ end
20
22
  end
21
23
  end
22
24
 
@@ -24,7 +26,7 @@ try_spec do
24
26
  describe 'dumped and loaded' do
25
27
  before do
26
28
  @resource.size = [ :xs, :medium ]
27
- expect(@resource.save).to be true
29
+ expect(@resource.save).to be_truthy
28
30
  @resource.reload
29
31
  end
30
32
 
@@ -41,7 +43,7 @@ try_spec do
41
43
 
42
44
  describe 'dumped and loaded' do
43
45
  before do
44
- expect(@resource.save).to be true
46
+ expect(@resource.save).to be_truthy
45
47
  @resource.reload
46
48
  end
47
49
 
@@ -16,7 +16,7 @@ try_spec do
16
16
 
17
17
  describe 'when dumped and loaded again' do
18
18
  before do
19
- expect(@resource.save).to be true
19
+ expect(@resource.save).to be_truthy
20
20
  @resource.reload
21
21
  end
22
22
 
@@ -36,7 +36,7 @@ try_spec do
36
36
 
37
37
  describe 'when dumped and loaded again' do
38
38
  before do
39
- expect(@resource.save).to be true
39
+ expect(@resource.save).to be_truthy
40
40
  @resource.reload
41
41
  end
42
42
 
@@ -56,7 +56,7 @@ try_spec do
56
56
 
57
57
  describe 'when dumped and loaded again' do
58
58
  before do
59
- expect(@resource.save).to be true
59
+ expect(@resource.save).to be_truthy
60
60
  @resource.reload
61
61
  end
62
62
 
@@ -3,6 +3,12 @@ require 'spec_helper'
3
3
  module ::ModelBlog
4
4
  # FIXME: load order in tests is being problematic
5
5
  class ArticlePublication < Ardm::Record
6
+ self.table_name = "article_publications"
7
+
8
+ property :id, Serial
9
+
10
+ belongs_to :article, model: 'ModelBlog::Article'
11
+ belongs_to :publication, model: 'ModelBlog::Publication'
6
12
  end
7
13
 
8
14
  class Article < Ardm::Record
@@ -16,7 +22,7 @@ module ::ModelBlog
16
22
  belongs_to :original, self, :required => false
17
23
  has n, :revisions, self, :child_key => [ :original_id ]
18
24
  has 1, :previous, self, :child_key => [ :original_id ], :order => [ :id.desc ]
19
- has n, :article_publications, model: ::ModelBlog::ArticlePublication
25
+ has n, :article_publications, model: 'ArticlePublication'
20
26
  has n, :publications, :through => :article_publications
21
27
  end
22
28
 
@@ -26,18 +32,20 @@ module ::ModelBlog
26
32
  property :id, Serial
27
33
  property :name, String
28
34
 
29
- has n, :article_publications, model: ::ModelBlog::ArticlePublication
30
- has n, :acticles, :through => :article_publications
35
+ has n, :article_publications, model: ArticlePublication
36
+ has n, :articles, :through => :article_publications
31
37
  end
32
38
 
33
39
  class ArticlePublication < Ardm::Record
34
40
  self.table_name = "article_publications"
35
41
 
36
- belongs_to :acticle, model: '::ModelBlog::Article'
42
+ belongs_to :article, model: '::ModelBlog::Article'
37
43
  belongs_to :publication, model: '::ModelBlog::Publication'
38
44
  end
39
45
  end
40
46
 
47
+ Ardm::Record.finalize
48
+
41
49
  describe 'Ardm::Record' do
42
50
  before do
43
51
  @article_model = ModelBlog::Article
@@ -51,6 +59,7 @@ describe 'Ardm::Record' do
51
59
 
52
60
  @original = @articles.create(:title => 'Original Article')
53
61
  @article = @articles.create(:title => 'Sample Article', :body => 'Sample', :original => @original)
62
+ expect(@article.reload.original).to eq(@original)
54
63
  @other = @articles.create(:title => 'Other Article', :body => 'Other')
55
64
  end
56
65
 
@@ -138,8 +147,10 @@ describe 'Ardm::Record' do
138
147
 
139
148
  [ :destroy, :destroy! ].each do |method|
140
149
  describe "##{method}" do
141
- it 'should remove all resources', pending: true do
142
- expect { @article_model.send(method) }.to change { @article_model.any? }.from(true).to(false)
150
+ let(:model) { @article_model }
151
+
152
+ it 'should remove all resources' do
153
+ expect { model.send(method) }.to change { model.any? }.from(true).to(false)
143
154
  end
144
155
  end
145
156
  end
@@ -187,7 +198,66 @@ describe 'Ardm::Record' do
187
198
  end
188
199
  end
189
200
 
190
- # FIXME: these are very broken right now
191
- #it_should_behave_like 'Finder Interface'
201
+ describe "finders" do
202
+ before(:each) do
203
+ ModelBlog::Article.destroy
204
+ @articles = ModelBlog::Article.all
205
+ @original = @articles.create(:title => 'Original Article')
206
+ @article = @articles.create(:title => 'Sample Article', :body => 'Sample', :original => @original)
207
+ end
208
+
209
+ include_examples 'Finder Interface'
210
+ end
192
211
 
212
+ it 'Ardm::Record should respond to raise_on_save_failure' do
213
+ Ardm::Record.should respond_to(:raise_on_save_failure)
214
+ end
215
+
216
+ describe '.raise_on_save_failure' do
217
+ subject { Ardm::Record.raise_on_save_failure }
218
+
219
+ it { should be(false) }
220
+ end
221
+
222
+ it 'Ardm::Record should respond to raise_on_save_failure=' do
223
+ Ardm::Record.should respond_to(:raise_on_save_failure=)
224
+ end
225
+
226
+ it 'A model should respond to raise_on_save_failure' do
227
+ @article_model.should respond_to(:raise_on_save_failure)
228
+ end
229
+
230
+ describe '#raise_on_save_failure' do
231
+ after do
232
+ # reset to the default value
233
+ reset_raise_on_save_failure(Ardm::Record)
234
+ reset_raise_on_save_failure(@article_model)
235
+ end
236
+
237
+ subject { @article_model.raise_on_save_failure }
238
+
239
+ describe 'when Ardm::Record.raise_on_save_failure has not been set' do
240
+ it { should be(false) }
241
+ end
242
+
243
+ describe 'when Ardm::Record.raise_on_save_failure has been set to true' do
244
+ before do
245
+ Ardm::Record.raise_on_save_failure = true
246
+ end
247
+
248
+ it { should be(true) }
249
+ end
250
+
251
+ describe 'when model.raise_on_save_failure has been set to true' do
252
+ before do
253
+ @article_model.raise_on_save_failure = true
254
+ end
255
+
256
+ it { should be(true) }
257
+ end
258
+ end
259
+
260
+ it 'A model should respond to raise_on_save_failure=' do
261
+ @article_model.should respond_to(:raise_on_save_failure=)
262
+ end
193
263
  end
@@ -72,10 +72,12 @@ describe Ardm::Property do
72
72
  @image.instance_variable_set(:@description, 'Is set by magic')
73
73
  end
74
74
 
75
- it 'gets instance variable value from the resource directly', pending: true do
76
- # if you know a better way to test direct instance variable access,
77
- # go ahead and make changes to this example
78
- expect(Image.properties[:description].get!(@image)).to eq('Is set by magic')
75
+ it 'gets instance variable value from the resource directly' do
76
+ skip "support for this in ActiveRecord is questionable" do
77
+ # if you know a better way to test direct instance variable access,
78
+ # go ahead and make changes to this example
79
+ expect(Image.properties[:description].get!(@image)).to eq('Is set by magic')
80
+ end
79
81
  end
80
82
  end
81
83
 
@@ -283,8 +285,10 @@ describe Ardm::Property do
283
285
  expect(Track.properties[:musicbrainz_hash].unique?).to be(true)
284
286
  end
285
287
 
286
- it 'is true for serial fields', pending: true do
287
- expect(Track.properties[:title].unique?).to be(true)
288
+ it 'is true for serial fields' do
289
+ skip do
290
+ expect(Track.properties[:title].unique?).should be(true)
291
+ end
288
292
  end
289
293
 
290
294
  it 'is true for keys' do
@@ -1,66 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
- module ::ResourceBlog
4
- class User < Ardm::Record
5
- self.table_name = "users"
6
-
7
- property :name, String, :key => true
8
- property :age, Integer
9
- property :summary, Text
10
- property :description, Text
11
- property :admin, Boolean, :accessor => :private
12
-
13
- belongs_to :parent, self, :required => false
14
- has n, :children, self, :inverse => :parent
15
-
16
- belongs_to :referrer, self, :required => false
17
- has n, :comments
18
-
19
- # FIXME: figure out a different approach than stubbing things out
20
- def comment=(*)
21
- # do nothing with comment
22
- end
23
- end
24
-
25
- class Author < User; end
26
-
27
- class Comment < Ardm::Record
28
- self.table_name = "comments"
29
-
30
- property :id, Serial
31
- property :body, Text
32
-
33
- belongs_to :user
34
- end
35
-
36
- class Article < Ardm::Record
37
- self.table_name = "articles"
38
-
39
- property :id, Serial
40
- property :body, Text
41
- timestamps :at
42
-
43
- has n, :paragraphs
44
- end
45
-
46
- class Paragraph < Ardm::Record
47
- self.table_name = "paragraphs"
48
-
49
- property :id, Serial
50
- property :text, String
51
-
52
- belongs_to :article
53
- end
54
- end
55
-
56
- Ardm::Record.finalize
57
-
58
- # TODO: unused?
59
- #class ::ResourceDefault < Ardm::Record
60
- # property :name, String, :key => true, :default => 'a default value'
61
- #end
62
-
63
3
  describe Ardm::Record do
4
+ require './spec/fixtures/resource_blog'
5
+
64
6
  before do
65
7
  @user_model = ResourceBlog::User
66
8
  @author_model = ResourceBlog::Author
@@ -91,7 +33,7 @@ describe Ardm::Record do
91
33
  subject { @user.raise_on_save_failure }
92
34
 
93
35
  describe 'when model.raise_on_save_failure has not been set' do
94
- it { is_expected.to be false }
36
+ it { is_expected.to be_falsey }
95
37
  end
96
38
 
97
39
  describe 'when model.raise_on_save_failure has been set to true' do
@@ -165,11 +107,14 @@ describe Ardm::Record do
165
107
 
166
108
  describe 'and it is an invalid resource', pending: true do
167
109
  before do
110
+ Ardm::Record.any_instance.stub(:save).and_return(false)
168
111
  expect(@user).to receive(:save_self).and_return(false)
169
112
  end
170
113
 
171
114
  it 'should raise an exception' do
172
- expect { subject }.to raise_error(Ardm::SaveFailureError, "Blog::User##{method} returned false, Blog::User was not saved")
115
+ expect { subject }.to raise_error(Ardm::SaveFailureError, "Blog::User##{method} returned false, Blog::User was not saved") { |error|
116
+ error.resource.should equal(@user)
117
+ }
173
118
  end
174
119
  end
175
120
  end
@@ -177,7 +122,7 @@ describe Ardm::Record do
177
122
  end
178
123
 
179
124
  [ :update, :update! ].each do |method|
180
- describe 'with attributes where one is a foreign key' do
125
+ describe 'with attributes where one is a foreign key', :pending => "#relationships not needed" do
181
126
  before do
182
127
  @dkubb = @user_model.create(:name => 'dkubb', :age => 33)
183
128
  @user.referrer = @dkubb
@@ -247,7 +192,7 @@ describe Ardm::Record do
247
192
  describe '#attribute_set' do
248
193
  subject { object.attribute_set(name, value) }
249
194
 
250
- let(:object) { @user }
195
+ let(:object) { @user.clone }
251
196
 
252
197
  context 'with a known property' do
253
198
  let(:name) { :name }