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,238 @@
1
+ # try/performance/transaction_safety_benchmark_try.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
5
+ # Transaction Safety Performance Benchmarks
6
+ #
7
+ # Measures the performance impact of transaction safety mechanisms
8
+ # and compares different transaction patterns for overhead analysis.
9
+ #
10
+
11
+ require_relative '../support/helpers/test_helpers'
12
+ require 'benchmark'
13
+
14
+ # Benchmark test model
15
+ class ::BenchmarkCustomer < Familia::Horreum
16
+ identifier_field :customer_id
17
+ field :customer_id
18
+ field :login_count
19
+ field :status
20
+ field :balance
21
+
22
+ list :orders
23
+ set :tags
24
+ end
25
+
26
+ # Helper for generating test data
27
+ def benchmark_id(prefix = 'bench')
28
+ "#{prefix}_#{Time.now.to_i}_#{rand(100000)}"
29
+ end
30
+
31
+ # Setup test customers
32
+ @customers = 100.times.map do |i|
33
+ customer = BenchmarkCustomer.new(
34
+ customer_id: benchmark_id("customer_#{i}"),
35
+ login_count: 0,
36
+ status: 'active',
37
+ balance: 1000
38
+ )
39
+ customer.save
40
+ customer
41
+ end
42
+
43
+ ## Simple transaction performance baseline
44
+ @start_time = Time.now
45
+ @customers.first(10).each do |customer|
46
+ customer.transaction do
47
+ customer.hset(:login_count, '1')
48
+ customer.hset(:status, 'updated')
49
+ end
50
+ end
51
+ @simple_duration = ((Time.now - @start_time) * 1000).round(2)
52
+ @simple_duration < 100 # Should complete in under 100ms
53
+ #=> true
54
+
55
+ ## Nested transaction performance (reentrant)
56
+ @start_time = Time.now
57
+ @customers[10, 10].each do |customer|
58
+ customer.transaction do
59
+ customer.hset(:login_count, '1')
60
+
61
+ # Nested transaction (reentrant)
62
+ customer.transaction do
63
+ customer.hset(:status, 'nested_updated')
64
+ customer.orders.push('nested_order')
65
+ end
66
+
67
+ customer.hset(:balance, '950')
68
+ end
69
+ end
70
+ @nested_duration = ((Time.now - @start_time) * 1000).round(2)
71
+ @nested_duration < 150 # Should have minimal overhead
72
+ #=> true
73
+
74
+ ## Nested vs simple transaction overhead ratio
75
+ @overhead_ratio = @nested_duration / @simple_duration
76
+ @overhead_ratio < 2.0 # Nested should be less than 2x slower
77
+ #=> true
78
+
79
+ ## Bulk operations in single transaction
80
+ @start_time = Time.now
81
+ BenchmarkCustomer.transaction do |conn|
82
+ @customers[20, 20].each do |customer|
83
+ conn.hset(customer.dbkey, 'bulk_status', 'processed')
84
+ conn.hset(customer.dbkey, 'bulk_timestamp', Time.now.to_i.to_s)
85
+ end
86
+ end
87
+ @bulk_duration = ((Time.now - @start_time) * 1000).round(2)
88
+ @bulk_duration < 50 # Bulk should be faster per operation
89
+ #=> true
90
+
91
+ ## Individual transactions vs bulk transaction efficiency
92
+ @individual_start = Time.now
93
+ @customers[40, 10].each do |customer|
94
+ customer.transaction do
95
+ customer.hset(:individual_status, 'processed')
96
+ end
97
+ end
98
+ @individual_duration = ((Time.now - @individual_start) * 1000).round(2)
99
+
100
+ @bulk_per_op = @bulk_duration / 20
101
+ @individual_per_op = @individual_duration / 10
102
+ @efficiency_ratio = @individual_per_op / @bulk_per_op
103
+ @efficiency_ratio > 1.5 # Individual should be slower per operation
104
+ #=> true
105
+
106
+ ## Connection reuse verification in nested transactions
107
+ @connection_ids = []
108
+ @customers[50, 1].each do |customer|
109
+ customer.transaction do |outer_conn|
110
+ @connection_ids << outer_conn.object_id
111
+
112
+ customer.transaction do |inner_conn|
113
+ @connection_ids << inner_conn.object_id
114
+ customer.hset(:conn_test, 'value')
115
+ end
116
+ end
117
+ end
118
+
119
+ # Both connection IDs should be the same (reentrant)
120
+ @connection_ids.uniq.size == 1 && @connection_ids.size == 2
121
+ #=> true
122
+
123
+ ## Memory usage with deep nesting
124
+ @deep_nesting_start = Time.now
125
+ @test_customer = @customers[60]
126
+
127
+ @result = @test_customer.transaction do
128
+ @test_customer.hset(:level_1, 'value')
129
+
130
+ @test_customer.transaction do
131
+ @test_customer.hset(:level_2, 'value')
132
+
133
+ @test_customer.transaction do
134
+ @test_customer.hset(:level_3, 'value')
135
+
136
+ @test_customer.transaction do
137
+ @test_customer.hset(:level_4, 'value')
138
+ @test_customer.orders.push('deep_order')
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ @deep_nesting_duration = ((Time.now - @deep_nesting_start) * 1000).round(2)
145
+ @deep_nesting_duration < 50 # Even deep nesting should be fast
146
+ #=> true
147
+
148
+ ## Error handling performance in transactions
149
+ @error_handling_start = Time.now
150
+ @error_count = 0
151
+
152
+ 10.times do |i|
153
+ customer = @customers[70 + i]
154
+ begin
155
+ customer.transaction do
156
+ customer.hset(:test_field, 'value')
157
+ raise 'simulated error' if i.even?
158
+ customer.hset(:success_field, 'success')
159
+ end
160
+ rescue => e
161
+ @error_count += 1
162
+ end
163
+ end
164
+
165
+ @error_handling_duration = ((Time.now - @error_handling_start) * 1000).round(2)
166
+ @error_handling_duration < 100 # Error handling shouldn't be too slow
167
+ #=> true
168
+
169
+ ## Correct number of errors caught
170
+ @error_count == 5 # Should catch 5 errors (even indices)
171
+ #=> true
172
+
173
+ ## Fiber-local storage performance impact
174
+ @fiber_storage_start = Time.now
175
+
176
+ 10.times do |i|
177
+ customer = @customers[80 + i]
178
+ customer.transaction do
179
+ # Access fiber-local storage multiple times
180
+ current_txn = Fiber[:familia_transaction]
181
+ handler_class = Fiber[:familia_connection_handler_class]
182
+
183
+ customer.hset(:fiber_test, "#{current_txn.class.name}_#{i}")
184
+ end
185
+ end
186
+
187
+ @fiber_storage_duration = ((Time.now - @fiber_storage_start) * 1000).round(2)
188
+ @fiber_storage_duration < 75 # Fiber access should be fast
189
+ #=> true
190
+
191
+ ## Transaction vs pipeline performance comparison
192
+ @transaction_start = Time.now
193
+ @customers[90, 5].each do |customer|
194
+ customer.transaction do |conn|
195
+ conn.hset(customer.dbkey, 'txn_field1', 'value1')
196
+ conn.hset(customer.dbkey, 'txn_field2', 'value2')
197
+ conn.hset(customer.dbkey, 'txn_field3', 'value3')
198
+ end
199
+ end
200
+ @transaction_perf_duration = ((Time.now - @transaction_start) * 1000).round(2)
201
+
202
+ @pipeline_start = Time.now
203
+ @customers[95, 5].each do |customer|
204
+ customer.dbclient.pipelined do |pipe|
205
+ pipe.hset(customer.dbkey, 'pipe_field1', 'value1')
206
+ pipe.hset(customer.dbkey, 'pipe_field2', 'value2')
207
+ pipe.hset(customer.dbkey, 'pipe_field3', 'value3')
208
+ end
209
+ end
210
+ @pipeline_perf_duration = ((Time.now - @pipeline_start) * 1000).round(2)
211
+
212
+ # Pipeline should be faster or comparable
213
+ @performance_difference = @transaction_perf_duration / @pipeline_perf_duration
214
+ @performance_difference < 3.0 # Transaction shouldn't be more than 3x slower
215
+ #=> true
216
+
217
+ ## Benchmark summary shows acceptable performance
218
+ @benchmark_summary = {
219
+ simple_transaction: @simple_duration,
220
+ nested_transaction: @nested_duration,
221
+ bulk_operations: @bulk_duration,
222
+ error_handling: @error_handling_duration,
223
+ fiber_storage: @fiber_storage_duration,
224
+ transaction_vs_pipeline: @performance_difference
225
+ }
226
+
227
+ # All operations should complete reasonably quickly
228
+ @benchmark_summary.values.all? { |v| v < 200 }
229
+ #=> true
230
+
231
+ ## Performance regression check - nested overhead
232
+ @nested_overhead_percent = ((@nested_duration - @simple_duration) / @simple_duration * 100).round(1)
233
+ @nested_overhead_percent < 100 # Less than 100% overhead (2x) - increased threshold for CI stability
234
+ #=> true
235
+
236
+ ## Performance benchmark completed successfully
237
+ true
238
+ #=> true
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/benchmarks/deserialization_benchmark.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  # Benchmark: Field deserialization strategies in find_by_dbkey
4
- #
5
7
  # Compares different approaches to deserializing Redis hash values
6
8
  # when loading Horreum objects from the database.
7
9
  #
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/benchmarks/deserialization_correctness_test.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  # Correctness Test: Field deserialization strategies
4
- #
5
7
  # Verifies that different deserialization approaches produce identical
6
8
  # results for all field types (strings, numbers, JSON, nested structures).
7
9
  #
@@ -1,4 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/cache_behavior_tracer.rb
3
+ #
4
+ # frozen_string_literal: true
5
+
2
6
  # Debug script to trace encryption cache behavior and key derivation
3
7
 
4
8
  require 'base64'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_aad_process.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_concealed_internal.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_concealed_reveal.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_context_aad.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_context_simple.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_cross_context.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_database_load.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_encrypted_json_check.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_encrypted_json_step_by_step.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_exists_lifecycle.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_field_decrypt.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_fresh_cross_context.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_load_path.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_method_definition.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_method_resolution.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_minimal.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  require 'familia'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_provider.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_secure_behavior.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_string_class.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_test.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true' # Mark as test environment
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/debug_test_design.rb
3
+ #
4
+ # frozen_string_literal: true
2
5
 
3
6
  $LOAD_PATH.unshift(File.expand_path('lib', __dir__))
4
7
  ENV['TEST'] = 'true'
@@ -1,4 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/encryption_method_tracer.rb
3
+ #
4
+ # frozen_string_literal: true
5
+
2
6
  # Debug script to trace encryption method calls and data flow
3
7
 
4
8
  require 'base64'
@@ -1,4 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # try/support/debugging/provider_diagnostics.rb
3
+ #
4
+ # frozen_string_literal: true
5
+
2
6
  # Debug script for testing encryption providers and diagnosing issues
3
7
 
4
8
  require 'base64'
@@ -1,3 +1,7 @@
1
+ # try/support/helpers/test_cleanup.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # Test cleanup helper for managing anonymous classes and test isolation
2
6
  #
3
7
  # This module provides utilities to create and cleanup test classes that
@@ -1,3 +1,7 @@
1
+ # try/support/helpers/test_helpers.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/helpers/test_helpers.rb
2
6
 
3
7
  # To enable tracing and debug mode, run with the env vars set.
@@ -10,6 +14,7 @@ require_relative '../../../lib/familia'
10
14
 
11
15
  Familia.enable_database_logging = true
12
16
  Familia.enable_database_counter = true
17
+ DatabaseLogger.structured_logging = true
13
18
  Familia.uri = 'redis://127.0.0.1:2525'
14
19
 
15
20
  def generate_random_email
@@ -1,3 +1,7 @@
1
+ # try/support/memory/memory_basic_test.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/edge_cases/memory_try.rb
2
6
 
3
7
  require 'tempfile'
@@ -1,3 +1,7 @@
1
+ # try/support/memory/memory_detailed_test.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/edge_cases/memory_detailed_test_try.rb
2
6
 
3
7
  require 'objspace'
@@ -1,3 +1,7 @@
1
+ # try/support/memory/memory_search_for_string.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/edge_cases/search_memory_for_string_try.rb
2
6
 
3
7
  require 'objspace'
@@ -1,3 +1,7 @@
1
+ # try/support/memory/test_actual_redactedstring_protection.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/memory/test_actual_redactedstring_protection.rb
2
6
 
3
7
  require_relative '../helpers/test_helpers'
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/atomic_saves_v1_context_proxy.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/prototypes/atomic_saves_v1_target_proxy.rb
2
6
 
3
7
  # try -vf try/prototypes/atomic_saves_v1_target_proxy.rb
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/atomic_saves_v2_connection_switching.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/prototypes/atomic_saves_v2_connection_switching.rb
2
6
 
3
7
  # try -vf try/prototypes/atomic_saves_v2_connection_switching.rb
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/atomic_saves_v3_connection_pool.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/prototypes/atomic_saves_v3_connection_pool.rb
2
6
 
3
7
  # try -vf try/prototypes/atomic_saves_v3_connection_pool.rb
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/atomic_saves_v4.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/prototypes/atomic_saves_v4.rb
2
6
 
3
7
  class BankAccount < Familia::Horreum
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/lib/atomic_saves_v2_connection_switching_helpers.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/prototypes/lib/atomic_saves_v2_connection_switching_helpers.rb
2
6
 
3
7
  ##
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/lib/atomic_saves_v3_connection_pool_helpers.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/prototypes/lib/atomic_saves_v3_connection_pool_helpers.rb
2
6
 
3
7
  ##
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/pooling/configurable_stress_test.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/pooling/configurable_stress_test.rb
2
6
  #
3
7
  # Configurable Stress Test - Systematic testing using StressTestConfig
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb
2
6
 
3
7
  ##
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/pooling/lib/connection_pool_metrics.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/pooling/lib/connection_pool_metrics.rb
2
6
  #
3
7
  # Enhanced Metrics Collection and Reporting for Connection Pool Stress Tests
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/pooling/lib/connection_pool_stress_test.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/pooling/lib/connection_pool_stress_test.rb
2
6
  #
3
7
  # Connection Pool Stress Test Framework
@@ -1,3 +1,7 @@
1
+ # try/support/prototypes/pooling/lib/connection_pool_threading_models.rb
2
+ #
3
+ # frozen_string_literal: true
4
+
1
5
  # try/pooling/lib/connection_pool_threading_models.rb
2
6
  #
3
7
  # Different Threading Models for Connection Pool Stress Testing
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- # try/prototypes/visualize_stress_results.rb
2
+ # try/support/prototypes/pooling/lib/visualize_stress_results.rb
3
3
  #
4
+ # frozen_string_literal: true
5
+
6
+ # try/prototypes/visualize_stress_results.rb
4
7
  # Simple Visualization Tool for Connection Pool Stress Test Results
5
- #
6
8
  # This script reads CSV output from stress tests and generates:
7
9
  # - ASCII charts for terminal display
8
10
  # - Markdown-formatted reports