logidze 0.11.0 → 0.12.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75f1f01b10a1e35d8b656a27f3d71b0e1d2f81c826338fa89d36d76ac03363b9
4
- data.tar.gz: 3812d6d4b49d2fe803acc61854b1ca891ec816bbd4a3e05ff60e02bc62393ac0
3
+ metadata.gz: f13cd8a6226e2595de2a96ecb146e387d2fc2f1d0267e2b9076d822773703b92
4
+ data.tar.gz: 0f2644d225ec6457bcda305158e60a486cdb71e4a6c3cc0b092db930491f60d3
5
5
  SHA512:
6
- metadata.gz: 7b38094dd8e8b7de7295b354e0906067641080e90169f0222b163b43a491672921eff25a78062680650e1e8565727d01dcd4694a84fecbeb7ff60a918d2fbe6c
7
- data.tar.gz: 7ba5a0605b9b45e63bb6c02b9d18b05f78331369ed4aeb2564434d1e627013e360b1ef0ab2f2fdd94203de6ed341d3136d800e2b8aa838d6fe6c501eecb5d98d
6
+ metadata.gz: 21cdbd6b6aa0d8a6295813943671f01d617a62cdf63bfd9df3389941cc29232f00edceaf6f25a1812fcd08f205c2f56cb212fc0c417a215628f7d604ec48e8db
7
+ data.tar.gz: 118d8b66bd7f0f661b6aed153bd08453c21f59afde5f85c712b7278ca19397922cb726dcf96dd5140d0bbe5bf7fb9eecd208bfe7e513b706087c7cdf1bacf850
@@ -28,7 +28,7 @@ Style/TrailingCommaInArrayLiteral:
28
28
  Style/TrailingCommaInHashLiteral:
29
29
  EnforcedStyleForMultiline: no_comma
30
30
 
31
- Layout/AlignParameters:
31
+ Layout/ParameterAlignment:
32
32
  EnforcedStyle: with_first_parameter
33
33
 
34
34
  Lint/Void:
@@ -21,22 +21,26 @@ before_script:
21
21
  - psql -U postgres -d logidze -c 'CREATE EXTENSION IF NOT EXISTS hstore;'
22
22
  - RAILS_ENV=test bundle exec rake dummy:db:create dummy:db:migrate
23
23
 
24
+ before_install:
25
+ - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
26
+ - gem install bundler -v '< 2'
27
+
24
28
  matrix:
25
29
  include:
26
30
  - rvm: ruby-head
27
31
  gemfile: gemfiles/railsmaster.gemfile
28
- - rvm: 2.6.2
32
+ - rvm: 2.7
29
33
  gemfile: gemfiles/rails6.gemfile
30
- - rvm: 2.6.2
34
+ - rvm: 2.6
31
35
  gemfile: gemfiles/rails5.gemfile
32
- - rvm: 2.5.1
36
+ - rvm: 2.5
33
37
  gemfile: gemfiles/rails52.gemfile
34
- - rvm: 2.4.1
38
+ - rvm: 2.4
35
39
  gemfile: gemfiles/rails5.gemfile
36
- - rvm: 2.4.1
40
+ - rvm: 2.4
37
41
  gemfile: gemfiles/rails42.gemfile
38
42
  allow_failures:
39
43
  - rvm: ruby-head
40
44
  gemfile: gemfiles/railsmaster.gemfile
41
- - rvm: 2.5.0
45
+ - rvm: 2.5
42
46
  gemfile: gemfiles/railsmaster.gemfile
@@ -1,7 +1,28 @@
1
+
1
2
  # Change log
2
3
 
3
4
  ## master (unreleased)
4
5
 
6
+ ## 0.12.0 (2020-01-02)
7
+
8
+ - PR [#143](https://github.com/palkan/logidze/pull/143) Add `:transactional` option to `#with_meta` and `#with_responsible` ([@oleg-kiviljov][])
9
+
10
+ Now it's possible to set meta and responsible without wrapping the block into a DB transaction. For backward compatibility `:transactional` option by default is set to `true`.
11
+
12
+ Usage:
13
+
14
+ ```ruby
15
+ Logidze.with_meta({ip: request.ip}, transactional: false) do
16
+ post.save!
17
+ end
18
+ ```
19
+ or
20
+ ```ruby
21
+ Logidze.with_responsible(user.id, transactional: false) do
22
+ post.save!
23
+ end
24
+ ```
25
+
5
26
  ## 0.11.0 (2019-08-15)
6
27
 
7
28
  - **Breaking** Return `nil` when `log_data` is not loaded instead of raising an exception. ([@palkan][])
@@ -284,3 +305,4 @@ This is a quick fix for a more general problem (see [#59](https://github.com/pal
284
305
  [@dmitrytsepelev]: https://github.com/DmitryTsepelev
285
306
  [@zocoi]: https://github.com/zocoi
286
307
  [@duderman]: https://github.com/duderman
308
+ [@oleg-kiviljov]: https://github.com/oleg-kiviljov
data/Gemfile CHANGED
@@ -11,5 +11,5 @@ local_gemfile = "#{File.dirname(__FILE__)}/Gemfile.local"
11
11
  if File.exist?(local_gemfile)
12
12
  eval(File.read(local_gemfile)) # rubocop:disable Lint/Eval
13
13
  else
14
- gem 'activerecord', '~> 5.1.1'
14
+ gem 'activerecord', '~> 6.0'
15
15
  end
data/README.md CHANGED
@@ -261,6 +261,14 @@ end
261
261
 
262
262
  Meta expects a hash to be passed so you won't need to encode and decode JSON manually.
263
263
 
264
+ By default `.with_meta` wraps the block into a DB transaction. That could lead to an unexpected behavior, especially, when using `.with_meta` within an around_action. To avoid wrapping the block into a DB transaction use `transactional: false` option.
265
+
266
+ ```ruby
267
+ Logidze.with_meta({ip: request.ip}, transactional: false) do
268
+ post.save!
269
+ end
270
+ ```
271
+
264
272
  ## Track responsibility (aka _whodunnit_)
265
273
 
266
274
  A special application of meta information is storing the author of the change, which is called _Responsible ID_. There is more likely that you would like to store the `current_user.id` that way.
@@ -304,6 +312,13 @@ class ApplicationController < ActionController::Base
304
312
  end
305
313
  ```
306
314
 
315
+ By default `.with_responsible` wraps the block into a DB transaction. That could lead to an unexpected behavior, especially, when using `.with_responsible` within an around_action. To avoid wrapping the block into a DB transaction use `transactional: false` option.
316
+
317
+ ```ruby
318
+ Logidze.with_responsible(user.id, transactional: false) do
319
+ post.save!
320
+ end
321
+ ```
307
322
  ## Disable logging temporary
308
323
 
309
324
  If you want to make update without logging (e.g., mass update), you can turn it off the following way:
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '6.0.0.rc1'
3
+ gem 'rails', '~> 6.0'
4
4
  gem 'rspec-rails', '>= 3.5'
5
5
 
6
- gemspec path: '..'
6
+ gemspec path: '..'
@@ -11,8 +11,8 @@ module Logidze
11
11
  # Include methods to work with history.
12
12
  #
13
13
  def has_logidze(ignore_log_data: Logidze.ignore_log_data_by_default)
14
- include Logidze::Model
15
14
  include Logidze::IgnoreLogData
15
+ include Logidze::Model
16
16
 
17
17
  @ignore_log_data = ignore_log_data
18
18
 
@@ -7,6 +7,7 @@ module Logidze
7
7
  included do
8
8
  if Rails::VERSION::MAJOR == 4
9
9
  require "logidze/ignore_log_data/ignored_columns"
10
+ attribute :log_data, ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Jsonb.new
10
11
  elsif Rails::VERSION::MAJOR == 5
11
12
  require "logidze/ignore_log_data/cast_attribute_patch"
12
13
  include CastAttributePatch
@@ -3,18 +3,19 @@
3
3
  module Logidze # :nodoc:
4
4
  # Provide methods to attach meta information
5
5
  module Meta
6
- def with_meta(meta, &block)
7
- MetaTransaction.wrap_with(meta, &block)
6
+ def with_meta(meta, transactional: true, &block)
7
+ wrapper = transactional ? MetaWithTransaction : MetaWithoutTransaction
8
+ wrapper.wrap_with(meta, &block)
8
9
  end
9
10
 
10
- def with_responsible(responsible_id, &block)
11
+ def with_responsible(responsible_id, transactional: true, &block)
11
12
  return yield if responsible_id.nil?
12
13
 
13
14
  meta = {Logidze::History::Version::META_RESPONSIBLE => responsible_id}
14
- with_meta(meta, &block)
15
+ with_meta(meta, transactional: transactional, &block)
15
16
  end
16
17
 
17
- class MetaTransaction # :nodoc:
18
+ class MetaWrapper # :nodoc:
18
19
  def self.wrap_with(meta, &block)
19
20
  new(meta, &block).perform
20
21
  end
@@ -29,14 +30,12 @@ module Logidze # :nodoc:
29
30
  end
30
31
 
31
32
  def perform
32
- return if block.nil?
33
+ raise ArgumentError, "Block must be given" unless block
33
34
  return block.call if meta.nil?
34
35
 
35
- ActiveRecord::Base.transaction { call_block_in_meta_context }
36
+ call_block_in_meta_context
36
37
  end
37
38
 
38
- private
39
-
40
39
  def call_block_in_meta_context
41
40
  prev_meta = current_meta
42
41
 
@@ -44,10 +43,9 @@ module Logidze # :nodoc:
44
43
 
45
44
  pg_set_meta_param(current_meta)
46
45
  result = block.call
47
- pg_reset_meta_param(prev_meta)
48
-
49
46
  result
50
47
  ensure
48
+ pg_reset_meta_param(prev_meta)
51
49
  meta_stack.pop
52
50
  end
53
51
 
@@ -60,20 +58,49 @@ module Logidze # :nodoc:
60
58
  Thread.current[:meta]
61
59
  end
62
60
 
63
- def pg_set_meta_param(value)
64
- encoded_meta = connection.quote(ActiveSupport::JSON.encode(value))
65
- connection.execute("SET LOCAL logidze.meta = #{encoded_meta};")
61
+ def encode_meta(value)
62
+ connection.quote(ActiveSupport::JSON.encode(value))
66
63
  end
67
64
 
68
65
  def pg_reset_meta_param(prev_meta)
69
66
  if prev_meta.empty?
70
- connection.execute("SET LOCAL logidze.meta TO DEFAULT;")
67
+ pg_clear_meta_param
71
68
  else
72
69
  pg_set_meta_param(prev_meta)
73
70
  end
74
71
  end
75
72
  end
76
73
 
77
- private_constant :MetaTransaction
74
+ class MetaWithTransaction < MetaWrapper # :nodoc:
75
+ private
76
+
77
+ def call_block_in_meta_context
78
+ connection.transaction { super }
79
+ end
80
+
81
+ def pg_set_meta_param(value)
82
+ connection.execute("SET LOCAL logidze.meta = #{encode_meta(value)};")
83
+ end
84
+
85
+ def pg_clear_meta_param
86
+ connection.execute("SET LOCAL logidze.meta TO DEFAULT;")
87
+ end
88
+ end
89
+
90
+ class MetaWithoutTransaction < MetaWrapper # :nodoc:
91
+ private
92
+
93
+ def pg_set_meta_param(value)
94
+ connection.execute("SET logidze.meta = #{encode_meta(value)};")
95
+ end
96
+
97
+ def pg_clear_meta_param
98
+ connection.execute("SET logidze.meta TO DEFAULT;")
99
+ end
100
+ end
101
+
102
+ private_constant :MetaWrapper
103
+ private_constant :MetaWithTransaction
104
+ private_constant :MetaWithoutTransaction
78
105
  end
79
106
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Logidze
4
- VERSION = "0.11.0"
4
+ VERSION = "0.12.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logidze
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - palkan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-15 00:00:00.000000000 Z
11
+ date: 2020-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -191,7 +191,6 @@ files:
191
191
  - lib/logidze/history/type.rb
192
192
  - lib/logidze/history/version.rb
193
193
  - lib/logidze/ignore_log_data.rb
194
- - lib/logidze/ignore_log_data/association.rb
195
194
  - lib/logidze/ignore_log_data/cast_attribute_patch.rb
196
195
  - lib/logidze/ignore_log_data/ignored_columns.rb
197
196
  - lib/logidze/meta.rb
@@ -224,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
223
  - !ruby/object:Gem::Version
225
224
  version: '0'
226
225
  requirements: []
227
- rubygems_version: 3.0.4
226
+ rubygems_version: 3.0.6
228
227
  signing_key:
229
228
  specification_version: 4
230
229
  summary: PostgreSQL JSON-based auditing
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Logidze
4
- module IgnoreLogData
5
- module Association # :nodoc:
6
- def target_scope
7
- super.with_log_data
8
- end
9
- end
10
- end
11
- end