audited 5.4.1 → 5.4.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8064f489d5ebd438af237683541fb2436fc687d786a688f5d6ce936e24e6d89b
4
- data.tar.gz: b6acaf26b868f64883dcd9af556cfc5233be1395c3fc03fdea13c3c7449de6b8
3
+ metadata.gz: 32e366c7864b72cc3729bd15673e391ff3f45fee1b6ab0f2789ed8499588002f
4
+ data.tar.gz: 6a3f24da58730f880eaa1e7e607f33ef5bf74a035b477249e7d34f827e36728c
5
5
  SHA512:
6
- metadata.gz: 9466b4f7ab9a100e9ff0e9e5dbec591dc30e9027d8529c481f3e3faa72cb6d89c2cf5eb6c19e1cbbb6ceba5ea2f55a882e7c4fe2ef587a6eed676640d63372ff
7
- data.tar.gz: 5f9050ffcff6dcadd3e4040aa941f2f48773ef575e69f2012d4088e9fed327ec35e3a386c7437bbe019cbfc2c32e0e4ac348f49977915ffac6c6e1b1d8580c6c
6
+ metadata.gz: fb1332090ad6d301af3d61a2948b8376f33dad8bea9c431ad480432f3c8d80837b9202f718e69be2dcdb0bb7bab8a329d77ae45e2fc50c533b6c79979e5d2b49
7
+ data.tar.gz: 632aae39c6307342b8430308f2f093e03a1b172f8ce0c08a3ed87f380f48b39e5fff63b2132fa93f9a5d0dec4a08b391671f52b5d2173a680c951aa27b4537f9
@@ -0,0 +1,28 @@
1
+ name: Publish Gem
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - v*
7
+
8
+ jobs:
9
+ push:
10
+ if: github.repository == 'collectiveidea/audited'
11
+ runs-on: ubuntu-latest
12
+ environment: publishing
13
+
14
+ permissions:
15
+ contents: write
16
+ id-token: write
17
+
18
+ steps:
19
+ # Set up
20
+ - uses: actions/checkout@v4
21
+ - name: Set up Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ bundler-cache: true
25
+ ruby-version: ruby
26
+
27
+ # Release
28
+ - uses: rubygems/release-gem@v1
data/CHANGELOG.md CHANGED
@@ -1,6 +1,19 @@
1
1
  # Audited ChangeLog
2
2
 
3
- ## 5.4.1 (2023-09-30)
3
+ ### 5.4.3 (2024-01-11)
4
+
5
+ - Ignore readonly columns in audit - @sriddbs
6
+ [#692](https://github.com/collectiveidea/audited/pull/692)
7
+ - Robustify Rails version checks - @blaet
8
+ [#689](https://github.com/collectiveidea/audited/pull/689)
9
+ - Ignore callbacks if not specifed on the model
10
+ [#679](https://github.com/collectiveidea/audited/pull/679)
11
+
12
+ ## 5.4.2 (2023-11-30)
13
+
14
+ - Revert replacing RequetStore with ActiveSupport::CurrentAttributes until it is fully tested.
15
+
16
+ ## 5.4.1 (2023-11-30)
4
17
 
5
18
  - Replace RequestStore with ActiveSupport::CurrentAttributes - @the-spectator
6
19
  [#673](https://github.com/collectiveidea/audited/pull/673/)
data/README.md CHANGED
@@ -133,18 +133,24 @@ end
133
133
 
134
134
  ### Specifying callbacks
135
135
 
136
- By default, a new audit is created for any Create, Update or Destroy action. You can, however, limit the actions audited.
136
+ By default, a new audit is created for any Create, Update, Touch (Rails 6+) or Destroy action. You can, however, limit the actions audited.
137
137
 
138
138
  ```ruby
139
139
  class User < ActiveRecord::Base
140
140
  # All fields and actions
141
141
  # audited
142
142
 
143
- # Single field, only audit Update and Destroy (not Create)
143
+ # Single field, only audit Update and Destroy (not Create or Touch)
144
144
  # audited only: :name, on: [:update, :destroy]
145
145
  end
146
146
  ```
147
147
 
148
+ You can ignore the default callbacks globally unless the callback action is specified in your model using the `:on` option. To configure default callback exclusion, put the following in an initializer file (`config/initializers/audited.rb`):
149
+
150
+ ```ruby
151
+ Audited.ignored_default_callbacks = [:create, :update] # ignore callbacks create and update
152
+ ```
153
+
148
154
  ### Comments
149
155
 
150
156
  You can attach comments to each audit using an `audit_comment` attribute on your model.
data/Rakefile CHANGED
@@ -1,12 +1,10 @@
1
1
  #!/usr/bin/env rake
2
2
 
3
- require "bundler/gem_helper"
3
+ require "bundler/gem_tasks"
4
4
  require "rspec/core/rake_task"
5
5
  require "rake/testtask"
6
6
  require "appraisal"
7
7
 
8
- Bundler::GemHelper.install_tasks(name: "audited")
9
-
10
8
  RSpec::Core::RakeTask.new(:spec)
11
9
 
12
10
  Rake::TestTask.new do |t|
data/lib/audited/audit.rb CHANGED
@@ -49,7 +49,7 @@ module Audited
49
49
  cattr_accessor :audited_class_names
50
50
  self.audited_class_names = Set.new
51
51
 
52
- if Rails.version >= "7.1"
52
+ if Rails.gem_version >= Gem::Version.new("7.1")
53
53
  serialize :audited_changes, coder: YAMLIfTextColumnType
54
54
  else
55
55
  serialize :audited_changes, YAMLIfTextColumnType
@@ -231,7 +231,7 @@ module Audited
231
231
 
232
232
  private
233
233
 
234
- def audited_changes(for_touch: false)
234
+ def audited_changes(for_touch: false, exclude_readonly_attrs: false)
235
235
  all_changes = if for_touch
236
236
  previous_changes
237
237
  elsif respond_to?(:changes_to_save)
@@ -240,6 +240,8 @@ module Audited
240
240
  changes
241
241
  end
242
242
 
243
+ all_changes = all_changes.except(*self.class.readonly_attributes.to_a) if exclude_readonly_attrs
244
+
243
245
  filtered_changes = \
244
246
  if audited_options[:only].present?
245
247
  all_changes.slice(*self.class.audited_columns)
@@ -333,14 +335,14 @@ module Audited
333
335
  end
334
336
 
335
337
  def audit_update
336
- unless (changes = audited_changes).empty? && (audit_comment.blank? || audited_options[:update_with_comment_only] == false)
338
+ unless (changes = audited_changes(exclude_readonly_attrs: true)).empty? && (audit_comment.blank? || audited_options[:update_with_comment_only] == false)
337
339
  write_audit(action: "update", audited_changes: changes,
338
340
  comment: audit_comment)
339
341
  end
340
342
  end
341
343
 
342
344
  def audit_touch
343
- unless (changes = audited_changes(for_touch: true)).empty?
345
+ unless (changes = audited_changes(for_touch: true, exclude_readonly_attrs: true)).empty?
344
346
  write_audit(action: "update", audited_changes: changes,
345
347
  comment: audit_comment)
346
348
  end
@@ -496,7 +498,7 @@ module Audited
496
498
 
497
499
  def normalize_audited_options
498
500
  audited_options[:on] = Array.wrap(audited_options[:on])
499
- audited_options[:on] = [:create, :update, :touch, :destroy] if audited_options[:on].empty?
501
+ audited_options[:on] = ([:create, :update, :touch, :destroy] - Audited.ignored_default_callbacks) if audited_options[:on].empty?
500
502
  audited_options[:only] = Array.wrap(audited_options[:only]).map(&:to_s)
501
503
  audited_options[:except] = Array.wrap(audited_options[:except]).map(&:to_s)
502
504
  max_audits = audited_options[:max_audits] || Audited.max_audits
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Audited
4
- VERSION = "5.4.1"
4
+ VERSION = "5.4.3"
5
5
  end
data/lib/audited.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_record"
4
+ require "request_store"
4
5
 
5
6
  module Audited
6
7
  class << self
@@ -8,6 +9,7 @@ module Audited
8
9
  :auditing_enabled,
9
10
  :current_user_method,
10
11
  :ignored_attributes,
12
+ :ignored_default_callbacks,
11
13
  :max_audits,
12
14
  :store_synthesized_enums
13
15
  attr_writer :audit_class
@@ -25,7 +27,7 @@ module Audited
25
27
  deprecator: ActiveSupport::Deprecation.new('6.0.0', 'Audited')
26
28
 
27
29
  def store
28
- Audited::RequestStore.audited_store ||= {}
30
+ RequestStore.store[:audited_store] ||= {}
29
31
  end
30
32
 
31
33
  def config
@@ -34,6 +36,7 @@ module Audited
34
36
  end
35
37
 
36
38
  @ignored_attributes = %w[lock_version created_at updated_at created_on updated_on]
39
+ @ignored_default_callbacks = []
37
40
 
38
41
  @current_user_method = :current_user
39
42
  @auditing_enabled = true
@@ -41,7 +44,6 @@ module Audited
41
44
  end
42
45
 
43
46
  require "audited/auditor"
44
- require "audited/request_store"
45
47
 
46
48
  ActiveSupport.on_load :active_record do
47
49
  require "audited/audit"
@@ -16,7 +16,7 @@ module Audited
16
16
  private
17
17
 
18
18
  def timestamped_migrations?
19
- (Rails.version >= "7.0") ?
19
+ (Rails.gem_version >= Gem::Version.new("7.0")) ?
20
20
  ::ActiveRecord.timestamped_migrations :
21
21
  ::ActiveRecord::Base.timestamped_migrations
22
22
  end
@@ -245,6 +245,27 @@ describe Audited::Auditor do
245
245
  expect(user.audits.last.audited_changes["password"]).to eq(["My", "Custom", "Value", 7])
246
246
  end
247
247
 
248
+ context "when ignored_default_callbacks is set" do
249
+ before { Audited.ignored_default_callbacks = [:create] }
250
+ after { Audited.ignored_default_callbacks = [] }
251
+
252
+ it "should remove create callback" do
253
+ class DefaultCallback < ::ActiveRecord::Base
254
+ audited
255
+ end
256
+
257
+ expect(DefaultCallback.audited_options[:on]).to eq([:update, :touch, :destroy])
258
+ end
259
+
260
+ it "should keep create callback if specified" do
261
+ class CallbacksSpecified < ::ActiveRecord::Base
262
+ audited on: [:create, :update, :destroy]
263
+ end
264
+
265
+ expect(CallbacksSpecified.audited_options[:on]).to eq([:create, :update, :destroy])
266
+ end
267
+ end
268
+
248
269
  if ::ActiveRecord::VERSION::MAJOR >= 7
249
270
  it "should filter encrypted attributes" do
250
271
  user = Models::ActiveRecord::UserWithEncryptedPassword.create(password: "password")
@@ -358,6 +379,12 @@ describe Audited::Auditor do
358
379
  Models::ActiveRecord::OnUpdateDestroy.create!(name: "Bart")
359
380
  }.to_not change(Audited::Audit, :count)
360
381
  end
382
+
383
+ it "should save readonly columns" do
384
+ expect {
385
+ Models::ActiveRecord::UserWithReadOnlyAttrs.create!(name: "Bart")
386
+ }.to change(Audited::Audit, :count)
387
+ end
361
388
  end
362
389
 
363
390
  describe "on update" do
@@ -409,6 +436,16 @@ describe Audited::Auditor do
409
436
  expect { @user.update_attribute :activated, "1" }.to_not change(Audited::Audit, :count)
410
437
  end
411
438
 
439
+ context "with readonly attributes" do
440
+ before do
441
+ @user = create_user_with_readonly_attrs(status: "active")
442
+ end
443
+
444
+ it "should not save readonly columns" do
445
+ expect { @user.update! status: "banned" }.to_not change(Audited::Audit, :count)
446
+ end
447
+ end
448
+
412
449
  describe "with no dirty changes" do
413
450
  it "does not create an audit if the record is not changed" do
414
451
  expect {
data/spec/audited_spec.rb CHANGED
@@ -3,16 +3,12 @@ require "spec_helper"
3
3
  describe Audited do
4
4
  describe "#store" do
5
5
  describe "maintains state of store" do
6
- let(:current_user) { Audited::RequestStore.audited_store }
6
+ let(:current_user) { RequestStore.store[:audited_store] }
7
7
  before { Audited.store[:current_user] = current_user }
8
8
 
9
9
  it "checks store is not nil" do
10
10
  expect(Audited.store[:current_user]).to eq(current_user)
11
11
  end
12
-
13
- it "when executed with Fibers" do
14
- Fiber.new { expect(Audited.store[:current_user]).to eq(current_user) }.resume
15
- end
16
12
  end
17
13
  end
18
14
  end
@@ -3,6 +3,10 @@ module AuditedSpecHelpers
3
3
  Models::ActiveRecord::User.create({name: "Brandon", username: "brandon", password: "password", favourite_device: "Android Phone"}.merge(attrs))
4
4
  end
5
5
 
6
+ def create_user_with_readonly_attrs(attrs = {})
7
+ Models::ActiveRecord::UserWithReadOnlyAttrs.create({name: "Brandon", username: "brandon", password: "password", favourite_device: "Android Phone"}.merge(attrs))
8
+ end
9
+
6
10
  def build_user(attrs = {})
7
11
  Models::ActiveRecord::User.new({name: "darth", username: "darth", password: "noooooooo"}.merge(attrs))
8
12
  end
@@ -30,7 +30,7 @@ module RailsApp
30
30
  ActiveSupport::TimeWithZone ActiveSupport::TimeZone ActiveSupport::HashWithIndifferentAccess]
31
31
  end
32
32
 
33
- if Rails.version >= "7.1"
33
+ if Rails.gem_version >= Gem::Version.new("7.1")
34
34
  config.active_support.cache_format_version = 7.1
35
35
  end
36
36
  end
@@ -5,11 +5,11 @@ module Models
5
5
  module ActiveRecord
6
6
  class User < ::ActiveRecord::Base
7
7
  audited except: :password
8
- attribute :non_column_attr if Rails.version >= "5.1"
8
+ attribute :non_column_attr if Rails.gem_version >= Gem::Version.new("5.1")
9
9
  attr_protected :logins if respond_to?(:attr_protected)
10
10
  enum status: {active: 0, reliable: 1, banned: 2}
11
11
 
12
- if Rails.version >= "7.1"
12
+ if Rails.gem_version >= Gem::Version.new("7.1")
13
13
  serialize :phone_numbers, type: Array
14
14
  else
15
15
  serialize :phone_numbers, Array
@@ -27,7 +27,7 @@ module Models
27
27
 
28
28
  class UserOnlyPassword < ::ActiveRecord::Base
29
29
  self.table_name = :users
30
- attribute :non_column_attr if Rails.version >= "5.1"
30
+ attribute :non_column_attr if Rails.gem_version >= Gem::Version.new("5.1")
31
31
  audited only: :password
32
32
  end
33
33
 
@@ -54,6 +54,12 @@ module Models
54
54
  end
55
55
  end
56
56
 
57
+ class UserWithReadOnlyAttrs < ::ActiveRecord::Base
58
+ self.table_name = :users
59
+ audited
60
+ attr_readonly :status
61
+ end
62
+
57
63
  class CommentRequiredUser < ::ActiveRecord::Base
58
64
  self.table_name = :users
59
65
  audited except: :password, comment_required: true
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: 5.4.1
4
+ version: 5.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
@@ -10,10 +10,10 @@ authors:
10
10
  - Brian Ryckbost
11
11
  - Steve Richert
12
12
  - Ryan Glover
13
- autorequire:
13
+ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2023-11-06 00:00:00.000000000 Z
16
+ date: 2024-01-11 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: activerecord
@@ -24,7 +24,7 @@ dependencies:
24
24
  version: '5.0'
25
25
  - - "<"
26
26
  - !ruby/object:Gem::Version
27
- version: '7.7'
27
+ version: '7.2'
28
28
  type: :runtime
29
29
  prerelease: false
30
30
  version_requirements: !ruby/object:Gem::Requirement
@@ -34,27 +34,21 @@ dependencies:
34
34
  version: '5.0'
35
35
  - - "<"
36
36
  - !ruby/object:Gem::Version
37
- version: '7.7'
37
+ version: '7.2'
38
38
  - !ruby/object:Gem::Dependency
39
- name: activesupport
39
+ name: request_store
40
40
  requirement: !ruby/object:Gem::Requirement
41
41
  requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: '5.0'
45
- - - "<"
42
+ - - "~>"
46
43
  - !ruby/object:Gem::Version
47
- version: '7.7'
44
+ version: '1.2'
48
45
  type: :runtime
49
46
  prerelease: false
50
47
  version_requirements: !ruby/object:Gem::Requirement
51
48
  requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '5.0'
55
- - - "<"
49
+ - - "~>"
56
50
  - !ruby/object:Gem::Version
57
- version: '7.7'
51
+ version: '1.2'
58
52
  - !ruby/object:Gem::Dependency
59
53
  name: appraisal
60
54
  requirement: !ruby/object:Gem::Requirement
@@ -78,7 +72,7 @@ dependencies:
78
72
  version: '5.0'
79
73
  - - "<"
80
74
  - !ruby/object:Gem::Version
81
- version: '7.7'
75
+ version: '7.2'
82
76
  type: :development
83
77
  prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
@@ -88,7 +82,7 @@ dependencies:
88
82
  version: '5.0'
89
83
  - - "<"
90
84
  - !ruby/object:Gem::Version
91
- version: '7.7'
85
+ version: '7.2'
92
86
  - !ruby/object:Gem::Dependency
93
87
  name: rspec-rails
94
88
  requirement: !ruby/object:Gem::Requirement
@@ -187,6 +181,7 @@ extra_rdoc_files: []
187
181
  files:
188
182
  - ".github/workflows/buildlight.yml"
189
183
  - ".github/workflows/ci.yml"
184
+ - ".github/workflows/publish_gem.yml"
190
185
  - ".gitignore"
191
186
  - ".standard.yml"
192
187
  - ".yardopts"
@@ -208,7 +203,6 @@ files:
208
203
  - lib/audited/audit.rb
209
204
  - lib/audited/auditor.rb
210
205
  - lib/audited/railtie.rb
211
- - lib/audited/request_store.rb
212
206
  - lib/audited/rspec_matchers.rb
213
207
  - lib/audited/sweeper.rb
214
208
  - lib/audited/version.rb
@@ -259,7 +253,7 @@ homepage: https://github.com/collectiveidea/audited
259
253
  licenses:
260
254
  - MIT
261
255
  metadata: {}
262
- post_install_message:
256
+ post_install_message:
263
257
  rdoc_options: []
264
258
  require_paths:
265
259
  - lib
@@ -274,8 +268,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
274
268
  - !ruby/object:Gem::Version
275
269
  version: '0'
276
270
  requirements: []
277
- rubygems_version: 3.4.7
278
- signing_key:
271
+ rubygems_version: 3.5.3
272
+ signing_key:
279
273
  specification_version: 4
280
274
  summary: Log all changes to your models
281
275
  test_files: []
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support"
4
-
5
- module Audited
6
- class RequestStore < ActiveSupport::CurrentAttributes
7
- attribute :audited_store
8
- end
9
- end