datajoint 2.1.1__tar.gz → 2.2.1__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 (159) hide show
  1. {datajoint-2.1.1 → datajoint-2.2.1}/CONTRIBUTING.md +38 -2
  2. {datajoint-2.1.1 → datajoint-2.2.1}/PKG-INFO +5 -5
  3. {datajoint-2.1.1 → datajoint-2.2.1}/README.md +4 -4
  4. {datajoint-2.1.1 → datajoint-2.2.1}/pixi.lock +880 -203
  5. {datajoint-2.1.1 → datajoint-2.2.1}/pyproject.toml +1 -0
  6. datajoint-2.2.1/src/datajoint/__init__.py +290 -0
  7. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/adapters/base.py +141 -1
  8. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/adapters/mysql.py +44 -3
  9. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/adapters/postgres.py +66 -0
  10. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/autopopulate.py +11 -10
  11. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/attach.py +4 -2
  12. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/filepath.py +19 -9
  13. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/hash.py +4 -2
  14. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/npy.py +5 -3
  15. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/object.py +5 -3
  16. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/schema.py +10 -3
  17. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/codecs.py +18 -3
  18. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/condition.py +7 -0
  19. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/connection.py +63 -41
  20. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/declare.py +16 -23
  21. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/dependencies.py +55 -87
  22. datajoint-2.2.1/src/datajoint/diagram.py +1402 -0
  23. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/errors.py +4 -0
  24. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/expression.py +20 -9
  25. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/gc.py +25 -13
  26. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/hash_registry.py +32 -12
  27. datajoint-2.2.1/src/datajoint/instance.py +311 -0
  28. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/jobs.py +15 -15
  29. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/lineage.py +6 -8
  30. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/migrate.py +5 -5
  31. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/objectref.py +2 -1
  32. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/preview.py +2 -2
  33. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/schemas.py +29 -106
  34. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/settings.py +9 -11
  35. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/staged_insert.py +2 -3
  36. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/storage.py +19 -6
  37. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/table.py +117 -168
  38. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/user_tables.py +4 -6
  39. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/utils.py +0 -40
  40. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/version.py +1 -1
  41. {datajoint-2.1.1 → datajoint-2.2.1}/tests/conftest.py +4 -4
  42. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_autopopulate.py +167 -0
  43. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_cascade_delete.py +104 -0
  44. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_cli.py +6 -3
  45. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_declare.py +10 -4
  46. datajoint-2.2.1/tests/integration/test_erd.py +158 -0
  47. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_gc.py +2 -2
  48. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_jobs.py +2 -3
  49. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_schema.py +2 -10
  50. datajoint-2.2.1/tests/integration/test_skip_duplicates.py +205 -0
  51. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_codecs.py +2 -0
  52. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_settings.py +77 -12
  53. datajoint-2.2.1/tests/unit/test_thread_safe.py +294 -0
  54. datajoint-2.1.1/src/datajoint/__init__.py +0 -114
  55. datajoint-2.1.1/src/datajoint/diagram.py +0 -1037
  56. datajoint-2.1.1/tests/integration/test_erd.py +0 -63
  57. {datajoint-2.1.1 → datajoint-2.2.1}/.coveragerc +0 -0
  58. {datajoint-2.1.1 → datajoint-2.2.1}/.devcontainer/Dockerfile +0 -0
  59. {datajoint-2.1.1 → datajoint-2.2.1}/.devcontainer/devcontainer.json +0 -0
  60. {datajoint-2.1.1 → datajoint-2.2.1}/.devcontainer/docker-compose.yml +0 -0
  61. {datajoint-2.1.1 → datajoint-2.2.1}/.dockerignore +0 -0
  62. {datajoint-2.1.1 → datajoint-2.2.1}/.gitattributes +0 -0
  63. {datajoint-2.1.1 → datajoint-2.2.1}/.github/DISCUSSION_TEMPLATE/rfc.yml +0 -0
  64. {datajoint-2.1.1 → datajoint-2.2.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  65. {datajoint-2.1.1 → datajoint-2.2.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  66. {datajoint-2.1.1 → datajoint-2.2.1}/.github/ISSUE_TEMPLATE/improvement_request.md +0 -0
  67. {datajoint-2.1.1 → datajoint-2.2.1}/.github/dependabot.yml +0 -0
  68. {datajoint-2.1.1 → datajoint-2.2.1}/.github/release_drafter.yaml +0 -0
  69. {datajoint-2.1.1 → datajoint-2.2.1}/.github/workflows/close_inactive_issues_prs.yaml +0 -0
  70. {datajoint-2.1.1 → datajoint-2.2.1}/.github/workflows/draft_release.yaml +0 -0
  71. {datajoint-2.1.1 → datajoint-2.2.1}/.github/workflows/lint.yaml +0 -0
  72. {datajoint-2.1.1 → datajoint-2.2.1}/.github/workflows/post_draft_release_published.yaml +0 -0
  73. {datajoint-2.1.1 → datajoint-2.2.1}/.github/workflows/test.yaml +0 -0
  74. {datajoint-2.1.1 → datajoint-2.2.1}/.gitignore +0 -0
  75. {datajoint-2.1.1 → datajoint-2.2.1}/.pre-commit-config.yaml +0 -0
  76. {datajoint-2.1.1 → datajoint-2.2.1}/.vscode/launch.json +0 -0
  77. {datajoint-2.1.1 → datajoint-2.2.1}/CHANGELOG-archive.md +0 -0
  78. {datajoint-2.1.1 → datajoint-2.2.1}/Dockerfile +0 -0
  79. {datajoint-2.1.1 → datajoint-2.2.1}/LICENSE +0 -0
  80. {datajoint-2.1.1 → datajoint-2.2.1}/RELEASE_MEMO.md +0 -0
  81. {datajoint-2.1.1 → datajoint-2.2.1}/activate.sh +0 -0
  82. {datajoint-2.1.1 → datajoint-2.2.1}/docker-compose.yaml +0 -0
  83. {datajoint-2.1.1 → datajoint-2.2.1}/images/pipeline.drawio +0 -0
  84. {datajoint-2.1.1 → datajoint-2.2.1}/images/pipeline.png +0 -0
  85. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/adapters/__init__.py +0 -0
  86. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/blob.py +0 -0
  87. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/__init__.py +0 -0
  88. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/builtin_codecs/blob.py +0 -0
  89. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/cli.py +0 -0
  90. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/heading.py +0 -0
  91. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/logging.py +0 -0
  92. {datajoint-2.1.1 → datajoint-2.2.1}/src/datajoint/types.py +0 -0
  93. {datajoint-2.1.1 → datajoint-2.2.1}/tests/__init__.py +0 -0
  94. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/__init__.py +0 -0
  95. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/Course.csv +0 -0
  96. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/CurrentTerm.csv +0 -0
  97. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/Department.csv +0 -0
  98. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/Enroll.csv +0 -0
  99. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/Grade.csv +0 -0
  100. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/Section.csv +0 -0
  101. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/Student.csv +0 -0
  102. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/StudentMajor.csv +0 -0
  103. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/data/Term.csv +0 -0
  104. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_aggr_regressions.py +0 -0
  105. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_alter.py +0 -0
  106. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_attach.py +0 -0
  107. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_blob.py +0 -0
  108. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_blob_matlab.py +0 -0
  109. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_cascading_delete.py +0 -0
  110. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_codec_chaining.py +0 -0
  111. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_codecs.py +0 -0
  112. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_connection.py +0 -0
  113. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_dependencies.py +0 -0
  114. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_fetch.py +0 -0
  115. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_fetch_same.py +0 -0
  116. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_foreign_keys.py +0 -0
  117. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_groupby.py +0 -0
  118. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_hash_storage.py +0 -0
  119. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_hidden_job_metadata.py +0 -0
  120. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_insert.py +0 -0
  121. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_json.py +0 -0
  122. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_multi_backend.py +0 -0
  123. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_nan.py +0 -0
  124. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_npy_codec.py +0 -0
  125. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_object.py +0 -0
  126. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_privileges.py +0 -0
  127. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_reconnection.py +0 -0
  128. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_relation.py +0 -0
  129. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_relation_u.py +0 -0
  130. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_relational_operand.py +0 -0
  131. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_schema_keywords.py +0 -0
  132. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_semantic_matching.py +0 -0
  133. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_tls.py +0 -0
  134. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_type_aliases.py +0 -0
  135. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_university.py +0 -0
  136. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_update1.py +0 -0
  137. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_utils.py +0 -0
  138. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_uuid.py +0 -0
  139. {datajoint-2.1.1 → datajoint-2.2.1}/tests/integration/test_virtual_module.py +0 -0
  140. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema.py +0 -0
  141. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_advanced.py +0 -0
  142. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_aggr_regress.py +0 -0
  143. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_alter.py +0 -0
  144. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_codecs.py +0 -0
  145. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_external.py +0 -0
  146. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_object.py +0 -0
  147. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_privileges.py +0 -0
  148. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_simple.py +0 -0
  149. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_type_aliases.py +0 -0
  150. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_university.py +0 -0
  151. {datajoint-2.1.1 → datajoint-2.2.1}/tests/schema_uuid.py +0 -0
  152. {datajoint-2.1.1 → datajoint-2.2.1}/tests/test_package.py +0 -0
  153. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/__init__.py +0 -0
  154. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_adapters.py +0 -0
  155. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_condition.py +0 -0
  156. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_fetch_compat.py +0 -0
  157. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_lazy_imports.py +0 -0
  158. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_pk_rules.py +0 -0
  159. {datajoint-2.1.1 → datajoint-2.2.1}/tests/unit/test_storage_urls.py +0 -0
@@ -36,13 +36,17 @@ pytest tests/
36
36
 
37
37
  ## Running Tests
38
38
 
39
- Tests use [testcontainers](https://testcontainers.com/) to automatically manage MySQL and MinIO containers. No manual `docker-compose up` required.
39
+ Tests use [testcontainers](https://testcontainers.com/) to automatically manage MySQL, PostgreSQL, and MinIO containers. No manual `docker-compose up` required.
40
+
41
+ Integration tests are **backend-parameterized** — tests using the `backend` fixture run automatically against both MySQL and PostgreSQL.
40
42
 
41
43
  ```bash
42
- pixi run test # All tests
44
+ pixi run test # All tests (both backends)
43
45
  pixi run test-cov # With coverage
44
46
  pixi run -e test pytest tests/unit/ # Unit tests only
45
47
  pixi run -e test pytest tests/integration/test_blob.py -v # Specific file
48
+ pixi run -e test pytest -m mysql # MySQL tests only
49
+ pixi run -e test pytest -m postgresql # PostgreSQL tests only
46
50
  ```
47
51
 
48
52
  **macOS Docker Desktop users:** If tests fail to connect:
@@ -50,12 +54,28 @@ pixi run -e test pytest tests/integration/test_blob.py -v # Specific file
50
54
  export DOCKER_HOST=unix://$HOME/.docker/run/docker.sock
51
55
  ```
52
56
 
57
+ ### PostgreSQL Backend
58
+
59
+ DataJoint supports PostgreSQL 15+ as an alternative to MySQL 8+. To install the PostgreSQL driver:
60
+
61
+ ```bash
62
+ pip install -e ".[postgres]" # Installs psycopg2-binary
63
+ ```
64
+
65
+ Tests automatically spin up both MySQL and PostgreSQL containers via testcontainers. Backend-parameterized tests (those using the `backend` fixture in `tests/conftest.py`) run against both backends to ensure feature parity.
66
+
53
67
  ### External Containers (for debugging)
54
68
 
55
69
  ```bash
70
+ # MySQL + MinIO
56
71
  docker compose up -d db minio
57
72
  DJ_USE_EXTERNAL_CONTAINERS=1 pixi run test
58
73
  docker compose down
74
+
75
+ # MySQL + PostgreSQL + MinIO
76
+ docker compose up -d db postgres minio
77
+ DJ_USE_EXTERNAL_CONTAINERS=1 pixi run test
78
+ docker compose down
59
79
  ```
60
80
 
61
81
  ### Full Docker
@@ -91,12 +111,28 @@ Hooks include: **ruff** (lint/format), **codespell**, YAML/JSON/TOML validation.
91
111
 
92
112
  For `DJ_USE_EXTERNAL_CONTAINERS=1`:
93
113
 
114
+ ### MySQL
115
+
94
116
  | Variable | Default | Description |
95
117
  |----------|---------|-------------|
96
118
  | `DJ_HOST` | `localhost` | MySQL hostname |
97
119
  | `DJ_PORT` | `3306` | MySQL port |
98
120
  | `DJ_USER` | `root` | MySQL username |
99
121
  | `DJ_PASS` | `password` | MySQL password |
122
+
123
+ ### PostgreSQL
124
+
125
+ | Variable | Default | Description |
126
+ |----------|---------|-------------|
127
+ | `DJ_PG_HOST` | `localhost` | PostgreSQL hostname |
128
+ | `DJ_PG_PORT` | `5432` | PostgreSQL port |
129
+ | `DJ_PG_USER` | `postgres` | PostgreSQL username |
130
+ | `DJ_PG_PASS` | `password` | PostgreSQL password |
131
+
132
+ ### Object Storage
133
+
134
+ | Variable | Default | Description |
135
+ |----------|---------|-------------|
100
136
  | `S3_ENDPOINT` | `localhost:9000` | MinIO endpoint |
101
137
 
102
138
  ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datajoint
3
- Version: 2.1.1
3
+ Version: 2.2.1
4
4
  Summary: DataJoint for Python is a framework for scientific workflow management based on relational principles. DataJoint is built on the foundation of the relational data model and prescribes a consistent method for organizing, populating, computing, and querying data.
5
5
  Project-URL: Homepage, https://docs.datajoint.com/
6
6
  Project-URL: Documentation, https://docs.datajoint.com/
@@ -303,8 +303,8 @@ DataJoint is a framework for scientific data pipelines based on the **Relational
303
303
  </td>
304
304
  <td>Citation</td>
305
305
  <td>
306
- <a href="https://doi.org/10.1101/031658">
307
- <img src="https://img.shields.io/badge/DOI-10.1101/031658-blue.svg" alt="DOI" />
306
+ <a href="https://doi.org/10.48550/arXiv.2602.16585">
307
+ <img src="https://img.shields.io/badge/DOI-10.48550/arXiv.2602.16585-blue.svg" alt="DOI" />
308
308
  </a>
309
309
  </td>
310
310
  <td>Coverage</td>
@@ -341,9 +341,9 @@ conda install -c conda-forge datajoint
341
341
  - [How-To Guides](https://docs.datajoint.com/how-to/) — Task-oriented guides
342
342
  - [API Reference](https://docs.datajoint.com/api/) — Complete API documentation
343
343
  - [Migration Guide](https://docs.datajoint.com/how-to/migrate-to-v20/) — Upgrade from legacy versions
344
- - **[DataJoint Elements](https://datajoint.com/docs/elements/)** — Example pipelines for neuroscience
344
+ - **[DataJoint Elements](https://docs.datajoint.com/elements/)** — Example pipelines for neuroscience
345
345
  - **[GitHub Discussions](https://github.com/datajoint/datajoint-python/discussions)** — Community support
346
346
 
347
347
  ## Contributing
348
348
 
349
- See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
349
+ See [CONTRIBUTING.md](https://github.com/datajoint/datajoint-python/blob/master/CONTRIBUTING.md) for development setup and guidelines.
@@ -42,8 +42,8 @@ DataJoint is a framework for scientific data pipelines based on the **Relational
42
42
  </td>
43
43
  <td>Citation</td>
44
44
  <td>
45
- <a href="https://doi.org/10.1101/031658">
46
- <img src="https://img.shields.io/badge/DOI-10.1101/031658-blue.svg" alt="DOI" />
45
+ <a href="https://doi.org/10.48550/arXiv.2602.16585">
46
+ <img src="https://img.shields.io/badge/DOI-10.48550/arXiv.2602.16585-blue.svg" alt="DOI" />
47
47
  </a>
48
48
  </td>
49
49
  <td>Coverage</td>
@@ -80,9 +80,9 @@ conda install -c conda-forge datajoint
80
80
  - [How-To Guides](https://docs.datajoint.com/how-to/) — Task-oriented guides
81
81
  - [API Reference](https://docs.datajoint.com/api/) — Complete API documentation
82
82
  - [Migration Guide](https://docs.datajoint.com/how-to/migrate-to-v20/) — Upgrade from legacy versions
83
- - **[DataJoint Elements](https://datajoint.com/docs/elements/)** — Example pipelines for neuroscience
83
+ - **[DataJoint Elements](https://docs.datajoint.com/elements/)** — Example pipelines for neuroscience
84
84
  - **[GitHub Discussions](https://github.com/datajoint/datajoint-python/discussions)** — Community support
85
85
 
86
86
  ## Contributing
87
87
 
88
- See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
88
+ See [CONTRIBUTING.md](https://github.com/datajoint/datajoint-python/blob/master/CONTRIBUTING.md) for development setup and guidelines.