From 858f507dbe933dcfe5cd0d258f6a7a7ead5fa285 Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Sat, 10 Aug 2024 09:36:24 +0000 Subject: [PATCH 1/4] add missing makedirs Signed-off-by: Jack Luar <39641663+luarss@users.noreply.github.com> --- backend/.coveragerc | 4 ++ backend/.gitignore | 3 ++ backend/build_docs.py | 21 +++++------ backend/pytest.ini | 9 +++++ backend/requirements-test.txt | 5 ++- backend/tests/test_build_docs.py | 63 ++++++++++++++++++++++++++++++++ ruff.toml | 2 +- 7 files changed, 93 insertions(+), 14 deletions(-) create mode 100644 backend/.coveragerc create mode 100644 backend/.gitignore create mode 100644 backend/pytest.ini create mode 100644 backend/tests/test_build_docs.py diff --git a/backend/.coveragerc b/backend/.coveragerc new file mode 100644 index 0000000..7e382fd --- /dev/null +++ b/backend/.coveragerc @@ -0,0 +1,4 @@ +[run] +omit = + tests/* + */__init__.py \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..0177ff3 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,3 @@ +# Coverage files +.coverage +coverage.xml \ No newline at end of file diff --git a/backend/build_docs.py b/backend/build_docs.py index 787cc0a..1c0d129 100644 --- a/backend/build_docs.py +++ b/backend/build_docs.py @@ -356,23 +356,20 @@ def get_yosys_rtdocs() -> None: if __name__ == '__main__': logging.info('Building knowledge base...') - docs_paths = [ + purge_folders(folder_paths=['data']) + + new_paths = [ 'data/markdown/manpages', 'data/markdown/OR_docs', + 'data/markdown/OR_docs/installation', + 'data/markdown/OR_docs/tools', 'data/markdown/ORFS_docs', - 'data/pdf', + 'data/markdown/ORFS_docs/installation', + 'data/pdf/OpenSTA', 'data/rtdocs', ] - purge_folders(folder_paths=docs_paths) - - os.makedirs('data/markdown/manpages', exist_ok=True) - os.makedirs('data/markdown/OR_docs', exist_ok=True) - os.makedirs('data/markdown/OR_docs/installation', exist_ok=True) - os.makedirs('data/markdown/OR_docs/tools', exist_ok=True) - os.makedirs('data/markdown/ORFS_docs', exist_ok=True) - os.makedirs('data/markdown/ORFS_docs/installation', exist_ok=True) - os.makedirs('data/pdf/OpenSTA', exist_ok=True) - os.makedirs('data/rtdocs', exist_ok=True) + for path in new_paths: + os.makedirs(path, exist_ok=True) get_yosys_rtdocs() get_opensta_docs() diff --git a/backend/pytest.ini b/backend/pytest.ini new file mode 100644 index 0000000..845e73e --- /dev/null +++ b/backend/pytest.ini @@ -0,0 +1,9 @@ +[pytest] +python_files = test_*.py +python_functions = test_* +log_format = %(asctime)s %(levelname)s %(message)s +log_date_format = %Y-%m-%d %H:%M:%S +log_level = NOTSET +log_cli = true +addopts = --cov . --cov-report term --cov-report xml:coverage.xml +testpaths = tests \ No newline at end of file diff --git a/backend/requirements-test.txt b/backend/requirements-test.txt index e74cdc0..498db54 100644 --- a/backend/requirements-test.txt +++ b/backend/requirements-test.txt @@ -23,4 +23,7 @@ sphinxcontrib-mermaid==0.9.2 sphinx-book-theme==1.1.3 sphinx-copybutton==0.5.2 sphinx-external-toc==1.0.1 -pypdf==4.2.0 \ No newline at end of file +pypdf==4.2.0 +pytest==8.3.0 +pytest-cov==5.0.0 +pytest-logger==1.1.1 diff --git a/backend/tests/test_build_docs.py b/backend/tests/test_build_docs.py new file mode 100644 index 0000000..1cf500d --- /dev/null +++ b/backend/tests/test_build_docs.py @@ -0,0 +1,63 @@ +import os +import sys +import logging + +# TODO: Fix this using pip install -e . +os.chdir(os.path.join(os.path.dirname(__file__), '..')) +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) + +from build_docs import ( + purge_folders, + get_yosys_rtdocs, + get_opensta_docs +) + + +docs_paths = [ + 'data/markdown/manpages', + 'data/markdown/OR_docs', + 'data/markdown/OR_docs/installation', + 'data/markdown/OR_docs/tools', + 'data/markdown/ORFS_docs', + 'data/markdown/ORFS_docs/installation', + 'data/pdf/OpenSTA', + 'data/rtdocs', +] + + +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +def test_setup(): + logger.info('Setting up...') + for path in docs_paths: + os.makedirs(path, exist_ok=True) + + +def test_purge_folders(): + lst = ['test1', 'test2'] + purge_folders(lst) + + # Check if the folders are deleted + for folder in lst: + assert not os.path.exists(folder) + + +def test_get_yosys_rtdocs(): + yosys_version='0.36' + yosys_docs_count=283 + get_yosys_rtdocs() + assert os.path.exists('data/rtdocs') + + count = sum(len(files) for _, _, files in os.walk(f"data/rtdocs/yosyshq.readthedocs.io/projects/yosys/en/{yosys_version}")) + assert count == yosys_docs_count, f"Expected {yosys_docs_count} files, got {count}" + + +def test_get_opensta_docs(): + get_opensta_docs() + assert os.path.exists('data/pdf/OpenSTA/OpenSTA_docs.pdf') + + +def test_teardown(): + logger.info('Cleaning up...') + purge_folders(docs_paths) \ No newline at end of file diff --git a/ruff.toml b/ruff.toml index b179ab3..ad10fa4 100644 --- a/ruff.toml +++ b/ruff.toml @@ -35,7 +35,7 @@ target-version = "py312" [lint] select = ["E4", "E7", "E9","E301","E304","E305","E401","E223","E224","E242", "F","N"] extend-select = ["D203", "D204"] -ignore = [] +ignore = ["E402"] preview = true # Allow fix for all enabled rules (when `--fix` is provided). From 1e65d6b47a278ea5a9a924830f6f514e5de76b44 Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Sat, 10 Aug 2024 10:39:16 +0000 Subject: [PATCH 2/4] add more tests and rename ci file. also make CI specify to branch master to avoid double checks when branch created from upstream. Signed-off-by: Jack Luar <39641663+luarss@users.noreply.github.com> --- .github/workflows/build-backend-docker.yml | 8 ++- .github/workflows/{mypy.yaml => ci.yaml} | 14 ++++- .github/workflows/ruff_linter.yml | 8 ++- backend/build_docs.py | 14 ++++- backend/tests/test_build_docs.py | 60 ++++++++++++++++++++-- 5 files changed, 95 insertions(+), 9 deletions(-) rename .github/workflows/{mypy.yaml => ci.yaml} (83%) diff --git a/.github/workflows/build-backend-docker.yml b/.github/workflows/build-backend-docker.yml index c289337..00a28e2 100644 --- a/.github/workflows/build-backend-docker.yml +++ b/.github/workflows/build-backend-docker.yml @@ -1,6 +1,12 @@ name: Build Backend Docker Image -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: + branches: + - master jobs: build-backend-docker: diff --git a/.github/workflows/mypy.yaml b/.github/workflows/ci.yaml similarity index 83% rename from .github/workflows/mypy.yaml rename to .github/workflows/ci.yaml index 7965d4a..446d813 100644 --- a/.github/workflows/mypy.yaml +++ b/.github/workflows/ci.yaml @@ -1,6 +1,12 @@ -name: Mypy & pre-commit +name: CI checks -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: + branches: + - master jobs: backend: @@ -21,6 +27,10 @@ jobs: - name: Run pre-commit run: | pre-commit run --files backend/* + - name: Run tests + working-directory: backend + run: | + pytest . frontend: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/ruff_linter.yml b/.github/workflows/ruff_linter.yml index 056f3a4..ea071d5 100644 --- a/.github/workflows/ruff_linter.yml +++ b/.github/workflows/ruff_linter.yml @@ -1,6 +1,12 @@ name: Ruff -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: + branches: + - master jobs: lint: diff --git a/backend/build_docs.py b/backend/build_docs.py index 1c0d129..4e59bba 100644 --- a/backend/build_docs.py +++ b/backend/build_docs.py @@ -163,6 +163,11 @@ def clone_repo(url: str, folder_name: str, commit_hash: Optional[str] = None) -> def build_or_docs() -> None: logging.debug('Starting OR docs build...') + # if sphinx-build not in PATH + if not shutil.which('sphinx-build'): + logging.debug('sphinx-build not found in PATH. Exiting.') + sys.exit(1) + os.chdir(os.path.join(cur_dir, 'OpenROAD/docs')) subprocess.run('make html', shell=True, capture_output=True) @@ -356,7 +361,14 @@ def get_yosys_rtdocs() -> None: if __name__ == '__main__': logging.info('Building knowledge base...') - purge_folders(folder_paths=['data']) + docs_paths = [ + 'data/markdown/manpages', + 'data/markdown/OR_docs', + 'data/markdown/ORFS_docs', + 'data/pdf', + 'data/rtdocs', + ] + purge_folders(folder_paths=docs_paths) new_paths = [ 'data/markdown/manpages', diff --git a/backend/tests/test_build_docs.py b/backend/tests/test_build_docs.py index 1cf500d..a5480a8 100644 --- a/backend/tests/test_build_docs.py +++ b/backend/tests/test_build_docs.py @@ -1,15 +1,21 @@ import os import sys import logging +from dotenv import load_dotenv -# TODO: Fix this using pip install -e . -os.chdir(os.path.join(os.path.dirname(__file__), '..')) +# TODO: Fix this using setup.py/pyproject.toml file in backend dir. +# TODO: Remove E402 from ruff.toml. +backend_dir = os.path.join(os.path.dirname(__file__), '..') sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +load_dotenv() from build_docs import ( purge_folders, get_yosys_rtdocs, - get_opensta_docs + get_opensta_docs, + clone_repo, + build_or_docs, + build_orfs_docs, ) @@ -35,6 +41,7 @@ def test_setup(): def test_purge_folders(): + os.chdir(backend_dir) lst = ['test1', 'test2'] purge_folders(lst) @@ -44,6 +51,7 @@ def test_purge_folders(): def test_get_yosys_rtdocs(): + os.chdir(backend_dir) yosys_version='0.36' yosys_docs_count=283 get_yosys_rtdocs() @@ -54,10 +62,54 @@ def test_get_yosys_rtdocs(): def test_get_opensta_docs(): + os.chdir(backend_dir) get_opensta_docs() assert os.path.exists('data/pdf/OpenSTA/OpenSTA_docs.pdf') +def test_clone_repo(): + os.chdir(backend_dir) + clone_repo( + url = 'https://github.com/octocat/Hello-World.git', + commit_hash='7fd1a60b01f91b314f59955a4e4d4e80d8edf11d', + folder_name = 'Hello-World', + ) + assert os.path.exists('README') + + +def test_build_or_docs(): + os.chdir(backend_dir) + or_docs_count = 55 + + clone_repo( + url='https://github.com/The-OpenROAD-Project/OpenROAD.git', + commit_hash=os.getenv('OR_REPO_COMMIT', 'ffc5760f2df639cd184c40ceba253c7e02a006d5'), + folder_name='OpenROAD', + ) + build_or_docs() + count = sum(len(files) for _, _, files in os.walk('data/markdown/OR_docs')) + assert count == or_docs_count, f"Expected {or_docs_count} files, got {count}" + + +def test_build_orfs_docs(): + os.chdir(backend_dir) + orfs_docs_count = 27 + + clone_repo( + url='https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts.git', + commit_hash=os.getenv('ORFS_REPO_COMMIT', 'b94834df01cb58915bc0e8dabf85a314fbd8fb9e'), + folder_name='OpenROAD-flow-scripts', + ) + build_orfs_docs() + count = sum(len(files) for _, _, files in os.walk('data/markdown/ORFS_docs')) + logging.info(count) + assert count == orfs_docs_count, f"Expected {orfs_docs_count} files, got {count}" + + def test_teardown(): + os.chdir(backend_dir) logger.info('Cleaning up...') - purge_folders(docs_paths) \ No newline at end of file + purge_folders(docs_paths) + purge_folders(['Hello-World']) + purge_folders(['OpenROAD']) + purge_folders(['OpenROAD-flow-scripts']) \ No newline at end of file From 1aeb3b2a7099e44279c78f0f9ea1dfa4b90e92d6 Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Sat, 10 Aug 2024 18:14:10 +0000 Subject: [PATCH 3/4] Fix mypy Signed-off-by: Jack Luar <39641663+luarss@users.noreply.github.com> --- mypy.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mypy.ini b/mypy.ini index 5917172..896a40f 100644 --- a/mypy.ini +++ b/mypy.ini @@ -3,6 +3,10 @@ warn_return_any = True warn_unused_configs = True ignore_missing_imports = True disable_error_code = call-arg +exclude = ^tests/ + +[mypy-tests.*] +ignore_errors = True [mypy-transformers.*] ignore_missing_imports = True From a9cc748fa1a7256828eb9c0facc3eabb9d9eb8be Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Sat, 10 Aug 2024 18:28:54 +0000 Subject: [PATCH 4/4] fix mypy no more strict Signed-off-by: Jack Luar <39641663+luarss@users.noreply.github.com> --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 446d813..c8ac36e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: pip install -r backend/requirements-test.txt - name: Run MyPy run: | - python -m mypy --strict backend + python -m mypy backend - name: Run pre-commit run: | pre-commit run --files backend/* @@ -45,7 +45,7 @@ jobs: pip install -r frontend/requirements-test.txt - name: Run MyPy run: | - python -m mypy --strict frontend + python -m mypy frontend - name: Run pre-commit run: | pre-commit run --files frontend/*