ado-asana-sync 1.23.7__tar.gz → 1.24.0__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.
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/PKG-INFO +1 -1
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/database/database.py +14 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/pyproject.toml +1 -1
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/database/test_database.py +8 -2
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.changelog.json +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.claude/settings.local.json +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.devcontainer/devcontainer.json +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.devcontainer/postCreate.sh +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.dockerignore +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.editorconfig +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.env.example +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/copilot-instructions.md +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/dependabot.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/build.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/claude.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/codeql.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/pragent.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/release.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.gitignore +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.hadolint.yaml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.pr_agent.toml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.vscode/launch.json +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.vscode/settings.json +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.vscode/tasks.json +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/AGENTS.md +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/CHANGELOG.md +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/CLAUDE.md +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/Dockerfile +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/GEMINI.md +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/GitVersion.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/LICENSE +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/README.md +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/database/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/__main__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/app.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/asana.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/pull_request_item.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/pull_request_sync.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/sync.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/task_item.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/utils.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/date.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/logging_tracing.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/utils.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/compose.yml +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/docs/TESTING_EXAMPLES.md +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/scripts/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/scripts/quality.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/sonar-project.properties +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/database/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_app.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_app_database.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_due_date_integration.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_due_date_utils.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pagination.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pr_id_title_mismatch.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pull_request_item.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pull_request_sync.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_sync.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_sync_integration.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_tag_functions.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_task_item.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/__init__.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_date.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_helpers.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_logging_tracing.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_utils.py +0 -0
- {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/uv.lock +0 -0
|
@@ -410,6 +410,20 @@ class Database:
|
|
|
410
410
|
|
|
411
411
|
def sync_projects_from_json(self, projects_data: List[Dict[str, str]]) -> None:
|
|
412
412
|
"""Sync projects from JSON data into the projects table."""
|
|
413
|
+
# Check for duplicates before DB operations to provide better error messages
|
|
414
|
+
seen = set()
|
|
415
|
+
duplicates = []
|
|
416
|
+
for project in projects_data:
|
|
417
|
+
key = (project["adoProjectName"], project["adoTeamName"])
|
|
418
|
+
if key in seen:
|
|
419
|
+
duplicates.append(f"{project['adoProjectName']} (Team: {project['adoTeamName']})")
|
|
420
|
+
seen.add(key)
|
|
421
|
+
|
|
422
|
+
if duplicates:
|
|
423
|
+
error_msg = f"Duplicate project configuration found in projects.json for: {', '.join(duplicates)}"
|
|
424
|
+
_LOGGER.error(error_msg)
|
|
425
|
+
raise ValueError(error_msg)
|
|
426
|
+
|
|
413
427
|
with self.get_connection() as conn:
|
|
414
428
|
# Clear existing projects
|
|
415
429
|
conn.execute("DELETE FROM projects")
|
|
@@ -280,10 +280,16 @@ class TestDatabaseMigration(unittest.TestCase):
|
|
|
280
280
|
|
|
281
281
|
db = Database(self.db_path)
|
|
282
282
|
|
|
283
|
-
# This should raise
|
|
284
|
-
with self.assertRaises(
|
|
283
|
+
# This should raise a ValueError due to the pre-check validation
|
|
284
|
+
with self.assertRaises(ValueError) as cm:
|
|
285
285
|
db.sync_projects_from_json(projects_data)
|
|
286
286
|
|
|
287
|
+
# Verify the error message contains specific details about the duplicate
|
|
288
|
+
error_msg = str(cm.exception)
|
|
289
|
+
self.assertIn("Duplicate project configuration found", error_msg)
|
|
290
|
+
self.assertIn("TestProject", error_msg)
|
|
291
|
+
self.assertIn("Team1", error_msg)
|
|
292
|
+
|
|
287
293
|
db.close()
|
|
288
294
|
|
|
289
295
|
def test_migration_from_old_schema(self):
|
|
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
|