logidze 0.11.0 → 1.2.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 +4 -4
- data/CHANGELOG.md +79 -4
- data/LICENSE.txt +1 -1
- data/README.md +305 -102
- 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_capture_exception.sql +23 -0
- 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 +203 -0
- data/lib/generators/logidze/install/functions/logidze_snapshot.sql +33 -0
- data/lib/generators/logidze/install/functions/logidze_version.sql +21 -0
- data/lib/generators/logidze/install/install_generator.rb +43 -1
- 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 +53 -13
- 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 +37 -14
- data/lib/logidze/engine.rb +9 -0
- data/lib/logidze/has_logidze.rb +1 -1
- data/lib/logidze/history.rb +2 -11
- data/lib/logidze/ignore_log_data.rb +1 -3
- data/lib/logidze/meta.rb +43 -16
- data/lib/logidze/model.rb +51 -44
- data/lib/logidze/utils/check_pending.rb +57 -0
- data/lib/logidze/utils/function_definitions.rb +49 -0
- data/lib/logidze/utils/pending_migration_error.rb +25 -0
- data/lib/logidze/version.rb +1 -1
- metadata +69 -77
- data/.gitattributes +0 -3
- data/.github/ISSUE_TEMPLATE.md +0 -20
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -29
- data/.gitignore +0 -40
- data/.rubocop.yml +0 -55
- data/.travis.yml +0 -42
- data/Gemfile +0 -15
- data/Rakefile +0 -28
- data/assets/pg_log_data_chart.png +0 -0
- data/bench/performance/README.md +0 -109
- data/bench/performance/diff_bench.rb +0 -38
- data/bench/performance/insert_bench.rb +0 -22
- data/bench/performance/memory_profile.rb +0 -56
- data/bench/performance/setup.rb +0 -315
- data/bench/performance/update_bench.rb +0 -38
- 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 -6
- data/gemfiles/rails5.gemfile +0 -6
- data/gemfiles/rails52.gemfile +0 -6
- data/gemfiles/rails6.gemfile +0 -6
- data/gemfiles/railsmaster.gemfile +0 -7
- data/lib/logidze/ignore_log_data/association.rb +0 -11
- data/lib/logidze/ignore_log_data/ignored_columns.rb +0 -46
- data/lib/logidze/migration.rb +0 -20
- data/logidze.gemspec +0 -41
@@ -1,29 +0,0 @@
|
|
1
|
-
<!--
|
2
|
-
First of all, thanks for contributing!
|
3
|
-
|
4
|
-
If it's a typo fix or minor documentation update feel free to skip the rest of this template!
|
5
|
-
-->
|
6
|
-
|
7
|
-
<!--
|
8
|
-
If it's a bug fix, then link it to the issue, for example:
|
9
|
-
|
10
|
-
Fixes #xxx
|
11
|
-
-->
|
12
|
-
|
13
|
-
|
14
|
-
<!--
|
15
|
-
Otherwise, describe the changes:
|
16
|
-
|
17
|
-
### What is the purpose of this pull request?
|
18
|
-
|
19
|
-
### What changes did you make? (overview)
|
20
|
-
|
21
|
-
### Is there anything you'd like reviewers to focus on?
|
22
|
-
|
23
|
-
### Checklist
|
24
|
-
|
25
|
-
- [ ] I've added tests for this change
|
26
|
-
- [ ] I've added a Changelog entry
|
27
|
-
- [ ] I've updated a documentation (Readme)
|
28
|
-
|
29
|
-
-->
|
data/.gitignore
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# Numerous always-ignore extensions
|
2
|
-
*.diff
|
3
|
-
*.err
|
4
|
-
*.orig
|
5
|
-
*.log
|
6
|
-
*.rej
|
7
|
-
*.swo
|
8
|
-
*.swp
|
9
|
-
*.vi
|
10
|
-
*~
|
11
|
-
*.sass-cache
|
12
|
-
*.iml
|
13
|
-
.idea/
|
14
|
-
|
15
|
-
# Sublime
|
16
|
-
*.sublime-project
|
17
|
-
*.sublime-workspace
|
18
|
-
|
19
|
-
# OS or Editor folders
|
20
|
-
.DS_Store
|
21
|
-
.cache
|
22
|
-
.project
|
23
|
-
.settings
|
24
|
-
.tmproj
|
25
|
-
Thumbs.db
|
26
|
-
|
27
|
-
.bundle/
|
28
|
-
log/*.log
|
29
|
-
*.gz
|
30
|
-
pkg/
|
31
|
-
spec/dummy/db/*.sqlite3
|
32
|
-
spec/dummy/db/*.sqlite3-journal
|
33
|
-
spec/dummy/tmp/
|
34
|
-
|
35
|
-
Gemfile.lock
|
36
|
-
Gemfile.local
|
37
|
-
.rspec
|
38
|
-
*.gem
|
39
|
-
tmp/
|
40
|
-
coverage/
|
data/.rubocop.yml
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require:
|
2
|
-
- standard/cop/semantic_blocks
|
3
|
-
- rubocop-md
|
4
|
-
|
5
|
-
inherit_gem:
|
6
|
-
standard: config/base.yml
|
7
|
-
|
8
|
-
AllCops:
|
9
|
-
Exclude:
|
10
|
-
- 'bin/*'
|
11
|
-
- 'tmp/**/*'
|
12
|
-
- 'docs/**/*'
|
13
|
-
- 'Gemfile'
|
14
|
-
- 'vendor/**/*'
|
15
|
-
- 'gemfiles/**/*'
|
16
|
-
DisplayCopNames: true
|
17
|
-
TargetRubyVersion: 2.4
|
18
|
-
|
19
|
-
Standard/SemanticBlocks:
|
20
|
-
Enabled: false
|
21
|
-
|
22
|
-
Style/FrozenStringLiteralComment:
|
23
|
-
Enabled: true
|
24
|
-
|
25
|
-
Style/TrailingCommaInArrayLiteral:
|
26
|
-
EnforcedStyleForMultiline: no_comma
|
27
|
-
|
28
|
-
Style/TrailingCommaInHashLiteral:
|
29
|
-
EnforcedStyleForMultiline: no_comma
|
30
|
-
|
31
|
-
Layout/AlignParameters:
|
32
|
-
EnforcedStyle: with_first_parameter
|
33
|
-
|
34
|
-
Lint/Void:
|
35
|
-
Exclude:
|
36
|
-
- '**/*.md'
|
37
|
-
|
38
|
-
# See https://github.com/rubocop-hq/rubocop/issues/4222
|
39
|
-
Lint/AmbiguousBlockAssociation:
|
40
|
-
Exclude:
|
41
|
-
- 'spec/**/*'
|
42
|
-
- '**/*.md'
|
43
|
-
|
44
|
-
Lint/DuplicateMethods:
|
45
|
-
Exclude:
|
46
|
-
- '**/*.md'
|
47
|
-
|
48
|
-
Naming/FileName:
|
49
|
-
Exclude:
|
50
|
-
- 'lib/test-prof.rb'
|
51
|
-
- '**/*.md'
|
52
|
-
|
53
|
-
Layout/InitialIndentation:
|
54
|
-
Exclude:
|
55
|
-
- 'CHANGELOG.md'
|
data/.travis.yml
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
cache: bundler
|
3
|
-
|
4
|
-
dist: trusty
|
5
|
-
sudo: false
|
6
|
-
|
7
|
-
notifications:
|
8
|
-
email: false
|
9
|
-
|
10
|
-
addons:
|
11
|
-
postgresql: "9.6"
|
12
|
-
|
13
|
-
env:
|
14
|
-
global:
|
15
|
-
- LOGIDZE_DB_USER=postgres
|
16
|
-
- LOGIDZE_DB_NAME=logidze
|
17
|
-
|
18
|
-
before_script:
|
19
|
-
- gem update --system
|
20
|
-
- bundle exec rake dummy:db:create
|
21
|
-
- psql -U postgres -d logidze -c 'CREATE EXTENSION IF NOT EXISTS hstore;'
|
22
|
-
- RAILS_ENV=test bundle exec rake dummy:db:create dummy:db:migrate
|
23
|
-
|
24
|
-
matrix:
|
25
|
-
include:
|
26
|
-
- rvm: ruby-head
|
27
|
-
gemfile: gemfiles/railsmaster.gemfile
|
28
|
-
- rvm: 2.6.2
|
29
|
-
gemfile: gemfiles/rails6.gemfile
|
30
|
-
- rvm: 2.6.2
|
31
|
-
gemfile: gemfiles/rails5.gemfile
|
32
|
-
- rvm: 2.5.1
|
33
|
-
gemfile: gemfiles/rails52.gemfile
|
34
|
-
- rvm: 2.4.1
|
35
|
-
gemfile: gemfiles/rails5.gemfile
|
36
|
-
- rvm: 2.4.1
|
37
|
-
gemfile: gemfiles/rails42.gemfile
|
38
|
-
allow_failures:
|
39
|
-
- rvm: ruby-head
|
40
|
-
gemfile: gemfiles/railsmaster.gemfile
|
41
|
-
- rvm: 2.5.0
|
42
|
-
gemfile: gemfiles/railsmaster.gemfile
|
data/Gemfile
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
source 'https://rubygems.org'
|
3
|
-
|
4
|
-
# Specify your gem's dependencies in logidze.gemspec
|
5
|
-
gemspec
|
6
|
-
|
7
|
-
gem "pry-byebug", platform: :mri
|
8
|
-
|
9
|
-
local_gemfile = "#{File.dirname(__FILE__)}/Gemfile.local"
|
10
|
-
|
11
|
-
if File.exist?(local_gemfile)
|
12
|
-
eval(File.read(local_gemfile)) # rubocop:disable Lint/Eval
|
13
|
-
else
|
14
|
-
gem 'activerecord', '~> 5.1.1'
|
15
|
-
end
|
data/Rakefile
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "rspec/core/rake_task"
|
4
|
-
require "rubocop/rake_task"
|
5
|
-
|
6
|
-
RuboCop::RakeTask.new
|
7
|
-
RSpec::Core::RakeTask.new(:spec)
|
8
|
-
|
9
|
-
namespace :dummy do
|
10
|
-
require_relative "spec/dummy/config/application"
|
11
|
-
Dummy::Application.load_tasks
|
12
|
-
end
|
13
|
-
|
14
|
-
task(:spec).clear
|
15
|
-
desc "Run specs other than spec/acceptance"
|
16
|
-
RSpec::Core::RakeTask.new("spec") do |task|
|
17
|
-
task.exclude_pattern = "spec/acceptance/**/*_spec.rb"
|
18
|
-
task.verbose = false
|
19
|
-
end
|
20
|
-
|
21
|
-
desc "Run acceptance specs in spec/acceptance"
|
22
|
-
RSpec::Core::RakeTask.new("spec:acceptance") do |task|
|
23
|
-
task.pattern = "spec/acceptance/**/*_spec.rb"
|
24
|
-
task.verbose = false
|
25
|
-
end
|
26
|
-
|
27
|
-
desc "Run the specs and acceptance tests"
|
28
|
-
task default: %w[rubocop spec spec:acceptance]
|
Binary file
|
data/bench/performance/README.md
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
# Performance benchmarks: PaperTail vs. Logidze
|
2
|
-
|
3
|
-
We want to compare Logidze with the most popular versioning library for Rails – PaperTrail.
|
4
|
-
|
5
|
-
|
6
|
-
## Insert ([source](insert_bench.rb))
|
7
|
-
|
8
|
-
```
|
9
|
-
PaperTrail INSERT 213.148 (± 8.9%) i/s - 1.060k in 5.018504s
|
10
|
-
Logidze INSERT 613.387 (±16.3%) i/s - 2.970k in 5.036127s
|
11
|
-
```
|
12
|
-
|
13
|
-
|
14
|
-
## Update ([source](update_bench.rb))
|
15
|
-
|
16
|
-
When changeset has 2 fields:
|
17
|
-
|
18
|
-
```
|
19
|
-
PaperTrail UPDATE #1 256.651 (±26.5%) i/s - 1.206k in 5.002300s
|
20
|
-
Logidze UPDATE #1 356.932 (±12.6%) i/s - 1.764k in 5.030560s
|
21
|
-
```
|
22
|
-
|
23
|
-
When changeset has 5 fields:
|
24
|
-
|
25
|
-
```
|
26
|
-
PaperTrail UPDATE #2 246.281 (±24.0%) i/s - 1.168k in 5.008234s
|
27
|
-
Logidze UPDATE #2 331.942 (±16.6%) i/s - 1.593k in 5.028135s
|
28
|
-
```
|
29
|
-
|
30
|
-
## Getting diff ([source](diff_bench.rb))
|
31
|
-
|
32
|
-
PaperTrail doesn't have built-in method to calculate diff between not adjacent versions.
|
33
|
-
We add `diff_from(ts)` and `diff_from_joined(ts)` (which uses SQL JOIN) methods to calculate diff from specified version using changesets.
|
34
|
-
|
35
|
-
When each record has 10 versions:
|
36
|
-
|
37
|
-
```
|
38
|
-
PT DIFF 20.874 (± 4.8%) i/s - 106.000 in 5.091402s
|
39
|
-
PT (join) DIFF 20.619 (± 4.8%) i/s - 104.000 in 5.070160s
|
40
|
-
Logidze DIFF 109.482 (±24.7%) i/s - 500.000 in 5.103534s
|
41
|
-
```
|
42
|
-
|
43
|
-
When each record has 100 versions:
|
44
|
-
|
45
|
-
```
|
46
|
-
PT DIFF 2.998 (± 0.0%) i/s - 15.000 in 5.019494s
|
47
|
-
PT (join) DIFF 3.193 (± 0.0%) i/s - 16.000 in 5.030155s
|
48
|
-
Logidze DIFF 19.627 (±25.5%) i/s - 88.000 in 5.035555s
|
49
|
-
```
|
50
|
-
|
51
|
-
And, finally, when each record has 1000 versions:
|
52
|
-
|
53
|
-
```
|
54
|
-
PT DIFF 0.270 (± 0.0%) i/s - 17.000 in 63.038374s
|
55
|
-
PT (join) DIFF 0.235 (± 0.0%) i/s - 14.000 in 60.350886s
|
56
|
-
Logidze DIFF 2.022 (± 0.0%) i/s - 120.000 in 60.142965s
|
57
|
-
```
|
58
|
-
|
59
|
-
## Select memory usage ([source](memory_profile.rb))
|
60
|
-
|
61
|
-
Logidze loads more data (because it stores log in-place). But how much more?
|
62
|
-
We consider two cases for PaperTrail: when we want to calculate diff (and thus loading versions) and when we don't need any history related data.
|
63
|
-
|
64
|
-
When each record has 10 versions:
|
65
|
-
|
66
|
-
```
|
67
|
-
PT records
|
68
|
-
Total Allocated: 27.8 KB
|
69
|
-
Total Retained: 16.59 KB
|
70
|
-
Retained memory (per record): 2.14 KB
|
71
|
-
|
72
|
-
PT with versions
|
73
|
-
Total Allocated: 228.01 KB
|
74
|
-
Total Retained: 170.78 KB
|
75
|
-
Retained memory (per record): 143.13 KB
|
76
|
-
|
77
|
-
Logidze records
|
78
|
-
Total Allocated: 46.45 KB
|
79
|
-
Total Retained: 34.73 KB
|
80
|
-
Retained memory (per record): 4.11 KB
|
81
|
-
```
|
82
|
-
|
83
|
-
When each record has 100 versions:
|
84
|
-
|
85
|
-
```
|
86
|
-
PT with versions
|
87
|
-
Total Allocated: 1.92 MB
|
88
|
-
Total Retained: 1.56 MB
|
89
|
-
Retained memory (per record): 1.53 MB
|
90
|
-
|
91
|
-
Logidze records
|
92
|
-
Total Allocated: 162.48 KB
|
93
|
-
Total Retained: 150.76 KB
|
94
|
-
Retained memory (per record): 15.4 KB
|
95
|
-
```
|
96
|
-
|
97
|
-
When each record has 1000 versions:
|
98
|
-
|
99
|
-
```
|
100
|
-
PT with versions
|
101
|
-
Total Allocated: 18.23 MB
|
102
|
-
Total Retained: 14.86 MB
|
103
|
-
Retained memory (per record): 14.83 MB
|
104
|
-
|
105
|
-
Logidze records
|
106
|
-
Total Allocated: 1.32 MB
|
107
|
-
Total Retained: 1.31 MB
|
108
|
-
Retained memory (per record): 131.59 KB
|
109
|
-
```
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "benchmark/ips"
|
4
|
-
require "./setup"
|
5
|
-
|
6
|
-
# How many records do you want?
|
7
|
-
N = (ENV["N"] || "100").to_i
|
8
|
-
|
9
|
-
# How many version each record has?
|
10
|
-
V = (ENV["V"] || "10").to_i
|
11
|
-
|
12
|
-
# Benchmark run time
|
13
|
-
BM_TIME = (ENV["BM_TIME"] || 5).to_i
|
14
|
-
|
15
|
-
BM_WARMUP = [(BM_TIME / 10), 2].max
|
16
|
-
|
17
|
-
LogidzeBench.cleanup
|
18
|
-
LogidzeBench.populate(N)
|
19
|
-
|
20
|
-
ts1 = LogidzeBench.generate_versions(V / 2)
|
21
|
-
|
22
|
-
LogidzeBench.generate_versions(V / 2)
|
23
|
-
|
24
|
-
Benchmark.ips do |x|
|
25
|
-
x.config(time: BM_TIME, warmup: BM_WARMUP)
|
26
|
-
|
27
|
-
x.report("PT DIFF") do
|
28
|
-
User.random(N / 2).diff_from(ts1)
|
29
|
-
end
|
30
|
-
|
31
|
-
x.report("PT (join) DIFF") do
|
32
|
-
User.random(N / 2).diff_from_joined(ts1)
|
33
|
-
end
|
34
|
-
|
35
|
-
x.report("Logidze DIFF") do
|
36
|
-
LogidzeUser.random(N / 2).diff_from(ts1)
|
37
|
-
end
|
38
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "benchmark/ips"
|
4
|
-
require "./setup"
|
5
|
-
|
6
|
-
params = {
|
7
|
-
email: Faker::Internet.email,
|
8
|
-
position: Faker::Number.number(3),
|
9
|
-
name: Faker::Name.name,
|
10
|
-
age: Faker::Number.number(2),
|
11
|
-
bio: Faker::Lorem.paragraph
|
12
|
-
}
|
13
|
-
|
14
|
-
Benchmark.ips do |x|
|
15
|
-
x.report("PaperTrail INSERT") do
|
16
|
-
User.create!(params)
|
17
|
-
end
|
18
|
-
|
19
|
-
x.report("Logidze INSERT") do
|
20
|
-
LogidzeUser.create!(params)
|
21
|
-
end
|
22
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "./setup"
|
4
|
-
require "active_support/core_ext"
|
5
|
-
require "memory_profiler"
|
6
|
-
|
7
|
-
# How many records do you want?
|
8
|
-
N = (ENV["N"] || "10").to_i
|
9
|
-
|
10
|
-
# How many version each record has?
|
11
|
-
V = (ENV["V"] || "10").to_i
|
12
|
-
|
13
|
-
LogidzeBench.cleanup
|
14
|
-
LogidzeBench.populate(N)
|
15
|
-
LogidzeBench.generate_versions(V)
|
16
|
-
|
17
|
-
module MemoryReport
|
18
|
-
KILO_BYTE = 1024
|
19
|
-
MEGA_BYTE = 1024 * 1024
|
20
|
-
|
21
|
-
module_function
|
22
|
-
|
23
|
-
def call(msg, relation)
|
24
|
-
buffer = nil
|
25
|
-
delta = N / 10
|
26
|
-
r0 = MemoryProfiler.report do
|
27
|
-
buffer = relation.random(N - delta).to_a
|
28
|
-
end
|
29
|
-
|
30
|
-
buffer = nil
|
31
|
-
r1 = MemoryProfiler.report do
|
32
|
-
buffer = relation.to_a
|
33
|
-
end
|
34
|
-
|
35
|
-
$stdout.puts msg
|
36
|
-
$stdout.puts "Total Allocated:\t\t\t\t#{to_human_size(r1.total_allocated_memsize)}"
|
37
|
-
$stdout.puts "Total Retained:\t\t\t\t\t#{to_human_size(r1.total_retained_memsize)}"
|
38
|
-
$stdout.puts "Retained_memsize memory (per record):\t\t#{to_human_size((r1.total_retained_memsize - r0.total_retained_memsize) / delta)}"
|
39
|
-
end
|
40
|
-
|
41
|
-
module_function
|
42
|
-
|
43
|
-
def to_human_size(size)
|
44
|
-
if size > MEGA_BYTE
|
45
|
-
"#{(size.to_f / MEGA_BYTE).round(2)} MB"
|
46
|
-
elsif size > KILO_BYTE
|
47
|
-
"#{(size.to_f / KILO_BYTE).round(2)} KB"
|
48
|
-
else
|
49
|
-
"#{size} B"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
MemoryReport.call("PT records", User.all)
|
55
|
-
MemoryReport.call("PT with versions", User.joins(:versions).all)
|
56
|
-
MemoryReport.call("Logidze records", LogidzeUser.all)
|