yesterday 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -74,11 +74,16 @@ Diff's within associations:
74
74
 
75
75
 
76
76
  To check if associations are created, just use the created_ prefix before the appropiate association:
77
- contact.created_addresses
77
+ contact.addresses.first.created?
78
78
 
79
79
  Or, for removed associations:
80
- contact.destroyed_addresses
80
+ contact.addresses.first.destroyed?
81
81
 
82
+ Or, just modified:
83
+ contact.addresses.first.modified?
84
+
85
+ Or... nothing:
86
+ contact.addresses.first.unmodified?
82
87
 
83
88
  = License and credits
84
89
  Use it and have fun with it! Comments, cakes and hugs are welcome! Just stick to the license!
@@ -26,6 +26,22 @@ module Yesterday
26
26
  @object ||= VersionedObjectCreator.new(object_attributes).to_object if object_attributes.present?
27
27
  end
28
28
 
29
+ def made_changes
30
+ @made_changes ||= {}
31
+
32
+ unless @made_changes[compare_with_version_number]
33
+ compare_with_version_number ||= version_number > 1 ? (version_number - 1) : 1
34
+
35
+ from_attributes = changeset_for(compare_with_version_number, changed_object).object_attributes
36
+ to_attributes = object_attributes
37
+ diff = Differ.new(from_attributes, to_attributes).diff
38
+
39
+ @made_changes[compare_with_version_number] = VersionedObjectCreator.new(diff).to_object
40
+ end
41
+
42
+ @made_changes[compare_with_version_number]
43
+ end
44
+
29
45
  private
30
46
 
31
47
  def determine_version_number
@@ -11,8 +11,9 @@ module Yesterday
11
11
  diff = diff_attributes(from, to)
12
12
 
13
13
  diff.merge! diff_collection(from, to)
14
- diff.merge! diff_created_objects(from, to)
15
- diff.merge! diff_destroyed_objects(from, to)
14
+
15
+ diff_created_objects from, to, diff
16
+ diff_destroyed_objects from, to, diff
16
17
 
17
18
  diff
18
19
  end
@@ -23,9 +24,12 @@ module Yesterday
23
24
  from.each do |attribute, old_value|
24
25
  if attribute == 'id'
25
26
  diff[attribute] = old_value
26
- elsif !old_value.is_a?(Array)
27
+
28
+ elsif !old_value.is_a?(Array) && attribute != '_event'
27
29
  new_value = to[attribute]
28
30
  diff[attribute] = [old_value, new_value]
31
+ diff['_event'] = 'modified' if old_value != new_value
32
+
29
33
  end
30
34
  end
31
35
 
@@ -53,17 +57,15 @@ module Yesterday
53
57
  diff
54
58
  end
55
59
 
56
- def diff_created_objects(from, to)
57
- diff_object_creation from, to, 'created'
60
+ def diff_created_objects(from, to, diff)
61
+ diff_object_creation from, to, 'created', diff
58
62
  end
59
63
 
60
- def diff_destroyed_objects(from, to)
61
- diff_object_creation to, from, 'destroyed'
64
+ def diff_destroyed_objects(from, to, diff)
65
+ diff_object_creation to, from, 'destroyed', diff
62
66
  end
63
67
 
64
- def diff_object_creation(from, to, event)
65
- diff = {}
66
-
68
+ def diff_object_creation(from, to, event, diff)
67
69
  to.each do |attribute, to_objects|
68
70
  if to_objects.is_a? Array
69
71
  from_objects = from[attribute] || []
@@ -72,8 +74,9 @@ module Yesterday
72
74
  from_object = find_object(from_objects, to_object['id'])
73
75
 
74
76
  unless from_object
75
- diff["#{event}_#{attribute}"] ||= []
76
- diff["#{event}_#{attribute}"] << to_object
77
+ to_object['_event'] = event
78
+ diff[attribute] ||= []
79
+ diff[attribute] << to_object
77
80
  end
78
81
  end
79
82
  end
@@ -1,3 +1,3 @@
1
1
  module Yesterday
2
- VERSION = "0.3"
2
+ VERSION = "0.4"
3
3
  end
@@ -13,6 +13,22 @@ module Yesterday
13
13
  end
14
14
  end
15
15
 
16
+ def modified?
17
+ attributes['_event'] && attributes['_event'] == 'modified'
18
+ end
19
+
20
+ def created?
21
+ attributes['_event'] && attributes['_event'] == 'created'
22
+ end
23
+
24
+ def destroyed?
25
+ attributes['_event'] && attributes['_event'] == 'destroyed'
26
+ end
27
+
28
+ def unmodified?
29
+ !attributes.has_key?('_event')
30
+ end
31
+
16
32
  end
17
33
 
18
34
  end
data/spec/differ_spec.rb CHANGED
@@ -45,12 +45,16 @@ describe Yesterday::Differ do
45
45
  'name' => ['Harold', 'Peter'],
46
46
  'addresses' => [
47
47
  { 'id' => 1,
48
- 'address' => ['Sesamstreet 1', 'Foobar 1'] },
48
+ 'address' => ['Sesamstreet 1', 'Foobar 1'],
49
+ '_event' => 'modified' },
49
50
  { 'id' => 2,
50
- 'address' => ['Sesamstreet 2', 'Foobar 2'] }
51
- ]
51
+ 'address' => ['Sesamstreet 2', 'Foobar 2'],
52
+ '_event' => 'modified' }
53
+ ],
54
+ '_event' => 'modified'
52
55
  }
53
- ]
56
+ ],
57
+ '_event' => 'modified'
54
58
  }
55
59
  end
56
60
 
@@ -106,15 +110,12 @@ describe Yesterday::Differ do
106
110
  'name' => ['Harold', 'Harold'],
107
111
  'addresses' => [
108
112
  { 'id' => 2,
109
- 'address' => ['Sesamstreet 2', 'Sesamstreet 2'] }
110
- ],
111
- 'destroyed_addresses' => [
112
- { 'id' => 1,
113
- 'address' => 'Sesamstreet 1' }
113
+ 'address' => ['Sesamstreet 2', 'Sesamstreet 2'] },
114
+ { 'id' => 1,
115
+ 'address' => 'Sesamstreet 1',
116
+ '_event' => 'destroyed' }
114
117
  ]
115
- }
116
- ],
117
- 'destroyed_contacts' => [
118
+ },
118
119
  {
119
120
  'id' => 2,
120
121
  'name' => 'Peter',
@@ -123,7 +124,8 @@ describe Yesterday::Differ do
123
124
  'address' => 'Sesamstreet 1' },
124
125
  { 'id' => 2,
125
126
  'address' => 'Sesamstreet 2' }
126
- ]
127
+ ],
128
+ '_event' => 'destroyed'
127
129
  }
128
130
  ]
129
131
  }
@@ -142,6 +144,18 @@ describe Yesterday::Differ do
142
144
  'address' => 'Sesamstreet 2' }
143
145
  ]
144
146
  }
147
+ ],
148
+ 'companies' => [
149
+ {
150
+ 'id' => 1,
151
+ 'name' => 'Some company',
152
+ 'contacts' => [
153
+ {
154
+ 'id' => 1,
155
+ 'name' => 'Some contact'
156
+ }
157
+ ]
158
+ }
145
159
  ]
146
160
  }
147
161
 
@@ -169,6 +183,22 @@ describe Yesterday::Differ do
169
183
  'address' => 'Sesamstreet 2' }
170
184
  ]
171
185
  }
186
+ ],
187
+ 'companies' => [
188
+ {
189
+ 'id' => 1,
190
+ 'name' => 'Some company',
191
+ 'contacts' => [
192
+ {
193
+ 'id' => 1,
194
+ 'name' => 'Some contact'
195
+ },
196
+ {
197
+ 'id' => 2,
198
+ 'name' => 'Some other contact'
199
+ }
200
+ ]
201
+ }
172
202
  ]
173
203
  }
174
204
 
@@ -181,15 +211,12 @@ describe Yesterday::Differ do
181
211
  'name' => ['Harold', 'Harold'],
182
212
  'addresses' => [
183
213
  { 'id' => 2,
184
- 'address' => ['Sesamstreet 2', 'Sesamstreet 2'] }
185
- ],
186
- 'created_addresses' => [
187
- { 'id' => 1,
188
- 'address' => 'Sesamstreet 1' }
214
+ 'address' => ['Sesamstreet 2', 'Sesamstreet 2'] },
215
+ { 'id' => 1,
216
+ 'address' => 'Sesamstreet 1',
217
+ '_event' => 'created' }
189
218
  ]
190
- }
191
- ],
192
- 'created_contacts' => [
219
+ },
193
220
  {
194
221
  'id' => 2,
195
222
  'name' => 'Peter',
@@ -198,7 +225,25 @@ describe Yesterday::Differ do
198
225
  'address' => 'Sesamstreet 1' },
199
226
  { 'id' => 2,
200
227
  'address' => 'Sesamstreet 2' }
201
- ]
228
+ ],
229
+ '_event' => 'created'
230
+ }
231
+ ],
232
+ 'companies' => [
233
+ {
234
+ 'id' => 1,
235
+ 'name' => ['Some company', 'Some company'],
236
+ 'contacts' => [
237
+ {
238
+ 'id' => 1,
239
+ 'name' => ['Some contact', 'Some contact']
240
+ },
241
+ {
242
+ 'id' => 2,
243
+ 'name' => 'Some other contact',
244
+ '_event' => 'created'
245
+ }
246
+ ]
202
247
  }
203
248
  ]
204
249
  }
@@ -149,12 +149,11 @@ describe Yesterday::Model do
149
149
  diff = report.diff_version(1, 2)
150
150
 
151
151
  diff.contacts.count.should == 1
152
- diff.contacts.first.addresses.count.should == 1
153
- diff.contacts.first.addresses.first.id.should == address1.id
154
152
 
155
- diff.contacts.first.created_addresses.count.should == 2
156
- diff.contacts.first.created_addresses.first.id.should == address2.id
157
- diff.contacts.first.created_addresses.last.id.should == address3.id
153
+ diff.contacts.first.addresses.count.should == 3
154
+
155
+ diff.contacts.first.addresses.select(&:unmodified?).map(&:id).should == [address1.id]
156
+ diff.contacts.first.addresses.select(&:created?).map(&:id).should == [address2.id, address3.id]
158
157
  end
159
158
 
160
159
  describe 'association removal' do
@@ -215,23 +214,19 @@ describe Yesterday::Model do
215
214
  diff = @report.diff_version(2, 3)
216
215
  diff.contacts.count.should == 1
217
216
 
218
- diff.contacts.first.addresses.count.should == 1
219
- diff.contacts.first.destroyed_addresses.count.should == 1
220
-
221
- diff.contacts.first.destroyed_addresses.first.id.should == @address2.id
222
- diff.contacts.first.addresses.first.id.should == @address1.id
217
+ diff.contacts.first.addresses.count.should == 2
218
+ diff.contacts.first.addresses.select(&:unmodified?).count.should == 1
219
+ diff.contacts.first.addresses.select(&:destroyed?).count.should == 1
223
220
 
224
- diff.companies.first.created_addresses.count.should == 1
221
+ diff.contacts.first.addresses.select(&:unmodified?).map(&:id).should == [@address1.id]
222
+ diff.contacts.first.addresses.select(&:destroyed?).map(&:id).should == [@address2.id]
225
223
  end
226
224
 
227
225
  it 'should detect that associations are created when diffing version 1 with 3' do
228
226
  diff = @report.diff_version(1, 3)
229
227
  diff.contacts.first.should_not respond_to(:addresses)
230
228
 
231
- diff.contacts.first.created_addresses.count.should == 1
232
- diff.contacts.first.created_addresses.first.id.should == @address1.id
233
-
234
- diff.companies.first.created_addresses.count.should == 1
229
+ diff.contacts.first.addresses.select(&:created?).map(&:id).should == [@address1.id]
235
230
  end
236
231
  end
237
232
  end
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yesterday
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 3
9
- version: "0.3"
8
+ - 4
9
+ version: "0.4"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Diederick Lawson