sanka-cli 0.2.5__tar.gz → 0.2.6__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.
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/PKG-INFO +1 -1
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/pyproject.toml +1 -1
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/report_codec.py +10 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/__init__.py +1 -1
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_cli.py +1 -1
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_report_codec.py +55 -1
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_mcp.py +2 -2
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_sanka_facade.py +1 -1
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/.gitignore +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/LICENSES/AGPL-3.0-only.txt +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/LICENSES/Apache-2.0.txt +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/NOTICE +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/README.md +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/_client.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/cli/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/cli/_compact.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/cli/_output.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/cli/_research.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/cli/py.typed +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/connector/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/connector/py.typed +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/__about__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/concurrency.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/connector_client.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/connector_host.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/engine.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/continuous.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/errors.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/local.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/model.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/routes.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/scope.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/state.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/execution/validate.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/extensions/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/extensions/discovery.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/extensions/lifecycle.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/extensions/model.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/extensions/runner.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/extensions/store.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/hashing.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/mapping/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/mapping/errors.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/mapping/mapping_candidates.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/mapping/model.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/mapping/owner_mapping.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/mapping/pending_relationships.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/mapping/record_mapping.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/planner.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/private_sqlite.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/py.typed +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/registry.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/safe_local_io.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/spec.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka/runtime/state.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/__main__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/bundle.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/certificates.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/client.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/ai.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/auth.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/cloud.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/cloud_fleet.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/cloud_migrate.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/code.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/migrate.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/profiles.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/resources.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/skill.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/commands/workflows.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/config.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/main.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/mcp/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/mcp/client.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/mcp/render.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/mcp/server.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/output.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/runtime.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/skills/sanka-cli/SKILL.md +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_cli/state.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/__about__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/credentials.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/errors.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/protocols.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/provisioning.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/py.typed +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/records.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/registration.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/src/sanka_connector/schema.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/conftest.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_drf_project/api/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_drf_project/api/serializers.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_drf_project/api/views.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_drf_project/config/__init__.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_drf_project/config/settings.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_drf_project/config/urls.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_drf_project/manage.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_marketplace/drf-to-fastapi.json +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_marketplace/marketplace.json +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_cli_developer_experience.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_code_bundle.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_code_commands.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_concurrency.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_connector_client.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_connector_host.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_credential_provider.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_engine_e2e.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_engine_execution_adoption.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_engine_pg_to_clickhouse_e2e.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_engine_postgres_e2e.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_continuous.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_exact_scope.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_local_store.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_routes.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_scope.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_seam.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_execution_validate.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_extension_discovery.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_extension_lifecycle.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_extension_runner.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_extension_store.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_extension_wheel_acceptance.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_hashing.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_hosted_cli.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_mapping_candidates.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_mapping_owner_mapping.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_mapping_pending_relationships.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_mapping_record_mapping.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_planner.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_registry.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_safe_local_io.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_skill_commands.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_spec.py +0 -0
- {sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/test_state_store.py +0 -0
|
@@ -207,6 +207,15 @@ def canonical_route_manifest(raw: Any) -> MappingRouteManifest:
|
|
|
207
207
|
code="SANKA_MIGRATE_ROUTE_MANIFEST_INVALID",
|
|
208
208
|
)
|
|
209
209
|
seen.add(route_key)
|
|
210
|
+
identity_fields = item.get("identityFields", [])
|
|
211
|
+
if not isinstance(identity_fields, list) or any(
|
|
212
|
+
not isinstance(value, str) or not value.strip() or value != value.strip()
|
|
213
|
+
for value in identity_fields
|
|
214
|
+
):
|
|
215
|
+
raise ExecutionFault(
|
|
216
|
+
"The saved Sanka route manifest contains invalid identity fields.",
|
|
217
|
+
code="SANKA_MIGRATE_ROUTE_MANIFEST_INVALID",
|
|
218
|
+
)
|
|
210
219
|
normalized.append(
|
|
211
220
|
{
|
|
212
221
|
"routeKey": route_key,
|
|
@@ -215,6 +224,7 @@ def canonical_route_manifest(raw: Any) -> MappingRouteManifest:
|
|
|
215
224
|
"sourceFilter": (
|
|
216
225
|
_source_filter_payload(source_filter) if source_filter is not None else None
|
|
217
226
|
),
|
|
227
|
+
**({"identityFields": sorted(set(identity_fields))} if identity_fields else {}),
|
|
218
228
|
}
|
|
219
229
|
)
|
|
220
230
|
return sorted(normalized, key=lambda row: str(row["routeKey"]))
|
|
@@ -617,7 +617,7 @@ def test_research_client_uses_public_branded_base_and_unwraps_data() -> None:
|
|
|
617
617
|
"after": ["2027-01"],
|
|
618
618
|
"locale": ["ja"],
|
|
619
619
|
}
|
|
620
|
-
assert request.get_header("User-agent") == "sanka-cli/0.2.
|
|
620
|
+
assert request.get_header("User-agent") == "sanka-cli/0.2.6"
|
|
621
621
|
assert timeout == 10.0
|
|
622
622
|
|
|
623
623
|
|
|
@@ -604,7 +604,7 @@ def test_route_progress_keys_are_validated_by_the_remap() -> None:
|
|
|
604
604
|
|
|
605
605
|
def test_canonical_route_manifest_sorts_rows_and_drops_extra_keys() -> None:
|
|
606
606
|
rows = list(reversed(_filtered_manifest()))
|
|
607
|
-
rows[0] = {**rows[0], "
|
|
607
|
+
rows[0] = {**rows[0], "unusedMetadata": "ignored"}
|
|
608
608
|
normalized = canonical_route_manifest(rows)
|
|
609
609
|
assert [row["routeKey"] for row in normalized] == [FILTERED_ROUTE, "contacts|contacts"]
|
|
610
610
|
assert all(
|
|
@@ -713,6 +713,60 @@ def test_execution_route_manifest_reads_the_saved_manifest() -> None:
|
|
|
713
713
|
assert excinfo.value.code == "SANKA_MIGRATE_ROUTE_MANIFEST_MISSING"
|
|
714
714
|
|
|
715
715
|
|
|
716
|
+
def test_identity_manifest_survives_mapping_validation_and_journal_round_trip() -> None:
|
|
717
|
+
from sanka.runtime.mapping.record_mapping import mapping_route_manifest
|
|
718
|
+
|
|
719
|
+
field = MigrationMappingField(
|
|
720
|
+
source_field="accounts.Domain",
|
|
721
|
+
target_object="companies",
|
|
722
|
+
target_field="domain",
|
|
723
|
+
identity=True,
|
|
724
|
+
)
|
|
725
|
+
groups: list[MappingGroup] = [("accounts", "companies", None, [field])]
|
|
726
|
+
saved = mapping_route_manifest(groups)
|
|
727
|
+
assert saved[0]["identityFields"] == ["domain"]
|
|
728
|
+
validated = require_matching_route_manifest(groups, saved)
|
|
729
|
+
assert validated == saved
|
|
730
|
+
report = _queued_report()
|
|
731
|
+
report["execution"]["routeManifest"] = validated
|
|
732
|
+
restored = _round_trip(report)
|
|
733
|
+
assert restored["execution"]["routeManifest"] == saved
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
@pytest.mark.parametrize("identities", [["email"], [], None])
|
|
737
|
+
def test_changed_or_removed_identities_reject_a_previously_reviewed_manifest(
|
|
738
|
+
identities: list[str] | None,
|
|
739
|
+
) -> None:
|
|
740
|
+
field = MigrationMappingField(
|
|
741
|
+
source_field="accounts.Domain",
|
|
742
|
+
target_object="companies",
|
|
743
|
+
target_field="domain",
|
|
744
|
+
identity=True,
|
|
745
|
+
)
|
|
746
|
+
groups: list[MappingGroup] = [("accounts", "companies", None, [field])]
|
|
747
|
+
saved = _manifest()
|
|
748
|
+
if identities is not None:
|
|
749
|
+
saved[0]["identityFields"] = identities
|
|
750
|
+
with pytest.raises(ExecutionFault) as excinfo:
|
|
751
|
+
require_matching_route_manifest(groups, saved)
|
|
752
|
+
assert excinfo.value.code == "SANKA_MIGRATE_ROUTE_MANIFEST_CHANGED"
|
|
753
|
+
|
|
754
|
+
|
|
755
|
+
@pytest.mark.parametrize("identities", [None, "email", [1], [""], [" email"], {}])
|
|
756
|
+
def test_invalid_identity_fields_fail_closed(identities: Any) -> None:
|
|
757
|
+
saved = _manifest()
|
|
758
|
+
saved[0]["identityFields"] = identities
|
|
759
|
+
with pytest.raises(ExecutionFault) as excinfo:
|
|
760
|
+
canonical_route_manifest(saved)
|
|
761
|
+
assert excinfo.value.code == "SANKA_MIGRATE_ROUTE_MANIFEST_INVALID"
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
def test_identity_order_and_duplicates_are_canonical() -> None:
|
|
765
|
+
saved = _manifest()
|
|
766
|
+
saved[0]["identityFields"] = ["external_id", "email", "email"]
|
|
767
|
+
assert canonical_route_manifest(saved)[0]["identityFields"] == ["email", "external_id"]
|
|
768
|
+
|
|
769
|
+
|
|
716
770
|
# -- route selection -----------------------------------------------------------
|
|
717
771
|
|
|
718
772
|
|
|
@@ -21,7 +21,7 @@ def test_root_version_uses_unified_public_version(runner: CliRunner) -> None:
|
|
|
21
21
|
result = runner.invoke(cli, ["--version"])
|
|
22
22
|
|
|
23
23
|
assert result.exit_code == 0
|
|
24
|
-
assert result.output == "sanka, version 0.2.
|
|
24
|
+
assert result.output == "sanka, version 0.2.6\n"
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
def test_mcp_client_uses_the_cli_version_in_its_user_agent() -> None:
|
|
@@ -29,7 +29,7 @@ def test_mcp_client_uses_the_cli_version_in_its_user_agent() -> None:
|
|
|
29
29
|
|
|
30
30
|
client = SankaMigrateApiClient()
|
|
31
31
|
|
|
32
|
-
assert client._client.headers["User-Agent"] == "sanka-cli/0.2.
|
|
32
|
+
assert client._client.headers["User-Agent"] == "sanka-cli/0.2.6"
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
def test_mcp_without_extra_has_install_hint(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sanka_cli-0.2.5 → sanka_cli-0.2.6}/tests/fixtures/extension_marketplace/drf-to-fastapi.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|