notifiably_audited 0.0.5 → 0.0.6

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 (59) hide show
  1. checksums.yaml +8 -8
  2. data/lib/audited/adapters/active_record/audit.rb +69 -0
  3. data/lib/audited/adapters/active_record.rb +15 -0
  4. data/lib/audited-activerecord.rb +2 -0
  5. data/lib/generators/audited/install_generator.rb +28 -0
  6. data/lib/generators/audited/templates/add_association_to_audits.rb +11 -0
  7. data/lib/generators/audited/templates/add_comment_to_audits.rb +9 -0
  8. data/lib/generators/audited/templates/add_remote_address_to_audits.rb +10 -0
  9. data/lib/generators/audited/templates/install.rb +35 -0
  10. data/lib/generators/audited/templates/rename_association_to_associated.rb +23 -0
  11. data/lib/generators/audited/templates/rename_changes_to_audited_changes.rb +9 -0
  12. data/lib/generators/audited/templates/rename_parent_to_association.rb +11 -0
  13. data/lib/generators/audited/upgrade_generator.rb +63 -0
  14. metadata +24 -157
  15. data/.gitignore +0 -17
  16. data/Appraisals +0 -11
  17. data/CHANGELOG +0 -34
  18. data/Gemfile +0 -3
  19. data/LICENSE.txt +0 -22
  20. data/README.md +0 -234
  21. data/Rakefile +0 -24
  22. data/audited-activerecord.gemspec +0 -21
  23. data/audited-mongo_mapper.gemspec +0 -21
  24. data/audited.gemspec +0 -27
  25. data/gemfiles/rails30.gemfile +0 -7
  26. data/gemfiles/rails31.gemfile +0 -7
  27. data/gemfiles/rails32.gemfile +0 -7
  28. data/lib/audited/audit.rb +0 -115
  29. data/lib/audited/auditor.rb +0 -449
  30. data/lib/audited/rspec_matchers.rb +0 -173
  31. data/lib/audited/sweeper.rb +0 -51
  32. data/lib/audited.rb +0 -15
  33. data/lib/notifiably_audited/version.rb +0 -3
  34. data/lib/notifiably_audited.rb +0 -15
  35. data/notifiably_audited.gemspec +0 -23
  36. data/spec/audited_spec_helpers.rb +0 -31
  37. data/spec/rails_app/config/application.rb +0 -5
  38. data/spec/rails_app/config/database.yml +0 -24
  39. data/spec/rails_app/config/environment.rb +0 -5
  40. data/spec/rails_app/config/environments/development.rb +0 -19
  41. data/spec/rails_app/config/environments/production.rb +0 -33
  42. data/spec/rails_app/config/environments/test.rb +0 -33
  43. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  44. data/spec/rails_app/config/initializers/inflections.rb +0 -2
  45. data/spec/rails_app/config/initializers/secret_token.rb +0 -2
  46. data/spec/rails_app/config/routes.rb +0 -6
  47. data/spec/spec_helper.rb +0 -23
  48. data/spec/support/active_record/models.rb +0 -84
  49. data/spec/support/active_record/schema.rb +0 -54
  50. data/spec/support/mongo_mapper/connection.rb +0 -4
  51. data/spec/support/mongo_mapper/models.rb +0 -210
  52. data/test/db/version_1.rb +0 -17
  53. data/test/db/version_2.rb +0 -18
  54. data/test/db/version_3.rb +0 -19
  55. data/test/db/version_4.rb +0 -20
  56. data/test/db/version_5.rb +0 -18
  57. data/test/install_generator_test.rb +0 -17
  58. data/test/test_helper.rb +0 -19
  59. data/test/upgrade_generator_test.rb +0 -65
@@ -1,449 +0,0 @@
1
- module Audited
2
- # Specify this act if you want changes to your model to be saved in an
3
- # audit table. This assumes there is an audits table ready.
4
- #
5
- # class User < ActiveRecord::Base
6
- # audited
7
- # end
8
- #
9
- # To store an audit comment set model.audit_comment to your comment before
10
- # a create, update or destroy operation.
11
- #
12
- # See <tt>Audited::Adapters::ActiveRecord::Auditor::ClassMethods#audited</tt>
13
- # for configuration options
14
- module Auditor #:nodoc:
15
- extend ActiveSupport::Concern
16
-
17
- CALLBACKS = [:audit_create, :audit_update, :audit_destroy]
18
-
19
- module ClassMethods
20
- # == Configuration options
21
- #
22
- #
23
- # * +only+ - Only audit the given attributes
24
- # * +except+ - Excludes fields from being saved in the audit log.
25
- # By default, Audited will audit all but these fields:
26
- #
27
- # [self.primary_key, inheritance_column, 'lock_version', 'created_at', 'updated_at']
28
- # You can add to those by passing one or an array of fields to skip.
29
- #
30
- # class User < ActiveRecord::Base
31
- # audited :except => :password
32
- # end
33
- # * +protect+ - If your model uses +attr_protected+, set this to false to prevent Rails from
34
- # raising an error. If you declare +attr_accessible+ before calling +audited+, it
35
- # will automatically default to false. You only need to explicitly set this if you are
36
- # calling +attr_accessible+ after.
37
- #
38
- # * +require_comment+ - Ensures that audit_comment is supplied before
39
- # any create, update or destroy operation.
40
- #
41
- # class User < ActiveRecord::Base
42
- # audited :protect => false
43
- # attr_accessible :name
44
- # end
45
- #
46
- def notifiably_audited(options = {})
47
- # don't allow multiple calls
48
- return if self.included_modules.include?(Audited::Auditor::AuditedInstanceMethods)
49
-
50
- class_attribute :non_audited_columns, :instance_writer => false
51
- class_attribute :auditing_enabled, :instance_writer => false
52
- class_attribute :audit_associated_with, :instance_writer => false
53
-
54
- #====== beck added for notifiable ====
55
- class_attribute :audit_alert_to, :instance_writer => false
56
- class_attribute :audit_alert_for, :instance_writer => false
57
- class_attribute :audit_title, :instance_writer => false
58
- class_attribute :audit_create_comment, :instance_writer => false
59
- class_attribute :audit_update_comment, :instance_writer => false
60
- #=====================================
61
-
62
- if options[:only]
63
- except = self.column_names - options[:only].flatten.map(&:to_s)
64
- else
65
- except = default_ignored_attributes + Audited.ignored_attributes
66
- except |= Array(options[:except]).collect(&:to_s) if options[:except]
67
- end
68
- self.non_audited_columns = except
69
- self.audit_associated_with = options[:associated_with]
70
-
71
- #====== beck added for notifiable ====
72
- self.audit_alert_to = options[:alert_to] || :assigned_to
73
- self.audit_alert_for = options[:alert_for] || nil
74
- self.audit_title = options[:title] || :name
75
- self.audit_create_comment = options[:create_comment] || "New <<here>> has been created"
76
- self.audit_update_comment = options[:update_comment] || "Values of <<here>> has been updated"
77
- #=====================================
78
-
79
- if options[:comment_required]
80
- validates_presence_of :audit_comment, :if => :auditing_enabled
81
- before_destroy :require_comment
82
- end
83
-
84
- attr_accessor :audit_comment
85
- unless options[:allow_mass_assignment]
86
- attr_accessible :audit_comment
87
- end
88
-
89
- has_many :audits, :as => :auditable, :class_name => Audited.audit_class.name
90
- Audited.audit_class.audited_class_names << self.to_s
91
-
92
- after_create :audit_create if !options[:on] || (options[:on] && options[:on].include?(:create))
93
- before_update :audit_update if !options[:on] || (options[:on] && options[:on].include?(:update))
94
- before_destroy :audit_destroy if !options[:on] || (options[:on] && options[:on].include?(:destroy))
95
-
96
- # Define and set an after_audit callback. This might be useful if you want
97
- # to notify a party after the audit has been created.
98
- define_callbacks :audit
99
- set_callback :audit, :after, :after_audit, :if => lambda { self.respond_to?(:after_audit) }
100
-
101
- attr_accessor :version
102
-
103
- extend Audited::Auditor::AuditedClassMethods
104
- include Audited::Auditor::AuditedInstanceMethods
105
-
106
- self.auditing_enabled = true
107
-
108
- end
109
-
110
- def has_associated_audits
111
- has_many :associated_audits, :as => :associated, :class_name => Audited.audit_class.name
112
- end
113
- end
114
-
115
- #======== Audit Instance Methods - Means the methods on the target object =====================
116
-
117
- #====== beck modified for notifiable ====
118
- # @non_monitor is 1 initially, if somewhere an audit is created this is set to 0, so no future
119
- # audit will be created.
120
-
121
- # if polymorphic, then
122
- # [:polymorphic,"title",
123
- # col of self to be displayed as comment,[:commentable_type,:commentable_id]]
124
- #----------------------------------------------
125
- # opts format for notifiably_audited method/gem
126
- #----------------------------------------------
127
- # notifiably_audited alert_for: [[[:assigned_to],
128
- # "Re-assigned",
129
- # "This product has been reassigned",
130
- # [:user,:email]],
131
- # [[:color,:score],
132
- # "Color/Score Changed",
133
- # "Color/Score value is changed"],
134
- # [[:product_status_id],
135
- # "Status Changed",
136
- # "Status of this product is changed",
137
- # [:product_status,:name]]],
138
- # associated_with: :product_status,
139
- # title: :name,
140
- # create_comment: "New <<here>> has been created",
141
- # update_comment: "Custom: Values of <<here>> has been updated"
142
- #
143
- # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
144
- #
145
- # notifiably_audited alert_for: [[:polymorphic,
146
- # nil,
147
- # :content,
148
- # [:commentable_type,:commentable_id]]]
149
- #
150
- # -----------
151
- # alert_to :
152
- # -----------
153
- # The column of the target_object that has the user_id to send
154
- # the notification to.(receiver_id of the Audit record)
155
- # -----------
156
- # alert_for :
157
- # -----------
158
- # Takes array of arrays as an argument. Every array in the main array corresponds to
159
- # one or group of columns update and how to notify.
160
- # Following is the index wise explanation of the arrays.
161
- # 1. Column name or Column names
162
- # 2. Title of the notification(title column of the Audit record)
163
- # 3. Description of the notification(audit_comment column of the Audit record)
164
- # 4. If the column name is a foreign key of an belongs_to association, then the model_name of the
165
- # associated model and the column of the model to be displayed in title is specified
166
- # -----------
167
- # title :
168
- # -----------
169
- # Takes 1 column name or a method name of the target object as an argument, in order to prompt the
170
- # title of the target object wherever needed in the notification
171
- # ---------------
172
- # create_comment :
173
- # ---------------
174
- # Default audit_comment for create action
175
- # ---------------
176
- # update_comment :
177
- # ---------------
178
- # Default audit_comment for update action
179
- #
180
- # ***************
181
- # :polymorphic
182
- # ***************
183
- # If this is passed as the first argument of the alert_for option, then it means, the current_model
184
- # is polymorphic and the target_object is a different model to which the current model is
185
- # polymorphic to.
186
- #
187
- # In the above case the 4th argument of the alert_for option should be the type and id of the
188
- # polymorphic model.(Ex: [:commentable_type,commentable_id])
189
- #----------------------------------------------
190
- #=====================================
191
-
192
- module AuditedInstanceMethods
193
- # Temporarily turns off auditing while saving.
194
- def save_without_auditing
195
- without_auditing { save }
196
- end
197
-
198
- # Executes the block with the auditing callbacks disabled.
199
- #
200
- # @foo.without_auditing do
201
- # @foo.save
202
- # end
203
- #
204
- def without_auditing(&block)
205
- self.class.without_auditing(&block)
206
- end
207
-
208
- # Gets an array of the revisions available
209
- #
210
- # user.revisions.each do |revision|
211
- # user.name
212
- # user.version
213
- # end
214
- #
215
- def revisions(from_version = 1)
216
- audits = self.audits.from_version(from_version)
217
- return [] if audits.empty?
218
- revisions = []
219
- audits.each do |audit|
220
- revisions << audit.revision
221
- end
222
- revisions
223
- end
224
-
225
- # Get a specific revision specified by the version number, or +:previous+
226
- def revision(version)
227
- revision_with Audited.audit_class.reconstruct_attributes(audits_to(version))
228
- end
229
-
230
- # Find the oldest revision recorded prior to the date/time provided.
231
- def revision_at(date_or_time)
232
- audits = self.audits.up_until(date_or_time)
233
- revision_with Audited.audit_class.reconstruct_attributes(audits) unless audits.empty?
234
- end
235
-
236
- # List of attributes that are audited.
237
- def audited_attributes
238
- attributes.except(*non_audited_columns)
239
- end
240
-
241
- protected
242
-
243
- def revision_with(attributes)
244
- self.dup.tap do |revision|
245
- revision.id = id
246
- revision.send :instance_variable_set, '@attributes', self.attributes
247
- revision.send :instance_variable_set, '@new_record', self.destroyed?
248
- revision.send :instance_variable_set, '@persisted', !self.destroyed?
249
- revision.send :instance_variable_set, '@readonly', false
250
- revision.send :instance_variable_set, '@destroyed', false
251
- revision.send :instance_variable_set, '@_destroyed', false
252
- revision.send :instance_variable_set, '@marked_for_destruction', false
253
- Audited.audit_class.assign_revision_attributes(revision, attributes)
254
-
255
- # Remove any association proxies so that they will be recreated
256
- # and reference the correct object for this revision. The only way
257
- # to determine if an instance variable is a proxy object is to
258
- # see if it responds to certain methods, as it forwards almost
259
- # everything to its target.
260
- for ivar in revision.instance_variables
261
- proxy = revision.instance_variable_get ivar
262
- if !proxy.nil? and proxy.respond_to? :proxy_respond_to?
263
- revision.instance_variable_set ivar, nil
264
- end
265
- end
266
- end
267
- end
268
-
269
- private
270
-
271
- def audited_changes
272
- changed_attributes.except(*non_audited_columns).inject({}) do |changes,(attr, old_value)|
273
- changes[attr] = [old_value, self[attr]]
274
- changes
275
- end
276
- end
277
-
278
- def audits_to(version = nil)
279
- if version == :previous
280
- version = if self.version
281
- self.version - 1
282
- else
283
- previous = audits.descending.offset(1).first
284
- previous ? previous.version : 1
285
- end
286
- end
287
- audits.to_version(version)
288
- end
289
- #====== beck modified for notifiable ====
290
-
291
- def audit_create
292
- set_audit_values("create")# also sets @non_monitor as 1
293
- if !audit_alert_for.nil?
294
- audit_alert_for.each do |f|
295
- if f[0] == :polymorphic
296
- polymorphic_audit(f)# also sets @non_monitor as 0
297
- end
298
- end
299
- end
300
-
301
- if @non_monitor == 1
302
- write_audit(@audit_values)
303
- end
304
- end
305
-
306
- def audit_update
307
- unless (changes = audited_changes).empty? && audit_comment.blank?
308
- set_audit_values("update")# also sets @non_monitor as 1
309
-
310
- if !audit_alert_for.nil?
311
- audit_alert_for.each do |f|
312
- if f[0] == :polymorphic
313
- polymorphic_audit(f)# also sets @non_monitor as 0
314
- else
315
- changed_eq_opts(f)# also sets @non_monitor as 0
316
- end
317
- end
318
- end
319
-
320
- if @non_monitor == 1
321
- write_audit(@audit_values)
322
- end
323
-
324
- end
325
- end
326
-
327
- def audit_destroy
328
- write_audit(:action => 'destroy', :audited_changes => audited_attributes,
329
- :comment => audit_comment, :receiver_id => self.send(audit_alert_to), :checked => false)
330
- end
331
- #=== Following methods helps audit_create and update ======
332
- # set_audit_values
333
- # polymorphic_audit
334
- # changed_eq_opts
335
- #==========================================================
336
-
337
- def set_audit_values(type)
338
- @non_monitor = 1
339
- # based on type the audit attributes are set
340
- if (type == "create")
341
- v_audited_changes = audited_attributes
342
- elsif (type == "update")
343
- v_audited_changes = changes
344
- end
345
- # the <<here>> part of the comment is replaced with class name
346
- v_comment = send("audit_" + type +"_comment").gsub(/<<here>>/,self.class.name)
347
- # fields of the audit record set initially as hash, can be over ridden
348
- @audit_values = {action: type,
349
- audited_changes: v_audited_changes,
350
- comment: v_comment,
351
- title: (self.send(audit_title) rescue self.class.name),
352
- checked: false,
353
- receiver_id: (self.send(audit_alert_to) rescue nil)}
354
- end
355
-
356
- def polymorphic_audit(opts)
357
- # polymorphic - so the actual object is set, not the polymorphed object(product not comment)
358
- target_object = self.send(opts[3][0]).constantize.find(self.send(opts[3][1]))
359
- # overriding the audit values based on polymorphic opts
360
- @audit_values[:title] = (opts[1] || @audit_values[:title]).to_s + " - #{target_object.class.name}[#{target_object.send(audit_title)}]"
361
- @audit_values[:comment] = self.send(opts[2])[0..20].to_s + "..."
362
- @audit_values[:receiver_id] = target_object.send(audit_alert_to)
363
- # actual recording of audit
364
- write_audit(@audit_values)
365
- # setting to 0, so dont record anymore audits
366
- @non_monitor = 0
367
- end
368
-
369
- def changed_eq_opts(opts)
370
- # the cols that are going to be modified as identified by audited gem
371
- changed = changes.keys.map &:to_sym
372
- # the cols to be listened to, as passed in the opts
373
- opts_changes = opts[0]
374
- # if the sub array(to be listened) is included in the main array(audited identified cols)
375
- if ((opts_changes - changed).size == 0)
376
- # overriding audit values
377
- @audit_values[:title] = opts[1]
378
- @audit_values[:comment] = opts[2]
379
- # if 3rd argument is present in the opts, then overriding title
380
- if opts[3].present?
381
- append = opts[3][0].to_s.camelize.constantize.find(self.send(opts[0][0])).send(opts[3][1])
382
- @audit_values[:title] = @audit_values[:title] + "[#{append}]"
383
- end
384
- # actual recording of audit
385
- write_audit(@audit_values)
386
- # setting to 0, so dont record anymore audits
387
- @non_monitor = 0
388
- end
389
- end
390
- #========================================
391
-
392
- def write_audit(attrs)
393
- attrs[:associated] = self.send(audit_associated_with) unless audit_associated_with.nil?
394
- self.audit_comment = nil
395
- run_callbacks(:audit) { self.audits.create(attrs) } if auditing_enabled
396
- end
397
-
398
- def require_comment
399
- if auditing_enabled && audit_comment.blank?
400
- errors.add(:audit_comment, "Comment required before destruction")
401
- return false
402
- end
403
- end
404
-
405
- CALLBACKS.each do |attr_name|
406
- alias_method "#{attr_name}_callback".to_sym, attr_name
407
- end
408
-
409
- def empty_callback #:nodoc:
410
- end
411
-
412
- end # InstanceMethods
413
-
414
- module AuditedClassMethods
415
- # Returns an array of columns that are audited. See non_audited_columns
416
- def audited_columns
417
- self.columns.select { |c| !non_audited_columns.include?(c.name) }
418
- end
419
-
420
- # Executes the block with auditing disabled.
421
- #
422
- # Foo.without_auditing do
423
- # @foo.save
424
- # end
425
- #
426
- def without_auditing(&block)
427
- auditing_was_enabled = auditing_enabled
428
- disable_auditing
429
- block.call.tap { enable_auditing if auditing_was_enabled }
430
- end
431
-
432
- def disable_auditing
433
- self.auditing_enabled = false
434
- end
435
-
436
- def enable_auditing
437
- self.auditing_enabled = true
438
- end
439
-
440
- # All audit operations during the block are recorded as being
441
- # made by +user+. This is not model specific, the method is a
442
- # convenience wrapper around
443
- # @see Audit#as_user.
444
- def audit_as( user, &block )
445
- Audited.audit_class.as_user( user, &block )
446
- end
447
- end
448
- end
449
- end
@@ -1,173 +0,0 @@
1
- module Audited
2
- module RspecMatchers
3
- # Ensure that the model is audited.
4
- #
5
- # Options:
6
- # * <tt>associated_with</tt> - tests that the audit makes use of the associated_with option
7
- # * <tt>only</tt> - tests that the audit makes use of the only option *Overrides <tt>except</tt> option*
8
- # * <tt>except</tt> - tests that the audit makes use of the except option
9
- # * <tt>requires_comment</tt> - if specified, then the audit must require comments through the <tt>audit_comment</tt> attribute
10
- # * <tt>on</tt> - tests that the audit makes use of the on option with specified parameters
11
- #
12
- # Example:
13
- # it { should be_audited }
14
- # it { should be_audited.associated_with(:user) }
15
- # it { should be_audited.only(:field_name) }
16
- # it { should be_audited.except(:password) }
17
- # it { should be_audited.requires_comment }
18
- # it { should be_audited.on(:create).associated_with(:user).except(:password) }
19
- #
20
- def be_audited
21
- AuditMatcher.new
22
- end
23
-
24
- # Ensure that the model has associated audits
25
- #
26
- # Example:
27
- # it { should have_associated_audits }
28
- #
29
- def have_associated_audits
30
- AssociatedAuditMatcher.new
31
- end
32
-
33
- class AuditMatcher # :nodoc:
34
- def initialize
35
- @options = {}
36
- end
37
-
38
- def associated_with(model)
39
- @options[:associated_with] = model
40
- self
41
- end
42
-
43
- def only(*fields)
44
- @options[:only] = fields.flatten
45
- self
46
- end
47
-
48
- def except(*fields)
49
- @options[:except] = fields.flatten
50
- self
51
- end
52
-
53
- def requires_comment
54
- @options[:comment_required] = true
55
- self
56
- end
57
-
58
- def on(*actions)
59
- @options[:on] = actions.flatten
60
- self
61
- end
62
-
63
- def matches?(subject)
64
- @subject = subject
65
- auditing_enabled? &&
66
- associated_with_model? &&
67
- records_changes_to_specified_fields? &&
68
- comment_required_valid?
69
- end
70
-
71
- def failure_message
72
- "Expected #{@expectation}"
73
- end
74
-
75
- def negative_failure_message
76
- "Did not expect #{@expectation}"
77
- end
78
-
79
- def description
80
- description = "audited"
81
- description += " associated with #{@options[:associated_with]}" if @options.key?(:associated_with)
82
- description += " only => #{@options[:only].join ', '}" if @options.key?(:only)
83
- description += " except => #{@options[:except].join(', ')}" if @options.key?(:except)
84
- description += " requires audit_comment" if @options.key?(:comment_required)
85
-
86
- description
87
- end
88
-
89
- protected
90
-
91
- def expects(message)
92
- @expectation = message
93
- end
94
-
95
- def auditing_enabled?
96
- expects "#{model_class} to be audited"
97
- model_class.respond_to?(:auditing_enabled) && model_class.auditing_enabled
98
- end
99
-
100
- def model_class
101
- @subject.class
102
- end
103
-
104
- def associated_with_model?
105
- expects "#{model_class} to record audits to associated model #{@options[:associated_with]}"
106
- model_class.audit_associated_with == @options[:associated_with]
107
- end
108
-
109
- def records_changes_to_specified_fields?
110
- if @options[:only] || @options[:except]
111
- if @options[:only]
112
- except = model_class.column_names - @options[:only].map(&:to_s)
113
- else
114
- except = model_class.default_ignored_attributes + Audited.ignored_attributes
115
- except |= @options[:except].collect(&:to_s) if @options[:except]
116
- end
117
-
118
- expects "non audited columns (#{model_class.non_audited_columns.inspect}) to match (#{expect})"
119
- model_class.non_audited_columns =~ except
120
- else
121
- true
122
- end
123
- end
124
-
125
- def comment_required_valid?
126
- if @options[:comment_required]
127
- @subject.audit_comment = nil
128
-
129
- expects "to be invalid when audit_comment is not specified"
130
- @subject.valid? == false && @subject.errors.key?(:audit_comment)
131
- else
132
- true
133
- end
134
- end
135
- end
136
-
137
- class AssociatedAuditMatcher # :nodoc:
138
- def matches?(subject)
139
- @subject = subject
140
-
141
- association_exists?
142
- end
143
-
144
- def failure_message
145
- "Expected #{model_class} to have associated audits"
146
- end
147
-
148
- def negative_failure_message
149
- "Expected #{model_class} to not have associated audits"
150
- end
151
-
152
- def description
153
- "has associated audits"
154
- end
155
-
156
- protected
157
-
158
- def model_class
159
- @subject.class
160
- end
161
-
162
- def reflection
163
- model_class.reflect_on_association(:associated_audits)
164
- end
165
-
166
- def association_exists?
167
- (!reflection.nil?) &&
168
- reflection.macro == :has_many &&
169
- reflection.options[:class_name] == Audited.audit_class.name
170
- end
171
- end
172
- end
173
- end
@@ -1,51 +0,0 @@
1
- module Audited
2
- class Sweeper < ActiveModel::Observer
3
- observe Audited.audit_class
4
-
5
- def before(controller)
6
- self.controller = controller
7
- true
8
- end
9
-
10
- def after(controller)
11
- self.controller = nil
12
- end
13
-
14
- def before_create(audit)
15
- audit.user ||= current_user
16
- audit.remote_address = controller.try(:request).try(:ip)
17
- end
18
-
19
- def current_user
20
- controller.send(Audited.current_user_method) if controller.respond_to?(Audited.current_user_method, true)
21
- end
22
-
23
- def add_observer!(klass)
24
- super
25
- define_callback(klass)
26
- end
27
-
28
- def define_callback(klass)
29
- observer = self
30
- callback_meth = :"_notify_audited_sweeper"
31
- klass.send(:define_method, callback_meth) do
32
- observer.update(:before_create, self)
33
- end
34
- klass.send(:before_create, callback_meth)
35
- end
36
-
37
- def controller
38
- ::Audited.store[:current_controller]
39
- end
40
-
41
- def controller=(value)
42
- ::Audited.store[:current_controller] = value
43
- end
44
- end
45
- end
46
-
47
- if defined?(ActionController) and defined?(ActionController::Base)
48
- ActionController::Base.class_eval do
49
- around_filter Audited::Sweeper.instance
50
- end
51
- end
data/lib/audited.rb DELETED
@@ -1,15 +0,0 @@
1
- module Audited
2
- VERSION = '3.0.0'
3
-
4
- class << self
5
- attr_accessor :ignored_attributes, :current_user_method, :audit_class
6
-
7
- def store
8
- Thread.current[:audited_store] ||= {}
9
- end
10
- end
11
-
12
- @ignored_attributes = %w(lock_version created_at updated_at created_on updated_on)
13
-
14
- @current_user_method = :current_user
15
- end
@@ -1,3 +0,0 @@
1
- module NotifiablyAudited
2
- VERSION = "0.0.1"
3
- end