auditing 1.2.2 → 1.3.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.
- data/Gemfile.lock +22 -1
- data/{README.rdoc → README.markdown} +86 -91
- data/Rakefile +34 -2
- data/auditing.gemspec +5 -1
- data/lib/auditing/base.rb +8 -1
- data/lib/auditing/version.rb +1 -1
- data/lib/generators/auditing/templates/migration.rb +2 -2
- data/lib/generators/auditing/templates/update_migration.rb +11 -0
- data/lib/generators/auditing/upgrade_generator.rb +27 -0
- data/spec/auditing/base_spec.rb +44 -0
- data/spec/schema.rb +17 -13
- metadata +39 -4
data/Gemfile.lock
CHANGED
@@ -2,11 +2,26 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
auditing (1.2.2)
|
5
|
+
activerecord (~> 3.0.0)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: http://rubygems.org/
|
8
9
|
specs:
|
10
|
+
activemodel (3.0.5)
|
11
|
+
activesupport (= 3.0.5)
|
12
|
+
builder (~> 2.1.2)
|
13
|
+
i18n (~> 0.4)
|
14
|
+
activerecord (3.0.5)
|
15
|
+
activemodel (= 3.0.5)
|
16
|
+
activesupport (= 3.0.5)
|
17
|
+
arel (~> 2.0.2)
|
18
|
+
tzinfo (~> 0.3.23)
|
19
|
+
activesupport (3.0.5)
|
20
|
+
arel (2.0.9)
|
21
|
+
builder (2.1.2)
|
9
22
|
diff-lcs (1.1.2)
|
23
|
+
i18n (0.5.0)
|
24
|
+
rake (0.8.7)
|
10
25
|
rspec (2.4.0)
|
11
26
|
rspec-core (~> 2.4.0)
|
12
27
|
rspec-expectations (~> 2.4.0)
|
@@ -15,10 +30,16 @@ GEM
|
|
15
30
|
rspec-expectations (2.4.0)
|
16
31
|
diff-lcs (~> 1.1.2)
|
17
32
|
rspec-mocks (2.4.0)
|
33
|
+
sqlite3 (1.3.3)
|
34
|
+
sqlite3-ruby (1.3.3)
|
35
|
+
sqlite3 (>= 1.3.3)
|
36
|
+
tzinfo (0.3.25)
|
18
37
|
|
19
38
|
PLATFORMS
|
20
39
|
ruby
|
21
40
|
|
22
41
|
DEPENDENCIES
|
23
42
|
auditing!
|
24
|
-
|
43
|
+
rake (~> 0.8.7)
|
44
|
+
rspec (~> 2.4.0)
|
45
|
+
sqlite3-ruby
|
@@ -1,88 +1,84 @@
|
|
1
|
-
|
1
|
+
# auditing
|
2
2
|
|
3
3
|
Auditing is a simple way to track and rollback changes to a record.
|
4
|
-
== Sample Project
|
5
4
|
|
6
|
-
http://
|
5
|
+
[](http://travis-ci.org/bcantin/auditing)
|
6
|
+
|
7
|
+
## Sample Project
|
8
|
+
|
9
|
+
https://github.com/bcantin/auditing_project
|
7
10
|
|
8
|
-
|
11
|
+
## Installation
|
9
12
|
|
10
|
-
|
13
|
+
gem install auditing
|
14
|
+
|
15
|
+
There is a handy installer in the gem now. To see what it will do
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
rails g model audit
|
15
|
-
|
16
|
-
Here is a migration for your audit model following migration
|
17
|
-
|
18
|
-
create_table :audits, :force => true do |t|
|
19
|
-
t.string :action
|
20
|
-
t.string :auditable_type
|
21
|
-
t.integer :auditable_id
|
22
|
-
t.string :association_type
|
23
|
-
t.integer :association_id
|
24
|
-
t.string :field_name
|
25
|
-
t.string :old_value
|
26
|
-
t.string :new_value
|
27
|
-
# t.integer :user_id
|
28
|
-
t.boolean :undoable, :default => true
|
29
|
-
t.timestamps
|
30
|
-
end
|
17
|
+
rails g auditing:install --help
|
31
18
|
|
19
|
+
and, of course, to use it
|
20
|
+
|
21
|
+
rails g auditing:install
|
22
|
+
rake db:migrate
|
23
|
+
|
32
24
|
If you want to track the user, uncomment the t.integer :user_id above. See the Tracking Users section below.
|
33
25
|
|
34
|
-
Update your Audit class
|
35
26
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
27
|
+
## Upgrading to 1.3.0
|
28
|
+
|
29
|
+
New installs will not need to do this. Anyone that is using 1.2.2 and belong should
|
30
|
+
|
31
|
+
gem update auditing
|
32
|
+
# ... updates happen
|
33
|
+
rails g auditing:upgrade
|
34
|
+
rake db:migrate
|
35
|
+
|
36
|
+
This will create a new migration to update the :old_value and :new_value attribute from STRING to TEXT
|
37
|
+
|
38
|
+
|
39
|
+
## Basic Usage
|
44
40
|
|
45
41
|
To add auditing to all attributes on a model, simply add auditing to the model.
|
46
42
|
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
class School < ActiveRecord::Base
|
44
|
+
audit_enabled
|
45
|
+
end
|
50
46
|
|
51
47
|
If you want more control over which attributes are audited, you can define them
|
52
48
|
by supplying a fields hash
|
53
49
|
|
54
|
-
|
55
|
-
|
56
|
-
|
50
|
+
class School < ActiveRecord::Base
|
51
|
+
audit_enabled :fields => [:name, :established_on]
|
52
|
+
end
|
57
53
|
|
58
54
|
Auditing will not track "id", "created_at", or "updated_at" by default
|
59
55
|
|
60
|
-
|
56
|
+
## belongs_to relationships
|
61
57
|
|
62
58
|
Auditing a belongs_to relationship works by keeping track of the foreign_id attribute. You do
|
63
59
|
not need to add anything to the foreign model.
|
64
60
|
|
65
|
-
|
61
|
+
## has_many relationships
|
66
62
|
|
67
63
|
You may have the need to keep track of a has_many relationship. To accomplish this, we have
|
68
64
|
to enable a similar type of auditing on the other model(s)
|
69
65
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
66
|
+
class Company < ActiveRecord::Base
|
67
|
+
has_many :phone_numbers
|
68
|
+
audit_enabled
|
69
|
+
end
|
70
|
+
class PhoneNumber < ActiveRecord::Base
|
71
|
+
belongs_to :company
|
72
|
+
audit_relationship_enabled
|
73
|
+
end
|
78
74
|
|
79
75
|
As above, you can supply a :fields hash of which attributes will be logged.
|
80
76
|
If your relationship is polymorphic, you can supply an array of classes
|
81
77
|
that you only want to log.
|
82
78
|
|
83
|
-
|
79
|
+
audit_relationship_enabled :only => [Company, Person]
|
84
80
|
|
85
|
-
|
81
|
+
## Tracking Users
|
86
82
|
|
87
83
|
NOTE: there is probably a more elegant solution to this, if you know of
|
88
84
|
one, please drop me a line.
|
@@ -94,68 +90,67 @@ To track which logged in users have made the changes, you will need to have a
|
|
94
90
|
user_id column in your audits table. If you did not add it when you created
|
95
91
|
the audits table, you can add it in another migration
|
96
92
|
|
97
|
-
|
93
|
+
add_column :audits, :user_id, :integer
|
98
94
|
|
99
95
|
You will need to add the relationship to the Audit class as well
|
100
96
|
|
101
|
-
|
102
|
-
|
103
|
-
|
97
|
+
class Audit < ActiveRecord::Base
|
98
|
+
belongs_to :user
|
99
|
+
end
|
104
100
|
|
105
101
|
If you want to see all the audits for a particular user, you can
|
106
102
|
add the has_many relationship to the User model as well
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
103
|
+
|
104
|
+
class User < ActiveRecord::Base
|
105
|
+
has_many :audits
|
106
|
+
end
|
111
107
|
|
112
108
|
Your user class should respond to a class method called current_user
|
113
109
|
and current_user= (some authentication systems do this, others do not).
|
114
110
|
|
115
111
|
Here is a suggested method
|
116
112
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
113
|
+
class User < ActiveRecord::Base
|
114
|
+
|
115
|
+
def self.current_user=(current_user)
|
116
|
+
@current_user = current_user
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.current_user
|
120
|
+
@current_user
|
121
|
+
end
|
122
|
+
|
125
123
|
end
|
126
|
-
|
127
|
-
end
|
128
124
|
|
129
125
|
Your ApplicationController should also set the current user so the auditing gem can
|
130
126
|
get the current user properly
|
131
127
|
|
132
|
-
|
128
|
+
class ApplicationController < ActionController::Base
|
129
|
+
|
130
|
+
before_filter :set_current_user
|
131
|
+
after_filter :unset_current_user
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
def set_current_user
|
136
|
+
User.current_user = current_user
|
137
|
+
end
|
138
|
+
|
139
|
+
def unset_current_user
|
140
|
+
User.current_user = nil
|
141
|
+
end
|
133
142
|
|
134
|
-
before_filter :set_current_user
|
135
|
-
after_filter :unset_current_user
|
136
|
-
|
137
|
-
private
|
138
|
-
|
139
|
-
def set_current_user
|
140
|
-
User.current_user = current_user
|
141
|
-
end
|
142
|
-
|
143
|
-
def unset_current_user
|
144
|
-
User.current_user = nil
|
145
143
|
end
|
146
|
-
|
147
|
-
end
|
148
144
|
|
149
|
-
|
145
|
+
## Testing
|
150
146
|
|
151
147
|
To run the tests, first clone this repo, then
|
152
148
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
149
|
+
cd auditing
|
150
|
+
bundle
|
151
|
+
rake
|
157
152
|
|
158
|
-
|
153
|
+
## Note on Patches/Pull Requests
|
159
154
|
|
160
155
|
* Fork the project.
|
161
156
|
* Make your feature addition or bug fix.
|
@@ -166,6 +161,6 @@ To run the tests, first clone this repo, then
|
|
166
161
|
a commit by itself I can ignore when I pull)
|
167
162
|
* Send me a pull request. Bonus points for topic branches.
|
168
163
|
|
169
|
-
|
164
|
+
## Copyright
|
170
165
|
|
171
|
-
Copyright (c)
|
166
|
+
Copyright (c) 2011 Brad Cantin. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,2 +1,34 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
Bundler::GemHelper.install_tasks
|
1
|
+
# require 'bundler'
|
2
|
+
# Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'bundler/setup'
|
6
|
+
Bundler::GemHelper.install_tasks
|
7
|
+
rescue LoadError
|
8
|
+
puts 'although not required, bundler is recommened for running the tests'
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
task :default => [:test]
|
13
|
+
|
14
|
+
task :test do
|
15
|
+
sh "bundle exec rspec spec"
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
# require 'rake'
|
20
|
+
|
21
|
+
# begin
|
22
|
+
# require 'bundler/setup'
|
23
|
+
# Bundler::GemHelper.install_tasks
|
24
|
+
# rescue LoadError
|
25
|
+
# puts 'although not required, bundler is recommened for running the tests'
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# task :default => :spec
|
29
|
+
#
|
30
|
+
# require 'rspec/core/rake_task'
|
31
|
+
# RSpec::Core::RakeTask.new do |t|
|
32
|
+
# t.rspec_opts = ["--color", '--format doc']
|
33
|
+
# end
|
34
|
+
#
|
data/auditing.gemspec
CHANGED
@@ -12,7 +12,11 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.description = %q{acts_as_versioned is good. This allows an attribute level rollback instead}
|
13
13
|
s.summary = %q{A gem to keep track of audit hisory of a record}
|
14
14
|
|
15
|
-
s.add_development_dependency "
|
15
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.4.0"])
|
16
|
+
s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
|
17
|
+
s.add_development_dependency "sqlite3-ruby"
|
18
|
+
|
19
|
+
s.add_dependency('activerecord', '~> 3.0.0')
|
16
20
|
|
17
21
|
s.rubyforge_project = "auditing"
|
18
22
|
|
data/lib/auditing/base.rb
CHANGED
@@ -68,9 +68,16 @@ module Auditing
|
|
68
68
|
add_audit(:action => 'removed', :association => item, :undoable => false)
|
69
69
|
end
|
70
70
|
|
71
|
+
def class_exists?(class_name)
|
72
|
+
klass = Module.const_get(class_name)
|
73
|
+
return klass.is_a?(Class)
|
74
|
+
rescue NameError
|
75
|
+
return false
|
76
|
+
end
|
77
|
+
|
71
78
|
private
|
72
79
|
def add_audit(hash={})
|
73
|
-
if User.respond_to?(:current_user) && !User.current_user.blank?
|
80
|
+
if class_exists?('User') && User.respond_to?(:current_user) && !User.current_user.blank?
|
74
81
|
hash[:user_id] = User.current_user.id
|
75
82
|
end
|
76
83
|
Audit.create!({:auditable => self}.merge(hash))
|
data/lib/auditing/version.rb
CHANGED
@@ -7,8 +7,8 @@ class CreateAudits < ActiveRecord::Migration
|
|
7
7
|
t.string :association_type
|
8
8
|
t.integer :association_id
|
9
9
|
t.string :field_name
|
10
|
-
t.
|
11
|
-
t.
|
10
|
+
t.text :old_value
|
11
|
+
t.text :new_value
|
12
12
|
# t.integer :user_id
|
13
13
|
t.boolean :undoable, :default => true
|
14
14
|
t.timestamps
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class UpdateAudits < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
change_column :audits, :old_value, :text
|
4
|
+
change_column :audits, :new_value, :text
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.down
|
8
|
+
change_column :audits, :old_value, :string
|
9
|
+
change_column :audits, :new_value, :string
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
module Auditing
|
4
|
+
module Generators
|
5
|
+
class UpgradeGenerator < Rails::Generators::Base
|
6
|
+
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
|
9
|
+
source_root File.expand_path("../templates", __FILE__)
|
10
|
+
|
11
|
+
def create_migration
|
12
|
+
migration_template 'update_migration.rb', "db/migrate/update_audits.rb"
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def self.next_migration_number(dirname) #:nodoc:
|
18
|
+
if ActiveRecord::Base.timestamped_migrations
|
19
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
20
|
+
else
|
21
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/auditing/base_spec.rb
CHANGED
@@ -204,4 +204,48 @@ 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
|
+
|
207
251
|
end
|
data/spec/schema.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
ActiveRecord::Schema.define(:version => 0) do
|
2
|
-
|
2
|
+
|
3
3
|
create_table :audits do |t|
|
4
4
|
t.string :action
|
5
5
|
t.string :auditable_type
|
@@ -7,35 +7,35 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
7
7
|
t.string :association_type
|
8
8
|
t.integer :association_id
|
9
9
|
t.string :field_name
|
10
|
-
t.
|
11
|
-
t.
|
10
|
+
t.text :old_value
|
11
|
+
t.text :new_value
|
12
12
|
t.integer :user_id
|
13
13
|
t.boolean :undoable, :default => true
|
14
14
|
t.timestamps
|
15
|
-
end
|
16
|
-
|
15
|
+
end
|
16
|
+
|
17
17
|
create_table :schools do |t|
|
18
18
|
t.string :name
|
19
19
|
t.datetime :established_on
|
20
20
|
t.timestamps
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
create_table :cars do |t|
|
24
24
|
t.string :name
|
25
25
|
t.integer :auto_maker_id
|
26
26
|
t.timestamps
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
create_table :auto_makers do |t|
|
30
30
|
t.string :name
|
31
31
|
t.timestamps
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
create_table :companies do |t|
|
35
35
|
t.string :name
|
36
36
|
t.timestamps
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
create_table :phone_numbers do |t|
|
40
40
|
t.string :number
|
41
41
|
t.string :extension
|
@@ -43,22 +43,26 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
43
43
|
t.integer :phoneable_id
|
44
44
|
t.timestamps
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
create_table :people do |t|
|
48
48
|
t.string :first_name
|
49
49
|
t.string :last_name
|
50
50
|
t.timestamps
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
create_table :employments do |t|
|
54
54
|
t.integer :person_id
|
55
55
|
t.integer :company_id
|
56
56
|
t.string :start_date
|
57
57
|
t.timestamps
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
create_table :users do |t|
|
61
61
|
t.string :email
|
62
62
|
end
|
63
63
|
|
64
|
-
|
64
|
+
create_table :specials do |t|
|
65
|
+
t.text :text_field
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: auditing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.
|
5
|
+
version: 1.3.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Brad Cantin
|
@@ -10,20 +10,53 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-04-14 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rspec
|
18
18
|
prerelease: false
|
19
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 2.4.0
|
25
|
+
type: :development
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 0.8.7
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: sqlite3-ruby
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
20
42
|
none: false
|
21
43
|
requirements:
|
22
44
|
- - ">="
|
23
45
|
- !ruby/object:Gem::Version
|
24
46
|
version: "0"
|
25
47
|
type: :development
|
26
|
-
version_requirements: *
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: activerecord
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 3.0.0
|
58
|
+
type: :runtime
|
59
|
+
version_requirements: *id004
|
27
60
|
description: acts_as_versioned is good. This allows an attribute level rollback instead
|
28
61
|
email:
|
29
62
|
- brad.cantin@gmail.com
|
@@ -42,7 +75,7 @@ files:
|
|
42
75
|
- Gemfile
|
43
76
|
- Gemfile.lock
|
44
77
|
- LICENSE
|
45
|
-
- README.
|
78
|
+
- README.markdown
|
46
79
|
- Rakefile
|
47
80
|
- auditing.gemspec
|
48
81
|
- lib/auditing.rb
|
@@ -58,6 +91,8 @@ files:
|
|
58
91
|
- lib/generators/auditing/templates/index.html.erb
|
59
92
|
- lib/generators/auditing/templates/initializer.rb
|
60
93
|
- lib/generators/auditing/templates/migration.rb
|
94
|
+
- lib/generators/auditing/templates/update_migration.rb
|
95
|
+
- lib/generators/auditing/upgrade_generator.rb
|
61
96
|
- spec/auditing/audit_relationship_spec.rb
|
62
97
|
- spec/auditing/auditor_spec.rb
|
63
98
|
- spec/auditing/base_spec.rb
|