diff --git a/.chasten/checks.yml b/.chasten/checks.yml index 9b4a4ba4..7394f743 100644 --- a/.chasten/checks.yml +++ b/.chasten/checks.yml @@ -5,32 +5,32 @@ checks: pattern: './/ClassDef' count: min: 1 - max: 50 + max: null - name: "all-function-definition" code: "AFD" id: "F001" pattern: './/FunctionDef' count: min: 1 - max: 200 - - name: "non-test-function-definition" + max: null + - name: "dummy-test-non-test-function-definition" code: "NTF" id: "F002" pattern: './/FunctionDef[not(contains(@name, "test_"))]' count: - min: 40 - max: 1000 - - name: "single-nested-if" + min: null + max: null + - name: "dummy-test-single-nested-if" code: "SNI" id: "CL001" pattern: './/FunctionDef/body//If' count: - min: 1 - max: 100 - - name: "double-nested-if" + min: null + max: null + - name: "dummy-test-double-nested-if" code: "DNI" id: "CL002" pattern: './/FunctionDef/body//If[ancestor::If and not(parent::orelse)]' count: - min: 1 - max: 15 \ No newline at end of file + min: null + max: null diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ae3fe94b..bc076a47 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,8 @@ on: # This job performs all necessary checks jobs: build: - # Use the latest version of Ubuntu on MacOS and Windows + # Use the latest version of Ubuntu, MacOS, and Windows + # Use the latest and most stable version of Python runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -53,7 +54,7 @@ jobs: - name: Install Pip if: always() run: | - pip install -U pip + python -m pip install --upgrade pip # Install poetry - name: Install Poetry if: always() @@ -75,7 +76,6 @@ jobs: if: always() run: | poetry run chasten analyze chasten --config $PWD/.chasten/ --debug-level ERROR --debug-dest CONSOLE --search-path . - # Run the tests - name: Run Tests if: always() @@ -95,16 +95,3 @@ jobs: echo "### Total coverage: ${TOTAL}%" >> $GITHUB_STEP_SUMMARY CURRENT_GITHUB_STEP_SUMMARY="\`\`\`\n$(cat coverage.txt)\n\`\`\`" echo "$CURRENT_GITHUB_STEP_SUMMARY" >> $GITHUB_STEP_SUMMARY - # Create the Coverage Badge - - name: Make Badge - uses: schneegans/dynamic-badges-action@v1.6.0 - with: - # GIST_TOKEN is a GitHub personal access token with scope "gist". - auth: ${{ secrets.GIST_TOKEN }} - gistID: 5300aa276fa9261b2b21b96c3141b3ad - filename: covbadge.json - label: Coverage - message: ${{ env.total }}% - minColorRange: 50 - maxColorRange: 90 - valColorRange: ${{ env.total }} \ No newline at end of file diff --git a/chasten/checks.py b/chasten/checks.py index 4b3e5de0..6e1d2b54 100644 --- a/chasten/checks.py +++ b/chasten/checks.py @@ -81,13 +81,13 @@ def check_match_count( if min_value is not None and max_value is not None: return is_in_closed_interval(count, min_value, max_value) # at this point, only one of the values might not be None - # if min_value is not None, then confirm that it is less than or equal + # if min_value is not None, then confirm that it is greater than or equal if min_value is not None: - if count <= min_value: + if count >= min_value: return True - # if max_value is not None, then confirm that it is greater than or equal + # if max_value is not None, then confirm that it is less than or equal if max_value is not None: - if count >= max_value: + if count <= max_value: return True # if none of those conditions were true, then the count is not # between the minimum and the maximum value, inclusively diff --git a/chasten/results.py b/chasten/results.py index fd6eecad..d56b9101 100644 --- a/chasten/results.py +++ b/chasten/results.py @@ -3,10 +3,11 @@ import uuid from datetime import datetime from pathlib import Path -from typing import List, Union +from typing import List, Optional, Union from pyastgrep import search as pyastgrepsearch # type: ignore from pydantic import BaseModel +from pydantic.types import conint from chasten import debug @@ -67,8 +68,8 @@ class Check(BaseModel): id: str name: str description: str = "" - min: Union[None, int] = 0 - max: Union[None, int] = 0 + min: Optional[conint(ge=0)] = 0 # type: ignore + max: Optional[conint(ge=0)] = 0 # type: ignore pattern: str passed: bool matches: list[Match] = [] diff --git a/chasten/validate.py b/chasten/validate.py index f393df64..41f4d739 100644 --- a/chasten/validate.py +++ b/chasten/validate.py @@ -48,19 +48,43 @@ "anyOf": [ { "type": "object", - "properties": {"min": {"type": "integer"}}, + "properties": { + "min": { + "anyOf": [ + {"type": "integer"}, + {"type": "null"}, + ] + } + }, "required": ["min"], }, { "type": "object", - "properties": {"max": {"type": "integer"}}, + "properties": { + "max": { + "anyOf": [ + {"type": "integer"}, + {"type": "null"}, + ] + } + }, "required": ["max"], }, { "type": "object", "properties": { - "min": {"type": "integer"}, - "max": {"type": "integer"}, + "min": { + "anyOf": [ + {"type": "integer"}, + {"type": "null"}, + ] + }, + "max": { + "anyOf": [ + {"type": "integer"}, + {"type": "null"}, + ] + }, }, "required": ["min", "max"], }, diff --git a/tests/test_constants.py b/tests/test_constants.py index d86f2c42..b914e588 100644 --- a/tests/test_constants.py +++ b/tests/test_constants.py @@ -1,6 +1,7 @@ """Pytest test suite for the constants module.""" from dataclasses import FrozenInstanceError +from pathlib import Path import pytest from hypothesis import given, strategies @@ -44,7 +45,7 @@ def test_fuzz_init(directory, configfile, checksfile, extra, yes, no): # noqa: def test_fuzz_immutable(fs, hr): """Use Hypothesis to confirm that attribute's value cannot be re-assigned.""" with pytest.raises(FrozenInstanceError): - fs.Current_Directory = "/new/path" + fs.Current_Directory = str(Path("/new") / Path("path")) with pytest.raises(FrozenInstanceError): hr.Yes = "YES" with pytest.raises(FrozenInstanceError): diff --git a/tests/test_filesystem.py b/tests/test_filesystem.py index 691e81e1..ac3289f3 100644 --- a/tests/test_filesystem.py +++ b/tests/test_filesystem.py @@ -1,6 +1,7 @@ """Pytest test suite for the filesystem module.""" import pathlib +from pathlib import Path from unittest.mock import patch import pytest @@ -12,7 +13,7 @@ def test_valid_directory() -> None: """Confirm that a valid directory is found.""" - directory_str = "./tests/" + directory_str = str(Path("./tests/")) directory = pathlib.Path(directory_str) confirmation = filesystem.confirm_valid_directory(directory) assert confirmation is True @@ -20,7 +21,7 @@ def test_valid_directory() -> None: def test_invalid_directory() -> None: """Confirm that a valid directory is found.""" - directory_str = "./testsNOT/" + directory_str = str(Path("./testsNOT/")) directory = pathlib.Path(directory_str) confirmation = filesystem.confirm_valid_directory(directory) assert confirmation is False @@ -28,7 +29,7 @@ def test_invalid_directory() -> None: def test_valid_file() -> None: """Confirm that a valid directory is found.""" - file_str = "./tests/test_filesystem.py" + file_str = str(Path("./tests") / Path("test_filesystem.py")) this_file = pathlib.Path(file_str) confirmation = filesystem.confirm_valid_file(this_file) assert confirmation is True @@ -36,7 +37,7 @@ def test_valid_file() -> None: def test_invalid_file() -> None: """Confirm that a valid directory is found.""" - file_str = "./tests/test_filesystemNOT.py" + file_str = str(Path("./tests") / Path("test_filesystemNOT.py.py")) this_file_not = pathlib.Path(file_str) confirmation = filesystem.confirm_valid_file(this_file_not) assert confirmation is False diff --git a/tests/test_main.py b/tests/test_main.py index 17504aae..0b0783c0 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -54,7 +54,7 @@ pattern: './/ClassDef' count: min: 1 - max: 10 + max: null - name: "all-function-definition" code: "AFD" id: "F001" @@ -91,7 +91,7 @@ def test_cli_analyze_correct_arguments_nothing_to_analyze_not_looking(tmpdir): project_name = "testing" # create a reference to the internal # .chasten directory that supports testing - configuration_directory = test_one + "/.chasten" + configuration_directory = test_one / Path(".chasten") configuration_directory_path = Path(configuration_directory) configuration_directory_path.mkdir() configuration_file = configuration_directory_path / "config.yml" @@ -122,7 +122,7 @@ def test_cli_analyze_correct_arguments_analyze_chasten_codebase(cwd): project_name = "testing" # create a reference to the internal # .chasten directory that supports testing - configuration_directory = str(cwd) + "/.chasten" + configuration_directory = cwd / Path(".chasten") result = runner.invoke( main.cli, [ @@ -144,7 +144,7 @@ def test_cli_analyze_incorrect_arguments_no_project(cwd, tmpdir): test_one = tmpdir.mkdir("test_one") # create a reference to the internal # .chasten directory that supports testing - configuration_directory = str(cwd) + "/.chasten" + configuration_directory = cwd / Path(".chasten") # call the analyze command result = runner.invoke( main.cli, @@ -297,7 +297,7 @@ def test_fuzz_cli_analyze_single_directory(cwd, directory): project_name = "testing" # create a reference to the internal # .chasten directory that supports testing - configuration_directory = str(cwd) + "/.chasten" + configuration_directory = cwd / Path(".chasten") result = runner.invoke( main.cli, [