familia 2.0.0.pre19 → 2.0.0.pre21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +177 -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/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 +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 +2 -0
- data/lib/familia/connection/operations.rb +2 -0
- data/lib/familia/connection/pipelined_core.rb +2 -0
- data/lib/familia/connection/transaction_core.rb +68 -0
- 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 +6 -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 +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 +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 +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 +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 +138 -9
- data/lib/familia/features/relationships/indexing/rebuild_strategies.rb +479 -0
- data/lib/familia/features/relationships/indexing/unique_index_generators.rb +89 -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 +2 -0
- data/lib/familia/horreum/definition.rb +16 -6
- data/lib/familia/horreum/management.rb +212 -42
- data/lib/familia/horreum/persistence.rb +176 -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 +2 -0
- 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 +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 +2 -0
- 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 +4 -0
- 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 +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 +4 -0
- data/try/integration/data_types/datatype_transactions_try.rb +4 -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 +4 -0
- 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 +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 +4 -0
- 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 +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 +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 +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 +72 -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
data/docs/guides/index.md
CHANGED
|
@@ -11,35 +11,36 @@ Welcome to the comprehensive documentation for Familia v2.0. This guide collecti
|
|
|
11
11
|
|
|
12
12
|
### 🏗️ Architecture & System Design
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
3. **[
|
|
17
|
-
|
|
18
|
-
7. **[Core Field System](core-field-system.md)** - Field definitions and data type mappings
|
|
14
|
+
1. **[Feature System](feature-system.md)** - Modular architecture with dependencies and autoloader patterns
|
|
15
|
+
2. **[Feature System for Developers](feature-system-devs.md)** - Advanced feature development patterns
|
|
16
|
+
3. **[Field System](field-system.md)** - Field definitions and data type mappings
|
|
17
|
+
4. **[Logging](logging.md)** - Logger configuration and database command logging
|
|
19
18
|
|
|
20
19
|
|
|
21
|
-
### 🔐 Special
|
|
20
|
+
### 🔐 Security & Special Fields
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
5. **[Encrypted Fields](feature-encrypted-fields.md)** - Persistent encrypted storage with modular providers
|
|
23
|
+
6. **[Transient Fields](feature-transient-fields.md)** - Non-persistent secure data handling with RedactedString
|
|
24
|
+
7. **[Encryption Guide](encryption.md)** - Legacy encryption documentation
|
|
25
|
+
8. **[Object Identifiers](feature-object-identifiers.md)** - Automatic ID generation with configurable strategies
|
|
26
|
+
9. **[External Identifiers](feature-external-identifiers.md)** - Integration with external systems and legacy data
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
### 🔗 Object Relationships
|
|
29
|
+
### 🔗 Object Relationships
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
10. **[Relationships](feature-relationships.md)** - Object relationships and membership system
|
|
32
|
+
11. **[Relationship Methods](feature-relationships-methods.md)** - Detailed method reference for relationships
|
|
33
33
|
|
|
34
34
|
### ⏱️ Time & Analytics Features
|
|
35
35
|
|
|
36
36
|
12. **[Expiration](feature-expiration.md)** - TTL management and cascading expiration
|
|
37
37
|
13. **[Quantization](feature-quantization.md)** - Time-based data bucketing for analytics
|
|
38
|
-
14. **[Time
|
|
38
|
+
14. **[Time Literals](time-literals.md)** - Time manipulation and formatting utilities
|
|
39
39
|
|
|
40
40
|
### 🛠️ Implementation & Usage
|
|
41
41
|
|
|
42
|
-
15. **[
|
|
42
|
+
15. **[Optimized Loading](optimized-loading.md)** - Reduce Redis commands by 50-96% for bulk object loading _(new!)_
|
|
43
|
+
|
|
43
44
|
|
|
44
45
|
## 🚀 Quick Start Examples
|
|
45
46
|
|
|
@@ -168,6 +169,22 @@ end
|
|
|
168
169
|
MetricsBucket.record_event("page_view") # Groups into 10-min buckets
|
|
169
170
|
```
|
|
170
171
|
|
|
172
|
+
### Optimized Loading (Performance)
|
|
173
|
+
```ruby
|
|
174
|
+
# Skip EXISTS check (50% reduction)
|
|
175
|
+
user = User.find_by_id(123, check_exists: false)
|
|
176
|
+
|
|
177
|
+
# Pipelined bulk loading (96% reduction for N objects)
|
|
178
|
+
metadata_ids = customer.metadata.rangebyscore(start_time, end_time)
|
|
179
|
+
# => ["id1", "id2", ..., "id14"] # 14 metadata objects
|
|
180
|
+
|
|
181
|
+
# Traditional: 28 Redis commands (14 EXISTS + 14 HGETALL)
|
|
182
|
+
metadata = metadata_ids.map { |id| Metadata.find_by_id(id) }
|
|
183
|
+
|
|
184
|
+
# Optimized: 1 pipelined batch with 14 HGETALL commands
|
|
185
|
+
metadata = Metadata.load_multi(metadata_ids).compact
|
|
186
|
+
```
|
|
187
|
+
|
|
171
188
|
|
|
172
189
|
## Related Resources
|
|
173
190
|
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Logging Guide
|
|
2
|
+
|
|
3
|
+
Familia provides comprehensive logging capabilities through a custom logger with TRACE level support and flexible database command logging middleware.
|
|
4
|
+
|
|
5
|
+
## Logger Configuration
|
|
6
|
+
|
|
7
|
+
### Default Logger
|
|
8
|
+
|
|
9
|
+
Familia uses a custom `FamiliaLogger` that extends Ruby's standard Logger:
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
# Default logger with TRACE support
|
|
13
|
+
logger = Familia.logger
|
|
14
|
+
logger.trace "Detailed debugging information"
|
|
15
|
+
logger.debug "Standard debug message"
|
|
16
|
+
logger.info "General information"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Custom Logger Replacement
|
|
20
|
+
|
|
21
|
+
Replace Familia's logger with any Logger-compatible object:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
# Use Rails logger
|
|
25
|
+
Familia.logger = Rails.logger
|
|
26
|
+
|
|
27
|
+
# Custom file logger with rotation
|
|
28
|
+
Familia.logger = Logger.new('familia.log', 'weekly')
|
|
29
|
+
|
|
30
|
+
# Syslog integration
|
|
31
|
+
require 'syslog/logger'
|
|
32
|
+
Familia.logger = Syslog::Logger.new('familia')
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Custom Formatters
|
|
36
|
+
|
|
37
|
+
Control log output formatting:
|
|
38
|
+
|
|
39
|
+
```ruby
|
|
40
|
+
custom_logger = Logger.new($stdout)
|
|
41
|
+
custom_logger.formatter = proc do |severity, datetime, progname, msg|
|
|
42
|
+
"[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}] #{severity}: #{msg}\n"
|
|
43
|
+
end
|
|
44
|
+
Familia.logger = custom_logger
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Log Levels
|
|
48
|
+
|
|
49
|
+
### Standard Levels
|
|
50
|
+
- **INFO**: General informational messages
|
|
51
|
+
- **WARN**: Warning messages
|
|
52
|
+
- **ERROR**: Error messages
|
|
53
|
+
- **DEBUG**: Detailed debugging (controlled by `FAMILIA_DEBUG`)
|
|
54
|
+
- **FATAL**: Fatal errors
|
|
55
|
+
|
|
56
|
+
### TRACE Level
|
|
57
|
+
- **TRACE**: Extremely detailed debugging (requires both `FAMILIA_DEBUG` and `FAMILIA_TRACE`)
|
|
58
|
+
- Uses fiber-local storage to distinguish from DEBUG level
|
|
59
|
+
- Outputs with 'T' severity letter
|
|
60
|
+
|
|
61
|
+
## Environment Variables
|
|
62
|
+
|
|
63
|
+
Control logging behavior via environment variables:
|
|
64
|
+
|
|
65
|
+
- `FAMILIA_DEBUG`: Enable debug-level logging (`1`, `true`, `yes`)
|
|
66
|
+
- `FAMILIA_TRACE`: Enable trace-level logging (`1`, `true`, `yes`)
|
|
67
|
+
|
|
68
|
+
Both must be enabled for trace logging to work.
|
|
69
|
+
|
|
70
|
+
## Configuration Block
|
|
71
|
+
|
|
72
|
+
Enable debug mode programmatically:
|
|
73
|
+
|
|
74
|
+
```ruby
|
|
75
|
+
Familia.configure do |config|
|
|
76
|
+
config.debug = true
|
|
77
|
+
end
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Structured Logging
|
|
81
|
+
|
|
82
|
+
Familia supports structured logging with key-value context:
|
|
83
|
+
|
|
84
|
+
```ruby
|
|
85
|
+
# Simple message
|
|
86
|
+
Familia.info "Connection established"
|
|
87
|
+
|
|
88
|
+
# With structured context
|
|
89
|
+
Familia.info "Pipeline executed", commands: 5, duration: 2340
|
|
90
|
+
# Output: "Pipeline executed commands=5 duration=2340"
|
|
91
|
+
|
|
92
|
+
Familia.debug "Cache lookup", key: "user:123", hit: true
|
|
93
|
+
Familia.error "Serialization failed", field: :email, error: e.message
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Database
|
|
97
|
+
Command Logging
|
|
98
|
+
|
|
99
|
+
### DatabaseLogger Middleware
|
|
100
|
+
|
|
101
|
+
Familia includes `DatabaseLogger` middleware for Redis command logging:
|
|
102
|
+
|
|
103
|
+
```ruby
|
|
104
|
+
# Enable command logging (uses redis-rb middleware internally)
|
|
105
|
+
Familia.enable_database_logging = true
|
|
106
|
+
|
|
107
|
+
# Optional: Configure logger (uses Familia.logger by default)
|
|
108
|
+
DatabaseLogger.logger = Familia.logger
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Note**: Familia automatically registers the middleware with redis-rb when enabled. You work with `Redis.new` connections - the underlying `RedisClient` middleware registration is handled internally.
|
|
112
|
+
|
|
113
|
+
### Output Formats
|
|
114
|
+
|
|
115
|
+
**Standard Format:**
|
|
116
|
+
```
|
|
117
|
+
T, 20:43:09.843 [123] 0.001234 567μs > SET key value
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Structured Format:**
|
|
121
|
+
```ruby
|
|
122
|
+
DatabaseLogger.structured_logging = true
|
|
123
|
+
# Output: "Redis command cmd=SET args=[key, value] duration_ms=0.42 db=0"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Sampling
|
|
127
|
+
|
|
128
|
+
Reduce log
|
|
129
|
+
volume in high-traffic scenarios:
|
|
130
|
+
|
|
131
|
+
```ruby
|
|
132
|
+
# Log 10% of commands
|
|
133
|
+
DatabaseLogger.sample_rate = 0.1
|
|
134
|
+
|
|
135
|
+
# Log 1% of commands (production-friendly)
|
|
136
|
+
DatabaseLogger.sample_rate = 0.01
|
|
137
|
+
|
|
138
|
+
# Disable sampling (log everything)
|
|
139
|
+
DatabaseLogger.sample_rate = nil
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Command Capture
|
|
143
|
+
|
|
144
|
+
Capture commands for testing (unaffected by sampling):
|
|
145
|
+
|
|
146
|
+
```ruby
|
|
147
|
+
commands = DatabaseLogger.capture_commands do
|
|
148
|
+
redis.set('key', 'value')
|
|
149
|
+
redis.get('key')
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
puts commands.first.command # => "SET key value"
|
|
153
|
+
puts commands.first.μs # => 567 (microseconds)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Default Logger Features
|
|
157
|
+
|
|
158
|
+
Familia's `FamiliaLogger` provides:
|
|
159
|
+
|
|
160
|
+
- **TRACE Level**: Distinct from DEBUG with 'T' severity marker
|
|
161
|
+
- **Structured Output**: `SEVERITY, HH:MM:SS.mmm MESSAGE` format
|
|
162
|
+
- **Fiber Support**: Thread/fiber-safe operation
|
|
163
|
+
- **Environment Control**: Automatic debug/trace enabling via env vars
|
|
164
|
+
- **LogFormatter**: Custom formatter with severity letters (T/D/I/W/E/F/U)
|
|
165
|
+
|
|
166
|
+
## Integration Examples
|
|
167
|
+
|
|
168
|
+
### Rails Integration
|
|
169
|
+
```ruby
|
|
170
|
+
# config/initializers/familia.rb
|
|
171
|
+
Familia.logger = Rails.logger
|
|
172
|
+
Familia.configure do |config|
|
|
173
|
+
config.debug = Rails.env.development?
|
|
174
|
+
config.enable_database_logging = Rails.env.development?
|
|
175
|
+
end
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Production Setup
|
|
179
|
+
```ruby
|
|
180
|
+
# Minimal logging with sampling
|
|
181
|
+
Familia.logger = Logger.new('familia.log')
|
|
182
|
+
Familia.logger.level = Logger::INFO
|
|
183
|
+
DatabaseLogger.sample_rate = 0.01 # 1% sampling
|
|
184
|
+
DatabaseLogger.structured_logging = true
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
This flexible logging system allows integration with existing logging infrastructure while maintaining Familia's specialized debugging capabilities.
|