atdd 0.7.3__tar.gz → 0.7.4__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.
- {atdd-0.7.3/src/atdd.egg-info → atdd-0.7.4}/PKG-INFO +1 -1
- {atdd-0.7.3 → atdd-0.7.4}/pyproject.toml +1 -1
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/wagon.convention.yaml +27 -19
- atdd-0.7.4/src/atdd/tester/conventions/artifact.convention.yaml +276 -0
- atdd-0.7.4/src/atdd/tester/validators/test_artifact_naming_category.py +294 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_contracts_structure.py +5 -2
- {atdd-0.7.3 → atdd-0.7.4/src/atdd.egg-info}/PKG-INFO +1 -1
- atdd-0.7.3/src/atdd/tester/conventions/artifact.convention.yaml +0 -257
- atdd-0.7.3/src/atdd/tester/validators/test_artifact_naming_category.py +0 -307
- {atdd-0.7.3 → atdd-0.7.4}/LICENSE +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/README.md +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/setup.cfg +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/__main__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/cli.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/analyze_migrations.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/consumers.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/gate.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/infer_governance_status.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/initializer.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/interface.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/inventory.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/migration.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/registry.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/session.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/sync.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/test_interface.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/test_runner.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/tests/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/traceability.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/conventions/naming.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/conventions/session.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/overlays/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/overlays/claude.md +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/schemas/config.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/schemas/manifest.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/templates/ATDD.md +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/templates/SESSION-TEMPLATE.md +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/config.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/coverage_phase.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/graph/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/graph/urn.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/locale_phase.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/repo.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/train_spec_phase.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/shared_fixtures.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_registry.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_release_versioning.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_session_archive_status.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_session_manifest_alignment.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_session_validation.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_traceability.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_train_registry.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/coverage.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/design.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/green.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/train.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/schemas/design_system.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/conftest.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_commons_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_complexity.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_hierarchy_coverage.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_i18n_runtime.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_python_architecture.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_train_infrastructure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_train_urns.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/conftest.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/component.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/coverage.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/train.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/appendix.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/component.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/feature.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/train.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/wagon.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/conftest.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_hierarchy_coverage.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_cross_refs.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_train_validation.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/coverage.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/red.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/security.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/artifact.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/contract.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/db.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/event.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/http.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/job.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/load.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/locale_manifest.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/pack.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/script.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/utils/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/utils/filename.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/__init__.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/conftest.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_contract_security.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_hierarchy_coverage.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_isolation.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_locale_coverage.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_migration_generation.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_train_backend_e2e.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_train_frontend_e2e.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_train_frontend_python.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd/version_check.py +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/SOURCES.txt +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/dependency_links.txt +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/entry_points.txt +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/requires.txt +0 -0
- {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/top_level.txt +0 -0
|
@@ -177,30 +177,35 @@ artifact_contracts:
|
|
|
177
177
|
note: "Full artifact contract conventions defined in artifact.convention.yaml"
|
|
178
178
|
|
|
179
179
|
urn_format:
|
|
180
|
-
contract_urn: "contract:
|
|
181
|
-
telemetry_urn: "telemetry:
|
|
180
|
+
contract_urn: "contract:{theme}(:{category})*:{aspect}(.{variant})?"
|
|
181
|
+
telemetry_urn: "telemetry:{theme}(:{category})*:{aspect}(.{variant})?"
|
|
182
|
+
examples:
|
|
183
|
+
- "contract:commons:ux:foundations:color"
|
|
184
|
+
- "contract:mechanic:decision.choice"
|
|
185
|
+
- "contract:sensory:gesture.raw"
|
|
186
|
+
- "telemetry:commons:ux:foundations"
|
|
182
187
|
|
|
183
188
|
telemetry_filesystem:
|
|
184
189
|
description: "Telemetry URN maps to filesystem directory containing signal files"
|
|
185
|
-
pattern: "telemetry/{
|
|
186
|
-
urn_to_path: "telemetry:{
|
|
190
|
+
pattern: "telemetry/{segments}/{signal-type}.{plane}[.{measure}].json"
|
|
191
|
+
urn_to_path: "telemetry:{theme}:{segments} → telemetry/{theme}/{segments}/"
|
|
187
192
|
|
|
188
193
|
examples:
|
|
189
194
|
- urn: "telemetry:mechanic:decision.choice"
|
|
190
|
-
path: "telemetry/decision/choice/"
|
|
195
|
+
path: "telemetry/mechanic/decision/choice/"
|
|
191
196
|
files:
|
|
192
197
|
- "metric.db.count.json"
|
|
193
198
|
- "metric.be.duration.json"
|
|
194
199
|
- "event.be.json"
|
|
195
200
|
|
|
196
|
-
- urn: "telemetry:ux:foundations"
|
|
197
|
-
path: "telemetry/ux/foundations/"
|
|
201
|
+
- urn: "telemetry:commons:ux:foundations"
|
|
202
|
+
path: "telemetry/commons/ux/foundations/"
|
|
198
203
|
files:
|
|
199
204
|
- "metric.ui.render_latency.json"
|
|
200
205
|
- "event.ui.json"
|
|
201
206
|
|
|
202
|
-
- urn: "telemetry:ux:foundations
|
|
203
|
-
path: "telemetry/ux/foundations/
|
|
207
|
+
- urn: "telemetry:commons:ux:foundations:color"
|
|
208
|
+
path: "telemetry/commons/ux/foundations/color/"
|
|
204
209
|
files:
|
|
205
210
|
- "metric.ui.render_latency.json"
|
|
206
211
|
- "event.ui.json"
|
|
@@ -222,18 +227,21 @@ artifact_contracts:
|
|
|
222
227
|
|
|
223
228
|
produce_artifacts:
|
|
224
229
|
required_fields:
|
|
225
|
-
- name: "Artifact name (e.g., ux:foundations)"
|
|
226
|
-
- contract: "Contract URN or null (e.g., contract:ux:foundations)"
|
|
227
|
-
- telemetry: "Telemetry URN for observability and analytics or null (e.g., telemetry:ux:foundations)"
|
|
230
|
+
- name: "Artifact name (e.g., commons:ux:foundations)"
|
|
231
|
+
- contract: "Contract URN or null (e.g., contract:commons:ux:foundations)"
|
|
232
|
+
- telemetry: "Telemetry URN for observability and analytics or null (e.g., telemetry:commons:ux:foundations)"
|
|
228
233
|
optional_fields:
|
|
229
234
|
- to: "Visibility (internal|external), defaults to external"
|
|
230
235
|
- urn: "Legacy artifact URN"
|
|
231
236
|
- version: "Version string (e.g., v1)"
|
|
232
237
|
|
|
233
238
|
example:
|
|
234
|
-
- name: ux:foundations
|
|
235
|
-
contract: contract:ux:foundations
|
|
236
|
-
telemetry: telemetry:ux:foundations
|
|
239
|
+
- name: commons:ux:foundations
|
|
240
|
+
contract: contract:commons:ux:foundations
|
|
241
|
+
telemetry: telemetry:commons:ux:foundations
|
|
242
|
+
- name: commons:ux:foundations:color
|
|
243
|
+
contract: contract:commons:ux:foundations:color
|
|
244
|
+
telemetry: telemetry:commons:ux:foundations:color
|
|
237
245
|
- name: internal:cache
|
|
238
246
|
contract: null
|
|
239
247
|
telemetry: null
|
|
@@ -251,10 +259,10 @@ artifact_contracts:
|
|
|
251
259
|
|
|
252
260
|
example:
|
|
253
261
|
- name: appendix:mockup
|
|
254
|
-
- name:
|
|
255
|
-
from: wagon:
|
|
256
|
-
contract: contract:
|
|
257
|
-
telemetry: telemetry:
|
|
262
|
+
- name: commons:ux:foundations
|
|
263
|
+
from: wagon:maintain-ux
|
|
264
|
+
contract: contract:commons:ux:foundations
|
|
265
|
+
telemetry: telemetry:commons:ux:foundations
|
|
258
266
|
|
|
259
267
|
features_format:
|
|
260
268
|
legacy_format:
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# Artifact Convention
|
|
2
|
+
# Defines naming, versioning, organization, and API mapping rules for artifact-centric contracts
|
|
3
|
+
# Aligned with canonical artifact-naming.convention.yaml v2.1
|
|
4
|
+
|
|
5
|
+
description: "Artifact-centric contract system using theme-based hierarchical taxonomy with variant facets"
|
|
6
|
+
|
|
7
|
+
naming:
|
|
8
|
+
logical_pattern: "{theme}(:{category})*:{aspect}(.{variant})?"
|
|
9
|
+
physical_pattern: "contracts/{theme}/{segments}/{aspect}[/{variant}].schema.json"
|
|
10
|
+
rationale: "Theme-based organization enables clear architectural boundaries. Colon separator denotes hierarchical descent (unlimited depth), dot separator denotes lateral variant (typically 0-1). Each segment becomes a directory level."
|
|
11
|
+
|
|
12
|
+
examples:
|
|
13
|
+
- logical: "commons:ux:foundations"
|
|
14
|
+
physical: "contracts/commons/ux/foundations.schema.json"
|
|
15
|
+
|
|
16
|
+
- logical: "commons:ux:foundations:color"
|
|
17
|
+
physical: "contracts/commons/ux/foundations/color.schema.json"
|
|
18
|
+
|
|
19
|
+
- logical: "mechanic:decision.choice"
|
|
20
|
+
physical: "contracts/mechanic/decision/choice.schema.json"
|
|
21
|
+
|
|
22
|
+
- logical: "match:result"
|
|
23
|
+
physical: "contracts/match/result.schema.json"
|
|
24
|
+
|
|
25
|
+
- logical: "sensory:gesture.raw"
|
|
26
|
+
physical: "contracts/sensory/gesture/raw.schema.json"
|
|
27
|
+
|
|
28
|
+
versioning:
|
|
29
|
+
location: "Separate version field"
|
|
30
|
+
filename_pattern: "{segments}.schema.json"
|
|
31
|
+
id_pattern: "{artifact_name}"
|
|
32
|
+
version_field: "version"
|
|
33
|
+
rationale: "Version tracked in separate 'version' field, NOT embedded in $id. Allows artifact identity to remain stable across versions. Supports monolithic deployment with coordinated releases."
|
|
34
|
+
|
|
35
|
+
examples:
|
|
36
|
+
- artifact: "commons/ux/foundations/color.schema.json"
|
|
37
|
+
id_field: "commons:ux:foundations:color"
|
|
38
|
+
version_field: "1.0.0"
|
|
39
|
+
|
|
40
|
+
- artifact: "mechanic/decision/choice.schema.json"
|
|
41
|
+
id_field: "mechanic:decision.choice"
|
|
42
|
+
version_field: "1.0.0"
|
|
43
|
+
|
|
44
|
+
- artifact: "match/result.schema.json"
|
|
45
|
+
id_field: "match:result"
|
|
46
|
+
version_field: "1.2.3"
|
|
47
|
+
|
|
48
|
+
- artifact: "sensory/gesture/raw.schema.json"
|
|
49
|
+
id_field: "sensory:gesture.raw"
|
|
50
|
+
version_field: "1.0.0"
|
|
51
|
+
|
|
52
|
+
organization:
|
|
53
|
+
strategy: "by_theme"
|
|
54
|
+
directory_structure: "contracts/{theme}/"
|
|
55
|
+
rationale: "Theme-based directories enable clear architectural boundaries. Each theme represents a bounded context. Unlimited hierarchical depth supported via colons."
|
|
56
|
+
|
|
57
|
+
structure:
|
|
58
|
+
root: "contracts/"
|
|
59
|
+
themes:
|
|
60
|
+
- "commons/"
|
|
61
|
+
- "match/"
|
|
62
|
+
- "mechanic/"
|
|
63
|
+
- "sensory/"
|
|
64
|
+
- "player/"
|
|
65
|
+
- "scenario/"
|
|
66
|
+
- "partnership/"
|
|
67
|
+
- "league/"
|
|
68
|
+
- "audience/"
|
|
69
|
+
- "monetization/"
|
|
70
|
+
|
|
71
|
+
api_mapping:
|
|
72
|
+
description: "Artifact names map to REST API endpoints for external consumption. Hierarchy levels add path segments, variants treated as resources."
|
|
73
|
+
pattern: "/{theme}s/{id}/{segments}[/{variant}]"
|
|
74
|
+
|
|
75
|
+
methods:
|
|
76
|
+
new: POST
|
|
77
|
+
created: POST
|
|
78
|
+
registered: POST
|
|
79
|
+
started: POST
|
|
80
|
+
result: GET
|
|
81
|
+
active: GET
|
|
82
|
+
config: GET
|
|
83
|
+
events: GET
|
|
84
|
+
current: GET
|
|
85
|
+
foundations: GET
|
|
86
|
+
updated: PUT
|
|
87
|
+
closed: PUT
|
|
88
|
+
completed: PUT
|
|
89
|
+
terminated: DELETE
|
|
90
|
+
deleted: DELETE
|
|
91
|
+
|
|
92
|
+
examples:
|
|
93
|
+
- artifact: "commons:ux:foundations"
|
|
94
|
+
endpoint: "GET /commons/{id}/ux/foundations"
|
|
95
|
+
description: "Retrieve UX foundations"
|
|
96
|
+
|
|
97
|
+
- artifact: "commons:ux:foundations:color"
|
|
98
|
+
endpoint: "GET /commons/{id}/ux/foundations/color"
|
|
99
|
+
description: "Retrieve UX color foundations"
|
|
100
|
+
|
|
101
|
+
- artifact: "match:result"
|
|
102
|
+
endpoint: "GET /matches/{id}/result"
|
|
103
|
+
description: "Retrieve match result"
|
|
104
|
+
|
|
105
|
+
- artifact: "session:new"
|
|
106
|
+
endpoint: "POST /sessions"
|
|
107
|
+
description: "Create new session"
|
|
108
|
+
|
|
109
|
+
- artifact: "player:identity"
|
|
110
|
+
endpoint: "GET /players/{id}"
|
|
111
|
+
description: "Retrieve player identity"
|
|
112
|
+
|
|
113
|
+
- artifact: "match:config"
|
|
114
|
+
endpoint: "GET /matches/{id}/config"
|
|
115
|
+
description: "Retrieve match configuration"
|
|
116
|
+
|
|
117
|
+
- artifact: "player:updated"
|
|
118
|
+
endpoint: "PUT /players/{id}"
|
|
119
|
+
description: "Update player"
|
|
120
|
+
|
|
121
|
+
- artifact: "match:terminated"
|
|
122
|
+
endpoint: "DELETE /matches/{id}"
|
|
123
|
+
description: "Terminate match"
|
|
124
|
+
|
|
125
|
+
ownership:
|
|
126
|
+
producer: "Generates artifact contract (wagon that declares artifact in produce[])"
|
|
127
|
+
consumer: "References existing contract (wagon that declares artifact in consume[])"
|
|
128
|
+
single_source: "One artifact = one JSON file. Multiple wagons reference same file. Zero duplication."
|
|
129
|
+
|
|
130
|
+
rules:
|
|
131
|
+
- "Producer wagon owns the artifact schema generation"
|
|
132
|
+
- "Consumer wagon validates artifact existence and references it"
|
|
133
|
+
- "Artifact path declared in wagon manifest contract: field"
|
|
134
|
+
- "Only producer generates; consumers must never modify"
|
|
135
|
+
|
|
136
|
+
metadata:
|
|
137
|
+
description: "Artifact schemas include x-artifact-metadata for tooling and API generation"
|
|
138
|
+
|
|
139
|
+
fields:
|
|
140
|
+
theme: "Architectural theme (commons, match, mechanic, etc.)"
|
|
141
|
+
aspect: "Final leaf resource noun"
|
|
142
|
+
variant: "Optional lateral variation"
|
|
143
|
+
api:
|
|
144
|
+
method: "HTTP method (GET, POST, PUT, DELETE)"
|
|
145
|
+
path: "REST endpoint path"
|
|
146
|
+
|
|
147
|
+
example:
|
|
148
|
+
theme: "match"
|
|
149
|
+
aspect: "result"
|
|
150
|
+
api:
|
|
151
|
+
method: "GET"
|
|
152
|
+
path: "/matches/{id}/result"
|
|
153
|
+
|
|
154
|
+
validation:
|
|
155
|
+
required_fields: ["$schema", "$id", "version", "title", "type", "properties"]
|
|
156
|
+
schema_compliance: "JSON Schema Draft-07"
|
|
157
|
+
id_pattern: "^[a-z]+(?::[a-z][a-z0-9-]*)+(?:\\.[a-z][a-z0-9-]*)?$"
|
|
158
|
+
version_pattern: "^\\d+\\.\\d+\\.\\d+$"
|
|
159
|
+
|
|
160
|
+
artifact_urns:
|
|
161
|
+
urn_pattern:
|
|
162
|
+
format: "contract:{artifact_name}"
|
|
163
|
+
conversion_rule: "URN exactly matches artifact name - preserves colons for hierarchy and dots for variants. Pattern: contract:{theme}(:{category})*:{aspect}(.{variant})?"
|
|
164
|
+
|
|
165
|
+
examples:
|
|
166
|
+
artifact_to_urn:
|
|
167
|
+
- artifact_name: "commons:ux:foundations"
|
|
168
|
+
urn: "contract:commons:ux:foundations"
|
|
169
|
+
|
|
170
|
+
- artifact_name: "commons:ux:foundations:color"
|
|
171
|
+
urn: "contract:commons:ux:foundations:color"
|
|
172
|
+
|
|
173
|
+
- artifact_name: "mechanic:decision.choice"
|
|
174
|
+
urn: "contract:mechanic:decision.choice"
|
|
175
|
+
|
|
176
|
+
- artifact_name: "sensory:gesture.raw"
|
|
177
|
+
urn: "contract:sensory:gesture.raw"
|
|
178
|
+
|
|
179
|
+
bidirectional_linkage:
|
|
180
|
+
validation: "URN must resolve to a contract in the registry. All colons and dots preserved."
|
|
181
|
+
|
|
182
|
+
migration_strategy:
|
|
183
|
+
refactor_note: "Legacy URNs contract:{domain}:{resource}[.{category}] migrate to contract:{theme}(:{category})*:{aspect}(.{variant})?. Version suffix removed from $id."
|
|
184
|
+
|
|
185
|
+
wagon_artifacts:
|
|
186
|
+
produce_example:
|
|
187
|
+
wagon: "maintain-ux"
|
|
188
|
+
produce:
|
|
189
|
+
- name: "commons:ux:foundations"
|
|
190
|
+
urn: "contract:commons:ux:foundations"
|
|
191
|
+
to: "external"
|
|
192
|
+
|
|
193
|
+
- name: "commons:ux:foundations:color"
|
|
194
|
+
urn: "contract:commons:ux:foundations:color"
|
|
195
|
+
to: "external"
|
|
196
|
+
|
|
197
|
+
consume_example:
|
|
198
|
+
wagon: "stage-characters"
|
|
199
|
+
consume:
|
|
200
|
+
- name: "commons:ux:foundations"
|
|
201
|
+
urn: "contract:commons:ux:foundations"
|
|
202
|
+
from: "wagon:maintain-ux"
|
|
203
|
+
|
|
204
|
+
contract_artifacts:
|
|
205
|
+
id_field: "id: {artifact_name}"
|
|
206
|
+
urn_mapping: "URN contract:{artifact_name} maps directly to $id {artifact_name}"
|
|
207
|
+
|
|
208
|
+
example:
|
|
209
|
+
- id: "commons:ux:foundations"
|
|
210
|
+
version: "1.0.0"
|
|
211
|
+
path: "commons/ux/foundations.schema.json"
|
|
212
|
+
producer: "wagon:maintain-ux"
|
|
213
|
+
urn_match: "contract:commons:ux:foundations"
|
|
214
|
+
|
|
215
|
+
- id: "commons:ux:foundations:color"
|
|
216
|
+
version: "1.0.0"
|
|
217
|
+
path: "commons/ux/foundations/color.schema.json"
|
|
218
|
+
producer: "wagon:maintain-ux"
|
|
219
|
+
urn_match: "contract:commons:ux:foundations:color"
|
|
220
|
+
|
|
221
|
+
- id: "mechanic:decision.choice"
|
|
222
|
+
version: "1.0.0"
|
|
223
|
+
path: "mechanic/decision/choice.schema.json"
|
|
224
|
+
producer: "wagon:resolve-dilemmas"
|
|
225
|
+
urn_match: "contract:mechanic:decision.choice"
|
|
226
|
+
|
|
227
|
+
demo_mode:
|
|
228
|
+
description: "Artifacts write to demo/contracts/artifacts/ when mode_demo: true"
|
|
229
|
+
path_prefix: "demo/contracts/artifacts/"
|
|
230
|
+
|
|
231
|
+
examples:
|
|
232
|
+
complete_workflow:
|
|
233
|
+
- step: "Wagon declares artifact in produce[]"
|
|
234
|
+
example: |
|
|
235
|
+
produce:
|
|
236
|
+
- name: mechanic:decision.choice
|
|
237
|
+
to: external
|
|
238
|
+
contract: contracts/mechanic/decision/choice.schema.json
|
|
239
|
+
|
|
240
|
+
- step: "Tester agent classifies artifact ownership"
|
|
241
|
+
result: "producer: true, path: mechanic/decision/choice.schema.json"
|
|
242
|
+
|
|
243
|
+
- step: "Schema generation creates artifact"
|
|
244
|
+
output: "contracts/mechanic/decision/choice.schema.json"
|
|
245
|
+
content: |
|
|
246
|
+
{
|
|
247
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
248
|
+
"$id": "mechanic:decision.choice",
|
|
249
|
+
"version": "1.0.0",
|
|
250
|
+
"title": "Decision Choice",
|
|
251
|
+
"type": "object",
|
|
252
|
+
"properties": {...},
|
|
253
|
+
"x-artifact-metadata": {
|
|
254
|
+
"theme": "mechanic",
|
|
255
|
+
"aspect": "decision",
|
|
256
|
+
"variant": "choice",
|
|
257
|
+
"api": {
|
|
258
|
+
"method": "POST",
|
|
259
|
+
"path": "/decisions"
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
- step: "Consumer wagon references artifact"
|
|
265
|
+
example: |
|
|
266
|
+
consume:
|
|
267
|
+
- name: mechanic:decision.choice
|
|
268
|
+
from: wagon:resolve-dilemmas
|
|
269
|
+
contract: contracts/mechanic/decision/choice.schema.json
|
|
270
|
+
|
|
271
|
+
- step: "Pack generation references (not embeds) artifact"
|
|
272
|
+
pack_manifest: |
|
|
273
|
+
produce:
|
|
274
|
+
- artifact: mechanic:decision.choice
|
|
275
|
+
contract: ../artifacts/mechanic/decision/choice.schema.json
|
|
276
|
+
owner: true
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RED Tests for Artifact Naming Convention with Theme-Based Hierarchical Taxonomy
|
|
3
|
+
|
|
4
|
+
SPEC: SPEC-TESTER-CONV-0059 through SPEC-TESTER-CONV-0067
|
|
5
|
+
Feature: Artifact naming uses theme-based hierarchical pattern with variant facets
|
|
6
|
+
Background:
|
|
7
|
+
- Colon separator denotes hierarchical descent (unlimited depth)
|
|
8
|
+
- Dot separator denotes lateral variant (typically 0-1)
|
|
9
|
+
- Pattern: {theme}(:{category})*:{aspect}(.{variant})?
|
|
10
|
+
- Examples use commons:ux:foundations:color instead of legacy ux:foundations
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
import yaml
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.fixture
|
|
19
|
+
def artifact_convention():
|
|
20
|
+
"""Load artifact.convention.yaml"""
|
|
21
|
+
# File is at atdd/tester/audits/test_*.py, convention is at atdd/tester/conventions/
|
|
22
|
+
convention_path = Path(__file__).parent.parent / "conventions" / "artifact.convention.yaml"
|
|
23
|
+
assert convention_path.exists(), f"Convention file not found: {convention_path}"
|
|
24
|
+
|
|
25
|
+
with open(convention_path) as f:
|
|
26
|
+
return yaml.safe_load(f)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# SPEC-TESTER-CONV-0059
|
|
30
|
+
def test_logical_pattern_has_theme_hierarchy(artifact_convention):
|
|
31
|
+
"""Logical naming pattern supports theme-based hierarchy with variants"""
|
|
32
|
+
naming = artifact_convention.get("naming", {})
|
|
33
|
+
logical_pattern = naming.get("logical_pattern")
|
|
34
|
+
|
|
35
|
+
assert logical_pattern == "{theme}(:{category})*:{aspect}(.{variant})?", \
|
|
36
|
+
f"Expected logical_pattern to be '{{theme}}(:{{category}})*:{{aspect}}(.{{variant}})?', got: {logical_pattern}"
|
|
37
|
+
|
|
38
|
+
# Verify rationale explains hierarchy vs variant
|
|
39
|
+
rationale = naming.get("rationale", "")
|
|
40
|
+
assert "colon" in rationale.lower() or "hierarchy" in rationale.lower(), \
|
|
41
|
+
"Rationale should explain colon separator for hierarchical descent"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# SPEC-TESTER-CONV-0060
|
|
45
|
+
def test_physical_pattern_has_segments(artifact_convention):
|
|
46
|
+
"""Physical path pattern supports hierarchical segments"""
|
|
47
|
+
naming = artifact_convention.get("naming", {})
|
|
48
|
+
physical_pattern = naming.get("physical_pattern")
|
|
49
|
+
|
|
50
|
+
assert "contracts/" in physical_pattern and ".schema.json" in physical_pattern, \
|
|
51
|
+
f"Expected physical_pattern with contracts/ prefix and .schema.json extension, got: {physical_pattern}"
|
|
52
|
+
|
|
53
|
+
# Check examples demonstrate theme-based patterns
|
|
54
|
+
examples = naming.get("examples", [])
|
|
55
|
+
assert len(examples) >= 2, "Should have examples for various hierarchy depths"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# SPEC-TESTER-CONV-0061
|
|
59
|
+
def test_examples_use_theme_hierarchy(artifact_convention):
|
|
60
|
+
"""Examples use theme-based hierarchy (commons:ux:foundations:color)"""
|
|
61
|
+
naming = artifact_convention.get("naming", {})
|
|
62
|
+
examples = naming.get("examples", [])
|
|
63
|
+
|
|
64
|
+
# Check for commons:ux:foundations hierarchy examples
|
|
65
|
+
ux_base = None
|
|
66
|
+
ux_deep = None
|
|
67
|
+
|
|
68
|
+
for example in examples:
|
|
69
|
+
if example.get("logical") == "commons:ux:foundations":
|
|
70
|
+
ux_base = example
|
|
71
|
+
if example.get("logical") == "commons:ux:foundations:color":
|
|
72
|
+
ux_deep = example
|
|
73
|
+
|
|
74
|
+
assert ux_base is not None, "Missing commons:ux:foundations base example"
|
|
75
|
+
assert "contracts/commons/ux/foundations" in ux_base.get("physical", ""), \
|
|
76
|
+
f"commons:ux:foundations should map to contracts/commons/ux/foundations path"
|
|
77
|
+
|
|
78
|
+
assert ux_deep is not None, "Missing commons:ux:foundations:color deep hierarchy example"
|
|
79
|
+
assert "contracts/commons/ux/foundations/color" in ux_deep.get("physical", ""), \
|
|
80
|
+
f"commons:ux:foundations:color should map to contracts/commons/ux/foundations/color path"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# SPEC-TESTER-CONV-0061 (part 2)
|
|
84
|
+
def test_no_legacy_domain_resource_examples(artifact_convention):
|
|
85
|
+
"""No legacy domain:resource examples remain (should use theme-based)"""
|
|
86
|
+
naming = artifact_convention.get("naming", {})
|
|
87
|
+
examples = naming.get("examples", [])
|
|
88
|
+
|
|
89
|
+
for example in examples:
|
|
90
|
+
logical = example.get("logical", "")
|
|
91
|
+
# Legacy patterns like "ux:foundations" or "design:tokens" without theme prefix
|
|
92
|
+
if logical.count(":") == 1:
|
|
93
|
+
# Single colon is OK for simple patterns like "match:result"
|
|
94
|
+
pass
|
|
95
|
+
# Check no "ux:foundations.colors" dot-for-hierarchy pattern
|
|
96
|
+
assert ".colors" not in logical or logical.count(":") >= 2, \
|
|
97
|
+
f"Found legacy dot-for-hierarchy example: {logical}"
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# SPEC-TESTER-CONV-0062
|
|
101
|
+
def test_api_pattern_has_theme_segments(artifact_convention):
|
|
102
|
+
"""API mapping supports theme-based hierarchy"""
|
|
103
|
+
api_mapping = artifact_convention.get("api_mapping", {})
|
|
104
|
+
pattern = api_mapping.get("pattern")
|
|
105
|
+
|
|
106
|
+
# Pattern should include theme and segments
|
|
107
|
+
assert "{" in pattern and "}" in pattern, \
|
|
108
|
+
f"Expected API pattern with template variables, got: {pattern}"
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# SPEC-TESTER-CONV-0062 (part 2)
|
|
112
|
+
def test_api_examples_include_theme_based(artifact_convention):
|
|
113
|
+
"""API examples include theme-based patterns"""
|
|
114
|
+
api_mapping = artifact_convention.get("api_mapping", {})
|
|
115
|
+
examples = api_mapping.get("examples", [])
|
|
116
|
+
|
|
117
|
+
# Check for theme-based examples
|
|
118
|
+
has_commons_example = False
|
|
119
|
+
has_match_example = False
|
|
120
|
+
|
|
121
|
+
for example in examples:
|
|
122
|
+
artifact = example.get("artifact", "")
|
|
123
|
+
if artifact.startswith("commons:"):
|
|
124
|
+
has_commons_example = True
|
|
125
|
+
if artifact.startswith("match:"):
|
|
126
|
+
has_match_example = True
|
|
127
|
+
|
|
128
|
+
assert has_commons_example or has_match_example, \
|
|
129
|
+
"API examples should include theme-based patterns (commons:*, match:*, etc.)"
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# SPEC-TESTER-CONV-0063
|
|
133
|
+
def test_urn_pattern_preserves_colons_and_dots(artifact_convention):
|
|
134
|
+
"""URN pattern preserves colons for hierarchy and dots for variants"""
|
|
135
|
+
artifact_urns = artifact_convention.get("artifact_urns", {})
|
|
136
|
+
urn_pattern = artifact_urns.get("urn_pattern", {})
|
|
137
|
+
|
|
138
|
+
format_str = urn_pattern.get("format")
|
|
139
|
+
assert format_str == "contract:{artifact_name}", \
|
|
140
|
+
f"Expected URN format 'contract:{{artifact_name}}', got: {format_str}"
|
|
141
|
+
|
|
142
|
+
# Check conversion rule explains preservation
|
|
143
|
+
conversion_rule = urn_pattern.get("conversion_rule", "")
|
|
144
|
+
assert "colon" in conversion_rule.lower() or "hierarchy" in conversion_rule.lower(), \
|
|
145
|
+
"Conversion rule should explain colon preservation for hierarchy"
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
# SPEC-TESTER-CONV-0063 (part 2)
|
|
149
|
+
def test_urn_examples_use_theme_hierarchy(artifact_convention):
|
|
150
|
+
"""URN examples use theme-based hierarchy"""
|
|
151
|
+
artifact_urns = artifact_convention.get("artifact_urns", {})
|
|
152
|
+
examples = artifact_urns.get("examples", {})
|
|
153
|
+
artifact_to_urn = examples.get("artifact_to_urn", [])
|
|
154
|
+
|
|
155
|
+
# Check for theme-based examples
|
|
156
|
+
has_theme_example = False
|
|
157
|
+
has_variant_example = False
|
|
158
|
+
|
|
159
|
+
for example in artifact_to_urn:
|
|
160
|
+
artifact_name = example.get("artifact_name", "")
|
|
161
|
+
urn = example.get("urn", "")
|
|
162
|
+
|
|
163
|
+
# Theme-based: multiple colons
|
|
164
|
+
if artifact_name.count(":") >= 2:
|
|
165
|
+
has_theme_example = True
|
|
166
|
+
# URN should match artifact with contract: prefix
|
|
167
|
+
assert urn == f"contract:{artifact_name}", \
|
|
168
|
+
f"URN should be 'contract:{artifact_name}', got: {urn}"
|
|
169
|
+
|
|
170
|
+
# Variant: has dot
|
|
171
|
+
if "." in artifact_name:
|
|
172
|
+
has_variant_example = True
|
|
173
|
+
|
|
174
|
+
assert has_theme_example, "Missing theme-based hierarchy URN example (multiple colons)"
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
# SPEC-TESTER-CONV-0064
|
|
178
|
+
def test_contract_id_unversioned(artifact_convention):
|
|
179
|
+
"""Contract ID field uses unversioned artifact name"""
|
|
180
|
+
contract_artifacts = artifact_convention.get("contract_artifacts", {})
|
|
181
|
+
id_field = contract_artifacts.get("id_field")
|
|
182
|
+
|
|
183
|
+
# Should NOT have :v{version} suffix
|
|
184
|
+
assert ":v{version}" not in id_field and ":v1" not in id_field, \
|
|
185
|
+
f"ID field should be unversioned, got: {id_field}"
|
|
186
|
+
|
|
187
|
+
# Should reference artifact_name
|
|
188
|
+
assert "{artifact_name}" in id_field, \
|
|
189
|
+
f"ID field should reference artifact_name, got: {id_field}"
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
# SPEC-TESTER-CONV-0064 (part 2)
|
|
193
|
+
def test_contract_examples_use_theme_hierarchy(artifact_convention):
|
|
194
|
+
"""Contract examples use theme-based hierarchy"""
|
|
195
|
+
contract_artifacts = artifact_convention.get("contract_artifacts", {})
|
|
196
|
+
examples = contract_artifacts.get("example", [])
|
|
197
|
+
|
|
198
|
+
# Check for theme-based examples
|
|
199
|
+
has_theme_example = False
|
|
200
|
+
|
|
201
|
+
for example in examples:
|
|
202
|
+
id_value = example.get("id", "")
|
|
203
|
+
# Theme-based: has multiple colons and NO :v suffix
|
|
204
|
+
if id_value.count(":") >= 2 and ":v" not in id_value:
|
|
205
|
+
has_theme_example = True
|
|
206
|
+
# Should have separate version field
|
|
207
|
+
assert "version" in example, \
|
|
208
|
+
f"Example should have separate version field, got: {example}"
|
|
209
|
+
|
|
210
|
+
assert has_theme_example, "Missing theme-based hierarchy contract example"
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
# SPEC-TESTER-CONV-0065
|
|
214
|
+
def test_wagon_examples_use_maintain_ux(artifact_convention):
|
|
215
|
+
"""Wagon artifacts examples updated to maintain-ux"""
|
|
216
|
+
wagon_artifacts = artifact_convention.get("wagon_artifacts", {})
|
|
217
|
+
produce_example = wagon_artifacts.get("produce_example", {})
|
|
218
|
+
|
|
219
|
+
wagon_name = produce_example.get("wagon")
|
|
220
|
+
assert wagon_name == "maintain-ux", \
|
|
221
|
+
f"Expected producer wagon 'maintain-ux', got: {wagon_name}"
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
# SPEC-TESTER-CONV-0065 (part 2)
|
|
225
|
+
def test_wagon_produces_theme_hierarchy_artifacts(artifact_convention):
|
|
226
|
+
"""Wagon produces theme-based hierarchy artifacts"""
|
|
227
|
+
wagon_artifacts = artifact_convention.get("wagon_artifacts", {})
|
|
228
|
+
produce_example = wagon_artifacts.get("produce_example", {})
|
|
229
|
+
produce = produce_example.get("produce", [])
|
|
230
|
+
|
|
231
|
+
# Check for theme-based artifacts
|
|
232
|
+
has_theme_artifact = False
|
|
233
|
+
|
|
234
|
+
for item in produce:
|
|
235
|
+
name = item.get("name", "")
|
|
236
|
+
urn = item.get("urn", "")
|
|
237
|
+
|
|
238
|
+
# Theme-based: multiple colons
|
|
239
|
+
if name.count(":") >= 2:
|
|
240
|
+
has_theme_artifact = True
|
|
241
|
+
# URN should match name with contract: prefix
|
|
242
|
+
assert urn == f"contract:{name}", \
|
|
243
|
+
f"Expected URN 'contract:{name}', got: {urn}"
|
|
244
|
+
|
|
245
|
+
assert has_theme_artifact, "Missing theme-based hierarchy in produce artifacts"
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
# SPEC-TESTER-CONV-0066
|
|
249
|
+
def test_validation_regex_allows_theme_hierarchy(artifact_convention):
|
|
250
|
+
"""Validation regex allows unlimited colons and optional variant dot"""
|
|
251
|
+
import re
|
|
252
|
+
|
|
253
|
+
validation = artifact_convention.get("validation", {})
|
|
254
|
+
id_pattern = validation.get("id_pattern")
|
|
255
|
+
|
|
256
|
+
assert id_pattern is not None, "Missing id_pattern in validation section"
|
|
257
|
+
|
|
258
|
+
# Test the regex against valid patterns
|
|
259
|
+
test_cases = [
|
|
260
|
+
("commons:ux:foundations:color", True), # Deep hierarchy
|
|
261
|
+
("commons:ux:foundations", True), # Medium hierarchy
|
|
262
|
+
("mechanic:decision.choice", True), # Variant with dot
|
|
263
|
+
("match:result", True), # Simple theme:aspect
|
|
264
|
+
("sensory:gesture.raw", True), # Theme:aspect.variant
|
|
265
|
+
("invalid", False), # No colon at all
|
|
266
|
+
("no-version:v1", False), # Old style with version suffix
|
|
267
|
+
]
|
|
268
|
+
|
|
269
|
+
for test_input, should_match in test_cases:
|
|
270
|
+
match = re.match(id_pattern, test_input)
|
|
271
|
+
if should_match:
|
|
272
|
+
assert match is not None, \
|
|
273
|
+
f"Pattern '{id_pattern}' should match '{test_input}'"
|
|
274
|
+
else:
|
|
275
|
+
# Note: some patterns may or may not match depending on regex specifics
|
|
276
|
+
pass
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
# SPEC-TESTER-CONV-0067
|
|
280
|
+
def test_migration_note_documents_refactoring(artifact_convention):
|
|
281
|
+
"""Migration note documents legacy URN refactoring"""
|
|
282
|
+
artifact_urns = artifact_convention.get("artifact_urns", {})
|
|
283
|
+
migration_strategy = artifact_urns.get("migration_strategy", {})
|
|
284
|
+
refactor_note = migration_strategy.get("refactor_note", "")
|
|
285
|
+
|
|
286
|
+
assert refactor_note != "", "Missing refactor_note in migration_strategy"
|
|
287
|
+
|
|
288
|
+
# Check for legacy pattern documentation
|
|
289
|
+
assert "legacy" in refactor_note.lower() or "migrate" in refactor_note.lower(), \
|
|
290
|
+
"Should document legacy migration"
|
|
291
|
+
|
|
292
|
+
# Check for version suffix removal
|
|
293
|
+
assert "version" in refactor_note.lower() or "$id" in refactor_note.lower(), \
|
|
294
|
+
"Should mention version removal from $id"
|