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.
Files changed (625) hide show
  1. winterforge-0.2.0/PKG-INFO +222 -0
  2. {winterforge-0.1.0 → winterforge-0.2.0}/pyproject.toml +18 -9
  3. {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_acceptance.py +5 -5
  4. {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_canonical_resolution.py +0 -0
  5. winterforge-0.2.0/tests/test_channel_debug.py +44 -0
  6. winterforge-0.2.0/tests/test_clone_debug.py +37 -0
  7. {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_e2e_integration.py +2 -9
  8. {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_initialization.py +1 -1
  9. winterforge-0.2.0/tests/test_is_dirty_debug.py +41 -0
  10. winterforge-0.2.0/tests/test_kernel.py +118 -0
  11. winterforge-0.2.0/tests/test_mro_exploration.py +87 -0
  12. {winterforge-0.1.0 → winterforge-0.2.0}/tests/test_user_system_integration.py +32 -11
  13. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/__init__.py +61 -23
  14. winterforge-0.2.0/winterforge/frags/__init__.py +21 -0
  15. winterforge-0.2.0/winterforge/frags/base.py +1550 -0
  16. winterforge-0.2.0/winterforge/frags/composition.py +208 -0
  17. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/injectable.py +19 -17
  18. winterforge-0.2.0/winterforge/frags/manifest.py +470 -0
  19. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/mixins/__init__.py +0 -0
  20. winterforge-0.2.0/winterforge/frags/mixins/trait_mixin.py +197 -0
  21. winterforge-0.2.0/winterforge/frags/primitives/__init__.py +14 -0
  22. winterforge-0.2.0/winterforge/frags/primitives/render.py +84 -0
  23. winterforge-0.2.0/winterforge/frags/primitives/rune.py +223 -0
  24. winterforge-0.2.0/winterforge/frags/registries/__init__.py +6 -0
  25. winterforge-0.2.0/winterforge/frags/registries/_namespaced_mixin.py +110 -0
  26. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/application_registry.py +33 -6
  27. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/config_registry.py +136 -37
  28. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/field_registry.py +18 -18
  29. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/frag_registry.py +218 -125
  30. winterforge-0.2.0/winterforge/frags/registries/permission_registry.py +188 -0
  31. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/profile_registry.py +7 -8
  32. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/role_registry.py +90 -66
  33. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/session_registry.py +22 -15
  34. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/frags/registries/user_registry.py +201 -39
  35. winterforge-0.2.0/winterforge/handlers/__init__.py +29 -0
  36. winterforge-0.2.0/winterforge/handlers/dedupe.py +41 -0
  37. winterforge-0.2.0/winterforge/handlers/filter.py +34 -0
  38. winterforge-0.2.0/winterforge/handlers/inject_default.py +41 -0
  39. winterforge-0.2.0/winterforge/handlers/move_front.py +35 -0
  40. winterforge-0.2.0/winterforge/handlers/topo_sort.py +63 -0
  41. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/__init__.py +0 -0
  42. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/bootstrap_config.py +0 -1
  43. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/commands.py +14 -69
  44. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/init_command.py +6 -6
  45. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/profile_installer.py +10 -29
  46. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/installer/profiles.py +6 -10
  47. winterforge-0.2.0/winterforge/kernel.py +100 -0
  48. winterforge-0.2.0/winterforge/materials/__init__.py +25 -0
  49. winterforge-0.2.0/winterforge/materials/manager.py +98 -0
  50. winterforge-0.2.0/winterforge/materials/registry.py +101 -0
  51. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/__init__.py +41 -5
  52. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_base.py +90 -93
  53. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_discovery.py +192 -6
  54. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_manager_manager.py +5 -2
  55. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_matchable.py +0 -0
  56. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/__init__.py +0 -7
  57. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/authentication.py +0 -0
  58. winterforge-0.2.0/winterforge/plugins/_protocols/cache.py +87 -0
  59. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/counter.py +0 -0
  60. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/email_provider.py +0 -0
  61. winterforge-0.2.0/winterforge/plugins/_protocols/encryption.py +76 -0
  62. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/hashing.py +0 -0
  63. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/http.py +0 -1
  64. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/identity.py +25 -5
  65. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/output_redirect.py +1 -1
  66. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/query_execution.py +0 -0
  67. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/session.py +0 -0
  68. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/status_printer.py +1 -1
  69. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/storage.py +57 -56
  70. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/token_provider.py +0 -0
  71. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/_protocols/validator.py +0 -0
  72. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/auditors/__init__.py +0 -0
  73. winterforge-0.2.0/winterforge/plugins/auditors/_manager.py +11 -0
  74. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/auditors/orphaned_fields/__init__.py +1 -1
  75. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/authentication/__init__.py +0 -0
  76. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/authentication/manager.py +0 -0
  77. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/authentication/password_provider.py +0 -1
  78. winterforge-0.2.0/winterforge/plugins/cache/__init__.py +30 -0
  79. winterforge-0.2.0/winterforge/plugins/cache/_backend.py +214 -0
  80. winterforge-0.2.0/winterforge/plugins/cache/_listeners.py +92 -0
  81. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache/_manager.py +146 -1
  82. winterforge-0.2.0/winterforge/plugins/cache/cache_identifier.py +116 -0
  83. winterforge-0.2.0/winterforge/plugins/cache/cached_value.py +119 -0
  84. winterforge-0.2.0/winterforge/plugins/cache/cid_resolver_manager.py +146 -0
  85. winterforge-0.2.0/winterforge/plugins/cache/cid_resolver_protocol.py +86 -0
  86. winterforge-0.2.0/winterforge/plugins/cache/composition_cid_resolver.py +87 -0
  87. winterforge-0.2.0/winterforge/plugins/cache/event_invalidation.py +124 -0
  88. winterforge-0.2.0/winterforge/plugins/cache/id_cid_resolver.py +85 -0
  89. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache/lru/__init__.py +85 -14
  90. winterforge-0.2.0/winterforge/plugins/cache/manager.py +251 -0
  91. winterforge-0.2.0/winterforge/plugins/cache/memory_backend.py +120 -0
  92. winterforge-0.2.0/winterforge/plugins/cache/registry.py +230 -0
  93. winterforge-0.2.0/winterforge/plugins/cache/signature_cid_resolver.py +103 -0
  94. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/__init__.py +2 -2
  95. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/lazy.py +0 -0
  96. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/manager.py +7 -4
  97. winterforge-0.1.0/winterforge/plugins/cache_warmers/none.py → winterforge-0.2.0/winterforge/plugins/cache_warmers/passthrough.py +6 -6
  98. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/protocol.py +1 -1
  99. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cache_warmers/scheduled.py +0 -0
  100. winterforge-0.2.0/winterforge/plugins/cascade/__init__.py +18 -0
  101. winterforge-0.2.0/winterforge/plugins/cascade/_base.py +33 -0
  102. winterforge-0.2.0/winterforge/plugins/cascade/_manager.py +11 -0
  103. winterforge-0.2.0/winterforge/plugins/cascade/cascade.py +39 -0
  104. winterforge-0.2.0/winterforge/plugins/cascade/ignore.py +38 -0
  105. winterforge-0.2.0/winterforge/plugins/cascade/nullify.py +60 -0
  106. winterforge-0.2.0/winterforge/plugins/cascade/restrict.py +41 -0
  107. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/__init__.py +0 -0
  108. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/__main__.py +0 -0
  109. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_cli_commands.py +1 -1
  110. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_context.py +1 -4
  111. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_manager.py +49 -86
  112. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/_validation.py +0 -0
  113. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/cli/main.py +44 -29
  114. winterforge-0.2.0/winterforge/plugins/cli/permissions.py +91 -0
  115. winterforge-0.2.0/winterforge/plugins/concurrency/__init__.py +9 -0
  116. winterforge-0.2.0/winterforge/plugins/concurrency/_base.py +23 -0
  117. winterforge-0.2.0/winterforge/plugins/concurrency/gather.py +24 -0
  118. winterforge-0.2.0/winterforge/plugins/concurrency/manager.py +17 -0
  119. winterforge-0.2.0/winterforge/plugins/concurrency/ordered_concurrent.py +24 -0
  120. winterforge-0.2.0/winterforge/plugins/concurrency/passthrough.py +24 -0
  121. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/__init__.py +0 -0
  122. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/database_synced.py +0 -0
  123. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/fresh.py +0 -0
  124. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/counter/manager.py +12 -9
  125. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/data/__init__.py +0 -0
  126. winterforge-0.2.0/winterforge/plugins/data/_manager.py +11 -0
  127. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/data/yaml/__init__.py +16 -32
  128. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/__init__.py +178 -7
  129. winterforge-0.2.0/winterforge/plugins/decorators/_cache_method.py +423 -0
  130. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_configs.py +14 -14
  131. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_decorator_base.py +33 -33
  132. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_http_endpoint_config.py +7 -7
  133. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_manager.py +3 -3
  134. winterforge-0.2.0/winterforge/plugins/decorators/_markers.py +67 -0
  135. winterforge-0.2.0/winterforge/plugins/decorators/_namespaces.py +255 -0
  136. winterforge-0.2.0/winterforge/plugins/decorators/_pass_two.py +196 -0
  137. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/_provider.py +14 -14
  138. winterforge-0.2.0/winterforge/plugins/decorators/_scope_handler_manager.py +29 -0
  139. winterforge-0.2.0/winterforge/plugins/decorators/_via.py +223 -0
  140. winterforge-0.2.0/winterforge/plugins/decorators/cache_backend.py +35 -0
  141. winterforge-0.2.0/winterforge/plugins/decorators/cache_compiled.py +189 -0
  142. winterforge-0.2.0/winterforge/plugins/decorators/cache_hotpath.py +198 -0
  143. winterforge-0.2.0/winterforge/plugins/decorators/cached.py +294 -0
  144. winterforge-0.2.0/winterforge/plugins/decorators/cid_resolver.py +14 -0
  145. winterforge-0.2.0/winterforge/plugins/decorators/cli_command.py +157 -0
  146. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/counter_provider.py +0 -0
  147. winterforge-0.2.0/winterforge/plugins/decorators/emits.py +133 -0
  148. winterforge-0.2.0/winterforge/plugins/decorators/emits_events.py +168 -0
  149. winterforge-0.2.0/winterforge/plugins/decorators/http_endpoint.py +409 -0
  150. winterforge-0.2.0/winterforge/plugins/decorators/material.py +45 -0
  151. winterforge-0.2.0/winterforge/plugins/decorators/named.py +98 -0
  152. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/openapi.py +6 -14
  153. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/output_redirect.py +0 -0
  154. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/provider_type.py +0 -0
  155. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/root.py +119 -15
  156. winterforge-0.2.0/winterforge/plugins/decorators/rune.py +57 -0
  157. winterforge-0.2.0/winterforge/plugins/decorators/sanitizer.py +51 -0
  158. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/__init__.py +27 -0
  159. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/_context.py +12 -0
  160. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/class_solo.py +44 -0
  161. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/cli_command.py +47 -0
  162. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/function.py +41 -0
  163. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/method_in_decorated_class.py +50 -0
  164. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/method_in_undecorated_class.py +48 -0
  165. winterforge-0.2.0/winterforge/plugins/decorators/scope_handlers/named_value.py +92 -0
  166. winterforge-0.2.0/winterforge/plugins/decorators/serializer.py +47 -0
  167. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/status_printer.py +2 -2
  168. winterforge-0.2.0/winterforge/plugins/decorators/transformer.py +41 -0
  169. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/decorators/version_root.py +2 -2
  170. winterforge-0.2.0/winterforge/plugins/disposition/__init__.py +15 -0
  171. winterforge-0.2.0/winterforge/plugins/disposition/_manager.py +11 -0
  172. winterforge-0.2.0/winterforge/plugins/disposition/allowed.py +46 -0
  173. winterforge-0.2.0/winterforge/plugins/disposition/blocked.py +47 -0
  174. winterforge-0.2.0/winterforge/plugins/disposition/neutral.py +47 -0
  175. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/__init__.py +0 -0
  176. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/console_provider.py +0 -0
  177. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/manager.py +0 -0
  178. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/email/smtp_provider.py +0 -0
  179. winterforge-0.2.0/winterforge/plugins/encryption/__init__.py +11 -0
  180. winterforge-0.2.0/winterforge/plugins/encryption/fernet_provider.py +199 -0
  181. winterforge-0.2.0/winterforge/plugins/encryption/manager.py +253 -0
  182. winterforge-0.2.0/winterforge/plugins/events/__init__.py +5 -0
  183. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/dispatcher_manager.py +0 -0
  184. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/dispatchers/__init__.py +0 -0
  185. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/dispatchers/event.py +0 -0
  186. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/listener_manager.py +70 -6
  187. winterforge-0.2.0/winterforge/plugins/events/manager.py +132 -0
  188. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/events/provider_manager.py +0 -0
  189. winterforge-0.2.0/winterforge/plugins/events/tests/plugins/test_event_manager.py +237 -0
  190. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/exporters/__init__.py +0 -0
  191. winterforge-0.2.0/winterforge/plugins/exporters/manager.py +9 -0
  192. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/exporters/yaml_file.py +3 -3
  193. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/extensions/__init__.py +0 -0
  194. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/extensions/_installer.py +1 -2
  195. winterforge-0.2.0/winterforge/plugins/extensions/_manager.py +11 -0
  196. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/__init__.py +2 -0
  197. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/argon2_provider.py +0 -0
  198. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/bcrypt_provider.py +0 -0
  199. winterforge-0.2.0/winterforge/plugins/hashing/identity_provider.py +68 -0
  200. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/hashing/manager.py +0 -0
  201. winterforge-0.2.0/winterforge/plugins/http/__init__.py +12 -0
  202. winterforge-0.2.0/winterforge/plugins/http/audit/__init__.py +95 -0
  203. winterforge-0.2.0/winterforge/plugins/http/audit/database_backend.py +101 -0
  204. winterforge-0.2.0/winterforge/plugins/http/audit/manager.py +11 -0
  205. winterforge-0.2.0/winterforge/plugins/http/audit/stderr_backend.py +53 -0
  206. winterforge-0.2.0/winterforge/plugins/http/csrf/__init__.py +79 -0
  207. winterforge-0.2.0/winterforge/plugins/http/csrf/manager.py +11 -0
  208. winterforge-0.2.0/winterforge/plugins/http/csrf/synchronizer_token.py +200 -0
  209. winterforge-0.2.0/winterforge/plugins/http/rate_limit/__init__.py +68 -0
  210. winterforge-0.2.0/winterforge/plugins/http/rate_limit/manager.py +11 -0
  211. winterforge-0.2.0/winterforge/plugins/http/rate_limit/sliding_window.py +224 -0
  212. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_app/__init__.py +0 -0
  213. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_app/fastapi_provider.py +0 -0
  214. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_app/manager.py +0 -0
  215. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/__init__.py +0 -0
  216. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/basic_authenticator.py +0 -0
  217. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/bearer_authenticator.py +0 -0
  218. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_authenticator/manager.py +0 -0
  219. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/__init__.py +0 -0
  220. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/form_handler.py +1 -2
  221. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/json_handler.py +1 -2
  222. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_request/manager.py +0 -0
  223. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/__init__.py +0 -0
  224. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/json_handler.py +2 -3
  225. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/manager.py +1 -1
  226. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/http_response/xml_handler.py +0 -1
  227. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/__init__.py +0 -0
  228. winterforge-0.2.0/winterforge/plugins/identity/email_resolver.py +54 -0
  229. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/frag_id_resolver.py +13 -1
  230. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/frag_resolver.py +14 -2
  231. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/manager.py +8 -21
  232. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/slug_resolver.py +21 -9
  233. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/title_resolver.py +22 -7
  234. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/username_resolver.py +21 -4
  235. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/identity/uuid_resolver.py +27 -9
  236. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/importers/__init__.py +0 -0
  237. winterforge-0.2.0/winterforge/plugins/importers/manager.py +9 -0
  238. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/importers/yaml_file.py +1 -1
  239. winterforge-0.2.0/winterforge/plugins/indexes/__init__.py +11 -0
  240. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/_backend.py +2 -3
  241. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/_manager.py +1 -1
  242. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/composite/__init__.py +18 -20
  243. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/indexes/hash/__init__.py +0 -0
  244. winterforge-0.2.0/winterforge/plugins/indexes/trait_composition.py +344 -0
  245. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/initializers/__init__.py +0 -0
  246. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/initializers/application.py +2 -1
  247. winterforge-0.2.0/winterforge/plugins/initializers/manager.py +11 -0
  248. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/__init__.py +0 -0
  249. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/interactive_cli.py +7 -9
  250. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/manager.py +0 -0
  251. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/protocols.py +0 -0
  252. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/input_prompts/silent.py +6 -8
  253. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/lifecycle.py +0 -0
  254. winterforge-0.2.0/winterforge/plugins/materials/__init__.py +10 -0
  255. winterforge-0.2.0/winterforge/plugins/materials/manager.py +14 -0
  256. winterforge-0.2.0/winterforge/plugins/named_compositions/__init__.py +19 -0
  257. winterforge-0.2.0/winterforge/plugins/named_compositions/manager.py +11 -0
  258. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/__init__.py +0 -0
  259. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/bootstrap.py +0 -0
  260. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/debug.py +1 -2
  261. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/default.py +3 -3
  262. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/json_formatter.py +1 -2
  263. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/manager.py +0 -0
  264. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/quiet.py +0 -0
  265. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/source/__init__.py +0 -0
  266. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_formatters/source/formatter_source.py +0 -0
  267. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_redirects/__init__.py +1 -1
  268. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_redirects/cli_output_redirect.py +0 -0
  269. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/output_redirects/manager.py +0 -0
  270. winterforge-0.1.0/winterforge/plugins/output_redirects/null_output_redirect.py → winterforge-0.2.0/winterforge/plugins/output_redirects/passthrough.py +5 -5
  271. winterforge-0.2.0/winterforge/plugins/permissions/__init__.py +31 -0
  272. winterforge-0.2.0/winterforge/plugins/permissions/_manager.py +181 -0
  273. winterforge-0.2.0/winterforge/plugins/permissions/_primitives.py +108 -0
  274. winterforge-0.2.0/winterforge/plugins/permissions/context.py +70 -0
  275. winterforge-0.2.0/winterforge/plugins/permissions/core.py +73 -0
  276. winterforge-0.2.0/winterforge/plugins/permissions/decorators.py +168 -0
  277. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/permissions/provider_manager.py +0 -0
  278. winterforge-0.2.0/winterforge/plugins/query/__init__.py +12 -0
  279. winterforge-0.2.0/winterforge/plugins/query/_factory.py +143 -0
  280. winterforge-0.2.0/winterforge/plugins/query/_manager.py +15 -0
  281. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/_operators.py +2 -2
  282. winterforge-0.2.0/winterforge/plugins/query/_repository.py +179 -0
  283. winterforge-0.2.0/winterforge/plugins/query/_repository_base.py +258 -0
  284. winterforge-0.2.0/winterforge/plugins/query/_repository_new.py +20 -0
  285. winterforge-0.2.0/winterforge/plugins/query/and_group.py +27 -0
  286. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/composition.py +8 -13
  287. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/condition/__init__.py +10 -5
  288. winterforge-0.2.0/winterforge/plugins/query/condition_group/__init__.py +126 -0
  289. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/__init__.py +0 -0
  290. winterforge-0.2.0/winterforge/plugins/query/execution/_manager.py +11 -0
  291. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/index/__init__.py +21 -11
  292. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/memory/__init__.py +2 -2
  293. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/execution/storage/__init__.py +5 -5
  294. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/executor/__init__.py +7 -10
  295. winterforge-0.2.0/winterforge/plugins/query/executors/__init__.py +17 -0
  296. winterforge-0.2.0/winterforge/plugins/query/executors/count.py +36 -0
  297. winterforge-0.2.0/winterforge/plugins/query/executors/execute.py +40 -0
  298. winterforge-0.2.0/winterforge/plugins/query/executors/exists.py +37 -0
  299. winterforge-0.2.0/winterforge/plugins/query/executors/first.py +49 -0
  300. winterforge-0.2.0/winterforge/plugins/query/executors/ids.py +36 -0
  301. winterforge-0.2.0/winterforge/plugins/query/executors/uuids.py +36 -0
  302. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/join/__init__.py +0 -0
  303. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/limit/__init__.py +0 -0
  304. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/offset/__init__.py +0 -0
  305. winterforge-0.2.0/winterforge/plugins/query/or_group.py +27 -0
  306. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/orphaned/__init__.py +0 -0
  307. winterforge-0.2.0/winterforge/plugins/query/range.py +47 -0
  308. winterforge-0.2.0/winterforge/plugins/query/scope.py +50 -0
  309. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/sort/__init__.py +0 -0
  310. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/query/trait.py +4 -3
  311. winterforge-0.2.0/winterforge/plugins/query_analytics/__init__.py +43 -0
  312. winterforge-0.2.0/winterforge/plugins/query_analytics/analyzer.py +201 -0
  313. winterforge-0.2.0/winterforge/plugins/query_analytics/cli.py +316 -0
  314. winterforge-0.2.0/winterforge/plugins/query_analytics/integration.py +124 -0
  315. winterforge-0.2.0/winterforge/plugins/query_analytics/interceptor.py +185 -0
  316. winterforge-0.2.0/winterforge/plugins/query_analytics/refresh_scheduler.py +270 -0
  317. winterforge-0.2.0/winterforge/plugins/query_analytics/view_generator.py +280 -0
  318. winterforge-0.2.0/winterforge/plugins/repository.py +193 -0
  319. winterforge-0.2.0/winterforge/plugins/runes/__init__.py +5 -0
  320. winterforge-0.2.0/winterforge/plugins/runes/manager.py +735 -0
  321. winterforge-0.2.0/winterforge/plugins/sanitizers/__init__.py +9 -0
  322. winterforge-0.2.0/winterforge/plugins/sanitizers/_base.py +54 -0
  323. winterforge-0.2.0/winterforge/plugins/sanitizers/_manager.py +11 -0
  324. winterforge-0.2.0/winterforge/plugins/sanitizers/email.py +44 -0
  325. winterforge-0.2.0/winterforge/plugins/sanitizers/identifier.py +56 -0
  326. winterforge-0.2.0/winterforge/plugins/sanitizers/integer.py +50 -0
  327. winterforge-0.2.0/winterforge/plugins/sanitizers/path.py +91 -0
  328. winterforge-0.2.0/winterforge/plugins/sanitizers/string.py +82 -0
  329. winterforge-0.2.0/winterforge/plugins/sanitizers/url.py +70 -0
  330. winterforge-0.2.0/winterforge/plugins/security/__init__.py +52 -0
  331. winterforge-0.2.0/winterforge/plugins/security/audit.py +416 -0
  332. winterforge-0.2.0/winterforge/plugins/security/audit_listeners.py +286 -0
  333. winterforge-0.2.0/winterforge/plugins/serializers/__init__.py +12 -0
  334. winterforge-0.2.0/winterforge/plugins/serializers/callable.py +160 -0
  335. winterforge-0.2.0/winterforge/plugins/serializers/cid.py +167 -0
  336. winterforge-0.2.0/winterforge/plugins/serializers/manager.py +111 -0
  337. winterforge-0.2.0/winterforge/plugins/serializers/passthrough.py +77 -0
  338. winterforge-0.2.0/winterforge/plugins/serializers/rune.py +150 -0
  339. winterforge-0.2.0/winterforge/plugins/serializers/scalar.py +81 -0
  340. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/__init__.py +0 -0
  341. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/frag_provider.py +5 -6
  342. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/jwt_provider.py +0 -0
  343. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/session/manager.py +0 -0
  344. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/__init__.py +0 -0
  345. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/bootstrap.py +0 -0
  346. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/manager.py +0 -0
  347. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/python_slug.py +0 -0
  348. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/slug_convertors/sql_slug.py +0 -0
  349. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/__init__.py +0 -0
  350. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/boolean_result_printer.py +0 -0
  351. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/detailed_user_printer.py +20 -7
  352. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/list_frag_printer.py +1 -1
  353. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/manager.py +2 -2
  354. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/none_result_printer.py +0 -0
  355. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/single_frag_printer.py +4 -4
  356. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/status_printers/string_result_printer.py +0 -0
  357. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/__init__.py +0 -0
  358. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/_sql_base.py +10 -7
  359. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/env.py +12 -23
  360. winterforge-0.2.0/winterforge/plugins/storage/manager.py +11 -0
  361. winterforge-0.2.0/winterforge/plugins/storage/postgresql.py +873 -0
  362. winterforge-0.2.0/winterforge/plugins/storage/sqlite.py +1536 -0
  363. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/storage/yaml.py +102 -92
  364. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/__init__.py +0 -0
  365. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/frag_provider.py +6 -5
  366. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/jwt_provider.py +1 -1
  367. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/token/manager.py +0 -0
  368. winterforge-0.2.0/winterforge/plugins/traits/__init__.py +66 -0
  369. winterforge-0.2.0/winterforge/plugins/traits/_base.py +58 -0
  370. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/_field_info.py +0 -0
  371. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/_manager.py +90 -37
  372. winterforge-0.2.0/winterforge/plugins/traits/api_async_builder.py +237 -0
  373. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/api_builder.py +81 -36
  374. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/authenticatable.py +117 -5
  375. winterforge-0.2.0/winterforge/plugins/traits/authorizable.py +368 -0
  376. winterforge-0.2.0/winterforge/plugins/traits/buildable.py +204 -0
  377. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/cache_aware.py +30 -4
  378. winterforge-0.2.0/winterforge/plugins/traits/chainable.py +429 -0
  379. winterforge-0.2.0/winterforge/plugins/traits/clearable.py +49 -0
  380. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/cli_result.py +46 -17
  381. winterforge-0.2.0/winterforge/plugins/traits/collection.py +522 -0
  382. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/composable.py +35 -31
  383. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/emits_events.py +30 -7
  384. winterforge-0.2.0/winterforge/plugins/traits/field_meta.py +115 -0
  385. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/fieldable.py +133 -61
  386. winterforge-0.2.0/winterforge/plugins/traits/has_cache_key.py +82 -0
  387. winterforge-0.2.0/winterforge/plugins/traits/has_concurrency.py +148 -0
  388. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/has_data_source.py +33 -19
  389. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/has_data_target.py +36 -24
  390. winterforge-0.2.0/winterforge/plugins/traits/has_permanence.py +59 -0
  391. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/has_result.py +36 -27
  392. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/http_request.py +48 -6
  393. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/http_response.py +40 -6
  394. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/index_generator.py +7 -55
  395. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/injectable.py +27 -6
  396. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/is_application.py +33 -24
  397. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/is_dirty.py +30 -11
  398. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/last_match.py +31 -10
  399. winterforge-0.2.0/winterforge/plugins/traits/machine_named.py +135 -0
  400. winterforge-0.2.0/winterforge/plugins/traits/manifest.py +43 -0
  401. winterforge-0.2.0/winterforge/plugins/traits/material_state.py +104 -0
  402. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/ownable.py +36 -7
  403. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/persistable.py +177 -71
  404. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/profileable.py +50 -19
  405. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/queryable.py +26 -6
  406. winterforge-0.2.0/winterforge/plugins/traits/registry.py +43 -0
  407. winterforge-0.2.0/winterforge/plugins/traits/resolvable.py +306 -0
  408. winterforge-0.2.0/winterforge/plugins/traits/roleable.py +172 -0
  409. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/sessionable.py +95 -25
  410. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/sluggable.py +40 -20
  411. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/timestamped.py +62 -7
  412. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/titled.py +50 -36
  413. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/tokenable.py +38 -5
  414. winterforge-0.2.0/winterforge/plugins/traits/transformable.py +178 -0
  415. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/typed.py +57 -36
  416. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/userable.py +39 -5
  417. {winterforge-0.1.0/winterforge/frags → winterforge-0.2.0/winterforge/plugins}/traits/with_history.py +65 -25
  418. winterforge-0.2.0/winterforge/plugins/transformers/__init__.py +28 -0
  419. winterforge-0.2.0/winterforge/plugins/transformers/_base.py +101 -0
  420. winterforge-0.2.0/winterforge/plugins/transformers/_manager.py +74 -0
  421. winterforge-0.2.0/winterforge/plugins/transformers/all.py +32 -0
  422. winterforge-0.2.0/winterforge/plugins/transformers/any.py +32 -0
  423. winterforge-0.2.0/winterforge/plugins/transformers/average.py +48 -0
  424. winterforge-0.2.0/winterforge/plugins/transformers/coalesce.py +29 -0
  425. winterforge-0.2.0/winterforge/plugins/transformers/count.py +33 -0
  426. winterforge-0.2.0/winterforge/plugins/transformers/extend.py +36 -0
  427. winterforge-0.2.0/winterforge/plugins/transformers/head.py +22 -0
  428. winterforge-0.2.0/winterforge/plugins/transformers/implode.py +40 -0
  429. winterforge-0.2.0/winterforge/plugins/transformers/max.py +45 -0
  430. winterforge-0.2.0/winterforge/plugins/transformers/merge.py +36 -0
  431. winterforge-0.2.0/winterforge/plugins/transformers/min.py +45 -0
  432. winterforge-0.2.0/winterforge/plugins/transformers/product.py +52 -0
  433. winterforge-0.2.0/winterforge/plugins/transformers/resolve.py +27 -0
  434. winterforge-0.2.0/winterforge/plugins/transformers/sum.py +46 -0
  435. winterforge-0.2.0/winterforge/plugins/transformers/tail.py +24 -0
  436. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/__init__.py +0 -0
  437. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/bootstrap.py +0 -0
  438. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/email.py +0 -0
  439. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/manager.py +0 -0
  440. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/password_validators/__init__.py +0 -0
  441. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/password_validators/simple.py +0 -0
  442. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/password_validators/strong.py +0 -0
  443. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/required.py +0 -0
  444. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/plugins/validators/username.py +0 -0
  445. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/protocols/__init__.py +14 -1
  446. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/protocols/collections.py +9 -4
  447. winterforge-0.2.0/winterforge/protocols/compositional.py +49 -0
  448. winterforge-0.2.0/winterforge/protocols/disposition_state.py +80 -0
  449. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/protocols/resolvable.py +10 -4
  450. winterforge-0.2.0/winterforge/services/recomposition/__init__.py +193 -0
  451. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/testing/__init__.py +0 -0
  452. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/testing/cli.py +0 -0
  453. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/__init__.py +0 -0
  454. winterforge-0.2.0/winterforge/utils/class_cache.py +271 -0
  455. winterforge-0.2.0/winterforge/utils/class_lookup.py +72 -0
  456. winterforge-0.2.0/winterforge/utils/cli_sanitize.py +426 -0
  457. winterforge-0.2.0/winterforge/utils/concurrency.py +117 -0
  458. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/dependency_resolver.py +0 -0
  459. winterforge-0.2.0/winterforge/utils/dev_support.py +239 -0
  460. winterforge-0.2.0/winterforge/utils/encryption.py +252 -0
  461. winterforge-0.2.0/winterforge/utils/errors.py +92 -0
  462. winterforge-0.2.0/winterforge/utils/inspection.py +41 -0
  463. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/naming.py +12 -8
  464. winterforge-0.2.0/winterforge/utils/plugin_resolution.py +189 -0
  465. winterforge-0.2.0/winterforge/utils/protocol_generator.py +941 -0
  466. winterforge-0.2.0/winterforge/utils/serializers.py +276 -0
  467. winterforge-0.2.0/winterforge/utils/signature.py +363 -0
  468. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge/utils/sync.py +20 -0
  469. winterforge-0.2.0/winterforge.egg-info/PKG-INFO +222 -0
  470. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge.egg-info/SOURCES.txt +229 -145
  471. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge.egg-info/entry_points.txt +12 -7
  472. winterforge-0.2.0/winterforge.egg-info/top_level.txt +1 -0
  473. winterforge-0.1.0/PKG-INFO +0 -19
  474. winterforge-0.1.0/winterforge/frags/__init__.py +0 -35
  475. winterforge-0.1.0/winterforge/frags/base.py +0 -810
  476. winterforge-0.1.0/winterforge/frags/composition.py +0 -322
  477. winterforge-0.1.0/winterforge/frags/field_helpers.py +0 -194
  478. winterforge-0.1.0/winterforge/frags/manifest.py +0 -636
  479. winterforge-0.1.0/winterforge/frags/materialization.py +0 -124
  480. winterforge-0.1.0/winterforge/frags/mixins/trait_mixin.py +0 -112
  481. winterforge-0.1.0/winterforge/frags/primitives/__init__.py +0 -10
  482. winterforge-0.1.0/winterforge/frags/primitives/_base.py +0 -158
  483. winterforge-0.1.0/winterforge/frags/primitives/affinity.py +0 -108
  484. winterforge-0.1.0/winterforge/frags/primitives/manager.py +0 -88
  485. winterforge-0.1.0/winterforge/frags/primitives/trait.py +0 -96
  486. winterforge-0.1.0/winterforge/frags/registries/__init__.py +0 -5
  487. winterforge-0.1.0/winterforge/frags/registries/affinity_registry.py +0 -96
  488. winterforge-0.1.0/winterforge/frags/registries/permission_registry.py +0 -170
  489. winterforge-0.1.0/winterforge/frags/registries/trait_registry.py +0 -96
  490. winterforge-0.1.0/winterforge/frags/scope.py +0 -379
  491. winterforge-0.1.0/winterforge/frags/traits/__init__.py +0 -21
  492. winterforge-0.1.0/winterforge/frags/traits/authorizable.py +0 -230
  493. winterforge-0.1.0/winterforge/frags/traits/budget_aware.py +0 -107
  494. winterforge-0.1.0/winterforge/frags/traits/clearable.py +0 -22
  495. winterforge-0.1.0/winterforge/frags/traits/has_permission.py +0 -174
  496. winterforge-0.1.0/winterforge/frags/traits/has_roles.py +0 -239
  497. winterforge-0.1.0/winterforge/frags/traits/manifest.py +0 -22
  498. winterforge-0.1.0/winterforge/frags/traits/permissioned.py +0 -155
  499. winterforge-0.1.0/winterforge/frags/traits/registry.py +0 -27
  500. winterforge-0.1.0/winterforge/plugins/_protocols/bootstrapper.py +0 -41
  501. winterforge-0.1.0/winterforge/plugins/_protocols/resolver.py +0 -74
  502. winterforge-0.1.0/winterforge/plugins/auditors/_manager.py +0 -24
  503. winterforge-0.1.0/winterforge/plugins/bootstrap/__init__.py +0 -8
  504. winterforge-0.1.0/winterforge/plugins/bootstrap/application.py +0 -127
  505. winterforge-0.1.0/winterforge/plugins/bootstrap/bootstrap.py +0 -28
  506. winterforge-0.1.0/winterforge/plugins/bootstrap/bootstrapper_manager.py +0 -42
  507. winterforge-0.1.0/winterforge/plugins/bootstrap/database.py +0 -97
  508. winterforge-0.1.0/winterforge/plugins/bootstrap/env_var.py +0 -97
  509. winterforge-0.1.0/winterforge/plugins/bootstrap/framework_configuration.py +0 -83
  510. winterforge-0.1.0/winterforge/plugins/bootstrap/manager.py +0 -139
  511. winterforge-0.1.0/winterforge/plugins/bootstrap/materialization.py +0 -60
  512. winterforge-0.1.0/winterforge/plugins/bootstrap/plugin_configuration.py +0 -66
  513. winterforge-0.1.0/winterforge/plugins/bootstrap/yaml.py +0 -63
  514. winterforge-0.1.0/winterforge/plugins/cache/__init__.py +0 -6
  515. winterforge-0.1.0/winterforge/plugins/cache/_backend.py +0 -126
  516. winterforge-0.1.0/winterforge/plugins/cache/_listeners.py +0 -49
  517. winterforge-0.1.0/winterforge/plugins/data/_manager.py +0 -24
  518. winterforge-0.1.0/winterforge/plugins/decorators/bootstrapper.py +0 -54
  519. winterforge-0.1.0/winterforge/plugins/decorators/cli_command.py +0 -251
  520. winterforge-0.1.0/winterforge/plugins/decorators/emits.py +0 -225
  521. winterforge-0.1.0/winterforge/plugins/decorators/http_endpoint.py +0 -200
  522. winterforge-0.1.0/winterforge/plugins/decorators/scope.py +0 -41
  523. winterforge-0.1.0/winterforge/plugins/envoy/__init__.py +0 -6
  524. winterforge-0.1.0/winterforge/plugins/envoy/_manager.py +0 -30
  525. winterforge-0.1.0/winterforge/plugins/envoy/_protocol.py +0 -178
  526. winterforge-0.1.0/winterforge/plugins/envoy/claude.py +0 -295
  527. winterforge-0.1.0/winterforge/plugins/envoy/local_ollama.py +0 -259
  528. winterforge-0.1.0/winterforge/plugins/events/__init__.py +0 -13
  529. winterforge-0.1.0/winterforge/plugins/exporters/manager.py +0 -38
  530. winterforge-0.1.0/winterforge/plugins/extensions/_manager.py +0 -25
  531. winterforge-0.1.0/winterforge/plugins/identity/email_resolver.py +0 -37
  532. winterforge-0.1.0/winterforge/plugins/importers/manager.py +0 -37
  533. winterforge-0.1.0/winterforge/plugins/indexes/__init__.py +0 -6
  534. winterforge-0.1.0/winterforge/plugins/initializers/manager.py +0 -67
  535. winterforge-0.1.0/winterforge/plugins/permissions/__init__.py +0 -7
  536. winterforge-0.1.0/winterforge/plugins/query/__init__.py +0 -9
  537. winterforge-0.1.0/winterforge/plugins/query/_manager.py +0 -23
  538. winterforge-0.1.0/winterforge/plugins/query/_repository.py +0 -510
  539. winterforge-0.1.0/winterforge/plugins/query/affinity.py +0 -45
  540. winterforge-0.1.0/winterforge/plugins/query/condition_group/__init__.py +0 -118
  541. winterforge-0.1.0/winterforge/plugins/query/execution/_manager.py +0 -45
  542. winterforge-0.1.0/winterforge/plugins/query/scope.py +0 -73
  543. winterforge-0.1.0/winterforge/plugins/repository.py +0 -572
  544. winterforge-0.1.0/winterforge/plugins/resolvers/__init__.py +0 -5
  545. winterforge-0.1.0/winterforge/plugins/resolvers/manager.py +0 -41
  546. winterforge-0.1.0/winterforge/plugins/storage/manager.py +0 -24
  547. winterforge-0.1.0/winterforge/plugins/storage/postgresql.py +0 -751
  548. winterforge-0.1.0/winterforge/plugins/storage/sqlite.py +0 -1081
  549. winterforge-0.1.0/winterforge/plugins/storage/sqlite_old.py +0 -999
  550. winterforge-0.1.0/winterforge/utils/signature.py +0 -122
  551. winterforge-0.1.0/winterforge.egg-info/PKG-INFO +0 -19
  552. winterforge-0.1.0/winterforge.egg-info/top_level.txt +0 -3
  553. winterforge-0.1.0/winterforge_channels/__init__.py +0 -18
  554. winterforge-0.1.0/winterforge_channels/cli/__init__.py +0 -5
  555. winterforge-0.1.0/winterforge_channels/cli/channel_commands.py +0 -175
  556. winterforge-0.1.0/winterforge_channels/frags/traits/__init__.py +0 -19
  557. winterforge-0.1.0/winterforge_channels/frags/traits/conversable.py +0 -59
  558. winterforge-0.1.0/winterforge_channels/frags/traits/messageable.py +0 -75
  559. winterforge-0.1.0/winterforge_channels/frags/traits/routable.py +0 -54
  560. winterforge-0.1.0/winterforge_channels/frags/traits/subscribable.py +0 -90
  561. winterforge-0.1.0/winterforge_channels/frags/traits/transportable.py +0 -57
  562. winterforge-0.1.0/winterforge_channels/plugins/transports/__init__.py +0 -38
  563. winterforge-0.1.0/winterforge_channels/plugins/transports/http_egress.py +0 -163
  564. winterforge-0.1.0/winterforge_channels/plugins/transports/http_ingress.py +0 -122
  565. winterforge-0.1.0/winterforge_channels/plugins/transports/managers.py +0 -145
  566. winterforge-0.1.0/winterforge_channels/plugins/transports/protocols.py +0 -127
  567. winterforge-0.1.0/winterforge_channels/plugins/transports/websocket_egress.py +0 -202
  568. winterforge-0.1.0/winterforge_channels/primitives/__init__.py +0 -11
  569. winterforge-0.1.0/winterforge_channels/primitives/channel.py +0 -164
  570. winterforge-0.1.0/winterforge_channels/primitives/message.py +0 -162
  571. winterforge-0.1.0/winterforge_channels/primitives/subscription.py +0 -73
  572. winterforge-0.1.0/winterforge_channels/py.typed +0 -1
  573. winterforge-0.1.0/winterforge_channels/registries/__init__.py +0 -17
  574. winterforge-0.1.0/winterforge_channels/registries/channel_registry.py +0 -98
  575. winterforge-0.1.0/winterforge_channels/registries/message_registry.py +0 -138
  576. winterforge-0.1.0/winterforge_channels/registries/subscription_registry.py +0 -104
  577. winterforge-0.1.0/winterforge_dx_tools/__init__.py +0 -17
  578. winterforge-0.1.0/winterforge_dx_tools/builder.py +0 -154
  579. winterforge-0.1.0/winterforge_dx_tools/cli/__init__.py +0 -4
  580. winterforge-0.1.0/winterforge_dx_tools/cli/commands.py +0 -350
  581. winterforge-0.1.0/winterforge_dx_tools/elements/__init__.py +0 -15
  582. winterforge-0.1.0/winterforge_dx_tools/elements/builder_panel.py +0 -74
  583. winterforge-0.1.0/winterforge_dx_tools/elements/builder_progress.py +0 -81
  584. winterforge-0.1.0/winterforge_dx_tools/elements/builder_table.py +0 -100
  585. winterforge-0.1.0/winterforge_dx_tools/elements/builder_tree.py +0 -102
  586. winterforge-0.1.0/winterforge_dx_tools/elements/manager.py +0 -23
  587. winterforge-0.1.0/winterforge_dx_tools/elements/panel.py +0 -60
  588. winterforge-0.1.0/winterforge_dx_tools/elements/progress.py +0 -54
  589. winterforge-0.1.0/winterforge_dx_tools/elements/table.py +0 -76
  590. winterforge-0.1.0/winterforge_dx_tools/elements/tree.py +0 -79
  591. winterforge-0.1.0/winterforge_dx_tools/formatters/__init__.py +0 -9
  592. winterforge-0.1.0/winterforge_dx_tools/formatters/manager.py +0 -24
  593. winterforge-0.1.0/winterforge_dx_tools/formatters/prettier.py +0 -84
  594. winterforge-0.1.0/winterforge_dx_tools/generators/__init__.py +0 -1
  595. winterforge-0.1.0/winterforge_dx_tools/generators/generator.py +0 -132
  596. winterforge-0.1.0/winterforge_dx_tools/generators/templates.py +0 -54
  597. winterforge-0.1.0/winterforge_dx_tools/graphql/__init__.py +0 -1
  598. winterforge-0.1.0/winterforge_dx_tools/graphql/resolver_factory.py +0 -97
  599. winterforge-0.1.0/winterforge_dx_tools/graphql/schema_generator.py +0 -111
  600. winterforge-0.1.0/winterforge_dx_tools/graphql/server.py +0 -108
  601. winterforge-0.1.0/winterforge_dx_tools/graphql/type_mapper.py +0 -108
  602. winterforge-0.1.0/winterforge_dx_tools/migrations/__init__.py +0 -6
  603. winterforge-0.1.0/winterforge_dx_tools/migrations/executor.py +0 -189
  604. winterforge-0.1.0/winterforge_dx_tools/migrations/generator.py +0 -112
  605. winterforge-0.1.0/winterforge_dx_tools/migrations/template.py +0 -31
  606. winterforge-0.1.0/winterforge_dx_tools/migrations/tracker.py +0 -132
  607. winterforge-0.1.0/winterforge_dx_tools/openapi/__init__.py +0 -13
  608. winterforge-0.1.0/winterforge_dx_tools/openapi/generator.py +0 -168
  609. winterforge-0.1.0/winterforge_dx_tools/openapi/schemas.py +0 -135
  610. winterforge-0.1.0/winterforge_dx_tools/server/__init__.py +0 -7
  611. winterforge-0.1.0/winterforge_dx_tools/server/app.py +0 -78
  612. winterforge-0.1.0/winterforge_dx_tools/server/endpoint_generator.py +0 -144
  613. winterforge-0.1.0/winterforge_dx_tools/server/request_handler.py +0 -99
  614. winterforge-0.1.0/winterforge_dx_tools/server/response_handler.py +0 -89
  615. winterforge-0.1.0/winterforge_dx_tools/testing/__init__.py +0 -32
  616. winterforge-0.1.0/winterforge_dx_tools/testing/assertions.py +0 -169
  617. winterforge-0.1.0/winterforge_dx_tools/testing/builders.py +0 -221
  618. winterforge-0.1.0/winterforge_dx_tools/testing/factories.py +0 -189
  619. winterforge-0.1.0/winterforge_dx_tools/utils/__init__.py +0 -6
  620. winterforge-0.1.0/winterforge_dx_tools/utils/http_method_detector.py +0 -107
  621. winterforge-0.1.0/winterforge_dx_tools/utils/introspection.py +0 -80
  622. {winterforge-0.1.0 → winterforge-0.2.0}/README.md +0 -0
  623. {winterforge-0.1.0 → winterforge-0.2.0}/setup.cfg +0 -0
  624. {winterforge-0.1.0 → winterforge-0.2.0}/winterforge.egg-info/dependency_links.txt +0 -0
  625. {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.1.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.dx.elements"]
55
- panel = "winterforge_dx_tools.elements.builder_panel:PanelElement"
56
- table = "winterforge_dx_tools.elements.builder_table:TableElement"
57
- progress = "winterforge_dx_tools.elements.builder_progress:ProgressElement"
58
- tree = "winterforge_dx_tools.elements.builder_tree:TreeElement"
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
- frag_trait,
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
- frag_trait,
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
- @frag_trait()
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
- frag_trait,
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
- @frag_trait()
230
+ @trait()
231
231
  @root('trait-test')
232
232
  class TraitTest:
233
233
  pass
@@ -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.frags.traits.persistable import set_storage
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(affinities=['test'], traits=['fieldable', 'titled', 'persistable'])
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.frags.traits._manager import FragTraitManager
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
+ )