familia 2.0.0.pre17 → 2.0.0.pre19

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 (249) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.rst +118 -6
  3. data/CLAUDE.md +43 -11
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +9 -47
  6. data/README.md +52 -0
  7. data/bin/irb +1 -1
  8. data/changelog.d/20251011_012003_delano_159_datatype_transaction_pipeline_support.rst +91 -0
  9. data/changelog.d/20251011_203905_delano_next.rst +30 -0
  10. data/changelog.d/20251011_212633_delano_next.rst +13 -0
  11. data/changelog.d/20251011_221253_delano_next.rst +26 -0
  12. data/docs/guides/core-field-system.md +48 -26
  13. data/docs/guides/feature-expiration.md +18 -18
  14. data/docs/migrating/v2.0.0-pre18.md +58 -0
  15. data/docs/migrating/v2.0.0-pre19.md +197 -0
  16. data/docs/qodo-merge-compliance.md +96 -0
  17. data/examples/datatype_standalone.rb +281 -0
  18. data/lib/familia/base.rb +0 -2
  19. data/lib/familia/connection/behavior.rb +252 -0
  20. data/lib/familia/connection/handlers.rb +95 -0
  21. data/lib/familia/connection/middleware.rb +58 -4
  22. data/lib/familia/connection/operation_core.rb +1 -1
  23. data/lib/familia/connection/{pipeline_core.rb → pipelined_core.rb} +2 -2
  24. data/lib/familia/connection/transaction_core.rb +7 -9
  25. data/lib/familia/connection.rb +2 -1
  26. data/lib/familia/data_type/connection.rb +151 -7
  27. data/lib/familia/data_type/{commands.rb → database_commands.rb} +9 -6
  28. data/lib/familia/data_type/serialization.rb +9 -5
  29. data/lib/familia/data_type/types/hashkey.rb +1 -1
  30. data/lib/familia/data_type.rb +2 -2
  31. data/lib/familia/encryption/encrypted_data.rb +12 -2
  32. data/lib/familia/encryption/manager.rb +11 -4
  33. data/lib/familia/errors.rb +51 -14
  34. data/lib/familia/features/autoloader.rb +3 -1
  35. data/lib/familia/features/encrypted_fields/encrypted_field_type.rb +11 -3
  36. data/lib/familia/features/expiration/extensions.rb +8 -10
  37. data/lib/familia/features/expiration.rb +19 -19
  38. data/lib/familia/features/relationships/indexing/multi_index_generators.rb +45 -44
  39. data/lib/familia/features/relationships/indexing/unique_index_generators.rb +151 -65
  40. data/lib/familia/features/relationships/indexing.rb +37 -42
  41. data/lib/familia/features/relationships/indexing_relationship.rb +14 -4
  42. data/lib/familia/features/safe_dump.rb +2 -3
  43. data/lib/familia/field_type.rb +2 -1
  44. data/lib/familia/horreum/connection.rb +11 -35
  45. data/lib/familia/horreum/database_commands.rb +130 -11
  46. data/lib/familia/horreum/definition.rb +8 -38
  47. data/lib/familia/horreum/management.rb +38 -27
  48. data/lib/familia/horreum/persistence.rb +191 -67
  49. data/lib/familia/horreum/serialization.rb +94 -73
  50. data/lib/familia/horreum/utils.rb +0 -8
  51. data/lib/familia/horreum.rb +41 -18
  52. data/lib/familia/identifier_extractor.rb +60 -0
  53. data/lib/familia/logging.rb +268 -112
  54. data/lib/familia/refinements.rb +0 -1
  55. data/lib/familia/settings.rb +7 -7
  56. data/lib/familia/version.rb +1 -1
  57. data/lib/familia.rb +2 -2
  58. data/lib/middleware/{database_middleware.rb → database_logger.rb} +118 -14
  59. data/pr_agent.toml +31 -0
  60. data/pr_compliance_checklist.yaml +45 -0
  61. data/try/edge_cases/empty_identifiers_try.rb +1 -1
  62. data/try/edge_cases/hash_symbolization_try.rb +31 -31
  63. data/try/edge_cases/json_serialization_try.rb +2 -2
  64. data/try/edge_cases/legacy_data_detection/deserialization_edge_cases_try.rb +170 -0
  65. data/try/edge_cases/race_conditions_try.rb +1 -1
  66. data/try/edge_cases/reserved_keywords_try.rb +1 -1
  67. data/try/edge_cases/string_coercion_try.rb +5 -5
  68. data/try/edge_cases/ttl_side_effects_try.rb +1 -1
  69. data/try/features/encrypted_fields/aad_protection_try.rb +1 -1
  70. data/try/features/encrypted_fields/concealed_string_core_try.rb +1 -1
  71. data/try/features/encrypted_fields/context_isolation_try.rb +1 -1
  72. data/try/features/encrypted_fields/encrypted_fields_core_try.rb +1 -1
  73. data/try/features/encrypted_fields/encrypted_fields_integration_try.rb +1 -1
  74. data/try/features/encrypted_fields/encrypted_fields_no_cache_security_try.rb +1 -1
  75. data/try/features/encrypted_fields/encrypted_fields_security_try.rb +1 -1
  76. data/try/features/encrypted_fields/error_conditions_try.rb +1 -1
  77. data/try/features/encrypted_fields/fresh_key_derivation_try.rb +1 -1
  78. data/try/features/encrypted_fields/fresh_key_try.rb +1 -1
  79. data/try/features/encrypted_fields/key_rotation_try.rb +1 -1
  80. data/try/features/encrypted_fields/memory_security_try.rb +1 -1
  81. data/try/features/encrypted_fields/missing_current_key_version_try.rb +1 -1
  82. data/try/features/encrypted_fields/nonce_uniqueness_try.rb +1 -1
  83. data/try/features/encrypted_fields/secure_by_default_behavior_try.rb +1 -1
  84. data/try/features/encrypted_fields/thread_safety_try.rb +1 -1
  85. data/try/features/encrypted_fields/universal_serialization_safety_try.rb +1 -1
  86. data/try/{encryption → features/encryption}/config_persistence_try.rb +1 -1
  87. data/try/{encryption/encryption_core_try.rb → features/encryption/core_try.rb} +2 -2
  88. data/try/{encryption → features/encryption}/instance_variable_scope_try.rb +1 -1
  89. data/try/{encryption → features/encryption}/module_loading_try.rb +1 -1
  90. data/try/{encryption → features/encryption}/providers/aes_gcm_provider_try.rb +1 -1
  91. data/try/{encryption → features/encryption}/providers/xchacha20_poly1305_provider_try.rb +1 -1
  92. data/try/{encryption → features/encryption}/roundtrip_validation_try.rb +1 -1
  93. data/try/{encryption → features/encryption}/secure_memory_handling_try.rb +2 -2
  94. data/try/features/expiration/expiration_try.rb +2 -2
  95. data/try/features/external_identifier/external_identifier_try.rb +1 -1
  96. data/try/features/feature_dependencies_try.rb +1 -1
  97. data/try/features/feature_improvements_try.rb +1 -1
  98. data/try/features/object_identifier/object_identifier_integration_try.rb +1 -1
  99. data/try/features/object_identifier/object_identifier_try.rb +1 -1
  100. data/try/features/quantization/quantization_try.rb +1 -1
  101. data/try/features/real_feature_integration_try.rb +17 -14
  102. data/try/features/relationships/indexing_commands_verification_try.rb +8 -3
  103. data/try/features/relationships/indexing_try.rb +34 -5
  104. data/try/features/relationships/participation_commands_verification_spec.rb +1 -1
  105. data/try/features/relationships/participation_commands_verification_try.rb +4 -4
  106. data/try/features/relationships/participation_performance_improvements_try.rb +1 -1
  107. data/try/features/relationships/participation_reverse_index_try.rb +1 -1
  108. data/try/features/relationships/relationships_api_changes_try.rb +5 -5
  109. data/try/features/relationships/relationships_edge_cases_try.rb +3 -3
  110. data/try/features/relationships/relationships_performance_minimal_try.rb +1 -1
  111. data/try/features/relationships/relationships_performance_simple_try.rb +1 -1
  112. data/try/features/relationships/relationships_performance_try.rb +1 -1
  113. data/try/features/relationships/relationships_performance_working_try.rb +1 -1
  114. data/try/features/relationships/relationships_try.rb +1 -1
  115. data/try/features/safe_dump/safe_dump_advanced_try.rb +1 -1
  116. data/try/features/safe_dump/safe_dump_try.rb +1 -1
  117. data/try/features/transient_fields/redacted_string_try.rb +1 -1
  118. data/try/features/transient_fields/refresh_reset_try.rb +1 -1
  119. data/try/features/transient_fields/single_use_redacted_string_try.rb +1 -1
  120. data/try/features/transient_fields/transient_fields_core_try.rb +1 -1
  121. data/try/features/transient_fields/transient_fields_integration_try.rb +1 -1
  122. data/try/{connection → integration/connection}/fiber_context_preservation_try.rb +4 -4
  123. data/try/{connection → integration/connection}/handler_constraints_try.rb +1 -1
  124. data/try/{core → integration/connection}/isolated_dbclient_try.rb +1 -1
  125. data/try/integration/connection/middleware_reconnect_try.rb +87 -0
  126. data/try/{connection → integration/connection}/operation_mode_guards_try.rb +2 -2
  127. data/try/{connection → integration/connection}/pipeline_fallback_integration_try.rb +13 -13
  128. data/try/{core → integration/connection}/pools_try.rb +1 -1
  129. data/try/{connection → integration/connection}/responsibility_chain_tracking_try.rb +1 -1
  130. data/try/{connection → integration/connection}/transaction_fallback_integration_try.rb +1 -1
  131. data/try/{connection → integration/connection}/transaction_mode_permissive_try.rb +1 -1
  132. data/try/{connection → integration/connection}/transaction_mode_strict_try.rb +1 -1
  133. data/try/{connection → integration/connection}/transaction_mode_warn_try.rb +1 -1
  134. data/try/{connection → integration/connection}/transaction_modes_try.rb +1 -1
  135. data/try/{core → integration}/conventional_inheritance_try.rb +1 -1
  136. data/try/{core → integration}/create_method_try.rb +23 -23
  137. data/try/integration/cross_component_try.rb +1 -1
  138. data/try/integration/data_types/datatype_pipelines_try.rb +104 -0
  139. data/try/integration/data_types/datatype_transactions_try.rb +247 -0
  140. data/try/{core → integration}/database_consistency_try.rb +11 -8
  141. data/try/{core → integration}/familia_extended_try.rb +1 -1
  142. data/try/{core → integration}/familia_members_methods_try.rb +1 -1
  143. data/try/{models → integration/models}/customer_safe_dump_try.rb +6 -2
  144. data/try/{models → integration/models}/customer_try.rb +1 -1
  145. data/try/{models → integration/models}/datatype_base_try.rb +1 -1
  146. data/try/{models → integration/models}/familia_object_try.rb +2 -2
  147. data/try/{core → integration}/persistence_operations_try.rb +163 -11
  148. data/try/integration/relationships_persistence_round_trip_try.rb +441 -0
  149. data/try/{configuration → integration}/scenarios_try.rb +1 -1
  150. data/try/{core → integration}/secure_identifier_try.rb +1 -1
  151. data/try/{core → integration}/verifiable_identifier_try.rb +1 -1
  152. data/try/performance/benchmarks_try.rb +2 -2
  153. data/try/support/benchmarks/deserialization_benchmark.rb +180 -0
  154. data/try/support/benchmarks/deserialization_correctness_test.rb +237 -0
  155. data/try/{helpers → support/helpers}/test_helpers.rb +12 -3
  156. data/try/{core → unit/core}/autoloader_try.rb +1 -1
  157. data/try/{core → unit/core}/base_enhancements_try.rb +1 -9
  158. data/try/{core → unit/core}/connection_try.rb +1 -1
  159. data/try/{core → unit/core}/errors_try.rb +1 -1
  160. data/try/{core → unit/core}/extensions_try.rb +1 -1
  161. data/try/unit/core/familia_logger_try.rb +110 -0
  162. data/try/{core → unit/core}/familia_try.rb +1 -1
  163. data/try/{core → unit/core}/middleware_try.rb +41 -1
  164. data/try/{core → unit/core}/settings_try.rb +1 -1
  165. data/try/{core → unit/core}/time_utils_try.rb +1 -1
  166. data/try/{core → unit/core}/tools_try.rb +1 -1
  167. data/try/{core → unit/core}/utils_try.rb +17 -14
  168. data/try/{data_types → unit/data_types}/boolean_try.rb +2 -2
  169. data/try/{data_types → unit/data_types}/counter_try.rb +1 -1
  170. data/try/{data_types → unit/data_types}/datatype_base_try.rb +1 -1
  171. data/try/{data_types → unit/data_types}/hash_try.rb +1 -1
  172. data/try/{data_types → unit/data_types}/list_try.rb +1 -1
  173. data/try/{data_types → unit/data_types}/lock_try.rb +1 -1
  174. data/try/{data_types → unit/data_types}/sorted_set_try.rb +1 -1
  175. data/try/{data_types → unit/data_types}/sorted_set_zadd_options_try.rb +1 -1
  176. data/try/{data_types → unit/data_types}/string_try.rb +2 -2
  177. data/try/{data_types → unit/data_types}/unsortedset_try.rb +1 -1
  178. data/try/{horreum → unit/horreum}/auto_indexing_on_save_try.rb +33 -17
  179. data/try/unit/horreum/automatic_index_validation_try.rb +253 -0
  180. data/try/{horreum → unit/horreum}/base_try.rb +4 -4
  181. data/try/{horreum → unit/horreum}/class_methods_try.rb +3 -3
  182. data/try/{horreum → unit/horreum}/commands_try.rb +1 -1
  183. data/try/{horreum → unit/horreum}/defensive_initialization_try.rb +1 -1
  184. data/try/{horreum → unit/horreum}/destroy_related_fields_cleanup_try.rb +1 -1
  185. data/try/{horreum → unit/horreum}/enhanced_conflict_handling_try.rb +1 -1
  186. data/try/{horreum → unit/horreum}/field_categories_try.rb +27 -18
  187. data/try/{horreum → unit/horreum}/field_definition_try.rb +1 -1
  188. data/try/{horreum → unit/horreum}/initialization_try.rb +3 -3
  189. data/try/unit/horreum/json_type_preservation_try.rb +248 -0
  190. data/try/{horreum → unit/horreum}/relations_try.rb +5 -5
  191. data/try/{horreum → unit/horreum}/serialization_persistent_fields_try.rb +24 -18
  192. data/try/{horreum → unit/horreum}/serialization_try.rb +6 -6
  193. data/try/{horreum → unit/horreum}/settings_try.rb +1 -1
  194. data/try/unit/horreum/unique_index_edge_cases_try.rb +376 -0
  195. data/try/unit/horreum/unique_index_guard_validation_try.rb +281 -0
  196. data/try/{refinements → unit/refinements}/dear_json_array_methods_try.rb +1 -1
  197. data/try/{refinements → unit/refinements}/dear_json_hash_methods_try.rb +1 -1
  198. data/try/{refinements → unit/refinements}/time_literals_numeric_methods_try.rb +1 -1
  199. data/try/{refinements → unit/refinements}/time_literals_string_methods_try.rb +1 -1
  200. metadata +147 -126
  201. data/lib/familia/distinguisher.rb +0 -85
  202. data/lib/familia/refinements/logger_trace.rb +0 -60
  203. data/try/refinements/logger_trace_methods_try.rb +0 -44
  204. /data/try/{debugging → support/debugging}/README.md +0 -0
  205. /data/try/{debugging → support/debugging}/cache_behavior_tracer.rb +0 -0
  206. /data/try/{debugging → support/debugging}/debug_aad_process.rb +0 -0
  207. /data/try/{debugging → support/debugging}/debug_concealed_internal.rb +0 -0
  208. /data/try/{debugging → support/debugging}/debug_concealed_reveal.rb +0 -0
  209. /data/try/{debugging → support/debugging}/debug_context_aad.rb +0 -0
  210. /data/try/{debugging → support/debugging}/debug_context_simple.rb +0 -0
  211. /data/try/{debugging → support/debugging}/debug_cross_context.rb +0 -0
  212. /data/try/{debugging → support/debugging}/debug_database_load.rb +0 -0
  213. /data/try/{debugging → support/debugging}/debug_encrypted_json_check.rb +0 -0
  214. /data/try/{debugging → support/debugging}/debug_encrypted_json_step_by_step.rb +0 -0
  215. /data/try/{debugging → support/debugging}/debug_exists_lifecycle.rb +0 -0
  216. /data/try/{debugging → support/debugging}/debug_field_decrypt.rb +0 -0
  217. /data/try/{debugging → support/debugging}/debug_fresh_cross_context.rb +0 -0
  218. /data/try/{debugging → support/debugging}/debug_load_path.rb +0 -0
  219. /data/try/{debugging → support/debugging}/debug_method_definition.rb +0 -0
  220. /data/try/{debugging → support/debugging}/debug_method_resolution.rb +0 -0
  221. /data/try/{debugging → support/debugging}/debug_minimal.rb +0 -0
  222. /data/try/{debugging → support/debugging}/debug_provider.rb +0 -0
  223. /data/try/{debugging → support/debugging}/debug_secure_behavior.rb +0 -0
  224. /data/try/{debugging → support/debugging}/debug_string_class.rb +0 -0
  225. /data/try/{debugging → support/debugging}/debug_test.rb +0 -0
  226. /data/try/{debugging → support/debugging}/debug_test_design.rb +0 -0
  227. /data/try/{debugging → support/debugging}/encryption_method_tracer.rb +0 -0
  228. /data/try/{debugging → support/debugging}/provider_diagnostics.rb +0 -0
  229. /data/try/{helpers → support/helpers}/test_cleanup.rb +0 -0
  230. /data/try/{memory → support/memory}/memory_basic_test.rb +0 -0
  231. /data/try/{memory → support/memory}/memory_detailed_test.rb +0 -0
  232. /data/try/{memory → support/memory}/memory_docker_ruby_dump.sh +0 -0
  233. /data/try/{memory → support/memory}/memory_search_for_string.rb +0 -0
  234. /data/try/{memory → support/memory}/test_actual_redactedstring_protection.rb +0 -0
  235. /data/try/{prototypes → support/prototypes}/atomic_saves_v1_context_proxy.rb +0 -0
  236. /data/try/{prototypes → support/prototypes}/atomic_saves_v2_connection_switching.rb +0 -0
  237. /data/try/{prototypes → support/prototypes}/atomic_saves_v3_connection_pool.rb +0 -0
  238. /data/try/{prototypes → support/prototypes}/atomic_saves_v4.rb +0 -0
  239. /data/try/{prototypes → support/prototypes}/lib/atomic_saves_v2_connection_switching_helpers.rb +0 -0
  240. /data/try/{prototypes → support/prototypes}/lib/atomic_saves_v3_connection_pool_helpers.rb +0 -0
  241. /data/try/{prototypes → support/prototypes}/pooling/README.md +0 -0
  242. /data/try/{prototypes → support/prototypes}/pooling/configurable_stress_test.rb +0 -0
  243. /data/try/{prototypes → support/prototypes}/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb +0 -0
  244. /data/try/{prototypes → support/prototypes}/pooling/lib/connection_pool_metrics.rb +0 -0
  245. /data/try/{prototypes → support/prototypes}/pooling/lib/connection_pool_stress_test.rb +0 -0
  246. /data/try/{prototypes → support/prototypes}/pooling/lib/connection_pool_threading_models.rb +0 -0
  247. /data/try/{prototypes → support/prototypes}/pooling/lib/visualize_stress_results.rb +0 -0
  248. /data/try/{prototypes → support/prototypes}/pooling/pool_siege.rb +0 -0
  249. /data/try/{prototypes → support/prototypes}/pooling/run_stress_tests.rb +0 -0
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.pre17
4
+ version: 2.0.0.pre19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delano Mandelbaum
@@ -153,6 +153,10 @@ files:
153
153
  - LICENSE.txt
154
154
  - README.md
155
155
  - bin/irb
156
+ - changelog.d/20251011_012003_delano_159_datatype_transaction_pipeline_support.rst
157
+ - changelog.d/20251011_203905_delano_next.rst
158
+ - changelog.d/20251011_212633_delano_next.rst
159
+ - changelog.d/20251011_221253_delano_next.rst
156
160
  - changelog.d/README.md
157
161
  - changelog.d/scriv.ini
158
162
  - docs/archive/.gitignore
@@ -184,14 +188,18 @@ files:
184
188
  - docs/migrating/v2.0.0-pre12.md
185
189
  - docs/migrating/v2.0.0-pre13.md
186
190
  - docs/migrating/v2.0.0-pre14.md
191
+ - docs/migrating/v2.0.0-pre18.md
192
+ - docs/migrating/v2.0.0-pre19.md
187
193
  - docs/migrating/v2.0.0-pre5.md
188
194
  - docs/migrating/v2.0.0-pre6.md
189
195
  - docs/migrating/v2.0.0-pre7.md
190
196
  - docs/overview.md
197
+ - docs/qodo-merge-compliance.md
191
198
  - docs/reference/api-technical.md
192
199
  - examples/autoloader/mega_customer.rb
193
200
  - examples/autoloader/mega_customer/features/deprecated_fields.rb
194
201
  - examples/autoloader/mega_customer/safe_dump_fields.rb
202
+ - examples/datatype_standalone.rb
195
203
  - examples/encrypted_fields.rb
196
204
  - examples/json_usage_patterns.rb
197
205
  - examples/relationships.rb
@@ -201,17 +209,18 @@ files:
201
209
  - lib/familia.rb
202
210
  - lib/familia/base.rb
203
211
  - lib/familia/connection.rb
212
+ - lib/familia/connection/behavior.rb
204
213
  - lib/familia/connection/handlers.rb
205
214
  - lib/familia/connection/individual_command_proxy.rb
206
215
  - lib/familia/connection/middleware.rb
207
216
  - lib/familia/connection/operation_core.rb
208
217
  - lib/familia/connection/operations.rb
209
- - lib/familia/connection/pipeline_core.rb
218
+ - lib/familia/connection/pipelined_core.rb
210
219
  - lib/familia/connection/transaction_core.rb
211
220
  - lib/familia/data_type.rb
212
221
  - lib/familia/data_type/class_methods.rb
213
- - lib/familia/data_type/commands.rb
214
222
  - lib/familia/data_type/connection.rb
223
+ - lib/familia/data_type/database_commands.rb
215
224
  - lib/familia/data_type/serialization.rb
216
225
  - lib/familia/data_type/settings.rb
217
226
  - lib/familia/data_type/types/counter.rb
@@ -221,7 +230,6 @@ files:
221
230
  - lib/familia/data_type/types/sorted_set.rb
222
231
  - lib/familia/data_type/types/stringkey.rb
223
232
  - lib/familia/data_type/types/unsorted_set.rb
224
- - lib/familia/distinguisher.rb
225
233
  - lib/familia/encryption.rb
226
234
  - lib/familia/encryption/encrypted_data.rb
227
235
  - lib/familia/encryption/manager.rb
@@ -270,11 +278,11 @@ files:
270
278
  - lib/familia/horreum/serialization.rb
271
279
  - lib/familia/horreum/settings.rb
272
280
  - lib/familia/horreum/utils.rb
281
+ - lib/familia/identifier_extractor.rb
273
282
  - lib/familia/json_serializer.rb
274
283
  - lib/familia/logging.rb
275
284
  - lib/familia/refinements.rb
276
285
  - lib/familia/refinements/dear_json.rb
277
- - lib/familia/refinements/logger_trace.rb
278
286
  - lib/familia/refinements/stylize_words.rb
279
287
  - lib/familia/refinements/time_literals.rb
280
288
  - lib/familia/secure_identifier.rb
@@ -282,90 +290,18 @@ files:
282
290
  - lib/familia/utils.rb
283
291
  - lib/familia/verifiable_identifier.rb
284
292
  - lib/familia/version.rb
285
- - lib/middleware/database_middleware.rb
293
+ - lib/middleware/database_logger.rb
286
294
  - lib/multi_result.rb
287
- - try/configuration/scenarios_try.rb
288
- - try/connection/fiber_context_preservation_try.rb
289
- - try/connection/handler_constraints_try.rb
290
- - try/connection/operation_mode_guards_try.rb
291
- - try/connection/pipeline_fallback_integration_try.rb
292
- - try/connection/responsibility_chain_tracking_try.rb
293
- - try/connection/transaction_fallback_integration_try.rb
294
- - try/connection/transaction_mode_permissive_try.rb
295
- - try/connection/transaction_mode_strict_try.rb
296
- - try/connection/transaction_mode_warn_try.rb
297
- - try/connection/transaction_modes_try.rb
298
- - try/core/autoloader_try.rb
299
- - try/core/base_enhancements_try.rb
300
- - try/core/connection_try.rb
301
- - try/core/conventional_inheritance_try.rb
302
- - try/core/create_method_try.rb
303
- - try/core/database_consistency_try.rb
304
- - try/core/errors_try.rb
305
- - try/core/extensions_try.rb
306
- - try/core/familia_extended_try.rb
307
- - try/core/familia_members_methods_try.rb
308
- - try/core/familia_try.rb
309
- - try/core/isolated_dbclient_try.rb
310
- - try/core/middleware_try.rb
311
- - try/core/persistence_operations_try.rb
312
- - try/core/pools_try.rb
313
- - try/core/secure_identifier_try.rb
314
- - try/core/settings_try.rb
315
- - try/core/time_utils_try.rb
316
- - try/core/tools_try.rb
317
- - try/core/utils_try.rb
318
- - try/core/verifiable_identifier_try.rb
319
- - try/data_types/boolean_try.rb
320
- - try/data_types/counter_try.rb
321
- - try/data_types/datatype_base_try.rb
322
- - try/data_types/hash_try.rb
323
- - try/data_types/list_try.rb
324
- - try/data_types/lock_try.rb
325
- - try/data_types/sorted_set_try.rb
326
- - try/data_types/sorted_set_zadd_options_try.rb
327
- - try/data_types/string_try.rb
328
- - try/data_types/unsortedset_try.rb
329
- - try/debugging/README.md
330
- - try/debugging/cache_behavior_tracer.rb
331
- - try/debugging/debug_aad_process.rb
332
- - try/debugging/debug_concealed_internal.rb
333
- - try/debugging/debug_concealed_reveal.rb
334
- - try/debugging/debug_context_aad.rb
335
- - try/debugging/debug_context_simple.rb
336
- - try/debugging/debug_cross_context.rb
337
- - try/debugging/debug_database_load.rb
338
- - try/debugging/debug_encrypted_json_check.rb
339
- - try/debugging/debug_encrypted_json_step_by_step.rb
340
- - try/debugging/debug_exists_lifecycle.rb
341
- - try/debugging/debug_field_decrypt.rb
342
- - try/debugging/debug_fresh_cross_context.rb
343
- - try/debugging/debug_load_path.rb
344
- - try/debugging/debug_method_definition.rb
345
- - try/debugging/debug_method_resolution.rb
346
- - try/debugging/debug_minimal.rb
347
- - try/debugging/debug_provider.rb
348
- - try/debugging/debug_secure_behavior.rb
349
- - try/debugging/debug_string_class.rb
350
- - try/debugging/debug_test.rb
351
- - try/debugging/debug_test_design.rb
352
- - try/debugging/encryption_method_tracer.rb
353
- - try/debugging/provider_diagnostics.rb
295
+ - pr_agent.toml
296
+ - pr_compliance_checklist.yaml
354
297
  - try/edge_cases/empty_identifiers_try.rb
355
298
  - try/edge_cases/hash_symbolization_try.rb
356
299
  - try/edge_cases/json_serialization_try.rb
300
+ - try/edge_cases/legacy_data_detection/deserialization_edge_cases_try.rb
357
301
  - try/edge_cases/race_conditions_try.rb
358
302
  - try/edge_cases/reserved_keywords_try.rb
359
303
  - try/edge_cases/string_coercion_try.rb
360
304
  - try/edge_cases/ttl_side_effects_try.rb
361
- - try/encryption/config_persistence_try.rb
362
- - try/encryption/encryption_core_try.rb
363
- - try/encryption/instance_variable_scope_try.rb
364
- - try/encryption/module_loading_try.rb
365
- - try/encryption/providers/aes_gcm_provider_try.rb
366
- - try/encryption/providers/xchacha20_poly1305_provider_try.rb
367
- - try/encryption/roundtrip_validation_try.rb
368
- - try/encryption/secure_memory_handling_try.rb
369
305
  - try/features/encrypted_fields/aad_protection_try.rb
370
306
  - try/features/encrypted_fields/concealed_string_core_try.rb
371
307
  - try/features/encrypted_fields/context_isolation_try.rb
@@ -383,6 +319,14 @@ files:
383
319
  - try/features/encrypted_fields/secure_by_default_behavior_try.rb
384
320
  - try/features/encrypted_fields/thread_safety_try.rb
385
321
  - try/features/encrypted_fields/universal_serialization_safety_try.rb
322
+ - try/features/encryption/config_persistence_try.rb
323
+ - try/features/encryption/core_try.rb
324
+ - try/features/encryption/instance_variable_scope_try.rb
325
+ - try/features/encryption/module_loading_try.rb
326
+ - try/features/encryption/providers/aes_gcm_provider_try.rb
327
+ - try/features/encryption/providers/xchacha20_poly1305_provider_try.rb
328
+ - try/features/encryption/roundtrip_validation_try.rb
329
+ - try/features/encryption/secure_memory_handling_try.rb
386
330
  - try/features/expiration/expiration_try.rb
387
331
  - try/features/external_identifier/external_identifier_try.rb
388
332
  - try/features/feature_dependencies_try.rb
@@ -413,53 +357,130 @@ files:
413
357
  - try/features/transient_fields/single_use_redacted_string_try.rb
414
358
  - try/features/transient_fields/transient_fields_core_try.rb
415
359
  - try/features/transient_fields/transient_fields_integration_try.rb
416
- - try/helpers/test_cleanup.rb
417
- - try/helpers/test_helpers.rb
418
- - try/horreum/auto_indexing_on_save_try.rb
419
- - try/horreum/base_try.rb
420
- - try/horreum/class_methods_try.rb
421
- - try/horreum/commands_try.rb
422
- - try/horreum/defensive_initialization_try.rb
423
- - try/horreum/destroy_related_fields_cleanup_try.rb
424
- - try/horreum/enhanced_conflict_handling_try.rb
425
- - try/horreum/field_categories_try.rb
426
- - try/horreum/field_definition_try.rb
427
- - try/horreum/initialization_try.rb
428
- - try/horreum/relations_try.rb
429
- - try/horreum/serialization_persistent_fields_try.rb
430
- - try/horreum/serialization_try.rb
431
- - try/horreum/settings_try.rb
360
+ - try/integration/connection/fiber_context_preservation_try.rb
361
+ - try/integration/connection/handler_constraints_try.rb
362
+ - try/integration/connection/isolated_dbclient_try.rb
363
+ - try/integration/connection/middleware_reconnect_try.rb
364
+ - try/integration/connection/operation_mode_guards_try.rb
365
+ - try/integration/connection/pipeline_fallback_integration_try.rb
366
+ - try/integration/connection/pools_try.rb
367
+ - try/integration/connection/responsibility_chain_tracking_try.rb
368
+ - try/integration/connection/transaction_fallback_integration_try.rb
369
+ - try/integration/connection/transaction_mode_permissive_try.rb
370
+ - try/integration/connection/transaction_mode_strict_try.rb
371
+ - try/integration/connection/transaction_mode_warn_try.rb
372
+ - try/integration/connection/transaction_modes_try.rb
373
+ - try/integration/conventional_inheritance_try.rb
374
+ - try/integration/create_method_try.rb
432
375
  - try/integration/cross_component_try.rb
433
- - try/memory/memory_basic_test.rb
434
- - try/memory/memory_detailed_test.rb
435
- - try/memory/memory_docker_ruby_dump.sh
436
- - try/memory/memory_search_for_string.rb
437
- - try/memory/test_actual_redactedstring_protection.rb
438
- - try/models/customer_safe_dump_try.rb
439
- - try/models/customer_try.rb
440
- - try/models/datatype_base_try.rb
441
- - try/models/familia_object_try.rb
376
+ - try/integration/data_types/datatype_pipelines_try.rb
377
+ - try/integration/data_types/datatype_transactions_try.rb
378
+ - try/integration/database_consistency_try.rb
379
+ - try/integration/familia_extended_try.rb
380
+ - try/integration/familia_members_methods_try.rb
381
+ - try/integration/models/customer_safe_dump_try.rb
382
+ - try/integration/models/customer_try.rb
383
+ - try/integration/models/datatype_base_try.rb
384
+ - try/integration/models/familia_object_try.rb
385
+ - try/integration/persistence_operations_try.rb
386
+ - try/integration/relationships_persistence_round_trip_try.rb
387
+ - try/integration/scenarios_try.rb
388
+ - try/integration/secure_identifier_try.rb
389
+ - try/integration/verifiable_identifier_try.rb
442
390
  - try/performance/benchmarks_try.rb
443
- - try/prototypes/atomic_saves_v1_context_proxy.rb
444
- - try/prototypes/atomic_saves_v2_connection_switching.rb
445
- - try/prototypes/atomic_saves_v3_connection_pool.rb
446
- - try/prototypes/atomic_saves_v4.rb
447
- - try/prototypes/lib/atomic_saves_v2_connection_switching_helpers.rb
448
- - try/prototypes/lib/atomic_saves_v3_connection_pool_helpers.rb
449
- - try/prototypes/pooling/README.md
450
- - try/prototypes/pooling/configurable_stress_test.rb
451
- - try/prototypes/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb
452
- - try/prototypes/pooling/lib/connection_pool_metrics.rb
453
- - try/prototypes/pooling/lib/connection_pool_stress_test.rb
454
- - try/prototypes/pooling/lib/connection_pool_threading_models.rb
455
- - try/prototypes/pooling/lib/visualize_stress_results.rb
456
- - try/prototypes/pooling/pool_siege.rb
457
- - try/prototypes/pooling/run_stress_tests.rb
458
- - try/refinements/dear_json_array_methods_try.rb
459
- - try/refinements/dear_json_hash_methods_try.rb
460
- - try/refinements/logger_trace_methods_try.rb
461
- - try/refinements/time_literals_numeric_methods_try.rb
462
- - try/refinements/time_literals_string_methods_try.rb
391
+ - try/support/benchmarks/deserialization_benchmark.rb
392
+ - try/support/benchmarks/deserialization_correctness_test.rb
393
+ - try/support/debugging/README.md
394
+ - try/support/debugging/cache_behavior_tracer.rb
395
+ - try/support/debugging/debug_aad_process.rb
396
+ - try/support/debugging/debug_concealed_internal.rb
397
+ - try/support/debugging/debug_concealed_reveal.rb
398
+ - try/support/debugging/debug_context_aad.rb
399
+ - try/support/debugging/debug_context_simple.rb
400
+ - try/support/debugging/debug_cross_context.rb
401
+ - try/support/debugging/debug_database_load.rb
402
+ - try/support/debugging/debug_encrypted_json_check.rb
403
+ - try/support/debugging/debug_encrypted_json_step_by_step.rb
404
+ - try/support/debugging/debug_exists_lifecycle.rb
405
+ - try/support/debugging/debug_field_decrypt.rb
406
+ - try/support/debugging/debug_fresh_cross_context.rb
407
+ - try/support/debugging/debug_load_path.rb
408
+ - try/support/debugging/debug_method_definition.rb
409
+ - try/support/debugging/debug_method_resolution.rb
410
+ - try/support/debugging/debug_minimal.rb
411
+ - try/support/debugging/debug_provider.rb
412
+ - try/support/debugging/debug_secure_behavior.rb
413
+ - try/support/debugging/debug_string_class.rb
414
+ - try/support/debugging/debug_test.rb
415
+ - try/support/debugging/debug_test_design.rb
416
+ - try/support/debugging/encryption_method_tracer.rb
417
+ - try/support/debugging/provider_diagnostics.rb
418
+ - try/support/helpers/test_cleanup.rb
419
+ - try/support/helpers/test_helpers.rb
420
+ - try/support/memory/memory_basic_test.rb
421
+ - try/support/memory/memory_detailed_test.rb
422
+ - try/support/memory/memory_docker_ruby_dump.sh
423
+ - try/support/memory/memory_search_for_string.rb
424
+ - try/support/memory/test_actual_redactedstring_protection.rb
425
+ - try/support/prototypes/atomic_saves_v1_context_proxy.rb
426
+ - try/support/prototypes/atomic_saves_v2_connection_switching.rb
427
+ - try/support/prototypes/atomic_saves_v3_connection_pool.rb
428
+ - try/support/prototypes/atomic_saves_v4.rb
429
+ - try/support/prototypes/lib/atomic_saves_v2_connection_switching_helpers.rb
430
+ - try/support/prototypes/lib/atomic_saves_v3_connection_pool_helpers.rb
431
+ - try/support/prototypes/pooling/README.md
432
+ - try/support/prototypes/pooling/configurable_stress_test.rb
433
+ - try/support/prototypes/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb
434
+ - try/support/prototypes/pooling/lib/connection_pool_metrics.rb
435
+ - try/support/prototypes/pooling/lib/connection_pool_stress_test.rb
436
+ - try/support/prototypes/pooling/lib/connection_pool_threading_models.rb
437
+ - try/support/prototypes/pooling/lib/visualize_stress_results.rb
438
+ - try/support/prototypes/pooling/pool_siege.rb
439
+ - try/support/prototypes/pooling/run_stress_tests.rb
440
+ - try/unit/core/autoloader_try.rb
441
+ - try/unit/core/base_enhancements_try.rb
442
+ - try/unit/core/connection_try.rb
443
+ - try/unit/core/errors_try.rb
444
+ - try/unit/core/extensions_try.rb
445
+ - try/unit/core/familia_logger_try.rb
446
+ - try/unit/core/familia_try.rb
447
+ - try/unit/core/middleware_try.rb
448
+ - try/unit/core/settings_try.rb
449
+ - try/unit/core/time_utils_try.rb
450
+ - try/unit/core/tools_try.rb
451
+ - try/unit/core/utils_try.rb
452
+ - try/unit/data_types/boolean_try.rb
453
+ - try/unit/data_types/counter_try.rb
454
+ - try/unit/data_types/datatype_base_try.rb
455
+ - try/unit/data_types/hash_try.rb
456
+ - try/unit/data_types/list_try.rb
457
+ - try/unit/data_types/lock_try.rb
458
+ - try/unit/data_types/sorted_set_try.rb
459
+ - try/unit/data_types/sorted_set_zadd_options_try.rb
460
+ - try/unit/data_types/string_try.rb
461
+ - try/unit/data_types/unsortedset_try.rb
462
+ - try/unit/horreum/auto_indexing_on_save_try.rb
463
+ - try/unit/horreum/automatic_index_validation_try.rb
464
+ - try/unit/horreum/base_try.rb
465
+ - try/unit/horreum/class_methods_try.rb
466
+ - try/unit/horreum/commands_try.rb
467
+ - try/unit/horreum/defensive_initialization_try.rb
468
+ - try/unit/horreum/destroy_related_fields_cleanup_try.rb
469
+ - try/unit/horreum/enhanced_conflict_handling_try.rb
470
+ - try/unit/horreum/field_categories_try.rb
471
+ - try/unit/horreum/field_definition_try.rb
472
+ - try/unit/horreum/initialization_try.rb
473
+ - try/unit/horreum/json_type_preservation_try.rb
474
+ - try/unit/horreum/relations_try.rb
475
+ - try/unit/horreum/serialization_persistent_fields_try.rb
476
+ - try/unit/horreum/serialization_try.rb
477
+ - try/unit/horreum/settings_try.rb
478
+ - try/unit/horreum/unique_index_edge_cases_try.rb
479
+ - try/unit/horreum/unique_index_guard_validation_try.rb
480
+ - try/unit/refinements/dear_json_array_methods_try.rb
481
+ - try/unit/refinements/dear_json_hash_methods_try.rb
482
+ - try/unit/refinements/time_literals_numeric_methods_try.rb
483
+ - try/unit/refinements/time_literals_string_methods_try.rb
463
484
  - try/valkey.conf
464
485
  homepage: https://github.com/delano/familia
465
486
  licenses:
@@ -1,85 +0,0 @@
1
- # lib/familia/distinguisher.rb
2
-
3
- module Familia
4
- module Distinguisher
5
- # This method determines the appropriate transformation to apply based on
6
- # the class of the input argument.
7
- #
8
- # @param [Object] value_to_distinguish The value to be processed. Keep in
9
- # mind that all data is stored as a string so whatever the type
10
- # of the value, it will be converted to a string.
11
- # @param [Boolean] strict_values Whether to enforce strict value handling.
12
- # Defaults to true.
13
- # @return [String, nil] The processed value as a string or nil for unsupported
14
- # classes.
15
- #
16
- # The method uses a case statement to handle different classes:
17
- # - For `Symbol`, `String`, `Integer`, and `Float` classes, it traces the
18
- # operation and converts the value to a string.
19
- # - For `Familia::Horreum` class, it traces the operation and returns the
20
- # identifier of the value.
21
- # - For `TrueClass`, `FalseClass`, and `NilClass`, it traces the operation and
22
- # converts the value to a string ("true", "false", or "").
23
- # - For any other class, it traces the operation and returns nil.
24
- #
25
- # Alternative names for `value_to_distinguish` could be `input_value`, `value`,
26
- # or `object`.
27
- #
28
- def distinguisher(value_to_distinguish, strict_values: true)
29
- case value_to_distinguish
30
- when ::Symbol, ::String, ::Integer, ::Float
31
- Familia.trace :TOREDIS_DISTINGUISHER, nil, 'string' if Familia.debug?
32
-
33
- # Symbols and numerics are naturally serializable to strings
34
- # so it's a relatively low risk operation.
35
- value_to_distinguish.to_s
36
-
37
- when ::TrueClass, ::FalseClass, ::NilClass
38
- Familia.trace :TOREDIS_DISTINGUISHER, nil, 'true/false/nil' if Familia.debug?
39
-
40
- # TrueClass, FalseClass, and NilClass are considered high risk because their
41
- # original types cannot be reliably determined from their serialized string
42
- # representations. This can lead to unexpected behavior during deserialization.
43
- # For instance, a TrueClass value serialized as "true" might be deserialized as
44
- # a String, causing application errors. Even more problematic, a NilClass value
45
- # serialized as an empty string makes it impossible to distinguish between a
46
- # nil value and an empty string upon deserialization. Such scenarios can result
47
- # in subtle, hard-to-diagnose bugs. To mitigate these risks, we raise an
48
- # exception when encountering these types unless the strict_values option is
49
- # explicitly set to false.
50
- #
51
- raise Familia::NotDistinguishableError, value_to_distinguish if strict_values
52
-
53
- value_to_distinguish.to_s #=> "true", "false", ""
54
-
55
- when Familia::Base, Class
56
- Familia.trace :TOREDIS_DISTINGUISHER, nil, 'base' if Familia.debug?
57
-
58
- # When called with a class we simply transform it to its name. For
59
- # instances of Familia class, we store the identifier.
60
- if value_to_distinguish.is_a?(Class)
61
- value_to_distinguish.name
62
- else
63
- value_to_distinguish.identifier
64
- end
65
-
66
- else
67
- Familia.trace :TOREDIS_DISTINGUISHER, nil, "else1 #{strict_values}" if Familia.debug?
68
-
69
- if value_to_distinguish.class.ancestors.member?(Familia::Base)
70
- Familia.trace :TOREDIS_DISTINGUISHER, nil, 'isabase' if Familia.debug?
71
-
72
- value_to_distinguish.identifier
73
-
74
- else
75
- Familia.trace :TOREDIS_DISTINGUISHER, nil, "else2 #{strict_values}" if Familia.debug?
76
- raise Familia::NotDistinguishableError, value_to_distinguish if strict_values
77
-
78
- nil
79
- end
80
- end
81
- end
82
- end
83
-
84
- extend Distinguisher
85
- end
@@ -1,60 +0,0 @@
1
- # lib/familia/refinements/logger_trace.rb
2
-
3
- require 'pathname'
4
- require 'logger'
5
-
6
- # Controls whether tracing is enabled via an environment variable
7
- FAMILIA_TRACE = ENV.fetch('FAMILIA_TRACE', 'false').downcase
8
-
9
- # Familia::Refinements::LoggerTrace
10
- #
11
- # This module adds a 'trace' log level to the Ruby Logger class.
12
- # It is enabled when the FAMILIA_TRACE environment variable is set to
13
- # '1', 'true', or 'yes' (case-insensitive).
14
- #
15
- # @example Enabling trace logging
16
- # # UnsortedSet environment variable
17
- # ENV['FAMILIA_TRACE'] = 'true'
18
- #
19
- # # In your Ruby code
20
- # require 'logger'
21
- # using Familia::Refinements::LoggerTrace
22
- #
23
- # logger = Logger.new(STDOUT)
24
- # logger.trace("This is a trace message")
25
- #
26
- module Familia
27
- module Refinements
28
- # Familia::Refinements::LoggerTrace
29
- module LoggerTraceMethods
30
- ##
31
- # Logs a message at the TRACE level.
32
- #
33
- # @param progname [String] The program name to include in the log message
34
- # @yield A block that evaluates to the message to log
35
- # @return [true] Always returns true
36
- #
37
- # @example Logging a trace message
38
- # logger.trace("MyApp") { "Detailed trace information" }
39
- def trace(progname = nil, &)
40
- Fiber[:severity_letter] = 'T'
41
- add(Familia::Refinements::LoggerTrace::TRACE, nil, progname, &)
42
- ensure
43
- Fiber[:severity_letter] = nil
44
- end
45
- end
46
-
47
- module LoggerTrace
48
- unless defined?(ENABLED)
49
- # Indicates whether trace logging is enabled
50
- ENABLED = %w[1 true yes].include?(FAMILIA_TRACE).freeze
51
- # The numeric level for trace logging (same as DEBUG)
52
- TRACE = 0
53
- end
54
-
55
- refine Logger do
56
- import_methods LoggerTraceMethods
57
- end
58
- end
59
- end
60
- end
@@ -1,44 +0,0 @@
1
- # try/refinements/logger_trace_methods_try.rb
2
-
3
- require_relative '../helpers/test_helpers'
4
- require 'logger'
5
- require 'stringio'
6
-
7
- class TestLoggerWithTrace < Logger
8
- include Familia::Refinements::LoggerTraceMethods
9
- end
10
-
11
- ## Can create a logger with trace methods
12
- output = StringIO.new
13
- logger = TestLoggerWithTrace.new(output)
14
- logger.respond_to?(:trace)
15
- #=> true
16
-
17
- ## trace method logs with TRACE level
18
- output = StringIO.new
19
- logger = TestLoggerWithTrace.new(output)
20
- logger.trace('Test message')
21
- output.string
22
- #=~> /Test message/
23
-
24
- ## trace method sets and clears severity letter
25
- output = StringIO.new
26
- logger = TestLoggerWithTrace.new(output)
27
- logger.trace('Test message')
28
- Fiber[:severity_letter]
29
- #=> nil
30
-
31
- ## trace method accepts progname parameter
32
- output = StringIO.new
33
- logger = TestLoggerWithTrace.new(output)
34
- logger.trace('MyApp') { 'Test message' }
35
- output.string
36
- #=~> /MyApp/
37
- #=~> /Test message/
38
-
39
- ## trace method accepts block for message
40
- output = StringIO.new
41
- logger = TestLoggerWithTrace.new(output)
42
- logger.trace { 'Block message' }
43
- output.string
44
- #=~> /Block message/
File without changes
File without changes
File without changes