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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -4
  3. data/LICENSE.txt +1 -1
  4. data/README.md +305 -102
  5. data/lib/generators/logidze/fx_helper.rb +17 -0
  6. data/lib/generators/logidze/inject_sql.rb +18 -0
  7. data/lib/generators/logidze/install/USAGE +6 -1
  8. data/lib/generators/logidze/install/functions/logidze_capture_exception.sql +23 -0
  9. data/lib/generators/logidze/install/functions/logidze_compact_history.sql +38 -0
  10. data/lib/generators/logidze/install/functions/logidze_filter_keys.sql +27 -0
  11. data/lib/generators/logidze/install/functions/logidze_logger.sql +203 -0
  12. data/lib/generators/logidze/install/functions/logidze_snapshot.sql +33 -0
  13. data/lib/generators/logidze/install/functions/logidze_version.sql +21 -0
  14. data/lib/generators/logidze/install/install_generator.rb +43 -1
  15. data/lib/generators/logidze/install/templates/hstore.rb.erb +1 -1
  16. data/lib/generators/logidze/install/templates/migration.rb.erb +19 -232
  17. data/lib/generators/logidze/install/templates/migration_fx.rb.erb +41 -0
  18. data/lib/generators/logidze/model/model_generator.rb +53 -13
  19. data/lib/generators/logidze/model/templates/migration.rb.erb +57 -36
  20. data/lib/generators/logidze/model/triggers/logidze.sql +6 -0
  21. data/lib/logidze.rb +37 -14
  22. data/lib/logidze/engine.rb +9 -0
  23. data/lib/logidze/has_logidze.rb +1 -1
  24. data/lib/logidze/history.rb +2 -11
  25. data/lib/logidze/ignore_log_data.rb +1 -3
  26. data/lib/logidze/meta.rb +43 -16
  27. data/lib/logidze/model.rb +51 -44
  28. data/lib/logidze/utils/check_pending.rb +57 -0
  29. data/lib/logidze/utils/function_definitions.rb +49 -0
  30. data/lib/logidze/utils/pending_migration_error.rb +25 -0
  31. data/lib/logidze/version.rb +1 -1
  32. metadata +69 -77
  33. data/.gitattributes +0 -3
  34. data/.github/ISSUE_TEMPLATE.md +0 -20
  35. data/.github/PULL_REQUEST_TEMPLATE.md +0 -29
  36. data/.gitignore +0 -40
  37. data/.rubocop.yml +0 -55
  38. data/.travis.yml +0 -42
  39. data/Gemfile +0 -15
  40. data/Rakefile +0 -28
  41. data/assets/pg_log_data_chart.png +0 -0
  42. data/bench/performance/README.md +0 -109
  43. data/bench/performance/diff_bench.rb +0 -38
  44. data/bench/performance/insert_bench.rb +0 -22
  45. data/bench/performance/memory_profile.rb +0 -56
  46. data/bench/performance/setup.rb +0 -315
  47. data/bench/performance/update_bench.rb +0 -38
  48. data/bench/triggers/Makefile +0 -56
  49. data/bench/triggers/Readme.md +0 -58
  50. data/bench/triggers/bench.sql +0 -6
  51. data/bench/triggers/hstore_trigger_setup.sql +0 -38
  52. data/bench/triggers/jsonb_minus_2_setup.sql +0 -47
  53. data/bench/triggers/jsonb_minus_setup.sql +0 -49
  54. data/bench/triggers/keys2_trigger_setup.sql +0 -44
  55. data/bench/triggers/keys_trigger_setup.sql +0 -50
  56. data/bin/console +0 -8
  57. data/bin/setup +0 -9
  58. data/gemfiles/rails42.gemfile +0 -6
  59. data/gemfiles/rails5.gemfile +0 -6
  60. data/gemfiles/rails52.gemfile +0 -6
  61. data/gemfiles/rails6.gemfile +0 -6
  62. data/gemfiles/railsmaster.gemfile +0 -7
  63. data/lib/logidze/ignore_log_data/association.rb +0 -11
  64. data/lib/logidze/ignore_log_data/ignored_columns.rb +0 -46
  65. data/lib/logidze/migration.rb +0 -20
  66. 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
@@ -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)