tigrbl_tests 0.3.23.dev1__tar.gz → 0.3.24__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 (520) hide show
  1. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/PKG-INFO +4 -1
  2. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/pyproject.toml +8 -2
  3. tigrbl_tests-0.3.24/tests/fixtures/system_diagnostics.py +100 -0
  4. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness/test_04_appspec_corpus_fixture.py +53 -0
  5. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_e2e/test_01_appspec_corpus_uvicorn.py +46 -0
  6. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_bootstrap_kernel_compilation.py +7 -0
  7. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/hooks/test_hook_ctx_stage_validation.py +2 -2
  8. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/__init__.py +2 -2
  9. tigrbl_tests-0.3.24/tests/i9n/test_auth_status_projection_contract.py +103 -0
  10. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_bindings_modules.py +1 -1
  11. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_op_ctx_behavior.py +1 -1
  12. tigrbl_tests-0.3.24/tests/i9n/test_op_ctx_owner_scope_materialization_contracts.py +218 -0
  13. tigrbl_tests-0.3.24/tests/parity/test_atom_parity_corpus.py +29 -0
  14. tigrbl_tests-0.3.24/tests/perf/benchmark_results_create_uvicorn.json +503 -0
  15. tigrbl_tests-0.3.24/tests/perf/benchmark_results_create_uvicorn_sequential_10_rounds.json +503 -0
  16. tigrbl_tests-0.3.24/tests/perf/benchmark_results_create_uvicorn_sequential_10_rounds_250_ops.json +503 -0
  17. tigrbl_tests-0.3.24/tests/perf/benchmark_results_executors_seq_10_rounds.json +915 -0
  18. tigrbl_tests-0.3.24/tests/perf/benchmark_results_executors_seq_10_rounds_1000_ops.json +915 -0
  19. tigrbl_tests-0.3.24/tests/perf/benchmark_results_sse_uvicorn.json +94 -0
  20. tigrbl_tests-0.3.24/tests/perf/benchmark_results_streaming_uvicorn.json +94 -0
  21. tigrbl_tests-0.3.24/tests/perf/benchmark_results_websocket_uvicorn.json +94 -0
  22. tigrbl_tests-0.3.24/tests/perf/benchmark_results_webtransport_uvicorn.json +54 -0
  23. tigrbl_tests-0.3.24/tests/perf/compiled_input_strategy_microbench.json +145 -0
  24. tigrbl_tests-0.3.24/tests/perf/egress_body_coercion_microbench.json +68 -0
  25. tigrbl_tests-0.3.24/tests/perf/exact_route_marker_microbench.json +41 -0
  26. tigrbl_tests-0.3.24/tests/perf/fastapi_create_call_graph_250_ops.json +1589 -0
  27. tigrbl_tests-0.3.24/tests/perf/fastapi_sse_call_graph_250_ops.json +1591 -0
  28. tigrbl_tests-0.3.24/tests/perf/fastapi_sse_transport_call_graph_250_ops.json +1591 -0
  29. tigrbl_tests-0.3.24/tests/perf/fastapi_streaming_call_graph_250_ops.json +1591 -0
  30. tigrbl_tests-0.3.24/tests/perf/fastapi_websocket_call_graph_250_ops.json +1591 -0
  31. tigrbl_tests-0.3.24/tests/perf/fastapi_websocket_transport_call_graph_250_ops.json +1591 -0
  32. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/helper_fastapi_create_app.py +1 -0
  33. tigrbl_tests-0.3.24/tests/perf/helper_sse_apps.py +176 -0
  34. tigrbl_tests-0.3.24/tests/perf/helper_streaming_apps.py +167 -0
  35. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/helper_tigrbl_create_app.py +28 -4
  36. tigrbl_tests-0.3.24/tests/perf/helper_websocket_apps.py +125 -0
  37. tigrbl_tests-0.3.24/tests/perf/helper_webtransport_apps.py +93 -0
  38. tigrbl_tests-0.3.24/tests/perf/hot_block_lane_microbench.json +101 -0
  39. tigrbl_tests-0.3.24/tests/perf/hot_path_perf_suite_manifest.json +426 -0
  40. tigrbl_tests-0.3.24/tests/perf/hot_path_perf_suite_report.md +111 -0
  41. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-sse.json +126 -0
  42. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-sse.md +7 -0
  43. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-streaming.json +126 -0
  44. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-streaming.md +7 -0
  45. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-websocket.json +126 -0
  46. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-websocket.md +7 -0
  47. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-webtransport.json +87 -0
  48. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark-webtransport.md +7 -0
  49. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark.json +80 -0
  50. tigrbl_tests-0.3.24/tests/perf/kernel-plan-benchmark.md +31 -0
  51. tigrbl_tests-0.3.24/tests/perf/runtime_hotstate_microbench.json +58 -0
  52. tigrbl_tests-0.3.24/tests/perf/runtime_namespace_dictget_microbench.json +75 -0
  53. tigrbl_tests-0.3.24/tests/perf/runtime_typecheck_microbench.json +92 -0
  54. tigrbl_tests-0.3.24/tests/perf/test_compiled_input_strategy_microbench.py +252 -0
  55. tigrbl_tests-0.3.24/tests/perf/test_egress_body_coercion_microbench.py +99 -0
  56. tigrbl_tests-0.3.24/tests/perf/test_exact_route_marker_microbench.py +130 -0
  57. tigrbl_tests-0.3.24/tests/perf/test_fastapi_create_call_graph.py +157 -0
  58. tigrbl_tests-0.3.24/tests/perf/test_hot_block_lane_microbench.py +142 -0
  59. tigrbl_tests-0.3.24/tests/perf/test_runtime_hotstate_microbench.py +153 -0
  60. tigrbl_tests-0.3.24/tests/perf/test_runtime_namespace_dictget_microbench.py +204 -0
  61. tigrbl_tests-0.3.24/tests/perf/test_runtime_typecheck_microbench.py +134 -0
  62. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/test_tigrbl_create_call_graph.py +12 -8
  63. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/test_tigrbl_vs_fastapi_create_benchmark.py +48 -19
  64. tigrbl_tests-0.3.24/tests/perf/test_validation_guard_strategy_microbench.py +116 -0
  65. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-items.benchmark.json +39 -0
  66. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-items.benchmark.md +16 -0
  67. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-items.bin +0 -0
  68. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-items.hexdump.txt +102 -0
  69. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-items.summary.json +427 -0
  70. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-sse.benchmark.json +39 -0
  71. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-sse.benchmark.md +16 -0
  72. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-sse.bin +0 -0
  73. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-sse.hexdump.txt +54 -0
  74. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-sse.summary.json +417 -0
  75. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-streaming.benchmark.json +39 -0
  76. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-streaming.benchmark.md +16 -0
  77. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-streaming.bin +0 -0
  78. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-streaming.hexdump.txt +54 -0
  79. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-streaming.summary.json +417 -0
  80. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-websocket.benchmark.json +39 -0
  81. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-websocket.benchmark.md +16 -0
  82. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-websocket.bin +0 -0
  83. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-websocket.hexdump.txt +53 -0
  84. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-websocket.summary.json +417 -0
  85. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-webtransport.benchmark.json +39 -0
  86. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-webtransport.benchmark.md +16 -0
  87. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-webtransport.bin +0 -0
  88. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-webtransport.hexdump.txt +53 -0
  89. tigrbl_tests-0.3.24/tests/perf/tgpkhot1-benchmark-webtransport.summary.json +417 -0
  90. tigrbl_tests-0.3.24/tests/perf/tigrbl_create_call_graph_250_ops.json +1589 -0
  91. tigrbl_tests-0.3.24/tests/perf/tigrbl_sse_call_graph_250_ops.json +1591 -0
  92. tigrbl_tests-0.3.24/tests/perf/tigrbl_sse_transport_call_graph_250_ops.json +1591 -0
  93. tigrbl_tests-0.3.24/tests/perf/tigrbl_streaming_call_graph_250_ops.json +1591 -0
  94. tigrbl_tests-0.3.24/tests/perf/tigrbl_websocket_call_graph_250_ops.json +1591 -0
  95. tigrbl_tests-0.3.24/tests/perf/tigrbl_websocket_transport_call_graph_250_ops.json +1591 -0
  96. tigrbl_tests-0.3.24/tests/perf/tigrbl_webtransport_call_graph_250_ops.json +1591 -0
  97. tigrbl_tests-0.3.24/tests/perf/tigrbl_webtransport_transport_call_graph_250_ops.json +1591 -0
  98. tigrbl_tests-0.3.24/tests/perf/validation_guard_strategy_microbench.json +53 -0
  99. tigrbl_tests-0.3.24/tests/perf/wsproto_client.py +82 -0
  100. tigrbl_tests-0.3.24/tests/protocol/test_protocol_runtime_governance_contracts.py +44 -0
  101. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/rust/runtime/test_rust_runtime_public_surface.py +8 -1
  102. tigrbl_tests-0.3.24/tests/security/test_httpbearer_contract.py +42 -0
  103. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/test_secdeps_execute_in_pre_tx.py +136 -1
  104. tigrbl_tests-0.3.24/tests/unit/runtime/test_app_framed_message_codec_contract.py +108 -0
  105. tigrbl_tests-0.3.24/tests/unit/runtime/test_binding_exchange_normalization_contract.py +221 -0
  106. tigrbl_tests-0.3.24/tests/unit/runtime/test_binding_subevent_phase_atom_legality_matrix_contract.py +224 -0
  107. tigrbl_tests-0.3.24/tests/unit/runtime/test_bindingspec_event_subevent_schema_contract.py +135 -0
  108. tigrbl_tests-0.3.24/tests/unit/runtime/test_bindingspec_kernelplan_protocol_compilation_contract.py +110 -0
  109. tigrbl_tests-0.3.24/tests/unit/runtime/test_compiled_loop_regions_contract.py +163 -0
  110. tigrbl_tests-0.3.24/tests/unit/runtime/test_completion_fence_emit_complete_contract.py +185 -0
  111. tigrbl_tests-0.3.24/tests/unit/runtime/test_derived_runtime_subevent_taxonomy_contract.py +87 -0
  112. tigrbl_tests-0.3.24/tests/unit/runtime/test_dispatch_exchange_family_subevent_atoms_contract.py +92 -0
  113. tigrbl_tests-0.3.24/tests/unit/runtime/test_eventful_channel_state_metadata_contract.py +96 -0
  114. tigrbl_tests-0.3.24/tests/unit/runtime/test_eventful_protocol_decorator_surface_contract.py +138 -0
  115. tigrbl_tests-0.3.24/tests/unit/runtime/test_eventful_subevent_surface_contracts.py +109 -0
  116. tigrbl_tests-0.3.24/tests/unit/runtime/test_eventkey_bit_coded_dispatch_contract.py +118 -0
  117. tigrbl_tests-0.3.24/tests/unit/runtime/test_eventkey_hook_bucket_compilation_contract.py +113 -0
  118. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_events_runtime_behavior.py +3 -3
  119. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_events_stages.py +16 -6
  120. tigrbl_tests-0.3.24/tests/unit/runtime/test_first_class_callback_runtime_contract.py +126 -0
  121. tigrbl_tests-0.3.24/tests/unit/runtime/test_first_class_webhook_delivery_contract.py +123 -0
  122. tigrbl_tests-0.3.24/tests/unit/runtime/test_framing_decode_encode_atoms_contract.py +95 -0
  123. tigrbl_tests-0.3.24/tests/unit/runtime/test_hook_selector_matching_contract.py +177 -0
  124. tigrbl_tests-0.3.24/tests/unit/runtime/test_http_rest_jsonrpc_atom_chain_contract.py +137 -0
  125. tigrbl_tests-0.3.24/tests/unit/runtime/test_http_stream_atom_chain_contract.py +115 -0
  126. tigrbl_tests-0.3.24/tests/unit/runtime/test_iterator_producer_contract.py +111 -0
  127. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_kernel_plan_event_ordering.py +2 -2
  128. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_kernel_plan_full_ordering.py +6 -6
  129. tigrbl_tests-0.3.24/tests/unit/runtime/test_kernelplan_executor_runtime_shim_contract.py +52 -0
  130. tigrbl_tests-0.3.24/tests/unit/runtime/test_lifespan_runtime_chain_contract.py +86 -0
  131. tigrbl_tests-0.3.24/tests/unit/runtime/test_loop_ownership_mode_contract.py +130 -0
  132. tigrbl_tests-0.3.24/tests/unit/runtime/test_loop_region_executor_contract.py +63 -0
  133. tigrbl_tests-0.3.24/tests/unit/runtime/test_opchannel_capability_handshake_contract.py +123 -0
  134. tigrbl_tests-0.3.24/tests/unit/runtime/test_packed_executor_hot_path_contract.py +981 -0
  135. tigrbl_tests-0.3.24/tests/unit/runtime/test_protocol_anchor_ordering_parity_contract.py +49 -0
  136. tigrbl_tests-0.3.24/tests/unit/runtime/test_protocol_phase_tree_contract.py +96 -0
  137. tigrbl_tests-0.3.24/tests/unit/runtime/test_protocol_phase_tree_plan_contract.py +243 -0
  138. tigrbl_tests-0.3.24/tests/unit/runtime/test_protocol_scope_schemas_contract.py +153 -0
  139. tigrbl_tests-0.3.24/tests/unit/runtime/test_protocol_segment_fusion_contract.py +139 -0
  140. tigrbl_tests-0.3.24/tests/unit/runtime/test_runtime_hook_legality_contract.py +90 -0
  141. tigrbl_tests-0.3.24/tests/unit/runtime/test_segment_fusion_barrier_policy_contract.py +116 -0
  142. tigrbl_tests-0.3.24/tests/unit/runtime/test_sse_runtime_contract.py +132 -0
  143. tigrbl_tests-0.3.24/tests/unit/runtime/test_static_file_runtime_chain_contract.py +90 -0
  144. tigrbl_tests-0.3.24/tests/unit/runtime/test_subevent_handler_dispatch_contract.py +114 -0
  145. tigrbl_tests-0.3.24/tests/unit/runtime/test_subevent_transaction_units_contract.py +109 -0
  146. tigrbl_tests-0.3.24/tests/unit/runtime/test_transport_accept_emit_close_atoms_contract.py +92 -0
  147. tigrbl_tests-0.3.24/tests/unit/runtime/test_transport_event_registry_contract.py +100 -0
  148. tigrbl_tests-0.3.24/tests/unit/runtime/test_two_axis_lifecycle_matrix_contract.py +151 -0
  149. tigrbl_tests-0.3.24/tests/unit/runtime/test_websocket_atom_chain_contract.py +138 -0
  150. tigrbl_tests-0.3.24/tests/unit/runtime/test_webtransport_transport_events_contract.py +84 -0
  151. tigrbl_tests-0.3.24/tests/unit/runtime/test_yield_iterator_producer_contract.py +63 -0
  152. tigrbl_tests-0.3.24/tests/unit/test_base_public_projection_contracts.py +55 -0
  153. tigrbl_tests-0.3.24/tests/unit/test_canonical_custom_op_contract.py +98 -0
  154. tigrbl_tests-0.3.24/tests/unit/test_canonical_file_transfer_op_contracts.py +92 -0
  155. tigrbl_tests-0.3.24/tests/unit/test_canonical_pubsub_op_contracts.py +92 -0
  156. tigrbl_tests-0.3.24/tests/unit/test_canonical_query_op_contracts.py +134 -0
  157. tigrbl_tests-0.3.24/tests/unit/test_canonical_standard_op_contracts.py +142 -0
  158. tigrbl_tests-0.3.24/tests/unit/test_canonical_stream_transport_op_contracts.py +92 -0
  159. tigrbl_tests-0.3.24/tests/unit/test_canonical_tail_op_contract.py +77 -0
  160. tigrbl_tests-0.3.24/tests/unit/test_concrete_response_classes.py +156 -0
  161. tigrbl_tests-0.3.24/tests/unit/test_declared_surface_metadata_contracts.py +59 -0
  162. tigrbl_tests-0.3.24/tests/unit/test_diagnostics_endpoint_contracts.py +88 -0
  163. tigrbl_tests-0.3.24/tests/unit/test_hook_surface_contracts.py +192 -0
  164. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_instance_naming_conventions.py +1 -0
  165. tigrbl_tests-0.3.24/tests/unit/test_jcs_canonicalization_contract.py +41 -0
  166. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_jsonrpc_openrpc.py +176 -0
  167. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_kernel_plan_labels.py +2 -2
  168. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_kernelz_endpoint.py +1 -1
  169. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_ctx_persist_options.py +1 -1
  170. tigrbl_tests-0.3.24/tests/unit/test_op_surface_owner_scope_contracts.py +113 -0
  171. tigrbl_tests-0.3.24/tests/unit/test_operator_auth_surface_contracts.py +145 -0
  172. tigrbl_tests-0.3.24/tests/unit/test_operator_bounded_middleware_catalog_contracts.py +57 -0
  173. tigrbl_tests-0.3.24/tests/unit/test_operator_cookie_form_upload_contracts.py +127 -0
  174. tigrbl_tests-0.3.24/tests/unit/test_operator_docs_descope_contracts.py +55 -0
  175. tigrbl_tests-0.3.24/tests/unit/test_operator_oidc_descope_contracts.py +88 -0
  176. tigrbl_tests-0.3.24/tests/unit/test_operator_static_files_contracts.py +78 -0
  177. tigrbl_tests-0.3.24/tests/unit/test_operator_streaming_sse_contracts.py +84 -0
  178. tigrbl_tests-0.3.24/tests/unit/test_operator_websocket_route_contracts.py +88 -0
  179. tigrbl_tests-0.3.24/tests/unit/test_security_dependency_surface_contracts.py +195 -0
  180. tigrbl_tests-0.3.24/tests/unit/test_spec_binding_app_engine_contracts.py +270 -0
  181. tigrbl_tests-0.3.24/tests/unit/test_spec_contracts_request_schema_storage.py +103 -0
  182. tigrbl_tests-0.3.24/tests/unit/test_spec_contracts_session_bindings.py +164 -0
  183. tigrbl_tests-0.3.24/tests/unit/test_spec_contracts_table_registry_template.py +108 -0
  184. tigrbl_tests-0.3.24/tests/unit/test_stdapi_transport_asgi_wsgi.py +150 -0
  185. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_sys_tx_commit.py +1 -1
  186. tigrbl_tests-0.3.24/tests/unit/test_system_diagnostics_fixture_contracts.py +158 -0
  187. tigrbl_tests-0.3.24/tests/unit/test_system_docs_diagnostics_contracts.py +203 -0
  188. tigrbl_tests-0.3.24/tests/unit/test_system_uix_surface_contracts.py +115 -0
  189. tigrbl_tests-0.3.24/tests/unit/test_tigrbl_app_event_handlers.py +96 -0
  190. tigrbl_tests-0.3.24/tests/unit/test_transport_dispatch_parity_contract.py +121 -0
  191. tigrbl_tests-0.3.24/tests/unit/test_transport_response_concrete_class.py +62 -0
  192. tigrbl_tests-0.3.23.dev1/tests/perf/benchmark_results_create_uvicorn.json +0 -502
  193. tigrbl_tests-0.3.23.dev1/tests/perf/benchmark_results_create_uvicorn_sequential_10_rounds.json +0 -502
  194. tigrbl_tests-0.3.23.dev1/tests/perf/benchmark_results_executors_seq_10_rounds.json +0 -915
  195. tigrbl_tests-0.3.23.dev1/tests/perf/tigrbl_create_call_graph_250_ops.json +0 -1589
  196. tigrbl_tests-0.3.23.dev1/tests/unit/test_stdapi_transport_asgi_wsgi.py +0 -301
  197. tigrbl_tests-0.3.23.dev1/tests/unit/test_tigrbl_app_event_handlers.py +0 -53
  198. tigrbl_tests-0.3.23.dev1/tests/unit/test_transport_dispatch_parity_contract.py +0 -8
  199. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/LICENSE +0 -0
  200. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/README.md +0 -0
  201. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/__init__.py +0 -0
  202. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/architecture/test_import_graph_audit.py +0 -0
  203. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/architecture/test_no_bindings_imports.py +0 -0
  204. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/architecture/test_operation_resolution_parity.py +0 -0
  205. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/architecture/test_runtime_structure.py +0 -0
  206. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/architecture/test_trace_plan_parity.py +0 -0
  207. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/architecture/test_transport_boundaries.py +0 -0
  208. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/architecture/test_transport_dispatch_convergence.py +0 -0
  209. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/conftest.py +0 -0
  210. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/fixtures/appspec_corpus.canonical.json +0 -0
  211. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/fixtures/appspec_corpus.negative.json +0 -0
  212. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/fixtures/appspec_corpus_loader.py +0 -0
  213. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/fixtures/cli_smoke_app.py +0 -0
  214. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness/test_00_appspec_contract.py +0 -0
  215. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness/test_01_kernel_plan_compilation.py +0 -0
  216. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness/test_02_bootstrap_plan.py +0 -0
  217. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness/test_03_appspec_uvicorn_e2e.py +0 -0
  218. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness/test_05_appspec_metamorphic.py +0 -0
  219. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_e2e/test_00_appspec_uvicorn_rest_rpc.py +0 -0
  220. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_e2e/test_01_imperative_uvicorn_rest_rpc.py +0 -0
  221. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/__init__.py +0 -0
  222. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/_support.py +0 -0
  223. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_appspec_prefixes.py +0 -0
  224. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_default_opspec_bindings.py +0 -0
  225. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_kernel_plan_routing.py +0 -0
  226. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_mapping_plan_compilation.py +0 -0
  227. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_route_rpc_prebinding.py +0 -0
  228. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_route_runtime_fallback_atoms.py +0 -0
  229. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/harness_v3/test_uvicorn_e2e_appspec.py +0 -0
  230. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_acronym_route_name.py +0 -0
  231. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_allow_anon.py +0 -0
  232. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_apikey_generation.py +0 -0
  233. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_authn_provider_integration.py +0 -0
  234. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_bindings_integration.py +0 -0
  235. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_bulk_docs_client.py +0 -0
  236. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_core_access.py +0 -0
  237. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_engine_install_uvicorn.py +0 -0
  238. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_engine_resolver_uvicorn.py +0 -0
  239. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_error_mappings.py +0 -0
  240. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_field_spec_effects.py +0 -0
  241. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_header_io_uvicorn.py +0 -0
  242. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_healthz_methodz_hookz.py +0 -0
  243. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_hook_ctx_v3_i9n.py +0 -0
  244. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_hook_lifecycle.py +0 -0
  245. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_iospec_attributes.py +0 -0
  246. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_iospec_integration.py +0 -0
  247. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_jsonrpc_batch_behavior.py +0 -0
  248. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_key_digest_uvicorn.py +0 -0
  249. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_list_filters_optional.py +0 -0
  250. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_mixins.py +0 -0
  251. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_mountable_favicon_uvicorn.py +0 -0
  252. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_mountable_lens_uvicorn.py +0 -0
  253. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_mountable_openapi_uvicorn.py +0 -0
  254. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_mountable_openrpc_uvicorn.py +0 -0
  255. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_mountable_swagger_uvicorn.py +0 -0
  256. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_nested_path_schema_and_rpc.py +0 -0
  257. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_nested_routing_depth.py +0 -0
  258. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_op_ctx_alias_examples.py +0 -0
  259. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_op_ctx_core_crud_order.py +0 -0
  260. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_op_ctx_owner_scope_uvicorn_matrix.py +0 -0
  261. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_openapi_clear_response_schema.py +0 -0
  262. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_openapi_schema_examples_presence.py +0 -0
  263. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_opspec_effects_i9n_test.py +0 -0
  264. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_opspec_pre_tx_deps.py +0 -0
  265. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_owner_tenant_policy.py +0 -0
  266. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_request_extras.py +0 -0
  267. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_rest_fallback_serialization.py +0 -0
  268. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_rest_row_serialization.py +0 -0
  269. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_rest_rpc_parity_v3.py +0 -0
  270. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_row_result_serialization.py +0 -0
  271. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_schema.py +0 -0
  272. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_schema_ctx_attributes_integration.py +0 -0
  273. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_schema_ctx_op_ctx_integration.py +0 -0
  274. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_schema_ctx_spec_integration.py +0 -0
  275. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_sqlite_attachments.py +0 -0
  276. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_storage_spec_integration.py +0 -0
  277. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_symmetry_parity.py +0 -0
  278. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_tigrbl_api_app_usage_uvicorn.py +0 -0
  279. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_tigrbl_api_usage_uvicorn.py +0 -0
  280. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_tigrbl_api_uvicorn.py +0 -0
  281. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_tigrbl_app_include_api_uvicorn.py +0 -0
  282. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_tigrbl_app_multi_api_uvicorn.py +0 -0
  283. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_tigrbl_app_usage_uvicorn.py +0 -0
  284. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_tigrbl_app_uvicorn.py +0 -0
  285. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_transport_dispatch_parity.py +0 -0
  286. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_types_deprecation_exports.py +0 -0
  287. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_uvicorn_transport_behavior.py +0 -0
  288. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_v3_bulk_rest_endpoints.py +0 -0
  289. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_v3_default_rest_ops.py +0 -0
  290. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_v3_default_rpc_ops.py +0 -0
  291. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_v3_opspec_attributes.py +0 -0
  292. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/test_verb_alias_policy.py +0 -0
  293. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/i9n/uvicorn_utils.py +0 -0
  294. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/mount/__init__.py +0 -0
  295. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/mount/test_mount_favico.py +0 -0
  296. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/options/test_rest_options.py +0 -0
  297. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/options/test_rpc_options.py +0 -0
  298. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/parity/__init__.py +0 -0
  299. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/parity/test_executor_metamorphic_parity.py +0 -0
  300. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/parity/test_hook_runtime_stage_parity.py +0 -0
  301. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/parity/test_stdapi_openapi_docs.py +0 -0
  302. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/parity/test_stdapi_primitives.py +0 -0
  303. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/parity/test_stdapi_routing.py +0 -0
  304. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/__init__.py +0 -0
  305. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/test_collect_caching.py +0 -0
  306. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/test_fastapi_vs_tigrbl_executor_benchmark.py +0 -0
  307. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/test_hookz_performance.py +0 -0
  308. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/perf/test_methodz_performance.py +0 -0
  309. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/request/test_request_asgi_scope_compat.py +0 -0
  310. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/request/test_request_authn_strip.py +0 -0
  311. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/request/test_request_dot_notation.py +0 -0
  312. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/request/test_request_response_conveniences.py +0 -0
  313. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/request/test_request_transport_convenience_dot_notation.py +0 -0
  314. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/requests/test_request_json_modes.py +0 -0
  315. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/response/test_response_dot_notation.py +0 -0
  316. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/response/test_response_transport_convenience_dot_notation.py +0 -0
  317. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/rust/atoms/test_rust_atoms_public_surface.py +0 -0
  318. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/rust/ffi/test_rust_binding_trace.py +0 -0
  319. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/rust/kernel/test_rust_kernel_public_surface.py +0 -0
  320. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/rust/parity/test_rust_parity_contract.py +0 -0
  321. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/rust/runtime/test_rust_runtime_engine_policy.py +0 -0
  322. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/security/test_dot_notation_schemes.py +0 -0
  323. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/security/test_schemes.py +0 -0
  324. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/__init__.py +0 -0
  325. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_alias_ctx_bindings.py +0 -0
  326. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_declarative_surface.py +0 -0
  327. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_engine_ctx_bindings.py +0 -0
  328. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_hook_ctx_bindings.py +0 -0
  329. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_op_alias_bindings.py +0 -0
  330. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_op_ctx_bindings.py +0 -0
  331. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_response_ctx_bindings.py +0 -0
  332. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/decorators/test_schema_ctx_bindings.py +0 -0
  333. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/response_utils.py +0 -0
  334. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_emit_paired_post.py +0 -0
  335. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_emit_paired_pre.py +0 -0
  336. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_emit_readtime_alias.py +0 -0
  337. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_out_masking.py +0 -0
  338. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_refresh_demand.py +0 -0
  339. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_resolve_assemble.py +0 -0
  340. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_resolve_paired_gen.py +0 -0
  341. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_route_protocol_detect.py +0 -0
  342. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_schema_collect_in.py +0 -0
  343. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_schema_collect_out.py +0 -0
  344. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_storage_to_stored.py +0 -0
  345. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_wire_build_in.py +0 -0
  346. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_wire_build_out.py +0 -0
  347. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_wire_dump.py +0 -0
  348. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/atoms/test_wire_validate_in.py +0 -0
  349. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_atom_stage_window_static.py +0 -0
  350. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_compilation_runtime_behavior.py +0 -0
  351. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_ingress_egress_access.py +0 -0
  352. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_kernel_runtime_behavior.py +0 -0
  353. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_ordering_runtime_behavior.py +0 -0
  354. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_payload_select_header_merge.py +0 -0
  355. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/runtime/test_payload_select_invalid_rpc_params.py +0 -0
  356. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_acol_vcol_knobs.py +0 -0
  357. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_alias_ctx_op_alias_attributes.py +0 -0
  358. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_alias_ctx_op_attributes.py +0 -0
  359. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_api_level_set_auth.py +0 -0
  360. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_app_model_defaults.py +0 -0
  361. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_app_reexport.py +0 -0
  362. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_app_spec_normalization.py +0 -0
  363. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_attrdict_vs_simplenamespace.py +0 -0
  364. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_authorize_runtime_secdep.py +0 -0
  365. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_base_columnspec_inheritance.py +0 -0
  366. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_base_facade_initialize.py +0 -0
  367. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_build_list_params_spec_model.py +0 -0
  368. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_bulk_body_annotation.py +0 -0
  369. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_bulk_response_schema.py +0 -0
  370. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_cli_cmds.py +0 -0
  371. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_cli_srv.py +0 -0
  372. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_colspec_map_isolation.py +0 -0
  373. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_column_collect_mixins.py +0 -0
  374. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_column_mro_collect_namespace.py +0 -0
  375. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_column_rest_rpc_results.py +0 -0
  376. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_column_table_orm_binding.py +0 -0
  377. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_config_dataclass_none.py +0 -0
  378. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_core_crud_bulk_ops.py +0 -0
  379. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_core_crud_default_ops.py +0 -0
  380. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_core_crud_methods.py +0 -0
  381. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_core_wrap_memoization.py +0 -0
  382. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_db_dependency.py +0 -0
  383. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_declared_surface_docs.py +0 -0
  384. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_decorator_and_collect.py +0 -0
  385. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_default_schema_selection.py +0 -0
  386. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_default_tags.py +0 -0
  387. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_diagnostics_no_compat_module.py +0 -0
  388. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_docs_security_parity.py +0 -0
  389. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_engine_install_api.py +0 -0
  390. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_engine_install_app.py +0 -0
  391. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_engine_install_op.py +0 -0
  392. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_engine_install_table.py +0 -0
  393. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_engine_session_database_availability.py +0 -0
  394. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_engine_spec_and_shortcuts.py +0 -0
  395. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_engine_usage_levels.py +0 -0
  396. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_field_spec_attrs.py +0 -0
  397. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_file_response.py +0 -0
  398. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_get_schema.py +0 -0
  399. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_handler_step_qualname.py +0 -0
  400. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_hook_ctx_attributes.py +0 -0
  401. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_hook_ctx_binding.py +0 -0
  402. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_hookz_empty_stage.py +0 -0
  403. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_http_route_registration.py +0 -0
  404. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_hybrid_session_run_sync.py +0 -0
  405. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_in_tx.py +0 -0
  406. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_include_model_columns_namespace.py +0 -0
  407. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_include_models_base_prefix.py +0 -0
  408. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_include_tables_base_prefix.py +0 -0
  409. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_initialize_async_task.py +0 -0
  410. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_initialize_cross_ddl.py +0 -0
  411. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_initialize_mixed_engines.py +0 -0
  412. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_initialize_task_schedule.py +0 -0
  413. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_io_spec_attributes.py +0 -0
  414. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_iospec_attributes.py +0 -0
  415. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_iospec_effects.py +0 -0
  416. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_jsonrpc_id_example.py +0 -0
  417. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_jsonrpc_router_default_tag.py +0 -0
  418. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_kernel_invoke_ctx.py +0 -0
  419. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_kernel_opview_on_demand.py +0 -0
  420. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_make_column_shortcuts.py +0 -0
  421. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_mapping_bind_response_export.py +0 -0
  422. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_mapping_plan_precedence.py +0 -0
  423. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_middleware_http_and_cors.py +0 -0
  424. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_mixins_sqlalchemy.py +0 -0
  425. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_alias.py +0 -0
  426. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_class_engine_binding.py +0 -0
  427. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_ctx_arity_paths.py +0 -0
  428. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_ctx_attributes.py +0 -0
  429. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_ctx_core_crud_integration.py +0 -0
  430. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_ctx_custom_target_persist.py +0 -0
  431. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_ctx_dynamic_attach.py +0 -0
  432. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_op_ctx_parameter_matrix.py +0 -0
  433. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_openapi_documentation_security_behavior.py +0 -0
  434. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_openapi_openrpc_schema_separation.py +0 -0
  435. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_openrpc_documentation_security_behavior.py +0 -0
  436. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_operator_surface_closure.py +0 -0
  437. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_operator_surface_docs_parity.py +0 -0
  438. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_opspec_effects.py +0 -0
  439. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_postgres_engine_errors.py +0 -0
  440. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_postgres_env_vars.py +0 -0
  441. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_relationship_alias_cols.py +0 -0
  442. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_request_body_schema.py +0 -0
  443. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_request_response_examples.py +0 -0
  444. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_resolver_interning_warmup.py +0 -0
  445. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_resolver_precedence.py +0 -0
  446. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_alias_table_rpc.py +0 -0
  447. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_ctx_precedence.py +0 -0
  448. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_diagnostics_kernelz.py +0 -0
  449. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_html_jinja_behavior.py +0 -0
  450. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_parity.py +0 -0
  451. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_rest.py +0 -0
  452. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_rpc.py +0 -0
  453. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_template.py +0 -0
  454. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_response_uuid.py +0 -0
  455. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_all_default_op_verbs.py +0 -0
  456. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_bulk_delete_suppresses_clear.py +0 -0
  457. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_jsonrpc_metamorphic_default_ops.py +0 -0
  458. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_no_schema_jsonable.py +0 -0
  459. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_operation_id_uniqueness.py +0 -0
  460. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_output_serialization_extras.py +0 -0
  461. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_request_mapping_access.py +0 -0
  462. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_rpc_parity_default_ops.py +0 -0
  463. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_rpc_prefixes.py +0 -0
  464. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rest_rpc_symmetry.py +0 -0
  465. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_router_compatibility_shims.py +0 -0
  466. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_router_dependency_execution_blocked.py +0 -0
  467. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rpc_all_default_op_verbs.py +0 -0
  468. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_rpc_default_ops.py +0 -0
  469. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_schema_ctx_attributes.py +0 -0
  470. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_schema_ctx_plain_class.py +0 -0
  471. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_schema_spec_presence.py +0 -0
  472. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_schemas_binding.py +0 -0
  473. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_security_per_route.py +0 -0
  474. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_should_wire_canonical.py +0 -0
  475. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_api.py +0 -0
  476. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_app.py +0 -0
  477. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_column.py +0 -0
  478. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_engine.py +0 -0
  479. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_field.py +0 -0
  480. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_hook.py +0 -0
  481. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_io.py +0 -0
  482. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_op.py +0 -0
  483. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_snapshots.py +0 -0
  484. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_storage.py +0 -0
  485. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_spec_table.py +0 -0
  486. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_sqlite_attachments.py +0 -0
  487. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_sqlite_uuid_type.py +0 -0
  488. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_stdapi_request_injection.py +0 -0
  489. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_storage_spec_attributes.py +0 -0
  490. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_sys_handler_crud.py +0 -0
  491. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_sys_run_rollback.py +0 -0
  492. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_sys_tx_async_begin.py +0 -0
  493. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_sys_tx_begin.py +0 -0
  494. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_system_docs_builders.py +0 -0
  495. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_table_base_exports.py +0 -0
  496. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_table_collect_spec.py +0 -0
  497. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_table_columns_namespace.py +0 -0
  498. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_table_model_attribute_contract.py +0 -0
  499. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_table_namespace_init.py +0 -0
  500. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_table_namespace_isolation.py +0 -0
  501. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_api_app_configuration.py +0 -0
  502. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_api_app_instantiation.py +0 -0
  503. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_api_app_subclass_definition.py +0 -0
  504. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_api_configuration.py +0 -0
  505. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_api_instantiation.py +0 -0
  506. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_api_subclass_definition.py +0 -0
  507. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_app_configuration.py +0 -0
  508. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_app_instantiation.py +0 -0
  509. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_app_state.py +0 -0
  510. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_tigrbl_app_subclass_definition.py +0 -0
  511. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_transport_gw_contract.py +0 -0
  512. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_transport_security_runtime_only.py +0 -0
  513. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_v3_default_root_endpoint.py +0 -0
  514. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_v3_favicon_endpoint.py +0 -0
  515. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_v3_healthz_endpoint.py +0 -0
  516. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_v3_op_alias.py +0 -0
  517. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_v3_op_ctx_attributes.py +0 -0
  518. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_v3_schemas_and_decorators.py +0 -0
  519. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/tests/unit/test_v3_storage_spec_attributes.py +0 -0
  520. {tigrbl_tests-0.3.23.dev1 → tigrbl_tests-0.3.24}/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.23.dev1
3
+ Version: 0.3.24
4
4
  Summary: Test suite and fixtures for the Tigrbl framework.
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -32,6 +32,9 @@ Requires-Dist: requests (>=2.32.3)
32
32
  Requires-Dist: ruff (>=0.9.9)
33
33
  Requires-Dist: tigrbl
34
34
  Requires-Dist: tigrbl_client
35
+ Project-URL: Homepage, https://github.com/swarmauri/tigrbl
36
+ Project-URL: Issues, https://github.com/swarmauri/tigrbl/issues
37
+ Project-URL: Repository, https://github.com/swarmauri/tigrbl/tree/main/pkgs/core/tigrbl_tests
35
38
  Description-Content-Type: text/markdown
36
39
 
37
40
  # tigrbl_tests
@@ -1,10 +1,9 @@
1
1
  [project]
2
2
  name = "tigrbl_tests"
3
- version = "0.3.23.dev1"
3
+ version = "0.3.24"
4
4
  description = "Test suite and fixtures for the Tigrbl framework."
5
5
  license = "Apache-2.0"
6
6
  readme = "README.md"
7
- repository = "http://github.com/swarmauri/swarmauri-sdk"
8
7
  requires-python = ">=3.10,<3.14"
9
8
  classifiers = [
10
9
  "Development Status :: 1 - Planning",
@@ -18,6 +17,7 @@ classifiers = [
18
17
  "Programming Language :: Python :: 3 :: Only",
19
18
  ]
20
19
  authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
20
+
21
21
  dependencies = [
22
22
  "tigrbl",
23
23
  "tigrbl_client",
@@ -46,6 +46,12 @@ keywords = [
46
46
  "performance",
47
47
  ]
48
48
 
49
+
50
+ [project.urls]
51
+ Homepage = "https://github.com/swarmauri/tigrbl"
52
+ Repository = "https://github.com/swarmauri/tigrbl/tree/main/pkgs/core/tigrbl_tests"
53
+ Issues = "https://github.com/swarmauri/tigrbl/issues"
54
+
49
55
  [tool.uv.sources]
50
56
  tigrbl = { workspace = true }
51
57
  tigrbl_client = { workspace = true }
@@ -0,0 +1,100 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from types import SimpleNamespace
5
+ from typing import Any
6
+
7
+ from sqlalchemy import Column, String
8
+
9
+ from tigrbl import Request, TigrblApp
10
+ from tigrbl.factories.engine import mem
11
+ from tigrbl.orm.mixins import GUIDPk
12
+ from tigrbl.orm.tables import TableBase
13
+ from tigrbl.system.diagnostics import mount_diagnostics
14
+
15
+
16
+ class SystemDiagnosticsFixtureWidget(TableBase, GUIDPk):
17
+ __tablename__ = "system_diagnostics_fixture_widgets"
18
+
19
+ name = Column(String, nullable=False)
20
+
21
+
22
+ class UnavailableDiagnosticsDb:
23
+ def execute(self, *_args: Any, **_kwargs: Any) -> None:
24
+ raise RuntimeError("fixture database unavailable")
25
+
26
+
27
+ class AvailableDiagnosticsDb:
28
+ def execute(self, *_args: Any, **_kwargs: Any) -> None:
29
+ return None
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class SystemDiagnosticsFixture:
34
+ app: TigrblApp
35
+ healthz_path: str
36
+ absent_default_path: str
37
+ expected_healthz_payload: dict[str, bool]
38
+ warning_vocabulary: frozenset[str]
39
+
40
+ def request(
41
+ self,
42
+ path: str | None = None,
43
+ *,
44
+ db: Any | None = None,
45
+ dbs: dict[str, Any] | None = None,
46
+ query: dict[str, list[str]] | None = None,
47
+ ) -> Request:
48
+ state = SimpleNamespace()
49
+ if db is not None:
50
+ state.db = db
51
+ if dbs is not None:
52
+ state.dbs = dbs
53
+ return Request(
54
+ method="GET",
55
+ path=path or self.healthz_path,
56
+ headers={},
57
+ query=query or {},
58
+ path_params={},
59
+ body=b"",
60
+ state=state,
61
+ )
62
+
63
+ def available_db_request(self) -> Request:
64
+ return self.request(db=AvailableDiagnosticsDb())
65
+
66
+ def unavailable_db_request(self) -> Request:
67
+ return self.request(db=UnavailableDiagnosticsDb())
68
+
69
+ def multi_db_request(self, *, detail: str | None = None) -> Request:
70
+ query = {"dbs": [detail]} if detail is not None else {}
71
+ return self.request(
72
+ dbs={
73
+ "primary": AvailableDiagnosticsDb(),
74
+ "analytics": AvailableDiagnosticsDb(),
75
+ "archive": UnavailableDiagnosticsDb(),
76
+ },
77
+ query=query,
78
+ )
79
+
80
+ def no_db_warning_request(self) -> Request:
81
+ return self.request(query={"warn_no_db": ["1"]})
82
+
83
+
84
+ def build_system_diagnostics_fixture(
85
+ *,
86
+ prefix: str = "/internal",
87
+ ) -> SystemDiagnosticsFixture:
88
+ app = TigrblApp(engine=mem(async_=False), mount_system=False)
89
+ app.include_table(SystemDiagnosticsFixtureWidget)
90
+ app.initialize()
91
+ app.mount_jsonrpc()
92
+ app.include_router(mount_diagnostics(app), prefix=prefix)
93
+
94
+ return SystemDiagnosticsFixture(
95
+ app=app,
96
+ healthz_path=f"{prefix.rstrip('/')}/healthz",
97
+ absent_default_path="/system/healthz",
98
+ expected_healthz_payload={"ok": True},
99
+ warning_vocabulary=frozenset({"db-not-configured", "db-unavailable"}),
100
+ )
@@ -1,5 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from copy import deepcopy
4
+
3
5
  from sqlalchemy import Column, String
4
6
  import pytest
5
7
 
@@ -44,6 +46,57 @@ def test_appspec_corpus_fixture_schema_and_ids(filename: str, lane: str) -> None
44
46
  validate_corpus(corpus, lane=lane)
45
47
 
46
48
 
49
+ @pytest.mark.acceptance
50
+ def test_canonical_corpus_cases_have_unique_routes_tables_and_modes() -> None:
51
+ corpus = load_corpus("appspec_corpus.canonical.json")
52
+ validate_corpus(corpus, lane="canonical")
53
+
54
+ case_ids = [case["id"] for case in corpus["cases"]]
55
+ table_names = [case["table"]["tablename"] for case in corpus["cases"]]
56
+ modes = [case["mode"] for case in corpus["cases"]]
57
+
58
+ assert len(case_ids) == len(set(case_ids))
59
+ assert len(table_names) == len(set(table_names))
60
+ assert set(modes) == {"rest_rpc_parity", "rest_rpc_roundtrip"}
61
+
62
+
63
+ @pytest.mark.acceptance
64
+ def test_canonical_corpus_compilation_is_deterministic() -> None:
65
+ corpus = load_corpus("appspec_corpus.canonical.json")
66
+ validate_corpus(corpus, lane="canonical")
67
+ case = corpus["cases"][0]
68
+
69
+ def compile_signature() -> tuple[str, str, tuple[str | None, ...]]:
70
+ widget = _make_widget_model(
71
+ tablename=case["table"]["tablename"],
72
+ resource=case["table"]["resource"],
73
+ include_jsonrpc=True,
74
+ )
75
+ spec = AppSpec(
76
+ title=case["app"]["title"],
77
+ version=case["app"]["version"],
78
+ engine=mem(async_=False),
79
+ tables=(widget,),
80
+ jsonrpc_prefix=case["app"]["jsonrpc_prefix"],
81
+ system_prefix=case["app"]["system_prefix"],
82
+ )
83
+ app = TigrblApp.from_spec(spec)
84
+ paths = tuple(sorted(getattr(route, "path", None) for route in app.routes))
85
+ return app.title, app.version, paths
86
+
87
+ assert compile_signature() == compile_signature()
88
+
89
+
90
+ @pytest.mark.acceptance
91
+ def test_negative_corpus_rejects_duplicate_case_ids() -> None:
92
+ corpus = load_corpus("appspec_corpus.negative.json")
93
+ duplicate = deepcopy(corpus)
94
+ duplicate["cases"][1]["id"] = duplicate["cases"][0]["id"]
95
+
96
+ with pytest.raises(ValueError, match="duplicate case id"):
97
+ validate_corpus(duplicate, lane="negative")
98
+
99
+
47
100
  @pytest.mark.acceptance
48
101
  def test_canonical_corpus_materializes_rpc_mounts() -> None:
49
102
  corpus = load_corpus("appspec_corpus.canonical.json")
@@ -138,3 +138,49 @@ async def test_negative_corpus_unknown_rpc_method_returns_fail_closed_contract()
138
138
  assert body.get("detail") == case["expect"]["detail"]
139
139
  finally:
140
140
  await stop_uvicorn(server, task)
141
+
142
+
143
+ @pytest.mark.acceptance
144
+ @pytest.mark.asyncio
145
+ async def test_negative_corpus_no_rpc_binding_has_no_rpc_runtime_side_effect() -> None:
146
+ corpus = load_corpus("appspec_corpus.negative.json")
147
+ validate_corpus(corpus, lane="negative")
148
+ case = next(c for c in corpus["cases"] if c["mode"] == "no_rpc_binding_no_mount")
149
+
150
+ widget = _make_widget_model(
151
+ tablename=case["table"]["tablename"],
152
+ resource=case["table"]["resource"],
153
+ include_jsonrpc=False,
154
+ )
155
+ spec = AppSpec(
156
+ title=case["app"]["title"],
157
+ version=case["app"]["version"],
158
+ engine=mem(async_=False),
159
+ tables=(widget,),
160
+ jsonrpc_prefix=case["app"]["jsonrpc_prefix"],
161
+ system_prefix=case["app"]["system_prefix"],
162
+ )
163
+ app = TigrblApp.from_spec(spec)
164
+ port = pick_unique_port()
165
+ base_url, server, task = await start_uvicorn(app, port=port)
166
+ try:
167
+ async with httpx.AsyncClient(base_url=base_url, timeout=10.0) as client:
168
+ missing_rpc = await client.post(
169
+ f"{case['app']['jsonrpc_prefix']}/",
170
+ json={
171
+ "jsonrpc": "2.0",
172
+ "method": "Widget.create",
173
+ "params": {"name": "should-not-execute"},
174
+ "id": 44,
175
+ },
176
+ )
177
+ rest = await client.post(
178
+ f"/{case['table']['resource']}",
179
+ json={"name": "rest-still-works"},
180
+ )
181
+
182
+ assert missing_rpc.status_code == 404
183
+ assert missing_rpc.json()["detail"] == "No runtime operation matched request."
184
+ assert rest.status_code in {200, 201}
185
+ finally:
186
+ await stop_uvicorn(server, task)
@@ -48,6 +48,13 @@ def test_kernel_ensure_primed_compiles_plan_once() -> None:
48
48
  plan2 = _default_kernel.kernel_plan(app)
49
49
 
50
50
  assert plan1 is plan2
51
+ packed = plan1.packed
52
+ assert packed is not None
53
+ assert len(packed.atom_catalog_labels) <= len(packed.step_table)
54
+ assert len(packed.segment_catalog_offsets) <= len(packed.program_segment_refs)
55
+ assert len(packed.program_error_profile_ids) == len(plan1.opmeta)
56
+ assert packed.hot_block_bytes.startswith(b"TGPKHOT1")
57
+ assert isinstance(packed.hot_block_view, dict)
51
58
 
52
59
 
53
60
  def test_opview_is_compiled_once_per_model_alias() -> None:
@@ -30,7 +30,7 @@ def test_hook_ctx_invalid_string_anchor_raises_immediately():
30
30
  assert "Invalid hook phase 'IN_BUILD'." in message
31
31
  assert "Valid phases are:" in message
32
32
  assert "PRE_HANDLER" in message
33
- assert "ON_ROLLBACK" in message
33
+ assert "TX_ROLLBACK" in message
34
34
 
35
35
 
36
36
  def test_hook_ctx_valid_enum_anchor_does_not_raise():
@@ -52,4 +52,4 @@ def test_hook_ctx_invalid_enum_anchor_raises_immediately():
52
52
  assert "Invalid hook phase 'IN_BUILD'." in message
53
53
  assert "Valid phases are:" in message
54
54
  assert "PRE_HANDLER" in message
55
- assert "ON_ROLLBACK" in message
55
+ assert "TX_ROLLBACK" in message
@@ -30,7 +30,7 @@ def test_hook_ctx_invalid_string_anchor_raises_immediately():
30
30
  assert "Invalid hook phase 'IN_BUILD'." in message
31
31
  assert "Valid phases are:" in message
32
32
  assert "PRE_HANDLER" in message
33
- assert "ON_ROLLBACK" in message
33
+ assert "TX_ROLLBACK" in message
34
34
 
35
35
 
36
36
  def test_hook_ctx_valid_enum_anchor_does_not_raise():
@@ -52,5 +52,5 @@ def test_hook_ctx_invalid_enum_anchor_raises_immediately():
52
52
  assert "Invalid hook phase 'IN_BUILD'." in message
53
53
  assert "Valid phases are:" in message
54
54
  assert "PRE_HANDLER" in message
55
- assert "ON_ROLLBACK" in message
55
+ assert "TX_ROLLBACK" in message
56
56
 
@@ -0,0 +1,103 @@
1
+ from __future__ import annotations
2
+
3
+ from httpx import ASGITransport, Client
4
+ from sqlalchemy.orm import sessionmaker
5
+
6
+ from tigrbl import HTTPBearer, Request, TableBase, TigrblApp, TigrblRouter
7
+ from tigrbl import resolver as _resolver
8
+ from tigrbl._concrete._security.http_bearer import HTTPAuthorizationCredentials
9
+ from tigrbl.decorators.allow_anon import allow_anon
10
+ from tigrbl.factories.engine import mem
11
+ from tigrbl.orm.mixins import GUIDPk
12
+ from tigrbl.runtime.status import HTTPException
13
+ from tigrbl.security import Security
14
+ from tigrbl.types import AuthNProvider, Column, String, uuid4
15
+
16
+
17
+ class RequiredBearerAuth(AuthNProvider):
18
+ async def get_principal(
19
+ self,
20
+ request: Request,
21
+ creds: HTTPAuthorizationCredentials = Security(HTTPBearer()),
22
+ ) -> dict:
23
+ if creds.credentials != "secret":
24
+ raise HTTPException(status_code=401)
25
+ return {"sub": "user"}
26
+
27
+
28
+ def _client_with_required_auth() -> Client:
29
+ TableBase.metadata.clear()
30
+
31
+ class Secret(TableBase, GUIDPk):
32
+ __tablename__ = "auth_status_projection_secret"
33
+ name = Column(String, nullable=False)
34
+
35
+ app = TigrblApp(engine=mem(async_=False))
36
+ app.set_auth(authn=RequiredBearerAuth().get_principal)
37
+ app.include_table(Secret)
38
+ app.initialize()
39
+ return Client(transport=ASGITransport(app=app), base_url="http://test")
40
+
41
+
42
+ def test_required_bearer_auth_projects_missing_and_wrong_credentials_statuses() -> None:
43
+ client = _client_with_required_auth()
44
+ try:
45
+ missing = client.get("/secret")
46
+ wrong = client.get(
47
+ "/secret", headers={"Authorization": "Bearer wrong"}
48
+ )
49
+
50
+ assert missing.status_code == 403
51
+ assert wrong.status_code == 401
52
+ assert "traceback" not in missing.text.lower()
53
+ assert "traceback" not in wrong.text.lower()
54
+ finally:
55
+ client.close()
56
+
57
+
58
+ def test_required_bearer_auth_projects_openapi_security_for_protected_route() -> None:
59
+ client = _client_with_required_auth()
60
+ try:
61
+ spec = client.get("/openapi.json").json()
62
+ security = spec["paths"]["/secret"]["get"]["security"]
63
+
64
+ assert security == [{"HTTPBearer": []}]
65
+ assert spec["components"]["securitySchemes"]["HTTPBearer"] == {
66
+ "type": "http",
67
+ "scheme": "bearer",
68
+ }
69
+ finally:
70
+ client.close()
71
+
72
+
73
+ def test_allow_anon_create_projects_rest_created_status_without_credentials() -> None:
74
+ TableBase.metadata.clear()
75
+
76
+ @allow_anon("create")
77
+ class PublicItem(TableBase, GUIDPk):
78
+ __tablename__ = "auth_status_projection_public_item"
79
+ name = Column(String, nullable=False)
80
+
81
+ router = TigrblRouter(engine=mem(async_=False))
82
+ router.include_table(PublicItem)
83
+ router.initialize()
84
+ app = TigrblApp()
85
+ app.include_router(router)
86
+ app.initialize()
87
+
88
+ provider = _resolver.resolve_provider()
89
+ engine, _ = provider.ensure()
90
+ SessionLocal = sessionmaker(bind=engine, expire_on_commit=False)
91
+
92
+ client = Client(transport=ASGITransport(app=app), base_url="http://test")
93
+ try:
94
+ payload = {"id": str(uuid4()), "name": "public"}
95
+ response = client.post("/publicitem", json=payload)
96
+ openapi = client.get("/openapi.json").json()
97
+
98
+ assert response.status_code == 201
99
+ assert openapi["paths"]["/publicitem"]["post"].get("security") in (None, [])
100
+ with SessionLocal() as db:
101
+ assert db.query(PublicItem).count() == 1
102
+ finally:
103
+ client.close()
@@ -76,7 +76,7 @@ def test_hooks_normalize_and_attach(model_cls, specs):
76
76
  _bind_model_hooks(model_cls, tuple(specs))
77
77
  # default transactional steps are no longer injected
78
78
  assert not model_cls.hooks.create.START_TX
79
- assert not model_cls.hooks.create.END_TX
79
+ assert not model_cls.hooks.create.TX_COMMIT
80
80
 
81
81
 
82
82
  @pytest.mark.i9n
@@ -389,4 +389,4 @@ def test_op_ctx_system_steps(sync_db_session):
389
389
  chains = build_phase_chains(Widget, "ping")
390
390
 
391
391
  assert chains["START_TX"]
392
- assert chains["END_TX"]
392
+ assert chains["TX_COMMIT"]
@@ -0,0 +1,218 @@
1
+ from __future__ import annotations
2
+
3
+ from inspect import isawaitable
4
+ from typing import Any
5
+ import uuid
6
+
7
+ import httpx
8
+ import pytest
9
+
10
+ from tigrbl import TigrblApp, TigrblRouter, op_ctx
11
+ from tigrbl.factories.engine import mem
12
+ from tigrbl.orm.mixins import GUIDPk
13
+ from tigrbl.orm.tables import TableBase
14
+ from tigrbl.types import BaseModel, Column, String
15
+
16
+ from .uvicorn_utils import run_uvicorn_in_task, stop_uvicorn_server
17
+
18
+
19
+ class TokenInventorySchema(BaseModel):
20
+ access_tokens: int
21
+ refresh_tokens: int
22
+
23
+
24
+ def _payload() -> dict[str, int]:
25
+ return {"access_tokens": 3, "refresh_tokens": 1}
26
+
27
+
28
+ def _table_name(prefix: str) -> str:
29
+ return f"{prefix}_{uuid.uuid4().hex[:8]}"
30
+
31
+
32
+ async def _initialize(app: TigrblApp) -> None:
33
+ result = app.initialize()
34
+ if isawaitable(result):
35
+ await result
36
+
37
+
38
+ async def _post_via_uvicorn(app: TigrblApp, path: str) -> httpx.Response:
39
+ base_url, server, task = await run_uvicorn_in_task(app)
40
+ try:
41
+ async with httpx.AsyncClient() as client:
42
+ return await client.post(f"{base_url}{path}", json={})
43
+ finally:
44
+ await stop_uvicorn_server(server, task)
45
+
46
+
47
+ def _operation_paths(app: TigrblApp) -> set[str]:
48
+ return {getattr(route, "path", "") for route in getattr(app, "routes", ())}
49
+
50
+
51
+ def _route_ops(app: TigrblApp) -> tuple[Any, ...]:
52
+ route_model = app.tables["__tigrbl_route_ops__"]
53
+ return tuple(getattr(getattr(route_model, "ops", None), "all", ()) or ())
54
+
55
+
56
+ def _model_op(app: TigrblApp, model_name: str, alias: str) -> Any:
57
+ model = app.tables[model_name]
58
+ return next(
59
+ spec
60
+ for spec in tuple(getattr(getattr(model, "ops", None), "all", ()) or ())
61
+ if getattr(spec, "alias", "") == alias
62
+ )
63
+
64
+
65
+ @pytest.mark.i9n
66
+ @pytest.mark.asyncio
67
+ async def test_table_owned_op_ctx_materializes_through_include_table_and_executes_under_uvicorn() -> None:
68
+ TableBase.metadata.clear()
69
+
70
+ class Inventory(TableBase, GUIDPk):
71
+ __tablename__ = _table_name("owner_scope_table_inventory")
72
+ __resource__ = "inventory"
73
+ name = Column(String)
74
+
75
+ @op_ctx(
76
+ alias="token_inventory",
77
+ target="custom",
78
+ arity="collection",
79
+ response_schema=TokenInventorySchema,
80
+ persist="skip",
81
+ )
82
+ def token_inventory(cls, ctx):
83
+ return _payload()
84
+
85
+ app = TigrblApp(engine=mem(async_=False))
86
+ app.include_table(Inventory, prefix="")
87
+ await _initialize(app)
88
+
89
+ assert "/inventory/token_inventory" in _operation_paths(app)
90
+ assert "/inventory/token_inventory" in app.openapi()["paths"]
91
+ assert "TokenInventorySchema" in app.openapi()["components"]["schemas"]
92
+
93
+ response = await _post_via_uvicorn(app, "/inventory/token_inventory")
94
+
95
+ assert response.status_code == 200
96
+ assert response.json() == _payload()
97
+
98
+
99
+ @pytest.mark.i9n
100
+ @pytest.mark.asyncio
101
+ async def test_router_owned_projection_preserves_table_op_ctx_semantics_and_mount_prefix() -> None:
102
+ TableBase.metadata.clear()
103
+
104
+ class Inventory(TableBase, GUIDPk):
105
+ __tablename__ = _table_name("owner_scope_router_inventory")
106
+ __resource__ = "inventory"
107
+ name = Column(String)
108
+
109
+ @op_ctx(
110
+ alias="token_inventory",
111
+ target="custom",
112
+ arity="collection",
113
+ response_schema=TokenInventorySchema,
114
+ persist="skip",
115
+ )
116
+ def token_inventory(cls, ctx):
117
+ return _payload()
118
+
119
+ router = TigrblRouter(engine=mem(async_=False))
120
+ router.include_table(Inventory, prefix="")
121
+ router_init = router.initialize()
122
+ if isawaitable(router_init):
123
+ await router_init
124
+
125
+ app = TigrblApp(engine=mem(async_=False))
126
+ app.include_router(router, prefix="/tenant")
127
+ await _initialize(app)
128
+
129
+ token_op = _model_op(app, "Inventory", "token_inventory")
130
+ binding = token_op.bindings[0]
131
+
132
+ assert "/tenant/inventory/token_inventory" in _operation_paths(app)
133
+ assert binding.path == "/tenant/inventory/token_inventory"
134
+ assert token_op.response_model is TokenInventorySchema
135
+ assert token_op.persist == "skip"
136
+
137
+ response = await _post_via_uvicorn(app, "/tenant/inventory/token_inventory")
138
+
139
+ assert response.status_code == 200
140
+ assert response.json() == _payload()
141
+
142
+
143
+ @pytest.mark.i9n
144
+ @pytest.mark.asyncio
145
+ async def test_app_local_op_ctx_materializes_without_table_owner_and_executes_under_uvicorn() -> None:
146
+ TableBase.metadata.clear()
147
+
148
+ class InventoryApp(TigrblApp):
149
+ @op_ctx(
150
+ alias="token_inventory",
151
+ target="custom",
152
+ arity="collection",
153
+ response_schema=TokenInventorySchema,
154
+ persist="skip",
155
+ )
156
+ def token_inventory(cls, ctx):
157
+ return _payload()
158
+
159
+ app = InventoryApp(engine=mem(async_=False))
160
+ await _initialize(app)
161
+
162
+ token_op = _model_op(app, "InventoryApp", "token_inventory")
163
+
164
+ assert "/inventoryapp/token_inventory" in _operation_paths(app)
165
+ assert "/inventoryapp/token_inventory" in app.openapi()["paths"]
166
+ assert token_op.table is InventoryApp
167
+ assert token_op.response_model is TokenInventorySchema
168
+
169
+ response = await _post_via_uvicorn(app, "/inventoryapp/token_inventory")
170
+
171
+ assert response.status_code == 200
172
+ assert response.json() == _payload()
173
+
174
+
175
+ @pytest.mark.i9n
176
+ @pytest.mark.asyncio
177
+ async def test_owner_scope_member_arity_uses_member_route_shape_across_table_router_and_app() -> None:
178
+ TableBase.metadata.clear()
179
+
180
+ class TableScoped(TableBase, GUIDPk):
181
+ __tablename__ = _table_name("owner_scope_member_table")
182
+ __resource__ = "table_inventory"
183
+ name = Column(String)
184
+
185
+ @op_ctx(alias="inspect", target="custom", arity="member", persist="skip")
186
+ def inspect(cls, ctx):
187
+ return {"scope": "table"}
188
+
189
+ class RouterScoped(TableBase, GUIDPk):
190
+ __tablename__ = _table_name("owner_scope_member_router")
191
+ __resource__ = "router_inventory"
192
+ name = Column(String)
193
+
194
+ @op_ctx(alias="inspect", target="custom", arity="member", persist="skip")
195
+ def inspect(cls, ctx):
196
+ return {"scope": "router"}
197
+
198
+ class AppScoped(TigrblApp):
199
+ @op_ctx(alias="inspect", target="custom", arity="member", persist="skip")
200
+ def inspect(cls, ctx):
201
+ return {"scope": "app"}
202
+
203
+ router = TigrblRouter(engine=mem(async_=False))
204
+ router.include_table(RouterScoped, prefix="")
205
+ router_init = router.initialize()
206
+ if isawaitable(router_init):
207
+ await router_init
208
+
209
+ app = AppScoped(engine=mem(async_=False))
210
+ app.include_table(TableScoped, prefix="")
211
+ app.include_router(router, prefix="/mounted")
212
+ await _initialize(app)
213
+
214
+ paths = _operation_paths(app)
215
+
216
+ assert "/table_inventory/{item_id}/inspect" in paths
217
+ assert "/mounted/router_inventory/{item_id}/inspect" in paths
218
+ assert "/appscoped/{item_id}/inspect" in paths
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from pathlib import Path
5
+
6
+
7
+ ROOT = Path(__file__).resolve().parents[5]
8
+
9
+
10
+ def test_atom_parity_corpus_covers_every_generated_feature() -> None:
11
+ inventory = json.loads((ROOT / ".ssot/reports/python-rust-atom-parity-inventory.json").read_text(encoding="utf-8"))
12
+ results = json.loads((ROOT / ".ssot/reports/python-rust-atom-parity-results.json").read_text(encoding="utf-8"))
13
+
14
+ by_atom = {item["atom_id"]: item for item in results["results"]}
15
+ assert results["status"] == "passed"
16
+ assert set(by_atom) == {item["id"] for item in inventory["units"]}
17
+ assert all(item["checks"]["inventory_tracked"] for item in by_atom.values())
18
+ assert all(item["checks"]["feature_mapped"] for item in by_atom.values())
19
+ assert all(item["checks"]["runtime_lanes_declared"] for item in by_atom.values())
20
+
21
+
22
+ def test_matched_atoms_are_marked_for_semantic_pair_checks() -> None:
23
+ inventory = json.loads((ROOT / ".ssot/reports/python-rust-atom-parity-inventory.json").read_text(encoding="utf-8"))
24
+ results = json.loads((ROOT / ".ssot/reports/python-rust-atom-parity-results.json").read_text(encoding="utf-8"))
25
+
26
+ matched = {item["id"] for item in inventory["units"] if item["state"] == "matched"}
27
+ checked = {item["atom_id"] for item in results["results"] if item["checks"]["semantic_pair_required"]}
28
+ assert matched
29
+ assert checked == matched