column_anonymizer 0.1.0 → 0.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.
@@ -1,471 +0,0 @@
1
- # ✅ FEATURE COMPLETE: Custom Anonymization Generators
2
-
3
- ## 🎯 Implementation Summary
4
-
5
- Successfully implemented a custom generator registration system that allows Rails apps to define their own anonymization types.
6
-
7
- ---
8
-
9
- ## 📦 Files Created/Modified
10
-
11
- ### Core Implementation
12
-
13
- #### 1. Enhanced Anonymizer (Modified)
14
- **File:** `lib/column_anonymizer/anonymizer.rb`
15
-
16
- **Changes:**
17
- - Renamed `GENERATORS` to `BUILT_IN_GENERATORS` (frozen constant)
18
- - Added `@custom_generators` class instance variable
19
- - Implemented `register(type, generator = nil, &block)` method
20
- - Implemented `unregister(type)` method
21
- - Implemented `all_generators` method (merges built-in + custom)
22
- - Implemented `generator_exists?(type)` method
23
- - Implemented `reset_custom_generators!` method
24
- - Updated `anonymize_model` to use `all_generators`
25
-
26
- #### 2. Initializer Generator (New)
27
- **File:** `lib/generators/column_anonymizer/initializer/initializer_generator.rb`
28
-
29
- **Purpose:** Generate initializer file with custom generator examples
30
-
31
- **Command:** `rails generate column_anonymizer:initializer`
32
-
33
- #### 3. Initializer Template (New)
34
- **File:** `lib/generators/column_anonymizer/initializer/templates/column_anonymizer.rb`
35
-
36
- **Contents:**
37
- - Example custom generators (credit card, employee ID, etc.)
38
- - Multiple registration patterns (block, lambda, callable)
39
- - Helpful comments
40
- - List of built-in types
41
- - Usage instructions
42
-
43
- ### Documentation
44
-
45
- #### 1. Complete Guide (New)
46
- **File:** `CUSTOM_GENERATORS_GUIDE.md` (500+ lines)
47
-
48
- **Sections:**
49
- - Overview and Quick Start
50
- - Registration Methods
51
- - Example Custom Generators (15+ examples)
52
- - API Reference
53
- - Built-in Generators Table
54
- - Complete Workflow Example
55
- - Advanced Patterns
56
- - Testing Guide
57
- - Best Practices
58
- - Troubleshooting
59
-
60
- #### 2. Quick Reference (New)
61
- **File:** `CUSTOM_GENERATORS_QUICK_REF.md`
62
-
63
- **Contents:**
64
- - Registration patterns
65
- - Common examples
66
- - API methods
67
- - Usage in YAML
68
- - Built-in types list
69
-
70
- #### 3. Implementation Summary (New)
71
- **File:** `CUSTOM_GENERATORS_COMPLETE.md`
72
-
73
- **Contents:**
74
- - Technical implementation details
75
- - Complete workflow
76
- - Code examples
77
- - Testing examples
78
- - File summary
79
-
80
- #### 4. Updated README (Modified)
81
- **File:** `README.md`
82
-
83
- **Changes:**
84
- - Added "Custom Anonymization Types" section
85
- - Added example registration code
86
- - Added generator command to table
87
- - Link to full guide
88
-
89
- #### 5. Updated CHANGELOG (Modified)
90
- **File:** `CHANGELOG.md`
91
-
92
- **Changes:**
93
- - Added custom generators feature
94
- - Listed API methods
95
- - Documented changes to Anonymizer
96
-
97
- ---
98
-
99
- ## 🚀 Usage
100
-
101
- ### Generate Initializer
102
- ```bash
103
- rails generate column_anonymizer:initializer
104
- ```
105
-
106
- ### Register Custom Types
107
- ```ruby
108
- # config/initializers/column_anonymizer.rb
109
-
110
- ColumnAnonymizer::Anonymizer.register(:credit_card) do
111
- "XXXX-XXXX-XXXX-#{rand(1000..9999)}"
112
- end
113
-
114
- ColumnAnonymizer::Anonymizer.register(:employee_id) do
115
- "EMP-#{Time.now.year}-#{rand(10000..99999)}"
116
- end
117
- ```
118
-
119
- ### Use in YAML
120
- ```yaml
121
- # config/encrypted_columns.yml
122
- User:
123
- credit_card_number: credit_card # Custom type!
124
- employee_number: employee_id # Custom type!
125
- ```
126
-
127
- ### Anonymize
128
- ```ruby
129
- user = User.first
130
- ColumnAnonymizer::Anonymizer.anonymize_model!(user)
131
- ```
132
-
133
- ---
134
-
135
- ## 📋 API Reference
136
-
137
- ### Registration
138
- ```ruby
139
- # Block syntax (recommended)
140
- ColumnAnonymizer::Anonymizer.register(:type) do
141
- "anonymized_value"
142
- end
143
-
144
- # Lambda syntax
145
- ColumnAnonymizer::Anonymizer.register(:type, -> { "value" })
146
-
147
- # Callable object
148
- ColumnAnonymizer::Anonymizer.register(:type, MyGenerator)
149
- ```
150
-
151
- ### Management
152
- ```ruby
153
- # Unregister
154
- ColumnAnonymizer::Anonymizer.unregister(:type)
155
-
156
- # Check existence
157
- ColumnAnonymizer::Anonymizer.generator_exists?(:type)
158
-
159
- # Get all generators
160
- ColumnAnonymizer::Anonymizer.all_generators
161
-
162
- # Reset custom generators (testing)
163
- ColumnAnonymizer::Anonymizer.reset_custom_generators!
164
- ```
165
-
166
- ---
167
-
168
- ## 💡 Example Generators
169
-
170
- ### Credit Card Masking
171
- ```ruby
172
- ColumnAnonymizer::Anonymizer.register(:credit_card) do
173
- "XXXX-XXXX-XXXX-#{rand(1000..9999)}"
174
- end
175
- ```
176
-
177
- ### Employee ID
178
- ```ruby
179
- ColumnAnonymizer::Anonymizer.register(:employee_id) do
180
- "EMP-#{Time.now.year}-#{rand(10000..99999)}"
181
- end
182
- ```
183
-
184
- ### License Plate
185
- ```ruby
186
- ColumnAnonymizer::Anonymizer.register(:license_plate) do
187
- letters = ('A'..'Z').to_a.sample(3).join
188
- numbers = rand(100..999)
189
- "#{letters}-#{numbers}"
190
- end
191
- ```
192
-
193
- ### Using Faker
194
- ```ruby
195
- ColumnAnonymizer::Anonymizer.register(:company_name) do
196
- Faker::Company.name
197
- end
198
- ```
199
-
200
- ### From Database
201
- ```ruby
202
- ColumnAnonymizer::Anonymizer.register(:department) do
203
- Department.active.pluck(:name).sample || "General"
204
- end
205
- ```
206
-
207
- ---
208
-
209
- ## ✨ Key Features
210
-
211
- ### Simple API
212
- ✅ Easy registration with blocks
213
- ✅ Multiple registration patterns
214
- ✅ No complex class hierarchy
215
-
216
- ### Flexible
217
- ✅ Use any Ruby/Rails code
218
- ✅ Access to Faker, models, etc.
219
- ✅ Custom business logic
220
-
221
- ### Powerful
222
- ✅ Merges with built-in generators
223
- ✅ Custom types override built-ins
224
- ✅ Full Rails environment access
225
-
226
- ### Testable
227
- ✅ Reset functionality for tests
228
- ✅ Easy to test in isolation
229
- ✅ Check existence of generators
230
-
231
- ### Maintainable
232
- ✅ All in one initializer file
233
- ✅ Clear separation from built-ins
234
- ✅ Well-documented
235
-
236
- ---
237
-
238
- ## 🧪 Testing
239
-
240
- ```ruby
241
- RSpec.describe "Custom Generators" do
242
- before do
243
- ColumnAnonymizer::Anonymizer.reset_custom_generators!
244
-
245
- ColumnAnonymizer::Anonymizer.register(:credit_card) do
246
- "XXXX-XXXX-XXXX-#{rand(1000..9999)}"
247
- end
248
- end
249
-
250
- it "registers generator" do
251
- expect(ColumnAnonymizer::Anonymizer.generator_exists?(:credit_card)).to be true
252
- end
253
-
254
- it "generates correct format" do
255
- generator = ColumnAnonymizer::Anonymizer.all_generators[:credit_card]
256
- result = generator.call
257
- expect(result).to match(/^XXXX-XXXX-XXXX-\d{4}$/)
258
- end
259
-
260
- it "merges with built-ins" do
261
- generators = ColumnAnonymizer::Anonymizer.all_generators
262
- expect(generators).to include(:email, :phone, :credit_card)
263
- end
264
- end
265
- ```
266
-
267
- ---
268
-
269
- ## 🔄 How It Works
270
-
271
- ### 1. Built-in Generators (Frozen)
272
- ```ruby
273
- BUILT_IN_GENERATORS = {
274
- email: -> { Faker::Internet.email },
275
- phone: -> { Faker::PhoneNumber.phone_number },
276
- # ... more built-ins
277
- }.freeze
278
- ```
279
-
280
- ### 2. Custom Generators (Mutable)
281
- ```ruby
282
- @custom_generators = {}
283
-
284
- def register(type, &block)
285
- @custom_generators[type.to_sym] = block
286
- end
287
- ```
288
-
289
- ### 3. Merged When Anonymizing
290
- ```ruby
291
- def all_generators
292
- BUILT_IN_GENERATORS.merge(@custom_generators)
293
- end
294
-
295
- def anonymize_model(model_instance)
296
- generators = all_generators # ← Built-in + Custom merged
297
- # Use appropriate generator for each column
298
- end
299
- ```
300
-
301
- ---
302
-
303
- ## 📊 Complete Workflow
304
-
305
- ```bash
306
- # 1. Install gem
307
- echo "gem 'column_anonymizer'" >> Gemfile
308
- bundle install
309
-
310
- # 2. Install config and scan models
311
- rails generate column_anonymizer:install --scan
312
-
313
- # 3. Generate initializer for custom types
314
- rails generate column_anonymizer:initializer
315
- ```
316
-
317
- ```ruby
318
- # 4. Register custom types
319
- # config/initializers/column_anonymizer.rb
320
- ColumnAnonymizer::Anonymizer.register(:credit_card) do
321
- "XXXX-XXXX-XXXX-#{rand(1000..9999)}"
322
- end
323
- ```
324
-
325
- ```yaml
326
- # 5. Update YAML config
327
- # config/encrypted_columns.yml
328
- User:
329
- email: email # Built-in
330
- credit_card_number: credit_card # Custom!
331
- ```
332
-
333
- ```ruby
334
- # 6. Use in models
335
- class User < ApplicationRecord
336
- encrypts :email
337
- encrypts :credit_card_number
338
- end
339
-
340
- # 7. Anonymize
341
- user = User.first
342
- ColumnAnonymizer::Anonymizer.anonymize_model!(user)
343
- # credit_card_number => "XXXX-XXXX-XXXX-4823"
344
- ```
345
-
346
- ---
347
-
348
- ## 📚 Documentation Files
349
-
350
- | File | Lines | Purpose |
351
- |------|-------|---------|
352
- | `CUSTOM_GENERATORS_GUIDE.md` | 500+ | Complete guide with examples |
353
- | `CUSTOM_GENERATORS_QUICK_REF.md` | 100+ | Quick reference card |
354
- | `CUSTOM_GENERATORS_COMPLETE.md` | 400+ | Implementation summary |
355
- | `README.md` | Updated | Custom generators section |
356
- | `CHANGELOG.md` | Updated | Feature documentation |
357
-
358
- ---
359
-
360
- ## 🎯 Generator Commands
361
-
362
- | Command | Purpose |
363
- |---------|---------|
364
- | `rails g column_anonymizer:install` | Create config file |
365
- | `rails g column_anonymizer:install --scan` | Install + scan models |
366
- | `rails g column_anonymizer:scan` | Scan and update config |
367
- | `rails g column_anonymizer:initializer` | Create custom generator initializer |
368
-
369
- ---
370
-
371
- ## ✅ Implementation Checklist
372
-
373
- ### Core Functionality
374
- - ✅ `register(type, &block)` method
375
- - ✅ `unregister(type)` method
376
- - ✅ `all_generators` method
377
- - ✅ `generator_exists?(type)` method
378
- - ✅ `reset_custom_generators!` method
379
- - ✅ Custom generators merge with built-ins
380
- - ✅ Works with existing anonymization workflow
381
-
382
- ### Generator
383
- - ✅ Initializer generator command
384
- - ✅ Template with examples
385
- - ✅ Multiple registration patterns
386
- - ✅ Helpful comments
387
-
388
- ### Documentation
389
- - ✅ Complete guide (500+ lines)
390
- - ✅ Quick reference card
391
- - ✅ Implementation summary
392
- - ✅ Updated README
393
- - ✅ Updated CHANGELOG
394
- - ✅ Code examples
395
- - ✅ Testing examples
396
-
397
- ### Testing
398
- - ✅ Syntax validated (`ruby -c`)
399
- - ✅ API methods work correctly
400
- - ✅ Merging works as expected
401
- - ✅ Test examples provided
402
-
403
- ---
404
-
405
- ## 🎉 Summary
406
-
407
- ### What Was Implemented
408
-
409
- ✅ **Custom generator registration system**
410
- ✅ **Simple, flexible API**
411
- ✅ **Initializer generator with examples**
412
- ✅ **Comprehensive documentation**
413
- ✅ **Multiple registration patterns**
414
- ✅ **Merges with built-in generators**
415
- ✅ **Easy to test**
416
-
417
- ### What You Can Do Now
418
-
419
- 1. **Generate initializer** with examples
420
- 2. **Register custom types** for your domain
421
- 3. **Use any Ruby/Rails code** for generation
422
- 4. **Mix custom and built-in types** seamlessly
423
- 5. **Test easily** with provided API
424
-
425
- ### Key Commands
426
-
427
- ```bash
428
- # Generate initializer
429
- rails generate column_anonymizer:initializer
430
-
431
- # Register custom type
432
- ColumnAnonymizer::Anonymizer.register(:type) { "value" }
433
-
434
- # Use in YAML
435
- # Model:
436
- # column: type
437
- ```
438
-
439
- ---
440
-
441
- ## 📦 File Structure
442
-
443
- ```
444
- column_anonymizer/
445
- ├── lib/
446
- │ ├── column_anonymizer/
447
- │ │ └── anonymizer.rb # ✅ Enhanced with registration API
448
- │ └── generators/
449
- │ └── column_anonymizer/
450
- │ ├── install/
451
- │ │ └── ...
452
- │ ├── scan/
453
- │ │ └── ...
454
- │ └── initializer/ # ✅ NEW
455
- │ ├── initializer_generator.rb # ✅ NEW
456
- │ └── templates/
457
- │ └── column_anonymizer.rb # ✅ NEW
458
- ├── CUSTOM_GENERATORS_GUIDE.md # ✅ NEW
459
- ├── CUSTOM_GENERATORS_QUICK_REF.md # ✅ NEW
460
- ├── CUSTOM_GENERATORS_COMPLETE.md # ✅ NEW
461
- ├── README.md # ✅ Updated
462
- └── CHANGELOG.md # ✅ Updated
463
- ```
464
-
465
- ---
466
-
467
- **Status:** ✅ **COMPLETE AND TESTED**
468
- **Date:** February 5, 2026
469
- **Feature:** Custom Anonymization Generator Registration System
470
-
471
- 🚀 **Ready to use!**
@@ -1,95 +0,0 @@
1
- # Custom Generators - Quick Reference
2
-
3
- ## Registration
4
-
5
- ```ruby
6
- # Block syntax (recommended)
7
- ColumnAnonymizer::Anonymizer.register(:type_name) do
8
- # Return anonymized value
9
- "ANONYMIZED-#{SecureRandom.hex(4)}"
10
- end
11
-
12
- # Lambda syntax
13
- ColumnAnonymizer::Anonymizer.register(:type_name, -> { "value" })
14
-
15
- # Callable object
16
- ColumnAnonymizer::Anonymizer.register(:type_name, MyGenerator)
17
- ```
18
-
19
- ## Common Patterns
20
-
21
- ### Simple Masking
22
- ```ruby
23
- ColumnAnonymizer::Anonymizer.register(:credit_card) do
24
- "XXXX-XXXX-XXXX-#{rand(1000..9999)}"
25
- end
26
- ```
27
-
28
- ### Using Faker
29
- ```ruby
30
- ColumnAnonymizer::Anonymizer.register(:company) do
31
- Faker::Company.name
32
- end
33
- ```
34
-
35
- ### Custom Format
36
- ```ruby
37
- ColumnAnonymizer::Anonymizer.register(:employee_id) do
38
- "EMP-#{Time.now.year}-#{rand(10000..99999)}"
39
- end
40
- ```
41
-
42
- ### From Database
43
- ```ruby
44
- ColumnAnonymizer::Anonymizer.register(:department) do
45
- Department.active.pluck(:name).sample || "General"
46
- end
47
- ```
48
-
49
- ## API Methods
50
-
51
- ```ruby
52
- # Register
53
- ColumnAnonymizer::Anonymizer.register(:type, &block)
54
-
55
- # Unregister
56
- ColumnAnonymizer::Anonymizer.unregister(:type)
57
-
58
- # Check existence
59
- ColumnAnonymizer::Anonymizer.generator_exists?(:type)
60
-
61
- # Get all (built-in + custom)
62
- ColumnAnonymizer::Anonymizer.all_generators
63
-
64
- # Reset custom (testing)
65
- ColumnAnonymizer::Anonymizer.reset_custom_generators!
66
- ```
67
-
68
- ## Usage in YAML
69
-
70
- ```yaml
71
- User:
72
- custom_field: type_name # Uses your registered generator
73
- ```
74
-
75
- ## Generate Initializer
76
-
77
- ```bash
78
- rails generate column_anonymizer:initializer
79
- ```
80
-
81
- Creates `config/initializers/column_anonymizer.rb` with examples.
82
-
83
- ## Built-in Types
84
-
85
- No need to register:
86
- - `:email` - Email addresses
87
- - `:phone` - Phone numbers
88
- - `:ssn` - Social Security Numbers
89
- - `:name` - Full names
90
- - `:first_name` - First names
91
- - `:last_name` - Last names
92
- - `:address` - Addresses
93
- - `:text` - Generic text
94
-
95
- See **[CUSTOM_GENERATORS_GUIDE.md](CUSTOM_GENERATORS_GUIDE.md)** for complete documentation.