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.
Files changed (72) hide show
  1. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/PKG-INFO +1 -1
  2. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/database/database.py +14 -0
  3. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/pyproject.toml +1 -1
  4. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/database/test_database.py +8 -2
  5. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.changelog.json +0 -0
  6. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.claude/settings.local.json +0 -0
  7. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.devcontainer/devcontainer.json +0 -0
  8. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.devcontainer/postCreate.sh +0 -0
  9. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.dockerignore +0 -0
  10. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.editorconfig +0 -0
  11. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.env.example +0 -0
  12. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/copilot-instructions.md +0 -0
  13. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/dependabot.yml +0 -0
  14. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/build.yml +0 -0
  15. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/claude.yml +0 -0
  16. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/codeql.yml +0 -0
  17. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/pragent.yml +0 -0
  18. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.github/workflows/release.yml +0 -0
  19. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.gitignore +0 -0
  20. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.hadolint.yaml +0 -0
  21. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.pr_agent.toml +0 -0
  22. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.vscode/launch.json +0 -0
  23. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.vscode/settings.json +0 -0
  24. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/.vscode/tasks.json +0 -0
  25. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/AGENTS.md +0 -0
  26. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/CHANGELOG.md +0 -0
  27. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/CLAUDE.md +0 -0
  28. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/Dockerfile +0 -0
  29. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/GEMINI.md +0 -0
  30. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/GitVersion.yml +0 -0
  31. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/LICENSE +0 -0
  32. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/README.md +0 -0
  33. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/__init__.py +0 -0
  34. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/database/__init__.py +0 -0
  35. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/__init__.py +0 -0
  36. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/__main__.py +0 -0
  37. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/app.py +0 -0
  38. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/asana.py +0 -0
  39. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/pull_request_item.py +0 -0
  40. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/pull_request_sync.py +0 -0
  41. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/sync.py +0 -0
  42. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/task_item.py +0 -0
  43. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/sync/utils.py +0 -0
  44. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/__init__.py +0 -0
  45. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/date.py +0 -0
  46. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/logging_tracing.py +0 -0
  47. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/ado_asana_sync/utils/utils.py +0 -0
  48. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/compose.yml +0 -0
  49. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/docs/TESTING_EXAMPLES.md +0 -0
  50. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/scripts/__init__.py +0 -0
  51. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/scripts/quality.py +0 -0
  52. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/sonar-project.properties +0 -0
  53. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/database/__init__.py +0 -0
  54. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/__init__.py +0 -0
  55. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_app.py +0 -0
  56. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_app_database.py +0 -0
  57. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_due_date_integration.py +0 -0
  58. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_due_date_utils.py +0 -0
  59. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pagination.py +0 -0
  60. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pr_id_title_mismatch.py +0 -0
  61. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pull_request_item.py +0 -0
  62. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_pull_request_sync.py +0 -0
  63. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_sync.py +0 -0
  64. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_sync_integration.py +0 -0
  65. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_tag_functions.py +0 -0
  66. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/sync/test_task_item.py +0 -0
  67. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/__init__.py +0 -0
  68. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_date.py +0 -0
  69. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_helpers.py +0 -0
  70. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_logging_tracing.py +0 -0
  71. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/tests/utils/test_utils.py +0 -0
  72. {ado_asana_sync-1.23.7 → ado_asana_sync-1.24.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ado-asana-sync
3
- Version: 1.23.7
3
+ Version: 1.24.0
4
4
  Summary: Tool to sync work items and pull requests from Azure DevOps to Asana
5
5
  Author-email: Dan Anstis <dan@bsod.co.nz>
6
6
  License: MIT
@@ -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")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ado-asana-sync"
3
- version = "1.23.7"
3
+ version = "1.24.0"
4
4
  description = "Tool to sync work items and pull requests from Azure DevOps to Asana"
5
5
  authors = [{name = "Dan Anstis", email = "dan@bsod.co.nz"}]
6
6
  license = {text = "MIT"}
@@ -280,10 +280,16 @@ class TestDatabaseMigration(unittest.TestCase):
280
280
 
281
281
  db = Database(self.db_path)
282
282
 
283
- # This should raise an exception due to the unique constraint violation
284
- with self.assertRaises(Exception):
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