tigrbl_tests 0.3.12.dev17__tar.gz → 0.3.23.dev1__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 (365) hide show
  1. tigrbl_tests-0.3.23.dev1/PKG-INFO +60 -0
  2. tigrbl_tests-0.3.23.dev1/README.md +23 -0
  3. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/pyproject.toml +3 -3
  4. tigrbl_tests-0.3.23.dev1/tests/__init__.py +25 -0
  5. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/architecture/test_runtime_structure.py +3 -0
  6. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/conftest.py +2 -1
  7. tigrbl_tests-0.3.23.dev1/tests/fixtures/appspec_corpus.canonical.json +55 -0
  8. tigrbl_tests-0.3.23.dev1/tests/fixtures/appspec_corpus.negative.json +44 -0
  9. tigrbl_tests-0.3.23.dev1/tests/fixtures/appspec_corpus_loader.py +49 -0
  10. tigrbl_tests-0.3.23.dev1/tests/fixtures/cli_smoke_app.py +25 -0
  11. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness/test_03_appspec_uvicorn_e2e.py +2 -1
  12. tigrbl_tests-0.3.23.dev1/tests/harness/test_04_appspec_corpus_fixture.py +101 -0
  13. tigrbl_tests-0.3.23.dev1/tests/harness/test_05_appspec_metamorphic.py +151 -0
  14. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_e2e/test_00_appspec_uvicorn_rest_rpc.py +3 -2
  15. tigrbl_tests-0.3.23.dev1/tests/harness_e2e/test_01_appspec_corpus_uvicorn.py +140 -0
  16. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_e2e/test_01_imperative_uvicorn_rest_rpc.py +2 -1
  17. tigrbl_tests-0.3.23.dev1/tests/harness_v3/__init__.py +126 -0
  18. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_bootstrap_kernel_compilation.py +2 -1
  19. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_default_opspec_bindings.py +2 -1
  20. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_kernel_plan_routing.py +3 -2
  21. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_uvicorn_e2e_appspec.py +2 -1
  22. tigrbl_tests-0.3.12.dev17/tests/hooks/test_hook_ctx_phase_validation.py → tigrbl_tests-0.3.23.dev1/tests/hooks/test_hook_ctx_stage_validation.py +4 -4
  23. tigrbl_tests-0.3.23.dev1/tests/i9n/__init__.py +56 -0
  24. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_allow_anon.py +2 -1
  25. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_apikey_generation.py +3 -2
  26. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_authn_provider_integration.py +2 -1
  27. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_bindings_integration.py +4 -3
  28. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_bindings_modules.py +2 -1
  29. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_core_access.py +2 -1
  30. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_engine_install_uvicorn.py +3 -2
  31. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_engine_resolver_uvicorn.py +2 -1
  32. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_field_spec_effects.py +3 -2
  33. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_header_io_uvicorn.py +2 -1
  34. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_hook_lifecycle.py +4 -3
  35. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_iospec_attributes.py +5 -4
  36. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_iospec_integration.py +3 -2
  37. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_key_digest_uvicorn.py +2 -1
  38. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_mixins.py +2 -1
  39. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_mountable_openrpc_uvicorn.py +2 -1
  40. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_nested_routing_depth.py +2 -1
  41. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_op_ctx_alias_examples.py +2 -1
  42. tigrbl_tests-0.3.12.dev17/tests/i9n/test_op_ctx_uvicorn_scopes.py → tigrbl_tests-0.3.23.dev1/tests/i9n/test_op_ctx_owner_scope_uvicorn_matrix.py +2 -1
  43. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_openapi_schema_examples_presence.py +3 -2
  44. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_opspec_effects_i9n_test.py +2 -1
  45. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_opspec_pre_tx_deps.py +30 -9
  46. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_owner_tenant_policy.py +3 -2
  47. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_request_extras.py +2 -1
  48. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_rest_fallback_serialization.py +3 -2
  49. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_rest_row_serialization.py +3 -2
  50. tigrbl_tests-0.3.23.dev1/tests/i9n/test_rest_rpc_parity_v3.py +81 -0
  51. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_row_result_serialization.py +3 -2
  52. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_schema_ctx_attributes_integration.py +2 -1
  53. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_schema_ctx_op_ctx_integration.py +2 -1
  54. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_schema_ctx_spec_integration.py +3 -2
  55. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_sqlite_attachments.py +2 -1
  56. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_tigrbl_api_app_usage_uvicorn.py +3 -2
  57. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_tigrbl_api_usage_uvicorn.py +3 -2
  58. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_tigrbl_api_uvicorn.py +3 -2
  59. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_tigrbl_app_include_api_uvicorn.py +3 -2
  60. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_tigrbl_app_multi_api_uvicorn.py +3 -2
  61. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_tigrbl_app_usage_uvicorn.py +3 -2
  62. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_tigrbl_app_uvicorn.py +3 -2
  63. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_v3_bulk_rest_endpoints.py +2 -1
  64. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_v3_default_rest_ops.py +3 -2
  65. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_v3_default_rpc_ops.py +3 -2
  66. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_v3_opspec_attributes.py +2 -1
  67. tigrbl_tests-0.3.23.dev1/tests/parity/__init__.py +22 -0
  68. tigrbl_tests-0.3.23.dev1/tests/parity/test_executor_metamorphic_parity.py +267 -0
  69. tigrbl_tests-0.3.12.dev17/tests/parity/test_hook_runtime_phase_parity.py → tigrbl_tests-0.3.23.dev1/tests/parity/test_hook_runtime_stage_parity.py +1 -1
  70. tigrbl_tests-0.3.23.dev1/tests/perf/__init__.py +95 -0
  71. tigrbl_tests-0.3.23.dev1/tests/perf/benchmark_results_create_uvicorn.json +502 -0
  72. tigrbl_tests-0.3.23.dev1/tests/perf/benchmark_results_create_uvicorn_sequential_10_rounds.json +502 -0
  73. tigrbl_tests-0.3.23.dev1/tests/perf/benchmark_results_executors_seq_10_rounds.json +915 -0
  74. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/perf/helper_fastapi_create_app.py +15 -2
  75. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/perf/helper_tigrbl_create_app.py +17 -3
  76. tigrbl_tests-0.3.23.dev1/tests/perf/test_fastapi_vs_tigrbl_executor_benchmark.py +434 -0
  77. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/perf/test_tigrbl_create_call_graph.py +3 -1
  78. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/perf/test_tigrbl_vs_fastapi_create_benchmark.py +17 -2
  79. tigrbl_tests-0.3.23.dev1/tests/perf/tigrbl_create_call_graph_250_ops.json +1589 -0
  80. tigrbl_tests-0.3.23.dev1/tests/rust/atoms/test_rust_atoms_public_surface.py +22 -0
  81. tigrbl_tests-0.3.23.dev1/tests/rust/ffi/test_rust_binding_trace.py +13 -0
  82. tigrbl_tests-0.3.23.dev1/tests/rust/kernel/test_rust_kernel_public_surface.py +21 -0
  83. tigrbl_tests-0.3.23.dev1/tests/rust/parity/test_rust_parity_contract.py +112 -0
  84. tigrbl_tests-0.3.23.dev1/tests/rust/runtime/test_rust_runtime_engine_policy.py +34 -0
  85. tigrbl_tests-0.3.23.dev1/tests/rust/runtime/test_rust_runtime_public_surface.py +59 -0
  86. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/security/test_schemes.py +27 -1
  87. tigrbl_tests-0.3.23.dev1/tests/unit/__init__.py +2 -0
  88. tigrbl_tests-0.3.23.dev1/tests/unit/decorators/test_declarative_surface.py +140 -0
  89. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/response_utils.py +2 -1
  90. tigrbl_tests-0.3.12.dev17/tests/unit/runtime/test_atom_stage_phase_window_static.py → tigrbl_tests-0.3.23.dev1/tests/unit/runtime/test_atom_stage_window_static.py +3 -3
  91. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_events_runtime_behavior.py +1 -1
  92. tigrbl_tests-0.3.12.dev17/tests/unit/runtime/test_events_phases.py → tigrbl_tests-0.3.23.dev1/tests/unit/runtime/test_events_stages.py +7 -7
  93. tigrbl_tests-0.3.12.dev17/tests/unit/runtime/test_ingress_egress_phase_access.py → tigrbl_tests-0.3.23.dev1/tests/unit/runtime/test_ingress_egress_access.py +11 -11
  94. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_kernel_runtime_behavior.py +2 -1
  95. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_acol_vcol_knobs.py +2 -1
  96. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_app_model_defaults.py +3 -2
  97. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_base_facade_initialize.py +2 -1
  98. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_build_list_params_spec_model.py +2 -1
  99. tigrbl_tests-0.3.23.dev1/tests/unit/test_cli_cmds.py +220 -0
  100. tigrbl_tests-0.3.23.dev1/tests/unit/test_cli_srv.py +254 -0
  101. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_column_collect_mixins.py +2 -1
  102. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_column_rest_rpc_results.py +3 -2
  103. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_core_crud_bulk_ops.py +2 -1
  104. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_core_crud_default_ops.py +2 -1
  105. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_core_crud_methods.py +4 -3
  106. tigrbl_tests-0.3.23.dev1/tests/unit/test_declared_surface_docs.py +98 -0
  107. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_default_schema_selection.py +2 -1
  108. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_docs_security_parity.py +24 -13
  109. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_engine_install_api.py +2 -1
  110. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_engine_install_app.py +2 -1
  111. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_engine_install_op.py +3 -2
  112. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_engine_install_table.py +3 -2
  113. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_engine_session_database_availability.py +2 -1
  114. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_engine_spec_and_shortcuts.py +3 -2
  115. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_engine_usage_levels.py +2 -1
  116. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_field_spec_attrs.py +2 -1
  117. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_file_response.py +2 -1
  118. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_hook_ctx_attributes.py +1 -1
  119. tigrbl_tests-0.3.12.dev17/tests/unit/test_hookz_empty_phase.py → tigrbl_tests-0.3.23.dev1/tests/unit/test_hookz_empty_stage.py +2 -2
  120. tigrbl_tests-0.3.23.dev1/tests/unit/test_http_route_registration.py +111 -0
  121. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_initialize_async_task.py +2 -1
  122. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_initialize_cross_ddl.py +3 -2
  123. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_initialize_mixed_engines.py +2 -1
  124. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_initialize_task_schedule.py +2 -1
  125. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_instance_naming_conventions.py +2 -1
  126. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_io_spec_attributes.py +2 -1
  127. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_iospec_effects.py +2 -1
  128. tigrbl_tests-0.3.23.dev1/tests/unit/test_jsonrpc_openrpc.py +313 -0
  129. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_kernel_opview_on_demand.py +2 -1
  130. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_make_column_shortcuts.py +2 -1
  131. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_class_engine_binding.py +3 -2
  132. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_openapi_documentation_security_behavior.py +26 -5
  133. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_openapi_openrpc_schema_separation.py +3 -2
  134. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_openrpc_documentation_security_behavior.py +26 -5
  135. tigrbl_tests-0.3.23.dev1/tests/unit/test_operator_surface_closure.py +236 -0
  136. tigrbl_tests-0.3.23.dev1/tests/unit/test_operator_surface_docs_parity.py +35 -0
  137. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_opspec_effects.py +2 -1
  138. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_relationship_alias_cols.py +2 -1
  139. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_resolver_interning_warmup.py +2 -1
  140. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_resolver_precedence.py +4 -3
  141. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_alias_table_rpc.py +3 -2
  142. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_uuid.py +3 -2
  143. tigrbl_tests-0.3.23.dev1/tests/unit/test_rest_jsonrpc_metamorphic_default_ops.py +469 -0
  144. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_no_schema_jsonable.py +3 -2
  145. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rpc_all_default_op_verbs.py +3 -2
  146. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rpc_default_ops.py +3 -2
  147. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_schema_spec_presence.py +4 -3
  148. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_api.py +2 -1
  149. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_app.py +2 -1
  150. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_engine.py +3 -2
  151. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_hook.py +2 -1
  152. tigrbl_tests-0.3.23.dev1/tests/unit/test_spec_snapshots.py +234 -0
  153. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_table.py +2 -1
  154. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_system_docs_builders.py +1 -0
  155. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_table_collect_spec.py +2 -1
  156. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_table_namespace_init.py +2 -1
  157. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_table_namespace_isolation.py +2 -1
  158. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_api_app_configuration.py +3 -2
  159. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_api_app_instantiation.py +3 -2
  160. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_api_app_subclass_definition.py +2 -1
  161. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_api_configuration.py +2 -1
  162. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_api_instantiation.py +3 -2
  163. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_api_subclass_definition.py +2 -1
  164. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_app_configuration.py +2 -1
  165. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_app_instantiation.py +3 -2
  166. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_app_state.py +2 -1
  167. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_app_subclass_definition.py +2 -1
  168. tigrbl_tests-0.3.23.dev1/tests/unit/test_transport_dispatch_parity_contract.py +8 -0
  169. tigrbl_tests-0.3.23.dev1/tests/unit/test_v3_default_root_endpoint.py +50 -0
  170. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_v3_storage_spec_attributes.py +2 -1
  171. tigrbl_tests-0.3.12.dev17/PKG-INFO +0 -117
  172. tigrbl_tests-0.3.12.dev17/README.md +0 -80
  173. tigrbl_tests-0.3.12.dev17/tests/__init__.py +0 -0
  174. tigrbl_tests-0.3.12.dev17/tests/harness_v3/__init__.py +0 -0
  175. tigrbl_tests-0.3.12.dev17/tests/i9n/__init__.py +0 -0
  176. tigrbl_tests-0.3.12.dev17/tests/i9n/test_rest_rpc_parity_v3.py +0 -0
  177. tigrbl_tests-0.3.12.dev17/tests/parity/__init__.py +0 -0
  178. tigrbl_tests-0.3.12.dev17/tests/perf/__init__.py +0 -0
  179. tigrbl_tests-0.3.12.dev17/tests/perf/tigrbl_create_call_graph_250_ops.json +0 -1589
  180. tigrbl_tests-0.3.12.dev17/tests/unit/__init__.py +0 -0
  181. tigrbl_tests-0.3.12.dev17/tests/unit/test_jsonrpc_openrpc.py +0 -196
  182. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/LICENSE +0 -0
  183. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/architecture/test_import_graph_audit.py +0 -0
  184. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/architecture/test_no_bindings_imports.py +0 -0
  185. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/architecture/test_operation_resolution_parity.py +0 -0
  186. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/architecture/test_trace_plan_parity.py +0 -0
  187. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/architecture/test_transport_boundaries.py +0 -0
  188. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/architecture/test_transport_dispatch_convergence.py +0 -0
  189. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness/test_00_appspec_contract.py +0 -0
  190. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness/test_01_kernel_plan_compilation.py +0 -0
  191. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness/test_02_bootstrap_plan.py +0 -0
  192. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/_support.py +0 -0
  193. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_appspec_prefixes.py +0 -0
  194. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_mapping_plan_compilation.py +0 -0
  195. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_route_rpc_prebinding.py +0 -0
  196. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/harness_v3/test_route_runtime_fallback_atoms.py +0 -0
  197. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_acronym_route_name.py +0 -0
  198. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_bulk_docs_client.py +0 -0
  199. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_error_mappings.py +0 -0
  200. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_healthz_methodz_hookz.py +0 -0
  201. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_hook_ctx_v3_i9n.py +0 -0
  202. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_jsonrpc_batch_behavior.py +0 -0
  203. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_list_filters_optional.py +0 -0
  204. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_mountable_favicon_uvicorn.py +0 -0
  205. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_mountable_lens_uvicorn.py +0 -0
  206. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_mountable_openapi_uvicorn.py +0 -0
  207. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_mountable_swagger_uvicorn.py +0 -0
  208. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_nested_path_schema_and_rpc.py +0 -0
  209. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_op_ctx_behavior.py +0 -0
  210. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_op_ctx_core_crud_order.py +0 -0
  211. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_openapi_clear_response_schema.py +0 -0
  212. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_schema.py +0 -0
  213. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_storage_spec_integration.py +0 -0
  214. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_symmetry_parity.py +0 -0
  215. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_transport_dispatch_parity.py +0 -0
  216. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_types_deprecation_exports.py +0 -0
  217. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_uvicorn_transport_behavior.py +0 -0
  218. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/test_verb_alias_policy.py +0 -0
  219. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/i9n/uvicorn_utils.py +0 -0
  220. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/mount/__init__.py +0 -0
  221. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/mount/test_mount_favico.py +0 -0
  222. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/options/test_rest_options.py +0 -0
  223. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/options/test_rpc_options.py +0 -0
  224. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/parity/test_stdapi_openapi_docs.py +0 -0
  225. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/parity/test_stdapi_primitives.py +0 -0
  226. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/parity/test_stdapi_routing.py +0 -0
  227. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/perf/test_collect_caching.py +0 -0
  228. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/perf/test_hookz_performance.py +0 -0
  229. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/perf/test_methodz_performance.py +0 -0
  230. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/request/test_request_asgi_scope_compat.py +0 -0
  231. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/request/test_request_authn_strip.py +0 -0
  232. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/request/test_request_dot_notation.py +0 -0
  233. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/request/test_request_response_conveniences.py +0 -0
  234. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/request/test_request_transport_convenience_dot_notation.py +0 -0
  235. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/requests/test_request_json_modes.py +0 -0
  236. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/response/test_response_dot_notation.py +0 -0
  237. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/response/test_response_transport_convenience_dot_notation.py +0 -0
  238. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/security/test_dot_notation_schemes.py +0 -0
  239. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/test_secdeps_execute_in_pre_tx.py +0 -0
  240. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/decorators/test_alias_ctx_bindings.py +0 -0
  241. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/decorators/test_engine_ctx_bindings.py +0 -0
  242. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/decorators/test_hook_ctx_bindings.py +0 -0
  243. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/decorators/test_op_alias_bindings.py +0 -0
  244. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/decorators/test_op_ctx_bindings.py +0 -0
  245. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/decorators/test_response_ctx_bindings.py +0 -0
  246. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/decorators/test_schema_ctx_bindings.py +0 -0
  247. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_emit_paired_post.py +0 -0
  248. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_emit_paired_pre.py +0 -0
  249. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_emit_readtime_alias.py +0 -0
  250. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_out_masking.py +0 -0
  251. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_refresh_demand.py +0 -0
  252. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_resolve_assemble.py +0 -0
  253. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_resolve_paired_gen.py +0 -0
  254. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_route_protocol_detect.py +0 -0
  255. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_schema_collect_in.py +0 -0
  256. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_schema_collect_out.py +0 -0
  257. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_storage_to_stored.py +0 -0
  258. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_wire_build_in.py +0 -0
  259. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_wire_build_out.py +0 -0
  260. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_wire_dump.py +0 -0
  261. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/atoms/test_wire_validate_in.py +0 -0
  262. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_compilation_runtime_behavior.py +0 -0
  263. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_kernel_plan_event_ordering.py +0 -0
  264. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_kernel_plan_full_ordering.py +0 -0
  265. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_ordering_runtime_behavior.py +0 -0
  266. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_payload_select_header_merge.py +0 -0
  267. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/runtime/test_payload_select_invalid_rpc_params.py +0 -0
  268. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_alias_ctx_op_alias_attributes.py +0 -0
  269. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_alias_ctx_op_attributes.py +0 -0
  270. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_api_level_set_auth.py +0 -0
  271. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_app_reexport.py +0 -0
  272. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_app_spec_normalization.py +0 -0
  273. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_attrdict_vs_simplenamespace.py +0 -0
  274. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_authorize_runtime_secdep.py +0 -0
  275. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_base_columnspec_inheritance.py +0 -0
  276. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_bulk_body_annotation.py +0 -0
  277. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_bulk_response_schema.py +0 -0
  278. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_colspec_map_isolation.py +0 -0
  279. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_column_mro_collect_namespace.py +0 -0
  280. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_column_table_orm_binding.py +0 -0
  281. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_config_dataclass_none.py +0 -0
  282. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_core_wrap_memoization.py +0 -0
  283. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_db_dependency.py +0 -0
  284. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_decorator_and_collect.py +0 -0
  285. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_default_tags.py +0 -0
  286. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_diagnostics_no_compat_module.py +0 -0
  287. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_get_schema.py +0 -0
  288. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_handler_step_qualname.py +0 -0
  289. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_hook_ctx_binding.py +0 -0
  290. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_hybrid_session_run_sync.py +0 -0
  291. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_in_tx.py +0 -0
  292. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_include_model_columns_namespace.py +0 -0
  293. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_include_models_base_prefix.py +0 -0
  294. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_include_tables_base_prefix.py +0 -0
  295. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_iospec_attributes.py +0 -0
  296. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_jsonrpc_id_example.py +0 -0
  297. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_jsonrpc_router_default_tag.py +0 -0
  298. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_kernel_invoke_ctx.py +0 -0
  299. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_kernel_plan_labels.py +0 -0
  300. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_kernelz_endpoint.py +0 -0
  301. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_mapping_bind_response_export.py +0 -0
  302. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_mapping_plan_precedence.py +0 -0
  303. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_middleware_http_and_cors.py +0 -0
  304. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_mixins_sqlalchemy.py +0 -0
  305. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_alias.py +0 -0
  306. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_ctx_arity_paths.py +0 -0
  307. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_ctx_attributes.py +0 -0
  308. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_ctx_core_crud_integration.py +0 -0
  309. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_ctx_custom_target_persist.py +0 -0
  310. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_ctx_dynamic_attach.py +0 -0
  311. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_ctx_parameter_matrix.py +0 -0
  312. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_op_ctx_persist_options.py +0 -0
  313. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_postgres_engine_errors.py +0 -0
  314. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_postgres_env_vars.py +0 -0
  315. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_request_body_schema.py +0 -0
  316. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_request_response_examples.py +0 -0
  317. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_ctx_precedence.py +0 -0
  318. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_diagnostics_kernelz.py +0 -0
  319. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_html_jinja_behavior.py +0 -0
  320. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_parity.py +0 -0
  321. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_rest.py +0 -0
  322. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_rpc.py +0 -0
  323. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_response_template.py +0 -0
  324. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_all_default_op_verbs.py +0 -0
  325. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_bulk_delete_suppresses_clear.py +0 -0
  326. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_operation_id_uniqueness.py +0 -0
  327. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_output_serialization_extras.py +0 -0
  328. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_request_mapping_access.py +0 -0
  329. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_rpc_parity_default_ops.py +0 -0
  330. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_rpc_prefixes.py +0 -0
  331. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_rest_rpc_symmetry.py +0 -0
  332. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_router_compatibility_shims.py +0 -0
  333. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_router_dependency_execution_blocked.py +0 -0
  334. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_schema_ctx_attributes.py +0 -0
  335. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_schema_ctx_plain_class.py +0 -0
  336. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_schemas_binding.py +0 -0
  337. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_security_per_route.py +0 -0
  338. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_should_wire_canonical.py +0 -0
  339. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_column.py +0 -0
  340. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_field.py +0 -0
  341. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_io.py +0 -0
  342. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_op.py +0 -0
  343. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_spec_storage.py +0 -0
  344. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_sqlite_attachments.py +0 -0
  345. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_sqlite_uuid_type.py +0 -0
  346. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_stdapi_request_injection.py +0 -0
  347. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_stdapi_transport_asgi_wsgi.py +0 -0
  348. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_storage_spec_attributes.py +0 -0
  349. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_sys_handler_crud.py +0 -0
  350. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_sys_run_rollback.py +0 -0
  351. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_sys_tx_async_begin.py +0 -0
  352. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_sys_tx_begin.py +0 -0
  353. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_sys_tx_commit.py +0 -0
  354. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_table_base_exports.py +0 -0
  355. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_table_columns_namespace.py +0 -0
  356. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_table_model_attribute_contract.py +0 -0
  357. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_tigrbl_app_event_handlers.py +0 -0
  358. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_transport_gw_contract.py +0 -0
  359. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_transport_security_runtime_only.py +0 -0
  360. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_v3_favicon_endpoint.py +0 -0
  361. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_v3_healthz_endpoint.py +0 -0
  362. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_v3_op_alias.py +0 -0
  363. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_v3_op_ctx_attributes.py +0 -0
  364. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_v3_schemas_and_decorators.py +0 -0
  365. {tigrbl_tests-0.3.12.dev17 → tigrbl_tests-0.3.23.dev1}/tests/unit/test_verbosity.py +0 -0
@@ -0,0 +1,60 @@
1
+ Metadata-Version: 2.4
2
+ Name: tigrbl_tests
3
+ Version: 0.3.23.dev1
4
+ Summary: Test suite and fixtures for the Tigrbl framework.
5
+ License-Expression: Apache-2.0
6
+ License-File: LICENSE
7
+ Keywords: tigrbl,tests,sdk,standards,pytest,fixtures,integration,performance
8
+ Author: Jacob Stewart
9
+ Author-email: jacob@swarmauri.com
10
+ Requires-Python: >=3.10,<3.14
11
+ Classifier: Development Status :: 1 - Planning
12
+ Classifier: Natural Language :: English
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3 :: Only
20
+ Requires-Dist: asyncpg (>=0.30.0)
21
+ Requires-Dist: flake8 (>=7.0)
22
+ Requires-Dist: jinja2 (>=3.1.0)
23
+ Requires-Dist: psycopg2-binary (>=2.9.9)
24
+ Requires-Dist: pytest (>=8.0)
25
+ Requires-Dist: pytest-asyncio (>=0.24.0)
26
+ Requires-Dist: pytest-benchmark (>=4.0.0)
27
+ Requires-Dist: pytest-json-report (>=1.5.0)
28
+ Requires-Dist: pytest-timeout (>=2.3.1)
29
+ Requires-Dist: pytest-xdist (>=3.6.1)
30
+ Requires-Dist: python-dotenv
31
+ Requires-Dist: requests (>=2.32.3)
32
+ Requires-Dist: ruff (>=0.9.9)
33
+ Requires-Dist: tigrbl
34
+ Requires-Dist: tigrbl_client
35
+ Description-Content-Type: text/markdown
36
+
37
+ # tigrbl_tests
38
+
39
+ This file is a package-local distribution entry point.
40
+ It is not the authoritative location for repository governance, current target status, current state reporting, certification claims, or release evidence.
41
+
42
+ ## Canonical repository docs
43
+
44
+ - `README.md`
45
+ - `docs/README.md`
46
+ - `docs/conformance/CURRENT_TARGET.md`
47
+ - `docs/conformance/CURRENT_STATE.md`
48
+ - `docs/conformance/NEXT_STEPS.md`
49
+ - `docs/governance/DOC_POINTERS.md`
50
+ - `docs/developer/PACKAGE_CATALOG.md`
51
+ - `docs/developer/PACKAGE_LAYOUT.md`
52
+
53
+ ## Package identity
54
+
55
+ - workspace path: `pkgs/core/tigrbl_tests`
56
+ - workspace class: core Python package
57
+ - implementation layout: `tigrbl_tests/`
58
+
59
+ Long-form repository documentation is governed from `docs/`.
60
+
@@ -0,0 +1,23 @@
1
+ # tigrbl_tests
2
+
3
+ This file is a package-local distribution entry point.
4
+ It is not the authoritative location for repository governance, current target status, current state reporting, certification claims, or release evidence.
5
+
6
+ ## Canonical repository docs
7
+
8
+ - `README.md`
9
+ - `docs/README.md`
10
+ - `docs/conformance/CURRENT_TARGET.md`
11
+ - `docs/conformance/CURRENT_STATE.md`
12
+ - `docs/conformance/NEXT_STEPS.md`
13
+ - `docs/governance/DOC_POINTERS.md`
14
+ - `docs/developer/PACKAGE_CATALOG.md`
15
+ - `docs/developer/PACKAGE_LAYOUT.md`
16
+
17
+ ## Package identity
18
+
19
+ - workspace path: `pkgs/core/tigrbl_tests`
20
+ - workspace class: core Python package
21
+ - implementation layout: `tigrbl_tests/`
22
+
23
+ Long-form repository documentation is governed from `docs/`.
@@ -1,18 +1,18 @@
1
1
  [project]
2
2
  name = "tigrbl_tests"
3
- version = "0.3.12.dev17"
3
+ version = "0.3.23.dev1"
4
4
  description = "Test suite and fixtures for the Tigrbl framework."
5
5
  license = "Apache-2.0"
6
6
  readme = "README.md"
7
7
  repository = "http://github.com/swarmauri/swarmauri-sdk"
8
- requires-python = ">=3.10,<3.13"
8
+ requires-python = ">=3.10,<3.14"
9
9
  classifiers = [
10
10
  "Development Status :: 1 - Planning",
11
- "License :: OSI Approved :: Apache Software License",
12
11
  "Natural Language :: English",
13
12
  "Programming Language :: Python :: 3.10",
14
13
  "Programming Language :: Python :: 3.11",
15
14
  "Programming Language :: Python :: 3.12",
15
+ "Programming Language :: Python :: 3.13",
16
16
  "Programming Language :: Python",
17
17
  "Programming Language :: Python :: 3",
18
18
  "Programming Language :: Python :: 3 :: Only",
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ from tigrbl import TigrblApp, TigrblRouter
4
+
5
+
6
+ app = TigrblApp(title="CLI Smoke App", version="8.0.0", mount_system=False)
7
+ router = TigrblRouter()
8
+
9
+
10
+ @router.get("/ping")
11
+ def ping() -> dict[str, bool]:
12
+ return {"ok": True}
13
+
14
+
15
+ @router.websocket("/ws/echo")
16
+ async def echo_socket(ws) -> None:
17
+ await ws.accept()
18
+ await ws.close()
19
+
20
+
21
+ app.include_router(router)
22
+
23
+
24
+ def build_app() -> TigrblApp:
25
+ return app
@@ -17,10 +17,13 @@ def test_runtime_gateway_owns_runtime_entrypoint_and_send():
17
17
  runtime_source = (RUNTIME_PKG / "runtime" / "runtime.py").read_text()
18
18
  executor_source = (RUNTIME_PKG / "executors" / "kernel_executor.py").read_text()
19
19
  packed_source = (RUNTIME_PKG / "executors" / "packed.py").read_text()
20
+ channel_source = (RUNTIME_PKG / "channel" / "websocket.py").read_text()
20
21
 
21
22
  assert "kernel.kernel_plan(app)" in runtime_source
22
23
  assert "await _invoke(" in executor_source
23
24
  assert "_send_transport_response" in packed_source
25
+ assert "dispatch_legacy_websocket" not in packed_source
26
+ assert "class RuntimeWebSocket" in channel_source
24
27
 
25
28
 
26
29
  def test_docs_generation_reads_secdeps_metadata():
@@ -17,7 +17,7 @@ from tigrbl_core._spec import StorageTransform
17
17
  from tigrbl_core.schema import builder as v3_builder
18
18
  from tigrbl_runtime.runtime import kernel as runtime_kernel
19
19
  from tigrbl_runtime.runtime import system as runtime_system
20
- from tigrbl.shortcuts.engine import mem, sqlitef
20
+ from tigrbl.factories.engine import mem, sqlitef
21
21
  from tigrbl_concrete._concrete import engine_resolver as _resolver
22
22
  from tigrbl_concrete import (
23
23
  build_handlers as _materialize_handlers,
@@ -659,3 +659,4 @@ class mapping_plan:
659
659
  @staticmethod
660
660
  def plan(ctx):
661
661
  return SimpleNamespace(visible_specs=tuple(resolve_ops(ctx.model)))
662
+
@@ -0,0 +1,55 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "kind": "appspec_corpus",
4
+ "lane": "canonical",
5
+ "cases": [
6
+ {
7
+ "id": "appspec-canonical-rest-rpc-roundtrip-001",
8
+ "title": "Canonical REST and JSON-RPC create roundtrip",
9
+ "mode": "rest_rpc_roundtrip",
10
+ "app": {
11
+ "title": "CorpusHarness",
12
+ "version": "0.0.0",
13
+ "jsonrpc_prefix": "/rpcx",
14
+ "system_prefix": "/system"
15
+ },
16
+ "table": {
17
+ "tablename": "harness_appspec_corpus_roundtrip",
18
+ "resource": "widget"
19
+ },
20
+ "expect": {
21
+ "rest_status": [
22
+ 200,
23
+ 201
24
+ ],
25
+ "rpc_status": [
26
+ 200
27
+ ]
28
+ }
29
+ },
30
+ {
31
+ "id": "appspec-canonical-rest-rpc-parity-002",
32
+ "title": "Canonical REST write is visible to JSON-RPC list",
33
+ "mode": "rest_rpc_parity",
34
+ "app": {
35
+ "title": "CorpusHarness",
36
+ "version": "0.0.0",
37
+ "jsonrpc_prefix": "/rpcx",
38
+ "system_prefix": "/system"
39
+ },
40
+ "table": {
41
+ "tablename": "harness_appspec_corpus_parity",
42
+ "resource": "widget"
43
+ },
44
+ "expect": {
45
+ "rest_status": [
46
+ 200,
47
+ 201
48
+ ],
49
+ "rpc_status": [
50
+ 200
51
+ ]
52
+ }
53
+ }
54
+ ]
55
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "kind": "appspec_corpus",
4
+ "lane": "negative",
5
+ "cases": [
6
+ {
7
+ "id": "appspec-negative-no-rpc-binding-no-mount-001",
8
+ "title": "Fail closed when AppSpec has no JSON-RPC bindings",
9
+ "mode": "no_rpc_binding_no_mount",
10
+ "app": {
11
+ "title": "CorpusHarnessNegative",
12
+ "version": "0.0.0",
13
+ "jsonrpc_prefix": "/rpcx",
14
+ "system_prefix": "/system"
15
+ },
16
+ "table": {
17
+ "tablename": "harness_appspec_corpus_no_rpc",
18
+ "resource": "widget"
19
+ },
20
+ "expect": {
21
+ "rpc_mount_absent": true
22
+ }
23
+ },
24
+ {
25
+ "id": "appspec-negative-unknown-rpc-method-404-002",
26
+ "title": "Fail closed when RPC method is not declared",
27
+ "mode": "unknown_rpc_method_404",
28
+ "app": {
29
+ "title": "CorpusHarnessNegative",
30
+ "version": "0.0.0",
31
+ "jsonrpc_prefix": "/rpcx",
32
+ "system_prefix": "/system"
33
+ },
34
+ "table": {
35
+ "tablename": "harness_appspec_corpus_unknown_rpc",
36
+ "resource": "widget"
37
+ },
38
+ "expect": {
39
+ "status": 404,
40
+ "detail": "No runtime operation matched request."
41
+ }
42
+ }
43
+ ]
44
+ }
@@ -0,0 +1,49 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import re
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ CASE_ID_RE = re.compile(r"^[a-z0-9]+(?:-[a-z0-9]+)*-\d{3}$")
9
+ FIXTURE_DIR = Path(__file__).resolve().parent
10
+
11
+
12
+ def load_corpus(filename: str) -> dict[str, Any]:
13
+ path = FIXTURE_DIR / filename
14
+ return json.loads(path.read_text(encoding="utf-8"))
15
+
16
+
17
+ def validate_corpus(document: dict[str, Any], *, lane: str) -> None:
18
+ if document.get("schema_version") != "1.0.0":
19
+ raise ValueError("schema_version must be 1.0.0")
20
+ if document.get("kind") != "appspec_corpus":
21
+ raise ValueError("kind must be appspec_corpus")
22
+ if document.get("lane") != lane:
23
+ raise ValueError(f"lane must be {lane}")
24
+
25
+ cases = document.get("cases")
26
+ if not isinstance(cases, list) or not cases:
27
+ raise ValueError("cases must be a non-empty list")
28
+
29
+ seen_ids: set[str] = set()
30
+ for case in cases:
31
+ if not isinstance(case, dict):
32
+ raise ValueError("every case must be an object")
33
+ case_id = case.get("id")
34
+ if not isinstance(case_id, str) or not CASE_ID_RE.fullmatch(case_id):
35
+ raise ValueError(f"invalid case id: {case_id!r}")
36
+ if case_id in seen_ids:
37
+ raise ValueError(f"duplicate case id: {case_id}")
38
+ seen_ids.add(case_id)
39
+
40
+ if not isinstance(case.get("mode"), str):
41
+ raise ValueError(f"case {case_id} must include mode")
42
+ if not isinstance(case.get("title"), str):
43
+ raise ValueError(f"case {case_id} must include title")
44
+ if not isinstance(case.get("app"), dict):
45
+ raise ValueError(f"case {case_id} must include app object")
46
+ if not isinstance(case.get("table"), dict):
47
+ raise ValueError(f"case {case_id} must include table object")
48
+ if not isinstance(case.get("expect"), dict):
49
+ raise ValueError(f"case {case_id} must include expect object")
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ from tigrbl import TigrblApp, TigrblRouter
4
+
5
+
6
+ app = TigrblApp(title="CLI Smoke App", version="8.0.0", mount_system=False)
7
+ router = TigrblRouter()
8
+
9
+
10
+ @router.get("/ping")
11
+ def ping() -> dict[str, bool]:
12
+ return {"ok": True}
13
+
14
+
15
+ @router.websocket("/ws/echo")
16
+ async def echo_socket(ws) -> None:
17
+ await ws.accept()
18
+ await ws.close()
19
+
20
+
21
+ app.include_router(router)
22
+
23
+
24
+ def build_app() -> TigrblApp:
25
+ return app
@@ -28,7 +28,7 @@ async def test_appspec_to_uvicorn_rest_and_rpc_roundtrip() -> None:
28
28
  from tigrbl import TableBase
29
29
  from tigrbl._spec import AppSpec
30
30
  from tigrbl import TigrblApp
31
- from tigrbl.shortcuts.engine import mem
31
+ from tigrbl.factories.engine import mem
32
32
  from tigrbl.orm.mixins import GUIDPk
33
33
  from tigrbl._spec import OpSpec
34
34
  from tigrbl._spec import HttpJsonRpcBindingSpec, HttpRestBindingSpec
@@ -84,3 +84,4 @@ async def test_appspec_to_uvicorn_rest_and_rpc_roundtrip() -> None:
84
84
  assert body["result"]["name"] == "beta"
85
85
  finally:
86
86
  await stop_uvicorn_server(server, task)
87
+
@@ -0,0 +1,101 @@
1
+ from __future__ import annotations
2
+
3
+ from sqlalchemy import Column, String
4
+ import pytest
5
+
6
+ from tigrbl import TableBase, TigrblApp
7
+ from tigrbl._spec import AppSpec, HttpJsonRpcBindingSpec, HttpRestBindingSpec, OpSpec
8
+ from tigrbl.factories.engine import mem
9
+ from tigrbl.orm.mixins import GUIDPk
10
+ from tigrbl_tests.tests.fixtures.appspec_corpus_loader import load_corpus, validate_corpus
11
+
12
+
13
+ def _make_widget_model(*, tablename: str, resource: str, include_jsonrpc: bool) -> type:
14
+ class Widget(TableBase, GUIDPk):
15
+ __tablename__ = tablename
16
+ __resource__ = resource
17
+ __allow_unmapped__ = True
18
+ name = Column(String, nullable=False)
19
+
20
+ bindings: list[object] = [
21
+ HttpRestBindingSpec(proto="http.rest", path=f"/{resource}", methods=("POST",))
22
+ ]
23
+ if include_jsonrpc:
24
+ bindings.append(
25
+ HttpJsonRpcBindingSpec(proto="http.jsonrpc", rpc_method="Widget.create")
26
+ )
27
+
28
+ Widget.__tigrbl_ops__ = (
29
+ OpSpec(alias="create", target="create", bindings=tuple(bindings)),
30
+ )
31
+ return Widget
32
+
33
+
34
+ @pytest.mark.acceptance
35
+ @pytest.mark.parametrize(
36
+ ("filename", "lane"),
37
+ [
38
+ ("appspec_corpus.canonical.json", "canonical"),
39
+ ("appspec_corpus.negative.json", "negative"),
40
+ ],
41
+ )
42
+ def test_appspec_corpus_fixture_schema_and_ids(filename: str, lane: str) -> None:
43
+ corpus = load_corpus(filename)
44
+ validate_corpus(corpus, lane=lane)
45
+
46
+
47
+ @pytest.mark.acceptance
48
+ def test_canonical_corpus_materializes_rpc_mounts() -> None:
49
+ corpus = load_corpus("appspec_corpus.canonical.json")
50
+ validate_corpus(corpus, lane="canonical")
51
+
52
+ for case in corpus["cases"]:
53
+ widget = _make_widget_model(
54
+ tablename=case["table"]["tablename"],
55
+ resource=case["table"]["resource"],
56
+ include_jsonrpc=True,
57
+ )
58
+ spec = AppSpec(
59
+ title=case["app"]["title"],
60
+ version=case["app"]["version"],
61
+ engine=mem(async_=False),
62
+ tables=(widget,),
63
+ jsonrpc_prefix=case["app"]["jsonrpc_prefix"],
64
+ system_prefix=case["app"]["system_prefix"],
65
+ )
66
+ app = TigrblApp.from_spec(spec)
67
+
68
+ paths = {getattr(route, "path", None) for route in getattr(app, "routes", ())}
69
+ rpc_prefix = case["app"]["jsonrpc_prefix"]
70
+
71
+ assert isinstance(app, TigrblApp)
72
+ assert getattr(app, "title", None) == case["app"]["title"]
73
+ assert getattr(app, "version", None) == case["app"]["version"]
74
+ assert rpc_prefix in paths or f"{rpc_prefix}/" in paths
75
+
76
+
77
+ @pytest.mark.acceptance
78
+ def test_negative_corpus_fail_closed_no_rpc_mount() -> None:
79
+ corpus = load_corpus("appspec_corpus.negative.json")
80
+ validate_corpus(corpus, lane="negative")
81
+
82
+ case = next(c for c in corpus["cases"] if c["mode"] == "no_rpc_binding_no_mount")
83
+ widget = _make_widget_model(
84
+ tablename=case["table"]["tablename"],
85
+ resource=case["table"]["resource"],
86
+ include_jsonrpc=False,
87
+ )
88
+ spec = AppSpec(
89
+ title=case["app"]["title"],
90
+ version=case["app"]["version"],
91
+ engine=mem(async_=False),
92
+ tables=(widget,),
93
+ jsonrpc_prefix=case["app"]["jsonrpc_prefix"],
94
+ system_prefix=case["app"]["system_prefix"],
95
+ )
96
+ app = TigrblApp.from_spec(spec)
97
+ paths = {getattr(route, "path", None) for route in getattr(app, "routes", ())}
98
+ rpc_prefix = case["app"]["jsonrpc_prefix"]
99
+
100
+ assert rpc_prefix not in paths
101
+ assert f"{rpc_prefix}/" not in paths
@@ -0,0 +1,151 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Iterable
4
+
5
+ import pytest
6
+ from sqlalchemy import Column, String
7
+
8
+ from tigrbl import TableBase, TigrblApp
9
+ from tigrbl._spec import AppSpec, HttpJsonRpcBindingSpec, HttpRestBindingSpec, OpSpec
10
+ from tigrbl.factories.engine import mem
11
+ from tigrbl.orm.mixins import GUIDPk
12
+ from tigrbl_tests.tests.fixtures.appspec_corpus_loader import (
13
+ load_corpus,
14
+ validate_corpus,
15
+ )
16
+
17
+
18
+ def _make_widget_model(
19
+ *,
20
+ class_name: str,
21
+ tablename: str,
22
+ resource: str,
23
+ binding_order: Iterable[str] = ("rest", "jsonrpc"),
24
+ ) -> type:
25
+ bindings_by_kind = {
26
+ "rest": HttpRestBindingSpec(
27
+ proto="http.rest",
28
+ path=f"/{resource}",
29
+ methods=("POST",),
30
+ ),
31
+ "jsonrpc": HttpJsonRpcBindingSpec(
32
+ proto="http.jsonrpc",
33
+ rpc_method=f"{class_name}.create",
34
+ ),
35
+ }
36
+
37
+ attrs = {
38
+ "__tablename__": tablename,
39
+ "__resource__": resource,
40
+ "__allow_unmapped__": True,
41
+ "name": Column(String, nullable=False),
42
+ }
43
+ widget = type(class_name, (TableBase, GUIDPk), attrs)
44
+ widget.__tigrbl_ops__ = (
45
+ OpSpec(
46
+ alias="create",
47
+ target="create",
48
+ bindings=tuple(bindings_by_kind[kind] for kind in binding_order),
49
+ ),
50
+ )
51
+ return widget
52
+
53
+
54
+ def _materialize_app(
55
+ *,
56
+ case: dict,
57
+ tables: tuple[type, ...],
58
+ title: str | None = None,
59
+ version: str | None = None,
60
+ ) -> TigrblApp:
61
+ spec = AppSpec(
62
+ title=title or case["app"]["title"],
63
+ version=version or case["app"]["version"],
64
+ engine=mem(async_=False),
65
+ tables=tables,
66
+ jsonrpc_prefix=case["app"]["jsonrpc_prefix"],
67
+ system_prefix=case["app"]["system_prefix"],
68
+ )
69
+ return TigrblApp.from_spec(spec)
70
+
71
+
72
+ def _route_signature(app: TigrblApp) -> frozenset[tuple[str, tuple[str, ...]]]:
73
+ signature: set[tuple[str, tuple[str, ...]]] = set()
74
+ for route in getattr(app, "routes", ()):
75
+ path = getattr(route, "path", None)
76
+ if not isinstance(path, str):
77
+ continue
78
+ methods = tuple(sorted(getattr(route, "methods", ()) or ()))
79
+ signature.add((path, methods))
80
+ return frozenset(signature)
81
+
82
+
83
+ @pytest.mark.acceptance
84
+ def test_appspec_metadata_transform_preserves_route_surface() -> None:
85
+ corpus = load_corpus("appspec_corpus.canonical.json")
86
+ validate_corpus(corpus, lane="canonical")
87
+ case = corpus["cases"][0]
88
+
89
+ widget = _make_widget_model(
90
+ class_name="MetamorphicWidget",
91
+ tablename=f"{case['table']['tablename']}_metadata",
92
+ resource=case["table"]["resource"],
93
+ )
94
+ baseline = _materialize_app(case=case, tables=(widget,))
95
+ transformed = _materialize_app(
96
+ case=case,
97
+ tables=(widget,),
98
+ title=f"{case['app']['title']} Transformed",
99
+ version="9.9.9",
100
+ )
101
+
102
+ assert getattr(transformed, "title", None) != getattr(baseline, "title", None)
103
+ assert _route_signature(transformed) == _route_signature(baseline)
104
+
105
+
106
+ @pytest.mark.acceptance
107
+ def test_appspec_binding_order_transform_preserves_route_surface() -> None:
108
+ corpus = load_corpus("appspec_corpus.canonical.json")
109
+ validate_corpus(corpus, lane="canonical")
110
+ case = corpus["cases"][0]
111
+
112
+ rest_first = _make_widget_model(
113
+ class_name="MetamorphicBindingRestFirst",
114
+ tablename=f"{case['table']['tablename']}_rest_first",
115
+ resource=case["table"]["resource"],
116
+ binding_order=("rest", "jsonrpc"),
117
+ )
118
+ rpc_first = _make_widget_model(
119
+ class_name="MetamorphicBindingRpcFirst",
120
+ tablename=f"{case['table']['tablename']}_rpc_first",
121
+ resource=case["table"]["resource"],
122
+ binding_order=("jsonrpc", "rest"),
123
+ )
124
+
125
+ baseline = _materialize_app(case=case, tables=(rest_first,))
126
+ transformed = _materialize_app(case=case, tables=(rpc_first,))
127
+
128
+ assert _route_signature(transformed) == _route_signature(baseline)
129
+
130
+
131
+ @pytest.mark.acceptance
132
+ def test_appspec_table_order_transform_preserves_route_surface() -> None:
133
+ corpus = load_corpus("appspec_corpus.canonical.json")
134
+ validate_corpus(corpus, lane="canonical")
135
+ case = corpus["cases"][0]
136
+
137
+ alpha = _make_widget_model(
138
+ class_name="MetamorphicAlphaWidget",
139
+ tablename=f"{case['table']['tablename']}_alpha",
140
+ resource="alpha-widget",
141
+ )
142
+ beta = _make_widget_model(
143
+ class_name="MetamorphicBetaWidget",
144
+ tablename=f"{case['table']['tablename']}_beta",
145
+ resource="beta-widget",
146
+ )
147
+
148
+ baseline = _materialize_app(case=case, tables=(alpha, beta))
149
+ transformed = _materialize_app(case=case, tables=(beta, alpha))
150
+
151
+ assert _route_signature(transformed) == _route_signature(baseline)
@@ -7,9 +7,9 @@ import pytest
7
7
  from tigrbl_client import TigrblClient
8
8
 
9
9
  from tigrbl import TableBase
10
- from tigrbl.shortcuts.engine import mem
10
+ from tigrbl.factories.engine import mem
11
11
  from tigrbl.orm.mixins import GUIDPk
12
- from tigrbl.shortcuts.app import deriveApp
12
+ from tigrbl.factories.app import deriveApp
13
13
  from tigrbl.types import Column, String
14
14
 
15
15
  from tigrbl_tests.tests.harness_v3._support import (
@@ -154,3 +154,4 @@ async def test_appspec_to_uvicorn_rest_and_rpc_parity_e2e() -> None:
154
154
  await rpc.aclose()
155
155
  finally:
156
156
  await stop_uvicorn(server, task)
157
+