tigrbl_tests 0.3.10.dev2__tar.gz → 0.3.11__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 (281) hide show
  1. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/PKG-INFO +1 -1
  2. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/pyproject.toml +1 -1
  3. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/conftest.py +54 -37
  4. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_acronym_route_name.py +3 -3
  5. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_allow_anon.py +24 -23
  6. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_apikey_generation.py +6 -7
  7. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_authn_provider_integration.py +10 -6
  8. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_bindings_integration.py +28 -28
  9. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_bindings_modules.py +14 -16
  10. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_core_access.py +28 -25
  11. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_engine_install_uvicorn.py +1 -1
  12. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_engine_resolver_uvicorn.py +56 -53
  13. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_error_mappings.py +8 -7
  14. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_field_spec_effects.py +10 -10
  15. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_header_io_uvicorn.py +5 -5
  16. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_healthz_methodz_hookz.py +27 -27
  17. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_hook_ctx_v3_i9n.py +21 -23
  18. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_hook_lifecycle.py +11 -13
  19. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_iospec_attributes.py +11 -11
  20. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_iospec_integration.py +12 -14
  21. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_jsonrpc_batch_behavior.py +4 -4
  22. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_key_digest_uvicorn.py +7 -7
  23. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_list_filters_optional.py +2 -2
  24. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_mixins.py +38 -38
  25. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_mountable_favicon_uvicorn.py +7 -7
  26. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_mountable_lens_uvicorn.py +9 -9
  27. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_mountable_openapi_uvicorn.py +5 -5
  28. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_mountable_openrpc_uvicorn.py +17 -15
  29. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_mountable_swagger_uvicorn.py +5 -5
  30. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_nested_path_schema_and_rpc.py +2 -2
  31. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_nested_routing_depth.py +9 -9
  32. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_op_ctx_alias_examples.py +3 -3
  33. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_op_ctx_behavior.py +24 -25
  34. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_op_ctx_core_crud_order.py +8 -8
  35. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_openapi_clear_response_schema.py +4 -4
  36. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_openapi_schema_examples_presence.py +11 -11
  37. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_owner_tenant_policy.py +19 -14
  38. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_request_extras.py +15 -15
  39. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_rest_fallback_serialization.py +6 -6
  40. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_rest_row_serialization.py +6 -6
  41. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_row_result_serialization.py +6 -6
  42. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_schema.py +4 -4
  43. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_schema_ctx_attributes_integration.py +17 -17
  44. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_schema_ctx_op_ctx_integration.py +7 -7
  45. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_schema_ctx_spec_integration.py +17 -19
  46. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_sqlite_attachments.py +4 -4
  47. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_storage_spec_integration.py +28 -28
  48. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_symmetry_parity.py +3 -3
  49. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_tigrbl_api_app_usage_uvicorn.py +19 -16
  50. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_tigrbl_api_usage_uvicorn.py +15 -14
  51. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_tigrbl_api_uvicorn.py +10 -10
  52. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_tigrbl_app_include_api_uvicorn.py +34 -29
  53. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_tigrbl_app_multi_api_uvicorn.py +15 -13
  54. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_tigrbl_app_usage_uvicorn.py +3 -2
  55. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_tigrbl_app_uvicorn.py +1 -1
  56. tigrbl_tests-0.3.11/tests/i9n/test_transport_dispatch_parity.py +141 -0
  57. tigrbl_tests-0.3.11/tests/i9n/test_types_deprecation_exports.py +44 -0
  58. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_v3_bulk_rest_endpoints.py +5 -5
  59. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_v3_default_rest_ops.py +6 -6
  60. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_v3_default_rpc_ops.py +29 -29
  61. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_verb_alias_policy.py +18 -18
  62. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/mount/test_mount_favico.py +40 -44
  63. tigrbl_tests-0.3.11/tests/options/test_rest_options.py +57 -0
  64. tigrbl_tests-0.3.11/tests/options/test_rpc_options.py +54 -0
  65. tigrbl_tests-0.3.11/tests/parity/test_hook_runtime_phase_parity.py +6 -0
  66. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/parity/test_stdapi_openapi_docs.py +9 -2
  67. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/parity/test_stdapi_primitives.py +3 -1
  68. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/parity/test_stdapi_routing.py +18 -3
  69. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/perf/test_hookz_performance.py +2 -2
  70. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/request/test_request_asgi_scope_compat.py +2 -0
  71. tigrbl_tests-0.3.11/tests/request/test_request_authn_strip.py +33 -0
  72. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/request/test_request_transport_convenience_dot_notation.py +17 -0
  73. tigrbl_tests-0.3.11/tests/response/test_response_transport_convenience_dot_notation.py +50 -0
  74. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/security/test_dot_notation_schemes.py +1 -1
  75. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/security/test_schemes.py +2 -2
  76. tigrbl_tests-0.3.11/tests/test_secdeps_execute_in_pre_tx.py +144 -0
  77. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/decorators/test_engine_ctx_bindings.py +6 -6
  78. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/decorators/test_op_ctx_bindings.py +14 -11
  79. tigrbl_tests-0.3.11/tests/unit/runtime/test_compilation_runtime_behavior.py +26 -0
  80. tigrbl_tests-0.3.11/tests/unit/runtime/test_events_phases.py +27 -0
  81. tigrbl_tests-0.3.11/tests/unit/runtime/test_events_runtime_behavior.py +30 -0
  82. tigrbl_tests-0.3.11/tests/unit/runtime/test_kernel_plan_event_ordering.py +76 -0
  83. tigrbl_tests-0.3.11/tests/unit/runtime/test_kernel_plan_full_ordering.py +182 -0
  84. tigrbl_tests-0.3.11/tests/unit/runtime/test_kernel_runtime_behavior.py +30 -0
  85. tigrbl_tests-0.3.11/tests/unit/runtime/test_ordering_runtime_behavior.py +35 -0
  86. tigrbl_tests-0.3.11/tests/unit/test_api_level_set_auth.py +36 -0
  87. tigrbl_tests-0.3.11/tests/unit/test_app_model_defaults.py +27 -0
  88. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_base_facade_initialize.py +24 -20
  89. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_column_rest_rpc_results.py +43 -31
  90. tigrbl_tests-0.3.11/tests/unit/test_default_schema_selection.py +117 -0
  91. tigrbl_tests-0.3.11/tests/unit/test_engine_install_api.py +28 -0
  92. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_engine_install_app.py +3 -3
  93. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_engine_install_op.py +2 -2
  94. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_engine_usage_levels.py +10 -8
  95. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_file_response.py +17 -20
  96. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_hookz_empty_phase.py +4 -4
  97. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_include_model_columns_namespace.py +4 -4
  98. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_include_models_base_prefix.py +4 -4
  99. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_initialize_async_task.py +1 -1
  100. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_initialize_cross_ddl.py +4 -4
  101. tigrbl_tests-0.3.11/tests/unit/test_initialize_mixed_engines.py +40 -0
  102. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_initialize_task_schedule.py +4 -4
  103. tigrbl_tests-0.3.11/tests/unit/test_instance_naming_conventions.py +74 -0
  104. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_jsonrpc_openrpc.py +36 -12
  105. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_jsonrpc_router_default_tag.py +2 -2
  106. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_kernel_opview_on_demand.py +2 -2
  107. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_kernelz_endpoint.py +4 -4
  108. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_op_class_engine_binding.py +7 -7
  109. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_op_ctx_dynamic_attach.py +3 -3
  110. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_op_ctx_persist_options.py +2 -2
  111. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_openapi_openrpc_schema_separation.py +2 -2
  112. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_resolver_interning_warmup.py +4 -4
  113. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_resolver_precedence.py +9 -9
  114. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_alias_table_rpc.py +6 -6
  115. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_ctx_precedence.py +5 -5
  116. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_diagnostics_kernelz.py +8 -8
  117. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_html_jinja_behavior.py +9 -9
  118. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_parity.py +2 -2
  119. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_rpc.py +8 -8
  120. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rest_all_default_op_verbs.py +1 -1
  121. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rest_no_schema_jsonable.py +5 -5
  122. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rest_operation_id_uniqueness.py +14 -5
  123. tigrbl_tests-0.3.11/tests/unit/test_rest_output_serialization_extras.py +52 -0
  124. tigrbl_tests-0.3.11/tests/unit/test_rest_request_mapping_access.py +99 -0
  125. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rest_rpc_parity_default_ops.py +8 -8
  126. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rest_rpc_prefixes.py +10 -10
  127. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rest_rpc_symmetry.py +2 -2
  128. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_router_compatibility_shims.py +12 -4
  129. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rpc_all_default_op_verbs.py +48 -48
  130. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rpc_default_ops.py +34 -34
  131. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_schema_spec_presence.py +3 -3
  132. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_security_per_route.py +23 -12
  133. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_api.py +10 -10
  134. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_app.py +3 -3
  135. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_sqlite_attachments.py +8 -8
  136. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_stdapi_request_injection.py +10 -4
  137. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_stdapi_transport_asgi_wsgi.py +55 -23
  138. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_system_docs_builders.py +3 -1
  139. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_api_app_configuration.py +26 -23
  140. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_api_app_instantiation.py +13 -12
  141. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_api_app_subclass_definition.py +11 -11
  142. tigrbl_tests-0.3.11/tests/unit/test_tigrbl_api_configuration.py +61 -0
  143. tigrbl_tests-0.3.11/tests/unit/test_tigrbl_api_instantiation.py +37 -0
  144. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_api_subclass_definition.py +9 -9
  145. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_app_configuration.py +7 -1
  146. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_app_instantiation.py +1 -1
  147. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_app_subclass_definition.py +3 -3
  148. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_v3_healthz_endpoint.py +2 -2
  149. tigrbl_tests-0.3.10.dev2/tests/response/test_response_transport_convenience_dot_notation.py +0 -27
  150. tigrbl_tests-0.3.10.dev2/tests/unit/runtime/test_events_phases.py +0 -14
  151. tigrbl_tests-0.3.10.dev2/tests/unit/test_api_level_set_auth.py +0 -25
  152. tigrbl_tests-0.3.10.dev2/tests/unit/test_app_model_defaults.py +0 -28
  153. tigrbl_tests-0.3.10.dev2/tests/unit/test_engine_install_api.py +0 -28
  154. tigrbl_tests-0.3.10.dev2/tests/unit/test_initialize_mixed_engines.py +0 -41
  155. tigrbl_tests-0.3.10.dev2/tests/unit/test_tigrbl_api_configuration.py +0 -59
  156. tigrbl_tests-0.3.10.dev2/tests/unit/test_tigrbl_api_instantiation.py +0 -37
  157. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/LICENSE +0 -0
  158. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/README.md +0 -0
  159. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/__init__.py +0 -0
  160. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/hooks/test_hook_ctx_phase_validation.py +0 -0
  161. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/__init__.py +0 -0
  162. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_bulk_docs_client.py +0 -0
  163. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_opspec_effects_i9n_test.py +0 -0
  164. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_request_extras_provider.py +0 -0
  165. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_response_extras_provider.py +0 -0
  166. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_rest_rpc_parity_v3.py +0 -0
  167. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/test_v3_opspec_attributes.py +0 -0
  168. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/i9n/uvicorn_utils.py +0 -0
  169. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/mount/__init__.py +0 -0
  170. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/parity/__init__.py +0 -0
  171. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/perf/__init__.py +0 -0
  172. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/perf/test_collect_caching.py +0 -0
  173. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/perf/test_methodz_performance.py +0 -0
  174. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/request/test_request_dot_notation.py +0 -0
  175. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/request/test_request_response_conveniences.py +0 -0
  176. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/requests/test_request_json_modes.py +0 -0
  177. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/response/test_response_dot_notation.py +0 -0
  178. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/__init__.py +0 -0
  179. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/decorators/test_alias_ctx_bindings.py +0 -0
  180. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/decorators/test_hook_ctx_bindings.py +0 -0
  181. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/decorators/test_op_alias_bindings.py +0 -0
  182. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/decorators/test_response_ctx_bindings.py +0 -0
  183. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/decorators/test_schema_ctx_bindings.py +0 -0
  184. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/response_utils.py +0 -0
  185. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_emit_paired_post.py +0 -0
  186. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_emit_paired_pre.py +0 -0
  187. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_emit_readtime_alias.py +0 -0
  188. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_out_masking.py +0 -0
  189. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_refresh_demand.py +0 -0
  190. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_resolve_assemble.py +0 -0
  191. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_resolve_paired_gen.py +0 -0
  192. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_schema_collect_in.py +0 -0
  193. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_schema_collect_out.py +0 -0
  194. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_storage_to_stored.py +0 -0
  195. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_wire_build_in.py +0 -0
  196. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_wire_build_out.py +0 -0
  197. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_wire_dump.py +0 -0
  198. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/runtime/atoms/test_wire_validate_in.py +0 -0
  199. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_acol_vcol_knobs.py +0 -0
  200. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_alias_ctx_op_alias_attributes.py +0 -0
  201. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_alias_ctx_op_attributes.py +0 -0
  202. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_app_reexport.py +0 -0
  203. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_base_columnspec_inheritance.py +0 -0
  204. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_build_list_params_spec_model.py +0 -0
  205. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_bulk_body_annotation.py +0 -0
  206. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_bulk_response_schema.py +0 -0
  207. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_colspec_map_isolation.py +0 -0
  208. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_column_collect_mixins.py +0 -0
  209. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_column_table_orm_binding.py +0 -0
  210. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_config_dataclass_none.py +0 -0
  211. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_core_crud_bulk_ops.py +0 -0
  212. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_core_crud_default_ops.py +0 -0
  213. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_core_crud_methods.py +0 -0
  214. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_core_wrap_memoization.py +0 -0
  215. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_db_dependency.py +0 -0
  216. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_decorator_and_collect.py +0 -0
  217. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_default_tags.py +0 -0
  218. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_engine_install_table.py +0 -0
  219. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_engine_spec_and_shortcuts.py +0 -0
  220. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_field_spec_attrs.py +0 -0
  221. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_get_schema.py +0 -0
  222. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_handler_step_qualname.py +0 -0
  223. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_hook_ctx_attributes.py +0 -0
  224. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_hook_ctx_binding.py +0 -0
  225. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_hybrid_session_run_sync.py +0 -0
  226. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_in_tx.py +0 -0
  227. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_io_spec_attributes.py +0 -0
  228. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_iospec_attributes.py +0 -0
  229. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_iospec_effects.py +0 -0
  230. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_jsonrpc_id_example.py +0 -0
  231. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_kernel_invoke_ctx.py +0 -0
  232. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_kernel_plan_labels.py +0 -0
  233. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_make_column_shortcuts.py +0 -0
  234. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_middleware_http_and_cors.py +0 -0
  235. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_mixins_sqlalchemy.py +0 -0
  236. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_op_alias.py +0 -0
  237. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_op_ctx_arity_paths.py +0 -0
  238. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_op_ctx_attributes.py +0 -0
  239. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_op_ctx_core_crud_integration.py +0 -0
  240. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_opspec_effects.py +0 -0
  241. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_postgres_engine_errors.py +0 -0
  242. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_postgres_env_vars.py +0 -0
  243. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_relationship_alias_cols.py +0 -0
  244. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_request_body_schema.py +0 -0
  245. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_request_response_examples.py +0 -0
  246. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_rest.py +0 -0
  247. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_template.py +0 -0
  248. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_response_uuid.py +0 -0
  249. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_rest_bulk_delete_suppresses_clear.py +0 -0
  250. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_schema_ctx_attributes.py +0 -0
  251. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_schema_ctx_plain_class.py +0 -0
  252. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_schemas_binding.py +0 -0
  253. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_should_wire_canonical.py +0 -0
  254. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_column.py +0 -0
  255. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_engine.py +0 -0
  256. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_field.py +0 -0
  257. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_hook.py +0 -0
  258. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_io.py +0 -0
  259. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_op.py +0 -0
  260. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_storage.py +0 -0
  261. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_spec_table.py +0 -0
  262. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_sqlite_uuid_type.py +0 -0
  263. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_storage_spec_attributes.py +0 -0
  264. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_sys_handler_crud.py +0 -0
  265. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_sys_run_rollback.py +0 -0
  266. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_sys_tx_async_begin.py +0 -0
  267. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_sys_tx_begin.py +0 -0
  268. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_sys_tx_commit.py +0 -0
  269. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_table_base_exports.py +0 -0
  270. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_table_collect_spec.py +0 -0
  271. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_table_columns_namespace.py +0 -0
  272. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_table_namespace_init.py +0 -0
  273. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_table_namespace_isolation.py +0 -0
  274. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_app_event_handlers.py +0 -0
  275. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_tigrbl_app_state.py +0 -0
  276. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_v3_favicon_endpoint.py +0 -0
  277. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_v3_op_alias.py +0 -0
  278. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_v3_op_ctx_attributes.py +0 -0
  279. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_v3_schemas_and_decorators.py +0 -0
  280. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_v3_storage_spec_attributes.py +0 -0
  281. {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11}/tests/unit/test_verbosity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl_tests
3
- Version: 0.3.10.dev2
3
+ Version: 0.3.11
4
4
  Summary: Test suite and fixtures for the Tigrbl framework.
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl_tests"
3
- version = "0.3.10.dev2"
3
+ version = "0.3.11"
4
4
  description = "Test suite and fixtures for the Tigrbl framework."
5
5
  license = "Apache-2.0"
6
6
  readme = "README.md"
@@ -45,7 +45,7 @@ def _run_coro_sync(coro):
45
45
  return result.get("value")
46
46
 
47
47
 
48
- def _patch_httpx_asgi_transport_sync_api() -> None:
48
+ def _patch_httpx_asgi_transport_sync_router() -> None:
49
49
  """Bridge HTTPX ASGITransport async-only API for sync httpx.Client tests."""
50
50
 
51
51
  if not hasattr(ASGITransport, "close"):
@@ -75,7 +75,7 @@ def _patch_httpx_asgi_transport_sync_api() -> None:
75
75
  ASGITransport.handle_request = handle_request
76
76
 
77
77
 
78
- _patch_httpx_asgi_transport_sync_api()
78
+ _patch_httpx_asgi_transport_sync_router()
79
79
 
80
80
 
81
81
  def _reset_tigrbl_state() -> None:
@@ -174,31 +174,45 @@ async def async_db_session():
174
174
 
175
175
 
176
176
  @pytest.fixture
177
- def create_test_api():
177
+ def create_test_app():
178
+ """Factory fixture to create initialized app instances for single-model tests."""
179
+
180
+ def _create_app(model_class):
181
+ Base.metadata.clear()
182
+ app = TigrblApp(engine=mem(async_=False))
183
+ app.include_table(model_class)
184
+ app.initialize()
185
+ return app
186
+
187
+ return _create_app
188
+
189
+
190
+ @pytest.fixture
191
+ def create_test_router():
178
192
  """Factory fixture to create Tigrbl instances for testing individual models."""
179
193
 
180
- def _create_api(model_class):
194
+ def _create_router(model_class):
181
195
  """Create Tigrbl instance with a single model for testing."""
182
196
  Base.metadata.clear()
183
- api = TigrblApp(engine=mem(async_=False))
184
- api.include_model(model_class)
185
- api.initialize()
186
- return api
197
+ app = TigrblApp(engine=mem(async_=False))
198
+ app.include_table(model_class)
199
+ app.initialize()
200
+ return app.router
187
201
 
188
- return _create_api
202
+ return _create_router
189
203
 
190
204
 
191
205
  @pytest_asyncio.fixture
192
- async def create_test_api_async():
206
+ async def create_test_router_async():
193
207
  """Factory fixture to create async Tigrbl instances for testing individual models."""
194
208
 
195
- def _create_api_async(model_class):
209
+ def _create_app_async(model_class):
196
210
  Base.metadata.clear()
197
- api = TigrblApp(engine=mem())
198
- api.include_model(model_class)
199
- return api
211
+ app = TigrblApp(engine=mem())
212
+ app.include_table(model_class)
213
+ return app
200
214
 
201
- return _create_api_async
215
+ return _create_app_async
202
216
 
203
217
 
204
218
  @pytest.fixture
@@ -226,7 +240,7 @@ def test_models():
226
240
 
227
241
 
228
242
  @pytest_asyncio.fixture()
229
- async def api_client(db_mode):
243
+ async def router_client(db_mode):
230
244
  """Main fixture for integration tests with Tenant and Item models."""
231
245
  Base.metadata.clear()
232
246
 
@@ -252,24 +266,29 @@ async def api_client(db_mode):
252
266
  def __tigrbl_nested_paths__(cls):
253
267
  return "/tenant/{tenant_id}/item"
254
268
 
255
- fastapi_app = TigrblApp()
269
+ app = TigrblApp()
256
270
 
257
271
  if db_mode == "async":
258
- api = TigrblApp(engine=mem())
259
- api.include_models([Tenant, Item])
260
- await api.initialize()
272
+ app = TigrblApp(engine=mem())
273
+ app.include_tables([Tenant, Item])
274
+ await app.initialize()
261
275
 
262
276
  else:
263
- api = TigrblApp(engine=mem(async_=False))
264
- api.include_models([Tenant, Item])
265
- api.initialize()
277
+ app = TigrblApp(engine=mem(async_=False))
278
+ app.include_tables([Tenant, Item])
279
+ app.initialize()
266
280
 
267
- api.mount_jsonrpc()
268
- fastapi_app.include_router(api.router)
269
- transport = ASGITransport(app=fastapi_app)
281
+ app.mount_jsonrpc()
282
+ transport = ASGITransport(app=app)
270
283
 
271
284
  client = AsyncClient(transport=transport, base_url="http://test")
272
- return client, api, Item
285
+ return client, app, Item
286
+
287
+
288
+ @pytest_asyncio.fixture()
289
+ async def app_client(router_client):
290
+ """Backwards-compatible alias for integration tests expecting app_client."""
291
+ return router_client
273
292
 
274
293
 
275
294
  @pytest.fixture
@@ -289,7 +308,7 @@ def sample_item_data():
289
308
 
290
309
 
291
310
  @pytest_asyncio.fixture()
292
- async def api_client_v3():
311
+ async def router_client_v3():
293
312
  Base.metadata.clear()
294
313
 
295
314
  class Widget(Base):
@@ -332,15 +351,13 @@ async def api_client_v3():
332
351
  }
333
352
 
334
353
  cfg = mem()
335
- fastapi_app = TigrblApp()
336
- api = TigrblApp(engine=cfg)
337
- api.include_model(Widget, prefix="")
338
- api.mount_jsonrpc()
339
- api.attach_diagnostics()
340
- await api.initialize()
354
+ app = TigrblApp(engine=cfg)
355
+ app.include_table(Widget, prefix="")
356
+ app.mount_jsonrpc()
357
+ app.attach_diagnostics()
358
+ await app.initialize()
341
359
  prov = _resolver.resolve_provider()
342
360
  _, session_maker = prov.ensure()
343
- fastapi_app.include_router(api.router)
344
- transport = ASGITransport(app=fastapi_app)
361
+ transport = ASGITransport(app=app)
345
362
  client = AsyncClient(transport=transport, base_url="http://test")
346
- return client, api, Widget, session_maker
363
+ return client, app, Widget, session_maker
@@ -5,12 +5,12 @@ from tigrbl.types import Column, String
5
5
 
6
6
 
7
7
  @pytest.mark.i9n
8
- def test_acronym_model_route(create_test_api):
8
+ def test_acronym_model_route(create_test_router):
9
9
  class GPGKey(Base, GUIDPk):
10
10
  __tablename__ = "gpg_keys"
11
11
  key = Column(String, nullable=False)
12
12
 
13
- api = create_test_api(GPGKey)
14
- paths = {route.path for route in api.router.routes}
13
+ router = create_test_router(GPGKey)
14
+ paths = {route.path for route in router.routes}
15
15
  assert "/gpgkey" in paths
16
16
  assert all("g_p_g_key" not in p for p in paths)
@@ -1,10 +1,12 @@
1
1
  from httpx import ASGITransport, Client
2
- from tigrbl.security import HTTPAuthorizationCredentials, HTTPBearer
2
+ from tigrbl.security import HTTPAuthorizationCredentials, HTTPBearer, Security
3
+ from tigrbl.requests import Request
4
+ from tigrbl.runtime.status import HTTPException
3
5
  from tigrbl.engine import resolver as _resolver
4
6
  from tigrbl.engine.shortcuts import mem
5
7
  from sqlalchemy.orm import sessionmaker
6
8
 
7
- from tigrbl import TigrblApp
9
+ from tigrbl import TigrblApp, TigrblRouter
8
10
  from tigrbl.orm.mixins import GUIDPk
9
11
  from tigrbl.orm.tables import Base
10
12
  from tigrbl.config.constants import TIGRBL_AUTH_CONTEXT_ATTR
@@ -13,10 +15,7 @@ from tigrbl.types import (
13
15
  AuthNProvider,
14
16
  Column,
15
17
  ForeignKey,
16
- HTTPException,
17
18
  PgUUID,
18
- Request,
19
- Security,
20
19
  String,
21
20
  uuid4,
22
21
  )
@@ -61,12 +60,12 @@ def _build_client():
61
60
 
62
61
  cfg = mem(async_=False)
63
62
  auth = DummyAuth()
64
- api = TigrblApp(engine=cfg)
65
- api.set_auth(authn=auth.get_principal)
66
- api.include_models([Tenant, Item])
67
- api.initialize()
63
+ router = TigrblRouter(engine=cfg)
64
+ router.set_auth(authn=auth.get_principal)
65
+ router.include_tables([Tenant, Item])
66
+ router.initialize()
68
67
  app = TigrblApp()
69
- app.include_router(api.router)
68
+ app.include_router(router)
70
69
  prov = _resolver.resolve_provider()
71
70
  engine, maker = prov.ensure()
72
71
  SessionLocal = sessionmaker(bind=engine, expire_on_commit=False)
@@ -93,12 +92,12 @@ def _build_client_attr():
93
92
 
94
93
  cfg = mem(async_=False)
95
94
  auth = DummyAuth()
96
- api = TigrblApp(engine=cfg)
97
- api.set_auth(authn=auth.get_principal)
98
- api.include_models([Tenant, Item])
99
- api.initialize()
95
+ router = TigrblRouter(engine=cfg)
96
+ router.set_auth(authn=auth.get_principal)
97
+ router.include_tables([Tenant, Item])
98
+ router.initialize()
100
99
  app = TigrblApp()
101
- app.include_router(api.router)
100
+ app.include_router(router)
102
101
  prov = _resolver.resolve_provider()
103
102
  engine, maker = prov.ensure()
104
103
  SessionLocal = sessionmaker(bind=engine, expire_on_commit=False)
@@ -162,11 +161,12 @@ def _build_client_create_noauth():
162
161
  return {"create", "bulk_create"}
163
162
 
164
163
  cfg = mem(async_=False)
165
- api = TigrblApp(engine=cfg)
166
- api.include_models([Tenant, Item])
167
- api.initialize()
164
+ router = TigrblRouter(engine=cfg)
165
+ router.include_tables([Tenant, Item])
166
+ router.initialize()
167
+
168
168
  app = TigrblApp()
169
- app.include_router(api.router)
169
+ app.include_router(router)
170
170
  prov = _resolver.resolve_provider()
171
171
  engine, maker = prov.ensure()
172
172
  SessionLocal = sessionmaker(bind=engine, expire_on_commit=False)
@@ -192,11 +192,12 @@ def _build_client_create_attr_noauth():
192
192
  __tigrbl_allow_anon__ = {"create", "bulk_create"}
193
193
 
194
194
  cfg = mem(async_=False)
195
- api = TigrblApp(engine=cfg)
196
- api.include_models([Tenant, Item])
197
- api.initialize()
195
+ router = TigrblRouter(engine=cfg)
196
+ router.include_tables([Tenant, Item])
197
+ router.initialize()
198
+
198
199
  app = TigrblApp()
199
- app.include_router(api.router)
200
+ app.include_router(router)
200
201
  prov = _resolver.resolve_provider()
201
202
  engine, maker = prov.ensure()
202
203
  SessionLocal = sessionmaker(bind=engine, expire_on_commit=False)
@@ -1,5 +1,6 @@
1
1
  import pytest
2
2
  from tigrbl import TigrblApp
3
+ from tigrbl.engine.shortcuts import mem
3
4
  from tigrbl.types import Mapped, String
4
5
  from httpx import ASGITransport, AsyncClient
5
6
 
@@ -30,15 +31,13 @@ class ConcreteApiKey(Base, GUIDPk, Created, LastUsed, ValidityWindow, KeyDigest)
30
31
 
31
32
  @pytest.mark.i9n
32
33
  @pytest.mark.asyncio
33
- async def test_api_key_creation_requires_valid_payload(sync_db_session):
34
+ async def test_router_key_creation_requires_valid_payload(sync_db_session):
34
35
  """Posting without required fields yields an unprocessable entity response."""
35
- _, get_sync_db = sync_db_session
36
+ cfg, _ = sync_db_session
36
37
 
37
- app = TigrblApp()
38
- api = TigrblApp(get_db=get_sync_db)
39
- api.include_models([ConcreteApiKey])
40
- api.initialize()
41
- app.include_router(api.router)
38
+ app = TigrblApp(engine=mem(async_=False))
39
+ app.include_tables([ConcreteApiKey])
40
+ app.initialize()
42
41
  transport = ASGITransport(app=app)
43
42
 
44
43
  async with AsyncClient(transport=transport, base_url="http://test") as client:
@@ -2,7 +2,6 @@ from httpx import ASGITransport, Client
2
2
 
3
3
  from tigrbl.security import HTTPAuthorizationCredentials, HTTPBearer
4
4
  from tigrbl.engine.shortcuts import mem
5
- from tigrbl.types import HTTPException, Request, Security
6
5
 
7
6
  from tigrbl import TigrblApp, Base, hook_ctx
8
7
  from tigrbl.config.constants import TIGRBL_AUTH_CONTEXT_ATTR
@@ -10,6 +9,11 @@ from tigrbl.orm.mixins import GUIDPk
10
9
  from tigrbl.types.authn_abc import AuthNProvider
11
10
 
12
11
 
12
+ from tigrbl.runtime.status import HTTPException
13
+ from tigrbl.requests import Request
14
+ from tigrbl.security import Security
15
+
16
+
13
17
  class HookedAuth(AuthNProvider):
14
18
  """Simple AuthN provider that records context via hooks."""
15
19
 
@@ -40,11 +44,11 @@ def _build_client_with_auth():
40
44
  async def capture(cls, ctx):
41
45
  auth.ctx_principal = ctx.get("auth_context")
42
46
 
43
- api = TigrblApp(engine=mem(async_=False))
44
- api.set_auth(authn=auth.get_principal)
45
- api.include_model(Tenant)
46
- api.initialize()
47
- transport = ASGITransport(app=api)
47
+ app = TigrblApp(engine=mem(async_=False))
48
+ app.set_auth(authn=auth.get_principal)
49
+ app.include_table(Tenant)
50
+ app.initialize()
51
+ transport = ASGITransport(app=app)
48
52
  return Client(transport=transport, base_url="http://test"), auth
49
53
 
50
54
 
@@ -12,8 +12,8 @@ from tigrbl.orm.mixins import GUIDPk
12
12
  from tigrbl.specs import IO, S, acol
13
13
  from tigrbl.bindings import (
14
14
  bind,
15
- include_model,
16
- include_models,
15
+ include_table,
16
+ include_tables,
17
17
  rpc_call,
18
18
  rebind,
19
19
  )
@@ -55,24 +55,24 @@ def _make_db():
55
55
  return engine, db
56
56
 
57
57
 
58
- def test_include_model_and_rpc_call():
58
+ def test_include_table_and_rpc_call():
59
59
  engine, db = _make_db()
60
- api = SimpleNamespace(engine=engine)
61
- _resolver.register_api(api, engine)
62
-
63
- include_model(api, Widget, mount_router=False)
64
-
65
- # api facade populated
66
- assert api.models["Widget"] is Widget
67
- assert hasattr(api.schemas, "Widget")
68
- assert hasattr(api.handlers, "Widget")
69
- assert hasattr(api.hooks, "Widget")
70
- assert hasattr(api.rpc, "Widget")
71
- assert hasattr(api.rest, "Widget")
72
- assert "Widget" in api.routers
73
- assert "Widget" in api.columns
74
- assert "Widget" in api.table_config
75
- assert hasattr(api.core, "Widget")
60
+ router = SimpleNamespace(engine=engine)
61
+ _resolver.register_router(router, engine)
62
+
63
+ include_table(router, Widget, mount_router=False)
64
+
65
+ # router facade populated
66
+ assert router.models["Widget"] is Widget
67
+ assert hasattr(router.schemas, "Widget")
68
+ assert hasattr(router.handlers, "Widget")
69
+ assert hasattr(router.hooks, "Widget")
70
+ assert hasattr(router.rpc, "Widget")
71
+ assert hasattr(router.rest, "Widget")
72
+ assert "Widget" in router.routers
73
+ assert "Widget" in router.columns
74
+ assert "Widget" in router.table_config
75
+ assert hasattr(router.core, "Widget")
76
76
 
77
77
  # model namespaces
78
78
  assert hasattr(Widget, TIGRBL_GET_DB_ATTR)
@@ -82,21 +82,21 @@ def test_include_model_and_rpc_call():
82
82
  phases = build_phase_chains(Widget, "create")
83
83
  assert phases["HANDLER"], "phase lifecycle must contain handler step"
84
84
 
85
- asyncio.run(rpc_call(api, Widget, "create", {"id": uuid4(), "name": "w"}, db=db))
86
- rows = asyncio.run(rpc_call(api, Widget, "list", {}, db=db))
85
+ asyncio.run(rpc_call(router, Widget, "create", {"id": uuid4(), "name": "w"}, db=db))
86
+ rows = asyncio.run(rpc_call(router, Widget, "list", {}, db=db))
87
87
  assert rows and rows[0]["name"] == "w"
88
88
 
89
89
 
90
- def test_include_models():
90
+ def test_include_tables():
91
91
  engine, db = _make_db()
92
- api = SimpleNamespace(engine=engine)
93
- _resolver.register_api(api, engine)
92
+ router = SimpleNamespace(engine=engine)
93
+ _resolver.register_router(router, engine)
94
94
 
95
- include_models(api, [Widget, Gizmo], mount_router=False)
95
+ include_tables(router, [Widget, Gizmo], mount_router=False)
96
96
 
97
- assert set(api.models) == {"Widget", "Gizmo"}
98
- assert hasattr(api.schemas, "Widget")
99
- assert hasattr(api.schemas, "Gizmo")
97
+ assert set(router.models) == {"Widget", "Gizmo"}
98
+ assert hasattr(router.schemas, "Widget")
99
+ assert hasattr(router.schemas, "Gizmo")
100
100
 
101
101
 
102
102
  def test_bind_and_rebind():
@@ -9,15 +9,13 @@ from tigrbl.types import (
9
9
  String,
10
10
  )
11
11
 
12
- from tigrbl.bindings import (
13
- api as api_binding,
14
- columns as columns_binding,
15
- handlers as handlers_binding,
16
- hooks as hooks_binding,
17
- model as model_binding,
18
- rest as rest_binding,
19
- rpc as rpc_binding,
20
- )
12
+ import tigrbl.bindings.columns as columns_binding
13
+ import tigrbl.bindings.handlers as handlers_binding
14
+ import tigrbl.bindings.hooks as hooks_binding
15
+ import tigrbl.bindings.model as model_binding
16
+ import tigrbl.bindings.rest as rest_binding
17
+ import tigrbl.bindings.router as router_binding
18
+ import tigrbl.bindings.rpc as rpc_binding
21
19
  from tigrbl.bindings.schemas import build_and_attach as schemas_build_and_attach
22
20
  from tigrbl.specs import ColumnSpec, F, IO, S
23
21
  from tigrbl.op import resolve
@@ -117,12 +115,12 @@ def test_model_bind_and_rebind(model_cls):
117
115
 
118
116
  @pytest.mark.i9n
119
117
  @pytest.mark.asyncio
120
- async def test_api_include_and_rpc_call(monkeypatch, model_cls):
118
+ async def test_router_include_and_rpc_call(monkeypatch, model_cls):
121
119
  model_binding.bind(model_cls)
122
- api = SimpleNamespace()
123
- api_binding.include_model(api, model_cls, mount_router=False)
124
- assert model_cls.__name__ in api.models
125
- routers = api_binding.include_models(
120
+ router = SimpleNamespace()
121
+ router_binding.include_table(router, model_cls, mount_router=False)
122
+ assert model_cls.__name__ in router.models
123
+ routers = router_binding.include_tables(
126
124
  SimpleNamespace(), [model_cls], mount_router=False
127
125
  )
128
126
  assert model_cls.__name__ in routers
@@ -132,8 +130,8 @@ async def test_api_include_and_rpc_call(monkeypatch, model_cls):
132
130
 
133
131
  monkeypatch.setattr(_executor, "_invoke", fake_invoke)
134
132
  payload = {"name": "x"}
135
- result = await api_binding.rpc_call(
136
- api, model_cls, "create", payload=payload, db=object()
133
+ result = await router_binding.rpc_call(
134
+ router, model_cls, "create", payload=payload, db=object()
137
135
  )
138
136
  assert result == payload
139
137
 
@@ -2,13 +2,16 @@ import pytest
2
2
  import pytest_asyncio
3
3
  from typing import Any, Mapping
4
4
 
5
- from tigrbl.types import HTTPException, UUID, Column, Integer, String, uuid4
5
+ from tigrbl.types import UUID, Column, Integer, String, uuid4
6
6
 
7
7
  from tigrbl import TigrblApp, Base
8
8
  from tigrbl.engine.shortcuts import engine as build_engine, mem
9
9
  from tigrbl.orm.mixins import GUIDPk, BulkCapable, Replaceable
10
10
 
11
11
 
12
+ from tigrbl.runtime.status import HTTPException
13
+
14
+
12
15
  class CoreTestUser(Base, GUIDPk, BulkCapable, Replaceable):
13
16
  __tablename__ = "test_users"
14
17
  name = Column(String(100), nullable=True)
@@ -22,32 +25,32 @@ def _get(obj: Any, attr: str) -> Any:
22
25
 
23
26
 
24
27
  @pytest.fixture
25
- def sync_api():
28
+ def sync_app():
26
29
  """Create a sync Tigrbl instance with CoreTestUser."""
27
30
  Base.metadata.clear()
28
31
  eng = build_engine(mem(async_=False))
29
- api = TigrblApp(engine=eng)
30
- api.include_model(CoreTestUser)
31
- api.initialize()
32
- return api, eng
32
+ app = TigrblApp(engine=eng)
33
+ app.include_table(CoreTestUser)
34
+ app.initialize()
35
+ return app, eng
33
36
 
34
37
 
35
38
  @pytest_asyncio.fixture
36
- async def async_api():
39
+ async def async_app():
37
40
  """Create an async Tigrbl instance with CoreTestUser."""
38
41
  Base.metadata.clear()
39
42
  eng = build_engine(mem(async_=True))
40
- api = TigrblApp(engine=eng)
41
- api.include_model(CoreTestUser)
42
- await api.initialize()
43
- return api, eng
43
+ app = TigrblApp(engine=eng)
44
+ app.include_table(CoreTestUser)
45
+ await app.initialize()
46
+ return app, eng
44
47
 
45
48
 
46
- def test_api_exposes_core_proxies(sync_api):
47
- api, _ = sync_api
48
- assert hasattr(api.core, "CoreTestUser")
49
- assert hasattr(api.core_raw, "CoreTestUser")
50
- schema_ns = api.schemas.CoreTestUser
49
+ def test_app_exposes_core_proxies(sync_app):
50
+ app, _ = sync_app
51
+ assert hasattr(app.core, "CoreTestUser")
52
+ assert hasattr(app.core_raw, "CoreTestUser")
53
+ schema_ns = app.schemas.CoreTestUser
51
54
  for name in [
52
55
  "create",
53
56
  "read",
@@ -64,10 +67,10 @@ def test_api_exposes_core_proxies(sync_api):
64
67
 
65
68
 
66
69
  @pytest.mark.asyncio
67
- async def test_core_and_core_raw_sync_operations(sync_api):
68
- api, eng = sync_api
70
+ async def test_core_and_core_raw_sync_operations(sync_app):
71
+ app, eng = sync_app
69
72
  with eng.session() as db:
70
- for proxy in (api.core, api.core_raw):
73
+ for proxy in (app.core, app.core_raw):
71
74
  model = proxy.CoreTestUser
72
75
  await model.clear({}, db=db)
73
76
 
@@ -148,17 +151,17 @@ async def test_core_and_core_raw_sync_operations(sync_api):
148
151
 
149
152
 
150
153
  @pytest.mark.asyncio
151
- async def test_core_read_not_found(sync_api):
152
- api, eng = sync_api
154
+ async def test_core_read_not_found(sync_app):
155
+ app, eng = sync_app
153
156
  fake_id = "00000000-0000-0000-0000-000000000000"
154
157
  with eng.session() as db:
155
158
  with pytest.raises(HTTPException):
156
- await api.core.CoreTestUser.read({"id": fake_id}, db=db)
159
+ await app.core.CoreTestUser.read({"id": fake_id}, db=db)
157
160
 
158
161
 
159
162
  @pytest.mark.asyncio
160
- async def test_async_api_initializes(async_api):
161
- api, eng = async_api
162
- assert hasattr(api.core, "CoreTestUser")
163
+ async def test_async_app_initializes(async_app):
164
+ app, eng = async_app
165
+ assert hasattr(app.core, "CoreTestUser")
163
166
  async with eng.asession():
164
167
  pass
@@ -24,7 +24,7 @@ class EngineWidget(Base, GUIDPk):
24
24
  @pytest_asyncio.fixture()
25
25
  async def running_engine_app():
26
26
  app = TigrblApp(engine=mem(async_=False))
27
- app.include_model(EngineWidget)
27
+ app.include_table(EngineWidget)
28
28
  app.mount_jsonrpc(prefix="/rpc")
29
29
  app.initialize()
30
30