auditing 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -18,5 +18,7 @@ coverage
18
18
  rdoc
19
19
  pkg
20
20
 
21
+ *.gem
22
+
21
23
  ## PROJECT::SPECIFIC
22
24
  test.sqlite3
data/Gemfile.lock CHANGED
@@ -1,22 +1,23 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- auditing (1.2.2)
4
+ auditing (1.3.0)
5
5
  activerecord (~> 3.0.0)
6
+ activesupport (~> 3.0.0)
6
7
 
7
8
  GEM
8
9
  remote: http://rubygems.org/
9
10
  specs:
10
- activemodel (3.0.5)
11
- activesupport (= 3.0.5)
11
+ activemodel (3.0.6)
12
+ activesupport (= 3.0.6)
12
13
  builder (~> 2.1.2)
13
- i18n (~> 0.4)
14
- activerecord (3.0.5)
15
- activemodel (= 3.0.5)
16
- activesupport (= 3.0.5)
14
+ i18n (~> 0.5.0)
15
+ activerecord (3.0.6)
16
+ activemodel (= 3.0.6)
17
+ activesupport (= 3.0.6)
17
18
  arel (~> 2.0.2)
18
19
  tzinfo (~> 0.3.23)
19
- activesupport (3.0.5)
20
+ activesupport (3.0.6)
20
21
  arel (2.0.9)
21
22
  builder (2.1.2)
22
23
  diff-lcs (1.1.2)
@@ -33,7 +34,8 @@ GEM
33
34
  sqlite3 (1.3.3)
34
35
  sqlite3-ruby (1.3.3)
35
36
  sqlite3 (>= 1.3.3)
36
- tzinfo (0.3.25)
37
+ timecop (0.3.5)
38
+ tzinfo (0.3.26)
37
39
 
38
40
  PLATFORMS
39
41
  ruby
@@ -43,3 +45,4 @@ DEPENDENCIES
43
45
  rake (~> 0.8.7)
44
46
  rspec (~> 2.4.0)
45
47
  sqlite3-ruby
48
+ timecop
data/README.markdown CHANGED
@@ -26,7 +26,7 @@ If you want to track the user, uncomment the t.integer :user_id above. See the
26
26
 
27
27
  ## Upgrading to 1.3.0
28
28
 
29
- New installs will not need to do this. Anyone that is using 1.2.2 and belong should
29
+ New installs will not need to do this. Anyone that is using 1.2.X and below should upgrade
30
30
 
31
31
  gem update auditing
32
32
  # ... updates happen
data/auditing.gemspec CHANGED
@@ -15,8 +15,10 @@ Gem::Specification.new do |s|
15
15
  s.add_development_dependency(%q<rspec>, ["~> 2.4.0"])
16
16
  s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
17
17
  s.add_development_dependency "sqlite3-ruby"
18
+ s.add_development_dependency "timecop"
18
19
 
19
20
  s.add_dependency('activerecord', '~> 3.0.0')
21
+ s.add_dependency('activesupport', '~> 3.0.0')
20
22
 
21
23
  s.rubyforge_project = "auditing"
22
24
 
@@ -7,12 +7,12 @@ module Auditing
7
7
 
8
8
  def old_value
9
9
  return nil unless read_attribute(:old_value)
10
- Marshal.load(read_attribute(:old_value))
10
+ Marshal.load( ActiveSupport::Base64.decode64( read_attribute(:old_value) ) )
11
11
  end
12
12
 
13
13
  def new_value
14
14
  return nil unless read_attribute(:new_value)
15
- Marshal.load(read_attribute(:new_value))
15
+ Marshal.load( ActiveSupport::Base64.decode64( read_attribute(:new_value) ) )
16
16
  end
17
17
 
18
18
  def rollback
data/lib/auditing/base.rb CHANGED
@@ -28,18 +28,26 @@ module Auditing
28
28
  end
29
29
 
30
30
  module InstanceMethods
31
+ # http://stackoverflow.com/questions/1906421/problem-saving-rails-marshal-in-sqlite3-db
32
+
33
+ def dump_data(value)
34
+ ActiveSupport::Base64.encode64(Marshal.dump(value))
35
+ end
36
+
31
37
  def log_creation
32
38
  add_audit(:action => 'created', :undoable => false)
33
39
  end
34
-
40
+
35
41
  def log_update
36
42
  if changed?
37
43
  changes.each.select {|k,v| auditing_fields.include?(k)}.each do |field, change|
38
44
  next if change[0].to_s == change[1].to_s
45
+
39
46
  add_audit(:action => 'updated',
40
47
  :field_name => field,
41
- :old_value => Marshal.dump(change[0]),
42
- :new_value => Marshal.dump(change[1]) )
48
+ :old_value => dump_data(change[0]),
49
+ :new_value => dump_data(change[1])
50
+ )
43
51
  end
44
52
  end
45
53
  end
@@ -48,16 +56,16 @@ module Auditing
48
56
  add_audit(:action => 'added',
49
57
  :association => child_object,
50
58
  :field_name => hash[:field],
51
- :old_value => Marshal.dump(nil),
52
- :new_value => Marshal.dump(hash[:value].to_s) )
59
+ :old_value => dump_data(nil),
60
+ :new_value => dump_data(hash[:value]) )
53
61
  end
54
62
 
55
63
  def log_association_update(child_object, hash)
56
64
  add_audit(:action => 'updated',
57
65
  :association => child_object,
58
66
  :field_name => hash[:field],
59
- :old_value => Marshal.dump(hash[:old_value].to_s),
60
- :new_value => Marshal.dump(hash[:new_value].to_s) )
67
+ :old_value => ( dump_data(hash[:old_value]) if hash[:old_value] ) || dump_data(nil),
68
+ :new_value => dump_data(hash[:new_value]) )
61
69
  end
62
70
 
63
71
  def log_association_destroy(item)
@@ -1,3 +1,3 @@
1
1
  module Auditing
2
- VERSION = "1.3.0"
2
+ VERSION = "1.3.1"
3
3
  end
@@ -204,48 +204,4 @@ describe "Base" do
204
204
  end
205
205
  end # belongs_to relationships
206
206
 
207
- describe "text fields" do
208
- before do
209
- class Special < ActiveRecord::Base
210
- audit_enabled
211
- end
212
- end
213
-
214
- it "should properly work on creation" do
215
- long_string = 'a'
216
- 2000.times do
217
- long_string << 'b'
218
- end
219
- special = Special.create(:text_field => long_string)
220
- special.audits.should_not be_nil
221
- end
222
-
223
- describe "updating a text field" do
224
- before do
225
- @long_string = 'a'
226
- @new_long_string = 'c'
227
- 2000.times do
228
- @long_string << 'b'
229
- @new_long_string << 'd'
230
- end
231
- @special = Special.create(:text_field => @long_string)
232
- end
233
-
234
- it "should create an audit log when we update a text field" do
235
- lambda {@special.update_attributes(:text_field => @new_long_string)
236
- }.should change { Audit.count }.by(1)
237
- end
238
-
239
- it "should allow access to the old and new values" do
240
- @special.update_attributes(:text_field => @new_long_string)
241
- audit = @special.audits.first
242
- audit.old_value.should eql(@long_string)
243
- audit.new_value.should eql(@new_long_string)
244
- end
245
-
246
- end
247
-
248
-
249
- end
250
-
251
207
  end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+ require 'timecop'
3
+
4
+ describe "formats" do
5
+
6
+ describe "text fields" do
7
+ before do
8
+ class Special < ActiveRecord::Base
9
+ audit_enabled
10
+ end
11
+ end
12
+
13
+ it "should properly work on creation" do
14
+ long_string = 'a'
15
+ 2000.times do
16
+ long_string << 'b'
17
+ end
18
+ special = Special.create(:text_field => long_string)
19
+ special.audits.should_not be_nil
20
+ end
21
+
22
+ describe "updating a text field" do
23
+ before do
24
+ @long_string = 'a'
25
+ @new_long_string = 'c'
26
+ 2000.times do
27
+ @long_string << 'b'
28
+ @new_long_string << 'd'
29
+ end
30
+ @special = Special.create(:text_field => @long_string)
31
+ end
32
+
33
+ it "should create an audit log when we update a text field" do
34
+ lambda {@special.update_attributes(:text_field => @new_long_string)
35
+ }.should change { Audit.count }.by(1)
36
+ end
37
+
38
+ it "should allow access to the old and new values" do
39
+ @special.update_attributes(:text_field => @new_long_string)
40
+ audit = @special.audits.first
41
+ audit.old_value.should eql(@long_string)
42
+ audit.new_value.should eql(@new_long_string)
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "date_fields" do
48
+ before do
49
+ class Special < ActiveRecord::Base
50
+ audit_enabled
51
+ end
52
+ end
53
+
54
+ it "should properly work on creation" do
55
+ special = Special.create(:date_field => Date.today)
56
+ special.audits.should_not be_nil
57
+ end
58
+
59
+ it "can update a blank date field" do
60
+ special = Special.create
61
+ special.date_field = Date.today
62
+ lambda { special.save }.should change { Audit.count }.by(1)
63
+ end
64
+
65
+ describe "updating a date field" do
66
+ before do
67
+ new_time = Time.local(2008, 9, 1, 12, 0, 0)
68
+ Timecop.freeze(new_time) # 2008-09-01
69
+ @special = Special.create(:date_field => Date.today)
70
+ end
71
+
72
+ it "should create an audit log when we update a text field" do
73
+ lambda {@special.update_attributes(:date_field => Date.today + 1)
74
+ }.should change { Audit.count }.by(1)
75
+ Timecop.return
76
+ end
77
+
78
+ it "should allow access to the old and new values" do
79
+ @special.update_attributes(:date_field => Date.today + 1)
80
+ audit = @special.audits.first
81
+ audit.old_value.should eql(Date.today)
82
+ audit.new_value.should eql(Date.today + 1)
83
+
84
+ Timecop.return
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
91
+ end
data/spec/schema.rb CHANGED
@@ -63,6 +63,7 @@ ActiveRecord::Schema.define(:version => 0) do
63
63
 
64
64
  create_table :specials do |t|
65
65
  t.text :text_field
66
+ t.date :date_field
66
67
  end
67
68
 
68
69
  end
data/spec/spec_helper.rb CHANGED
@@ -22,5 +22,5 @@ class Audit < ActiveRecord::Base
22
22
  belongs_to :association, :polymorphic => true
23
23
  end
24
24
 
25
- class User < ActiveRecord::Base
26
- end
25
+ # class User < ActiveRecord::Base
26
+ # end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: auditing
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.3.0
5
+ version: 1.3.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Brad Cantin
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-14 00:00:00 -04:00
13
+ date: 2011-04-15 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -47,16 +47,38 @@ dependencies:
47
47
  type: :development
48
48
  version_requirements: *id003
49
49
  - !ruby/object:Gem::Dependency
50
- name: activerecord
50
+ name: timecop
51
51
  prerelease: false
52
52
  requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: activerecord
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
53
64
  none: false
54
65
  requirements:
55
66
  - - ~>
56
67
  - !ruby/object:Gem::Version
57
68
  version: 3.0.0
58
69
  type: :runtime
59
- version_requirements: *id004
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: activesupport
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 3.0.0
80
+ type: :runtime
81
+ version_requirements: *id006
60
82
  description: acts_as_versioned is good. This allows an attribute level rollback instead
61
83
  email:
62
84
  - brad.cantin@gmail.com
@@ -96,6 +118,7 @@ files:
96
118
  - spec/auditing/audit_relationship_spec.rb
97
119
  - spec/auditing/auditor_spec.rb
98
120
  - spec/auditing/base_spec.rb
121
+ - spec/auditing/formats_spec.rb
99
122
  - spec/auditing/with_users_spec.rb
100
123
  - spec/schema.rb
101
124
  - spec/spec_helper.rb
@@ -131,6 +154,7 @@ test_files:
131
154
  - spec/auditing/audit_relationship_spec.rb
132
155
  - spec/auditing/auditor_spec.rb
133
156
  - spec/auditing/base_spec.rb
157
+ - spec/auditing/formats_spec.rb
134
158
  - spec/auditing/with_users_spec.rb
135
159
  - spec/schema.rb
136
160
  - spec/spec_helper.rb