whodunit 0.1.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 +7 -0
- data/.codeclimate.yml +50 -0
- data/.rubocop.yml +106 -0
- data/.yardopts +12 -0
- data/CHANGELOG.md +44 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE +21 -0
- data/README.md +376 -0
- data/Rakefile +19 -0
- data/gemfiles/rails_7_2.gemfile +15 -0
- data/gemfiles/rails_8_2.gemfile +15 -0
- data/gemfiles/rails_edge.gemfile +15 -0
- data/lib/whodunit/controller_methods.rb +196 -0
- data/lib/whodunit/current.rb +78 -0
- data/lib/whodunit/migration_helpers.rb +229 -0
- data/lib/whodunit/railtie.rb +49 -0
- data/lib/whodunit/soft_delete_detector.rb +119 -0
- data/lib/whodunit/stampable.rb +184 -0
- data/lib/whodunit/version.rb +5 -0
- data/lib/whodunit.rb +121 -0
- data/sig/whodunit.rbs +4 -0
- metadata +254 -0
data/lib/whodunit.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/all"
|
4
|
+
require_relative "whodunit/version"
|
5
|
+
require_relative "whodunit/current"
|
6
|
+
require_relative "whodunit/soft_delete_detector"
|
7
|
+
require_relative "whodunit/stampable"
|
8
|
+
require_relative "whodunit/migration_helpers"
|
9
|
+
require_relative "whodunit/controller_methods"
|
10
|
+
require_relative "whodunit/railtie"
|
11
|
+
|
12
|
+
# Lightweight creator/updater/deleter tracking for ActiveRecord models.
|
13
|
+
#
|
14
|
+
# Whodunit provides simple auditing by tracking who created, updated, and deleted
|
15
|
+
# ActiveRecord models. It features smart soft-delete detection and zero performance overhead.
|
16
|
+
#
|
17
|
+
# @example Basic usage
|
18
|
+
# class Post < ApplicationRecord
|
19
|
+
# include Whodunit::Stampable
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # In controller
|
23
|
+
# Whodunit::Current.user = current_user
|
24
|
+
# post = Post.create(title: "Hello")
|
25
|
+
# post.creator_id # => current_user.id
|
26
|
+
#
|
27
|
+
# @example Configuration
|
28
|
+
# Whodunit.configure do |config|
|
29
|
+
# config.user_class = "Account"
|
30
|
+
# config.creator_column = :created_by_id
|
31
|
+
# config.column_data_type = :integer
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @author Ken C. Demanawa
|
35
|
+
# @since 0.1.0
|
36
|
+
module Whodunit
|
37
|
+
# Base error class for all Whodunit exceptions
|
38
|
+
class Error < StandardError; end
|
39
|
+
|
40
|
+
# @!group Configuration
|
41
|
+
|
42
|
+
# The class name of the user model (default: "User")
|
43
|
+
# @return [String] the user class name
|
44
|
+
mattr_accessor :user_class, default: "User"
|
45
|
+
|
46
|
+
# The column name for tracking who created the record (default: :creator_id)
|
47
|
+
# @return [Symbol] the creator column name
|
48
|
+
mattr_accessor :creator_column, default: :creator_id
|
49
|
+
|
50
|
+
# The column name for tracking who updated the record (default: :updater_id)
|
51
|
+
# @return [Symbol] the updater column name
|
52
|
+
mattr_accessor :updater_column, default: :updater_id
|
53
|
+
|
54
|
+
# The column name for tracking who deleted the record (default: :deleter_id)
|
55
|
+
# @return [Symbol] the deleter column name
|
56
|
+
mattr_accessor :deleter_column, default: :deleter_id
|
57
|
+
|
58
|
+
# Whether to automatically detect soft-delete implementations (default: true)
|
59
|
+
# @return [Boolean] auto-detection setting
|
60
|
+
mattr_accessor :auto_detect_soft_delete, default: true
|
61
|
+
|
62
|
+
# @!group Data Type Configuration
|
63
|
+
|
64
|
+
# The default data type for stamp columns (default: :bigint)
|
65
|
+
# @return [Symbol] the default column data type
|
66
|
+
mattr_accessor :column_data_type, default: :bigint
|
67
|
+
|
68
|
+
# Specific data type for creator column (overrides column_data_type if set)
|
69
|
+
# @return [Symbol, nil] the creator column data type
|
70
|
+
mattr_accessor :creator_column_type, default: nil
|
71
|
+
|
72
|
+
# Specific data type for updater column (overrides column_data_type if set)
|
73
|
+
# @return [Symbol, nil] the updater column data type
|
74
|
+
mattr_accessor :updater_column_type, default: nil
|
75
|
+
|
76
|
+
# Specific data type for deleter column (overrides column_data_type if set)
|
77
|
+
# @return [Symbol, nil] the deleter column data type
|
78
|
+
mattr_accessor :deleter_column_type, default: nil
|
79
|
+
|
80
|
+
# Configure Whodunit settings
|
81
|
+
#
|
82
|
+
# @example
|
83
|
+
# Whodunit.configure do |config|
|
84
|
+
# config.user_class = "Account"
|
85
|
+
# config.creator_column = :created_by_id
|
86
|
+
# config.column_data_type = :integer
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# @yield [self] configuration block
|
90
|
+
# @return [void]
|
91
|
+
def self.configure
|
92
|
+
yield self
|
93
|
+
end
|
94
|
+
|
95
|
+
# Get the user class name as a string
|
96
|
+
#
|
97
|
+
# @return [String] the user class name
|
98
|
+
def self.user_class_name
|
99
|
+
user_class.to_s
|
100
|
+
end
|
101
|
+
|
102
|
+
# @!group Data Type Helpers
|
103
|
+
|
104
|
+
# Get the data type for the creator column
|
105
|
+
# @return [Symbol] the creator column data type
|
106
|
+
def self.creator_data_type
|
107
|
+
creator_column_type || column_data_type
|
108
|
+
end
|
109
|
+
|
110
|
+
# Get the data type for the updater column
|
111
|
+
# @return [Symbol] the updater column data type
|
112
|
+
def self.updater_data_type
|
113
|
+
updater_column_type || column_data_type
|
114
|
+
end
|
115
|
+
|
116
|
+
# Get the data type for the deleter column
|
117
|
+
# @return [Symbol] the deleter column data type
|
118
|
+
def self.deleter_data_type
|
119
|
+
deleter_column_type || column_data_type
|
120
|
+
end
|
121
|
+
end
|
data/sig/whodunit.rbs
ADDED
metadata
ADDED
@@ -0,0 +1,254 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: whodunit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ken C. Demanawa
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2025-07-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '7.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '7.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '7.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '7.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler-audit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.9.2
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: irb
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.15'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.15'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: kramdown
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.5'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.5'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '13.3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '13.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.13'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.13'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.78'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.78'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-performance
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.25'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.25'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '3.6'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '3.6'
|
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.22.0
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.22.0
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: simplecov-cobertura
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '3.0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '3.0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: yard
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 0.9.37
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 0.9.37
|
195
|
+
description: A lightweight Rails gem that provides simple auditing by tracking who
|
196
|
+
created, updated, and deleted ActiveRecord models. Features smart soft-delete detection
|
197
|
+
and zero performance overhead.
|
198
|
+
email:
|
199
|
+
- kenneth.c.demanawa@gmail.com
|
200
|
+
executables: []
|
201
|
+
extensions: []
|
202
|
+
extra_rdoc_files: []
|
203
|
+
files:
|
204
|
+
- ".codeclimate.yml"
|
205
|
+
- ".rubocop.yml"
|
206
|
+
- ".yardopts"
|
207
|
+
- CHANGELOG.md
|
208
|
+
- CODE_OF_CONDUCT.md
|
209
|
+
- LICENSE
|
210
|
+
- README.md
|
211
|
+
- Rakefile
|
212
|
+
- gemfiles/rails_7_2.gemfile
|
213
|
+
- gemfiles/rails_8_2.gemfile
|
214
|
+
- gemfiles/rails_edge.gemfile
|
215
|
+
- lib/whodunit.rb
|
216
|
+
- lib/whodunit/controller_methods.rb
|
217
|
+
- lib/whodunit/current.rb
|
218
|
+
- lib/whodunit/migration_helpers.rb
|
219
|
+
- lib/whodunit/railtie.rb
|
220
|
+
- lib/whodunit/soft_delete_detector.rb
|
221
|
+
- lib/whodunit/stampable.rb
|
222
|
+
- lib/whodunit/version.rb
|
223
|
+
- sig/whodunit.rbs
|
224
|
+
homepage: https://github.com/kanutocd/whodunit
|
225
|
+
licenses:
|
226
|
+
- MIT
|
227
|
+
metadata:
|
228
|
+
allowed_push_host: https://rubygems.org
|
229
|
+
homepage_uri: https://github.com/kanutocd/whodunit
|
230
|
+
source_code_uri: https://github.com/kanutocd/whodunit.git
|
231
|
+
changelog_uri: https://github.com/kanutocd/whodunit/blob/main/CHANGELOG.md
|
232
|
+
bug_tracker_uri: https://github.com/kanutocd/whodunit/issues
|
233
|
+
documentation_uri: https://github.com/kanutocd/whodunit/blob/main/README.md
|
234
|
+
rubygems_mfa_required: 'true'
|
235
|
+
post_install_message:
|
236
|
+
rdoc_options: []
|
237
|
+
require_paths:
|
238
|
+
- lib
|
239
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: 3.0.0
|
244
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
|
+
requirements:
|
246
|
+
- - ">="
|
247
|
+
- !ruby/object:Gem::Version
|
248
|
+
version: '0'
|
249
|
+
requirements: []
|
250
|
+
rubygems_version: 3.5.22
|
251
|
+
signing_key:
|
252
|
+
specification_version: 4
|
253
|
+
summary: Lightweight creator/updater/deleter tracking for ActiveRecord models
|
254
|
+
test_files: []
|