familia 2.0.0.pre19 → 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 (372) 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 +177 -112
  8. data/CLAUDE.md +28 -1
  9. data/Gemfile +1 -1
  10. data/Gemfile.lock +20 -17
  11. data/bin/try +16 -0
  12. data/bin/tryouts +16 -0
  13. data/changelog.d/20251105_flexible_external_identifier_format.rst +66 -0
  14. data/changelog.d/20251107_112554_delano_179_participation_asymmetry.rst +44 -0
  15. data/changelog.d/20251107_213121_delano_fix_thread_safety_races_011CUumCP492Twxm4NLt2FvL.rst +20 -0
  16. data/changelog.d/20251107_fix_participates_in_symbol_resolution.rst +91 -0
  17. data/changelog.d/20251107_optimized_redis_exists_checks.rst +94 -0
  18. data/changelog.d/20251108_frozen_string_literal_pragma.rst +44 -0
  19. data/docs/1106-participates_in-bidirectional-solution.md +129 -0
  20. data/docs/guides/encryption.md +486 -0
  21. data/docs/guides/feature-encrypted-fields.md +123 -7
  22. data/docs/guides/feature-expiration.md +161 -117
  23. data/docs/guides/feature-external-identifiers.md +415 -443
  24. data/docs/guides/feature-object-identifiers.md +400 -269
  25. data/docs/guides/feature-quantization.md +120 -6
  26. data/docs/guides/feature-relationships-indexing.md +318 -0
  27. data/docs/guides/feature-relationships-methods.md +146 -604
  28. data/docs/guides/feature-relationships-participation.md +263 -0
  29. data/docs/guides/feature-relationships.md +118 -136
  30. data/docs/guides/feature-system-devs.md +176 -693
  31. data/docs/guides/feature-system.md +119 -6
  32. data/docs/guides/feature-transient-fields.md +81 -0
  33. data/docs/guides/field-system.md +778 -0
  34. data/docs/guides/index.md +32 -15
  35. data/docs/guides/logging.md +187 -0
  36. data/docs/guides/optimized-loading.md +674 -0
  37. data/docs/guides/thread-safety-monitoring.md +61 -0
  38. data/docs/guides/{time-utilities.md → time-literals.md} +12 -12
  39. data/docs/migrating/v2.0.0-pre22.md +241 -0
  40. data/docs/overview.md +7 -9
  41. data/docs/reference/api-technical.md +267 -320
  42. data/examples/autoloader/mega_customer/features/deprecated_fields.rb +2 -0
  43. data/examples/autoloader/mega_customer/safe_dump_fields.rb +2 -0
  44. data/examples/autoloader/mega_customer.rb +2 -0
  45. data/examples/datatype_standalone.rb +4 -3
  46. data/examples/encrypted_fields.rb +2 -1
  47. data/examples/json_usage_patterns.rb +2 -0
  48. data/examples/relationships.rb +3 -0
  49. data/examples/safe_dump.rb +2 -1
  50. data/examples/sampling_demo.rb +53 -0
  51. data/examples/single_connection_transaction_confusions.rb +2 -1
  52. data/familia.gemspec +2 -1
  53. data/lib/familia/base.rb +2 -0
  54. data/lib/familia/connection/behavior.rb +2 -0
  55. data/lib/familia/connection/handlers.rb +2 -0
  56. data/lib/familia/connection/individual_command_proxy.rb +2 -0
  57. data/lib/familia/connection/middleware.rb +34 -24
  58. data/lib/familia/connection/operation_core.rb +2 -0
  59. data/lib/familia/connection/operations.rb +2 -0
  60. data/lib/familia/connection/pipelined_core.rb +2 -0
  61. data/lib/familia/connection/transaction_core.rb +68 -0
  62. data/lib/familia/connection.rb +18 -3
  63. data/lib/familia/data_type/class_methods.rb +3 -1
  64. data/lib/familia/data_type/connection.rb +2 -0
  65. data/lib/familia/data_type/database_commands.rb +2 -0
  66. data/lib/familia/data_type/serialization.rb +6 -4
  67. data/lib/familia/data_type/settings.rb +2 -0
  68. data/lib/familia/data_type/types/counter.rb +2 -0
  69. data/lib/familia/data_type/types/hashkey.rb +7 -5
  70. data/lib/familia/data_type/types/listkey.rb +2 -0
  71. data/lib/familia/data_type/types/lock.rb +2 -0
  72. data/lib/familia/data_type/types/sorted_set.rb +2 -0
  73. data/lib/familia/data_type/types/stringkey.rb +2 -0
  74. data/lib/familia/data_type/types/unsorted_set.rb +2 -0
  75. data/lib/familia/data_type.rb +2 -0
  76. data/lib/familia/encryption/encrypted_data.rb +4 -2
  77. data/lib/familia/encryption/manager.rb +2 -0
  78. data/lib/familia/encryption/provider.rb +2 -0
  79. data/lib/familia/encryption/providers/aes_gcm_provider.rb +2 -0
  80. data/lib/familia/encryption/providers/secure_xchacha20_poly1305_provider.rb +2 -0
  81. data/lib/familia/encryption/providers/xchacha20_poly1305_provider.rb +2 -0
  82. data/lib/familia/encryption/registry.rb +2 -0
  83. data/lib/familia/encryption/request_cache.rb +2 -0
  84. data/lib/familia/encryption.rb +9 -2
  85. data/lib/familia/errors.rb +2 -0
  86. data/lib/familia/features/autoloader.rb +2 -0
  87. data/lib/familia/features/encrypted_fields/concealed_string.rb +2 -0
  88. data/lib/familia/features/encrypted_fields/encrypted_field_type.rb +4 -0
  89. data/lib/familia/features/encrypted_fields.rb +2 -2
  90. data/lib/familia/features/expiration/extensions.rb +3 -1
  91. data/lib/familia/features/expiration.rb +12 -4
  92. data/lib/familia/features/external_identifier.rb +33 -7
  93. data/lib/familia/features/object_identifier.rb +2 -0
  94. data/lib/familia/features/quantization.rb +3 -1
  95. data/lib/familia/features/relationships/README.md +3 -1
  96. data/lib/familia/features/relationships/collection_operations.rb +2 -0
  97. data/lib/familia/features/relationships/indexing/multi_index_generators.rb +138 -9
  98. data/lib/familia/features/relationships/indexing/rebuild_strategies.rb +479 -0
  99. data/lib/familia/features/relationships/indexing/unique_index_generators.rb +89 -21
  100. data/lib/familia/features/relationships/indexing.rb +3 -0
  101. data/lib/familia/features/relationships/indexing_relationship.rb +3 -1
  102. data/lib/familia/features/relationships/participation/participant_methods.rb +131 -14
  103. data/lib/familia/features/relationships/participation/rebuild_strategies.md +41 -0
  104. data/lib/familia/features/relationships/participation/target_methods.rb +6 -6
  105. data/lib/familia/features/relationships/participation.rb +155 -69
  106. data/lib/familia/features/relationships/participation_membership.rb +69 -0
  107. data/lib/familia/features/relationships/participation_relationship.rb +34 -6
  108. data/lib/familia/features/relationships/score_encoding.rb +2 -0
  109. data/lib/familia/features/relationships.rb +5 -3
  110. data/lib/familia/features/safe_dump.rb +2 -0
  111. data/lib/familia/features/transient_fields/redacted_string.rb +2 -0
  112. data/lib/familia/features/transient_fields/single_use_redacted_string.rb +2 -0
  113. data/lib/familia/features/transient_fields/transient_field_type.rb +5 -3
  114. data/lib/familia/features/transient_fields.rb +2 -0
  115. data/lib/familia/features.rb +2 -0
  116. data/lib/familia/field_type.rb +3 -1
  117. data/lib/familia/horreum/connection.rb +17 -1
  118. data/lib/familia/horreum/database_commands.rb +2 -0
  119. data/lib/familia/horreum/definition.rb +16 -6
  120. data/lib/familia/horreum/management.rb +212 -42
  121. data/lib/familia/horreum/persistence.rb +176 -108
  122. data/lib/familia/horreum/related_fields.rb +2 -0
  123. data/lib/familia/horreum/serialization.rb +23 -4
  124. data/lib/familia/horreum/settings.rb +2 -0
  125. data/lib/familia/horreum/utils.rb +2 -0
  126. data/lib/familia/horreum.rb +15 -1
  127. data/lib/familia/identifier_extractor.rb +2 -0
  128. data/lib/familia/instrumentation.rb +156 -0
  129. data/lib/familia/json_serializer.rb +2 -0
  130. data/lib/familia/logging.rb +92 -32
  131. data/lib/familia/refinements/dear_json.rb +2 -0
  132. data/lib/familia/refinements/stylize_words.rb +2 -14
  133. data/lib/familia/refinements/time_literals.rb +2 -0
  134. data/lib/familia/refinements.rb +2 -0
  135. data/lib/familia/secure_identifier.rb +10 -2
  136. data/lib/familia/settings.rb +2 -0
  137. data/lib/familia/thread_safety/instrumented_mutex.rb +166 -0
  138. data/lib/familia/thread_safety/monitor.rb +328 -0
  139. data/lib/familia/utils.rb +13 -0
  140. data/lib/familia/verifiable_identifier.rb +3 -1
  141. data/lib/familia/version.rb +3 -1
  142. data/lib/familia.rb +31 -4
  143. data/lib/middleware/database_command_counter.rb +152 -0
  144. data/lib/middleware/database_logger.rb +295 -170
  145. data/lib/multi_result.rb +2 -0
  146. data/try/edge_cases/empty_identifiers_try.rb +2 -0
  147. data/try/edge_cases/hash_symbolization_try.rb +2 -0
  148. data/try/edge_cases/json_serialization_try.rb +2 -0
  149. data/try/edge_cases/legacy_data_detection/deserialization_edge_cases_try.rb +4 -0
  150. data/try/edge_cases/race_conditions_try.rb +4 -0
  151. data/try/edge_cases/reserved_keywords_try.rb +4 -0
  152. data/try/edge_cases/string_coercion_try.rb +2 -0
  153. data/try/edge_cases/ttl_side_effects_try.rb +4 -0
  154. data/try/features/encrypted_fields/aad_protection_try.rb +4 -0
  155. data/try/features/encrypted_fields/concealed_string_core_try.rb +4 -0
  156. data/try/features/encrypted_fields/context_isolation_try.rb +4 -0
  157. data/try/features/encrypted_fields/encrypted_fields_core_try.rb +33 -0
  158. data/try/features/encrypted_fields/encrypted_fields_integration_try.rb +4 -0
  159. data/try/features/encrypted_fields/encrypted_fields_no_cache_security_try.rb +4 -0
  160. data/try/features/encrypted_fields/encrypted_fields_security_try.rb +4 -0
  161. data/try/features/encrypted_fields/error_conditions_try.rb +4 -0
  162. data/try/features/encrypted_fields/fresh_key_derivation_try.rb +4 -0
  163. data/try/features/encrypted_fields/fresh_key_try.rb +4 -0
  164. data/try/features/encrypted_fields/key_rotation_try.rb +4 -0
  165. data/try/features/encrypted_fields/memory_security_try.rb +4 -0
  166. data/try/features/encrypted_fields/missing_current_key_version_try.rb +4 -0
  167. data/try/features/encrypted_fields/nonce_uniqueness_try.rb +4 -0
  168. data/try/features/encrypted_fields/secure_by_default_behavior_try.rb +4 -0
  169. data/try/features/encrypted_fields/thread_safety_try.rb +4 -0
  170. data/try/features/encrypted_fields/universal_serialization_safety_try.rb +4 -0
  171. data/try/features/encryption/config_persistence_try.rb +4 -0
  172. data/try/features/encryption/core_try.rb +4 -0
  173. data/try/features/encryption/instance_variable_scope_try.rb +4 -0
  174. data/try/features/encryption/module_loading_try.rb +4 -0
  175. data/try/features/encryption/providers/aes_gcm_provider_try.rb +4 -0
  176. data/try/features/encryption/providers/xchacha20_poly1305_provider_try.rb +4 -0
  177. data/try/features/encryption/roundtrip_validation_try.rb +4 -0
  178. data/try/features/encryption/secure_memory_handling_try.rb +4 -0
  179. data/try/features/expiration/expiration_try.rb +4 -0
  180. data/try/features/external_identifier/external_identifier_try.rb +171 -8
  181. data/try/features/feature_dependencies_try.rb +2 -0
  182. data/try/features/feature_improvements_try.rb +2 -0
  183. data/try/features/field_groups_try.rb +2 -0
  184. data/try/features/object_identifier/object_identifier_integration_try.rb +12 -9
  185. data/try/features/object_identifier/object_identifier_try.rb +2 -0
  186. data/try/features/quantization/quantization_try.rb +4 -0
  187. data/try/features/real_feature_integration_try.rb +2 -0
  188. data/try/features/relationships/indexing_commands_verification_try.rb +2 -0
  189. data/try/features/relationships/indexing_rebuild_try.rb +600 -0
  190. data/try/features/relationships/indexing_try.rb +2 -0
  191. data/try/features/relationships/participation_bidirectional_try.rb +242 -0
  192. data/try/features/relationships/participation_commands_verification_spec.rb +4 -0
  193. data/try/features/relationships/participation_commands_verification_try.rb +2 -0
  194. data/try/features/relationships/participation_performance_improvements_try.rb +11 -9
  195. data/try/features/relationships/participation_reverse_index_try.rb +15 -13
  196. data/try/features/relationships/participation_target_class_resolution_try.rb +209 -0
  197. data/try/features/relationships/participation_unresolved_target_try.rb +109 -0
  198. data/try/features/relationships/relationships_api_changes_try.rb +2 -0
  199. data/try/features/relationships/relationships_edge_cases_try.rb +4 -0
  200. data/try/features/relationships/relationships_performance_minimal_try.rb +4 -0
  201. data/try/features/relationships/relationships_performance_simple_try.rb +4 -0
  202. data/try/features/relationships/relationships_performance_try.rb +4 -0
  203. data/try/features/relationships/relationships_performance_working_try.rb +4 -0
  204. data/try/features/relationships/relationships_try.rb +6 -4
  205. data/try/features/safe_dump/safe_dump_advanced_try.rb +4 -0
  206. data/try/features/safe_dump/safe_dump_try.rb +4 -0
  207. data/try/features/transient_fields/redacted_string_try.rb +2 -0
  208. data/try/features/transient_fields/refresh_reset_try.rb +3 -0
  209. data/try/features/transient_fields/simple_refresh_test.rb +3 -0
  210. data/try/features/transient_fields/single_use_redacted_string_try.rb +2 -0
  211. data/try/features/transient_fields/transient_fields_core_try.rb +4 -0
  212. data/try/features/transient_fields/transient_fields_integration_try.rb +4 -0
  213. data/try/integration/connection/fiber_context_preservation_try.rb +4 -0
  214. data/try/integration/connection/handler_constraints_try.rb +4 -0
  215. data/try/integration/connection/isolated_dbclient_try.rb +4 -0
  216. data/try/integration/connection/middleware_reconnect_try.rb +2 -0
  217. data/try/integration/connection/operation_mode_guards_try.rb +4 -0
  218. data/try/integration/connection/pipeline_fallback_integration_try.rb +3 -0
  219. data/try/integration/connection/pools_try.rb +4 -0
  220. data/try/integration/connection/responsibility_chain_tracking_try.rb +4 -0
  221. data/try/integration/connection/transaction_fallback_integration_try.rb +4 -0
  222. data/try/integration/connection/transaction_mode_permissive_try.rb +4 -0
  223. data/try/integration/connection/transaction_mode_strict_try.rb +4 -0
  224. data/try/integration/connection/transaction_mode_warn_try.rb +4 -0
  225. data/try/integration/connection/transaction_modes_try.rb +4 -0
  226. data/try/integration/conventional_inheritance_try.rb +4 -0
  227. data/try/integration/create_method_try.rb +4 -0
  228. data/try/integration/cross_component_try.rb +4 -0
  229. data/try/integration/data_types/datatype_pipelines_try.rb +4 -0
  230. data/try/integration/data_types/datatype_transactions_try.rb +4 -0
  231. data/try/integration/database_consistency_try.rb +4 -0
  232. data/try/integration/familia_extended_try.rb +4 -0
  233. data/try/integration/familia_members_methods_try.rb +4 -0
  234. data/try/integration/models/customer_safe_dump_try.rb +4 -0
  235. data/try/integration/models/customer_try.rb +4 -0
  236. data/try/integration/models/datatype_base_try.rb +4 -0
  237. data/try/integration/models/familia_object_try.rb +4 -0
  238. data/try/integration/persistence_operations_try.rb +4 -0
  239. data/try/integration/relationships_persistence_round_trip_try.rb +17 -14
  240. data/try/integration/save_methods_consistency_try.rb +241 -0
  241. data/try/integration/scenarios_try.rb +4 -0
  242. data/try/integration/secure_identifier_try.rb +4 -0
  243. data/try/integration/transaction_safety_core_try.rb +176 -0
  244. data/try/integration/transaction_safety_workflow_try.rb +291 -0
  245. data/try/integration/verifiable_identifier_try.rb +4 -0
  246. data/try/investigation/pipeline_routing/README.md +228 -0
  247. data/try/performance/benchmarks_try.rb +4 -0
  248. data/try/performance/transaction_safety_benchmark_try.rb +238 -0
  249. data/try/support/benchmarks/deserialization_benchmark.rb +3 -1
  250. data/try/support/benchmarks/deserialization_correctness_test.rb +3 -1
  251. data/try/support/debugging/cache_behavior_tracer.rb +4 -0
  252. data/try/support/debugging/debug_aad_process.rb +3 -0
  253. data/try/support/debugging/debug_concealed_internal.rb +3 -0
  254. data/try/support/debugging/debug_concealed_reveal.rb +3 -0
  255. data/try/support/debugging/debug_context_aad.rb +3 -0
  256. data/try/support/debugging/debug_context_simple.rb +3 -0
  257. data/try/support/debugging/debug_cross_context.rb +3 -0
  258. data/try/support/debugging/debug_database_load.rb +3 -0
  259. data/try/support/debugging/debug_encrypted_json_check.rb +3 -0
  260. data/try/support/debugging/debug_encrypted_json_step_by_step.rb +3 -0
  261. data/try/support/debugging/debug_exists_lifecycle.rb +3 -0
  262. data/try/support/debugging/debug_field_decrypt.rb +3 -0
  263. data/try/support/debugging/debug_fresh_cross_context.rb +3 -0
  264. data/try/support/debugging/debug_load_path.rb +3 -0
  265. data/try/support/debugging/debug_method_definition.rb +3 -0
  266. data/try/support/debugging/debug_method_resolution.rb +3 -0
  267. data/try/support/debugging/debug_minimal.rb +3 -0
  268. data/try/support/debugging/debug_provider.rb +3 -0
  269. data/try/support/debugging/debug_secure_behavior.rb +3 -0
  270. data/try/support/debugging/debug_string_class.rb +3 -0
  271. data/try/support/debugging/debug_test.rb +3 -0
  272. data/try/support/debugging/debug_test_design.rb +3 -0
  273. data/try/support/debugging/encryption_method_tracer.rb +4 -0
  274. data/try/support/debugging/provider_diagnostics.rb +4 -0
  275. data/try/support/helpers/test_cleanup.rb +4 -0
  276. data/try/support/helpers/test_helpers.rb +5 -0
  277. data/try/support/memory/memory_basic_test.rb +4 -0
  278. data/try/support/memory/memory_detailed_test.rb +4 -0
  279. data/try/support/memory/memory_search_for_string.rb +4 -0
  280. data/try/support/memory/test_actual_redactedstring_protection.rb +4 -0
  281. data/try/support/prototypes/atomic_saves_v1_context_proxy.rb +4 -0
  282. data/try/support/prototypes/atomic_saves_v2_connection_switching.rb +4 -0
  283. data/try/support/prototypes/atomic_saves_v3_connection_pool.rb +4 -0
  284. data/try/support/prototypes/atomic_saves_v4.rb +4 -0
  285. data/try/support/prototypes/lib/atomic_saves_v2_connection_switching_helpers.rb +4 -0
  286. data/try/support/prototypes/lib/atomic_saves_v3_connection_pool_helpers.rb +4 -0
  287. data/try/support/prototypes/pooling/configurable_stress_test.rb +4 -0
  288. data/try/support/prototypes/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb +4 -0
  289. data/try/support/prototypes/pooling/lib/connection_pool_metrics.rb +4 -0
  290. data/try/support/prototypes/pooling/lib/connection_pool_stress_test.rb +4 -0
  291. data/try/support/prototypes/pooling/lib/connection_pool_threading_models.rb +4 -0
  292. data/try/support/prototypes/pooling/lib/visualize_stress_results.rb +4 -2
  293. data/try/support/prototypes/pooling/pool_siege.rb +4 -2
  294. data/try/support/prototypes/pooling/run_stress_tests.rb +4 -2
  295. data/try/thread_safety/README.md +496 -0
  296. data/try/thread_safety/class_connection_chain_race_try.rb +265 -0
  297. data/try/thread_safety/connection_chain_race_try.rb +148 -0
  298. data/try/thread_safety/encryption_manager_cache_race_try.rb +166 -0
  299. data/try/thread_safety/feature_registry_race_try.rb +226 -0
  300. data/try/thread_safety/fiber_pipeline_isolation_try.rb +235 -0
  301. data/try/thread_safety/fiber_transaction_isolation_try.rb +208 -0
  302. data/try/thread_safety/field_registration_race_try.rb +222 -0
  303. data/try/thread_safety/logger_initialization_race_try.rb +170 -0
  304. data/try/thread_safety/middleware_registration_race_try.rb +154 -0
  305. data/try/thread_safety/module_config_race_try.rb +175 -0
  306. data/try/thread_safety/secure_identifier_cache_race_try.rb +226 -0
  307. data/try/unit/core/autoloader_try.rb +4 -0
  308. data/try/unit/core/base_enhancements_try.rb +4 -0
  309. data/try/unit/core/connection_try.rb +4 -0
  310. data/try/unit/core/errors_try.rb +4 -0
  311. data/try/unit/core/extensions_try.rb +4 -0
  312. data/try/unit/core/familia_logger_try.rb +2 -0
  313. data/try/unit/core/familia_try.rb +4 -0
  314. data/try/unit/core/middleware_sampling_try.rb +335 -0
  315. data/try/unit/core/middleware_test_helpers_bug_try.rb +58 -0
  316. data/try/unit/core/middleware_thread_safety_try.rb +245 -0
  317. data/try/unit/core/middleware_try.rb +4 -0
  318. data/try/unit/core/settings_try.rb +4 -0
  319. data/try/unit/core/time_utils_try.rb +4 -0
  320. data/try/unit/core/tools_try.rb +4 -0
  321. data/try/unit/core/utils_try.rb +37 -0
  322. data/try/unit/data_types/boolean_try.rb +4 -0
  323. data/try/unit/data_types/counter_try.rb +4 -0
  324. data/try/unit/data_types/datatype_base_try.rb +4 -0
  325. data/try/unit/data_types/hash_try.rb +4 -0
  326. data/try/unit/data_types/list_try.rb +4 -0
  327. data/try/unit/data_types/lock_try.rb +4 -0
  328. data/try/unit/data_types/sorted_set_try.rb +4 -0
  329. data/try/unit/data_types/sorted_set_zadd_options_try.rb +4 -0
  330. data/try/unit/data_types/string_try.rb +4 -0
  331. data/try/unit/data_types/unsortedset_try.rb +4 -0
  332. data/try/unit/familia_resolve_class_try.rb +116 -0
  333. data/try/unit/horreum/auto_indexing_on_save_try.rb +5 -1
  334. data/try/unit/horreum/automatic_index_validation_try.rb +2 -0
  335. data/try/unit/horreum/base_try.rb +4 -0
  336. data/try/unit/horreum/class_methods_try.rb +4 -0
  337. data/try/unit/horreum/commands_try.rb +4 -0
  338. data/try/unit/horreum/defensive_initialization_try.rb +4 -0
  339. data/try/unit/horreum/destroy_related_fields_cleanup_try.rb +4 -0
  340. data/try/unit/horreum/enhanced_conflict_handling_try.rb +4 -0
  341. data/try/unit/horreum/field_categories_try.rb +4 -0
  342. data/try/unit/horreum/field_definition_try.rb +4 -0
  343. data/try/unit/horreum/initialization_try.rb +4 -0
  344. data/try/unit/horreum/json_type_preservation_try.rb +2 -0
  345. data/try/unit/horreum/optimized_loading_try.rb +156 -0
  346. data/try/unit/horreum/relations_try.rb +4 -0
  347. data/try/unit/horreum/serialization_persistent_fields_try.rb +4 -0
  348. data/try/unit/horreum/serialization_try.rb +4 -0
  349. data/try/unit/horreum/settings_try.rb +4 -0
  350. data/try/unit/horreum/unique_index_edge_cases_try.rb +4 -0
  351. data/try/unit/horreum/unique_index_guard_validation_try.rb +2 -0
  352. data/try/unit/middleware/database_command_counter_methods_try.rb +139 -0
  353. data/try/unit/middleware/database_logger_methods_try.rb +251 -0
  354. data/try/unit/refinements/dear_json_array_methods_try.rb +4 -0
  355. data/try/unit/refinements/dear_json_hash_methods_try.rb +4 -0
  356. data/try/unit/refinements/time_literals_numeric_methods_try.rb +4 -0
  357. data/try/unit/refinements/time_literals_string_methods_try.rb +4 -0
  358. data/try/unit/thread_safety_monitor_try.rb +149 -0
  359. metadata +72 -17
  360. data/.github/workflows/code-quality.yml +0 -138
  361. data/changelog.d/20251011_012003_delano_159_datatype_transaction_pipeline_support.rst +0 -91
  362. data/changelog.d/20251011_203905_delano_next.rst +0 -30
  363. data/changelog.d/20251011_212633_delano_next.rst +0 -13
  364. data/changelog.d/20251011_221253_delano_next.rst +0 -26
  365. data/docs/archive/FAMILIA_RELATIONSHIPS.md +0 -210
  366. data/docs/archive/FAMILIA_TECHNICAL.md +0 -823
  367. data/docs/archive/FAMILIA_UPDATE.md +0 -226
  368. data/docs/archive/README.md +0 -64
  369. data/docs/archive/api-reference.md +0 -333
  370. data/docs/guides/core-field-system.md +0 -806
  371. data/docs/guides/implementation.md +0 -276
  372. 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
@@ -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
@@ -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
@@ -1,4 +1,7 @@
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
6
  # Validates that pipelined_mode configuration works correctly with cached connections
4
7
  # and that the fallback behavior matches transaction fallback patterns.
@@ -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
@@ -1,3 +1,7 @@
1
+ # try/integration/create_method_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/core/create_method_try.rb
2
6
  #
3
7
  # Comprehensive test coverage for the create method
@@ -1,3 +1,7 @@
1
+ # try/integration/cross_component_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Test cross-component integration scenarios
2
6
 
3
7
  require_relative '../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/integration/data_types/datatype_pipelines_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # DataType Pipeline Support Tryouts
2
6
  #
3
7
  # Tests pipeline support for DataType objects. Pipelines provide performance
@@ -1,3 +1,7 @@
1
+ # try/integration/data_types/datatype_transactions_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # DataType Transaction Support Tryouts
2
6
  #
3
7
  # Tests transaction support for DataType objects, covering both parent-owned
@@ -1,3 +1,7 @@
1
+ # try/integration/database_consistency_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/core/database_consistency_try.rb
2
6
  #
3
7
  # Database consistency verification and edge case testing
@@ -1,3 +1,7 @@
1
+ # try/integration/familia_extended_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/core/familia_extended_try.rb
2
6
 
3
7
  require 'time'
@@ -1,3 +1,7 @@
1
+ # try/integration/familia_members_methods_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/core/familia_members_methods_try.rb
2
6
 
3
7
  require_relative '../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/integration/models/customer_safe_dump_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/models/customer_safedump_try.rb
2
6
 
3
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/integration/models/customer_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/models/customer_try.rb
2
6
 
3
7
  # Customer Tryouts
@@ -1,3 +1,7 @@
1
+ # try/integration/models/datatype_base_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/data_types/data_type_base_try.rb
2
6
 
3
7
  # Test DataType base functionality
@@ -1,3 +1,7 @@
1
+ # try/integration/models/familia_object_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/models/familia_object_try.rb
2
6
 
3
7
  require_relative '../../support/helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/integration/persistence_operations_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/core/persistence_operations_try.rb
2
6
  #
3
7
  # Comprehensive test coverage for core persistence methods: exists?, save, save_if_not_exists, create
@@ -1,5 +1,7 @@
1
1
  # try/integration/relationships_persistence_round_trip_try.rb
2
2
  #
3
+ # frozen_string_literal: true
4
+
3
5
  # CRITICAL PRIORITY: Full Persistence Round-Trip Testing for Relationships
4
6
  #
5
7
  # PURPOSE:
@@ -113,22 +115,23 @@ class ::RTPDomain < Familia::Horreum
113
115
  end
114
116
 
115
117
  # Setup - create test data with known values
116
- @test_user_id = "rtp_user_#{Familia.now.to_i}"
117
- @test_email = "roundtrip@example.com"
118
- @test_name = "Alice Roundtrip"
118
+ @test_run_id = Familia.now.to_i
119
+ @test_user_id = "rtp_user_#{@test_run_id}"
120
+ @test_email = "roundtrip-#{@test_run_id}@example.com"
121
+ @test_name = "Alice Roundtrip #{@test_run_id}"
119
122
  @test_age = 30
120
123
 
121
- @test_company_id = "rtp_comp_#{Familia.now.to_i}"
124
+ @test_company_id = "rtp_comp_#{@test_run_id}"
122
125
  @test_company_name = "Acme Corp"
123
126
  @test_industry = "Technology"
124
127
 
125
- @test_emp_id = "rtp_emp_#{Familia.now.to_i}"
126
- @test_emp_email = "employee@acme.com"
128
+ @test_emp_id = "rtp_emp_#{@test_run_id}"
129
+ @test_emp_email = "employee-#{@test_run_id}@acme.com"
127
130
  @test_department = "engineering"
128
- @test_badge = "BADGE_RTP_001"
131
+ @test_badge = "BADGE_RTP_#{@test_run_id}"
129
132
  @test_hire_date = Time.now.to_i
130
133
 
131
- @test_domain_id = "rtp_dom_#{Familia.now.to_i}"
134
+ @test_domain_id = "rtp_dom_#{@test_run_id}"
132
135
  @test_domain_name = "example.com"
133
136
  @test_domain_created = Familia.now.to_i
134
137
 
@@ -291,10 +294,10 @@ RTPEmployee.exists?(@test_emp_id)
291
294
 
292
295
  ## Multiple employees in same department
293
296
  @emp2_id = "rtp_emp2_#{Familia.now.to_i}"
294
- @emp2_badge = "BADGE_RTP_002"
297
+ @emp2_badge = "BADGE_RTP_002_#{@test_run_id}"
295
298
  @emp2 = RTPEmployee.new(
296
299
  emp_id: @emp2_id,
297
- email: "emp2@acme.com",
300
+ email: "emp2-#{@test_run_id}@acme.com",
298
301
  department: @test_department,
299
302
  badge_number: @emp2_badge
300
303
  )
@@ -323,7 +326,7 @@ RTPDomain.exists?(@test_domain_id)
323
326
  #=> true
324
327
 
325
328
  ## Add domain to company participation collection
326
- @company.add_domain(@domain)
329
+ @company.add_domains_instance(@domain)
327
330
  @company.domains.size
328
331
  #=> 1
329
332
 
@@ -377,7 +380,7 @@ RTPDomain.all_domains.size
377
380
  #=> @new_age
378
381
 
379
382
  ## Update email and verify index updates
380
- @new_email = "newemail@example.com"
383
+ @new_email = "newemail-#{@test_run_id}@example.com"
381
384
  @old_email = @user.email
382
385
  @user.email = @new_email
383
386
  @user.save
@@ -396,8 +399,8 @@ RTPUser.find_by_email(@old_email)
396
399
  ## User with nil field saves correctly
397
400
  @user_nil_age = RTPUser.new(
398
401
  user_id: "rtp_nil_#{Familia.now.to_i}",
399
- email: "nil@example.com",
400
- name: "Nil Tester",
402
+ email: "nil-#{@test_run_id}@example.com",
403
+ name: "Nil Tester #{@test_run_id}",
401
404
  age: nil
402
405
  )
403
406
  @user_nil_age.save