From 006fe7e5b635d778099ff0ba97b30bf8e62c5697 Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Thu, 17 Jul 2025 16:16:29 -0230 Subject: [PATCH 01/11] full type annotations on untyped defs --- framalytics/FRAM_Visualizer.py | 6 +-- framalytics/tests/test_fram.py | 44 +++++++++++---------- framalytics/tests/test_xfmv_parser.py | 57 ++++++++++++++------------- 3 files changed, 56 insertions(+), 51 deletions(-) diff --git a/framalytics/FRAM_Visualizer.py b/framalytics/FRAM_Visualizer.py index ae8a487..99baf1a 100644 --- a/framalytics/FRAM_Visualizer.py +++ b/framalytics/FRAM_Visualizer.py @@ -47,7 +47,7 @@ def _hex_to_color(self, def _draw_function_nodes(self, function_data: pd.DataFrame, connection_data: pd.DataFrame, - ax: Axes): + ax: Axes) -> None: """ Draw FRAM functions onto a Matplotlib axes. @@ -122,7 +122,7 @@ def _draw_function_nodes(self, def _draw_aspects(self, node_x_coords: pd.Series | list, node_y_coords: pd.Series | list, - ax: Axes): + ax: Axes) -> None: """ Draw the six aspects around each function. @@ -234,7 +234,7 @@ def _draw_bezier_curves(self, connection_data: pd.DataFrame, ax: Axes, real_connections: dict | None = None, - appearance: str | None = None): + appearance: str | None = None) -> None: """ Draw connections between functions. diff --git a/framalytics/tests/test_fram.py b/framalytics/tests/test_fram.py index ec4c893..60588f7 100644 --- a/framalytics/tests/test_fram.py +++ b/framalytics/tests/test_fram.py @@ -7,32 +7,32 @@ @pytest.fixture -def simple_xfmv(): +def simple_xfmv() -> str: file = Path(__file__).parent / 'resources/simple_fram.xfmv' return str(file) @pytest.fixture -def fram(simple_xfmv): +def fram(simple_xfmv: str) -> framalytics.FRAM: return framalytics.FRAM(simple_xfmv) -def test_number_of_connections(fram): +def test_number_of_connections(fram: framalytics.FRAM) -> None: assert fram.number_of_connections() == 8 -def test_number_of_functions(fram): +def test_number_of_functions(fram: framalytics.FRAM) -> None: assert fram.number_of_functions() == 6 -def test_get_functions(fram): +def test_get_functions(fram: framalytics.FRAM) -> None: functions = {0: 'Function A', 1: 'Function B', 2: 'Function C', 3: 'Function D', 4: 'Function E', 5: 'Function F'} assert fram.get_functions() == functions -def test_get_connections(fram): +def test_get_connections(fram: framalytics.FRAM) -> None: expected_names = ['Connection CB', 'Connection BA', 'Connection BD', 'Connection CD', 'Connection CE', 'Connection AB', 'Connection FE', 'Connection DE'] @@ -47,29 +47,29 @@ def test_get_connections(fram): assert set(connections.Name) == set(expected_names) - expected_fromFns = expected_connections[['Name', 'fromFn']] - expected_fromFns = expected_fromFns.set_index('Name')['fromFn'].to_dict() - fromFns = connections[['Name', 'fromFn']] - fromFns = fromFns.set_index('Name')['fromFn'].to_dict() + tmp = expected_connections[['Name', 'fromFn']] + expected_fromFns = tmp.set_index('Name')['fromFn'].to_dict() + tmp = connections[['Name', 'fromFn']] + fromFns = tmp.set_index('Name')['fromFn'].to_dict() assert fromFns == expected_fromFns - expected_toFns = expected_connections[['Name', 'toFn']] - expected_toFns = expected_toFns.set_index('Name')['toFn'].to_dict() - toFns = connections[['Name', 'toFn']] - toFns = toFns.set_index('Name')['toFn'].to_dict() + tmp = expected_connections[['Name', 'toFn']] + expected_toFns = tmp.set_index('Name')['toFn'].to_dict() + tmp = connections[['Name', 'toFn']] + toFns = tmp.set_index('Name')['toFn'].to_dict() assert toFns == expected_toFns - expected_aspects = expected_connections[['Name', 'toAspect']] - expected_aspects = expected_aspects.set_index('Name')['toAspect'].to_dict() - aspects = connections[['Name', 'toAspect']] - aspects = aspects.set_index('Name')['toAspect'].to_dict() + tmp = expected_connections[['Name', 'toAspect']] + expected_aspects = tmp.set_index('Name')['toAspect'].to_dict() + tmp = connections[['Name', 'toAspect']] + aspects = tmp.set_index('Name')['toAspect'].to_dict() assert aspects == expected_aspects -def test_get_function_name(fram): +def test_get_function_name(fram: framalytics.FRAM) -> None: assert fram.get_function_name(0) == 'Function A' assert fram.get_function_name(1) == 'Function B' assert fram.get_function_name(2) == 'Function C' @@ -78,7 +78,7 @@ def test_get_function_name(fram): assert fram.get_function_name(5) == 'Function F' -def test_get_function_id(fram): +def test_get_function_id(fram: framalytics.FRAM) -> None: assert fram.get_function_id('Function A') == 0 assert fram.get_function_id('Function B') == 1 assert fram.get_function_id('Function C') == 2 @@ -94,7 +94,9 @@ def test_get_function_id(fram): ('C', 'get_function_controls'), ('P', 'get_function_preconditions'), ('R', 'get_function_resources')]) -def test_get_connection_sources(fram, aspect, get_function): +def test_get_connection_sources(fram: framalytics.FRAM, + aspect: str, + get_function: str) -> None: """ get_function_* correctly return the functions connected to each aspect. diff --git a/framalytics/tests/test_xfmv_parser.py b/framalytics/tests/test_xfmv_parser.py index 759d7a2..7bb0846 100644 --- a/framalytics/tests/test_xfmv_parser.py +++ b/framalytics/tests/test_xfmv_parser.py @@ -13,11 +13,11 @@ def simple_xfmv(): @pytest.fixture() -def parsed_xfmv(simple_xfmv): +def parsed_xfmv(simple_xfmv: str) -> tuple[pd.DataFrame, pd.DataFrame]: return parse_xfmv(simple_xfmv) -def test_return_types(parsed_xfmv): +def test_return_types(parsed_xfmv: tuple[pd.DataFrame, pd.DataFrame]) -> None: """ Parsing xfmv should return 3 DataFrames. """ functions, connections = parsed_xfmv @@ -26,7 +26,7 @@ def test_return_types(parsed_xfmv): assert isinstance(connections, pd.DataFrame) -def test_function_data(parsed_xfmv): +def test_function_data(parsed_xfmv: tuple[pd.DataFrame, pd.DataFrame]) -> None: """ Test that function names, ids and types were parsed correctly. """ functions, connections = parsed_xfmv @@ -41,18 +41,19 @@ def test_function_data(parsed_xfmv): assert len(functions) == 6 assert set(functions.IDName.unique()) == set(expected_names) - ids = functions[['IDName', 'IDNr']] - ids = ids.set_index('IDName')['IDNr'].to_dict() + tmp = functions[['IDName', 'IDNr']] + ids = tmp.set_index('IDName')['IDNr'].to_dict() assert ids == expected_ids - types = functions[['IDName', 'FunctionType']] - types = types.set_index('IDName')['FunctionType'].to_dict() + tmp = functions[['IDName', 'FunctionType']] + types = tmp.set_index('IDName')['FunctionType'].to_dict() assert types == expected_types -def test_function_positions(parsed_xfmv): +def test_function_positions(parsed_xfmv: tuple[pd.DataFrame, + pd.DataFrame]) -> None: """ Test that function positions were parsed correctly. """ functions, connections = parsed_xfmv @@ -82,7 +83,8 @@ def test_function_positions(parsed_xfmv): assert y == pytest.approx(186.66, abs=1e-2) -def test_connection_raw_name(parsed_xfmv): +def test_connection_raw_name(parsed_xfmv: tuple[pd.DataFrame, + pd.DataFrame]) -> None: """ Test that the raw connection name was parsed correctly. """ functions, connections = parsed_xfmv @@ -93,10 +95,11 @@ def test_connection_raw_name(parsed_xfmv): '5|Connection FE|4|R', '3|Connection DE|4|P'] assert len(connections) == 8 - assert set(connections.Name.unique()) == set(connection_raw_names) + assert set(connections['Name'].unique()) == set(connection_raw_names) -def test_connection_names(parsed_xfmv): +def test_connection_names(parsed_xfmv: tuple[pd.DataFrame, + pd.DataFrame]) -> None: """ Test that connection data was parsed correctly. """ functions, connections = parsed_xfmv @@ -118,30 +121,30 @@ def test_connection_names(parsed_xfmv): 'outputFn': connection_outputFns, 'toFn': connection_toFns}) - expected_names = connection_data[['Name', 'parsed_name']] - expected_names = expected_names.set_index('Name')['parsed_name'].to_dict() - names = connections[['Name', 'parsed_name']] - names = names.set_index('Name')['parsed_name'].to_dict() + tmp = connection_data[['Name', 'parsed_name']] + expected_names = tmp.set_index('Name')['parsed_name'].to_dict() + tmp = connections[['Name', 'parsed_name']] + names = tmp.set_index('Name')['parsed_name'].to_dict() assert names == expected_names - expected_aspects = connection_data[['Name', 'toAspect']] - expected_aspects = expected_aspects.set_index('Name')['toAspect'].to_dict() - aspects = connections[['Name', 'toAspect']] - aspects = aspects.set_index('Name')['toAspect'].to_dict() + tmp = connection_data[['Name', 'toAspect']] + expected_aspects = tmp.set_index('Name')['toAspect'].to_dict() + tmp = connections[['Name', 'toAspect']] + aspects = tmp.set_index('Name')['toAspect'].to_dict() assert aspects == expected_aspects - expected_outputs = connection_data[['Name', 'outputFn']] - expected_outputs = expected_outputs.set_index('Name')['outputFn'].to_dict() - outputs = connections[['Name', 'outputFn']] - outputs = outputs.set_index('Name')['outputFn'].to_dict() + tmp = connection_data[['Name', 'outputFn']] + expected_outputs = tmp.set_index('Name')['outputFn'].to_dict() + tmp = connections[['Name', 'outputFn']] + outputs = tmp.set_index('Name')['outputFn'].to_dict() assert outputs == expected_outputs - expected_toFns = connection_data[['Name', 'toFn']] - expected_toFns = expected_toFns.set_index('Name')['toFn'].to_dict() - toFns = connections[['Name', 'toFn']] - toFns = toFns.set_index('Name')['toFn'].to_dict() + tpm = connection_data[['Name', 'toFn']] + expected_toFns = tmp.set_index('Name')['toFn'].to_dict() + tmp = connections[['Name', 'toFn']] + toFns = tmp.set_index('Name')['toFn'].to_dict() assert toFns == expected_toFns From a71987e94bfecb7ad1350e444ff17fc82e40e7f0 Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 09:48:36 -0230 Subject: [PATCH 02/11] add linter reqs --- .github/workflows/lint.yaml | 1 + framalytics/tests/test_xfmv_parser.py | 2 +- requirements-dev.txt | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 requirements-dev.txt diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 38ac2cb..12b00c7 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -36,6 +36,7 @@ jobs: env: # To report GitHub Actions status checks GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYTHON_PIP_REQUIREMENTS: requirements-dev.txt VALIDATE_ALL_CODEBASE: false VALIDATE_PYTHON_FLAKE8: true VALIDATE_PYTHON_MYPY: true diff --git a/framalytics/tests/test_xfmv_parser.py b/framalytics/tests/test_xfmv_parser.py index 7bb0846..daceb42 100644 --- a/framalytics/tests/test_xfmv_parser.py +++ b/framalytics/tests/test_xfmv_parser.py @@ -142,7 +142,7 @@ def test_connection_names(parsed_xfmv: tuple[pd.DataFrame, assert outputs == expected_outputs - tpm = connection_data[['Name', 'toFn']] + tmp = connection_data[['Name', 'toFn']] expected_toFns = tmp.set_index('Name')['toFn'].to_dict() tmp = connections[['Name', 'toFn']] toFns = tmp.set_index('Name')['toFn'].to_dict() diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..f9bc4ef --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,5 @@ +-r requirements.txt +pytest +pandas-stubs +mypy +flake8 \ No newline at end of file From fc0801185ed11dae0c1648bee32f3956aea22ace Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 09:56:08 -0230 Subject: [PATCH 03/11] superlinter to v8 --- .github/workflows/lint.yaml | 2 +- framalytics/tests/test_xfmv_parser.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 12b00c7..e7d0a91 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -32,7 +32,7 @@ jobs: fetch-depth: 0 - name: Super-linter - uses: super-linter/super-linter@v7.1.0 # x-release-please-version + uses: super-linter/super-linter@v8.0.0 # x-release-please-version env: # To report GitHub Actions status checks GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/framalytics/tests/test_xfmv_parser.py b/framalytics/tests/test_xfmv_parser.py index daceb42..c438023 100644 --- a/framalytics/tests/test_xfmv_parser.py +++ b/framalytics/tests/test_xfmv_parser.py @@ -7,7 +7,7 @@ @pytest.fixture -def simple_xfmv(): +def simple_xfmv() -> str: file = Path(__file__).parent / 'resources/simple_fram.xfmv' return str(file) From 903e694a703b88912baca8d4fc88dcb8412f177b Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 12:24:31 -0230 Subject: [PATCH 04/11] debug lint action --- .github/workflows/lint.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index e7d0a91..11beb89 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -40,3 +40,4 @@ jobs: VALIDATE_ALL_CODEBASE: false VALIDATE_PYTHON_FLAKE8: true VALIDATE_PYTHON_MYPY: true + LOG_LEVEL: DEBUG From 1f6bc061e98e088e6e099a8a9dba2ba5a137d1cd Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 12:32:31 -0230 Subject: [PATCH 05/11] debug lint action again --- .github/workflows/lint.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 11beb89..9be381d 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -36,8 +36,8 @@ jobs: env: # To report GitHub Actions status checks GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PYTHON_PIP_REQUIREMENTS: requirements-dev.txt + PYTHON_PIP_INSTALL: > + pytest matplotlib VALIDATE_ALL_CODEBASE: false VALIDATE_PYTHON_FLAKE8: true VALIDATE_PYTHON_MYPY: true - LOG_LEVEL: DEBUG From 760145d241ac6e969b2aeac1f1560e2136e66bb1 Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 12:37:18 -0230 Subject: [PATCH 06/11] debug lint action again and again --- .github/workflows/lint.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 9be381d..b227d7a 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -36,7 +36,7 @@ jobs: env: # To report GitHub Actions status checks GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PYTHON_PIP_INSTALL: > + PYTHON_MYPY_PIP_INSTALL: > pytest matplotlib VALIDATE_ALL_CODEBASE: false VALIDATE_PYTHON_FLAKE8: true From c67941986ce1e4489d68a9df044432a61729c24f Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 12:49:40 -0230 Subject: [PATCH 07/11] groundhog day --- .github/workflows/lint.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index b227d7a..675a9e1 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -36,8 +36,7 @@ jobs: env: # To report GitHub Actions status checks GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PYTHON_MYPY_PIP_INSTALL: > - pytest matplotlib + PYTHON_MYPY_PIP_REQUIREMENTS: requirements-dev.txt VALIDATE_ALL_CODEBASE: false VALIDATE_PYTHON_FLAKE8: true VALIDATE_PYTHON_MYPY: true From 8e5f40ceccd7c6c0657970ef988ec3ecf09099cd Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 16:23:35 -0230 Subject: [PATCH 08/11] abandon superlinter --- .github/workflows/lint.yaml | 39 +++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 675a9e1..bd43470 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -13,7 +13,7 @@ on: # yamllint disable-line rule:truthy permissions: { } jobs: - build: + lint: name: Lint runs-on: ubuntu-latest @@ -27,16 +27,31 @@ jobs: - name: Checkout code uses: actions/checkout@v4 with: - # super-linter needs the full git history to get the - # list of files that changed across commits fetch-depth: 0 - - name: Super-linter - uses: super-linter/super-linter@v8.0.0 # x-release-please-version - env: - # To report GitHub Actions status checks - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PYTHON_MYPY_PIP_REQUIREMENTS: requirements-dev.txt - VALIDATE_ALL_CODEBASE: false - VALIDATE_PYTHON_FLAKE8: true - VALIDATE_PYTHON_MYPY: true + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + # Optional but recommended cache for faster runs + - name: Cache pip + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('requirements-dev.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dev dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -r requirements-dev.txt + + - name: flake8 + run: | + flake8 --config .github/linters/.flake8 framalytics/ + + - name: mypy + run: | + mypy --config-file .github/linters/.mypy.ini framalytics/ \ No newline at end of file From 218e3331a3b3fa539af920ad6415916c38099918 Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 8 Aug 2025 16:26:16 -0230 Subject: [PATCH 09/11] test new linter --- .github/workflows/lint.yaml | 2 ++ framalytics/tests/test_xfmv_parser.py | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index bd43470..8e47e0f 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -50,8 +50,10 @@ jobs: - name: flake8 run: | + flake8 --version flake8 --config .github/linters/.flake8 framalytics/ - name: mypy run: | + mypy --version mypy --config-file .github/linters/.mypy.ini framalytics/ \ No newline at end of file diff --git a/framalytics/tests/test_xfmv_parser.py b/framalytics/tests/test_xfmv_parser.py index c438023..3121de4 100644 --- a/framalytics/tests/test_xfmv_parser.py +++ b/framalytics/tests/test_xfmv_parser.py @@ -5,9 +5,8 @@ from framalytics.xfmv_parser import parse_xfmv - @pytest.fixture -def simple_xfmv() -> str: +def simple_xfmv(): file = Path(__file__).parent / 'resources/simple_fram.xfmv' return str(file) From b373387b6eddc024c46bb54140f582dda72bcdeb Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 26 Sep 2025 13:32:31 -0230 Subject: [PATCH 10/11] revert back to superlinter --- .github/linters/.mypy.ini | 8 +++++- .github/workflows/lint.yaml | 36 ++++++--------------------- framalytics/tests/test_xfmv_parser.py | 2 +- requirements-dev.txt | 5 ---- 4 files changed, 16 insertions(+), 35 deletions(-) delete mode 100644 requirements-dev.txt diff --git a/.github/linters/.mypy.ini b/.github/linters/.mypy.ini index 0694052..e2273bb 100644 --- a/.github/linters/.mypy.ini +++ b/.github/linters/.mypy.ini @@ -1,3 +1,9 @@ [mypy] python_version = 3.10 -disallow_untyped_defs = True \ No newline at end of file +disallow_untyped_defs = True + +[mypy-pytest.*] +ignore_missing_imports = True + +[mypy-matplotlib.*] +ignore_missing_imports = True \ No newline at end of file diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 8e47e0f..3890767 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -29,31 +29,11 @@ jobs: with: fetch-depth: 0 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - - # Optional but recommended cache for faster runs - - name: Cache pip - uses: actions/cache@v4 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('requirements-dev.txt') }} - restore-keys: | - ${{ runner.os }}-pip- - - - name: Install dev dependencies - run: | - python -m pip install --upgrade pip - python -m pip install -r requirements-dev.txt - - - name: flake8 - run: | - flake8 --version - flake8 --config .github/linters/.flake8 framalytics/ - - - name: mypy - run: | - mypy --version - mypy --config-file .github/linters/.mypy.ini framalytics/ \ No newline at end of file + - name: Super-linter + uses: super-linter/super-linter@v7.1.0 # x-release-please-version + env: + # To report GitHub Actions status checks + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VALIDATE_ALL_CODEBASE: false + VALIDATE_PYTHON_FLAKE8: true + VALIDATE_PYTHON_MYPY: true \ No newline at end of file diff --git a/framalytics/tests/test_xfmv_parser.py b/framalytics/tests/test_xfmv_parser.py index 3121de4..3efd05e 100644 --- a/framalytics/tests/test_xfmv_parser.py +++ b/framalytics/tests/test_xfmv_parser.py @@ -6,7 +6,7 @@ from framalytics.xfmv_parser import parse_xfmv @pytest.fixture -def simple_xfmv(): +def simple_xfmv() -> str: file = Path(__file__).parent / 'resources/simple_fram.xfmv' return str(file) diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index f9bc4ef..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,5 +0,0 @@ --r requirements.txt -pytest -pandas-stubs -mypy -flake8 \ No newline at end of file From 3a225ad2f4ab77d5ea222008a426d414e6b42c0d Mon Sep 17 00:00:00 2001 From: Terrence Tricco Date: Fri, 26 Sep 2025 13:35:20 -0230 Subject: [PATCH 11/11] fix flake8 error --- framalytics/tests/test_xfmv_parser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/framalytics/tests/test_xfmv_parser.py b/framalytics/tests/test_xfmv_parser.py index 3efd05e..c438023 100644 --- a/framalytics/tests/test_xfmv_parser.py +++ b/framalytics/tests/test_xfmv_parser.py @@ -5,6 +5,7 @@ from framalytics.xfmv_parser import parse_xfmv + @pytest.fixture def simple_xfmv() -> str: file = Path(__file__).parent / 'resources/simple_fram.xfmv'