logidze 0.8.1 → 1.0.0.rc1
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 +4 -4
- data/CHANGELOG.md +124 -5
- data/LICENSE.txt +1 -1
- data/README.md +310 -80
- data/lib/generators/logidze/fx_helper.rb +17 -0
- data/lib/generators/logidze/inject_sql.rb +18 -0
- data/lib/generators/logidze/install/USAGE +6 -1
- data/lib/generators/logidze/install/functions/logidze_compact_history.sql +38 -0
- data/lib/generators/logidze/install/functions/logidze_filter_keys.sql +27 -0
- data/lib/generators/logidze/install/functions/logidze_logger.sql +150 -0
- data/lib/generators/logidze/install/functions/logidze_snapshot.sql +24 -0
- data/lib/generators/logidze/install/functions/logidze_version.sql +20 -0
- data/lib/generators/logidze/install/install_generator.rb +61 -3
- data/lib/generators/logidze/install/templates/hstore.rb.erb +1 -1
- data/lib/generators/logidze/install/templates/migration.rb.erb +19 -232
- data/lib/generators/logidze/install/templates/migration_fx.rb.erb +41 -0
- data/lib/generators/logidze/model/model_generator.rb +56 -20
- data/lib/generators/logidze/model/templates/migration.rb.erb +57 -36
- data/lib/generators/logidze/model/triggers/logidze.sql +6 -0
- data/lib/logidze.rb +43 -20
- data/lib/logidze/engine.rb +4 -1
- data/lib/logidze/has_logidze.rb +12 -3
- data/lib/logidze/history.rb +7 -15
- data/lib/logidze/history/type.rb +1 -1
- data/lib/logidze/history/version.rb +6 -5
- data/lib/logidze/ignore_log_data.rb +22 -0
- data/lib/logidze/ignore_log_data/cast_attribute_patch.rb +17 -0
- data/lib/logidze/meta.rb +44 -17
- data/lib/logidze/model.rb +65 -37
- data/lib/logidze/version.rb +2 -1
- data/lib/logidze/versioned_association.rb +0 -1
- metadata +47 -103
- data/.gitignore +0 -40
- data/.hound.yml +0 -3
- data/.rubocop.yml +0 -94
- data/.travis.yml +0 -39
- data/Gemfile +0 -13
- data/Rakefile +0 -28
- data/bench/performance/README.md +0 -109
- data/bench/performance/diff_bench.rb +0 -36
- data/bench/performance/insert_bench.rb +0 -20
- data/bench/performance/memory_profile.rb +0 -53
- data/bench/performance/setup.rb +0 -308
- data/bench/performance/update_bench.rb +0 -36
- data/bench/triggers/Makefile +0 -56
- data/bench/triggers/Readme.md +0 -58
- data/bench/triggers/bench.sql +0 -6
- data/bench/triggers/hstore_trigger_setup.sql +0 -38
- data/bench/triggers/jsonb_minus_2_setup.sql +0 -47
- data/bench/triggers/jsonb_minus_setup.sql +0 -49
- data/bench/triggers/keys2_trigger_setup.sql +0 -44
- data/bench/triggers/keys_trigger_setup.sql +0 -50
- data/bin/console +0 -8
- data/bin/setup +0 -9
- data/gemfiles/rails42.gemfile +0 -5
- data/gemfiles/rails5.gemfile +0 -6
- data/gemfiles/rails52.gemfile +0 -6
- data/gemfiles/railsmaster.gemfile +0 -7
- data/lib/logidze/migration.rb +0 -19
- data/logidze.gemspec +0 -33
data/lib/logidze/history/type.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Logidze
|
3
4
|
class History
|
4
5
|
# Represents one log item
|
5
6
|
class Version
|
6
7
|
# Timestamp key
|
7
|
-
TS =
|
8
|
+
TS = "ts"
|
8
9
|
# Changes key
|
9
|
-
CHANGES =
|
10
|
+
CHANGES = "c"
|
10
11
|
# Responsible ID
|
11
|
-
RESPONSIBLE =
|
12
|
+
RESPONSIBLE = "r"
|
12
13
|
# Meta Responsible ID
|
13
|
-
META_RESPONSIBLE =
|
14
|
+
META_RESPONSIBLE = "_r"
|
14
15
|
# Meta key
|
15
|
-
META =
|
16
|
+
META = "m"
|
16
17
|
|
17
18
|
attr_reader :data
|
18
19
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Logidze
|
4
|
+
module IgnoreLogData # :nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
if Rails::VERSION::MAJOR == 5
|
9
|
+
require "logidze/ignore_log_data/cast_attribute_patch"
|
10
|
+
include CastAttributePatch
|
11
|
+
end
|
12
|
+
|
13
|
+
scope :with_log_data, lambda {
|
14
|
+
if ignored_columns == ["log_data"]
|
15
|
+
select(arel_table[Arel.star])
|
16
|
+
else
|
17
|
+
select(column_names + [arel_table[:log_data]])
|
18
|
+
end
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Logidze
|
4
|
+
module IgnoreLogData
|
5
|
+
# Fixes unexpected behavior (see more https://github.com/rails/rails/pull/34528):
|
6
|
+
# instead of using a type passed to `attribute` call, ignored column uses
|
7
|
+
# a type coming from the DB (in this case `.log_data` would return a plain hash
|
8
|
+
# instead of `Logidze::History`)
|
9
|
+
module CastAttributePatch
|
10
|
+
def log_data
|
11
|
+
return attributes["log_data"] if attributes["log_data"].is_a?(Logidze::History)
|
12
|
+
|
13
|
+
self.log_data = Logidze::History::Type.new.cast_value(super)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/logidze/meta.rb
CHANGED
@@ -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
|
-
|
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
|
-
meta = {
|
14
|
-
with_meta(meta, &block)
|
14
|
+
meta = {Logidze::History::Version::META_RESPONSIBLE => responsible_id}
|
15
|
+
with_meta(meta, transactional: transactional, &block)
|
15
16
|
end
|
16
17
|
|
17
|
-
class
|
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
|
-
|
33
|
+
raise ArgumentError, "Block must be given" unless block
|
33
34
|
return block.call if meta.nil?
|
34
35
|
|
35
|
-
|
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
|
64
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/logidze/model.rb
CHANGED
@@ -1,45 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require "active_support"
|
3
4
|
|
4
5
|
module Logidze
|
5
|
-
|
6
|
-
def self.show_ts_deprecation_for(meth)
|
7
|
-
warn(
|
8
|
-
"[Deprecation] Usage of #{meth}(time) will be removed in the future releases, "\
|
9
|
-
"use #{meth}(time: ts) instead"
|
10
|
-
)
|
11
|
-
end
|
12
|
-
end
|
6
|
+
using RubyNext
|
13
7
|
|
14
8
|
# Extends model with methods to browse history
|
15
|
-
# rubocop: disable Metrics/ModuleLength
|
16
9
|
module Model
|
17
|
-
require
|
10
|
+
require "logidze/history/type"
|
18
11
|
|
19
12
|
extend ActiveSupport::Concern
|
20
13
|
|
21
14
|
included do
|
22
|
-
|
23
|
-
serialize :log_data, Logidze::History
|
24
|
-
else
|
25
|
-
attribute :log_data, Logidze::History::Type.new
|
26
|
-
end
|
15
|
+
attribute :log_data, Logidze::History::Type.new
|
27
16
|
|
28
17
|
delegate :version, to: :log_data, prefix: "log"
|
29
18
|
end
|
30
19
|
|
31
20
|
module ClassMethods # :nodoc:
|
32
21
|
# Return records reverted to specified time
|
33
|
-
def at(
|
34
|
-
|
35
|
-
time ||= ts
|
36
|
-
all.map { |record| record.at(time: time, version: version) }.compact
|
22
|
+
def at(time: nil, version: nil)
|
23
|
+
all.to_a.filter_map { |record| record.at(time: time, version: version) }
|
37
24
|
end
|
38
25
|
|
39
26
|
# Return changes made to records since specified time
|
40
|
-
def diff_from(
|
41
|
-
Deprecations.show_ts_deprecation_for(".diff_from") if ts
|
42
|
-
time ||= ts
|
27
|
+
def diff_from(time: nil, version: nil)
|
43
28
|
all.map { |record| record.diff_from(time: time, version: version) }
|
44
29
|
end
|
45
30
|
|
@@ -53,6 +38,33 @@ module Logidze
|
|
53
38
|
true
|
54
39
|
end
|
55
40
|
# rubocop: enable Naming/PredicateName
|
41
|
+
|
42
|
+
# Nullify log_data column for a association
|
43
|
+
def reset_log_data
|
44
|
+
without_logging { update_all(log_data: nil) }
|
45
|
+
end
|
46
|
+
|
47
|
+
# Initialize log_data with the current state if it's null
|
48
|
+
def create_logidze_snapshot(timestamp: nil, only: nil, except: nil)
|
49
|
+
args = ["'null'"]
|
50
|
+
|
51
|
+
args[0] = "'#{timestamp}'" if timestamp
|
52
|
+
|
53
|
+
columns = only || except
|
54
|
+
|
55
|
+
if columns
|
56
|
+
args[1] = "'{#{columns.join(",")}}'"
|
57
|
+
args[2] = only ? "true" : "false"
|
58
|
+
end
|
59
|
+
|
60
|
+
without_logging do
|
61
|
+
where(log_data: nil).update_all(
|
62
|
+
<<~SQL
|
63
|
+
log_data = logidze_snapshot(to_jsonb(#{quoted_table_name}), #{args.join(", ")})
|
64
|
+
SQL
|
65
|
+
)
|
66
|
+
end
|
67
|
+
end
|
56
68
|
end
|
57
69
|
|
58
70
|
# Use this to convert Ruby time to milliseconds
|
@@ -64,14 +76,15 @@ module Logidze
|
|
64
76
|
# If time/version is less then the first version, then return nil.
|
65
77
|
# If time/version is greater then the last version, then return self.
|
66
78
|
# rubocop: disable Metrics/MethodLength
|
67
|
-
def at(
|
68
|
-
Deprecations.show_ts_deprecation_for("#at") if ts
|
69
|
-
|
79
|
+
def at(time: nil, version: nil)
|
70
80
|
return at_version(version) if version
|
71
81
|
|
72
|
-
time ||= ts
|
73
82
|
time = parse_time(time)
|
74
83
|
|
84
|
+
unless log_data
|
85
|
+
return Logidze.return_self_if_log_data_is_empty ? self : nil
|
86
|
+
end
|
87
|
+
|
75
88
|
return nil unless log_data.exists_ts?(time)
|
76
89
|
|
77
90
|
if log_data.current_ts?(time)
|
@@ -86,12 +99,11 @@ module Logidze
|
|
86
99
|
# rubocop: enable Metrics/MethodLength
|
87
100
|
|
88
101
|
# Revert record to the version at specified time (without saving to DB)
|
89
|
-
def at!(
|
90
|
-
Deprecations.show_ts_deprecation_for("#at!") if ts
|
91
|
-
|
102
|
+
def at!(time: nil, version: nil)
|
92
103
|
return at_version!(version) if version
|
93
104
|
|
94
|
-
|
105
|
+
raise ArgumentError, "#log_data is empty" unless log_data
|
106
|
+
|
95
107
|
time = parse_time(time)
|
96
108
|
|
97
109
|
return self if log_data.current_ts?(time)
|
@@ -114,6 +126,8 @@ module Logidze
|
|
114
126
|
|
115
127
|
# Revert record to the specified version (without saving to DB)
|
116
128
|
def at_version!(version)
|
129
|
+
raise ArgumentError, "#log_data is empty" unless log_data
|
130
|
+
|
117
131
|
return self if log_data.version == version
|
118
132
|
return false unless log_data.find_by_version(version)
|
119
133
|
|
@@ -126,17 +140,15 @@ module Logidze
|
|
126
140
|
#
|
127
141
|
# post.diff_from(time: 2.days.ago) # or post.diff_from(version: 2)
|
128
142
|
# #=> { "id" => 1, "changes" => { "title" => { "old" => "Hello!", "new" => "World" } } }
|
129
|
-
def diff_from(
|
130
|
-
Deprecations.show_ts_deprecation_for("#diff_from") if ts
|
131
|
-
time ||= ts
|
143
|
+
def diff_from(version: nil, time: nil)
|
132
144
|
time = parse_time(time) if time
|
133
|
-
changes = log_data
|
145
|
+
changes = log_data&.diff_from(time: time, version: version)&.tap do |v|
|
134
146
|
deserialize_changes!(v)
|
135
|
-
end
|
147
|
+
end || {}
|
136
148
|
|
137
149
|
changes.delete_if { |k, _v| deleted_column?(k) }
|
138
150
|
|
139
|
-
{
|
151
|
+
{"id" => id, "changes" => changes}
|
140
152
|
end
|
141
153
|
|
142
154
|
# Restore record to the previous version.
|
@@ -199,6 +211,22 @@ module Logidze
|
|
199
211
|
log_data&.size || 0
|
200
212
|
end
|
201
213
|
|
214
|
+
# Loads log_data field from the database, stores to the attributes hash and returns it
|
215
|
+
def reload_log_data
|
216
|
+
self.log_data = self.class.where(self.class.primary_key => id).pluck("#{self.class.table_name}.log_data").first
|
217
|
+
end
|
218
|
+
|
219
|
+
# Nullify log_data column for a single record
|
220
|
+
def reset_log_data
|
221
|
+
self.class.without_logging { update_column(:log_data, nil) }
|
222
|
+
end
|
223
|
+
|
224
|
+
def create_logidze_snapshot!(**opts)
|
225
|
+
self.class.where(self.class.primary_key => id).create_logidze_snapshot(**opts)
|
226
|
+
|
227
|
+
reload_log_data
|
228
|
+
end
|
229
|
+
|
202
230
|
protected
|
203
231
|
|
204
232
|
def apply_diff(version, diff)
|
data/lib/logidze/version.rb
CHANGED
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: 1.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,98 +16,98 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '5.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: ruby-next-core
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
33
|
+
version: '0.9'
|
34
|
+
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '0.9'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: ammeter
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.1.3
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.1.3
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1.
|
61
|
+
version: '1.10'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1.
|
68
|
+
version: '1.10'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: fx
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
75
|
+
version: '0.5'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
82
|
+
version: '0.5'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: pg
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
89
|
+
version: '0.18'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
96
|
+
version: '0.18'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '13.0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '13.0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rspec-rails
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,48 +122,6 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '3.4'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rubocop
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: 0.59.0
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: 0.59.0
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rubocop-md
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: 0.2.0
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: 0.2.0
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: simplecov
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: 0.3.8
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 0.3.8
|
167
125
|
- !ruby/object:Gem::Dependency
|
168
126
|
name: timecop
|
169
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,66 +136,53 @@ dependencies:
|
|
178
136
|
- - "~>"
|
179
137
|
- !ruby/object:Gem::Version
|
180
138
|
version: '0.8'
|
181
|
-
description: PostgreSQL
|
139
|
+
description: PostgreSQL JSONB-based model changes tracking
|
182
140
|
email:
|
183
141
|
- dementiev.vm@gmail.com
|
184
142
|
executables: []
|
185
143
|
extensions: []
|
186
144
|
extra_rdoc_files: []
|
187
145
|
files:
|
188
|
-
- ".gitignore"
|
189
|
-
- ".hound.yml"
|
190
|
-
- ".rspec"
|
191
|
-
- ".rubocop.yml"
|
192
|
-
- ".travis.yml"
|
193
146
|
- CHANGELOG.md
|
194
|
-
- Gemfile
|
195
147
|
- LICENSE.txt
|
196
148
|
- README.md
|
197
|
-
-
|
198
|
-
-
|
199
|
-
- bench/performance/diff_bench.rb
|
200
|
-
- bench/performance/insert_bench.rb
|
201
|
-
- bench/performance/memory_profile.rb
|
202
|
-
- bench/performance/setup.rb
|
203
|
-
- bench/performance/update_bench.rb
|
204
|
-
- bench/triggers/Makefile
|
205
|
-
- bench/triggers/Readme.md
|
206
|
-
- bench/triggers/bench.sql
|
207
|
-
- bench/triggers/hstore_trigger_setup.sql
|
208
|
-
- bench/triggers/jsonb_minus_2_setup.sql
|
209
|
-
- bench/triggers/jsonb_minus_setup.sql
|
210
|
-
- bench/triggers/keys2_trigger_setup.sql
|
211
|
-
- bench/triggers/keys_trigger_setup.sql
|
212
|
-
- bin/console
|
213
|
-
- bin/setup
|
214
|
-
- gemfiles/rails42.gemfile
|
215
|
-
- gemfiles/rails5.gemfile
|
216
|
-
- gemfiles/rails52.gemfile
|
217
|
-
- gemfiles/railsmaster.gemfile
|
149
|
+
- lib/generators/logidze/fx_helper.rb
|
150
|
+
- lib/generators/logidze/inject_sql.rb
|
218
151
|
- lib/generators/logidze/install/USAGE
|
152
|
+
- lib/generators/logidze/install/functions/logidze_compact_history.sql
|
153
|
+
- lib/generators/logidze/install/functions/logidze_filter_keys.sql
|
154
|
+
- lib/generators/logidze/install/functions/logidze_logger.sql
|
155
|
+
- lib/generators/logidze/install/functions/logidze_snapshot.sql
|
156
|
+
- lib/generators/logidze/install/functions/logidze_version.sql
|
219
157
|
- lib/generators/logidze/install/install_generator.rb
|
220
158
|
- lib/generators/logidze/install/templates/hstore.rb.erb
|
221
159
|
- lib/generators/logidze/install/templates/migration.rb.erb
|
160
|
+
- lib/generators/logidze/install/templates/migration_fx.rb.erb
|
222
161
|
- lib/generators/logidze/model/USAGE
|
223
162
|
- lib/generators/logidze/model/model_generator.rb
|
224
163
|
- lib/generators/logidze/model/templates/migration.rb.erb
|
164
|
+
- lib/generators/logidze/model/triggers/logidze.sql
|
225
165
|
- lib/logidze.rb
|
226
166
|
- lib/logidze/engine.rb
|
227
167
|
- lib/logidze/has_logidze.rb
|
228
168
|
- lib/logidze/history.rb
|
229
169
|
- lib/logidze/history/type.rb
|
230
170
|
- lib/logidze/history/version.rb
|
171
|
+
- lib/logidze/ignore_log_data.rb
|
172
|
+
- lib/logidze/ignore_log_data/cast_attribute_patch.rb
|
231
173
|
- lib/logidze/meta.rb
|
232
|
-
- lib/logidze/migration.rb
|
233
174
|
- lib/logidze/model.rb
|
234
175
|
- lib/logidze/version.rb
|
235
176
|
- lib/logidze/versioned_association.rb
|
236
|
-
- logidze.gemspec
|
237
177
|
homepage: http://github.com/palkan/logidze
|
238
178
|
licenses:
|
239
179
|
- MIT
|
240
|
-
metadata:
|
180
|
+
metadata:
|
181
|
+
bug_tracker_uri: http://github.com/palkan/logidze/issues
|
182
|
+
changelog_uri: https://github.com/palkan/logidze/blob/master/CHANGELOG.md
|
183
|
+
documentation_uri: http://github.com/palkan/logidze
|
184
|
+
homepage_uri: http://github.com/palkan/logidze
|
185
|
+
source_code_uri: http://github.com/palkan/logidze
|
241
186
|
post_install_message:
|
242
187
|
rdoc_options: []
|
243
188
|
require_paths:
|
@@ -246,16 +191,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
246
191
|
requirements:
|
247
192
|
- - ">="
|
248
193
|
- !ruby/object:Gem::Version
|
249
|
-
version:
|
194
|
+
version: 2.5.0
|
250
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
251
196
|
requirements:
|
252
|
-
- - "
|
197
|
+
- - ">"
|
253
198
|
- !ruby/object:Gem::Version
|
254
|
-
version:
|
199
|
+
version: 1.3.1
|
255
200
|
requirements: []
|
256
|
-
|
257
|
-
rubygems_version: 2.7.7
|
201
|
+
rubygems_version: 3.0.6
|
258
202
|
signing_key:
|
259
203
|
specification_version: 4
|
260
|
-
summary: PostgreSQL
|
204
|
+
summary: PostgreSQL JSONB-based model changes tracking
|
261
205
|
test_files: []
|