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.
- checksums.yaml +4 -4
- data/.github/workflows/claude-code-review.yml +4 -9
- data/.github/workflows/code-smells.yml +64 -3
- data/.pre-commit-config.yaml +8 -6
- data/.reek.yml +10 -9
- data/.rubocop.yml +4 -0
- data/CHANGELOG.rst +205 -88
- data/CLAUDE.md +62 -10
- data/Gemfile +3 -3
- data/Gemfile.lock +27 -62
- data/README.md +39 -0
- data/bin/try +16 -0
- data/bin/tryouts +16 -0
- data/changelog.d/20251105_flexible_external_identifier_format.rst +66 -0
- data/changelog.d/20251107_112554_delano_179_participation_asymmetry.rst +44 -0
- data/changelog.d/20251107_213121_delano_fix_thread_safety_races_011CUumCP492Twxm4NLt2FvL.rst +20 -0
- data/changelog.d/20251107_fix_participates_in_symbol_resolution.rst +91 -0
- data/changelog.d/20251107_optimized_redis_exists_checks.rst +94 -0
- data/changelog.d/20251108_frozen_string_literal_pragma.rst +44 -0
- data/docs/1106-participates_in-bidirectional-solution.md +129 -0
- data/docs/guides/encryption.md +486 -0
- data/docs/guides/feature-encrypted-fields.md +123 -7
- data/docs/guides/feature-expiration.md +177 -133
- data/docs/guides/feature-external-identifiers.md +415 -443
- data/docs/guides/feature-object-identifiers.md +400 -269
- data/docs/guides/feature-quantization.md +120 -6
- data/docs/guides/feature-relationships-indexing.md +318 -0
- data/docs/guides/feature-relationships-methods.md +146 -604
- data/docs/guides/feature-relationships-participation.md +263 -0
- data/docs/guides/feature-relationships.md +118 -136
- data/docs/guides/feature-system-devs.md +176 -693
- data/docs/guides/feature-system.md +119 -6
- data/docs/guides/feature-transient-fields.md +81 -0
- data/docs/guides/field-system.md +778 -0
- data/docs/guides/index.md +32 -15
- data/docs/guides/logging.md +187 -0
- data/docs/guides/optimized-loading.md +674 -0
- data/docs/guides/thread-safety-monitoring.md +61 -0
- data/docs/guides/{time-utilities.md → time-literals.md} +12 -12
- data/docs/migrating/v2.0.0-pre19.md +197 -0
- data/docs/migrating/v2.0.0-pre22.md +241 -0
- data/docs/overview.md +7 -9
- data/docs/reference/api-technical.md +267 -320
- data/examples/autoloader/mega_customer/features/deprecated_fields.rb +2 -0
- data/examples/autoloader/mega_customer/safe_dump_fields.rb +2 -0
- data/examples/autoloader/mega_customer.rb +2 -0
- data/examples/datatype_standalone.rb +282 -0
- data/examples/encrypted_fields.rb +2 -1
- data/examples/json_usage_patterns.rb +2 -0
- data/examples/relationships.rb +3 -0
- data/examples/safe_dump.rb +2 -1
- data/examples/sampling_demo.rb +53 -0
- data/examples/single_connection_transaction_confusions.rb +2 -1
- data/familia.gemspec +2 -1
- data/lib/familia/base.rb +2 -0
- data/lib/familia/connection/behavior.rb +254 -0
- data/lib/familia/connection/handlers.rb +97 -0
- data/lib/familia/connection/individual_command_proxy.rb +2 -0
- data/lib/familia/connection/middleware.rb +34 -24
- data/lib/familia/connection/operation_core.rb +3 -1
- data/lib/familia/connection/operations.rb +2 -0
- data/lib/familia/connection/{pipeline_core.rb → pipelined_core.rb} +4 -2
- data/lib/familia/connection/transaction_core.rb +75 -9
- data/lib/familia/connection.rb +21 -5
- data/lib/familia/data_type/class_methods.rb +3 -1
- data/lib/familia/data_type/connection.rb +153 -7
- data/lib/familia/data_type/database_commands.rb +9 -4
- data/lib/familia/data_type/serialization.rb +10 -4
- data/lib/familia/data_type/settings.rb +2 -0
- data/lib/familia/data_type/types/counter.rb +2 -0
- data/lib/familia/data_type/types/hashkey.rb +8 -6
- data/lib/familia/data_type/types/listkey.rb +2 -0
- data/lib/familia/data_type/types/lock.rb +2 -0
- data/lib/familia/data_type/types/sorted_set.rb +2 -0
- data/lib/familia/data_type/types/stringkey.rb +2 -0
- data/lib/familia/data_type/types/unsorted_set.rb +2 -0
- data/lib/familia/data_type.rb +2 -0
- data/lib/familia/encryption/encrypted_data.rb +4 -2
- data/lib/familia/encryption/manager.rb +2 -0
- data/lib/familia/encryption/provider.rb +2 -0
- data/lib/familia/encryption/providers/aes_gcm_provider.rb +2 -0
- data/lib/familia/encryption/providers/secure_xchacha20_poly1305_provider.rb +2 -0
- data/lib/familia/encryption/providers/xchacha20_poly1305_provider.rb +2 -0
- data/lib/familia/encryption/registry.rb +2 -0
- data/lib/familia/encryption/request_cache.rb +2 -0
- data/lib/familia/encryption.rb +9 -2
- data/lib/familia/errors.rb +53 -14
- data/lib/familia/features/autoloader.rb +2 -0
- data/lib/familia/features/encrypted_fields/concealed_string.rb +2 -0
- data/lib/familia/features/encrypted_fields/encrypted_field_type.rb +4 -0
- data/lib/familia/features/encrypted_fields.rb +2 -2
- data/lib/familia/features/expiration/extensions.rb +11 -11
- data/lib/familia/features/expiration.rb +29 -21
- data/lib/familia/features/external_identifier.rb +33 -7
- data/lib/familia/features/object_identifier.rb +2 -0
- data/lib/familia/features/quantization.rb +3 -1
- data/lib/familia/features/relationships/README.md +3 -1
- data/lib/familia/features/relationships/collection_operations.rb +2 -0
- data/lib/familia/features/relationships/indexing/multi_index_generators.rb +177 -47
- data/lib/familia/features/relationships/indexing/rebuild_strategies.rb +479 -0
- data/lib/familia/features/relationships/indexing/unique_index_generators.rb +203 -63
- data/lib/familia/features/relationships/indexing.rb +40 -42
- data/lib/familia/features/relationships/indexing_relationship.rb +17 -5
- data/lib/familia/features/relationships/participation/participant_methods.rb +131 -14
- data/lib/familia/features/relationships/participation/rebuild_strategies.md +41 -0
- data/lib/familia/features/relationships/participation/target_methods.rb +6 -6
- data/lib/familia/features/relationships/participation.rb +155 -69
- data/lib/familia/features/relationships/participation_membership.rb +69 -0
- data/lib/familia/features/relationships/participation_relationship.rb +34 -6
- data/lib/familia/features/relationships/score_encoding.rb +2 -0
- data/lib/familia/features/relationships.rb +5 -3
- data/lib/familia/features/safe_dump.rb +2 -0
- data/lib/familia/features/transient_fields/redacted_string.rb +2 -0
- data/lib/familia/features/transient_fields/single_use_redacted_string.rb +2 -0
- data/lib/familia/features/transient_fields/transient_field_type.rb +5 -3
- data/lib/familia/features/transient_fields.rb +2 -0
- data/lib/familia/features.rb +2 -0
- data/lib/familia/field_type.rb +5 -2
- data/lib/familia/horreum/connection.rb +28 -36
- data/lib/familia/horreum/database_commands.rb +131 -10
- data/lib/familia/horreum/definition.rb +18 -7
- data/lib/familia/horreum/management.rb +233 -57
- data/lib/familia/horreum/persistence.rb +314 -122
- data/lib/familia/horreum/related_fields.rb +2 -0
- data/lib/familia/horreum/serialization.rb +26 -4
- data/lib/familia/horreum/settings.rb +2 -0
- data/lib/familia/horreum/utils.rb +2 -8
- data/lib/familia/horreum.rb +46 -13
- data/lib/familia/identifier_extractor.rb +2 -0
- data/lib/familia/instrumentation.rb +156 -0
- data/lib/familia/json_serializer.rb +2 -0
- data/lib/familia/logging.rb +94 -37
- data/lib/familia/refinements/dear_json.rb +2 -0
- data/lib/familia/refinements/stylize_words.rb +2 -14
- data/lib/familia/refinements/time_literals.rb +2 -0
- data/lib/familia/refinements.rb +2 -0
- data/lib/familia/secure_identifier.rb +10 -2
- data/lib/familia/settings.rb +9 -7
- data/lib/familia/thread_safety/instrumented_mutex.rb +166 -0
- data/lib/familia/thread_safety/monitor.rb +328 -0
- data/lib/familia/utils.rb +13 -0
- data/lib/familia/verifiable_identifier.rb +3 -1
- data/lib/familia/version.rb +3 -1
- data/lib/familia.rb +31 -4
- data/lib/middleware/database_command_counter.rb +152 -0
- data/lib/middleware/database_logger.rb +325 -129
- data/lib/multi_result.rb +2 -0
- data/try/edge_cases/empty_identifiers_try.rb +2 -0
- data/try/edge_cases/hash_symbolization_try.rb +2 -0
- data/try/edge_cases/json_serialization_try.rb +2 -0
- data/try/edge_cases/legacy_data_detection/deserialization_edge_cases_try.rb +4 -0
- data/try/edge_cases/race_conditions_try.rb +4 -0
- data/try/edge_cases/reserved_keywords_try.rb +4 -0
- data/try/edge_cases/string_coercion_try.rb +6 -4
- data/try/edge_cases/ttl_side_effects_try.rb +4 -0
- data/try/features/encrypted_fields/aad_protection_try.rb +4 -0
- data/try/features/encrypted_fields/concealed_string_core_try.rb +4 -0
- data/try/features/encrypted_fields/context_isolation_try.rb +4 -0
- data/try/features/encrypted_fields/encrypted_fields_core_try.rb +33 -0
- data/try/features/encrypted_fields/encrypted_fields_integration_try.rb +4 -0
- data/try/features/encrypted_fields/encrypted_fields_no_cache_security_try.rb +4 -0
- data/try/features/encrypted_fields/encrypted_fields_security_try.rb +4 -0
- data/try/features/encrypted_fields/error_conditions_try.rb +4 -0
- data/try/features/encrypted_fields/fresh_key_derivation_try.rb +4 -0
- data/try/features/encrypted_fields/fresh_key_try.rb +4 -0
- data/try/features/encrypted_fields/key_rotation_try.rb +4 -0
- data/try/features/encrypted_fields/memory_security_try.rb +4 -0
- data/try/features/encrypted_fields/missing_current_key_version_try.rb +4 -0
- data/try/features/encrypted_fields/nonce_uniqueness_try.rb +4 -0
- data/try/features/encrypted_fields/secure_by_default_behavior_try.rb +4 -0
- data/try/features/encrypted_fields/thread_safety_try.rb +4 -0
- data/try/features/encrypted_fields/universal_serialization_safety_try.rb +4 -0
- data/try/features/encryption/config_persistence_try.rb +4 -0
- data/try/features/encryption/core_try.rb +4 -0
- data/try/features/encryption/instance_variable_scope_try.rb +4 -0
- data/try/features/encryption/module_loading_try.rb +4 -0
- data/try/features/encryption/providers/aes_gcm_provider_try.rb +4 -0
- data/try/features/encryption/providers/xchacha20_poly1305_provider_try.rb +4 -0
- data/try/features/encryption/roundtrip_validation_try.rb +4 -0
- data/try/features/encryption/secure_memory_handling_try.rb +4 -0
- data/try/features/expiration/expiration_try.rb +5 -1
- data/try/features/external_identifier/external_identifier_try.rb +171 -8
- data/try/features/feature_dependencies_try.rb +2 -0
- data/try/features/feature_improvements_try.rb +2 -0
- data/try/features/field_groups_try.rb +2 -0
- data/try/features/object_identifier/object_identifier_integration_try.rb +12 -9
- data/try/features/object_identifier/object_identifier_try.rb +2 -0
- data/try/features/quantization/quantization_try.rb +4 -0
- data/try/features/real_feature_integration_try.rb +2 -0
- data/try/features/relationships/indexing_commands_verification_try.rb +2 -0
- data/try/features/relationships/indexing_rebuild_try.rb +600 -0
- data/try/features/relationships/indexing_try.rb +30 -4
- data/try/features/relationships/participation_bidirectional_try.rb +242 -0
- data/try/features/relationships/participation_commands_verification_spec.rb +4 -0
- data/try/features/relationships/participation_commands_verification_try.rb +2 -0
- data/try/features/relationships/participation_performance_improvements_try.rb +11 -9
- data/try/features/relationships/participation_reverse_index_try.rb +15 -13
- data/try/features/relationships/participation_target_class_resolution_try.rb +209 -0
- data/try/features/relationships/participation_unresolved_target_try.rb +109 -0
- data/try/features/relationships/relationships_api_changes_try.rb +6 -4
- data/try/features/relationships/relationships_edge_cases_try.rb +4 -0
- data/try/features/relationships/relationships_performance_minimal_try.rb +4 -0
- data/try/features/relationships/relationships_performance_simple_try.rb +4 -0
- data/try/features/relationships/relationships_performance_try.rb +4 -0
- data/try/features/relationships/relationships_performance_working_try.rb +4 -0
- data/try/features/relationships/relationships_try.rb +6 -4
- data/try/features/safe_dump/safe_dump_advanced_try.rb +4 -0
- data/try/features/safe_dump/safe_dump_try.rb +4 -0
- data/try/features/transient_fields/redacted_string_try.rb +2 -0
- data/try/features/transient_fields/refresh_reset_try.rb +3 -0
- data/try/features/transient_fields/simple_refresh_test.rb +3 -0
- data/try/features/transient_fields/single_use_redacted_string_try.rb +2 -0
- data/try/features/transient_fields/transient_fields_core_try.rb +4 -0
- data/try/features/transient_fields/transient_fields_integration_try.rb +4 -0
- data/try/integration/connection/fiber_context_preservation_try.rb +7 -3
- data/try/integration/connection/handler_constraints_try.rb +4 -0
- data/try/integration/connection/isolated_dbclient_try.rb +4 -0
- data/try/integration/connection/middleware_reconnect_try.rb +2 -0
- data/try/integration/connection/operation_mode_guards_try.rb +5 -1
- data/try/integration/connection/pipeline_fallback_integration_try.rb +15 -12
- data/try/integration/connection/pools_try.rb +4 -0
- data/try/integration/connection/responsibility_chain_tracking_try.rb +4 -0
- data/try/integration/connection/transaction_fallback_integration_try.rb +4 -0
- data/try/integration/connection/transaction_mode_permissive_try.rb +4 -0
- data/try/integration/connection/transaction_mode_strict_try.rb +4 -0
- data/try/integration/connection/transaction_mode_warn_try.rb +4 -0
- data/try/integration/connection/transaction_modes_try.rb +4 -0
- data/try/integration/conventional_inheritance_try.rb +4 -0
- data/try/integration/create_method_try.rb +26 -22
- data/try/integration/cross_component_try.rb +4 -0
- data/try/integration/data_types/datatype_pipelines_try.rb +108 -0
- data/try/integration/data_types/datatype_transactions_try.rb +251 -0
- data/try/integration/database_consistency_try.rb +4 -0
- data/try/integration/familia_extended_try.rb +4 -0
- data/try/integration/familia_members_methods_try.rb +4 -0
- data/try/integration/models/customer_safe_dump_try.rb +9 -1
- data/try/integration/models/customer_try.rb +4 -0
- data/try/integration/models/datatype_base_try.rb +4 -0
- data/try/integration/models/familia_object_try.rb +5 -1
- data/try/integration/persistence_operations_try.rb +166 -10
- data/try/integration/relationships_persistence_round_trip_try.rb +17 -14
- data/try/integration/save_methods_consistency_try.rb +241 -0
- data/try/integration/scenarios_try.rb +4 -0
- data/try/integration/secure_identifier_try.rb +4 -0
- data/try/integration/transaction_safety_core_try.rb +176 -0
- data/try/integration/transaction_safety_workflow_try.rb +291 -0
- data/try/integration/verifiable_identifier_try.rb +4 -0
- data/try/investigation/pipeline_routing/README.md +228 -0
- data/try/performance/benchmarks_try.rb +4 -0
- data/try/performance/transaction_safety_benchmark_try.rb +238 -0
- data/try/support/benchmarks/deserialization_benchmark.rb +3 -1
- data/try/support/benchmarks/deserialization_correctness_test.rb +3 -1
- data/try/support/debugging/cache_behavior_tracer.rb +4 -0
- data/try/support/debugging/debug_aad_process.rb +3 -0
- data/try/support/debugging/debug_concealed_internal.rb +3 -0
- data/try/support/debugging/debug_concealed_reveal.rb +3 -0
- data/try/support/debugging/debug_context_aad.rb +3 -0
- data/try/support/debugging/debug_context_simple.rb +3 -0
- data/try/support/debugging/debug_cross_context.rb +3 -0
- data/try/support/debugging/debug_database_load.rb +3 -0
- data/try/support/debugging/debug_encrypted_json_check.rb +3 -0
- data/try/support/debugging/debug_encrypted_json_step_by_step.rb +3 -0
- data/try/support/debugging/debug_exists_lifecycle.rb +3 -0
- data/try/support/debugging/debug_field_decrypt.rb +3 -0
- data/try/support/debugging/debug_fresh_cross_context.rb +3 -0
- data/try/support/debugging/debug_load_path.rb +3 -0
- data/try/support/debugging/debug_method_definition.rb +3 -0
- data/try/support/debugging/debug_method_resolution.rb +3 -0
- data/try/support/debugging/debug_minimal.rb +3 -0
- data/try/support/debugging/debug_provider.rb +3 -0
- data/try/support/debugging/debug_secure_behavior.rb +3 -0
- data/try/support/debugging/debug_string_class.rb +3 -0
- data/try/support/debugging/debug_test.rb +3 -0
- data/try/support/debugging/debug_test_design.rb +3 -0
- data/try/support/debugging/encryption_method_tracer.rb +4 -0
- data/try/support/debugging/provider_diagnostics.rb +4 -0
- data/try/support/helpers/test_cleanup.rb +4 -0
- data/try/support/helpers/test_helpers.rb +5 -0
- data/try/support/memory/memory_basic_test.rb +4 -0
- data/try/support/memory/memory_detailed_test.rb +4 -0
- data/try/support/memory/memory_search_for_string.rb +4 -0
- data/try/support/memory/test_actual_redactedstring_protection.rb +4 -0
- data/try/support/prototypes/atomic_saves_v1_context_proxy.rb +4 -0
- data/try/support/prototypes/atomic_saves_v2_connection_switching.rb +4 -0
- data/try/support/prototypes/atomic_saves_v3_connection_pool.rb +4 -0
- data/try/support/prototypes/atomic_saves_v4.rb +4 -0
- data/try/support/prototypes/lib/atomic_saves_v2_connection_switching_helpers.rb +4 -0
- data/try/support/prototypes/lib/atomic_saves_v3_connection_pool_helpers.rb +4 -0
- data/try/support/prototypes/pooling/configurable_stress_test.rb +4 -0
- data/try/support/prototypes/pooling/lib/atomic_saves_v3_connection_pool_helpers.rb +4 -0
- data/try/support/prototypes/pooling/lib/connection_pool_metrics.rb +4 -0
- data/try/support/prototypes/pooling/lib/connection_pool_stress_test.rb +4 -0
- data/try/support/prototypes/pooling/lib/connection_pool_threading_models.rb +4 -0
- data/try/support/prototypes/pooling/lib/visualize_stress_results.rb +4 -2
- data/try/support/prototypes/pooling/pool_siege.rb +4 -2
- data/try/support/prototypes/pooling/run_stress_tests.rb +4 -2
- data/try/thread_safety/README.md +496 -0
- data/try/thread_safety/class_connection_chain_race_try.rb +265 -0
- data/try/thread_safety/connection_chain_race_try.rb +148 -0
- data/try/thread_safety/encryption_manager_cache_race_try.rb +166 -0
- data/try/thread_safety/feature_registry_race_try.rb +226 -0
- data/try/thread_safety/fiber_pipeline_isolation_try.rb +235 -0
- data/try/thread_safety/fiber_transaction_isolation_try.rb +208 -0
- data/try/thread_safety/field_registration_race_try.rb +222 -0
- data/try/thread_safety/logger_initialization_race_try.rb +170 -0
- data/try/thread_safety/middleware_registration_race_try.rb +154 -0
- data/try/thread_safety/module_config_race_try.rb +175 -0
- data/try/thread_safety/secure_identifier_cache_race_try.rb +226 -0
- data/try/unit/core/autoloader_try.rb +4 -0
- data/try/unit/core/base_enhancements_try.rb +4 -0
- data/try/unit/core/connection_try.rb +4 -0
- data/try/unit/core/errors_try.rb +4 -0
- data/try/unit/core/extensions_try.rb +4 -0
- data/try/unit/core/familia_logger_try.rb +2 -0
- data/try/unit/core/familia_try.rb +4 -0
- data/try/unit/core/middleware_sampling_try.rb +335 -0
- data/try/unit/core/middleware_test_helpers_bug_try.rb +58 -0
- data/try/unit/core/middleware_thread_safety_try.rb +245 -0
- data/try/unit/core/middleware_try.rb +4 -0
- data/try/unit/core/settings_try.rb +4 -0
- data/try/unit/core/time_utils_try.rb +4 -0
- data/try/unit/core/tools_try.rb +4 -0
- data/try/unit/core/utils_try.rb +37 -0
- data/try/unit/data_types/boolean_try.rb +5 -1
- data/try/unit/data_types/counter_try.rb +4 -0
- data/try/unit/data_types/datatype_base_try.rb +4 -0
- data/try/unit/data_types/hash_try.rb +4 -0
- data/try/unit/data_types/list_try.rb +4 -0
- data/try/unit/data_types/lock_try.rb +4 -0
- data/try/unit/data_types/sorted_set_try.rb +4 -0
- data/try/unit/data_types/sorted_set_zadd_options_try.rb +4 -0
- data/try/unit/data_types/string_try.rb +5 -1
- data/try/unit/data_types/unsortedset_try.rb +4 -0
- data/try/unit/familia_resolve_class_try.rb +116 -0
- data/try/unit/horreum/auto_indexing_on_save_try.rb +36 -16
- data/try/unit/horreum/automatic_index_validation_try.rb +255 -0
- data/try/unit/horreum/base_try.rb +5 -1
- data/try/unit/horreum/class_methods_try.rb +6 -2
- data/try/unit/horreum/commands_try.rb +4 -0
- data/try/unit/horreum/defensive_initialization_try.rb +4 -0
- data/try/unit/horreum/destroy_related_fields_cleanup_try.rb +4 -0
- data/try/unit/horreum/enhanced_conflict_handling_try.rb +4 -0
- data/try/unit/horreum/field_categories_try.rb +4 -0
- data/try/unit/horreum/field_definition_try.rb +4 -0
- data/try/unit/horreum/initialization_try.rb +5 -1
- data/try/unit/horreum/json_type_preservation_try.rb +2 -0
- data/try/unit/horreum/optimized_loading_try.rb +156 -0
- data/try/unit/horreum/relations_try.rb +8 -4
- data/try/unit/horreum/serialization_persistent_fields_try.rb +4 -0
- data/try/unit/horreum/serialization_try.rb +6 -2
- data/try/unit/horreum/settings_try.rb +4 -0
- data/try/unit/horreum/unique_index_edge_cases_try.rb +380 -0
- data/try/unit/horreum/unique_index_guard_validation_try.rb +283 -0
- data/try/unit/middleware/database_command_counter_methods_try.rb +139 -0
- data/try/unit/middleware/database_logger_methods_try.rb +251 -0
- data/try/unit/refinements/dear_json_array_methods_try.rb +4 -0
- data/try/unit/refinements/dear_json_hash_methods_try.rb +4 -0
- data/try/unit/refinements/time_literals_numeric_methods_try.rb +4 -0
- data/try/unit/refinements/time_literals_string_methods_try.rb +4 -0
- data/try/unit/thread_safety_monitor_try.rb +149 -0
- metadata +81 -14
- data/.github/workflows/code-quality.yml +0 -138
- data/docs/archive/FAMILIA_RELATIONSHIPS.md +0 -210
- data/docs/archive/FAMILIA_TECHNICAL.md +0 -823
- data/docs/archive/FAMILIA_UPDATE.md +0 -226
- data/docs/archive/README.md +0 -64
- data/docs/archive/api-reference.md +0 -333
- data/docs/guides/core-field-system.md +0 -806
- data/docs/guides/implementation.md +0 -276
- 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.
|
|
269
|
+
indexing_meta.scope_class
|
|
268
270
|
#=> ApiTestUser
|
|
269
271
|
|
|
270
|
-
## unique_index stores correct
|
|
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.
|
|
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.
|
|
279
|
+
membership_meta.scope_class
|
|
278
280
|
#=> ApiTestUser
|
|
279
281
|
|
|
280
282
|
# =============================================
|
|
@@ -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?(:
|
|
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?(:
|
|
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/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.
|
|
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.
|
|
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.
|
|
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/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.
|
|
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
|
|
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
|
-
$
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
119
|
-
Familia.instance_variable_set(:@
|
|
120
|
-
Familia.
|
|
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.
|
|
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)
|