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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +2 -3
- data/CHANGELOG.rst +507 -0
- data/CLAUDE.md +5 -55
- data/Gemfile +1 -6
- data/Gemfile.lock +13 -7
- data/changelog.d/README.md +45 -34
- data/changelog.d/scriv.ini +5 -0
- data/docs/archive/FAMILIA_RELATIONSHIPS.md +1 -1
- data/docs/archive/FAMILIA_UPDATE.md +1 -1
- data/docs/archive/README.md +15 -19
- data/docs/guides/Feature-System-Autoloading.md +228 -0
- data/docs/guides/Home.md +1 -1
- data/docs/guides/Implementation-Guide.md +1 -1
- data/docs/guides/relationships-methods.md +1 -1
- data/docs/guides/time-utilities.md +221 -0
- data/docs/migrating/.gitignore +2 -0
- data/docs/migrating/v2.0.0-pre.md +84 -0
- data/docs/migrating/v2.0.0-pre11.md +253 -0
- data/docs/migrating/v2.0.0-pre12.md +306 -0
- data/docs/migrating/v2.0.0-pre13.md +329 -0
- data/docs/migrating/v2.0.0-pre5.md +110 -0
- data/docs/migrating/v2.0.0-pre6.md +154 -0
- data/docs/migrating/v2.0.0-pre7.md +222 -0
- data/docs/overview.md +6 -7
- data/{examples/redis_command_validation_example.rb → docs/reference/auditing_database_commands.rb} +29 -32
- data/examples/autoloader/mega_customer/safe_dump_fields.rb +6 -0
- data/examples/autoloader/mega_customer.rb +17 -0
- data/examples/{bit_encoding_integration.rb → permissions.rb} +30 -27
- data/examples/{relationships_basic.rb → relationships.rb} +2 -3
- data/examples/safe_dump.rb +281 -0
- data/familia.gemspec +5 -4
- data/lib/familia/autoloader.rb +53 -0
- data/lib/familia/base.rb +57 -0
- data/lib/familia/data_type.rb +4 -0
- data/lib/familia/encryption/encrypted_data.rb +4 -4
- data/lib/familia/encryption/manager.rb +6 -4
- data/lib/familia/{encryption_request_cache.rb → encryption/request_cache.rb} +1 -1
- data/lib/familia/encryption.rb +1 -1
- data/lib/familia/errors.rb +5 -0
- data/lib/familia/features/autoloadable.rb +113 -0
- data/lib/familia/features/encrypted_fields/concealed_string.rb +4 -2
- data/lib/familia/features/expiration.rb +4 -0
- data/lib/familia/features/external_identifier.rb +310 -0
- data/lib/familia/features/object_identifier.rb +307 -0
- data/lib/familia/features/quantization.rb +5 -0
- data/lib/familia/features/safe_dump.rb +74 -73
- data/lib/familia/features.rb +109 -17
- data/lib/familia/field_type.rb +2 -0
- data/lib/familia/horreum/core/serialization.rb +3 -3
- data/lib/familia/horreum/subclass/definition.rb +50 -7
- data/lib/familia/horreum.rb +2 -0
- data/lib/familia/json_serializer.rb +70 -0
- data/lib/familia/logging.rb +12 -10
- data/lib/familia/refinements/logger_trace.rb +57 -0
- data/lib/familia/refinements/snake_case.rb +40 -0
- data/lib/familia/refinements/time_utils.rb +248 -0
- data/lib/familia/refinements.rb +3 -49
- data/lib/familia/secure_identifier.rb +51 -75
- data/lib/familia/utils.rb +2 -0
- data/lib/familia/validation/{test_helpers.rb → validation_helpers.rb} +2 -2
- data/lib/familia/validation.rb +1 -1
- data/lib/familia/verifiable_identifier.rb +162 -0
- data/lib/familia/version.rb +1 -1
- data/lib/familia.rb +15 -2
- data/try/core/autoloader_try.rb +112 -0
- data/try/core/extensions_try.rb +38 -21
- data/try/core/familia_extended_try.rb +4 -3
- data/try/core/secure_identifier_try.rb +47 -18
- data/try/core/time_utils_try.rb +130 -0
- data/try/core/verifiable_identifier_try.rb +171 -0
- data/try/data_types/datatype_base_try.rb +3 -2
- data/try/features/autoloadable/autoloadable_try.rb +61 -0
- data/try/features/encrypted_fields/concealed_string_core_try.rb +8 -3
- data/try/features/encrypted_fields/secure_by_default_behavior_try.rb +59 -17
- data/try/features/encrypted_fields/universal_serialization_safety_try.rb +36 -12
- data/try/features/{external_identifiers/external_identifiers_try.rb → external_identifier/external_identifier_try.rb} +25 -28
- data/try/features/feature_improvements_try.rb +127 -0
- data/try/features/{object_identifiers/object_identifiers_integration_try.rb → object_identifier/object_identifier_integration_try.rb} +28 -30
- data/try/features/{object_identifiers/object_identifiers_try.rb → object_identifier/object_identifier_try.rb} +13 -13
- data/try/features/real_feature_integration_try.rb +8 -7
- data/try/features/safe_dump/safe_dump_autoloading_try.rb +111 -0
- data/try/features/safe_dump/safe_dump_try.rb +8 -9
- data/try/helpers/test_helpers.rb +41 -17
- data/try/integration/cross_component_try.rb +3 -1
- metadata +61 -26
- data/CHANGELOG.md +0 -184
- data/changelog.d/fragments/.keep +0 -0
- data/changelog.d/template.md.j2 +0 -29
- data/lib/familia/core_ext.rb +0 -135
- data/lib/familia/features/external_identifiers/external_identifier_field_type.rb +0 -120
- data/lib/familia/features/external_identifiers.rb +0 -111
- data/lib/familia/features/object_identifiers/object_identifier_field_type.rb +0 -91
- data/lib/familia/features/object_identifiers.rb +0 -194
- data/setup.cfg +0 -12
data/try/helpers/test_helpers.rb
CHANGED
@@ -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
|
-
#
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
60
|
-
|
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
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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/
|
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
|
-
-
|
165
|
-
- examples/
|
166
|
-
- examples/
|
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/
|
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/
|
198
|
-
- lib/familia/features/
|
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/
|
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/
|
357
|
+
- try/features/external_identifier/external_identifier_try.rb
|
325
358
|
- try/features/feature_dependencies_try.rb
|
326
|
-
- try/features/
|
327
|
-
- try/features/
|
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 -->
|
data/changelog.d/fragments/.keep
DELETED
File without changes
|
data/changelog.d/template.md.j2
DELETED
@@ -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"). -->
|