From 90f21dc4623571ce09bbc4be8a011d7eeb97e388 Mon Sep 17 00:00:00 2001 From: Martin Durant Date: Fri, 12 Sep 2025 16:26:24 -0400 Subject: [PATCH 1/3] Add precommit checks --- .github/workflows/pre-commit.yml | 18 ++++++++ .pre-commit-config.yaml | 79 ++++++++++++++++++++++---------- 2 files changed, 72 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/pre-commit.yml diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..112ff58 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,18 @@ +name: Linting + +on: + push: + branches: main + pull_request: + branches: main + +jobs: + checks: + name: pre-commit hooks + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + with: + python-version: '3.11' + - uses: pre-commit/action@v3.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 39640d0..c01c820 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,27 +1,56 @@ -exclude: > - (?x)^( - \.tox/.* - )$ repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-docstring-first - - id: check-json - - id: check-yaml - - repo: https://github.com/astral-sh/ruff-pre-commit - # Ruff version. - rev: v0.9.2 - hooks: - # Run the linter. - - id: ruff - args: [ --fix, "--show-fixes"] - - id: ruff-format - types_or: [python] - - repo: https://github.com/codespell-project/codespell - rev: v2.4.0 - hooks: - - id: codespell +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-yaml + - id: debug-statements + - id: end-of-file-fixer + - id: mixed-line-ending + - id: trailing-whitespace + +- repo: https://github.com/psf/black + rev: 23.11.0 + hooks: + - id: black + language_version: python3 + args: + - --target-version=py38 + +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.6 + hooks: + - id: ruff + +- repo: https://github.com/PyCQA/isort + rev: 5.12.0 + hooks: + - id: isort + language_version: python3 + +- repo: https://github.com/asottile/pyupgrade + rev: v3.15.0 + hooks: + - id: pyupgrade + args: + - --py38-plus + +- repo: https://github.com/MarcoGorelli/absolufy-imports + rev: v0.3.1 + hooks: + - id: absolufy-imports + +- repo: https://github.com/asottile/yesqa + rev: v1.5.0 + hooks: + - id: yesqa + +- repo: https://github.com/adamchainz/blacken-docs + rev: 1.16.0 + hooks: + - id: blacken-docs + additional_dependencies: + - black From e9d9b6b106013d10768150b125b1cca88d4920da Mon Sep 17 00:00:00 2001 From: Martin Durant Date: Fri, 12 Sep 2025 16:38:24 -0400 Subject: [PATCH 2/3] install pre-commit ci --- .pre-commit-config.yaml | 18 ------------------ docs/source/quickstart.rst | 4 ++-- pyproject.toml | 2 -- src/projspec/__init__.py | 4 ++-- src/projspec/__main__.py | 4 +--- src/projspec/artifact/__init__.py | 2 +- src/projspec/artifact/base.py | 4 +--- src/projspec/content/__init__.py | 2 +- src/projspec/html.py | 4 +--- src/projspec/proj/__init__.py | 22 +++++++++++----------- src/projspec/proj/base.py | 10 ++-------- src/projspec/proj/conda_package.py | 18 ++++-------------- src/projspec/proj/conda_project.py | 6 +----- src/projspec/proj/documentation.py | 12 +++--------- src/projspec/proj/git.py | 12 +++--------- src/projspec/proj/pixi.py | 19 +++++-------------- src/projspec/proj/poetry.py | 4 +--- src/projspec/proj/pyscript.py | 4 +--- src/projspec/proj/python_code.py | 18 ++++-------------- src/projspec/proj/uv.py | 8 ++------ src/projspec/utils.py | 21 ++++++++------------- tests/test_utils.py | 7 +------ 22 files changed, 55 insertions(+), 150 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c01c820..1a3b8d0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,24 +20,6 @@ repos: args: - --target-version=py38 -- repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.6 - hooks: - - id: ruff - -- repo: https://github.com/PyCQA/isort - rev: 5.12.0 - hooks: - - id: isort - language_version: python3 - -- repo: https://github.com/asottile/pyupgrade - rev: v3.15.0 - hooks: - - id: pyupgrade - args: - - --py38-plus - - repo: https://github.com/MarcoGorelli/absolufy-imports rev: v0.3.1 hooks: diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index d0565f1..39537f9 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -52,7 +52,7 @@ is display it, which is also the main functionality of the CLI, above. Extra functionality in python code includes the ability to examine the internals of a Project; here is a simple example, run in the projspec's repo root: -.. code-block:: python +.. code-block:: >>> import projspec >>> proj = projspec.Project(".") @@ -64,7 +64,7 @@ the answer is yes. To execute an action on a project, one might do something like -.. code-block:: python +.. code-block:: >>> proj.uv.artifacts.wheel.make() diff --git a/pyproject.toml b/pyproject.toml index 7631462..0e63cec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,7 +73,6 @@ select = [ "PLC", "PLE", "PLR1722", - "PLR1736", "PLW1501", "PLW1510", "PLW3301", @@ -85,7 +84,6 @@ select = [ "PYI", "RUF006", "RUF015", - "RUF024", "SIM", "SLOT", "SIM101", diff --git a/src/projspec/__init__.py b/src/projspec/__init__.py index c514783..b533904 100644 --- a/src/projspec/__init__.py +++ b/src/projspec/__init__.py @@ -1,4 +1,4 @@ -from ._version import __version__ # noqa: F401 -from .proj import Project, ProjectSpec +from projspec._version import __version__ # noqa: F401 +from projspec.proj import Project, ProjectSpec __all__ = ["Project", "ProjectSpec"] diff --git a/src/projspec/__main__.py b/src/projspec/__main__.py index 2328795..7568a48 100755 --- a/src/projspec/__main__.py +++ b/src/projspec/__main__.py @@ -17,9 +17,7 @@ help='Type names to scan for (comma-separated list in camel or snake case); defaults to "ALL"', ) @click.argument("path", default=".") -@click.option( - "--walk", is_flag=True, help="To descend into all child directories" -) +@click.option("--walk", is_flag=True, help="To descend into all child directories") @click.option("--summary", is_flag=True, help="Show abbreviated output") @click.option( "--storage_options", diff --git a/src/projspec/artifact/__init__.py b/src/projspec/artifact/__init__.py index cfaa1fd..3cdf995 100644 --- a/src/projspec/artifact/__init__.py +++ b/src/projspec/artifact/__init__.py @@ -1,5 +1,5 @@ """Things that a project can do or make""" -from .base import BaseArtifact, FileArtifact, get_artifact_cls +from projspec.artifact.base import BaseArtifact, FileArtifact, get_artifact_cls __all__ = ["BaseArtifact", "FileArtifact", "get_artifact_cls"] diff --git a/src/projspec/artifact/base.py b/src/projspec/artifact/base.py index eeb5e51..884ceb8 100644 --- a/src/projspec/artifact/base.py +++ b/src/projspec/artifact/base.py @@ -37,9 +37,7 @@ def state(self) -> Literal["clean", "done", "pending"]: def make(self, *args, **kwargs): """Create the artifact and any runtime it depends on""" - if not isinstance( - self.proj.fs, fsspec.implementations.local.LocalFileSystem - ): + if not isinstance(self.proj.fs, fsspec.implementations.local.LocalFileSystem): # Later, will implement download-and-make, although some tools # can already do this themselves. raise RuntimeError("Can't run local command on remote project") diff --git a/src/projspec/content/__init__.py b/src/projspec/content/__init__.py index 0edcb6d..b4f0fb0 100644 --- a/src/projspec/content/__init__.py +++ b/src/projspec/content/__init__.py @@ -1,3 +1,3 @@ -from .base import BaseContent, get_content_cls +from projspec.content.base import BaseContent, get_content_cls __all__ = ["BaseContent", "get_content_cls"] diff --git a/src/projspec/html.py b/src/projspec/html.py index a34b5bf..e18d7c5 100644 --- a/src/projspec/html.py +++ b/src/projspec/html.py @@ -32,9 +32,7 @@ def dict_to_html(data: dict, title="Data", open_level=2) -> str: ) for i, item in enumerate(value): if isinstance(item, dict): - html.append( - dict_to_html(item, f"{key}[{i}]", open_level - 1) - ) + html.append(dict_to_html(item, f"{key}[{i}]", open_level - 1)) else: html.append(f'
{item}
') html.append("") diff --git a/src/projspec/proj/__init__.py b/src/projspec/proj/__init__.py index f88b23d..3ecb2d9 100644 --- a/src/projspec/proj/__init__.py +++ b/src/projspec/proj/__init__.py @@ -1,14 +1,14 @@ -from .base import ParseFailed, Project, ProjectSpec, get_projspec_class -from .conda_package import CondaRecipe, RattlerRecipe -from .conda_project import CondaProject -from .documentation import RTD, MDBook -from .git import GitRepo -from .pixi import Pixi -from .poetry import Poetry -from .pyscript import PyScript -from .python_code import PythonCode, PythonLibrary -from .rust import Rust, RustPython -from .uv import Uv +from projspec.proj.base import ParseFailed, Project, ProjectSpec, get_projspec_class +from projspec.proj.conda_package import CondaRecipe, RattlerRecipe +from projspec.proj.conda_project import CondaProject +from projspec.proj.documentation import RTD, MDBook +from projspec.proj.git import GitRepo +from projspec.proj.pixi import Pixi +from projspec.proj.poetry import Poetry +from projspec.proj.pyscript import PyScript +from projspec.proj.python_code import PythonCode, PythonLibrary +from projspec.proj.rust import Rust, RustPython +from projspec.proj.uv import Uv __all__ = [ "get_projspec_class", diff --git a/src/projspec/proj/base.py b/src/projspec/proj/base.py index 4d64e67..e53a5a9 100644 --- a/src/projspec/proj/base.py +++ b/src/projspec/proj/base.py @@ -193,9 +193,7 @@ def filter_by_type(self, types: Iterable[type]) -> bool: def __contains__(self, item) -> bool: """Is the given project type supported ANYWHERE in this directory?""" - return item in self.specs or any( - item in _ for _ in self.children.values() - ) + return item in self.specs or any(item in _ for _ in self.children.values()) def to_dict(self, compact=True) -> dict: dic = AttrDict( @@ -256,11 +254,7 @@ def __init__(self, proj: Project, subpath: str = ""): @property def path(self) -> str: """Location of this project spec""" - return ( - self.proj.url + "/" + self.subpath - if self.subpath - else self.proj.url - ) + return self.proj.url + "/" + self.subpath if self.subpath else self.proj.url def match(self) -> bool: """Whether the given path might be interpreted as this type of project""" diff --git a/src/projspec/proj/conda_package.py b/src/projspec/proj/conda_package.py index 80c5646..4a770a3 100644 --- a/src/projspec/proj/conda_package.py +++ b/src/projspec/proj/conda_package.py @@ -72,9 +72,7 @@ def parse(self) -> None: from projspec.content.environment import Environment, Precision, Stack if "recipe.yaml" in self.proj.basenames: - with self.proj.fs.open( - self.proj.basenames["recipe.yaml"], "rb" - ) as f: + with self.proj.fs.open(self.proj.basenames["recipe.yaml"], "rb") as f: meta = _yaml_no_jinja(f) elif "meta.yaml" in self.proj.basenames: with self.proj.fs.open(self.proj.basenames["meta.yaml"], "rb") as f: @@ -93,16 +91,11 @@ def parse(self) -> None: name = next( filter( bool, - ( - meta.get(_, {}).get("name") - for _ in ("context", "recipe", "package") - ), + (meta.get(_, {}).get("name") for _ in ("context", "recipe", "package")), ) ) - path = ( - f"{self.proj.url}/output/{name}" if self.proj.is_local() else None - ) + path = f"{self.proj.url}/output/{name}" if self.proj.is_local() else None art = CondaPackage( proj=self.proj, cmd=cmd, @@ -115,10 +108,7 @@ def parse(self) -> None: req = next( filter( bool, - ( - _.get("requirements") - for _ in [meta] + meta.get("outputs", []) - ), + (_.get("requirements") for _ in [meta] + meta.get("outputs", [])), ) ) self._contents = AttrDict( diff --git a/src/projspec/proj/conda_project.py b/src/projspec/proj/conda_project.py index 6f5ef1a..58380d7 100644 --- a/src/projspec/proj/conda_project.py +++ b/src/projspec/proj/conda_project.py @@ -50,11 +50,7 @@ def parse(self) -> None: with self.proj.fs.open(f"{self.proj.url}/{fname}") as f: env = _yaml_no_jinja(f) channels.extend( - [ - _ - for _ in env.get("channels", []) - if _ not in channels - ] + [_ for _ in env.get("channels", []) if _ not in channels] ) packages.extend( [ diff --git a/src/projspec/proj/documentation.py b/src/projspec/proj/documentation.py index 2a56d6f..d09aaf0 100644 --- a/src/projspec/proj/documentation.py +++ b/src/projspec/proj/documentation.py @@ -13,9 +13,7 @@ class MDBook(ProjectSpec): # to get generated docs output for a rust lib, use `rustdoc` # https://doc.rust-lang.org/rustdoc/what-is-rustdoc.html - spec_doc = ( - "https://rust-lang.github.io/mdBook/format/configuration/index.html" - ) + spec_doc = "https://rust-lang.github.io/mdBook/format/configuration/index.html" def match(self) -> bool: return "book.toml" in self.proj.basenames @@ -30,14 +28,10 @@ class RTD(ProjectSpec): General description of the platform: https://docs.readthedocs.com/platform/stable/ """ - spec_doc = ( - "https://docs.readthedocs.com/platform/stable/config-file/v2.html" - ) + spec_doc = "https://docs.readthedocs.com/platform/stable/config-file/v2.html" def match(self) -> bool: - return any( - re.match("[.]?readthedocs.y[a]?ml", _) for _ in self.proj.basenames - ) + return any(re.match("[.]?readthedocs.y[a]?ml", _) for _ in self.proj.basenames) def parse(self) -> None: # supports mkdocs and sphinx builders diff --git a/src/projspec/proj/git.py b/src/projspec/proj/git.py index 29f5964..9bf2193 100644 --- a/src/projspec/proj/git.py +++ b/src/projspec/proj/git.py @@ -19,20 +19,14 @@ def parse(self) -> None: cont = AttrDict() cont["remotes"] = [ _.rsplit("/", 1)[-1] - for _ in self.proj.fs.ls( - f"{self.proj.url}/.git/refs/remotes", detail=False - ) + for _ in self.proj.fs.ls(f"{self.proj.url}/.git/refs/remotes", detail=False) ] cont["tags"] = [ _.rsplit("/", 1)[-1] - for _ in self.proj.fs.ls( - f"{self.proj.url}/.git/refs/tags", detail=False - ) + for _ in self.proj.fs.ls(f"{self.proj.url}/.git/refs/tags", detail=False) ] cont["branches"] = [ _.rsplit("/", 1)[-1] - for _ in self.proj.fs.ls( - f"{self.proj.url}/.git/refs/heads", detail=False - ) + for _ in self.proj.fs.ls(f"{self.proj.url}/.git/refs/heads", detail=False) ] self._contents = cont diff --git a/src/projspec/proj/pixi.py b/src/projspec/proj/pixi.py index 6afd800..c1c827a 100644 --- a/src/projspec/proj/pixi.py +++ b/src/projspec/proj/pixi.py @@ -69,13 +69,9 @@ def parse(self) -> None: meta = self.proj.pyproject.get("tools", {}).get("pixi", {}) if "pixi.toml" in self.proj.basenames: try: - with self.proj.fs.open( - self.proj.basenames["pixi.toml"], "rb" - ) as f: + with self.proj.fs.open(self.proj.basenames["pixi.toml"], "rb") as f: meta.update( - toml.loads( - f.read().decode(), decoder=PickleableTomlDecoder() - ) + toml.loads(f.read().decode(), decoder=PickleableTomlDecoder()) ) except (OSError, ValueError, UnicodeDecodeError, FileNotFoundError): pass @@ -97,15 +93,11 @@ def parse(self) -> None: for env_name, details in meta["environments"].items(): feat = {} feats = set( - details - if isinstance(details, list) - else details["features"] + details if isinstance(details, list) else details["features"] ) for feat_name in feats: feat.update(meta["feature"][feat_name]) - if isinstance(details, list) or not details.get( - "no-default-feature" - ): + if isinstance(details, list) or not details.get("no-default-feature"): feat.update(meta) extract_feature(feat, procs, commands, self, env=env_name) @@ -229,8 +221,7 @@ def envs_from_lock(infile) -> dict: for entry in next(iter(env["packages"].values())) ], "channels": [ - _ if isinstance(_, str) else _.get("url", "") - for _ in env["channels"] + _ if isinstance(_, str) else _.get("url", "") for _ in env["channels"] ] + env.get("indexes", []), } diff --git a/src/projspec/proj/poetry.py b/src/projspec/proj/poetry.py index 3b48291..164d067 100644 --- a/src/projspec/proj/poetry.py +++ b/src/projspec/proj/poetry.py @@ -43,9 +43,7 @@ def parse(self) -> None: fn=f"{self.proj.url}/poetry.lock", ) try: - with self.proj.fs.open( - f"{self.proj.url}/poetry.lock", mode="rt" - ) as f: + with self.proj.fs.open(f"{self.proj.url}/poetry.lock", mode="rt") as f: pckg = toml.load(f, decoder=PickleableTomlDecoder()) packages = [ f"{_['name']} =={_['version']}" for _ in pckg.get("package", []) diff --git a/src/projspec/proj/pyscript.py b/src/projspec/proj/pyscript.py index 6688b5f..0c64cb8 100644 --- a/src/projspec/proj/pyscript.py +++ b/src/projspec/proj/pyscript.py @@ -17,9 +17,7 @@ def match(self) -> bool: # actually, config can be specified by a local path in the repo, but this is rare; # also you can just declare things to install as you go, which we won't be able to # guess. - return not {"pyscript.toml", "pyscript.json"}.isdisjoint( - self.proj.basenames - ) + return not {"pyscript.toml", "pyscript.json"}.isdisjoint(self.proj.basenames) def parse(self) -> None: try: diff --git a/src/projspec/proj/python_code.py b/src/projspec/proj/python_code.py index 2d9dcaf..4ee67d8 100644 --- a/src/projspec/proj/python_code.py +++ b/src/projspec/proj/python_code.py @@ -19,20 +19,14 @@ class PythonCode(ProjectSpec): A package is executable if it contains a ``__main__.py`` file. """ - spec_doc = ( - "https://docs.python.org/3/reference/import.html#regular-packages" - ) + spec_doc = "https://docs.python.org/3/reference/import.html#regular-packages" def match(self) -> bool: return "__init__.py" in self.proj.basenames def parse(self): arts = AttrDict() - exe = [ - _ - for _ in self.proj.filelist - if _.rsplit("/", 1)[-1] == "__main__.py" - ] + exe = [_ for _ in self.proj.filelist if _.rsplit("/", 1)[-1] == "__main__.py"] if exe: arts["process"] = AttrDict( main=Process(proj=self.proj, cmd=["python", exe[0]]) @@ -60,14 +54,10 @@ class PythonLibrary(ProjectSpec): """ # setup.py never had a spec - spec_doc = ( - "https://packaging.python.org/en/latest/specifications/pyproject-toml/" - ) + spec_doc = "https://packaging.python.org/en/latest/specifications/pyproject-toml/" def match(self) -> bool: - return not {"pyproject.toml", "setup.py"}.isdisjoint( - self.proj.basenames - ) + return not {"pyproject.toml", "setup.py"}.isdisjoint(self.proj.basenames) def parse(self): arts = AttrDict() diff --git a/src/projspec/proj/uv.py b/src/projspec/proj/uv.py index 9f2537b..a823969 100644 --- a/src/projspec/proj/uv.py +++ b/src/projspec/proj/uv.py @@ -32,9 +32,7 @@ def _parse_conf(self: ProjectSpec, conf: dict): packages=v, artifacts=set(), ) - for k, v in conf.get("project", {}) - .get("dependency-groups", {}) - .items() + for k, v in conf.get("project", {}).get("dependency-groups", {}).items() } ) if "dev-dependencies" in conf: @@ -124,9 +122,7 @@ def match(self): return True if ".venv" in self.proj.basenames: try: - with self.proj.fs.open( - f"{self.proj.url}/.venv/pyvenv.cfg", "rt" - ) as f: + with self.proj.fs.open(f"{self.proj.url}/.venv/pyvenv.cfg", "rt") as f: txt = f.read() return b"uv =" in txt except (OSError, FileNotFoundError): diff --git a/src/projspec/utils.py b/src/projspec/utils.py index 3178e1a..7370d79 100644 --- a/src/projspec/utils.py +++ b/src/projspec/utils.py @@ -56,9 +56,7 @@ def __init__(self, *data, **kw): elif isinstance(data[0], list): if len(types) > 1: raise TypeError("Multiple types ina list") - super().__init__( - {camel_to_snake(next(iter(types)).__name__): data[0]} - ) + super().__init__({camel_to_snake(next(iter(types)).__name__): data[0]}) elif isinstance(data[0], dict): super().__init__(data[0]) else: @@ -66,9 +64,7 @@ def __init__(self, *data, **kw): else: dic = True if dic: - super().__init__( - {camel_to_snake(type(v).__name__): v for v in data} - ) + super().__init__({camel_to_snake(type(v).__name__): v for v in data}) self.update(kw) def __getattr__(self, item): @@ -83,9 +79,11 @@ def to_dict(self, compact=True): def to_dict(obj, compact=True): if isinstance(obj, dict): return { - k: v.to_dict(compact=compact) - if hasattr(v, "to_dict") - else to_dict(v, compact=compact) + k: ( + v.to_dict(compact=compact) + if hasattr(v, "to_dict") + else to_dict(v, compact=compact) + ) for k, v in obj.items() } if isinstance(obj, (bytes, str)): @@ -114,15 +112,12 @@ def from_dict(dic, proj=None): elif category == "artifact": cls = get_artifact_cls(name) elif category == "enum": - breakpoint() cls = get_enum_class(name) else: raise NotImplementedError obj = object.__new__(cls) obj.proj = proj - obj.__dict__.update( - {k: from_dict(v, proj=proj) for k, v in dic.items()} - ) + obj.__dict__.update({k: from_dict(v, proj=proj) for k, v in dic.items()}) return obj return AttrDict(**{k: from_dict(v, proj=proj) for k, v in dic.items()}) elif isinstance(dic, list): diff --git a/tests/test_utils.py b/tests/test_utils.py index 6c2c135..e8f59e6 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -3,12 +3,7 @@ from projspec.content import BaseContent from projspec.content.environment import Stack from projspec.content.metadata import DescriptiveMetadata -from projspec.utils import ( - AttrDict, - get_enum_class, - is_installed, - sort_version_strings, -) +from projspec.utils import AttrDict, get_enum_class, is_installed, sort_version_strings def test_is_installed(): From a2ec1d9a07308b199ad323a92a72931d1bebab40 Mon Sep 17 00:00:00 2001 From: Martin Durant Date: Fri, 12 Sep 2025 16:39:14 -0400 Subject: [PATCH 3/3] remove duplication --- .github/workflows/pre-commit.yml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .github/workflows/pre-commit.yml diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml deleted file mode 100644 index 112ff58..0000000 --- a/.github/workflows/pre-commit.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Linting - -on: - push: - branches: main - pull_request: - branches: main - -jobs: - checks: - name: pre-commit hooks - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 - with: - python-version: '3.11' - - uses: pre-commit/action@v3.0.0