familia 2.0.0.pre10 → 2.0.0.pre13

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +2 -3
  3. data/CHANGELOG.rst +507 -0
  4. data/CLAUDE.md +5 -55
  5. data/Gemfile +1 -6
  6. data/Gemfile.lock +13 -7
  7. data/changelog.d/README.md +45 -34
  8. data/changelog.d/scriv.ini +5 -0
  9. data/docs/archive/FAMILIA_RELATIONSHIPS.md +1 -1
  10. data/docs/archive/FAMILIA_UPDATE.md +1 -1
  11. data/docs/archive/README.md +15 -19
  12. data/docs/guides/Feature-System-Autoloading.md +228 -0
  13. data/docs/guides/Home.md +1 -1
  14. data/docs/guides/Implementation-Guide.md +1 -1
  15. data/docs/guides/relationships-methods.md +1 -1
  16. data/docs/guides/time-utilities.md +221 -0
  17. data/docs/migrating/.gitignore +2 -0
  18. data/docs/migrating/v2.0.0-pre.md +84 -0
  19. data/docs/migrating/v2.0.0-pre11.md +253 -0
  20. data/docs/migrating/v2.0.0-pre12.md +306 -0
  21. data/docs/migrating/v2.0.0-pre13.md +329 -0
  22. data/docs/migrating/v2.0.0-pre5.md +110 -0
  23. data/docs/migrating/v2.0.0-pre6.md +154 -0
  24. data/docs/migrating/v2.0.0-pre7.md +222 -0
  25. data/docs/overview.md +6 -7
  26. data/{examples/redis_command_validation_example.rb → docs/reference/auditing_database_commands.rb} +29 -32
  27. data/examples/autoloader/mega_customer/safe_dump_fields.rb +6 -0
  28. data/examples/autoloader/mega_customer.rb +17 -0
  29. data/examples/{bit_encoding_integration.rb → permissions.rb} +30 -27
  30. data/examples/{relationships_basic.rb → relationships.rb} +2 -3
  31. data/examples/safe_dump.rb +281 -0
  32. data/familia.gemspec +5 -4
  33. data/lib/familia/autoloader.rb +53 -0
  34. data/lib/familia/base.rb +57 -0
  35. data/lib/familia/data_type.rb +4 -0
  36. data/lib/familia/encryption/encrypted_data.rb +4 -4
  37. data/lib/familia/encryption/manager.rb +6 -4
  38. data/lib/familia/{encryption_request_cache.rb → encryption/request_cache.rb} +1 -1
  39. data/lib/familia/encryption.rb +1 -1
  40. data/lib/familia/errors.rb +5 -0
  41. data/lib/familia/features/autoloadable.rb +113 -0
  42. data/lib/familia/features/encrypted_fields/concealed_string.rb +4 -2
  43. data/lib/familia/features/expiration.rb +4 -0
  44. data/lib/familia/features/external_identifier.rb +310 -0
  45. data/lib/familia/features/object_identifier.rb +307 -0
  46. data/lib/familia/features/quantization.rb +5 -0
  47. data/lib/familia/features/safe_dump.rb +74 -73
  48. data/lib/familia/features.rb +109 -17
  49. data/lib/familia/field_type.rb +2 -0
  50. data/lib/familia/horreum/core/serialization.rb +3 -3
  51. data/lib/familia/horreum/subclass/definition.rb +50 -7
  52. data/lib/familia/horreum.rb +2 -0
  53. data/lib/familia/json_serializer.rb +70 -0
  54. data/lib/familia/logging.rb +12 -10
  55. data/lib/familia/refinements/logger_trace.rb +57 -0
  56. data/lib/familia/refinements/snake_case.rb +40 -0
  57. data/lib/familia/refinements/time_utils.rb +248 -0
  58. data/lib/familia/refinements.rb +3 -49
  59. data/lib/familia/secure_identifier.rb +51 -75
  60. data/lib/familia/utils.rb +2 -0
  61. data/lib/familia/validation/{test_helpers.rb → validation_helpers.rb} +2 -2
  62. data/lib/familia/validation.rb +1 -1
  63. data/lib/familia/verifiable_identifier.rb +162 -0
  64. data/lib/familia/version.rb +1 -1
  65. data/lib/familia.rb +15 -2
  66. data/try/core/autoloader_try.rb +112 -0
  67. data/try/core/extensions_try.rb +38 -21
  68. data/try/core/familia_extended_try.rb +4 -3
  69. data/try/core/secure_identifier_try.rb +47 -18
  70. data/try/core/time_utils_try.rb +130 -0
  71. data/try/core/verifiable_identifier_try.rb +171 -0
  72. data/try/data_types/datatype_base_try.rb +3 -2
  73. data/try/features/autoloadable/autoloadable_try.rb +61 -0
  74. data/try/features/encrypted_fields/concealed_string_core_try.rb +8 -3
  75. data/try/features/encrypted_fields/secure_by_default_behavior_try.rb +59 -17
  76. data/try/features/encrypted_fields/universal_serialization_safety_try.rb +36 -12
  77. data/try/features/{external_identifiers/external_identifiers_try.rb → external_identifier/external_identifier_try.rb} +25 -28
  78. data/try/features/feature_improvements_try.rb +127 -0
  79. data/try/features/{object_identifiers/object_identifiers_integration_try.rb → object_identifier/object_identifier_integration_try.rb} +28 -30
  80. data/try/features/{object_identifiers/object_identifiers_try.rb → object_identifier/object_identifier_try.rb} +13 -13
  81. data/try/features/real_feature_integration_try.rb +8 -7
  82. data/try/features/safe_dump/safe_dump_autoloading_try.rb +111 -0
  83. data/try/features/safe_dump/safe_dump_try.rb +8 -9
  84. data/try/helpers/test_helpers.rb +41 -17
  85. data/try/integration/cross_component_try.rb +3 -1
  86. metadata +61 -26
  87. data/CHANGELOG.md +0 -184
  88. data/changelog.d/fragments/.keep +0 -0
  89. data/changelog.d/template.md.j2 +0 -29
  90. data/lib/familia/core_ext.rb +0 -135
  91. data/lib/familia/features/external_identifiers/external_identifier_field_type.rb +0 -120
  92. data/lib/familia/features/external_identifiers.rb +0 -111
  93. data/lib/familia/features/object_identifiers/object_identifier_field_type.rb +0 -91
  94. data/lib/familia/features/object_identifiers.rb +0 -194
  95. data/setup.cfg +0 -12
@@ -12,6 +12,8 @@ Familia.enable_database_logging = true
12
12
  Familia.enable_database_counter = true
13
13
 
14
14
  class Bone < Familia::Horreum
15
+ using Familia::Refinements::TimeUtils
16
+
15
17
  identifier_field :token
16
18
  field :token
17
19
  field :name
@@ -33,7 +35,15 @@ class Blone < Familia::Horreum
33
35
  string :value, default: 'GREAT!'
34
36
  end
35
37
 
38
+ class Bourne < Familia::Horreum
39
+ feature :object_identifier
40
+ feature :external_identifier
41
+ end
42
+
36
43
  class Customer < Familia::Horreum
44
+
45
+ using Familia::Refinements::TimeUtils
46
+
37
47
  logical_database 15 # Use something other than the default DB
38
48
  default_expiration 5.years
39
49
 
@@ -41,24 +51,19 @@ class Customer < Familia::Horreum
41
51
  # feature :expiration
42
52
  # feature :api_version
43
53
 
44
- # NOTE: The SafeDump mixin caches the safe_dump_field_map so updating this list
45
- # with hot reloading in dev mode will not work. You will need to restart the
46
- # server to see the changes.
47
- @safe_dump_fields = [
48
- :custid,
49
- :role,
50
- :verified,
51
- :updated,
52
- :created,
53
-
54
- # NOTE: The secrets_created incrementer is null until the first secret
55
- # is created. See CreateSecret for where the incrementer is called.
56
- #
57
- { secrets_created: ->(cust) { cust.secrets_created.value || 0 } },
54
+ # Use new SafeDump DSL instead of @safe_dump_fields
55
+ safe_dump_field :custid
56
+ safe_dump_field :role
57
+ safe_dump_field :verified
58
+ safe_dump_field :updated
59
+ safe_dump_field :created
58
60
 
59
- # We use the hash syntax here since `:active?` is not a valid symbol.
60
- { active: ->(cust) { cust.active? } }
61
- ]
61
+ # NOTE: The secrets_created incrementer is null until the first secret
62
+ # is created. See CreateSecret for where the incrementer is called.
63
+ safe_dump_field :secrets_created, ->(cust) { cust.secrets_created.value || 0 }
64
+
65
+ # We use a callable here since `:active?` is not a valid method symbol.
66
+ safe_dump_field :active, ->(cust) { cust.active? }
62
67
 
63
68
  class_sorted_set :values, key: 'onetime:customer'
64
69
  class_hashkey :domains
@@ -101,6 +106,8 @@ end
101
106
  @c.custid = 'd@example.com'
102
107
 
103
108
  class Session < Familia::Horreum
109
+ using Familia::Refinements::TimeUtils
110
+
104
111
  logical_database 14 # don't use Onetime's default DB
105
112
  default_expiration 180.minutes
106
113
 
@@ -123,6 +130,8 @@ end
123
130
  @s = Session.new
124
131
 
125
132
  class CustomDomain < Familia::Horreum
133
+ using Familia::Refinements::TimeUtils
134
+
126
135
  feature :expiration
127
136
 
128
137
  class_sorted_set :values
@@ -152,6 +161,8 @@ end
152
161
  @d.custid = @c.custid
153
162
 
154
163
  class Limiter < Familia::Horreum
164
+ using Familia::Refinements::TimeUtils
165
+
155
166
  feature :expiration
156
167
  feature :quantization
157
168
 
@@ -229,3 +240,16 @@ module ConcealedStringTestHelper
229
240
  end
230
241
  end
231
242
  end
243
+
244
+ # Helper module for testing refinements in tryouts
245
+ module RefinedContext
246
+ using Familia::Refinements::TimeUtils
247
+
248
+ def self.eval_in_refined_context(code)
249
+ eval(code)
250
+ end
251
+
252
+ def self.instance_eval_in_refined_context(code)
253
+ instance_eval(code)
254
+ end
255
+ end
@@ -2,7 +2,9 @@
2
2
 
3
3
  require_relative '../helpers/test_helpers'
4
4
 
5
- TestUser = Class.new(Familia::Horreum) do
5
+ class TestUser < Familia::Horreum
6
+ using Familia::Refinements::SnakeCase
7
+
6
8
  identifier_field :email
7
9
  field :email
8
10
  field :name
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: familia
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre10
4
+ version: 2.0.0.pre13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delano Mandelbaum
@@ -15,56 +15,70 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '0.1'
18
+ version: '0.4'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '0.1'
25
+ version: '0.4'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: connection_pool
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '2.4'
32
+ version: '2.5'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '2.4'
39
+ version: '2.5'
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: csv
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '3.1'
46
+ version: '3.3'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '3.1'
53
+ version: '3.3'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: logger
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.6'
60
+ version: '1.7'
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.6'
67
+ version: '1.7'
68
+ - !ruby/object:Gem::Dependency
69
+ name: oj
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.16'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.16'
68
82
  - !ruby/object:Gem::Dependency
69
83
  name: redis
70
84
  requirement: !ruby/object:Gem::Requirement
@@ -129,7 +143,7 @@ files:
129
143
  - ".rubocop.yml"
130
144
  - ".rubocop_todo.yml"
131
145
  - ".yardopts"
132
- - CHANGELOG.md
146
+ - CHANGELOG.rst
133
147
  - CLAUDE.md
134
148
  - Gemfile
135
149
  - Gemfile.lock
@@ -137,8 +151,7 @@ files:
137
151
  - README.md
138
152
  - bin/irb
139
153
  - changelog.d/README.md
140
- - changelog.d/fragments/.keep
141
- - changelog.d/template.md.j2
154
+ - changelog.d/scriv.ini
142
155
  - docs/archive/.gitignore
143
156
  - docs/archive/FAMILIA_RELATIONSHIPS.md
144
157
  - docs/archive/FAMILIA_TECHNICAL.md
@@ -150,6 +163,7 @@ files:
150
163
  - docs/guides/Connection-Pooling-Guide.md
151
164
  - docs/guides/Encrypted-Fields-Overview.md
152
165
  - docs/guides/Expiration-Feature-Guide.md
166
+ - docs/guides/Feature-System-Autoloading.md
153
167
  - docs/guides/Feature-System-Guide.md
154
168
  - docs/guides/Features-System-Developer-Guide.md
155
169
  - docs/guides/Field-System-Guide.md
@@ -160,15 +174,27 @@ files:
160
174
  - docs/guides/Security-Model.md
161
175
  - docs/guides/Transient-Fields-Guide.md
162
176
  - docs/guides/relationships-methods.md
177
+ - docs/guides/time-utilities.md
178
+ - docs/migrating/.gitignore
179
+ - docs/migrating/v2.0.0-pre.md
180
+ - docs/migrating/v2.0.0-pre11.md
181
+ - docs/migrating/v2.0.0-pre12.md
182
+ - docs/migrating/v2.0.0-pre13.md
183
+ - docs/migrating/v2.0.0-pre5.md
184
+ - docs/migrating/v2.0.0-pre6.md
185
+ - docs/migrating/v2.0.0-pre7.md
163
186
  - docs/overview.md
164
- - examples/bit_encoding_integration.rb
165
- - examples/redis_command_validation_example.rb
166
- - examples/relationships_basic.rb
187
+ - docs/reference/auditing_database_commands.rb
188
+ - examples/autoloader/mega_customer.rb
189
+ - examples/autoloader/mega_customer/safe_dump_fields.rb
190
+ - examples/permissions.rb
191
+ - examples/relationships.rb
192
+ - examples/safe_dump.rb
167
193
  - familia.gemspec
168
194
  - lib/familia.rb
195
+ - lib/familia/autoloader.rb
169
196
  - lib/familia/base.rb
170
197
  - lib/familia/connection.rb
171
- - lib/familia/core_ext.rb
172
198
  - lib/familia/data_type.rb
173
199
  - lib/familia/data_type/commands.rb
174
200
  - lib/familia/data_type/serialization.rb
@@ -187,17 +213,16 @@ files:
187
213
  - lib/familia/encryption/providers/secure_xchacha20_poly1305_provider.rb
188
214
  - lib/familia/encryption/providers/xchacha20_poly1305_provider.rb
189
215
  - lib/familia/encryption/registry.rb
190
- - lib/familia/encryption_request_cache.rb
216
+ - lib/familia/encryption/request_cache.rb
191
217
  - lib/familia/errors.rb
192
218
  - lib/familia/features.rb
219
+ - lib/familia/features/autoloadable.rb
193
220
  - lib/familia/features/encrypted_fields.rb
194
221
  - lib/familia/features/encrypted_fields/concealed_string.rb
195
222
  - lib/familia/features/encrypted_fields/encrypted_field_type.rb
196
223
  - lib/familia/features/expiration.rb
197
- - lib/familia/features/external_identifiers.rb
198
- - lib/familia/features/external_identifiers/external_identifier_field_type.rb
199
- - lib/familia/features/object_identifiers.rb
200
- - lib/familia/features/object_identifiers/object_identifier_field_type.rb
224
+ - lib/familia/features/external_identifier.rb
225
+ - lib/familia/features/object_identifier.rb
201
226
  - lib/familia/features/quantization.rb
202
227
  - lib/familia/features/relationships.rb
203
228
  - lib/familia/features/relationships/cascading.rb
@@ -224,21 +249,26 @@ files:
224
249
  - lib/familia/horreum/subclass/definition.rb
225
250
  - lib/familia/horreum/subclass/management.rb
226
251
  - lib/familia/horreum/subclass/related_fields_management.rb
252
+ - lib/familia/json_serializer.rb
227
253
  - lib/familia/logging.rb
228
254
  - lib/familia/multi_result.rb
229
255
  - lib/familia/refinements.rb
256
+ - lib/familia/refinements/logger_trace.rb
257
+ - lib/familia/refinements/snake_case.rb
258
+ - lib/familia/refinements/time_utils.rb
230
259
  - lib/familia/secure_identifier.rb
231
260
  - lib/familia/settings.rb
232
261
  - lib/familia/utils.rb
233
262
  - lib/familia/validation.rb
234
263
  - lib/familia/validation/command_recorder.rb
235
264
  - lib/familia/validation/expectations.rb
236
- - lib/familia/validation/test_helpers.rb
265
+ - lib/familia/validation/validation_helpers.rb
237
266
  - lib/familia/validation/validator.rb
267
+ - lib/familia/verifiable_identifier.rb
238
268
  - lib/familia/version.rb
239
269
  - lib/middleware/database_middleware.rb
240
- - setup.cfg
241
270
  - try/configuration/scenarios_try.rb
271
+ - try/core/autoloader_try.rb
242
272
  - try/core/base_enhancements_try.rb
243
273
  - try/core/connection_try.rb
244
274
  - try/core/create_method_try.rb
@@ -252,8 +282,10 @@ files:
252
282
  - try/core/pools_try.rb
253
283
  - try/core/secure_identifier_try.rb
254
284
  - try/core/settings_try.rb
285
+ - try/core/time_utils_try.rb
255
286
  - try/core/tools_try.rb
256
287
  - try/core/utils_try.rb
288
+ - try/core/verifiable_identifier_try.rb
257
289
  - try/data_types/boolean_try.rb
258
290
  - try/data_types/counter_try.rb
259
291
  - try/data_types/datatype_base_try.rb
@@ -303,6 +335,7 @@ files:
303
335
  - try/encryption/providers/xchacha20_poly1305_provider_try.rb
304
336
  - try/encryption/roundtrip_validation_try.rb
305
337
  - try/encryption/secure_memory_handling_try.rb
338
+ - try/features/autoloadable/autoloadable_try.rb
306
339
  - try/features/encrypted_fields/aad_protection_try.rb
307
340
  - try/features/encrypted_fields/concealed_string_core_try.rb
308
341
  - try/features/encrypted_fields/context_isolation_try.rb
@@ -321,10 +354,11 @@ files:
321
354
  - try/features/encrypted_fields/thread_safety_try.rb
322
355
  - try/features/encrypted_fields/universal_serialization_safety_try.rb
323
356
  - try/features/expiration/expiration_try.rb
324
- - try/features/external_identifiers/external_identifiers_try.rb
357
+ - try/features/external_identifier/external_identifier_try.rb
325
358
  - try/features/feature_dependencies_try.rb
326
- - try/features/object_identifiers/object_identifiers_integration_try.rb
327
- - try/features/object_identifiers/object_identifiers_try.rb
359
+ - try/features/feature_improvements_try.rb
360
+ - try/features/object_identifier/object_identifier_integration_try.rb
361
+ - try/features/object_identifier/object_identifier_try.rb
328
362
  - try/features/quantization/quantization_try.rb
329
363
  - try/features/real_feature_integration_try.rb
330
364
  - try/features/relationships/categorical_permissions_try.rb
@@ -336,6 +370,7 @@ files:
336
370
  - try/features/relationships/relationships_performance_working_try.rb
337
371
  - try/features/relationships/relationships_try.rb
338
372
  - try/features/safe_dump/safe_dump_advanced_try.rb
373
+ - try/features/safe_dump/safe_dump_autoloading_try.rb
339
374
  - try/features/safe_dump/safe_dump_try.rb
340
375
  - try/features/transient_fields/redacted_string_try.rb
341
376
  - try/features/transient_fields/refresh_reset_try.rb
data/CHANGELOG.md DELETED
@@ -1,184 +0,0 @@
1
- # CHANGELOG.md
2
-
3
- All notable changes to Familia are documented here.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
-
8
- <!--scriv-insert-here-->
9
-
10
- <a id='changelog-2.0.0-pre10'></a>
11
- ## [2.0.0-pre10] - 2025-09-02 18:07:56.439890
12
-
13
- ### Added
14
-
15
- - The `Familia::Horreum` initializer now supports creating an object directly from its identifier by passing a single argument (e.g., `Customer.new(customer_id)`). This provides a more convenient and intuitive way to instantiate objects from lookups.
16
-
17
- - Automatic indexing and class-level tracking on `save()` operations, eliminating the need for manual index updates.
18
- - Enhanced collection syntax supports the Ruby-idiomatic `<<` operator for more natural relationship management.
19
-
20
- ### Changed
21
-
22
- - The `member_of` relationship is now bidirectional. A single call to `member.add_to_owner_collection(owner)` is sufficient to establish the relationship, removing the need for a second, redundant call on the owner object. This fixes bugs where members could be added to collections twice.
23
-
24
- - **BREAKING**: Refactored Familia Relationships API to remove "global" terminology and simplify method generation. (Closes #86)
25
- - Split `generate_indexing_instance_methods` into focused `generate_direct_index_methods` and `generate_relationship_index_methods` for better separation between direct class-level and relationship-based indexing.
26
- - Simplified method generation by removing complex global vs parent conditionals.
27
- - All indexes are now stored at the class level for consistency.
28
-
29
- ### Fixed
30
-
31
- - Fixed a bug in the `class_indexed_by` feature where finder methods (e.g., `find_by_email`) would fail to correctly instantiate objects from the index, returning partially-formed objects.
32
-
33
- - Refactored connection handling to properly cache and reuse Redis connections. This eliminates repetitive "Overriding existing connection" warnings and improves performance.
34
-
35
- - Method generation now works consistently for both `class_indexed_by` and `indexed_by` with a `parent:`.
36
- - Resolved metadata storage issues for dynamically created classes.
37
- - Improved error handling for nil class names in tracking relationships.
38
-
39
- ### Documentation
40
-
41
- - Updated the `examples/relationships_basic.rb` script to reflect the improved, bidirectional `member_of` API and to ensure a clean database state for each run.
42
-
43
- ### AI Assistance
44
-
45
- - This refactoring was implemented with Claude Code assistance, including comprehensive test updates and API modernization.
46
-
47
- <a id='changelog-2.0.0-pre9'></a>
48
- # [2.0.0-pre9] - 2025-09-02 00:35:28.974817
49
-
50
- ## Added
51
-
52
- - Added `class_tracked_in` method for global tracking relationships following Horreum's established `class_` prefix convention
53
- - Added `class_indexed_by` method for global index relationships with consistent API design
54
-
55
- ## Changed
56
-
57
- - **BREAKING**: `tracked_in :global, collection` syntax now raises ArgumentError - use `class_tracked_in collection` instead
58
- - **BREAKING**: `indexed_by field, index, context: :global` syntax replaced with `class_indexed_by field, index`
59
- - **BREAKING**: `indexed_by field, index, context: SomeClass` syntax replaced with `indexed_by field, index, parent: SomeClass`
60
- - Relationships API now provides consistent parameter naming across all relationship types
61
-
62
- ## Documentation
63
-
64
- - Updated Relationships Guide with new API syntax and migration examples
65
- - Updated relationships method documentation with new method signatures
66
- - Updated basic relationships example to demonstrate new API patterns
67
- - Added tryouts test coverage in try/features/relationships/relationships_api_changes_try.rb
68
-
69
-
70
- <a id='changelog-2.0.0-pre8'></a>
71
- ## [2.0.0-pre8] - 2025-09-01
72
-
73
- #### Added
74
-
75
- - Implemented Scriv-based changelog system for sustainable documentation
76
- - Added fragment-based workflow for tracking changes
77
- - Created structured changelog templates and configuration
78
-
79
- ### Documentation
80
-
81
- - Set up Scriv configuration and directory structure
82
- - Created README for changelog fragment workflow
83
-
84
-
85
- <a id='changelog-2.0.0-pre7'></a>
86
- ## [2.0.0-pre7] - 2025-08-31
87
-
88
- ### Added
89
-
90
- - Comprehensive relationships system with three relationship types:
91
- - `tracked_in` - Multi-presence tracking with score encoding
92
- - `indexed_by` - O(1) hash-based lookups
93
- - `member_of` - Bidirectional membership with collision-free naming
94
- - Categorical permission system with bit-encoded permissions
95
- - Time-based permission scoring for temporal access control
96
- - Permission tier hierarchies with inheritance patterns
97
- - Scalable permission management for large object collections
98
- - Score-based sorting with custom scoring functions
99
- - Permission-aware queries filtering by access levels
100
- - Relationship validation framework ensuring data integrity
101
-
102
- ### Changed
103
-
104
- - Performance optimizations for large-scale relationship operations
105
-
106
- ### Security
107
-
108
- - GitHub Actions security hardening with matrix optimization
109
-
110
-
111
- <a id='changelog-2.0.0-pre6'></a>
112
- ## [2.0.0-pre6] - 2025-08-15
113
-
114
- ### Added
115
-
116
- - New `save_if_not_exists` method for conditional persistence
117
- - Atomic persistence operations with transaction support
118
- - Enhanced error handling for persistence failures
119
- - Improved data consistency guarantees
120
-
121
- ### Changed
122
-
123
- - Connection provider pattern for flexible pooling strategies
124
- - Multi-database support with intelligent pool management
125
- - Thread-safe connection handling for concurrent applications
126
- - Configurable pool sizing and timeout management
127
- - Modular class structure with cleaner separation of concerns
128
- - Enhanced feature system with dependency management
129
- - Improved inheritance patterns for better code organization
130
- - Streamlined base class functionality
131
-
132
- ### Fixed
133
-
134
- - Critical security fixes in Ruby workflow vulnerabilities
135
- - Systematic dependency resolution via multi-constraint optimization
136
-
137
-
138
- <a id='changelog-2.0.0-pre5'></a>
139
- ## [2.0.0-pre5] - 2025-08-05
140
-
141
- ### Added
142
-
143
- - Field-level encryption with transparent access patterns
144
- - Multiple encryption providers:
145
- - XChaCha20-Poly1305 (preferred, requires rbnacl)
146
- - AES-256-GCM (fallback, OpenSSL-based)
147
- - Field-specific key derivation for cryptographic domain separation
148
- - Configurable key versioning supporting key rotation
149
- - Non-persistent field storage for sensitive runtime data
150
- - RedactedString wrapper preventing accidental logging/serialization
151
- - Memory-safe handling of sensitive data in Ruby objects
152
- - API-safe serialization excluding transient fields
153
-
154
- ### Security
155
-
156
- - Encryption field security hardening with additional validation
157
- - Enhanced memory protection for sensitive data handling
158
- - Improved key management patterns and best practices
159
- - Security test suite expansion with comprehensive coverage
160
-
161
-
162
- <a id='changelog-2.0.0-pre'></a>
163
- ## [2.0.0-pre] - 2025-07-25
164
-
165
- ### Added
166
-
167
- - Complete API redesign for clarity and modern Ruby conventions
168
- - Valkey compatibility alongside traditional Redis support
169
- - Ruby 3.4+ modernization with fiber and thread safety improvements
170
- - Connection pooling foundation with provider pattern architecture
171
-
172
- ### Changed
173
-
174
- - `Familia::Base` replaced by `Familia::Horreum` as the primary base class
175
- - Connection configuration moved from simple string to block-based setup
176
- - Feature activation changed from `include` to `feature` declarations
177
- - Method naming updated for consistency (`delete` → `destroy`, `exists` → `exists?`, `dump` → `serialize`)
178
-
179
- ### Documentation
180
-
181
- - YARD documentation workflow with automated GitHub Pages deployment
182
- - Comprehensive migration guide for v1.x to v2.0.0-pre transition
183
-
184
- <!-- scriv-end-here -->
File without changes
@@ -1,29 +0,0 @@
1
- <!--
2
- A new scriv fragment. Uncomment sections as needed.
3
- Reference issues or pull requests in parentheses at the end of the entry.
4
- Example: - Fixed a bug in the connection pool. (Closes #123)
5
- -->
6
-
7
- ### Added
8
- <!-- - New features or capabilities -->
9
-
10
- ### Changed
11
- <!-- - Changes to existing functionality -->
12
-
13
- ### Deprecated
14
- <!-- - Soon-to-be removed features -->
15
-
16
- ### Removed
17
- <!-- - Now removed features -->
18
-
19
- ### Fixed
20
- <!-- - Bug fixes -->
21
-
22
- ### Security
23
- <!-- - Security-related improvements -->
24
-
25
- ### Documentation
26
- <!-- - Documentation improvements -->
27
-
28
- ### AI Assistance
29
- <!-- - Briefly describe how AI was used for this change (e.g., "Refactoring and documentation by Gemini"). -->