winterforge 0.1.0__tar.gz → 0.2.0__tar.gz
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.
- winterforge-0.2.0/PKG-INFO +222 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/pyproject.toml +18 -9
- {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_acceptance.py +5 -5
- {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_canonical_resolution.py +0 -0
- winterforge-0.2.0/tests/test_channel_debug.py +44 -0
- winterforge-0.2.0/tests/test_clone_debug.py +37 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_e2e_integration.py +2 -9
- {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_initialization.py +1 -1
- winterforge-0.2.0/tests/test_is_dirty_debug.py +41 -0
- winterforge-0.2.0/tests/test_kernel.py +118 -0
- winterforge-0.2.0/tests/test_mro_exploration.py +87 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_user_system_integration.py +32 -11
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/__init__.py +61 -23
- winterforge-0.2.0/winterforge/frags/__init__.py +21 -0
- winterforge-0.2.0/winterforge/frags/base.py +1550 -0
- winterforge-0.2.0/winterforge/frags/composition.py +208 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/injectable.py +19 -17
- winterforge-0.2.0/winterforge/frags/manifest.py +470 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/mixins/__init__.py +0 -0
- winterforge-0.2.0/winterforge/frags/mixins/trait_mixin.py +197 -0
- winterforge-0.2.0/winterforge/frags/primitives/__init__.py +14 -0
- winterforge-0.2.0/winterforge/frags/primitives/render.py +84 -0
- winterforge-0.2.0/winterforge/frags/primitives/rune.py +223 -0
- winterforge-0.2.0/winterforge/frags/registries/__init__.py +6 -0
- winterforge-0.2.0/winterforge/frags/registries/_namespaced_mixin.py +110 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/application_registry.py +33 -6
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/config_registry.py +136 -37
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/field_registry.py +18 -18
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/frag_registry.py +218 -125
- winterforge-0.2.0/winterforge/frags/registries/permission_registry.py +188 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/profile_registry.py +7 -8
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/role_registry.py +90 -66
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/session_registry.py +22 -15
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/user_registry.py +201 -39
- winterforge-0.2.0/winterforge/handlers/__init__.py +29 -0
- winterforge-0.2.0/winterforge/handlers/dedupe.py +41 -0
- winterforge-0.2.0/winterforge/handlers/filter.py +34 -0
- winterforge-0.2.0/winterforge/handlers/inject_default.py +41 -0
- winterforge-0.2.0/winterforge/handlers/move_front.py +35 -0
- winterforge-0.2.0/winterforge/handlers/topo_sort.py +63 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/bootstrap_config.py +0 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/commands.py +14 -69
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/init_command.py +6 -6
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/profile_installer.py +10 -29
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/profiles.py +6 -10
- winterforge-0.2.0/winterforge/kernel.py +100 -0
- winterforge-0.2.0/winterforge/materials/__init__.py +25 -0
- winterforge-0.2.0/winterforge/materials/manager.py +98 -0
- winterforge-0.2.0/winterforge/materials/registry.py +101 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/__init__.py +41 -5
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_base.py +90 -93
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_discovery.py +192 -6
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_manager_manager.py +5 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_matchable.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/__init__.py +0 -7
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/authentication.py +0 -0
- winterforge-0.2.0/winterforge/plugins/_protocols/cache.py +87 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/counter.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/email_provider.py +0 -0
- winterforge-0.2.0/winterforge/plugins/_protocols/encryption.py +76 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/hashing.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/http.py +0 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/identity.py +25 -5
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/output_redirect.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/query_execution.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/session.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/status_printer.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/storage.py +57 -56
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/token_provider.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/validator.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/auditors/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/auditors/_manager.py +11 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/auditors/orphaned_fields/__init__.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/authentication/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/authentication/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/authentication/password_provider.py +0 -1
- winterforge-0.2.0/winterforge/plugins/cache/__init__.py +30 -0
- winterforge-0.2.0/winterforge/plugins/cache/_backend.py +214 -0
- winterforge-0.2.0/winterforge/plugins/cache/_listeners.py +92 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache/_manager.py +146 -1
- winterforge-0.2.0/winterforge/plugins/cache/cache_identifier.py +116 -0
- winterforge-0.2.0/winterforge/plugins/cache/cached_value.py +119 -0
- winterforge-0.2.0/winterforge/plugins/cache/cid_resolver_manager.py +146 -0
- winterforge-0.2.0/winterforge/plugins/cache/cid_resolver_protocol.py +86 -0
- winterforge-0.2.0/winterforge/plugins/cache/composition_cid_resolver.py +87 -0
- winterforge-0.2.0/winterforge/plugins/cache/event_invalidation.py +124 -0
- winterforge-0.2.0/winterforge/plugins/cache/id_cid_resolver.py +85 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache/lru/__init__.py +85 -14
- winterforge-0.2.0/winterforge/plugins/cache/manager.py +251 -0
- winterforge-0.2.0/winterforge/plugins/cache/memory_backend.py +120 -0
- winterforge-0.2.0/winterforge/plugins/cache/registry.py +230 -0
- winterforge-0.2.0/winterforge/plugins/cache/signature_cid_resolver.py +103 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/__init__.py +2 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/lazy.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/manager.py +7 -4
- winterforge-0.1.0/winterforge/plugins/cache_warmers/none.py → winterforge-0.2.0/winterforge/plugins/cache_warmers/passthrough.py +6 -6
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/protocol.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/scheduled.py +0 -0
- winterforge-0.2.0/winterforge/plugins/cascade/__init__.py +18 -0
- winterforge-0.2.0/winterforge/plugins/cascade/_base.py +33 -0
- winterforge-0.2.0/winterforge/plugins/cascade/_manager.py +11 -0
- winterforge-0.2.0/winterforge/plugins/cascade/cascade.py +39 -0
- winterforge-0.2.0/winterforge/plugins/cascade/ignore.py +38 -0
- winterforge-0.2.0/winterforge/plugins/cascade/nullify.py +60 -0
- winterforge-0.2.0/winterforge/plugins/cascade/restrict.py +41 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/__main__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_cli_commands.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_context.py +1 -4
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_manager.py +49 -86
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_validation.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/main.py +44 -29
- winterforge-0.2.0/winterforge/plugins/cli/permissions.py +91 -0
- winterforge-0.2.0/winterforge/plugins/concurrency/__init__.py +9 -0
- winterforge-0.2.0/winterforge/plugins/concurrency/_base.py +23 -0
- winterforge-0.2.0/winterforge/plugins/concurrency/gather.py +24 -0
- winterforge-0.2.0/winterforge/plugins/concurrency/manager.py +17 -0
- winterforge-0.2.0/winterforge/plugins/concurrency/ordered_concurrent.py +24 -0
- winterforge-0.2.0/winterforge/plugins/concurrency/passthrough.py +24 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/database_synced.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/fresh.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/manager.py +12 -9
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/data/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/data/_manager.py +11 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/data/yaml/__init__.py +16 -32
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/__init__.py +178 -7
- winterforge-0.2.0/winterforge/plugins/decorators/_cache_method.py +423 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_configs.py +14 -14
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_decorator_base.py +33 -33
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_http_endpoint_config.py +7 -7
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_manager.py +3 -3
- winterforge-0.2.0/winterforge/plugins/decorators/_markers.py +67 -0
- winterforge-0.2.0/winterforge/plugins/decorators/_namespaces.py +255 -0
- winterforge-0.2.0/winterforge/plugins/decorators/_pass_two.py +196 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_provider.py +14 -14
- winterforge-0.2.0/winterforge/plugins/decorators/_scope_handler_manager.py +29 -0
- winterforge-0.2.0/winterforge/plugins/decorators/_via.py +223 -0
- winterforge-0.2.0/winterforge/plugins/decorators/cache_backend.py +35 -0
- winterforge-0.2.0/winterforge/plugins/decorators/cache_compiled.py +189 -0
- winterforge-0.2.0/winterforge/plugins/decorators/cache_hotpath.py +198 -0
- winterforge-0.2.0/winterforge/plugins/decorators/cached.py +294 -0
- winterforge-0.2.0/winterforge/plugins/decorators/cid_resolver.py +14 -0
- winterforge-0.2.0/winterforge/plugins/decorators/cli_command.py +157 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/counter_provider.py +0 -0
- winterforge-0.2.0/winterforge/plugins/decorators/emits.py +133 -0
- winterforge-0.2.0/winterforge/plugins/decorators/emits_events.py +168 -0
- winterforge-0.2.0/winterforge/plugins/decorators/http_endpoint.py +409 -0
- winterforge-0.2.0/winterforge/plugins/decorators/material.py +45 -0
- winterforge-0.2.0/winterforge/plugins/decorators/named.py +98 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/openapi.py +6 -14
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/output_redirect.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/provider_type.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/root.py +119 -15
- winterforge-0.2.0/winterforge/plugins/decorators/rune.py +57 -0
- winterforge-0.2.0/winterforge/plugins/decorators/sanitizer.py +51 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/__init__.py +27 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/_context.py +12 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/class_solo.py +44 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/cli_command.py +47 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/function.py +41 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/method_in_decorated_class.py +50 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/method_in_undecorated_class.py +48 -0
- winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/named_value.py +92 -0
- winterforge-0.2.0/winterforge/plugins/decorators/serializer.py +47 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/status_printer.py +2 -2
- winterforge-0.2.0/winterforge/plugins/decorators/transformer.py +41 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/version_root.py +2 -2
- winterforge-0.2.0/winterforge/plugins/disposition/__init__.py +15 -0
- winterforge-0.2.0/winterforge/plugins/disposition/_manager.py +11 -0
- winterforge-0.2.0/winterforge/plugins/disposition/allowed.py +46 -0
- winterforge-0.2.0/winterforge/plugins/disposition/blocked.py +47 -0
- winterforge-0.2.0/winterforge/plugins/disposition/neutral.py +47 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/console_provider.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/smtp_provider.py +0 -0
- winterforge-0.2.0/winterforge/plugins/encryption/__init__.py +11 -0
- winterforge-0.2.0/winterforge/plugins/encryption/fernet_provider.py +199 -0
- winterforge-0.2.0/winterforge/plugins/encryption/manager.py +253 -0
- winterforge-0.2.0/winterforge/plugins/events/__init__.py +5 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/dispatcher_manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/dispatchers/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/dispatchers/event.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/listener_manager.py +70 -6
- winterforge-0.2.0/winterforge/plugins/events/manager.py +132 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/provider_manager.py +0 -0
- winterforge-0.2.0/winterforge/plugins/events/tests/plugins/test_event_manager.py +237 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/exporters/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/exporters/manager.py +9 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/exporters/yaml_file.py +3 -3
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/extensions/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/extensions/_installer.py +1 -2
- winterforge-0.2.0/winterforge/plugins/extensions/_manager.py +11 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/__init__.py +2 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/argon2_provider.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/bcrypt_provider.py +0 -0
- winterforge-0.2.0/winterforge/plugins/hashing/identity_provider.py +68 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/manager.py +0 -0
- winterforge-0.2.0/winterforge/plugins/http/__init__.py +12 -0
- winterforge-0.2.0/winterforge/plugins/http/audit/__init__.py +95 -0
- winterforge-0.2.0/winterforge/plugins/http/audit/database_backend.py +101 -0
- winterforge-0.2.0/winterforge/plugins/http/audit/manager.py +11 -0
- winterforge-0.2.0/winterforge/plugins/http/audit/stderr_backend.py +53 -0
- winterforge-0.2.0/winterforge/plugins/http/csrf/__init__.py +79 -0
- winterforge-0.2.0/winterforge/plugins/http/csrf/manager.py +11 -0
- winterforge-0.2.0/winterforge/plugins/http/csrf/synchronizer_token.py +200 -0
- winterforge-0.2.0/winterforge/plugins/http/rate_limit/__init__.py +68 -0
- winterforge-0.2.0/winterforge/plugins/http/rate_limit/manager.py +11 -0
- winterforge-0.2.0/winterforge/plugins/http/rate_limit/sliding_window.py +224 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_app/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_app/fastapi_provider.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_app/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/basic_authenticator.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/bearer_authenticator.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/form_handler.py +1 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/json_handler.py +1 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/json_handler.py +2 -3
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/manager.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/xml_handler.py +0 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/identity/email_resolver.py +54 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/frag_id_resolver.py +13 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/frag_resolver.py +14 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/manager.py +8 -21
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/slug_resolver.py +21 -9
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/title_resolver.py +22 -7
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/username_resolver.py +21 -4
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/uuid_resolver.py +27 -9
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/importers/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/importers/manager.py +9 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/importers/yaml_file.py +1 -1
- winterforge-0.2.0/winterforge/plugins/indexes/__init__.py +11 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/_backend.py +2 -3
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/_manager.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/composite/__init__.py +18 -20
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/hash/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/indexes/trait_composition.py +344 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/initializers/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/initializers/application.py +2 -1
- winterforge-0.2.0/winterforge/plugins/initializers/manager.py +11 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/interactive_cli.py +7 -9
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/protocols.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/silent.py +6 -8
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/lifecycle.py +0 -0
- winterforge-0.2.0/winterforge/plugins/materials/__init__.py +10 -0
- winterforge-0.2.0/winterforge/plugins/materials/manager.py +14 -0
- winterforge-0.2.0/winterforge/plugins/named_compositions/__init__.py +19 -0
- winterforge-0.2.0/winterforge/plugins/named_compositions/manager.py +11 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/bootstrap.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/debug.py +1 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/default.py +3 -3
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/json_formatter.py +1 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/quiet.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/source/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/source/formatter_source.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_redirects/__init__.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_redirects/cli_output_redirect.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_redirects/manager.py +0 -0
- winterforge-0.1.0/winterforge/plugins/output_redirects/null_output_redirect.py → winterforge-0.2.0/winterforge/plugins/output_redirects/passthrough.py +5 -5
- winterforge-0.2.0/winterforge/plugins/permissions/__init__.py +31 -0
- winterforge-0.2.0/winterforge/plugins/permissions/_manager.py +181 -0
- winterforge-0.2.0/winterforge/plugins/permissions/_primitives.py +108 -0
- winterforge-0.2.0/winterforge/plugins/permissions/context.py +70 -0
- winterforge-0.2.0/winterforge/plugins/permissions/core.py +73 -0
- winterforge-0.2.0/winterforge/plugins/permissions/decorators.py +168 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/permissions/provider_manager.py +0 -0
- winterforge-0.2.0/winterforge/plugins/query/__init__.py +12 -0
- winterforge-0.2.0/winterforge/plugins/query/_factory.py +143 -0
- winterforge-0.2.0/winterforge/plugins/query/_manager.py +15 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/_operators.py +2 -2
- winterforge-0.2.0/winterforge/plugins/query/_repository.py +179 -0
- winterforge-0.2.0/winterforge/plugins/query/_repository_base.py +258 -0
- winterforge-0.2.0/winterforge/plugins/query/_repository_new.py +20 -0
- winterforge-0.2.0/winterforge/plugins/query/and_group.py +27 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/composition.py +8 -13
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/condition/__init__.py +10 -5
- winterforge-0.2.0/winterforge/plugins/query/condition_group/__init__.py +126 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/query/execution/_manager.py +11 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/index/__init__.py +21 -11
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/memory/__init__.py +2 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/storage/__init__.py +5 -5
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/executor/__init__.py +7 -10
- winterforge-0.2.0/winterforge/plugins/query/executors/__init__.py +17 -0
- winterforge-0.2.0/winterforge/plugins/query/executors/count.py +36 -0
- winterforge-0.2.0/winterforge/plugins/query/executors/execute.py +40 -0
- winterforge-0.2.0/winterforge/plugins/query/executors/exists.py +37 -0
- winterforge-0.2.0/winterforge/plugins/query/executors/first.py +49 -0
- winterforge-0.2.0/winterforge/plugins/query/executors/ids.py +36 -0
- winterforge-0.2.0/winterforge/plugins/query/executors/uuids.py +36 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/join/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/limit/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/offset/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/query/or_group.py +27 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/orphaned/__init__.py +0 -0
- winterforge-0.2.0/winterforge/plugins/query/range.py +47 -0
- winterforge-0.2.0/winterforge/plugins/query/scope.py +50 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/sort/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/trait.py +4 -3
- winterforge-0.2.0/winterforge/plugins/query_analytics/__init__.py +43 -0
- winterforge-0.2.0/winterforge/plugins/query_analytics/analyzer.py +201 -0
- winterforge-0.2.0/winterforge/plugins/query_analytics/cli.py +316 -0
- winterforge-0.2.0/winterforge/plugins/query_analytics/integration.py +124 -0
- winterforge-0.2.0/winterforge/plugins/query_analytics/interceptor.py +185 -0
- winterforge-0.2.0/winterforge/plugins/query_analytics/refresh_scheduler.py +270 -0
- winterforge-0.2.0/winterforge/plugins/query_analytics/view_generator.py +280 -0
- winterforge-0.2.0/winterforge/plugins/repository.py +193 -0
- winterforge-0.2.0/winterforge/plugins/runes/__init__.py +5 -0
- winterforge-0.2.0/winterforge/plugins/runes/manager.py +735 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/__init__.py +9 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/_base.py +54 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/_manager.py +11 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/email.py +44 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/identifier.py +56 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/integer.py +50 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/path.py +91 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/string.py +82 -0
- winterforge-0.2.0/winterforge/plugins/sanitizers/url.py +70 -0
- winterforge-0.2.0/winterforge/plugins/security/__init__.py +52 -0
- winterforge-0.2.0/winterforge/plugins/security/audit.py +416 -0
- winterforge-0.2.0/winterforge/plugins/security/audit_listeners.py +286 -0
- winterforge-0.2.0/winterforge/plugins/serializers/__init__.py +12 -0
- winterforge-0.2.0/winterforge/plugins/serializers/callable.py +160 -0
- winterforge-0.2.0/winterforge/plugins/serializers/cid.py +167 -0
- winterforge-0.2.0/winterforge/plugins/serializers/manager.py +111 -0
- winterforge-0.2.0/winterforge/plugins/serializers/passthrough.py +77 -0
- winterforge-0.2.0/winterforge/plugins/serializers/rune.py +150 -0
- winterforge-0.2.0/winterforge/plugins/serializers/scalar.py +81 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/frag_provider.py +5 -6
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/jwt_provider.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/bootstrap.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/python_slug.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/sql_slug.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/boolean_result_printer.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/detailed_user_printer.py +20 -7
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/list_frag_printer.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/manager.py +2 -2
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/none_result_printer.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/single_frag_printer.py +4 -4
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/string_result_printer.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/_sql_base.py +10 -7
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/env.py +12 -23
- winterforge-0.2.0/winterforge/plugins/storage/manager.py +11 -0
- winterforge-0.2.0/winterforge/plugins/storage/postgresql.py +873 -0
- winterforge-0.2.0/winterforge/plugins/storage/sqlite.py +1536 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/yaml.py +102 -92
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/frag_provider.py +6 -5
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/jwt_provider.py +1 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/manager.py +0 -0
- winterforge-0.2.0/winterforge/plugins/traits/__init__.py +66 -0
- winterforge-0.2.0/winterforge/plugins/traits/_base.py +58 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/_field_info.py +0 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/_manager.py +90 -37
- winterforge-0.2.0/winterforge/plugins/traits/api_async_builder.py +237 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/api_builder.py +81 -36
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/authenticatable.py +117 -5
- winterforge-0.2.0/winterforge/plugins/traits/authorizable.py +368 -0
- winterforge-0.2.0/winterforge/plugins/traits/buildable.py +204 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/cache_aware.py +30 -4
- winterforge-0.2.0/winterforge/plugins/traits/chainable.py +429 -0
- winterforge-0.2.0/winterforge/plugins/traits/clearable.py +49 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/cli_result.py +46 -17
- winterforge-0.2.0/winterforge/plugins/traits/collection.py +522 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/composable.py +35 -31
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/emits_events.py +30 -7
- winterforge-0.2.0/winterforge/plugins/traits/field_meta.py +115 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/fieldable.py +133 -61
- winterforge-0.2.0/winterforge/plugins/traits/has_cache_key.py +82 -0
- winterforge-0.2.0/winterforge/plugins/traits/has_concurrency.py +148 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/has_data_source.py +33 -19
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/has_data_target.py +36 -24
- winterforge-0.2.0/winterforge/plugins/traits/has_permanence.py +59 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/has_result.py +36 -27
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/http_request.py +48 -6
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/http_response.py +40 -6
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/index_generator.py +7 -55
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/injectable.py +27 -6
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/is_application.py +33 -24
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/is_dirty.py +30 -11
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/last_match.py +31 -10
- winterforge-0.2.0/winterforge/plugins/traits/machine_named.py +135 -0
- winterforge-0.2.0/winterforge/plugins/traits/manifest.py +43 -0
- winterforge-0.2.0/winterforge/plugins/traits/material_state.py +104 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/ownable.py +36 -7
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/persistable.py +177 -71
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/profileable.py +50 -19
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/queryable.py +26 -6
- winterforge-0.2.0/winterforge/plugins/traits/registry.py +43 -0
- winterforge-0.2.0/winterforge/plugins/traits/resolvable.py +306 -0
- winterforge-0.2.0/winterforge/plugins/traits/roleable.py +172 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/sessionable.py +95 -25
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/sluggable.py +40 -20
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/timestamped.py +62 -7
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/titled.py +50 -36
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/tokenable.py +38 -5
- winterforge-0.2.0/winterforge/plugins/traits/transformable.py +178 -0
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/typed.py +57 -36
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/userable.py +39 -5
- {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/with_history.py +65 -25
- winterforge-0.2.0/winterforge/plugins/transformers/__init__.py +28 -0
- winterforge-0.2.0/winterforge/plugins/transformers/_base.py +101 -0
- winterforge-0.2.0/winterforge/plugins/transformers/_manager.py +74 -0
- winterforge-0.2.0/winterforge/plugins/transformers/all.py +32 -0
- winterforge-0.2.0/winterforge/plugins/transformers/any.py +32 -0
- winterforge-0.2.0/winterforge/plugins/transformers/average.py +48 -0
- winterforge-0.2.0/winterforge/plugins/transformers/coalesce.py +29 -0
- winterforge-0.2.0/winterforge/plugins/transformers/count.py +33 -0
- winterforge-0.2.0/winterforge/plugins/transformers/extend.py +36 -0
- winterforge-0.2.0/winterforge/plugins/transformers/head.py +22 -0
- winterforge-0.2.0/winterforge/plugins/transformers/implode.py +40 -0
- winterforge-0.2.0/winterforge/plugins/transformers/max.py +45 -0
- winterforge-0.2.0/winterforge/plugins/transformers/merge.py +36 -0
- winterforge-0.2.0/winterforge/plugins/transformers/min.py +45 -0
- winterforge-0.2.0/winterforge/plugins/transformers/product.py +52 -0
- winterforge-0.2.0/winterforge/plugins/transformers/resolve.py +27 -0
- winterforge-0.2.0/winterforge/plugins/transformers/sum.py +46 -0
- winterforge-0.2.0/winterforge/plugins/transformers/tail.py +24 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/bootstrap.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/email.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/manager.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/password_validators/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/password_validators/simple.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/password_validators/strong.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/required.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/username.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/protocols/__init__.py +14 -1
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/protocols/collections.py +9 -4
- winterforge-0.2.0/winterforge/protocols/compositional.py +49 -0
- winterforge-0.2.0/winterforge/protocols/disposition_state.py +80 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/protocols/resolvable.py +10 -4
- winterforge-0.2.0/winterforge/services/recomposition/__init__.py +193 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/testing/__init__.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/testing/cli.py +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/__init__.py +0 -0
- winterforge-0.2.0/winterforge/utils/class_cache.py +271 -0
- winterforge-0.2.0/winterforge/utils/class_lookup.py +72 -0
- winterforge-0.2.0/winterforge/utils/cli_sanitize.py +426 -0
- winterforge-0.2.0/winterforge/utils/concurrency.py +117 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/dependency_resolver.py +0 -0
- winterforge-0.2.0/winterforge/utils/dev_support.py +239 -0
- winterforge-0.2.0/winterforge/utils/encryption.py +252 -0
- winterforge-0.2.0/winterforge/utils/errors.py +92 -0
- winterforge-0.2.0/winterforge/utils/inspection.py +41 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/naming.py +12 -8
- winterforge-0.2.0/winterforge/utils/plugin_resolution.py +189 -0
- winterforge-0.2.0/winterforge/utils/protocol_generator.py +941 -0
- winterforge-0.2.0/winterforge/utils/serializers.py +276 -0
- winterforge-0.2.0/winterforge/utils/signature.py +363 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/sync.py +20 -0
- winterforge-0.2.0/winterforge.egg-info/PKG-INFO +222 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge.egg-info/SOURCES.txt +229 -145
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge.egg-info/entry_points.txt +12 -7
- winterforge-0.2.0/winterforge.egg-info/top_level.txt +1 -0
- winterforge-0.1.0/PKG-INFO +0 -19
- winterforge-0.1.0/winterforge/frags/__init__.py +0 -35
- winterforge-0.1.0/winterforge/frags/base.py +0 -810
- winterforge-0.1.0/winterforge/frags/composition.py +0 -322
- winterforge-0.1.0/winterforge/frags/field_helpers.py +0 -194
- winterforge-0.1.0/winterforge/frags/manifest.py +0 -636
- winterforge-0.1.0/winterforge/frags/materialization.py +0 -124
- winterforge-0.1.0/winterforge/frags/mixins/trait_mixin.py +0 -112
- winterforge-0.1.0/winterforge/frags/primitives/__init__.py +0 -10
- winterforge-0.1.0/winterforge/frags/primitives/_base.py +0 -158
- winterforge-0.1.0/winterforge/frags/primitives/affinity.py +0 -108
- winterforge-0.1.0/winterforge/frags/primitives/manager.py +0 -88
- winterforge-0.1.0/winterforge/frags/primitives/trait.py +0 -96
- winterforge-0.1.0/winterforge/frags/registries/__init__.py +0 -5
- winterforge-0.1.0/winterforge/frags/registries/affinity_registry.py +0 -96
- winterforge-0.1.0/winterforge/frags/registries/permission_registry.py +0 -170
- winterforge-0.1.0/winterforge/frags/registries/trait_registry.py +0 -96
- winterforge-0.1.0/winterforge/frags/scope.py +0 -379
- winterforge-0.1.0/winterforge/frags/traits/__init__.py +0 -21
- winterforge-0.1.0/winterforge/frags/traits/authorizable.py +0 -230
- winterforge-0.1.0/winterforge/frags/traits/budget_aware.py +0 -107
- winterforge-0.1.0/winterforge/frags/traits/clearable.py +0 -22
- winterforge-0.1.0/winterforge/frags/traits/has_permission.py +0 -174
- winterforge-0.1.0/winterforge/frags/traits/has_roles.py +0 -239
- winterforge-0.1.0/winterforge/frags/traits/manifest.py +0 -22
- winterforge-0.1.0/winterforge/frags/traits/permissioned.py +0 -155
- winterforge-0.1.0/winterforge/frags/traits/registry.py +0 -27
- winterforge-0.1.0/winterforge/plugins/_protocols/bootstrapper.py +0 -41
- winterforge-0.1.0/winterforge/plugins/_protocols/resolver.py +0 -74
- winterforge-0.1.0/winterforge/plugins/auditors/_manager.py +0 -24
- winterforge-0.1.0/winterforge/plugins/bootstrap/__init__.py +0 -8
- winterforge-0.1.0/winterforge/plugins/bootstrap/application.py +0 -127
- winterforge-0.1.0/winterforge/plugins/bootstrap/bootstrap.py +0 -28
- winterforge-0.1.0/winterforge/plugins/bootstrap/bootstrapper_manager.py +0 -42
- winterforge-0.1.0/winterforge/plugins/bootstrap/database.py +0 -97
- winterforge-0.1.0/winterforge/plugins/bootstrap/env_var.py +0 -97
- winterforge-0.1.0/winterforge/plugins/bootstrap/framework_configuration.py +0 -83
- winterforge-0.1.0/winterforge/plugins/bootstrap/manager.py +0 -139
- winterforge-0.1.0/winterforge/plugins/bootstrap/materialization.py +0 -60
- winterforge-0.1.0/winterforge/plugins/bootstrap/plugin_configuration.py +0 -66
- winterforge-0.1.0/winterforge/plugins/bootstrap/yaml.py +0 -63
- winterforge-0.1.0/winterforge/plugins/cache/__init__.py +0 -6
- winterforge-0.1.0/winterforge/plugins/cache/_backend.py +0 -126
- winterforge-0.1.0/winterforge/plugins/cache/_listeners.py +0 -49
- winterforge-0.1.0/winterforge/plugins/data/_manager.py +0 -24
- winterforge-0.1.0/winterforge/plugins/decorators/bootstrapper.py +0 -54
- winterforge-0.1.0/winterforge/plugins/decorators/cli_command.py +0 -251
- winterforge-0.1.0/winterforge/plugins/decorators/emits.py +0 -225
- winterforge-0.1.0/winterforge/plugins/decorators/http_endpoint.py +0 -200
- winterforge-0.1.0/winterforge/plugins/decorators/scope.py +0 -41
- winterforge-0.1.0/winterforge/plugins/envoy/__init__.py +0 -6
- winterforge-0.1.0/winterforge/plugins/envoy/_manager.py +0 -30
- winterforge-0.1.0/winterforge/plugins/envoy/_protocol.py +0 -178
- winterforge-0.1.0/winterforge/plugins/envoy/claude.py +0 -295
- winterforge-0.1.0/winterforge/plugins/envoy/local_ollama.py +0 -259
- winterforge-0.1.0/winterforge/plugins/events/__init__.py +0 -13
- winterforge-0.1.0/winterforge/plugins/exporters/manager.py +0 -38
- winterforge-0.1.0/winterforge/plugins/extensions/_manager.py +0 -25
- winterforge-0.1.0/winterforge/plugins/identity/email_resolver.py +0 -37
- winterforge-0.1.0/winterforge/plugins/importers/manager.py +0 -37
- winterforge-0.1.0/winterforge/plugins/indexes/__init__.py +0 -6
- winterforge-0.1.0/winterforge/plugins/initializers/manager.py +0 -67
- winterforge-0.1.0/winterforge/plugins/permissions/__init__.py +0 -7
- winterforge-0.1.0/winterforge/plugins/query/__init__.py +0 -9
- winterforge-0.1.0/winterforge/plugins/query/_manager.py +0 -23
- winterforge-0.1.0/winterforge/plugins/query/_repository.py +0 -510
- winterforge-0.1.0/winterforge/plugins/query/affinity.py +0 -45
- winterforge-0.1.0/winterforge/plugins/query/condition_group/__init__.py +0 -118
- winterforge-0.1.0/winterforge/plugins/query/execution/_manager.py +0 -45
- winterforge-0.1.0/winterforge/plugins/query/scope.py +0 -73
- winterforge-0.1.0/winterforge/plugins/repository.py +0 -572
- winterforge-0.1.0/winterforge/plugins/resolvers/__init__.py +0 -5
- winterforge-0.1.0/winterforge/plugins/resolvers/manager.py +0 -41
- winterforge-0.1.0/winterforge/plugins/storage/manager.py +0 -24
- winterforge-0.1.0/winterforge/plugins/storage/postgresql.py +0 -751
- winterforge-0.1.0/winterforge/plugins/storage/sqlite.py +0 -1081
- winterforge-0.1.0/winterforge/plugins/storage/sqlite_old.py +0 -999
- winterforge-0.1.0/winterforge/utils/signature.py +0 -122
- winterforge-0.1.0/winterforge.egg-info/PKG-INFO +0 -19
- winterforge-0.1.0/winterforge.egg-info/top_level.txt +0 -3
- winterforge-0.1.0/winterforge_channels/__init__.py +0 -18
- winterforge-0.1.0/winterforge_channels/cli/__init__.py +0 -5
- winterforge-0.1.0/winterforge_channels/cli/channel_commands.py +0 -175
- winterforge-0.1.0/winterforge_channels/frags/traits/__init__.py +0 -19
- winterforge-0.1.0/winterforge_channels/frags/traits/conversable.py +0 -59
- winterforge-0.1.0/winterforge_channels/frags/traits/messageable.py +0 -75
- winterforge-0.1.0/winterforge_channels/frags/traits/routable.py +0 -54
- winterforge-0.1.0/winterforge_channels/frags/traits/subscribable.py +0 -90
- winterforge-0.1.0/winterforge_channels/frags/traits/transportable.py +0 -57
- winterforge-0.1.0/winterforge_channels/plugins/transports/__init__.py +0 -38
- winterforge-0.1.0/winterforge_channels/plugins/transports/http_egress.py +0 -163
- winterforge-0.1.0/winterforge_channels/plugins/transports/http_ingress.py +0 -122
- winterforge-0.1.0/winterforge_channels/plugins/transports/managers.py +0 -145
- winterforge-0.1.0/winterforge_channels/plugins/transports/protocols.py +0 -127
- winterforge-0.1.0/winterforge_channels/plugins/transports/websocket_egress.py +0 -202
- winterforge-0.1.0/winterforge_channels/primitives/__init__.py +0 -11
- winterforge-0.1.0/winterforge_channels/primitives/channel.py +0 -164
- winterforge-0.1.0/winterforge_channels/primitives/message.py +0 -162
- winterforge-0.1.0/winterforge_channels/primitives/subscription.py +0 -73
- winterforge-0.1.0/winterforge_channels/py.typed +0 -1
- winterforge-0.1.0/winterforge_channels/registries/__init__.py +0 -17
- winterforge-0.1.0/winterforge_channels/registries/channel_registry.py +0 -98
- winterforge-0.1.0/winterforge_channels/registries/message_registry.py +0 -138
- winterforge-0.1.0/winterforge_channels/registries/subscription_registry.py +0 -104
- winterforge-0.1.0/winterforge_dx_tools/__init__.py +0 -17
- winterforge-0.1.0/winterforge_dx_tools/builder.py +0 -154
- winterforge-0.1.0/winterforge_dx_tools/cli/__init__.py +0 -4
- winterforge-0.1.0/winterforge_dx_tools/cli/commands.py +0 -350
- winterforge-0.1.0/winterforge_dx_tools/elements/__init__.py +0 -15
- winterforge-0.1.0/winterforge_dx_tools/elements/builder_panel.py +0 -74
- winterforge-0.1.0/winterforge_dx_tools/elements/builder_progress.py +0 -81
- winterforge-0.1.0/winterforge_dx_tools/elements/builder_table.py +0 -100
- winterforge-0.1.0/winterforge_dx_tools/elements/builder_tree.py +0 -102
- winterforge-0.1.0/winterforge_dx_tools/elements/manager.py +0 -23
- winterforge-0.1.0/winterforge_dx_tools/elements/panel.py +0 -60
- winterforge-0.1.0/winterforge_dx_tools/elements/progress.py +0 -54
- winterforge-0.1.0/winterforge_dx_tools/elements/table.py +0 -76
- winterforge-0.1.0/winterforge_dx_tools/elements/tree.py +0 -79
- winterforge-0.1.0/winterforge_dx_tools/formatters/__init__.py +0 -9
- winterforge-0.1.0/winterforge_dx_tools/formatters/manager.py +0 -24
- winterforge-0.1.0/winterforge_dx_tools/formatters/prettier.py +0 -84
- winterforge-0.1.0/winterforge_dx_tools/generators/__init__.py +0 -1
- winterforge-0.1.0/winterforge_dx_tools/generators/generator.py +0 -132
- winterforge-0.1.0/winterforge_dx_tools/generators/templates.py +0 -54
- winterforge-0.1.0/winterforge_dx_tools/graphql/__init__.py +0 -1
- winterforge-0.1.0/winterforge_dx_tools/graphql/resolver_factory.py +0 -97
- winterforge-0.1.0/winterforge_dx_tools/graphql/schema_generator.py +0 -111
- winterforge-0.1.0/winterforge_dx_tools/graphql/server.py +0 -108
- winterforge-0.1.0/winterforge_dx_tools/graphql/type_mapper.py +0 -108
- winterforge-0.1.0/winterforge_dx_tools/migrations/__init__.py +0 -6
- winterforge-0.1.0/winterforge_dx_tools/migrations/executor.py +0 -189
- winterforge-0.1.0/winterforge_dx_tools/migrations/generator.py +0 -112
- winterforge-0.1.0/winterforge_dx_tools/migrations/template.py +0 -31
- winterforge-0.1.0/winterforge_dx_tools/migrations/tracker.py +0 -132
- winterforge-0.1.0/winterforge_dx_tools/openapi/__init__.py +0 -13
- winterforge-0.1.0/winterforge_dx_tools/openapi/generator.py +0 -168
- winterforge-0.1.0/winterforge_dx_tools/openapi/schemas.py +0 -135
- winterforge-0.1.0/winterforge_dx_tools/server/__init__.py +0 -7
- winterforge-0.1.0/winterforge_dx_tools/server/app.py +0 -78
- winterforge-0.1.0/winterforge_dx_tools/server/endpoint_generator.py +0 -144
- winterforge-0.1.0/winterforge_dx_tools/server/request_handler.py +0 -99
- winterforge-0.1.0/winterforge_dx_tools/server/response_handler.py +0 -89
- winterforge-0.1.0/winterforge_dx_tools/testing/__init__.py +0 -32
- winterforge-0.1.0/winterforge_dx_tools/testing/assertions.py +0 -169
- winterforge-0.1.0/winterforge_dx_tools/testing/builders.py +0 -221
- winterforge-0.1.0/winterforge_dx_tools/testing/factories.py +0 -189
- winterforge-0.1.0/winterforge_dx_tools/utils/__init__.py +0 -6
- winterforge-0.1.0/winterforge_dx_tools/utils/http_method_detector.py +0 -107
- winterforge-0.1.0/winterforge_dx_tools/utils/introspection.py +0 -80
- {winterforge-0.1.0 → winterforge-0.2.0}/README.md +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/setup.cfg +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge.egg-info/dependency_links.txt +0 -0
- {winterforge-0.1.0 → winterforge-0.2.0}/winterforge.egg-info/requires.txt +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: winterforge
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: AI-native framework with composable primitives
|
|
5
|
+
Author: Beau Simensen
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: typing-extensions>=4.0.0
|
|
9
|
+
Requires-Dist: asyncpg>=0.29.0
|
|
10
|
+
Requires-Dist: pydantic>=2.0.0
|
|
11
|
+
Requires-Dist: pyyaml>=6.0
|
|
12
|
+
Requires-Dist: click>=8.1.7
|
|
13
|
+
Requires-Dist: argon2-cffi>=23.1.0
|
|
14
|
+
Requires-Dist: bcrypt>=4.1.2
|
|
15
|
+
Requires-Dist: PyJWT>=2.8.0
|
|
16
|
+
Provides-Extra: dev
|
|
17
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
18
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
19
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
20
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
21
|
+
|
|
22
|
+
# WinterForge
|
|
23
|
+
|
|
24
|
+
**Async-first framework for composable data primitives.**
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
from winterforge.frags import Frag
|
|
32
|
+
from winterforge.frags.registries import UserRegistry
|
|
33
|
+
from winterforge.plugins import discover_plugins, StorageManager
|
|
34
|
+
|
|
35
|
+
# Initialize
|
|
36
|
+
discover_plugins()
|
|
37
|
+
StorageManager.load_bootstrap()
|
|
38
|
+
|
|
39
|
+
# Create user
|
|
40
|
+
users = UserRegistry()
|
|
41
|
+
user = await users.create(
|
|
42
|
+
username='alice',
|
|
43
|
+
email='alice@example.com',
|
|
44
|
+
password='secure123'
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Query
|
|
48
|
+
user = await users.get('alice@example.com') # Email resolution
|
|
49
|
+
active = await users.verified_only().all() # Filter
|
|
50
|
+
|
|
51
|
+
# Create Frag
|
|
52
|
+
post = Frag(
|
|
53
|
+
affinities=['post', 'published'],
|
|
54
|
+
traits=['titled', 'timestamped', 'sluggable']
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
post.set_title("Hello World") \
|
|
58
|
+
.generate_slug("Hello World")
|
|
59
|
+
|
|
60
|
+
await post.save()
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Core Concepts
|
|
66
|
+
|
|
67
|
+
### Frags
|
|
68
|
+
Composable data primitives built from:
|
|
69
|
+
- **Affinities** - What it IS (tags: `['user', 'admin']`)
|
|
70
|
+
- **Traits** - What it CAN DO (behavior: `['titled', 'persistable']`)
|
|
71
|
+
- **Aliases** - Flexible metadata (relations: `{'employee_id': '12345'}`)
|
|
72
|
+
|
|
73
|
+
### Registries
|
|
74
|
+
Query collections of Frags by composition.
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
users = UserRegistry()
|
|
78
|
+
admins = await users.with_role('admin').all()
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Storage
|
|
82
|
+
**SQLite**, **PostgreSQL**, **YAML**, **Env** backends.
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
storage = StorageManager.get('sqlite', db_path='app.db')
|
|
86
|
+
await storage.save(frag)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Installation
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install -e .
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Testing
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# All tests
|
|
103
|
+
pytest
|
|
104
|
+
|
|
105
|
+
# Core tests (no PostgreSQL)
|
|
106
|
+
pytest --ignore=tests/frags/storage/test_postgresql_integration.py
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Expected:** 581 passing, 1 warning (JWT dev secret)
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Documentation
|
|
114
|
+
|
|
115
|
+
- **Quick Start:** `QUICKSTART.md` - 5-minute introduction
|
|
116
|
+
- **Glossary:** `GLOSSARY.md` - Complete terminology reference
|
|
117
|
+
- **Handoff:** `HANDOFF.md` - Recent changes and architecture
|
|
118
|
+
- **Examples:** `examples/pkm/` - Personal knowledge management app
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Project Structure
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
winterforge/
|
|
126
|
+
├── frags/ # Frag core
|
|
127
|
+
│ ├── base.py # Frag class
|
|
128
|
+
│ ├── registry.py # FragRegistry
|
|
129
|
+
│ ├── traits/ # Built-in traits
|
|
130
|
+
│ └── registries/ # Specialized registries
|
|
131
|
+
├── plugins/ # Plugin system
|
|
132
|
+
│ ├── storage/ # Storage backends
|
|
133
|
+
│ ├── identity/ # Identity resolvers
|
|
134
|
+
│ └── managers/ # Plugin managers
|
|
135
|
+
└── cli/ # CLI commands
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Built-in Traits
|
|
141
|
+
|
|
142
|
+
- **titled** - title, subtitle
|
|
143
|
+
- **sluggable** - URL slugs
|
|
144
|
+
- **timestamped** - created_on, updated_on
|
|
145
|
+
- **persistable** - save(), delete(), is_new()
|
|
146
|
+
- **userable** - username, email, email_verified
|
|
147
|
+
- **authenticatable** - password hashing
|
|
148
|
+
- **authorizable** - roles, permissions
|
|
149
|
+
- **sessionable** - session management
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## CLI
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# User management
|
|
157
|
+
winterforge user create alice alice@example.com
|
|
158
|
+
winterforge user add-role alice admin
|
|
159
|
+
|
|
160
|
+
# Session management
|
|
161
|
+
winterforge session create alice
|
|
162
|
+
winterforge session verify <token>
|
|
163
|
+
|
|
164
|
+
# Role/permission management
|
|
165
|
+
winterforge role create admin "Admin role"
|
|
166
|
+
winterforge permission create posts.create
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Async-First
|
|
172
|
+
|
|
173
|
+
**All I/O operations are async:**
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
# Storage
|
|
177
|
+
await storage.save(frag)
|
|
178
|
+
frag = await storage.load(id)
|
|
179
|
+
|
|
180
|
+
# Frags
|
|
181
|
+
await frag.save()
|
|
182
|
+
await frag.delete()
|
|
183
|
+
|
|
184
|
+
# Registry
|
|
185
|
+
frag = await registry.get(identity)
|
|
186
|
+
all_frags = await registry.all()
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Sync wrapper (rare):**
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
from winterforge.utils.sync import to_sync
|
|
193
|
+
|
|
194
|
+
@to_sync
|
|
195
|
+
async def create_user_sync(username, email):
|
|
196
|
+
users = UserRegistry()
|
|
197
|
+
return await users.create(username, email, 'password')
|
|
198
|
+
|
|
199
|
+
user = create_user_sync('alice', 'alice@example.com')
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Architecture
|
|
205
|
+
|
|
206
|
+
- **Composition over inheritance** - Frags compose capabilities
|
|
207
|
+
- **Plugin-based** - Extensible via decorators
|
|
208
|
+
- **Async-first** - Modern Python standards
|
|
209
|
+
- **Everything is a Frag** - Even CLI output
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Status
|
|
214
|
+
|
|
215
|
+
**Version:** Pre-release (Phase 4 complete)
|
|
216
|
+
**Tests:** 581 passing
|
|
217
|
+
**Warnings:** 1 (expected)
|
|
218
|
+
**Ready for:** Feature development
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
**WinterForge is async-first, composition-driven, and ready for production.**
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "winterforge"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.2.0"
|
|
4
4
|
description = "AI-native framework with composable primitives"
|
|
5
|
+
readme = "README.md"
|
|
5
6
|
authors = [{name = "Beau Simensen"}]
|
|
6
7
|
requires-python = ">=3.10"
|
|
7
8
|
dependencies = [
|
|
@@ -31,11 +32,16 @@ postgresql = "winterforge.plugins.storage.postgresql:PostgreSQLStorageBackend"
|
|
|
31
32
|
[project.entry-points."winterforge.identity_resolvers"]
|
|
32
33
|
frag_id = "winterforge.plugins.identity.frag_id_resolver:FragIdResolver"
|
|
33
34
|
slug = "winterforge.plugins.identity.slug_resolver:SlugResolver"
|
|
34
|
-
title = "winterforge.plugins.identity.title_resolver:TitleIdentityResolver"
|
|
35
35
|
uuid = "winterforge.plugins.identity.uuid_resolver:UuidResolver"
|
|
36
36
|
email = "winterforge.plugins.identity.email_resolver:EmailIdentityResolver"
|
|
37
37
|
username = "winterforge.plugins.identity.username_resolver:UsernameIdentityResolver"
|
|
38
38
|
|
|
39
|
+
[project.entry-points."winterforge.materials"]
|
|
40
|
+
manager = "winterforge.materials.manager:Manager"
|
|
41
|
+
registry = "winterforge.materials.registry:Registry"
|
|
42
|
+
|
|
43
|
+
[project.entry-points."winterforge.named_compositions"]
|
|
44
|
+
|
|
39
45
|
[project.entry-points."winterforge.frag_traits"]
|
|
40
46
|
fieldable = "winterforge.frags.traits.fieldable:FieldableTrait"
|
|
41
47
|
titled = "winterforge.frags.traits.titled:TitledTrait"
|
|
@@ -50,15 +56,18 @@ sessionable = "winterforge.frags.traits.sessionable:SessionableTrait"
|
|
|
50
56
|
tokenable = "winterforge.frags.traits.tokenable:TokenableTrait"
|
|
51
57
|
permissioned = "winterforge.frags.traits.permissioned:PermissionedTrait"
|
|
52
58
|
ownable = "winterforge.frags.traits.ownable:OwnableTrait"
|
|
59
|
+
has_permanence = "winterforge.plugins.traits.has_permanence:HasPermanenceTrait"
|
|
60
|
+
material_state = "winterforge.plugins.traits.material_state:MaterialStateTrait"
|
|
61
|
+
|
|
53
62
|
|
|
54
|
-
[project.entry-points."winterforge.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
[project.entry-points."winterforge.decorator_scope_handlers"]
|
|
64
|
+
class_solo = "winterforge.plugins.decorators.scope_handlers.class_solo:ClassSoloScopeHandler"
|
|
65
|
+
function = "winterforge.plugins.decorators.scope_handlers.function:FunctionScopeHandler"
|
|
66
|
+
method_in_decorated_class = "winterforge.plugins.decorators.scope_handlers.method_in_decorated_class:MethodInDecoratedClassScopeHandler"
|
|
67
|
+
method_in_undecorated_class = "winterforge.plugins.decorators.scope_handlers.method_in_undecorated_class:MethodInUndecoratedClassScopeHandler"
|
|
59
68
|
|
|
60
69
|
[project.scripts]
|
|
61
|
-
winterforge = "winterforge.cli:cli"
|
|
70
|
+
winterforge = "winterforge.plugins.cli.main:cli"
|
|
62
71
|
|
|
63
72
|
[build-system]
|
|
64
73
|
requires = ["setuptools>=65.0"]
|
|
@@ -66,7 +75,7 @@ build-backend = "setuptools.build_meta"
|
|
|
66
75
|
|
|
67
76
|
[tool.setuptools.packages.find]
|
|
68
77
|
where = ["."]
|
|
69
|
-
include = ["winterforge
|
|
78
|
+
include = ["winterforge", "winterforge.*"]
|
|
70
79
|
exclude = ["tests*", "mandates*", "winterforge_data*"]
|
|
71
80
|
|
|
72
81
|
[tool.pytest.ini_options]
|
|
@@ -7,7 +7,7 @@ These tests validate that all acceptance criteria from the spec are met.
|
|
|
7
7
|
import pytest
|
|
8
8
|
from winterforge.plugins import (
|
|
9
9
|
storage_backend,
|
|
10
|
-
|
|
10
|
+
trait,
|
|
11
11
|
deriver,
|
|
12
12
|
StorageManager,
|
|
13
13
|
FragTraitManager,
|
|
@@ -52,7 +52,7 @@ class TestAcceptanceCriteria:
|
|
|
52
52
|
plugin,
|
|
53
53
|
deriver,
|
|
54
54
|
storage_backend,
|
|
55
|
-
|
|
55
|
+
trait,
|
|
56
56
|
identity_resolver,
|
|
57
57
|
StorageManager,
|
|
58
58
|
FragTraitManager,
|
|
@@ -178,7 +178,7 @@ class TestAcceptanceCriteria:
|
|
|
178
178
|
class MockField:
|
|
179
179
|
pass
|
|
180
180
|
|
|
181
|
-
@
|
|
181
|
+
@trait()
|
|
182
182
|
@root('fields-test')
|
|
183
183
|
class FieldsTrait:
|
|
184
184
|
# Use private attributes (new convention)
|
|
@@ -210,7 +210,7 @@ class TestAcceptanceCriteria:
|
|
|
210
210
|
"""Acceptance: All plugin types work."""
|
|
211
211
|
from winterforge.plugins import (
|
|
212
212
|
storage_backend,
|
|
213
|
-
|
|
213
|
+
trait,
|
|
214
214
|
identity_resolver,
|
|
215
215
|
StorageManager,
|
|
216
216
|
FragTraitManager,
|
|
@@ -227,7 +227,7 @@ class TestAcceptanceCriteria:
|
|
|
227
227
|
class StorageTest:
|
|
228
228
|
pass
|
|
229
229
|
|
|
230
|
-
@
|
|
230
|
+
@trait()
|
|
231
231
|
@root('trait-test')
|
|
232
232
|
class TraitTest:
|
|
233
233
|
pass
|
|
File without changes
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Debug channel initialization."""
|
|
2
|
+
import pytest
|
|
3
|
+
from channels.primitives.channel import Channel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.mark.asyncio
|
|
7
|
+
async def test_channel_debug(storage):
|
|
8
|
+
"""Debug why channels don't initialize properly."""
|
|
9
|
+
# Create channel
|
|
10
|
+
channel = Channel()
|
|
11
|
+
|
|
12
|
+
print(f"\nClass: {type(channel).__name__}")
|
|
13
|
+
print(f"\nMRO (first 10):")
|
|
14
|
+
for i, cls in enumerate(type(channel).__mro__[:10], 1):
|
|
15
|
+
print(f" {i}. {cls.__name__}")
|
|
16
|
+
if hasattr(cls, '_initialize') and '_initialize' in cls.__dict__:
|
|
17
|
+
print(f" ^ has _initialize()")
|
|
18
|
+
if hasattr(cls, '_ensure_schema') and '_ensure_schema' in cls.__dict__:
|
|
19
|
+
print(f" ^ has _ensure_schema()")
|
|
20
|
+
|
|
21
|
+
# Check initialization
|
|
22
|
+
print(f"\nInitialization:")
|
|
23
|
+
print(f" has _fieldable_data: {hasattr(channel, '_fieldable_data')}")
|
|
24
|
+
print(f" _fieldable_data value: {getattr(channel, '_fieldable_data', 'NOT SET')}")
|
|
25
|
+
print(f" has _schema_built: {hasattr(channel, '_schema_built')}")
|
|
26
|
+
print(f" _schema_built value: {getattr(channel, '_schema_built', 'NOT SET')}")
|
|
27
|
+
|
|
28
|
+
# Try to set title
|
|
29
|
+
print(f"\nCalling set_title('Test')...")
|
|
30
|
+
try:
|
|
31
|
+
channel.set_title('Test')
|
|
32
|
+
print(f" SUCCESS!")
|
|
33
|
+
except Exception as e:
|
|
34
|
+
print(f" FAILED: {type(e).__name__}: {e}")
|
|
35
|
+
|
|
36
|
+
# Try calling _ensure_schema manually
|
|
37
|
+
print(f"\nTrying _ensure_schema() manually...")
|
|
38
|
+
if hasattr(channel, '_ensure_schema'):
|
|
39
|
+
channel._ensure_schema()
|
|
40
|
+
print(f" _fieldable_data after: {getattr(channel, '_fieldable_data', 'NOT SET')}")
|
|
41
|
+
|
|
42
|
+
# Try set_title again
|
|
43
|
+
channel.set_title('Test')
|
|
44
|
+
print(f" set_title succeeded after manual _ensure_schema!")
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Debug clone behavior."""
|
|
2
|
+
import pytest
|
|
3
|
+
from winterforge.frags.base import Frag
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.mark.asyncio
|
|
7
|
+
async def test_clone_debug(storage):
|
|
8
|
+
"""Debug why clone doesn't set history links."""
|
|
9
|
+
original = Frag(
|
|
10
|
+
traits=['titled', 'with_history']
|
|
11
|
+
)
|
|
12
|
+
original.set_title('Version 1')
|
|
13
|
+
await original.save()
|
|
14
|
+
|
|
15
|
+
# Check MRO
|
|
16
|
+
print(f"\nClass: {type(original).__name__}")
|
|
17
|
+
print(f"\nMRO:")
|
|
18
|
+
for i, cls in enumerate(type(original).__mro__, 1):
|
|
19
|
+
print(f" {i}. {cls.__name__}")
|
|
20
|
+
if hasattr(cls, 'clone') and 'clone' in cls.__dict__:
|
|
21
|
+
print(f" ^ has clone() method")
|
|
22
|
+
|
|
23
|
+
# Check which clone method we're calling
|
|
24
|
+
clone_method = getattr(original, 'clone')
|
|
25
|
+
print(f"\nclone method from: {clone_method.__qualname__ if hasattr(clone_method, '__qualname__') else 'unknown'}")
|
|
26
|
+
|
|
27
|
+
# Clone
|
|
28
|
+
print(f"\nCalling clone()...")
|
|
29
|
+
clone = original.clone()
|
|
30
|
+
|
|
31
|
+
# Check results
|
|
32
|
+
print(f"\nResults:")
|
|
33
|
+
print(f" clone ID: {clone.id}")
|
|
34
|
+
print(f" original.get_alias('history_next'): {original.get_alias('history_next')}")
|
|
35
|
+
print(f" clone.get_alias('history_prev'): {clone.get_alias('history_prev')}")
|
|
36
|
+
|
|
37
|
+
assert original.get_alias('history_next') == str(clone.id)
|
|
@@ -49,7 +49,6 @@ async def test_full_stack_integration(temp_paths):
|
|
|
49
49
|
# Create Frag with multiple traits
|
|
50
50
|
now = datetime.now(UTC).isoformat()
|
|
51
51
|
frag = Frag(
|
|
52
|
-
affinities=['content', 'test'],
|
|
53
52
|
traits=['fieldable', 'titled', 'timestamped', 'sluggable']
|
|
54
53
|
)
|
|
55
54
|
|
|
@@ -83,7 +82,6 @@ async def test_multi_frag_composition(temp_paths):
|
|
|
83
82
|
|
|
84
83
|
# Create parent Frag (author)
|
|
85
84
|
author = Frag(
|
|
86
|
-
affinities=['author'],
|
|
87
85
|
traits=['fieldable', 'titled']
|
|
88
86
|
)
|
|
89
87
|
author.set_title('Test Author')
|
|
@@ -91,7 +89,6 @@ async def test_multi_frag_composition(temp_paths):
|
|
|
91
89
|
|
|
92
90
|
# Create child Frags (posts) linked via aliases
|
|
93
91
|
post1 = Frag(
|
|
94
|
-
affinities=['post'],
|
|
95
92
|
traits=['fieldable', 'titled'],
|
|
96
93
|
aliases={'author': author.id}
|
|
97
94
|
)
|
|
@@ -99,7 +96,6 @@ async def test_multi_frag_composition(temp_paths):
|
|
|
99
96
|
await storage.save(post1)
|
|
100
97
|
|
|
101
98
|
post2 = Frag(
|
|
102
|
-
affinities=['post'],
|
|
103
99
|
traits=['fieldable', 'titled'],
|
|
104
100
|
aliases={'author': author.id}
|
|
105
101
|
)
|
|
@@ -170,13 +166,13 @@ async def test_fluent_interface(temp_paths):
|
|
|
170
166
|
async def test_is_new_tracking(temp_paths):
|
|
171
167
|
"""Test is_new() through save/load cycle (persistable trait only)."""
|
|
172
168
|
|
|
173
|
-
from winterforge.
|
|
169
|
+
from winterforge.plugins.traits.persistable import set_storage
|
|
174
170
|
|
|
175
171
|
storage = StorageManager.get('sqlite', db_path=str(temp_paths['db']))
|
|
176
172
|
set_storage(storage)
|
|
177
173
|
|
|
178
174
|
# Frag with persistable trait has is_new() tracking
|
|
179
|
-
frag = Frag(
|
|
175
|
+
frag = Frag(traits=['fieldable', 'titled', 'persistable'])
|
|
180
176
|
|
|
181
177
|
# New Frag starts as new (not yet in storage)
|
|
182
178
|
assert await frag.is_new()
|
|
@@ -232,21 +228,18 @@ async def test_complex_query_patterns(temp_paths):
|
|
|
232
228
|
|
|
233
229
|
# Create diverse Frags
|
|
234
230
|
frag1 = Frag(
|
|
235
|
-
affinities=['post', 'published'],
|
|
236
231
|
traits=['fieldable', 'titled']
|
|
237
232
|
)
|
|
238
233
|
frag1.set_title('Published Post')
|
|
239
234
|
await storage.save(frag1)
|
|
240
235
|
|
|
241
236
|
frag2 = Frag(
|
|
242
|
-
affinities=['post', 'draft'],
|
|
243
237
|
traits=['fieldable', 'titled']
|
|
244
238
|
)
|
|
245
239
|
frag2.set_title('Draft Post')
|
|
246
240
|
await storage.save(frag2)
|
|
247
241
|
|
|
248
242
|
frag3 = Frag(
|
|
249
|
-
affinities=['page', 'published'],
|
|
250
243
|
traits=['fieldable', 'titled']
|
|
251
244
|
)
|
|
252
245
|
frag3.set_title('Published Page')
|
|
@@ -4,7 +4,7 @@ import pytest
|
|
|
4
4
|
import os
|
|
5
5
|
from winterforge import async_initialize, async_shutdown, initialize, shutdown
|
|
6
6
|
from winterforge.plugins.storage.manager import StorageManager
|
|
7
|
-
from winterforge.
|
|
7
|
+
from winterforge.plugins.traits import FragTraitManager
|
|
8
8
|
from winterforge.plugins.identity.manager import IdentityResolverManager
|
|
9
9
|
|
|
10
10
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Debug is_dirty behavior."""
|
|
2
|
+
import pytest
|
|
3
|
+
from winterforge.frags.base import Frag
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.mark.asyncio
|
|
7
|
+
async def test_is_dirty_debug(storage):
|
|
8
|
+
"""Debug why is_dirty isn't working."""
|
|
9
|
+
frag = Frag(traits=['is_dirty'])
|
|
10
|
+
|
|
11
|
+
# Check MRO
|
|
12
|
+
print(f"\nClass: {type(frag).__name__}")
|
|
13
|
+
print(f"\nMRO:")
|
|
14
|
+
for i, cls in enumerate(type(frag).__mro__, 1):
|
|
15
|
+
print(f" {i}. {cls.__name__}")
|
|
16
|
+
if hasattr(cls, 'set') and 'set' in cls.__dict__:
|
|
17
|
+
print(f" ^ has set() method")
|
|
18
|
+
if hasattr(cls, 'is_dirty') and 'is_dirty' in cls.__dict__:
|
|
19
|
+
print(f" ^ has is_dirty() method")
|
|
20
|
+
|
|
21
|
+
# Test initial state
|
|
22
|
+
print(f"\nInitial state:")
|
|
23
|
+
print(f" is_dirty(): {frag.is_dirty()}")
|
|
24
|
+
print(f" _dirty attr: {getattr(frag, '_dirty', 'NOT SET')}")
|
|
25
|
+
|
|
26
|
+
# Check what set method we're calling
|
|
27
|
+
print(f"\nCalling set('duration', 0.5)...")
|
|
28
|
+
set_method = getattr(frag, 'set')
|
|
29
|
+
print(f" set method type: {type(set_method)}")
|
|
30
|
+
print(f" set method from: {set_method.__qualname__ if hasattr(set_method, '__qualname__') else 'unknown'}")
|
|
31
|
+
|
|
32
|
+
# Call set
|
|
33
|
+
frag.set('duration', 0.5)
|
|
34
|
+
|
|
35
|
+
# Check state after
|
|
36
|
+
print(f"\nAfter set:")
|
|
37
|
+
print(f" is_dirty(): {frag.is_dirty()}")
|
|
38
|
+
print(f" _dirty attr: {getattr(frag, '_dirty', 'NOT SET')}")
|
|
39
|
+
print(f" _fields: {getattr(frag, '_fields', 'NOT SET')}")
|
|
40
|
+
|
|
41
|
+
assert frag.is_dirty() == True
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Smoke test for Kernel + Materials shape.
|
|
2
|
+
|
|
3
|
+
Verifies the Kernel/Materials shape laid down by Phase 7 of the
|
|
4
|
+
Great Collapse:
|
|
5
|
+
- Kernel.build() is async and returns a composed Frag
|
|
6
|
+
- Kernel.build() runs Material execute() to populate managers
|
|
7
|
+
- Material State trait compiles a snapshot
|
|
8
|
+
- Materials are registered with MaterialManager
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
from winterforge.kernel import Kernel, _kernel_context
|
|
16
|
+
from winterforge.materials import Manager, Registry
|
|
17
|
+
from winterforge.plugins.materials import MaterialManager
|
|
18
|
+
from winterforge.plugins.named_compositions import NamedCompositionManager
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@pytest.fixture(autouse=True)
|
|
22
|
+
def _reset_kernel_context():
|
|
23
|
+
"""Reset the Kernel ContextVar between tests."""
|
|
24
|
+
token = _kernel_context.set(None)
|
|
25
|
+
yield
|
|
26
|
+
_kernel_context.reset(token)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TestKernelShape:
|
|
30
|
+
"""Verify Kernel/Materials shape."""
|
|
31
|
+
|
|
32
|
+
@pytest.mark.asyncio
|
|
33
|
+
async def test_kernel_build_returns_composed_frag(self) -> None:
|
|
34
|
+
kernel = await Kernel.build()
|
|
35
|
+
|
|
36
|
+
assert kernel is not None
|
|
37
|
+
assert 'is_application' in kernel.traits
|
|
38
|
+
assert 'persistable' in kernel.traits
|
|
39
|
+
assert 'material_state' in kernel.traits
|
|
40
|
+
assert 'has_permanence' in kernel.traits
|
|
41
|
+
|
|
42
|
+
@pytest.mark.asyncio
|
|
43
|
+
async def test_kernel_build_materializes_managers(self) -> None:
|
|
44
|
+
kernel = await Kernel.build()
|
|
45
|
+
|
|
46
|
+
assert hasattr(kernel, 'managers')
|
|
47
|
+
assert hasattr(kernel, '_managers')
|
|
48
|
+
assert len(kernel._managers) > 0
|
|
49
|
+
|
|
50
|
+
@pytest.mark.asyncio
|
|
51
|
+
async def test_kernel_material_state_snapshot(self) -> None:
|
|
52
|
+
kernel = await Kernel.build()
|
|
53
|
+
|
|
54
|
+
snapshot = kernel.material_state()
|
|
55
|
+
assert isinstance(snapshot, dict)
|
|
56
|
+
assert len(snapshot) > 0
|
|
57
|
+
|
|
58
|
+
@pytest.mark.asyncio
|
|
59
|
+
async def test_kernel_current_returns_same_instance(self) -> None:
|
|
60
|
+
kernel = await Kernel.build()
|
|
61
|
+
current = Kernel.current()
|
|
62
|
+
|
|
63
|
+
assert current is kernel
|
|
64
|
+
|
|
65
|
+
@pytest.mark.asyncio
|
|
66
|
+
async def test_kernel_current_returns_none_when_uncached(self) -> None:
|
|
67
|
+
# New contract: current() returns None when nothing cached.
|
|
68
|
+
# Build/rematerialize are explicit choices.
|
|
69
|
+
current = Kernel.current()
|
|
70
|
+
|
|
71
|
+
assert current is None
|
|
72
|
+
|
|
73
|
+
@pytest.mark.asyncio
|
|
74
|
+
async def test_kernel_clear_removes_non_permanent(self) -> None:
|
|
75
|
+
kernel = await Kernel.build()
|
|
76
|
+
assert len(kernel._managers) > 0
|
|
77
|
+
|
|
78
|
+
await kernel.clear()
|
|
79
|
+
# All auto-generated managers cleared.
|
|
80
|
+
for mgr in kernel._managers.values():
|
|
81
|
+
assert mgr.is_permanent
|
|
82
|
+
|
|
83
|
+
def test_kernel_sources_from_materials(self) -> None:
|
|
84
|
+
assert Kernel._buildable_sources == ['winterforge.materials']
|
|
85
|
+
assert Kernel._buildable_context is _kernel_context
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class TestMaterials:
|
|
89
|
+
"""Verify Material registration."""
|
|
90
|
+
|
|
91
|
+
def test_material_manager_id(self) -> None:
|
|
92
|
+
assert MaterialManager.plugin_id() == 'winterforge.materials'
|
|
93
|
+
|
|
94
|
+
def test_manager_material_registered(self) -> None:
|
|
95
|
+
assert MaterialManager.has('manager')
|
|
96
|
+
plugin_class = MaterialManager._plugins['manager']
|
|
97
|
+
assert plugin_class is Manager
|
|
98
|
+
|
|
99
|
+
def test_registry_material_registered(self) -> None:
|
|
100
|
+
assert MaterialManager.has('registry')
|
|
101
|
+
plugin_class = MaterialManager._plugins['registry']
|
|
102
|
+
assert plugin_class is Registry
|
|
103
|
+
|
|
104
|
+
def test_manager_material_sources(self) -> None:
|
|
105
|
+
assert Manager._buildable_sources == [
|
|
106
|
+
'winterforge.plugin_managers'
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
def test_registry_material_sources(self) -> None:
|
|
110
|
+
assert Registry._buildable_sources == [
|
|
111
|
+
'winterforge.named_compositions'
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
def test_named_composition_manager_stub_registered(self) -> None:
|
|
115
|
+
assert (
|
|
116
|
+
NamedCompositionManager.plugin_id()
|
|
117
|
+
== 'winterforge.named_compositions'
|
|
118
|
+
)
|