audited 4.2.1 → 4.4.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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +20 -9
  3. data/Appraisals +11 -6
  4. data/CHANGELOG.md +190 -0
  5. data/Gemfile +1 -13
  6. data/README.md +65 -34
  7. data/Rakefile +3 -18
  8. data/gemfiles/rails40.gemfile +1 -5
  9. data/gemfiles/rails41.gemfile +1 -5
  10. data/gemfiles/rails42.gemfile +1 -5
  11. data/gemfiles/rails50.gemfile +7 -0
  12. data/gemfiles/rails51.gemfile +7 -0
  13. data/lib/audited/audit.rb +126 -56
  14. data/lib/audited/auditor.rb +76 -44
  15. data/lib/audited/rspec_matchers.rb +5 -1
  16. data/lib/audited/sweeper.rb +24 -46
  17. data/lib/audited/version.rb +1 -1
  18. data/lib/audited-rspec.rb +4 -0
  19. data/lib/audited.rb +16 -2
  20. data/lib/generators/audited/install_generator.rb +24 -0
  21. data/lib/generators/audited/migration.rb +15 -0
  22. data/lib/generators/audited/migration_helper.rb +9 -0
  23. data/lib/generators/audited/templates/add_association_to_audits.rb +11 -0
  24. data/lib/generators/audited/templates/add_comment_to_audits.rb +9 -0
  25. data/lib/generators/audited/templates/add_remote_address_to_audits.rb +10 -0
  26. data/lib/generators/audited/templates/add_request_uuid_to_audits.rb +10 -0
  27. data/lib/generators/audited/templates/install.rb +30 -0
  28. data/lib/generators/audited/templates/rename_association_to_associated.rb +23 -0
  29. data/lib/generators/audited/templates/rename_changes_to_audited_changes.rb +9 -0
  30. data/lib/generators/audited/templates/rename_parent_to_association.rb +11 -0
  31. data/lib/generators/audited/upgrade_generator.rb +59 -0
  32. data/spec/audited/audit_spec.rb +246 -0
  33. data/spec/audited/auditor_spec.rb +648 -0
  34. data/spec/audited/sweeper_spec.rb +108 -0
  35. data/spec/audited_spec_helpers.rb +6 -22
  36. data/spec/rails_app/config/environments/test.rb +7 -4
  37. data/spec/rails_app/config/initializers/secret_token.rb +1 -1
  38. data/spec/rails_app/config/routes.rb +1 -4
  39. data/spec/spec_helper.rb +7 -9
  40. data/spec/support/active_record/models.rb +24 -13
  41. data/spec/support/active_record/postgres/1_change_audited_changes_type_to_json.rb +12 -0
  42. data/spec/support/active_record/postgres/2_change_audited_changes_type_to_jsonb.rb +12 -0
  43. data/spec/support/active_record/schema.rb +37 -12
  44. data/test/db/version_1.rb +4 -4
  45. data/test/db/version_2.rb +4 -4
  46. data/test/db/version_3.rb +4 -4
  47. data/test/db/version_4.rb +4 -4
  48. data/test/db/version_5.rb +2 -2
  49. data/test/db/version_6.rb +2 -2
  50. data/test/install_generator_test.rb +31 -3
  51. data/test/upgrade_generator_test.rb +25 -10
  52. metadata +69 -43
  53. data/CHANGELOG +0 -34
  54. data/lib/audited/active_record/version.rb +0 -5
  55. data/lib/audited/mongo_mapper/version.rb +0 -5
  56. data/spec/support/mongo_mapper/connection.rb +0 -4
  57. data/spec/support/mongo_mapper/models.rb +0 -214
@@ -1,12 +1,16 @@
1
1
  require 'test_helper'
2
2
 
3
- require 'audited/adapters/active_record'
4
3
  require 'generators/audited/upgrade_generator'
5
4
 
6
5
  class UpgradeGeneratorTest < Rails::Generators::TestCase
7
6
  destination File.expand_path('../../tmp', __FILE__)
8
7
  setup :prepare_destination
9
8
  tests Audited::Generators::UpgradeGenerator
9
+ if Rails::VERSION::MAJOR == 4
10
+ self.use_transactional_fixtures = false
11
+ else
12
+ self.use_transactional_tests = false
13
+ end
10
14
 
11
15
  test "should add 'comment' to audits table" do
12
16
  load_schema 1
@@ -14,7 +18,7 @@ class UpgradeGeneratorTest < Rails::Generators::TestCase
14
18
  run_generator %w(upgrade)
15
19
 
16
20
  assert_migration "db/migrate/add_comment_to_audits.rb" do |content|
17
- assert_match /add_column :audits, :comment, :string/, content
21
+ assert_match(/add_column :audits, :comment, :string/, content)
18
22
  end
19
23
 
20
24
  assert_migration "db/migrate/rename_changes_to_audited_changes.rb"
@@ -28,7 +32,7 @@ class UpgradeGeneratorTest < Rails::Generators::TestCase
28
32
  assert_no_migration "db/migrate/add_comment_to_audits.rb"
29
33
 
30
34
  assert_migration "db/migrate/rename_changes_to_audited_changes.rb" do |content|
31
- assert_match /rename_column :audits, :changes, :audited_changes/, content
35
+ assert_match(/rename_column :audits, :changes, :audited_changes/, content)
32
36
  end
33
37
  end
34
38
 
@@ -38,7 +42,7 @@ class UpgradeGeneratorTest < Rails::Generators::TestCase
38
42
  run_generator %w(upgrade)
39
43
 
40
44
  assert_migration "db/migrate/add_remote_address_to_audits.rb" do |content|
41
- assert_match /add_column :audits, :remote_address, :string/, content
45
+ assert_match(/add_column :audits, :remote_address, :string/, content)
42
46
  end
43
47
  end
44
48
 
@@ -48,8 +52,8 @@ class UpgradeGeneratorTest < Rails::Generators::TestCase
48
52
  run_generator %w(upgrade)
49
53
 
50
54
  assert_migration "db/migrate/add_association_to_audits.rb" do |content|
51
- assert_match /add_column :audits, :association_id, :integer/, content
52
- assert_match /add_column :audits, :association_type, :string/, content
55
+ assert_match(/add_column :audits, :association_id, :integer/, content)
56
+ assert_match(/add_column :audits, :association_type, :string/, content)
53
57
  end
54
58
  end
55
59
 
@@ -59,8 +63,8 @@ class UpgradeGeneratorTest < Rails::Generators::TestCase
59
63
  run_generator %w(upgrade)
60
64
 
61
65
  assert_migration "db/migrate/rename_association_to_associated.rb" do |content|
62
- assert_match /rename_column :audits, :association_id, :associated_id/, content
63
- assert_match /rename_column :audits, :association_type, :associated_type/, content
66
+ assert_match(/rename_column :audits, :association_id, :associated_id/, content)
67
+ assert_match(/rename_column :audits, :association_type, :associated_type/, content)
64
68
  end
65
69
  end
66
70
 
@@ -70,8 +74,19 @@ class UpgradeGeneratorTest < Rails::Generators::TestCase
70
74
  run_generator %w(upgrade)
71
75
 
72
76
  assert_migration "db/migrate/add_request_uuid_to_audits.rb" do |content|
73
- assert_match /add_column :audits, :request_uuid, :string/, content
74
- assert_match /add_index :audits, :request_uuid/, content
77
+ assert_match(/add_column :audits, :request_uuid, :string/, content)
78
+ assert_match(/add_index :audits, :request_uuid/, content)
79
+ end
80
+ end
81
+
82
+ test "generate migration with correct AR migration parent" do
83
+ load_schema 1
84
+
85
+ run_generator %w(upgrade)
86
+
87
+ assert_migration "db/migrate/add_comment_to_audits.rb" do |content|
88
+ parent = Rails::VERSION::MAJOR == 4 ? 'ActiveRecord::Migration' : "ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]"
89
+ assert_includes(content, "class AddCommentToAudits < #{parent}\n")
75
90
  end
76
91
  end
77
92
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: audited
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.1
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
@@ -13,24 +13,30 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2016-07-29 00:00:00.000000000 Z
16
+ date: 2017-03-29 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
- name: rails-observers
19
+ name: activerecord
20
20
  requirement: !ruby/object:Gem::Requirement
21
21
  requirements:
22
- - - "~>"
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: '4.0'
25
+ - - "<"
23
26
  - !ruby/object:Gem::Version
24
- version: 0.1.2
27
+ version: '5.1'
25
28
  type: :runtime
26
29
  prerelease: false
27
30
  version_requirements: !ruby/object:Gem::Requirement
28
31
  requirements:
29
- - - "~>"
32
+ - - ">="
30
33
  - !ruby/object:Gem::Version
31
- version: 0.1.2
34
+ version: '4.0'
35
+ - - "<"
36
+ - !ruby/object:Gem::Version
37
+ version: '5.1'
32
38
  - !ruby/object:Gem::Dependency
33
- name: protected_attributes
39
+ name: appraisal
34
40
  requirement: !ruby/object:Gem::Requirement
35
41
  requirements:
36
42
  - - ">="
@@ -44,61 +50,81 @@ dependencies:
44
50
  - !ruby/object:Gem::Version
45
51
  version: '0'
46
52
  - !ruby/object:Gem::Dependency
47
- name: appraisal
53
+ name: rails
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '4.0'
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '4.0'
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '5.1'
72
+ - !ruby/object:Gem::Dependency
73
+ name: rspec-rails
48
74
  requirement: !ruby/object:Gem::Requirement
49
75
  requirements:
50
76
  - - "~>"
51
77
  - !ruby/object:Gem::Version
52
- version: 1.0.0
78
+ version: '3.5'
53
79
  type: :development
54
80
  prerelease: false
55
81
  version_requirements: !ruby/object:Gem::Requirement
56
82
  requirements:
57
83
  - - "~>"
58
84
  - !ruby/object:Gem::Version
59
- version: 1.0.0
85
+ version: '3.5'
60
86
  - !ruby/object:Gem::Dependency
61
- name: mongo_mapper
87
+ name: sqlite3
62
88
  requirement: !ruby/object:Gem::Requirement
63
89
  requirements:
64
90
  - - "~>"
65
91
  - !ruby/object:Gem::Version
66
- version: 0.13.0.beta2
92
+ version: '1.3'
67
93
  type: :development
68
94
  prerelease: false
69
95
  version_requirements: !ruby/object:Gem::Requirement
70
96
  requirements:
71
97
  - - "~>"
72
98
  - !ruby/object:Gem::Version
73
- version: 0.13.0.beta2
99
+ version: '1.3'
74
100
  - !ruby/object:Gem::Dependency
75
- name: rails
101
+ name: mysql2
76
102
  requirement: !ruby/object:Gem::Requirement
77
103
  requirements:
78
104
  - - "~>"
79
105
  - !ruby/object:Gem::Version
80
- version: 4.2.0
106
+ version: 0.3.20
81
107
  type: :development
82
108
  prerelease: false
83
109
  version_requirements: !ruby/object:Gem::Requirement
84
110
  requirements:
85
111
  - - "~>"
86
112
  - !ruby/object:Gem::Version
87
- version: 4.2.0
113
+ version: 0.3.20
88
114
  - !ruby/object:Gem::Dependency
89
- name: rspec-rails
115
+ name: pg
90
116
  requirement: !ruby/object:Gem::Requirement
91
117
  requirements:
92
118
  - - "~>"
93
119
  - !ruby/object:Gem::Version
94
- version: '3.0'
120
+ version: '0.18'
95
121
  type: :development
96
122
  prerelease: false
97
123
  version_requirements: !ruby/object:Gem::Requirement
98
124
  requirements:
99
125
  - - "~>"
100
126
  - !ruby/object:Gem::Version
101
- version: '3.0'
127
+ version: '0.18'
102
128
  description: Log all changes to your models
103
129
  email: info@collectiveidea.com
104
130
  executables: []
@@ -109,7 +135,7 @@ files:
109
135
  - ".travis.yml"
110
136
  - ".yardopts"
111
137
  - Appraisals
112
- - CHANGELOG
138
+ - CHANGELOG.md
113
139
  - Gemfile
114
140
  - LICENSE
115
141
  - README.md
@@ -117,14 +143,30 @@ files:
117
143
  - gemfiles/rails40.gemfile
118
144
  - gemfiles/rails41.gemfile
119
145
  - gemfiles/rails42.gemfile
146
+ - gemfiles/rails50.gemfile
147
+ - gemfiles/rails51.gemfile
148
+ - lib/audited-rspec.rb
120
149
  - lib/audited.rb
121
- - lib/audited/active_record/version.rb
122
150
  - lib/audited/audit.rb
123
151
  - lib/audited/auditor.rb
124
- - lib/audited/mongo_mapper/version.rb
125
152
  - lib/audited/rspec_matchers.rb
126
153
  - lib/audited/sweeper.rb
127
154
  - lib/audited/version.rb
155
+ - lib/generators/audited/install_generator.rb
156
+ - lib/generators/audited/migration.rb
157
+ - lib/generators/audited/migration_helper.rb
158
+ - lib/generators/audited/templates/add_association_to_audits.rb
159
+ - lib/generators/audited/templates/add_comment_to_audits.rb
160
+ - lib/generators/audited/templates/add_remote_address_to_audits.rb
161
+ - lib/generators/audited/templates/add_request_uuid_to_audits.rb
162
+ - lib/generators/audited/templates/install.rb
163
+ - lib/generators/audited/templates/rename_association_to_associated.rb
164
+ - lib/generators/audited/templates/rename_changes_to_audited_changes.rb
165
+ - lib/generators/audited/templates/rename_parent_to_association.rb
166
+ - lib/generators/audited/upgrade_generator.rb
167
+ - spec/audited/audit_spec.rb
168
+ - spec/audited/auditor_spec.rb
169
+ - spec/audited/sweeper_spec.rb
128
170
  - spec/audited_spec_helpers.rb
129
171
  - spec/rails_app/config/application.rb
130
172
  - spec/rails_app/config/database.yml
@@ -138,9 +180,9 @@ files:
138
180
  - spec/rails_app/config/routes.rb
139
181
  - spec/spec_helper.rb
140
182
  - spec/support/active_record/models.rb
183
+ - spec/support/active_record/postgres/1_change_audited_changes_type_to_json.rb
184
+ - spec/support/active_record/postgres/2_change_audited_changes_type_to_jsonb.rb
141
185
  - spec/support/active_record/schema.rb
142
- - spec/support/mongo_mapper/connection.rb
143
- - spec/support/mongo_mapper/models.rb
144
186
  - test/db/version_1.rb
145
187
  - test/db/version_2.rb
146
188
  - test/db/version_3.rb
@@ -170,24 +212,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
212
  version: '0'
171
213
  requirements: []
172
214
  rubyforge_project:
173
- rubygems_version: 2.5.1
215
+ rubygems_version: 2.6.6
174
216
  signing_key:
175
217
  specification_version: 4
176
218
  summary: Log all changes to your models
177
- test_files:
178
- - spec/audited_spec_helpers.rb
179
- - spec/rails_app/config/application.rb
180
- - spec/rails_app/config/database.yml
181
- - spec/rails_app/config/environment.rb
182
- - spec/rails_app/config/environments/development.rb
183
- - spec/rails_app/config/environments/production.rb
184
- - spec/rails_app/config/environments/test.rb
185
- - spec/rails_app/config/initializers/backtrace_silencers.rb
186
- - spec/rails_app/config/initializers/inflections.rb
187
- - spec/rails_app/config/initializers/secret_token.rb
188
- - spec/rails_app/config/routes.rb
189
- - spec/spec_helper.rb
190
- - spec/support/active_record/models.rb
191
- - spec/support/active_record/schema.rb
192
- - spec/support/mongo_mapper/connection.rb
193
- - spec/support/mongo_mapper/models.rb
219
+ test_files: []
data/CHANGELOG DELETED
@@ -1,34 +0,0 @@
1
- Audited ChangeLog
2
- -------------------------------------------------------------------------------
3
- * 2012-04-10 - Add Audit scopes for creates, updates and destroys [chriswfx]
4
- * 2011-10-25 - Made ignored_attributes configurable [senny]
5
- * 2011-09-09 - Rails 3.x support
6
- Support for associated audits
7
- Support for remote IP address storage
8
- Plenty of bug fixes and refactoring
9
- [kennethkalmer, ineu, PatrickMa, jrozner, dwarburton, bsiggelkow, dgm]
10
- * 2009-01-27 - Store old and new values for updates, and store all attributes on destroy.
11
- Refactored revisioning methods to work as expected
12
- * 2008-10-10 - changed to make it work in development mode
13
- * 2008-09-24 - Add ability to record parent record of the record being audited
14
- [Kenneth Kalmer]
15
- * 2008-04-19 - refactored to make compatible with dirty tracking in edge rails
16
- and to stop storing both old and new values in a single audit
17
- * 2008-04-18 - Fix NoMethodError when trying to access the :previous revision
18
- on a model that doesn't have previous revisions [Alex Soto]
19
- * 2008-03-21 - added #changed_attributes to get access to the changes before a
20
- save [Chris Parker]
21
- * 2007-12-16 - Added #revision_at for retrieving a revision from a specific
22
- time [Jacob Atzen]
23
- * 2007-12-16 - Fix error when getting revision from audit with no changes
24
- [Geoffrey Wiseman]
25
- * 2007-12-16 - Remove dependency on acts_as_list
26
- * 2007-06-17 - Added support getting previous revisions
27
- * 2006-11-17 - Replaced use of singleton User.current_user with cache sweeper
28
- implementation for auditing the user that made the change
29
- * 2006-11-17 - added migration generator
30
- * 2006-08-14 - incorporated changes from Michael Schuerig to write_attribute
31
- that saves the new value after every change and not just the
32
- first, and performs proper type-casting before doing comparisons
33
- * 2006-08-14 - The "changes" are now saved as a serialized hash
34
- * 2006-07-21 - initial version
@@ -1,5 +0,0 @@
1
- module Audited
2
- module ActiveRecord
3
- VERSION = "4.2.1"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- module Audited
2
- module MongoMapper
3
- VERSION = "4.2.1"
4
- end
5
- end
@@ -1,4 +0,0 @@
1
- require 'mongo_mapper'
2
-
3
- MongoMapper.connection = Mongo::Connection.new
4
- MongoMapper.database = 'audited_test'
@@ -1,214 +0,0 @@
1
- require 'cgi'
2
- require 'mongo_mapper'
3
- require File.expand_path('../connection', __FILE__)
4
-
5
- module Models
6
- module MongoMapper
7
- class User
8
- include ::MongoMapper::Document
9
-
10
- key :name, String
11
- key :username, String
12
- key :password, String
13
- key :activated, Boolean
14
- key :suspended_at, Time
15
- key :logins, Integer, :default => 0
16
- timestamps!
17
-
18
- audited :allow_mass_assignment => true, :except => :password
19
-
20
- attr_protected :logins
21
-
22
- def name=(val)
23
- write_attribute(:name, CGI.escapeHTML(val))
24
- end
25
- end
26
-
27
- class CommentRequiredUser
28
- include ::MongoMapper::Document
29
-
30
- key :name, String
31
- key :username, String
32
- key :password, String
33
- key :activated, Boolean
34
- key :suspended_at, Time
35
- key :logins, Integer, :default => 0
36
- timestamps!
37
-
38
- audited :comment_required => true
39
- end
40
-
41
- class AccessibleAfterDeclarationUser
42
- include ::MongoMapper::Document
43
-
44
- key :name, String
45
- key :username, String
46
- key :password, String
47
- key :activated, Boolean
48
- key :suspended_at, Time
49
- key :logins, Integer, :default => 0
50
- timestamps!
51
-
52
- audited
53
- attr_accessible :name, :username, :password
54
- end
55
-
56
- class AccessibleBeforeDeclarationUser
57
- include ::MongoMapper::Document
58
-
59
- key :name, String
60
- key :username, String
61
- key :password, String
62
- key :activated, Boolean
63
- key :suspended_at, Time
64
- key :logins, Integer, :default => 0
65
- timestamps!
66
-
67
- attr_accessible :name, :username, :password # declare attr_accessible before calling aaa
68
- audited
69
- end
70
-
71
- class NoAttributeProtectionUser
72
- include ::MongoMapper::Document
73
-
74
- key :name, String
75
- key :username, String
76
- key :password, String
77
- key :activated, Boolean
78
- key :suspended_at, Time
79
- key :logins, Integer, :default => 0
80
- timestamps!
81
-
82
- audited :allow_mass_assignment => true
83
- end
84
-
85
- class UserWithAfterAudit
86
- include ::MongoMapper::Document
87
-
88
- key :name, String
89
- key :username, String
90
- key :password, String
91
- key :activated, Boolean
92
- key :suspended_at, Time
93
- key :logins, Integer, :default => 0
94
- timestamps!
95
-
96
- audited
97
- attr_accessor :bogus_attr, :around_attr
98
-
99
- def after_audit
100
- self.bogus_attr = "do something"
101
- end
102
-
103
- def around_audit
104
- self.around_attr = yield
105
- end
106
- end
107
-
108
- class Company
109
- include ::MongoMapper::Document
110
-
111
- key :name, String
112
- key :owner_id, ObjectId
113
-
114
- audited
115
- end
116
-
117
- class Owner
118
- include ::MongoMapper::Document
119
-
120
- key :name, String
121
- key :username, String
122
- key :password, String
123
- key :activated, Boolean
124
- key :suspended_at, Time
125
- key :logins, Integer, :default => 0
126
- timestamps!
127
-
128
- has_associated_audits
129
- end
130
-
131
- class OwnedCompany
132
- include ::MongoMapper::Document
133
-
134
- key :name, String
135
- key :owner_id, ObjectId
136
-
137
- belongs_to :owner, :class_name => "Owner"
138
- attr_accessible :name, :owner # declare attr_accessible before calling aaa
139
- audited :associated_with => :owner
140
- end
141
-
142
- class OnUpdateDestroy
143
- include ::MongoMapper::Document
144
-
145
- key :name, String
146
- key :owner_id, ObjectId
147
-
148
- audited :on => [:update, :destroy]
149
- end
150
-
151
- class OnCreateDestroy
152
- include ::MongoMapper::Document
153
-
154
- key :name, String
155
- key :owner_id, ObjectId
156
-
157
- audited :on => [:create, :destroy]
158
- end
159
-
160
- class OnCreateDestroyExceptName
161
- include ::MongoMapper::Document
162
-
163
- key :name, String
164
- key :owner_id, ObjectId
165
-
166
- audited :except => :name, :on => [:create, :destroy]
167
- end
168
-
169
- class OnCreateUpdate
170
- include ::MongoMapper::Document
171
-
172
- key :name, String
173
- key :owner_id, ObjectId
174
-
175
- audited :on => [:create, :update]
176
- end
177
-
178
- class RichObjectUser
179
- include ::MongoMapper::Document
180
-
181
- class Name
182
- attr_accessor :first_name, :last_name
183
-
184
- def self.from_mongo(value)
185
- case value
186
- when String then new(*value.split)
187
- when self then value
188
- end
189
- end
190
-
191
- def self.to_mongo(value)
192
- case value
193
- when String then value
194
- when self then value.to_s
195
- end
196
- end
197
-
198
- def initialize(first_name, last_name)
199
- self.first_name, self.last_name = first_name, last_name
200
- end
201
-
202
- def to_s
203
- [first_name, last_name].compact.join(' ')
204
- end
205
- end
206
-
207
- key :name, Name
208
-
209
- attr_accessible :name
210
-
211
- audited
212
- end
213
- end
214
- end