familia 2.0.0.pre19 → 2.0.0.pre22
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/.talismanrc +5 -1
- data/CHANGELOG.rst +220 -112
- data/CLAUDE.md +28 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +20 -17
- data/bin/try +16 -0
- data/bin/tryouts +16 -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 +161 -117
- 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-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 +4 -3
- 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 +2 -0
- data/lib/familia/connection/handlers.rb +2 -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 -2
- data/lib/familia/connection/operations.rb +2 -0
- data/lib/familia/connection/pipelined_core.rb +3 -3
- data/lib/familia/connection/transaction_core.rb +69 -2
- data/lib/familia/connection.rb +18 -3
- data/lib/familia/data_type/class_methods.rb +3 -1
- data/lib/familia/data_type/connection.rb +2 -0
- data/lib/familia/data_type/database_commands.rb +2 -0
- data/lib/familia/data_type/serialization.rb +79 -52
- 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 +7 -5
- 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 +7 -10
- data/lib/familia/data_type/types/stringkey.rb +24 -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 +2 -0
- 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 +3 -1
- data/lib/familia/features/expiration.rb +12 -4
- data/lib/familia/features/external_identifier.rb +62 -7
- data/lib/familia/features/object_identifier.rb +49 -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 +138 -9
- data/lib/familia/features/relationships/indexing/rebuild_strategies.rb +479 -0
- data/lib/familia/features/relationships/indexing/unique_index_generators.rb +97 -21
- data/lib/familia/features/relationships/indexing.rb +3 -0
- data/lib/familia/features/relationships/indexing_relationship.rb +3 -1
- 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 +3 -1
- data/lib/familia/horreum/connection.rb +17 -1
- data/lib/familia/horreum/database_commands.rb +8 -1
- data/lib/familia/horreum/definition.rb +16 -6
- data/lib/familia/horreum/management.rb +353 -52
- data/lib/familia/horreum/persistence.rb +179 -108
- data/lib/familia/horreum/related_fields.rb +2 -0
- data/lib/familia/horreum/serialization.rb +23 -4
- data/lib/familia/horreum/settings.rb +2 -0
- data/lib/familia/horreum/utils.rb +2 -0
- data/lib/familia/horreum.rb +15 -1
- data/lib/familia/identifier_extractor.rb +3 -1
- data/lib/familia/instrumentation.rb +156 -0
- data/lib/familia/json_serializer.rb +2 -0
- data/lib/familia/logging.rb +92 -32
- 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 +2 -0
- 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 +295 -170
- data/lib/multi_result.rb +61 -31
- 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 +2 -0
- data/try/edge_cases/ttl_side_effects_try.rb +4 -0
- data/try/features/count_any_edge_cases_try.rb +486 -0
- data/try/features/count_any_methods_try.rb +197 -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 +4 -0
- data/try/features/external_identifier/external_identifier_try.rb +305 -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 +140 -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 +606 -0
- data/try/features/relationships/indexing_try.rb +2 -0
- 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 +2 -0
- 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 +4 -0
- 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 +4 -0
- data/try/integration/connection/pipeline_fallback_integration_try.rb +3 -0
- 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 +4 -0
- data/try/integration/cross_component_try.rb +4 -0
- data/try/integration/data_types/datatype_pipelines_try.rb +9 -3
- data/try/integration/data_types/datatype_transactions_try.rb +17 -7
- 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 +4 -0
- data/try/integration/models/customer_try.rb +7 -3
- data/try/integration/models/datatype_base_try.rb +4 -0
- data/try/integration/models/familia_object_try.rb +4 -0
- data/try/integration/persistence_operations_try.rb +4 -0
- 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 +39 -22
- 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 +6 -2
- 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/serialization_try.rb +386 -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 +4 -0
- 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 +5 -1
- data/try/unit/horreum/automatic_index_validation_try.rb +2 -0
- data/try/unit/horreum/base_try.rb +4 -0
- data/try/unit/horreum/class_methods_try.rb +4 -0
- 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 +6 -1
- 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 +4 -0
- 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 +4 -0
- data/try/unit/horreum/serialization_persistent_fields_try.rb +4 -0
- data/try/unit/horreum/serialization_try.rb +4 -0
- data/try/unit/horreum/settings_try.rb +4 -0
- data/try/unit/horreum/unique_index_edge_cases_try.rb +4 -0
- data/try/unit/horreum/unique_index_guard_validation_try.rb +2 -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 +69 -17
- data/.github/workflows/code-quality.yml +0 -138
- data/changelog.d/20251011_012003_delano_159_datatype_transaction_pipeline_support.rst +0 -91
- data/changelog.d/20251011_203905_delano_next.rst +0 -30
- data/changelog.d/20251011_212633_delano_next.rst +0 -13
- data/changelog.d/20251011_221253_delano_next.rst +0 -26
- 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
|
|
@@ -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,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/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
|
|
@@ -77,10 +81,12 @@ result = @user.scores.pipelined { |pipe| }
|
|
|
77
81
|
#=> [true, true]
|
|
78
82
|
|
|
79
83
|
## Multiple DataType operations in single pipeline
|
|
84
|
+
# Note: Raw Redis commands bypass Familia's JSON serialization.
|
|
85
|
+
# Use serialize_value for values that will be looked up via Familia methods.
|
|
80
86
|
result = @user.scores.pipelined do |pipe|
|
|
81
|
-
pipe.zadd(@user.scores.dbkey, 500, 'multi')
|
|
82
|
-
pipe.hset(@user.profile.dbkey, 'multi', 'pipeline')
|
|
83
|
-
pipe.sadd(@user.tags.dbkey, 'multi_tag')
|
|
87
|
+
pipe.zadd(@user.scores.dbkey, 500, @user.scores.serialize_value('multi'))
|
|
88
|
+
pipe.hset(@user.profile.dbkey, 'multi', @user.profile.serialize_value('pipeline'))
|
|
89
|
+
pipe.sadd(@user.tags.dbkey, @user.tags.serialize_value('multi_tag'))
|
|
84
90
|
end
|
|
85
91
|
[
|
|
86
92
|
result.is_a?(MultiResult),
|
|
@@ -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
|
|
@@ -148,6 +152,8 @@ conn_class
|
|
|
148
152
|
#=> "Redis::MultiConnection"
|
|
149
153
|
|
|
150
154
|
## Transaction with direct_access works correctly
|
|
155
|
+
# Note: direct_access bypasses serialize_value, so raw 'true' string
|
|
156
|
+
# gets parsed as JSON boolean true on retrieval (Issue #190 behavior)
|
|
151
157
|
result = @user.profile.transaction do |trans_conn|
|
|
152
158
|
trans_conn.hset(@user.profile.dbkey, 'status', 'active')
|
|
153
159
|
|
|
@@ -158,7 +164,7 @@ result = @user.profile.transaction do |trans_conn|
|
|
|
158
164
|
end
|
|
159
165
|
end
|
|
160
166
|
[@user.profile['status'], @user.profile['verified']]
|
|
161
|
-
#=> ["active",
|
|
167
|
+
#=> ["active", true]
|
|
162
168
|
|
|
163
169
|
## Transaction atomicity - all commands succeed or none
|
|
164
170
|
test_zset = Familia::SortedSet.new('atomic:test')
|
|
@@ -178,11 +184,13 @@ end
|
|
|
178
184
|
#=> ["initial"]
|
|
179
185
|
|
|
180
186
|
## Nested transactions with parent-owned DataTypes work
|
|
187
|
+
# Note: Raw Redis commands bypass Familia's JSON serialization.
|
|
188
|
+
# Use serialize_value or check raw members for consistency.
|
|
181
189
|
outer_result = @user.scores.transaction do |outer_conn|
|
|
182
|
-
outer_conn.zadd(@user.scores.dbkey, 999, 'outer_member')
|
|
190
|
+
outer_conn.zadd(@user.scores.dbkey, 999, @user.scores.serialize_value('outer_member'))
|
|
183
191
|
|
|
184
192
|
inner_result = @user.tags.transaction do |inner_conn|
|
|
185
|
-
inner_conn.sadd(@user.tags.dbkey, 'nested_tag')
|
|
193
|
+
inner_conn.sadd(@user.tags.dbkey, @user.tags.serialize_value('nested_tag'))
|
|
186
194
|
end
|
|
187
195
|
|
|
188
196
|
inner_result.is_a?(MultiResult)
|
|
@@ -227,12 +235,14 @@ TransactionTestUser.logical_database
|
|
|
227
235
|
#=> 2
|
|
228
236
|
|
|
229
237
|
## Multiple DataType types in single transaction
|
|
238
|
+
# Note: Raw Redis commands bypass Familia's JSON serialization.
|
|
239
|
+
# Use serialize_value for values that will be looked up via Familia methods.
|
|
230
240
|
result = @user.scores.transaction do |conn|
|
|
231
241
|
# Can operate on different DataTypes using same connection
|
|
232
|
-
conn.zadd(@user.scores.dbkey, 777, 'multi_test')
|
|
233
|
-
conn.hset(@user.profile.dbkey, 'multi', 'yes')
|
|
234
|
-
conn.sadd(@user.tags.dbkey, 'multi_tag')
|
|
235
|
-
conn.rpush(@user.activity.dbkey, 'multi_action')
|
|
242
|
+
conn.zadd(@user.scores.dbkey, 777, @user.scores.serialize_value('multi_test'))
|
|
243
|
+
conn.hset(@user.profile.dbkey, 'multi', @user.profile.serialize_value('yes'))
|
|
244
|
+
conn.sadd(@user.tags.dbkey, @user.tags.serialize_value('multi_tag'))
|
|
245
|
+
conn.rpush(@user.activity.dbkey, @user.activity.serialize_value('multi_action'))
|
|
236
246
|
end
|
|
237
247
|
[
|
|
238
248
|
result.is_a?(MultiResult),
|
|
@@ -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
|
|
@@ -69,7 +73,8 @@ Customer.find_by_id(ident).planid
|
|
|
69
73
|
#=> true
|
|
70
74
|
|
|
71
75
|
## Customer can be added to class-level sorted set
|
|
72
|
-
|
|
76
|
+
# Note: Add the object directly so identifier extraction is consistent
|
|
77
|
+
Customer.instances.add(@customer)
|
|
73
78
|
Customer.instances.member?(@customer)
|
|
74
79
|
#=> true
|
|
75
80
|
|
|
@@ -93,11 +98,10 @@ multi_result = @customer.destroy!
|
|
|
93
98
|
cust = Customer.find_by_id('test@example.com')
|
|
94
99
|
exists = Customer.exists?('test@example.com')
|
|
95
100
|
[multi_result.results, cust.nil?, exists]
|
|
96
|
-
#=> [[1, 0, 1, 1, 1, 1, 1], true, false]
|
|
101
|
+
#=> [[1, 0, 1, 1, 1, 1, 1, true], true, false]
|
|
97
102
|
|
|
98
103
|
## Customer.destroy! can be called on an already destroyed object
|
|
99
104
|
@customer.destroy!
|
|
100
|
-
#=:> MultiResult
|
|
101
105
|
#==> result.successful?
|
|
102
106
|
#=*> result.results
|
|
103
107
|
|