whodunit-chronicles 0.3.0 → 0.4.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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -226
  3. data/LICENSE +1 -1
  4. data/README.md +96 -599
  5. data/exe/whodunit-chronicles +6 -0
  6. data/lib/whodunit/chronicles/chronicler.rb +62 -0
  7. data/lib/whodunit/chronicles/cli.rb +131 -0
  8. data/lib/whodunit/chronicles/errors.rb +7 -33
  9. data/lib/whodunit/chronicles/ledger.rb +69 -0
  10. data/lib/whodunit/chronicles/ledger_entry.rb +143 -0
  11. data/lib/whodunit/chronicles/ledger_factory.rb +66 -0
  12. data/lib/whodunit/chronicles/ledgers/file_ledger.rb +56 -0
  13. data/lib/whodunit/chronicles/ledgers/memory_ledger.rb +29 -0
  14. data/lib/whodunit/chronicles/ledgers/sqlite_ledger.rb +172 -0
  15. data/lib/whodunit/chronicles/version.rb +2 -1
  16. data/lib/whodunit/chronicles.rb +12 -65
  17. data/lib/whodunit-chronicles.rb +0 -1
  18. data/sig/whodunit/chronicles/chronicler.rbs +14 -0
  19. data/sig/whodunit/chronicles/cli.rbs +17 -0
  20. data/sig/whodunit/chronicles/errors.rbs +15 -0
  21. data/sig/whodunit/chronicles/ledger.rbs +13 -0
  22. data/sig/whodunit/chronicles/ledger_entry.rbs +62 -0
  23. data/sig/whodunit/chronicles/ledger_factory.rbs +14 -0
  24. data/sig/whodunit/chronicles/ledgers/file_ledger.rbs +14 -0
  25. data/sig/whodunit/chronicles/ledgers/memory_ledger.rbs +12 -0
  26. data/sig/whodunit/chronicles/ledgers/sqlite_ledger.rbs +30 -0
  27. data/sig/whodunit/chronicles.rbs +5 -0
  28. metadata +40 -326
  29. data/.codeclimate.yml +0 -50
  30. data/.rubocop.yml +0 -93
  31. data/.yardopts +0 -14
  32. data/CODE_OF_CONDUCT.md +0 -132
  33. data/CONTRIBUTING.md +0 -186
  34. data/Rakefile +0 -18
  35. data/docker/mysql/init.sql +0 -33
  36. data/docker/postgres/init.sql +0 -40
  37. data/docker-compose.yml +0 -138
  38. data/examples/images/campaign-performance-analytics.png +0 -0
  39. data/examples/images/candidate-journey-analytics.png +0 -0
  40. data/examples/images/recruitment-funnel-analytics.png +0 -0
  41. data/lib/.gitkeep +0 -0
  42. data/lib/whodunit/chronicles/adapter_loader.rb +0 -69
  43. data/lib/whodunit/chronicles/adapters/mysql.rb +0 -261
  44. data/lib/whodunit/chronicles/adapters/postgresql.rb +0 -278
  45. data/lib/whodunit/chronicles/change_event.rb +0 -201
  46. data/lib/whodunit/chronicles/composite_processor.rb +0 -86
  47. data/lib/whodunit/chronicles/configuration.rb +0 -112
  48. data/lib/whodunit/chronicles/connection.rb +0 -88
  49. data/lib/whodunit/chronicles/persistence.rb +0 -129
  50. data/lib/whodunit/chronicles/processor.rb +0 -127
  51. data/lib/whodunit/chronicles/service.rb +0 -207
  52. data/lib/whodunit/chronicles/stream_adapter.rb +0 -91
  53. data/lib/whodunit/chronicles/table.rb +0 -120
  54. data/whodunit-chronicles.gemspec +0 -79
metadata CHANGED
@@ -1,372 +1,86 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whodunit-chronicles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ken C. Demanawa
8
- - Spherical Cow
9
8
  bindir: exe
10
9
  cert_chain: []
11
10
  date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: concurrent-ruby
13
+ name: cdc-core
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '1.2'
18
+ version: '0.1'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - "~>"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '1.2'
25
+ version: '0.1'
27
26
  - !ruby/object:Gem::Dependency
28
- name: dry-configurable
27
+ name: sqlite3
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - "~>"
30
+ - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: '1.0'
32
+ version: '2.0'
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
- - - "~>"
37
+ - - ">="
39
38
  - !ruby/object:Gem::Version
40
- version: '1.0'
41
- - !ruby/object:Gem::Dependency
42
- name: dry-logger
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.0'
55
- - !ruby/object:Gem::Dependency
56
- name: pg
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.5'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.5'
69
- - !ruby/object:Gem::Dependency
70
- name: trilogy
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '2.9'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '2.9'
83
- - !ruby/object:Gem::Dependency
84
- name: bigdecimal
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '3.1'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '3.1'
97
- - !ruby/object:Gem::Dependency
98
- name: kramdown
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '2.5'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '2.5'
111
- - !ruby/object:Gem::Dependency
112
- name: minitest
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '5.20'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '5.20'
125
- - !ruby/object:Gem::Dependency
126
- name: mocha
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '2.1'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '2.1'
139
- - !ruby/object:Gem::Dependency
140
- name: pry
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '0.14'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '0.14'
153
- - !ruby/object:Gem::Dependency
154
- name: rake
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '13.0'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: '13.0'
167
- - !ruby/object:Gem::Dependency
168
- name: rspec_junit_formatter
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: 0.6.0
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: 0.6.0
181
- - !ruby/object:Gem::Dependency
182
- name: rubocop
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - "~>"
186
- - !ruby/object:Gem::Version
187
- version: '1.60'
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - "~>"
193
- - !ruby/object:Gem::Version
194
- version: '1.60'
195
- - !ruby/object:Gem::Dependency
196
- name: rubocop-minitest
197
- requirement: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - "~>"
200
- - !ruby/object:Gem::Version
201
- version: '0.34'
202
- type: :development
203
- prerelease: false
204
- version_requirements: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - "~>"
207
- - !ruby/object:Gem::Version
208
- version: '0.34'
209
- - !ruby/object:Gem::Dependency
210
- name: rubocop-performance
211
- requirement: !ruby/object:Gem::Requirement
212
- requirements:
213
- - - "~>"
214
- - !ruby/object:Gem::Version
215
- version: '1.19'
216
- type: :development
217
- prerelease: false
218
- version_requirements: !ruby/object:Gem::Requirement
219
- requirements:
220
- - - "~>"
221
- - !ruby/object:Gem::Version
222
- version: '1.19'
223
- - !ruby/object:Gem::Dependency
224
- name: rubocop-rake
225
- requirement: !ruby/object:Gem::Requirement
226
- requirements:
227
- - - "~>"
228
- - !ruby/object:Gem::Version
229
- version: '0.6'
230
- type: :development
231
- prerelease: false
232
- version_requirements: !ruby/object:Gem::Requirement
233
- requirements:
234
- - - "~>"
235
- - !ruby/object:Gem::Version
236
- version: '0.6'
237
- - !ruby/object:Gem::Dependency
238
- name: rubocop-thread_safety
239
- requirement: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - "~>"
242
- - !ruby/object:Gem::Version
243
- version: '0.5'
244
- type: :development
245
- prerelease: false
246
- version_requirements: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - "~>"
249
- - !ruby/object:Gem::Version
250
- version: '0.5'
251
- - !ruby/object:Gem::Dependency
252
- name: simplecov
253
- requirement: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - "~>"
256
- - !ruby/object:Gem::Version
257
- version: '0.22'
258
- type: :development
259
- prerelease: false
260
- version_requirements: !ruby/object:Gem::Requirement
261
- requirements:
262
- - - "~>"
263
- - !ruby/object:Gem::Version
264
- version: '0.22'
265
- - !ruby/object:Gem::Dependency
266
- name: simplecov-cobertura
267
- requirement: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - "~>"
270
- - !ruby/object:Gem::Version
271
- version: '3.0'
272
- type: :development
273
- prerelease: false
274
- version_requirements: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - "~>"
277
- - !ruby/object:Gem::Version
278
- version: '3.0'
279
- - !ruby/object:Gem::Dependency
280
- name: yard
281
- requirement: !ruby/object:Gem::Requirement
282
- requirements:
283
- - - "~>"
284
- - !ruby/object:Gem::Version
285
- version: '0.9'
286
- type: :development
287
- prerelease: false
288
- version_requirements: !ruby/object:Gem::Requirement
289
- requirements:
290
- - - "~>"
291
- - !ruby/object:Gem::Version
292
- version: '0.9'
293
- - !ruby/object:Gem::Dependency
294
- name: brakeman
295
- requirement: !ruby/object:Gem::Requirement
296
- requirements:
297
- - - "~>"
298
- - !ruby/object:Gem::Version
299
- version: '7.1'
300
- type: :development
301
- prerelease: false
302
- version_requirements: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - "~>"
305
- - !ruby/object:Gem::Version
306
- version: '7.1'
307
- - !ruby/object:Gem::Dependency
308
- name: bundler-audit
309
- requirement: !ruby/object:Gem::Requirement
310
- requirements:
311
- - - "~>"
312
- - !ruby/object:Gem::Version
313
- version: '0.9'
314
- type: :development
315
- prerelease: false
316
- version_requirements: !ruby/object:Gem::Requirement
317
- requirements:
318
- - - "~>"
319
- - !ruby/object:Gem::Version
320
- version: '0.9'
321
- description: While Whodunit tracks who made changes, Chronicles captures what changed
322
- by streaming database events into comprehensive audit trails with zero Rails application
323
- overhead.
39
+ version: '2.0'
40
+ description: |
41
+ Whodunit Chronicles records CDC change events as immutable ledger entries.
42
+ It provides a tiny Chronicler processor, a Ledger abstraction,
43
+ and simple ledger implementations without owning replication, runtime execution, or orchestration.
324
44
  email:
325
45
  - kenneth.c.demanawa@gmail.com
326
- executables: []
46
+ executables:
47
+ - whodunit-chronicles
327
48
  extensions: []
328
49
  extra_rdoc_files: []
329
50
  files:
330
- - ".codeclimate.yml"
331
- - ".rubocop.yml"
332
- - ".yardopts"
333
51
  - CHANGELOG.md
334
- - CODE_OF_CONDUCT.md
335
- - CONTRIBUTING.md
336
52
  - LICENSE
337
53
  - README.md
338
- - Rakefile
339
- - docker-compose.yml
340
- - docker/mysql/init.sql
341
- - docker/postgres/init.sql
342
- - examples/images/campaign-performance-analytics.png
343
- - examples/images/candidate-journey-analytics.png
344
- - examples/images/recruitment-funnel-analytics.png
345
- - lib/.gitkeep
54
+ - exe/whodunit-chronicles
346
55
  - lib/whodunit-chronicles.rb
347
56
  - lib/whodunit/chronicles.rb
348
- - lib/whodunit/chronicles/adapter_loader.rb
349
- - lib/whodunit/chronicles/adapters/mysql.rb
350
- - lib/whodunit/chronicles/adapters/postgresql.rb
351
- - lib/whodunit/chronicles/change_event.rb
352
- - lib/whodunit/chronicles/composite_processor.rb
353
- - lib/whodunit/chronicles/configuration.rb
354
- - lib/whodunit/chronicles/connection.rb
57
+ - lib/whodunit/chronicles/chronicler.rb
58
+ - lib/whodunit/chronicles/cli.rb
355
59
  - lib/whodunit/chronicles/errors.rb
356
- - lib/whodunit/chronicles/persistence.rb
357
- - lib/whodunit/chronicles/processor.rb
358
- - lib/whodunit/chronicles/service.rb
359
- - lib/whodunit/chronicles/stream_adapter.rb
360
- - lib/whodunit/chronicles/table.rb
60
+ - lib/whodunit/chronicles/ledger.rb
61
+ - lib/whodunit/chronicles/ledger_entry.rb
62
+ - lib/whodunit/chronicles/ledger_factory.rb
63
+ - lib/whodunit/chronicles/ledgers/file_ledger.rb
64
+ - lib/whodunit/chronicles/ledgers/memory_ledger.rb
65
+ - lib/whodunit/chronicles/ledgers/sqlite_ledger.rb
361
66
  - lib/whodunit/chronicles/version.rb
362
- - whodunit-chronicles.gemspec
67
+ - sig/whodunit/chronicles.rbs
68
+ - sig/whodunit/chronicles/chronicler.rbs
69
+ - sig/whodunit/chronicles/cli.rbs
70
+ - sig/whodunit/chronicles/errors.rbs
71
+ - sig/whodunit/chronicles/ledger.rbs
72
+ - sig/whodunit/chronicles/ledger_entry.rbs
73
+ - sig/whodunit/chronicles/ledger_factory.rbs
74
+ - sig/whodunit/chronicles/ledgers/file_ledger.rbs
75
+ - sig/whodunit/chronicles/ledgers/memory_ledger.rbs
76
+ - sig/whodunit/chronicles/ledgers/sqlite_ledger.rbs
363
77
  homepage: https://github.com/kanutocd/whodunit-chronicles
364
78
  licenses:
365
79
  - MIT
366
80
  metadata:
367
81
  allowed_push_host: https://rubygems.org
368
82
  homepage_uri: https://github.com/kanutocd/whodunit-chronicles
369
- source_code_uri: https://github.com/kanutocd/whodunit-chronicles
83
+ source_code_uri: https://github.com/kanutocd/whodunit-chronicles/tree/main
370
84
  changelog_uri: https://github.com/kanutocd/whodunit-chronicles/blob/main/CHANGELOG.md
371
85
  rubygems_mfa_required: 'true'
372
86
  rdoc_options: []
@@ -376,14 +90,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
376
90
  requirements:
377
91
  - - ">="
378
92
  - !ruby/object:Gem::Version
379
- version: 3.2.0
93
+ version: '3.4'
380
94
  required_rubygems_version: !ruby/object:Gem::Requirement
381
95
  requirements:
382
96
  - - ">="
383
97
  - !ruby/object:Gem::Version
384
98
  version: '0'
385
99
  requirements: []
386
- rubygems_version: 3.6.9
100
+ rubygems_version: 4.0.15
387
101
  specification_version: 4
388
- summary: The complete historical record of your data
102
+ summary: A minimal CDC audit sink for immutable ledger entries
389
103
  test_files: []
data/.codeclimate.yml DELETED
@@ -1,50 +0,0 @@
1
- version: "2"
2
- checks:
3
- argument-count:
4
- config:
5
- threshold: 4
6
- complex-logic:
7
- config:
8
- threshold: 4
9
- file-lines:
10
- config:
11
- threshold: 250
12
- method-complexity:
13
- config:
14
- threshold: 5
15
- method-count:
16
- config:
17
- threshold: 20
18
- method-lines:
19
- config:
20
- threshold: 25
21
- nested-control-flow:
22
- config:
23
- threshold: 4
24
- return-statements:
25
- config:
26
- threshold: 4
27
- similar-code:
28
- config:
29
- threshold: # language-specific defaults. an integer indicates the minimum number of lines within a block of similar code.
30
- identical-code:
31
- config:
32
- threshold: # language-specific defaults. an integer indicates the minimum number of lines within a block of identical code.
33
- plugins:
34
- rubocop:
35
- enabled: true
36
- config:
37
- file: .rubocop.yml
38
- exclude_patterns:
39
- - "config/"
40
- - "db/"
41
- - "dist/"
42
- - "features/"
43
- - "**/node_modules/"
44
- - "script/"
45
- - "**/spec/"
46
- - "**/test/"
47
- - "**/tests/"
48
- - "**/vendor/"
49
- - "**/*_test.rb"
50
- - "**/*_spec.rb"
data/.rubocop.yml DELETED
@@ -1,93 +0,0 @@
1
- # Ruby version
2
- AllCops:
3
- TargetRubyVersion: 3.2
4
- NewCops: enable
5
- Exclude:
6
- - 'vendor/**/*'
7
- - 'tmp/**/*'
8
- - 'bin/**/*'
9
- - 'node_modules/**/*'
10
- - 'examples/**/*'
11
-
12
- # Use plugins for extensions
13
- plugins:
14
- - rubocop-performance
15
- - rubocop-minitest
16
-
17
- # Layout cops
18
- Layout/LineLength:
19
- Max: 120
20
- AllowedPatterns: ['\A\s*#']
21
-
22
- Layout/MultilineMethodCallBraceLayout:
23
- Enabled: false
24
-
25
- Layout/ArgumentAlignment:
26
- EnforcedStyle: with_fixed_indentation
27
-
28
- # Metrics cops - relax for complex business logic
29
- Metrics/ClassLength:
30
- Max: 250 # Allow larger classes for database adapters and processors
31
- Exclude:
32
- - 'test/**/*' # Test classes can be longer
33
-
34
- Metrics/MethodLength:
35
- Max: 50 # Allow longer methods for SQL generation and complex logic
36
-
37
- Metrics/AbcSize:
38
- Max: 40 # Allow higher complexity for database operations
39
-
40
- Metrics/CyclomaticComplexity:
41
- Max: 15 # Allow more complex conditional logic
42
-
43
- Metrics/PerceivedComplexity:
44
- Max: 15
45
-
46
- Metrics/ParameterLists:
47
- Max: 12 # Allow more params for configuration objects and event initialization
48
-
49
- # Style cops
50
- Style/Documentation:
51
- Enabled: false # We have YARD docs
52
-
53
- Style/FrozenStringLiteralComment:
54
- Enabled: true
55
- EnforcedStyle: always
56
-
57
- # Style/StringLiterals:
58
- # EnforcedStyle: double_quotes
59
-
60
- Style/HashSyntax:
61
- EnforcedStyle: ruby19
62
-
63
- Style/TrailingCommaInArguments:
64
- EnforcedStyleForMultiline: comma
65
-
66
- Style/TrailingCommaInArrayLiteral:
67
- EnforcedStyleForMultiline: comma
68
-
69
- Style/TrailingCommaInHashLiteral:
70
- EnforcedStyleForMultiline: comma
71
-
72
- # Naming
73
- Naming/FileName:
74
- Exclude:
75
- - 'lib/whodunit-chronicles.rb' # Main gem file
76
-
77
- # Gemspec
78
- Gemspec/DevelopmentDependencies:
79
- Enabled: false # We're fine with dev dependencies in gemspec
80
-
81
- # Minitest specific cops
82
- Minitest/MultipleAssertions:
83
- Max: 10 # Allow more assertions in comprehensive tests
84
-
85
- Minitest/AssertNil:
86
- Enabled: false # Prefer assert_nil over assert_equal(nil, ...)
87
-
88
- # Performance cops
89
- Performance/Casecmp:
90
- Enabled: true
91
-
92
- Performance/StringReplacement:
93
- Enabled: true
data/.yardopts DELETED
@@ -1,14 +0,0 @@
1
- --markup markdown
2
- --markup-provider kramdown
3
- --main README.md
4
- --output-dir docs
5
- --protected
6
- --private
7
- --title "Whodunit Chronicles API Documentation"
8
- --readme README.md
9
- --files CHANGELOG.md,LICENSE
10
- lib/**/*.rb
11
- -
12
- README.md
13
- CHANGELOG.md
14
- LICENSE