audited_change_set 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/audited_change_set.gemspec +4 -4
- data/lib/audited_change_set/change.rb +18 -4
- data/lib/audited_change_set.rb +1 -0
- data/spec/audited_change_set/change_set_spec.rb +1 -1
- data/spec/audited_change_set/change_spec.rb +30 -20
- data/spec/db/schema.rb +3 -1
- data/spec/spec_helper.rb +3 -2
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/audited_change_set.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{audited_change_set}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["David Chelimsky", "Brian Tatnall", "Nate Jackson", "Corey Haines"]
|
12
|
-
s.date = %q{2010-05-
|
12
|
+
s.date = %q{2010-05-19}
|
13
13
|
s.description = %q{change_set for acts_as_audited}
|
14
14
|
s.email = %q{dchelimsky@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -40,9 +40,9 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.rubygems_version = %q{1.3.6}
|
41
41
|
s.summary = %q{change_set for acts_as_audited}
|
42
42
|
s.test_files = [
|
43
|
-
"spec/
|
43
|
+
"spec/db/schema.rb",
|
44
44
|
"spec/audited_change_set/change_spec.rb",
|
45
|
-
"spec/
|
45
|
+
"spec/audited_change_set/change_set_spec.rb",
|
46
46
|
"spec/spec_helper.rb"
|
47
47
|
]
|
48
48
|
|
@@ -35,7 +35,8 @@ module AuditedChangeSet
|
|
35
35
|
|
36
36
|
attr_reader :name, :old_value, :new_value
|
37
37
|
|
38
|
-
def initialize(name, new_val, old_val=nil)
|
38
|
+
def initialize(change_type, name, new_val, old_val=nil)
|
39
|
+
@change_type = change_type
|
39
40
|
@name = name.to_s
|
40
41
|
@new_value, @old_value = [new_val, old_val].map {|val| transform_value(val) }
|
41
42
|
end
|
@@ -46,11 +47,20 @@ module AuditedChangeSet
|
|
46
47
|
|
47
48
|
def association_class
|
48
49
|
@association_class ||= begin
|
49
|
-
|
50
|
-
|
50
|
+
if reflection && class_name = reflection.options[:class_name]
|
51
|
+
class_name.constantize
|
52
|
+
else
|
53
|
+
name.to_s =~ /(.*)_id$/
|
54
|
+
$1.camelize.constantize
|
55
|
+
end
|
51
56
|
end
|
52
57
|
end
|
53
58
|
|
59
|
+
def reflection
|
60
|
+
change_class = @change_type.constantize
|
61
|
+
@reflection ||= change_class.reflect_on_association(name_without_id.to_sym) if change_class.respond_to?(:reflect_on_association)
|
62
|
+
end
|
63
|
+
|
54
64
|
def get_associated_object(id)
|
55
65
|
hook(:get_associated_object, id) || association_class.find_by_id(id)
|
56
66
|
end
|
@@ -58,6 +68,10 @@ module AuditedChangeSet
|
|
58
68
|
def association_field?
|
59
69
|
name.ends_with? "_id"
|
60
70
|
end
|
71
|
+
|
72
|
+
def name_without_id
|
73
|
+
name.chomp "_id"
|
74
|
+
end
|
61
75
|
end
|
62
76
|
|
63
77
|
class << self
|
@@ -85,7 +99,7 @@ module AuditedChangeSet
|
|
85
99
|
end
|
86
100
|
|
87
101
|
def create_field(name, changes)
|
88
|
-
Field.new(name
|
102
|
+
Field.new(@audit.auditable_type, name, *[changes].flatten.reverse)
|
89
103
|
end
|
90
104
|
|
91
105
|
delegate :id, :to => :@audit
|
data/lib/audited_change_set.rb
CHANGED
@@ -35,7 +35,7 @@ module AuditedChangeSet
|
|
35
35
|
end
|
36
36
|
|
37
37
|
context "change_set for an auditable model" do
|
38
|
-
let(:auditable_model) { stub(
|
38
|
+
let(:auditable_model) { stub(Person, :name => 'irrelevant') }
|
39
39
|
let(:change_set) { ChangeSet.new(auditable_model) }
|
40
40
|
|
41
41
|
describe "#each" do
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
module AuditedChangeSet
|
4
4
|
describe Change do
|
5
5
|
|
6
|
-
let(:audit) { double(Audit) }
|
6
|
+
let(:audit) { double(Audit, :auditable_type => "Person") }
|
7
7
|
|
8
8
|
describe "::for_audits" do
|
9
9
|
let(:audits) {[double(Audit), double(Audit)]}
|
@@ -207,13 +207,13 @@ module AuditedChangeSet
|
|
207
207
|
context "field is an association" do
|
208
208
|
|
209
209
|
before :each do
|
210
|
-
|
211
|
-
|
210
|
+
Person.stub(:find_by_id).and_return(nil)
|
211
|
+
Person.stub(:find_by_id).with("1").and_return(double(Person, :to_s => 'to_s_ified'))
|
212
212
|
end
|
213
213
|
|
214
214
|
it "uses associated object for new value" do
|
215
|
-
changes = { "
|
216
|
-
yielded_fields ={"
|
215
|
+
changes = { "person_id" => "1"}
|
216
|
+
yielded_fields ={"person_id" => ["", "to_s_ified"]}
|
217
217
|
|
218
218
|
audit.stub(:action).and_return("create")
|
219
219
|
audit.stub(:[]).and_return(changes)
|
@@ -221,13 +221,23 @@ module AuditedChangeSet
|
|
221
221
|
end
|
222
222
|
|
223
223
|
it "uses associated object for old value" do
|
224
|
-
changes = { "
|
225
|
-
yielded_fields ={"
|
224
|
+
changes = { "person_id" => ["1", nil]}
|
225
|
+
yielded_fields ={"person_id" => ["to_s_ified", ""]}
|
226
226
|
|
227
227
|
audit.stub(:action).and_return("create")
|
228
228
|
audit.stub(:[]).and_return(changes)
|
229
229
|
Change.new(audit).should yield_these(yielded_fields)
|
230
230
|
end
|
231
|
+
|
232
|
+
it "reflects on association for belongs_to" do
|
233
|
+
changes = { "parent_id" => ["1", nil]}
|
234
|
+
yielded_fields ={"parent_id" => ["to_s_ified", ""]}
|
235
|
+
|
236
|
+
audit.stub(:action).and_return("create")
|
237
|
+
audit.stub(:[]).and_return(changes)
|
238
|
+
|
239
|
+
Change.new(audit).should yield_these(yielded_fields)
|
240
|
+
end
|
231
241
|
end
|
232
242
|
|
233
243
|
context "fields are specified" do
|
@@ -251,19 +261,19 @@ module AuditedChangeSet
|
|
251
261
|
|
252
262
|
it "uses only the relevant fields that are associations" do
|
253
263
|
models = [
|
254
|
-
double(
|
255
|
-
double(
|
264
|
+
double(Person, :to_s => "more revenue"),
|
265
|
+
double(Person, :to_s => "less cost")
|
256
266
|
]
|
257
|
-
|
267
|
+
Person.stub(:find_by_id) do |options|
|
258
268
|
models.shift
|
259
269
|
end
|
260
270
|
|
261
|
-
changes = { "title" => "irrelevant", "
|
262
|
-
yielded_fields ={"
|
271
|
+
changes = { "title" => "irrelevant", "person_id" => ["1", "2"]}
|
272
|
+
yielded_fields ={"person_id" => ["less cost", "more revenue"]}
|
263
273
|
|
264
274
|
audit.stub(:action).and_return("create")
|
265
275
|
audit.stub(:[]).and_return(changes)
|
266
|
-
Change.new(audit, ["
|
276
|
+
Change.new(audit, ["person_id"]).should yield_these(yielded_fields)
|
267
277
|
end
|
268
278
|
end
|
269
279
|
end
|
@@ -280,7 +290,7 @@ module AuditedChangeSet
|
|
280
290
|
yielded_args << block_arg
|
281
291
|
end
|
282
292
|
|
283
|
-
field_class.new("anything", "new", "old")
|
293
|
+
field_class.new("Person", "anything", "new", "old")
|
284
294
|
yielded_args.should == ["new", "old"]
|
285
295
|
end
|
286
296
|
|
@@ -290,7 +300,7 @@ module AuditedChangeSet
|
|
290
300
|
"#{block_arg} modified by callback"
|
291
301
|
end
|
292
302
|
|
293
|
-
field = field_class.new("anything", "new value", "old value")
|
303
|
+
field = field_class.new("Person", "anything", "new value", "old value")
|
294
304
|
|
295
305
|
field.new_value.should == "new value modified by callback"
|
296
306
|
field.old_value.should == "old value modified by callback"
|
@@ -303,7 +313,7 @@ module AuditedChangeSet
|
|
303
313
|
nil
|
304
314
|
end
|
305
315
|
|
306
|
-
field = field_class.new("anything", "new value", "old value")
|
316
|
+
field = field_class.new("Person", "anything", "new value", "old value")
|
307
317
|
|
308
318
|
field.new_value.should == "new value"
|
309
319
|
field.old_value.should == "old value"
|
@@ -319,7 +329,7 @@ module AuditedChangeSet
|
|
319
329
|
yielded_args << block_arg
|
320
330
|
end
|
321
331
|
|
322
|
-
field_class.new("
|
332
|
+
field_class.new("Person", "anything_id", 37, 42)
|
323
333
|
yielded_args.should == [37, 42]
|
324
334
|
end
|
325
335
|
|
@@ -329,7 +339,7 @@ module AuditedChangeSet
|
|
329
339
|
"#{block_arg} returned by callback"
|
330
340
|
end
|
331
341
|
|
332
|
-
field = field_class.new("anything_id", "new value", "old value")
|
342
|
+
field = field_class.new("Person", "anything_id", "new value", "old value")
|
333
343
|
|
334
344
|
field.new_value.should == "new value returned by callback"
|
335
345
|
field.old_value.should == "old value returned by callback"
|
@@ -339,12 +349,12 @@ module AuditedChangeSet
|
|
339
349
|
context "given the callback returns nil" do
|
340
350
|
it "uses the default strategy to find the associated object" do
|
341
351
|
returned_object = Object.new
|
342
|
-
|
352
|
+
Person.stub(:find_by_id).with(37) { returned_object }
|
343
353
|
field_class::hook(:get_associated_object) do |block_arg|
|
344
354
|
nil
|
345
355
|
end
|
346
356
|
|
347
|
-
field = field_class.new("
|
357
|
+
field = field_class.new("Person", "person_id", 37)
|
348
358
|
field.new_value.should == returned_object.to_s
|
349
359
|
end
|
350
360
|
end
|
data/spec/db/schema.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -11,5 +11,6 @@ ActiveRecord::Base.establish_connection(
|
|
11
11
|
ActiveRecord::Migration.verbose = false
|
12
12
|
load(File.dirname(__FILE__) + "/db/schema.rb")
|
13
13
|
|
14
|
-
class
|
15
|
-
|
14
|
+
class Person < ActiveRecord::Base
|
15
|
+
belongs_to :parent, :class_name => name, :foreign_key => "parent_id"
|
16
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- David Chelimsky
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-05-
|
20
|
+
date: 2010-05-19 00:00:00 -05:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -121,7 +121,7 @@ signing_key:
|
|
121
121
|
specification_version: 3
|
122
122
|
summary: change_set for acts_as_audited
|
123
123
|
test_files:
|
124
|
-
- spec/audited_change_set/change_set_spec.rb
|
125
|
-
- spec/audited_change_set/change_spec.rb
|
126
124
|
- spec/db/schema.rb
|
125
|
+
- spec/audited_change_set/change_spec.rb
|
126
|
+
- spec/audited_change_set/change_set_spec.rb
|
127
127
|
- spec/spec_helper.rb
|