familia 2.0.0.pre18 → 2.0.0.pre21

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 (370) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/claude-code-review.yml +4 -9
  3. data/.github/workflows/code-smells.yml +64 -3
  4. data/.pre-commit-config.yaml +8 -6
  5. data/.reek.yml +10 -9
  6. data/.rubocop.yml +4 -0
  7. data/CHANGELOG.rst +205 -88
  8. data/CLAUDE.md +62 -10
  9. data/Gemfile +3 -3
  10. data/Gemfile.lock +27 -62
  11. data/README.md +39 -0
  12. data/bin/try +16 -0
  13. data/bin/tryouts +16 -0
  14. data/changelog.d/20251105_flexible_external_identifier_format.rst +66 -0
  15. data/changelog.d/20251107_112554_delano_179_participation_asymmetry.rst +44 -0
  16. data/changelog.d/20251107_213121_delano_fix_thread_safety_races_011CUumCP492Twxm4NLt2FvL.rst +20 -0
  17. data/changelog.d/20251107_fix_participates_in_symbol_resolution.rst +91 -0
  18. data/changelog.d/20251107_optimized_redis_exists_checks.rst +94 -0
  19. data/changelog.d/20251108_frozen_string_literal_pragma.rst +44 -0
  20. data/docs/1106-participates_in-bidirectional-solution.md +129 -0
  21. data/docs/guides/encryption.md +486 -0
  22. data/docs/guides/feature-encrypted-fields.md +123 -7
  23. data/docs/guides/feature-expiration.md +177 -133
  24. data/docs/guides/feature-external-identifiers.md +415 -443
  25. data/docs/guides/feature-object-identifiers.md +400 -269
  26. data/docs/guides/feature-quantization.md +120 -6
  27. data/docs/guides/feature-relationships-indexing.md +318 -0
  28. data/docs/guides/feature-relationships-methods.md +146 -604
  29. data/docs/guides/feature-relationships-participation.md +263 -0
  30. data/docs/guides/feature-relationships.md +118 -136
  31. data/docs/guides/feature-system-devs.md +176 -693
  32. data/docs/guides/feature-system.md +119 -6
  33. data/docs/guides/feature-transient-fields.md +81 -0
  34. data/docs/guides/field-system.md +778 -0
  35. data/docs/guides/index.md +32 -15
  36. data/docs/guides/logging.md +187 -0
  37. data/docs/guides/optimized-loading.md +674 -0
  38. data/docs/guides/thread-safety-monitoring.md +61 -0
  39. data/docs/guides/{time-utilities.md → time-literals.md} +12 -12
  40. data/docs/migrating/v2.0.0-pre19.md +197 -0
  41. data/docs/migrating/v2.0.0-pre22.md +241 -0
  42. data/docs/overview.md +7 -9
  43. data/docs/reference/api-technical.md +267 -320
  44. data/examples/autoloader/mega_customer/features/deprecated_fields.rb +2 -0
  45. data/examples/autoloader/mega_customer/safe_dump_fields.rb +2 -0
  46. data/examples/autoloader/mega_customer.rb +2 -0
  47. data/examples/datatype_standalone.rb +282 -0
  48. data/examples/encrypted_fields.rb +2 -1
  49. data/examples/json_usage_patterns.rb +2 -0
  50. data/examples/relationships.rb +3 -0
  51. data/examples/safe_dump.rb +2 -1
  52. data/examples/sampling_demo.rb +53 -0
  53. data/examples/single_connection_transaction_confusions.rb +2 -1
  54. data/familia.gemspec +2 -1
  55. data/lib/familia/base.rb +2 -0
  56. data/lib/familia/connection/behavior.rb +254 -0
  57. data/lib/familia/connection/handlers.rb +97 -0
  58. data/lib/familia/connection/individual_command_proxy.rb +2 -0
  59. data/lib/familia/connection/middleware.rb +34 -24
  60. data/lib/familia/connection/operation_core.rb +3 -1
  61. data/lib/familia/connection/operations.rb +2 -0
  62. data/lib/familia/connection/{pipeline_core.rb → pipelined_core.rb} +4 -2
  63. data/lib/familia/connection/transaction_core.rb +75 -9
  64. data/lib/familia/connection.rb +21 -5
  65. data/lib/familia/data_type/class_methods.rb +3 -1
  66. data/lib/familia/data_type/connection.rb +153 -7
  67. data/lib/familia/data_type/database_commands.rb +9 -4
  68. data/lib/familia/data_type/serialization.rb +10 -4
  69. data/lib/familia/data_type/settings.rb +2 -0
  70. data/lib/familia/data_type/types/counter.rb +2 -0
  71. data/lib/familia/data_type/types/hashkey.rb +8 -6
  72. data/lib/familia/data_type/types/listkey.rb +2 -0
  73. data/lib/familia/data_type/types/lock.rb +2 -0
  74. data/lib/familia/data_type/types/sorted_set.rb +2 -0
  75. data/lib/familia/data_type/types/stringkey.rb +2 -0
  76. data/lib/familia/data_type/types/unsorted_set.rb +2 -0
  77. data/lib/familia/data_type.rb +2 -0
  78. data/lib/familia/encryption/encrypted_data.rb +4 -2
  79. data/lib/familia/encryption/manager.rb +2 -0
  80. data/lib/familia/encryption/provider.rb +2 -0
  81. data/lib/familia/encryption/providers/aes_gcm_provider.rb +2 -0
  82. data/lib/familia/encryption/providers/secure_xchacha20_poly1305_provider.rb +2 -0
  83. data/lib/familia/encryption/providers/xchacha20_poly1305_provider.rb +2 -0
  84. data/lib/familia/encryption/registry.rb +2 -0
  85. data/lib/familia/encryption/request_cache.rb +2 -0
  86. data/lib/familia/encryption.rb +9 -2
  87. data/lib/familia/errors.rb +53 -14
  88. data/lib/familia/features/autoloader.rb +2 -0
  89. data/lib/familia/features/encrypted_fields/concealed_string.rb +2 -0
  90. data/lib/familia/features/encrypted_fields/encrypted_field_type.rb +4 -0
  91. data/lib/familia/features/encrypted_fields.rb +2 -2
  92. data/lib/familia/features/expiration/extensions.rb +11 -11
  93. data/lib/familia/features/expiration.rb +29 -21
  94. data/lib/familia/features/external_identifier.rb +33 -7
  95. data/lib/familia/features/object_identifier.rb +2 -0
  96. data/lib/familia/features/quantization.rb +3 -1
  97. data/lib/familia/features/relationships/README.md +3 -1
  98. data/lib/familia/features/relationships/collection_operations.rb +2 -0
  99. data/lib/familia/features/relationships/indexing/multi_index_generators.rb +177 -47
  100. data/lib/familia/features/relationships/indexing/rebuild_strategies.rb +479 -0
  101. data/lib/familia/features/relationships/indexing/unique_index_generators.rb +203 -63
  102. data/lib/familia/features/relationships/indexing.rb +40 -42
  103. data/lib/familia/features/relationships/indexing_relationship.rb +17 -5
  104. data/lib/familia/features/relationships/participation/participant_methods.rb +131 -14
  105. data/lib/familia/features/relationships/participation/rebuild_strategies.md +41 -0
  106. data/lib/familia/features/relationships/participation/target_methods.rb +6 -6
  107. data/lib/familia/features/relationships/participation.rb +155 -69
  108. data/lib/familia/features/relationships/participation_membership.rb +69 -0
  109. data/lib/familia/features/relationships/participation_relationship.rb +34 -6
  110. data/lib/familia/features/relationships/score_encoding.rb +2 -0
  111. data/lib/familia/features/relationships.rb +5 -3
  112. data/lib/familia/features/safe_dump.rb +2 -0
  113. data/lib/familia/features/transient_fields/redacted_string.rb +2 -0
  114. data/lib/familia/features/transient_fields/single_use_redacted_string.rb +2 -0
  115. data/lib/familia/features/transient_fields/transient_field_type.rb +5 -3
  116. data/lib/familia/features/transient_fields.rb +2 -0
  117. data/lib/familia/features.rb +2 -0
  118. data/lib/familia/field_type.rb +5 -2
  119. data/lib/familia/horreum/connection.rb +28 -36
  120. data/lib/familia/horreum/database_commands.rb +131 -10
  121. data/lib/familia/horreum/definition.rb +18 -7
  122. data/lib/familia/horreum/management.rb +233 -57
  123. data/lib/familia/horreum/persistence.rb +314 -122
  124. data/lib/familia/horreum/related_fields.rb +2 -0
  125. data/lib/familia/horreum/serialization.rb +26 -4
  126. data/lib/familia/horreum/settings.rb +2 -0
  127. data/lib/familia/horreum/utils.rb +2 -8
  128. data/lib/familia/horreum.rb +46 -13
  129. data/lib/familia/identifier_extractor.rb +2 -0
  130. data/lib/familia/instrumentation.rb +156 -0
  131. data/lib/familia/json_serializer.rb +2 -0
  132. data/lib/familia/logging.rb +94 -37
  133. data/lib/familia/refinements/dear_json.rb +2 -0
  134. data/lib/familia/refinements/stylize_words.rb +2 -14
  135. data/lib/familia/refinements/time_literals.rb +2 -0
  136. data/lib/familia/refinements.rb +2 -0
  137. data/lib/familia/secure_identifier.rb +10 -2
  138. data/lib/familia/settings.rb +9 -7
  139. data/lib/familia/thread_safety/instrumented_mutex.rb +166 -0
  140. data/lib/familia/thread_safety/monitor.rb +328 -0
  141. data/lib/familia/utils.rb +13 -0
  142. data/lib/familia/verifiable_identifier.rb +3 -1
  143. data/lib/familia/version.rb +3 -1
  144. data/lib/familia.rb +31 -4
  145. data/lib/middleware/database_command_counter.rb +152 -0
  146. data/lib/middleware/database_logger.rb +325 -129
  147. data/lib/multi_result.rb +2 -0
  148. data/try/edge_cases/empty_identifiers_try.rb +2 -0
  149. data/try/edge_cases/hash_symbolization_try.rb +2 -0
  150. data/try/edge_cases/json_serialization_try.rb +2 -0
  151. data/try/edge_cases/legacy_data_detection/deserialization_edge_cases_try.rb +4 -0
  152. data/try/edge_cases/race_conditions_try.rb +4 -0
  153. data/try/edge_cases/reserved_keywords_try.rb +4 -0
  154. data/try/edge_cases/string_coercion_try.rb +6 -4
  155. data/try/edge_cases/ttl_side_effects_try.rb +4 -0
  156. data/try/features/encrypted_fields/aad_protection_try.rb +4 -0
  157. data/try/features/encrypted_fields/concealed_string_core_try.rb +4 -0
  158. data/try/features/encrypted_fields/context_isolation_try.rb +4 -0
  159. data/try/features/encrypted_fields/encrypted_fields_core_try.rb +33 -0
  160. data/try/features/encrypted_fields/encrypted_fields_integration_try.rb +4 -0
  161. data/try/features/encrypted_fields/encrypted_fields_no_cache_security_try.rb +4 -0
  162. data/try/features/encrypted_fields/encrypted_fields_security_try.rb +4 -0
  163. data/try/features/encrypted_fields/error_conditions_try.rb +4 -0
  164. data/try/features/encrypted_fields/fresh_key_derivation_try.rb +4 -0
  165. data/try/features/encrypted_fields/fresh_key_try.rb +4 -0
  166. data/try/features/encrypted_fields/key_rotation_try.rb +4 -0
  167. data/try/features/encrypted_fields/memory_security_try.rb +4 -0
  168. data/try/features/encrypted_fields/missing_current_key_version_try.rb +4 -0
  169. data/try/features/encrypted_fields/nonce_uniqueness_try.rb +4 -0
  170. data/try/features/encrypted_fields/secure_by_default_behavior_try.rb +4 -0
  171. data/try/features/encrypted_fields/thread_safety_try.rb +4 -0
  172. data/try/features/encrypted_fields/universal_serialization_safety_try.rb +4 -0
  173. data/try/features/encryption/config_persistence_try.rb +4 -0
  174. data/try/features/encryption/core_try.rb +4 -0
  175. data/try/features/encryption/instance_variable_scope_try.rb +4 -0
  176. data/try/features/encryption/module_loading_try.rb +4 -0
  177. data/try/features/encryption/providers/aes_gcm_provider_try.rb +4 -0
  178. data/try/features/encryption/providers/xchacha20_poly1305_provider_try.rb +4 -0
  179. data/try/features/encryption/roundtrip_validation_try.rb +4 -0
  180. data/try/features/encryption/secure_memory_handling_try.rb +4 -0
  181. data/try/features/expiration/expiration_try.rb +5 -1
  182. data/try/features/external_identifier/external_identifier_try.rb +171 -8
  183. data/try/features/feature_dependencies_try.rb +2 -0
  184. data/try/features/feature_improvements_try.rb +2 -0
  185. data/try/features/field_groups_try.rb +2 -0
  186. data/try/features/object_identifier/object_identifier_integration_try.rb +12 -9
  187. data/try/features/object_identifier/object_identifier_try.rb +2 -0
  188. data/try/features/quantization/quantization_try.rb +4 -0
  189. data/try/features/real_feature_integration_try.rb +2 -0
  190. data/try/features/relationships/indexing_commands_verification_try.rb +2 -0
  191. data/try/features/relationships/indexing_rebuild_try.rb +600 -0
  192. data/try/features/relationships/indexing_try.rb +30 -4
  193. data/try/features/relationships/participation_bidirectional_try.rb +242 -0
  194. data/try/features/relationships/participation_commands_verification_spec.rb +4 -0
  195. data/try/features/relationships/participation_commands_verification_try.rb +2 -0
  196. data/try/features/relationships/participation_performance_improvements_try.rb +11 -9
  197. data/try/features/relationships/participation_reverse_index_try.rb +15 -13
  198. data/try/features/relationships/participation_target_class_resolution_try.rb +209 -0
  199. data/try/features/relationships/participation_unresolved_target_try.rb +109 -0
  200. data/try/features/relationships/relationships_api_changes_try.rb +6 -4
  201. data/try/features/relationships/relationships_edge_cases_try.rb +4 -0
  202. data/try/features/relationships/relationships_performance_minimal_try.rb +4 -0
  203. data/try/features/relationships/relationships_performance_simple_try.rb +4 -0
  204. data/try/features/relationships/relationships_performance_try.rb +4 -0
  205. data/try/features/relationships/relationships_performance_working_try.rb +4 -0
  206. data/try/features/relationships/relationships_try.rb +6 -4
  207. data/try/features/safe_dump/safe_dump_advanced_try.rb +4 -0
  208. data/try/features/safe_dump/safe_dump_try.rb +4 -0
  209. data/try/features/transient_fields/redacted_string_try.rb +2 -0
  210. data/try/features/transient_fields/refresh_reset_try.rb +3 -0
  211. data/try/features/transient_fields/simple_refresh_test.rb +3 -0
  212. data/try/features/transient_fields/single_use_redacted_string_try.rb +2 -0
  213. data/try/features/transient_fields/transient_fields_core_try.rb +4 -0
  214. data/try/features/transient_fields/transient_fields_integration_try.rb +4 -0
  215. data/try/integration/connection/fiber_context_preservation_try.rb +7 -3
  216. data/try/integration/connection/handler_constraints_try.rb +4 -0
  217. data/try/integration/connection/isolated_dbclient_try.rb +4 -0
  218. data/try/integration/connection/middleware_reconnect_try.rb +2 -0
  219. data/try/integration/connection/operation_mode_guards_try.rb +5 -1
  220. data/try/integration/connection/pipeline_fallback_integration_try.rb +15 -12
  221. data/try/integration/connection/pools_try.rb +4 -0
  222. data/try/integration/connection/responsibility_chain_tracking_try.rb +4 -0
  223. data/try/integration/connection/transaction_fallback_integration_try.rb +4 -0
  224. data/try/integration/connection/transaction_mode_permissive_try.rb +4 -0
  225. data/try/integration/connection/transaction_mode_strict_try.rb +4 -0
  226. data/try/integration/connection/transaction_mode_warn_try.rb +4 -0
  227. data/try/integration/connection/transaction_modes_try.rb +4 -0
  228. data/try/integration/conventional_inheritance_try.rb +4 -0
  229. data/try/integration/create_method_try.rb +26 -22
  230. data/try/integration/cross_component_try.rb +4 -0
  231. data/try/integration/data_types/datatype_pipelines_try.rb +108 -0
  232. data/try/integration/data_types/datatype_transactions_try.rb +251 -0
  233. data/try/integration/database_consistency_try.rb +4 -0
  234. data/try/integration/familia_extended_try.rb +4 -0
  235. data/try/integration/familia_members_methods_try.rb +4 -0
  236. data/try/integration/models/customer_safe_dump_try.rb +9 -1
  237. data/try/integration/models/customer_try.rb +4 -0
  238. data/try/integration/models/datatype_base_try.rb +4 -0
  239. data/try/integration/models/familia_object_try.rb +5 -1
  240. data/try/integration/persistence_operations_try.rb +166 -10
  241. data/try/integration/relationships_persistence_round_trip_try.rb +17 -14
  242. data/try/integration/save_methods_consistency_try.rb +241 -0
  243. data/try/integration/scenarios_try.rb +4 -0
  244. data/try/integration/secure_identifier_try.rb +4 -0
  245. data/try/integration/transaction_safety_core_try.rb +176 -0
  246. data/try/integration/transaction_safety_workflow_try.rb +291 -0
  247. data/try/integration/verifiable_identifier_try.rb +4 -0
  248. data/try/investigation/pipeline_routing/README.md +228 -0
  249. data/try/performance/benchmarks_try.rb +4 -0
  250. data/try/performance/transaction_safety_benchmark_try.rb +238 -0
  251. data/try/support/benchmarks/deserialization_benchmark.rb +3 -1
  252. data/try/support/benchmarks/deserialization_correctness_test.rb +3 -1
  253. data/try/support/debugging/cache_behavior_tracer.rb +4 -0
  254. data/try/support/debugging/debug_aad_process.rb +3 -0
  255. data/try/support/debugging/debug_concealed_internal.rb +3 -0
  256. data/try/support/debugging/debug_concealed_reveal.rb +3 -0
  257. data/try/support/debugging/debug_context_aad.rb +3 -0
  258. data/try/support/debugging/debug_context_simple.rb +3 -0
  259. data/try/support/debugging/debug_cross_context.rb +3 -0
  260. data/try/support/debugging/debug_database_load.rb +3 -0
  261. data/try/support/debugging/debug_encrypted_json_check.rb +3 -0
  262. data/try/support/debugging/debug_encrypted_json_step_by_step.rb +3 -0
  263. data/try/support/debugging/debug_exists_lifecycle.rb +3 -0
  264. data/try/support/debugging/debug_field_decrypt.rb +3 -0
  265. data/try/support/debugging/debug_fresh_cross_context.rb +3 -0
  266. data/try/support/debugging/debug_load_path.rb +3 -0
  267. data/try/support/debugging/debug_method_definition.rb +3 -0
  268. data/try/support/debugging/debug_method_resolution.rb +3 -0
  269. data/try/support/debugging/debug_minimal.rb +3 -0
  270. data/try/support/debugging/debug_provider.rb +3 -0
  271. data/try/support/debugging/debug_secure_behavior.rb +3 -0
  272. data/try/support/debugging/debug_string_class.rb +3 -0
  273. data/try/support/debugging/debug_test.rb +3 -0
  274. data/try/support/debugging/debug_test_design.rb +3 -0
  275. data/try/support/debugging/encryption_method_tracer.rb +4 -0
  276. data/try/support/debugging/provider_diagnostics.rb +4 -0
  277. data/try/support/helpers/test_cleanup.rb +4 -0
  278. data/try/support/helpers/test_helpers.rb +5 -0
  279. data/try/support/memory/memory_basic_test.rb +4 -0
  280. data/try/support/memory/memory_detailed_test.rb +4 -0
  281. data/try/support/memory/memory_search_for_string.rb +4 -0
  282. data/try/support/memory/test_actual_redactedstring_protection.rb +4 -0
  283. data/try/support/prototypes/atomic_saves_v1_context_proxy.rb +4 -0
  284. data/try/support/prototypes/atomic_saves_v2_connection_switching.rb +4 -0
  285. data/try/support/prototypes/atomic_saves_v3_connection_pool.rb +4 -0
  286. data/try/support/prototypes/atomic_saves_v4.rb +4 -0
  287. data/try/support/prototypes/lib/atomic_saves_v2_connection_switching_helpers.rb +4 -0
  288. data/try/support/prototypes/lib/atomic_saves_v3_connection_pool_helpers.rb +4 -0
  289. data/try/support/prototypes/pooling/configurable_stress_test.rb +4 -0
  290. data/try/support/prototypes/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb +4 -0
  291. data/try/support/prototypes/pooling/lib/connection_pool_metrics.rb +4 -0
  292. data/try/support/prototypes/pooling/lib/connection_pool_stress_test.rb +4 -0
  293. data/try/support/prototypes/pooling/lib/connection_pool_threading_models.rb +4 -0
  294. data/try/support/prototypes/pooling/lib/visualize_stress_results.rb +4 -2
  295. data/try/support/prototypes/pooling/pool_siege.rb +4 -2
  296. data/try/support/prototypes/pooling/run_stress_tests.rb +4 -2
  297. data/try/thread_safety/README.md +496 -0
  298. data/try/thread_safety/class_connection_chain_race_try.rb +265 -0
  299. data/try/thread_safety/connection_chain_race_try.rb +148 -0
  300. data/try/thread_safety/encryption_manager_cache_race_try.rb +166 -0
  301. data/try/thread_safety/feature_registry_race_try.rb +226 -0
  302. data/try/thread_safety/fiber_pipeline_isolation_try.rb +235 -0
  303. data/try/thread_safety/fiber_transaction_isolation_try.rb +208 -0
  304. data/try/thread_safety/field_registration_race_try.rb +222 -0
  305. data/try/thread_safety/logger_initialization_race_try.rb +170 -0
  306. data/try/thread_safety/middleware_registration_race_try.rb +154 -0
  307. data/try/thread_safety/module_config_race_try.rb +175 -0
  308. data/try/thread_safety/secure_identifier_cache_race_try.rb +226 -0
  309. data/try/unit/core/autoloader_try.rb +4 -0
  310. data/try/unit/core/base_enhancements_try.rb +4 -0
  311. data/try/unit/core/connection_try.rb +4 -0
  312. data/try/unit/core/errors_try.rb +4 -0
  313. data/try/unit/core/extensions_try.rb +4 -0
  314. data/try/unit/core/familia_logger_try.rb +2 -0
  315. data/try/unit/core/familia_try.rb +4 -0
  316. data/try/unit/core/middleware_sampling_try.rb +335 -0
  317. data/try/unit/core/middleware_test_helpers_bug_try.rb +58 -0
  318. data/try/unit/core/middleware_thread_safety_try.rb +245 -0
  319. data/try/unit/core/middleware_try.rb +4 -0
  320. data/try/unit/core/settings_try.rb +4 -0
  321. data/try/unit/core/time_utils_try.rb +4 -0
  322. data/try/unit/core/tools_try.rb +4 -0
  323. data/try/unit/core/utils_try.rb +37 -0
  324. data/try/unit/data_types/boolean_try.rb +5 -1
  325. data/try/unit/data_types/counter_try.rb +4 -0
  326. data/try/unit/data_types/datatype_base_try.rb +4 -0
  327. data/try/unit/data_types/hash_try.rb +4 -0
  328. data/try/unit/data_types/list_try.rb +4 -0
  329. data/try/unit/data_types/lock_try.rb +4 -0
  330. data/try/unit/data_types/sorted_set_try.rb +4 -0
  331. data/try/unit/data_types/sorted_set_zadd_options_try.rb +4 -0
  332. data/try/unit/data_types/string_try.rb +5 -1
  333. data/try/unit/data_types/unsortedset_try.rb +4 -0
  334. data/try/unit/familia_resolve_class_try.rb +116 -0
  335. data/try/unit/horreum/auto_indexing_on_save_try.rb +36 -16
  336. data/try/unit/horreum/automatic_index_validation_try.rb +255 -0
  337. data/try/unit/horreum/base_try.rb +5 -1
  338. data/try/unit/horreum/class_methods_try.rb +6 -2
  339. data/try/unit/horreum/commands_try.rb +4 -0
  340. data/try/unit/horreum/defensive_initialization_try.rb +4 -0
  341. data/try/unit/horreum/destroy_related_fields_cleanup_try.rb +4 -0
  342. data/try/unit/horreum/enhanced_conflict_handling_try.rb +4 -0
  343. data/try/unit/horreum/field_categories_try.rb +4 -0
  344. data/try/unit/horreum/field_definition_try.rb +4 -0
  345. data/try/unit/horreum/initialization_try.rb +5 -1
  346. data/try/unit/horreum/json_type_preservation_try.rb +2 -0
  347. data/try/unit/horreum/optimized_loading_try.rb +156 -0
  348. data/try/unit/horreum/relations_try.rb +8 -4
  349. data/try/unit/horreum/serialization_persistent_fields_try.rb +4 -0
  350. data/try/unit/horreum/serialization_try.rb +6 -2
  351. data/try/unit/horreum/settings_try.rb +4 -0
  352. data/try/unit/horreum/unique_index_edge_cases_try.rb +380 -0
  353. data/try/unit/horreum/unique_index_guard_validation_try.rb +283 -0
  354. data/try/unit/middleware/database_command_counter_methods_try.rb +139 -0
  355. data/try/unit/middleware/database_logger_methods_try.rb +251 -0
  356. data/try/unit/refinements/dear_json_array_methods_try.rb +4 -0
  357. data/try/unit/refinements/dear_json_hash_methods_try.rb +4 -0
  358. data/try/unit/refinements/time_literals_numeric_methods_try.rb +4 -0
  359. data/try/unit/refinements/time_literals_string_methods_try.rb +4 -0
  360. data/try/unit/thread_safety_monitor_try.rb +149 -0
  361. metadata +81 -14
  362. data/.github/workflows/code-quality.yml +0 -138
  363. data/docs/archive/FAMILIA_RELATIONSHIPS.md +0 -210
  364. data/docs/archive/FAMILIA_TECHNICAL.md +0 -823
  365. data/docs/archive/FAMILIA_UPDATE.md +0 -226
  366. data/docs/archive/README.md +0 -64
  367. data/docs/archive/api-reference.md +0 -333
  368. data/docs/guides/core-field-system.md +0 -806
  369. data/docs/guides/implementation.md +0 -276
  370. data/docs/guides/security-model.md +0 -183
@@ -0,0 +1,109 @@
1
+ # try/features/relationships/participation_unresolved_target_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
5
+ # Test for proper error handling when target class cannot be resolved
6
+ #
7
+ # This test verifies that participates_in raises a helpful error when
8
+ # the target class hasn't been loaded yet or doesn't exist.
9
+
10
+ require_relative '../../support/helpers/test_helpers'
11
+
12
+ ## Test error message when target class doesn't exist (Symbol)
13
+ begin
14
+ class UnresolvedTargetTest1 < Familia::Horreum
15
+ feature :relationships
16
+ identifier_field :id
17
+ field :id
18
+
19
+ participates_in :NonExistentTargetClass, :items
20
+ end
21
+ @error_raised = false
22
+ rescue ArgumentError => e
23
+ @error_raised = true
24
+ @error_message = e.message
25
+ end
26
+ @error_raised
27
+ #=> true
28
+
29
+ ## Test error message includes the unresolved class name
30
+ @error_message.include?('NonExistentTargetClass')
31
+ #=> true
32
+
33
+ ## Test error message mentions load order issue
34
+ @error_message.include?('load order')
35
+ #=> true
36
+
37
+ ## Test error message mentions Familia.members
38
+ @error_message.include?('Familia.members')
39
+ #=> true
40
+
41
+ ## Test error message includes list of registered classes
42
+ @error_message.include?('Current registered classes')
43
+ #=> true
44
+
45
+ ## Test error when target class doesn't exist (String)
46
+ begin
47
+ class UnresolvedTargetTest2 < Familia::Horreum
48
+ feature :relationships
49
+ identifier_field :id
50
+ field :id
51
+
52
+ participates_in 'AnotherNonExistentClass', :items
53
+ end
54
+ @string_error_raised = false
55
+ rescue ArgumentError => e
56
+ @string_error_raised = true
57
+ @string_error_message = e.message
58
+ end
59
+ @string_error_raised
60
+ #=> true
61
+
62
+ ## Test error message for String target includes class name
63
+ @string_error_message.include?('AnotherNonExistentClass')
64
+ #=> true
65
+
66
+ ## Test error provides solution hint
67
+ @string_error_message.include?('Solution')
68
+ #=> true
69
+
70
+ ## Test that Class objects don't trigger the error (they're already resolved)
71
+ # This should work fine - no error expected
72
+ class ExistingTargetClass < Familia::Horreum
73
+ feature :relationships
74
+ identifier_field :id
75
+ field :id
76
+ end
77
+
78
+ class WorkingParticipant < Familia::Horreum
79
+ feature :relationships
80
+ identifier_field :id
81
+ field :id
82
+
83
+ # This should work - ExistingTargetClass is already defined
84
+ participates_in ExistingTargetClass, :items
85
+ end
86
+
87
+ # Verify the class was created successfully
88
+ WorkingParticipant.ancestors.include?(Familia::Horreum)
89
+ #=> true
90
+
91
+ ## Test that resolved Symbol target works (no error)
92
+ class PreDefinedTarget < Familia::Horreum
93
+ feature :relationships
94
+ identifier_field :id
95
+ field :id
96
+ end
97
+
98
+ class SymbolParticipant < Familia::Horreum
99
+ feature :relationships
100
+ identifier_field :id
101
+ field :id
102
+
103
+ # This should work - PreDefinedTarget is defined above
104
+ participates_in :PreDefinedTarget, :items
105
+ end
106
+
107
+ # Verify it worked
108
+ SymbolParticipant.ancestors.include?(Familia::Horreum)
109
+ #=> true
@@ -1,5 +1,7 @@
1
1
  # try/features/relationships/relationships_api_changes_try.rb
2
2
  #
3
+ # frozen_string_literal: true
4
+
3
5
  # Test coverage for Familia v2 relationships API changes
4
6
  # Testing new class_participates_in and unique_index methods
5
7
  # Testing breaking changes and argument validation
@@ -264,17 +266,17 @@ participation_meta.target_class.familia_name
264
266
 
265
267
  ## unique_index stores correct target_class
266
268
  indexing_meta = ApiTestUser.indexing_relationships.find { |r| r.index_name == :email_lookup }
267
- indexing_meta.target_class
269
+ indexing_meta.scope_class
268
270
  #=> ApiTestUser
269
271
 
270
- ## unique_index stores correct target_class via familia_name
272
+ ## unique_index stores correct scope_class via familia_name
271
273
  indexing_meta = ApiTestUser.indexing_relationships.find { |r| r.index_name == :email_lookup }
272
- indexing_meta.target_class.familia_name
274
+ indexing_meta.scope_class.familia_name
273
275
  #=> 'ApiTestUser'
274
276
 
275
277
  ## multi_index with within: stores correct metadata
276
278
  membership_meta = ApiTestMembership.indexing_relationships.find { |r| r.index_name == :user_memberships }
277
- membership_meta.target_class
279
+ membership_meta.scope_class
278
280
  #=> ApiTestUser
279
281
 
280
282
  # =============================================
@@ -1,3 +1,7 @@
1
+ # try/features/relationships/relationships_edge_cases_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Simplified edge case testing for Relationships v2 - focusing on core functionality
2
6
 
3
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/features/relationships/relationships_performance_minimal_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Minimal performance testing focusing on core Familia functionality
2
6
 
3
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/features/relationships/relationships_performance_simple_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/features/relationships_performance_simple_try.rb
2
6
  #
3
7
  # Simplified performance testing for the Relationships feature
@@ -1,3 +1,7 @@
1
+ # try/features/relationships/relationships_performance_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/features/relationships_performance_try.rb
2
6
  #
3
7
  # Performance and integration testing for the Relationships feature
@@ -1,3 +1,7 @@
1
+ # try/features/relationships/relationships_performance_working_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/features/relationships_performance_working_try.rb
2
6
  #
3
7
  # Working performance test focusing on basic functionality
@@ -1,5 +1,7 @@
1
1
  # try/features/relationships/relationships_try.rb
2
2
  #
3
+ # frozen_string_literal: true
4
+
3
5
  # Simplified Familia v2 relationship functionality tests - focusing on core working features
4
6
  #
5
7
 
@@ -113,12 +115,12 @@ decoded[:permission_list].include?(:write)
113
115
  @customer.domains.class.name
114
116
  #=> "Familia::SortedSet"
115
117
 
116
- ## Customer can add domains (generated method)
117
- @customer.respond_to?(:add_domain)
118
+ ## Customer can add domains (generated method with _instance suffix)
119
+ @customer.respond_to?(:add_domains_instance)
118
120
  #=> true
119
121
 
120
- ## Customer can remove domains (generated method)
121
- @customer.respond_to?(:remove_domain)
122
+ ## Customer can remove domains (generated method with _instance suffix)
123
+ @customer.respond_to?(:remove_domains_instance)
122
124
  #=> true
123
125
 
124
126
  ## Domain can check membership in customer domains (collision-free naming)
@@ -1,3 +1,7 @@
1
+ # try/features/safe_dump/safe_dump_advanced_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/features/safe_dump_extended_try.rb
2
6
 
3
7
  # These tryouts test the safe dumping functionality.
@@ -1,3 +1,7 @@
1
+ # try/features/safe_dump/safe_dump_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/features/safe_dump_try.rb
2
6
 
3
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,4 +1,6 @@
1
1
  # try/features/transient_fields/redacted_string_try.rb
2
+ #
3
+ # frozen_string_literal: true
2
4
 
3
5
  require_relative '../../support/helpers/test_helpers'
4
6
 
@@ -1,4 +1,7 @@
1
1
  # try/features/transient_fields/refresh_reset_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
2
5
  # Test that refresh! properly resets transient fields to nil
3
6
 
4
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,3 +1,6 @@
1
+ # try/features/transient_fields/simple_refresh_test.rb
2
+ #
3
+ # frozen_string_literal: true
1
4
 
2
5
  require_relative '../../helpers/test_helpers'
3
6
 
@@ -1,4 +1,6 @@
1
1
  # try/features/transient_fields/single_use_redacted_string_try.rb
2
+ #
3
+ # frozen_string_literal: true
2
4
 
3
5
  require_relative '../../support/helpers/test_helpers'
4
6
 
@@ -1,3 +1,7 @@
1
+ # try/features/transient_fields/transient_fields_core_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/features/transient_fields_core_try.rb
2
6
 
3
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/features/transient_fields/transient_fields_integration_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/features/transient_fields_integration_try.rb
2
6
 
3
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/fiber_context_preservation_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Fiber Context Preservation Tryouts
2
6
  #
3
7
  # Tests that verify the removal of previous_conn preservation logic
@@ -166,7 +170,7 @@ end
166
170
  ## Operation guards prevent pipeline fiber issues before they occur
167
171
  begin
168
172
  # Ensure we're in strict mode for this test
169
- Familia.configure { |config| config.pipeline_mode = :strict }
173
+ Familia.configure { |config| config.pipelined_mode = :strict }
170
174
 
171
175
  Fiber[:familia_connection] = [Customer.create_dbclient, Familia.middleware_version]
172
176
  Fiber[:familia_connection_handler_class] = Familia::Connection::FiberConnectionHandler
@@ -185,7 +189,7 @@ end
185
189
 
186
190
  ## Method aliases work correctly
187
191
  # pipeline alias for pipelined
188
- result1 = Familia.pipeline do |conn|
192
+ result1 = Familia.pipelined do |conn|
189
193
  conn.set('alias_test', 'alias_success')
190
194
  conn.get('alias_test')
191
195
  end
@@ -203,7 +207,7 @@ result1.results.last == 'alias_success' && result2.results.last == 'alias_succes
203
207
  customer = Customer.new(custid: 'alias_test')
204
208
 
205
209
  # pipeline alias
206
- result1 = customer.pipeline do |conn|
210
+ result1 = customer.pipelined do |conn|
207
211
  conn.set('horreum:alias1', 'success1')
208
212
  conn.get('horreum:alias1')
209
213
  end
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/handler_constraints_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Handler Constraint Methods Tryouts
2
6
  #
3
7
  # Tests that each connection handler class correctly defines its operation
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/isolated_dbclient_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/core/isolated_dbclient_try.rb
2
6
 
3
7
  # Tryouts: Isolated connection functionality
@@ -1,5 +1,7 @@
1
1
  # try/integration/connection/middleware_reconnect_try.rb
2
2
  #
3
+ # frozen_string_literal: true
4
+
3
5
  # Tests for Familia.reconnect! method that refreshes connection pools
4
6
  # with current middleware configuration
5
7
 
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/operation_mode_guards_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Operation Mode Guards Tryouts
2
6
  #
3
7
  # Tests the connection handler operation mode enforcement that prevents Redis
@@ -36,7 +40,7 @@ end
36
40
  ## FiberConnectionHandler blocks pipelines
37
41
  begin
38
42
  # Ensure we're in strict mode for this test
39
- Familia.configure { |config| config.pipeline_mode = :strict }
43
+ Familia.configure { |config| config.pipelined_mode = :strict }
40
44
 
41
45
  # Simulate middleware connection
42
46
  Fiber[:familia_connection] = [Customer.create_dbclient, Familia.middleware_version]
@@ -1,13 +1,16 @@
1
+ # try/integration/connection/pipeline_fallback_integration_try.rb
1
2
  #
3
+ # frozen_string_literal: true
4
+
2
5
  # Tests pipeline fallback modes when connection handlers don't support pipelines.
3
- # Validates that pipeline_mode configuration works correctly with cached connections
6
+ # Validates that pipelined_mode configuration works correctly with cached connections
4
7
  # and that the fallback behavior matches transaction fallback patterns.
5
8
  #
6
9
 
7
10
  require_relative '../../support/helpers/test_helpers'
8
11
 
9
12
  # Store original values
10
- $original_pipeline_mode = Familia.pipeline_mode
13
+ $original_pipelined_mode = Familia.pipelined_mode
11
14
  $original_transaction_mode = Familia.transaction_mode
12
15
 
13
16
  # Test model for pipeline fallback scenarios
@@ -17,7 +20,7 @@ class PipelineFallbackTest < Familia::Horreum
17
20
  end
18
21
 
19
22
  ## Test 1: Strict mode raises error with cached connection
20
- Familia.configure { |c| c.pipeline_mode = :strict }
23
+ Familia.configure { |c| c.pipelined_mode = :strict }
21
24
 
22
25
  # Cache connection at class level (uses DefaultConnectionHandler which doesn't support pipelines)
23
26
  PipelineFallbackTest.instance_variable_set(:@dbclient, Familia.create_dbclient)
@@ -28,7 +31,7 @@ customer.pipelined { |c| c.set('key', 'value') }
28
31
  #=~> /Cannot start pipeline with.*CachedConnectionHandler/
29
32
 
30
33
  ## Test 2: Warn mode falls back successfully with cached connection
31
- Familia.configure { |c| c.pipeline_mode = :warn }
34
+ Familia.configure { |c| c.pipelined_mode = :warn }
32
35
 
33
36
  # Cache connection at class level
34
37
  PipelineFallbackTest.instance_variable_set(:@dbclient, Familia.create_dbclient)
@@ -51,7 +54,7 @@ $warn_result.results[2]
51
54
  #=> 'value1'
52
55
 
53
56
  ## Test 3: Fresh connections still support real pipelines in strict mode
54
- Familia.configure { |c| c.pipeline_mode = :strict }
57
+ Familia.configure { |c| c.pipelined_mode = :strict }
55
58
 
56
59
  # Clear cached class-level connection to force CreateConnectionHandler
57
60
  PipelineFallbackTest.remove_instance_variable(:@dbclient) if PipelineFallbackTest.instance_variable_defined?(:@dbclient)
@@ -70,7 +73,7 @@ $fresh_result.results.size
70
73
  #=> 3
71
74
 
72
75
  ## Test 4: MultiResult format is correct for fallback
73
- Familia.configure { |c| c.pipeline_mode = :permissive }
76
+ Familia.configure { |c| c.pipelined_mode = :permissive }
74
77
 
75
78
  # Cache connection at class level
76
79
  PipelineFallbackTest.instance_variable_set(:@dbclient, Familia.create_dbclient)
@@ -92,7 +95,7 @@ $multi_result.results.class
92
95
  #=> Array
93
96
 
94
97
  ## Test 5: Permissive mode silently falls back
95
- Familia.configure { |c| c.pipeline_mode = :permissive }
98
+ Familia.configure { |c| c.pipelined_mode = :permissive }
96
99
 
97
100
  # Cache connection at class level
98
101
  PipelineFallbackTest.instance_variable_set(:@dbclient, Familia.create_dbclient)
@@ -111,18 +114,18 @@ $permissive_result.results
111
114
  #=> ['OK', 1, '1']
112
115
 
113
116
  ## Test 6: Pipeline mode configuration validation
114
- Familia.configure { |c| c.pipeline_mode = :invalid }
117
+ Familia.configure { |c| c.pipelined_mode = :invalid }
115
118
  #=:> ArgumentError
116
119
  #=~> /Pipeline mode must be :strict, :warn, or :permissive/
117
120
 
118
- ## Test 7: Default pipeline_mode is :warn
119
- Familia.instance_variable_set(:@pipeline_mode, nil)
120
- Familia.pipeline_mode
121
+ ## Test 7: Default pipelined_mode is :warn
122
+ Familia.instance_variable_set(:@pipelined_mode, nil)
123
+ Familia.pipelined_mode
121
124
  #=> :warn
122
125
 
123
126
  ## Cleanup: Restore original values
124
127
  Familia.configure do |c|
125
- c.pipeline_mode = $original_pipeline_mode
128
+ c.pipelined_mode = $original_pipelined_mode
126
129
  c.transaction_mode = $original_transaction_mode
127
130
  end
128
131
  PipelineFallbackTest.remove_instance_variable(:@dbclient) if PipelineFallbackTest.instance_variable_defined?(:@dbclient)
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/pools_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/pooling/connection_pool_test_try.rb
2
6
 
3
7
  # USAGE: FAMILIA_TRACE=1 FAMILIA_DEBUG=1 bundle exec tryouts try/pooling/connection_pool_test_try.rb
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/responsibility_chain_tracking_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # ResponsibilityChain Handler Tracking Tryouts
2
6
  #
3
7
  # Tests that the ResponsibilityChain correctly tracks which handler provided
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/transaction_fallback_integration_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Transaction Fallback Integration Tryouts
2
6
  #
3
7
  # Tests real-world scenarios where transaction fallback is needed, particularly
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/transaction_mode_permissive_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Transaction Mode: Permissive Tryouts
2
6
  #
3
7
  # Tests permissive transaction mode behavior where operations silently
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/transaction_mode_strict_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Transaction Mode: Strict Tryouts
2
6
  #
3
7
  # Tests strict transaction mode behavior where operations fail fast
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/transaction_mode_warn_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Transaction Mode: Warn Tryouts
2
6
  #
3
7
  # Tests warn transaction mode behavior where operations log a warning
@@ -1,3 +1,7 @@
1
+ # try/integration/connection/transaction_modes_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Transaction Modes Tryouts
2
6
  #
3
7
  # Tests the configurable transaction mode system that provides graceful fallback
@@ -1,3 +1,7 @@
1
+ # try/integration/conventional_inheritance_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  require_relative '../support/helpers/test_helpers'
2
6
 
3
7
  # Define test classes in global namespace