logidze 0.6.5 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +2 -0
- data/CHANGELOG.md +25 -0
- data/README.md +15 -3
- data/gemfiles/rails5.gemfile +1 -1
- data/gemfiles/rails52.gemfile +6 -0
- data/lib/generators/logidze/install/templates/migration.rb.erb +5 -5
- data/lib/logidze.rb +2 -2
- data/lib/logidze/history.rb +1 -1
- data/lib/logidze/history/version.rb +9 -1
- data/lib/logidze/meta.rb +77 -0
- data/lib/logidze/version.rb +1 -1
- data/lib/logidze/versioned_association.rb +2 -2
- metadata +4 -4
- data/circle.yml +0 -15
- data/lib/logidze/responsible.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfd80509e728582e7c8b3629a6704d7d2d7b8d4e835974df0bd10dac03333348
|
4
|
+
data.tar.gz: 5f3f386533f330d41d4acaeaf9e724df4a3d1ee3851cd99dbbff4ab5b6573546
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a17ac5c2fb65280a3897c5f672d0d0ef719870cd8f019a0d525e314d0c60795e5fda4068ba3fb0b1003f2ec5a848b3a2150237d29256fa8828a8401e775afcb6
|
7
|
+
data.tar.gz: f9023b0b9731f9ddbb28fda06ae07995eb0e0a7cb33778238d582e82d8752632c7ca3fa84bfbe639ce2553fbe9c4b10dbaf0dc92d361f01deb08a2d97aebc447
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,29 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.7.0 (2018-08-29)
|
6
|
+
|
7
|
+
- [Fixes [#75](https://github.com/palkan/logidze/issues/70)] Fix association versioning with an optional belongs to ([@ankursethi-uscis][])
|
8
|
+
|
9
|
+
- [PR [#79](https://github.com/palkan/logidze/pull/13)] Allow adding meta information to versions using `with_meta` (addressed [Issue [#60]](https://github.com/palkan/logidze/issues/60)). ([@DmitryTsepelev][])
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
Logidze.with_meta(ip: request.ip) { post.save }
|
15
|
+
puts post.meta # => { 'ip' => '95.66.157.226' }
|
16
|
+
```
|
17
|
+
|
18
|
+
How to upgrade.
|
19
|
+
|
20
|
+
Please run `rails generate logidze:install --update` to regenerate stored functions.
|
21
|
+
|
22
|
+
This feature replaces the implementation of `with_responsible`, now `responsible_id` is stored inside of the meta hash with the key `_r`.
|
23
|
+
|
24
|
+
There is fallback to the old data structure (`{ 'r' => 42 }` opposed to `{ 'm' => { '_r' => 42 } }` in the current implementation), so `responsible_id` should work as usual for the existing data.
|
25
|
+
|
26
|
+
If you've accessed the value manually (e.g. `post.log_data.current_version.data['r']`), you'll have to add the fallback too.
|
27
|
+
|
5
28
|
## 0.6.5 (2018-08-08)
|
6
29
|
|
7
30
|
- Make compatible with Rails 5.2.1 ([@palkan][])
|
@@ -99,3 +122,5 @@ This is a quick fix for a more general problem (see [#59](https://github.com/pal
|
|
99
122
|
[@charlie-wasp]: https://github.com/charlie-wasp
|
100
123
|
[@akxcv]: https://github.com/akxcv
|
101
124
|
[@vassilevsky]: https://github.com/vassilevsky
|
125
|
+
[@ankursethi-uscis]: https://github.com/ankursethi-uscis
|
126
|
+
[@DmitryTsepelev]: https://github.com/DmitryTsepelev
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
[![
|
2
|
-
[![
|
1
|
+
[![Cult Of Martians](http://cultofmartians.com/assets/badges/badge.svg)](http://cultofmartians.com)
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/logidze.svg)](https://rubygems.org/gems/logidze) [![Build Status](https://travis-ci.org/palkan/logidze.svg?branch=master)](https://travis-ci.org/palkan/logidze)
|
3
3
|
[![Open Source Helpers](https://www.codetriage.com/palkan/logidze/badges/users.svg)](https://www.codetriage.com/palkan/logidze)
|
4
4
|
|
5
5
|
# Logidze
|
@@ -207,9 +207,21 @@ Logidze.append_on_undo = true
|
|
207
207
|
```
|
208
208
|
|
209
209
|
|
210
|
+
## Track meta information
|
211
|
+
|
212
|
+
You can store any meta information you want inside your version (it could be IP address, user agent etc). In order to add it you should wrap your code with a block:
|
213
|
+
|
214
|
+
```ruby
|
215
|
+
Logidze.with_meta(ip: request.ip) do
|
216
|
+
post.save!
|
217
|
+
end
|
218
|
+
```
|
219
|
+
|
220
|
+
Meta expects a hash to be passed so you won't need to encode and decode JSON manually.
|
221
|
+
|
210
222
|
## Track responsibility (aka _whodunnit_)
|
211
223
|
|
212
|
-
|
224
|
+
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.
|
213
225
|
|
214
226
|
To provide `responsible_id` you should wrap your code in a block:
|
215
227
|
|
data/gemfiles/rails5.gemfile
CHANGED
@@ -8,7 +8,7 @@ class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::VE
|
|
8
8
|
DO $$
|
9
9
|
BEGIN
|
10
10
|
EXECUTE 'ALTER DATABASE ' || quote_ident(current_database()) || ' SET logidze.disabled=' || quote_literal('');
|
11
|
-
EXECUTE 'ALTER DATABASE ' || quote_ident(current_database()) || ' SET logidze.
|
11
|
+
EXECUTE 'ALTER DATABASE ' || quote_ident(current_database()) || ' SET logidze.meta=' || quote_literal('');
|
12
12
|
END;
|
13
13
|
$$
|
14
14
|
LANGUAGE plpgsql;
|
@@ -37,8 +37,8 @@ class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::VE
|
|
37
37
|
'c',
|
38
38
|
logidze_exclude_keys(data, VARIADIC array_append(blacklist, 'log_data'))
|
39
39
|
);
|
40
|
-
IF coalesce(#{current_setting('logidze.
|
41
|
-
buf := jsonb_set(buf, ARRAY['
|
40
|
+
IF coalesce(#{current_setting('logidze.meta')}, '') <> '' THEN
|
41
|
+
buf := jsonb_set(buf, ARRAY['m'], current_setting('logidze.meta')::jsonb);
|
42
42
|
END IF;
|
43
43
|
RETURN buf;
|
44
44
|
END;
|
@@ -92,8 +92,8 @@ class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::VE
|
|
92
92
|
(log_data#>'{h,0,c}') || (log_data#>'{h,1,c}')
|
93
93
|
);
|
94
94
|
|
95
|
-
IF (log_data#>'{h,1}' ? '
|
96
|
-
merged := jsonb_set(merged, ARRAY['
|
95
|
+
IF (log_data#>'{h,1}' ? 'm') THEN
|
96
|
+
merged := jsonb_set(merged, ARRAY['m'], log_data#>'{h,1,m}');
|
97
97
|
END IF;
|
98
98
|
|
99
99
|
return jsonb_set(
|
data/lib/logidze.rb
CHANGED
@@ -8,9 +8,9 @@ module Logidze
|
|
8
8
|
require 'logidze/model'
|
9
9
|
require 'logidze/versioned_association'
|
10
10
|
require 'logidze/has_logidze'
|
11
|
-
require 'logidze/
|
11
|
+
require 'logidze/meta'
|
12
12
|
|
13
|
-
extend Logidze::
|
13
|
+
extend Logidze::Meta
|
14
14
|
|
15
15
|
require 'logidze/engine' if defined?(Rails)
|
16
16
|
|
data/lib/logidze/history.rb
CHANGED
@@ -9,6 +9,10 @@ module Logidze
|
|
9
9
|
CHANGES = 'c'
|
10
10
|
# Responsible ID
|
11
11
|
RESPONSIBLE = 'r'
|
12
|
+
# Meta Responsible ID
|
13
|
+
META_RESPONSIBLE = '_r'
|
14
|
+
# Meta key
|
15
|
+
META = 'm'
|
12
16
|
|
13
17
|
attr_reader :data
|
14
18
|
|
@@ -29,7 +33,11 @@ module Logidze
|
|
29
33
|
end
|
30
34
|
|
31
35
|
def responsible_id
|
32
|
-
data[RESPONSIBLE]
|
36
|
+
meta && meta[META_RESPONSIBLE] || data[RESPONSIBLE]
|
37
|
+
end
|
38
|
+
|
39
|
+
def meta
|
40
|
+
data[META]
|
33
41
|
end
|
34
42
|
end
|
35
43
|
end
|
data/lib/logidze/meta.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Logidze # :nodoc:
|
4
|
+
# Provide methods to attach meta information
|
5
|
+
module Meta
|
6
|
+
def with_meta(meta, &block)
|
7
|
+
MetaTransaction.wrap_with(meta, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def with_responsible(responsible_id, &block)
|
11
|
+
return yield if responsible_id.nil?
|
12
|
+
meta = { Logidze::History::Version::META_RESPONSIBLE => responsible_id }
|
13
|
+
with_meta(meta, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
class MetaTransaction # :nodoc:
|
17
|
+
def self.wrap_with(meta, &block)
|
18
|
+
new(meta, &block).perform
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :meta, :block
|
22
|
+
|
23
|
+
delegate :connection, to: ActiveRecord::Base
|
24
|
+
|
25
|
+
def initialize(meta, &block)
|
26
|
+
@meta = meta
|
27
|
+
@block = block
|
28
|
+
end
|
29
|
+
|
30
|
+
def perform
|
31
|
+
return if block.nil?
|
32
|
+
return block.call if meta.nil?
|
33
|
+
ActiveRecord::Base.transaction { call_block_in_meta_context }
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def call_block_in_meta_context
|
39
|
+
prev_meta = current_meta
|
40
|
+
|
41
|
+
meta_stack.push(meta)
|
42
|
+
|
43
|
+
pg_set_meta_param(current_meta)
|
44
|
+
result = block.call
|
45
|
+
pg_reset_meta_param(prev_meta)
|
46
|
+
|
47
|
+
result
|
48
|
+
ensure
|
49
|
+
meta_stack.pop
|
50
|
+
end
|
51
|
+
|
52
|
+
def current_meta
|
53
|
+
meta_stack.reduce(:merge) || {}
|
54
|
+
end
|
55
|
+
|
56
|
+
def meta_stack
|
57
|
+
Thread.current[:meta] ||= []
|
58
|
+
Thread.current[:meta]
|
59
|
+
end
|
60
|
+
|
61
|
+
def pg_set_meta_param(value)
|
62
|
+
encoded_meta = connection.quote(ActiveSupport::JSON.encode(value))
|
63
|
+
connection.execute("SET LOCAL logidze.meta = #{encoded_meta};")
|
64
|
+
end
|
65
|
+
|
66
|
+
def pg_reset_meta_param(prev_meta)
|
67
|
+
if prev_meta.empty?
|
68
|
+
connection.execute("SET LOCAL logidze.meta TO DEFAULT;")
|
69
|
+
else
|
70
|
+
pg_set_meta_param(prev_meta)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private_constant :MetaTransaction
|
76
|
+
end
|
77
|
+
end
|
data/lib/logidze/version.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# `inversed` attr_accessor has been removed in Rails 5.2.1
|
4
4
|
# See https://github.com/rails/rails/commit/39e57daffb9ff24726b1e86dfacf76836dd0637b#diff-c47e1c26ae8a3d486119e0cc91f40a30
|
5
|
-
unless ::ActiveRecord::Associations::Association.instance_methods.include?(:
|
5
|
+
unless ::ActiveRecord::Associations::Association.instance_methods.include?(:inversed)
|
6
6
|
using(Module.new do
|
7
7
|
refine ::ActiveRecord::Associations::Association do
|
8
8
|
attr_reader :inversed
|
@@ -15,7 +15,7 @@ module Logidze # :nodoc: all
|
|
15
15
|
# rubocop: disable Metrics/MethodLength, Metrics/AbcSize
|
16
16
|
def load_target
|
17
17
|
target = super
|
18
|
-
|
18
|
+
return unless target
|
19
19
|
return target if inversed
|
20
20
|
|
21
21
|
time = owner.logidze_requested_ts
|
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.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -211,9 +211,9 @@ files:
|
|
211
211
|
- bench/triggers/keys_trigger_setup.sql
|
212
212
|
- bin/console
|
213
213
|
- bin/setup
|
214
|
-
- circle.yml
|
215
214
|
- gemfiles/rails42.gemfile
|
216
215
|
- gemfiles/rails5.gemfile
|
216
|
+
- gemfiles/rails52.gemfile
|
217
217
|
- gemfiles/railsmaster.gemfile
|
218
218
|
- lib/generators/logidze/install/USAGE
|
219
219
|
- lib/generators/logidze/install/install_generator.rb
|
@@ -228,9 +228,9 @@ files:
|
|
228
228
|
- lib/logidze/history.rb
|
229
229
|
- lib/logidze/history/type.rb
|
230
230
|
- lib/logidze/history/version.rb
|
231
|
+
- lib/logidze/meta.rb
|
231
232
|
- lib/logidze/migration.rb
|
232
233
|
- lib/logidze/model.rb
|
233
|
-
- lib/logidze/responsible.rb
|
234
234
|
- lib/logidze/version.rb
|
235
235
|
- lib/logidze/versioned_association.rb
|
236
236
|
- logidze.gemspec
|
data/circle.yml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
machine:
|
2
|
-
ruby:
|
3
|
-
version: 2.5.0
|
4
|
-
|
5
|
-
environment:
|
6
|
-
DATABASE_URL: postgres://postgres@127.0.0.1:5432/test_database
|
7
|
-
|
8
|
-
dependencies:
|
9
|
-
pre:
|
10
|
-
- gem install bundler -v 1.11.2
|
11
|
-
|
12
|
-
database:
|
13
|
-
override:
|
14
|
-
- bundle exec rake dummy:db:test:prepare
|
15
|
-
|
data/lib/logidze/responsible.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module Logidze # :nodoc:
|
3
|
-
# Provide methods to work with "responsibility" feature
|
4
|
-
module Responsible
|
5
|
-
def with_responsible(responsible_id)
|
6
|
-
return yield if responsible_id.nil?
|
7
|
-
ActiveRecord::Base.transaction do
|
8
|
-
ActiveRecord::Base.connection.execute(
|
9
|
-
"SET LOCAL logidze.responsible = #{ActiveRecord::Base.connection.quote(responsible_id)};"
|
10
|
-
)
|
11
|
-
res = yield
|
12
|
-
ActiveRecord::Base.connection.execute "SET LOCAL logidze.responsible TO DEFAULT;"
|
13
|
-
res
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|