| 
									
										
										
										
											2025-05-27 10:56:52 +02:00
										 |  |  | #  Copyright 2025 Collate | 
					
						
							|  |  |  | #  Licensed under the Collate Community License, Version 1.0 (the "License"); | 
					
						
							|  |  |  | #  you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | #  You may obtain a copy of the License at | 
					
						
							|  |  |  | #  https://github.com/open-metadata/OpenMetadata/blob/main/ingestion/LICENSE | 
					
						
							|  |  |  | #  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | #  See the License for the specific language governing permissions and | 
					
						
							|  |  |  | #  limitations under the License. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | Nox sessions for testing and formatting checks. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2025-05-28 11:12:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import nox | 
					
						
							| 
									
										
										
										
											2025-05-27 10:56:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | # NOTE: This is still a work in progress! We still need to: | 
					
						
							|  |  |  | #    - Fix ignored unit tests | 
					
						
							|  |  |  | #    - Add integration tests | 
					
						
							|  |  |  | #    - Address the TODOs in the code | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # TODO: Add python 3.9. PYTHON 3.9 fails in Mac os due to problem with `psycopg2-binary` package | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SUPPORTED_PYTHON_VERSIONS = ["3.10", "3.11"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_python_versions(): | 
					
						
							|  |  |  |     # Check if we are in GitHub Actions (i.e., if the 'PYTHON_VERSIONS' environment variable is set) | 
					
						
							|  |  |  |     if "PYTHON_VERSIONS" in os.environ: | 
					
						
							|  |  |  |         # Return the list of Python versions passed from GitHub Actions matrix | 
					
						
							|  |  |  |         python_versions = os.environ["PYTHON_VERSIONS"].split(",") | 
					
						
							|  |  |  |         # if some versions are not supported, they will be ignored by nox | 
					
						
							|  |  |  |         return python_versions | 
					
						
							|  |  |  |     return SUPPORTED_PYTHON_VERSIONS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @nox.session( | 
					
						
							|  |  |  |     name="lint", | 
					
						
							| 
									
										
										
										
											2025-05-28 11:12:44 +02:00
										 |  |  |     reuse_venv=True, | 
					
						
							| 
									
										
										
										
											2025-05-27 10:56:52 +02:00
										 |  |  |     venv_backend="uv|venv", | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | def lint(session): | 
					
						
							|  |  |  |     # Usually, we want just one Python version for linting and type check, | 
					
						
							|  |  |  |     # so no need to specify them here | 
					
						
							|  |  |  |     session.install(".[dev]") | 
					
						
							|  |  |  |     # Configuration from pyproject.toml is taken into account out of the box | 
					
						
							|  |  |  |     session.run("black", "--check", ".", "../openmetadata-airflow-apis/") | 
					
						
							|  |  |  |     session.run("isort", "--check-only", ".", "../openmetadata-airflow-apis/") | 
					
						
							|  |  |  |     session.run("pycln", "--diff", ".", "../openmetadata-airflow-apis/") | 
					
						
							|  |  |  |     # TODO: It remains to adapt the command from the Makefile: | 
					
						
							|  |  |  |     # 	PYTHONPATH="${PYTHONPATH}:$(INGESTION_DIR)/plugins" pylint --errors-only | 
					
						
							|  |  |  |     # 	--rcfile=$(INGESTION_DIR)/pyproject.toml --fail-under=10 $(PY_SOURCE)/metadata | 
					
						
							|  |  |  |     # 	|| (echo "PyLint error code $$?"; exit 1) | 
					
						
							|  |  |  |     #   Some work is required to import plugins correctly | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @nox.session( | 
					
						
							| 
									
										
										
										
											2025-05-28 11:12:44 +02:00
										 |  |  |     name="unit", reuse_venv=True, venv_backend="uv|venv", python=get_python_versions() | 
					
						
							| 
									
										
										
										
											2025-05-27 10:56:52 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | def unit(session): | 
					
						
							|  |  |  |     session.install(".[all-dev-env, test-unit]") | 
					
						
							|  |  |  |     # TODO: we need to install pip so that spaCy can install its dependencies | 
					
						
							|  |  |  |     #       we should find a way to avoid this | 
					
						
							|  |  |  |     session.install("pip") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # TODO: We need to remove ignored test once they can be run properly within nox | 
					
						
							|  |  |  |     # Run unit tests | 
					
						
							|  |  |  |     ignored_tests = [ | 
					
						
							|  |  |  |         "test_ometa_endpoints.py", | 
					
						
							|  |  |  |         "test_ometa_mlmodel.py", | 
					
						
							|  |  |  |         "test_dbt.py", | 
					
						
							|  |  |  |         "test_sample_usage.py", | 
					
						
							|  |  |  |         "test_ssl_manager.py", | 
					
						
							|  |  |  |         "test_usage_filter.py", | 
					
						
							|  |  |  |         "test_import_checker.py", | 
					
						
							|  |  |  |         "test_suite/", | 
					
						
							|  |  |  |         "profiler/test_profiler_partitions.py", | 
					
						
							|  |  |  |         "profiler/test_workflow.py", | 
					
						
							|  |  |  |         "workflow", | 
					
						
							|  |  |  |         "topology", | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     ignore_args = [f"--ignore=tests/unit/{test}" for test in ignored_tests] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-28 11:12:44 +02:00
										 |  |  |     # run pytest with the ignore arguments and in parallel mode | 
					
						
							| 
									
										
										
										
											2025-05-27 10:56:52 +02:00
										 |  |  |     session.run("pytest", "tests/unit/", *ignore_args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # TEST PLUGINS | 
					
						
							|  |  |  | PLUGINS_TESTS = { | 
					
						
							|  |  |  |     "great-expectations": "tests/unit/great_expectations", | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | PLUGINS = list(PLUGINS_TESTS.keys()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @nox.session( | 
					
						
							|  |  |  |     name="unit-plugins", | 
					
						
							| 
									
										
										
										
											2025-05-28 11:12:44 +02:00
										 |  |  |     reuse_venv=False, | 
					
						
							| 
									
										
										
										
											2025-05-27 10:56:52 +02:00
										 |  |  |     venv_backend="uv|venv", | 
					
						
							|  |  |  |     python=get_python_versions(), | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | @nox.parametrize("plugin", PLUGINS) | 
					
						
							|  |  |  | def unit_plugins(session, plugin): | 
					
						
							|  |  |  |     session.install(".[test-unit]") | 
					
						
							| 
									
										
										
										
											2025-05-28 11:12:44 +02:00
										 |  |  |     session.install(f".[{plugin}]") | 
					
						
							| 
									
										
										
										
											2025-05-27 10:56:52 +02:00
										 |  |  |     # Assuming the plugin has its own tests in a specific directory | 
					
						
							|  |  |  |     session.run("pytest", PLUGINS_TESTS[plugin]) |