Ver código fonte

feat: add linter workflow

trgiangdo 2 anos atrás
pai
commit
70238d6ac8
8 arquivos alterados com 70 adições e 19 exclusões
  1. 25 0
      .github/workflows/linter.yml
  2. 3 0
      .gitignore
  3. 13 0
      .pre-commit-config.yaml
  4. 7 0
      Pipfile
  5. 2 1
      setup.py
  6. 15 16
      src/taipy/__init__.py
  7. 4 1
      src/taipy/_run.py
  8. 1 1
      tests/test_run.py

+ 25 - 0
.github/workflows/linter.yml

@@ -0,0 +1,25 @@
+name: Python linter and type checker
+
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches: [ develop ]
+
+jobs:
+  linter:
+    timeout-minutes: 20
+    strategy:
+      fail-fast: false
+      matrix:
+        language: [ 'python' ]
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v1
+      - uses: ricardochaves/python-lint@v1.4.0
+        with:
+          use-pylint: false
+          extra-black-options: "--line-length=120"
+          extra-pycodestyle-options: "--max-line-length=120 --ignore=E121,E123,E126,E226,E24,E704,W503,W504,E203"
+          extra-mypy-options: "--ignore-missing-imports --implicit-optional --no-namespace-packages"
+          extra-isort-options: "--line-length=120 --force-grid-wrap=10 --multi-line=VERTICAL_HANGING_INDENT --trailing-comma"

+ 3 - 0
.gitignore

@@ -7,6 +7,9 @@ Pipfile.lock
 build/
 *.egg-info/
 
+# mypy
+.mypy_cache/
+
 # IDE settings
 .vscode/
 .idea/

+ 13 - 0
.pre-commit-config.yaml

@@ -9,6 +9,10 @@ repos:
                 'types-pytz',
                 'types-tzlocal',
         ]
+        args:
+        - --ignore-missing-imports
+        - --implicit-optional
+        - --no-namespace-packages
 -   repo: https://github.com/Lucas-C/pre-commit-hooks
     rev: v1.1.10
     hooks:
@@ -29,6 +33,15 @@ repos:
     - id: check-merge-conflict
     - id: check-yaml
       args: [--unsafe]
+-   repo: https://github.com/pre-commit/mirrors-isort
+    rev: v5.9.3
+    hooks:
+    - id: isort
+      args:
+      - --line-length=120
+      - --force-grid-wrap=10
+      - --multi-line=VERTICAL_HANGING_INDENT
+      - --trailing-comma
 -   repo: https://github.com/ambv/black
     rev: 22.3.0
     hooks:

+ 7 - 0
Pipfile

@@ -8,6 +8,13 @@ taipy-gui = {git="https://git@github.com/Avaiga/taipy-gui.git@develop"}
 taipy-rest = {git="https://git@github.com/Avaiga/taipy-rest.git@develop"}
 
 [dev-packages]
+autopep8 = "*"
+black = "*"
+flake8 = "*"
+flake8-docstrings = "*"
+isort = "*"
+mypy = "*"
+pre-commit = "*"
 pytest = "*"
 tox = "*"
 

+ 2 - 1
setup.py

@@ -15,7 +15,8 @@
 
 import json
 import os
-from setuptools import find_packages, find_namespace_packages, setup
+
+from setuptools import find_namespace_packages, find_packages, setup
 
 with open("README.md") as readme_file:
     readme = readme_file.read()

+ 15 - 16
src/taipy/__init__.py

@@ -10,17 +10,24 @@
 # specific language governing permissions and limitations under the License.
 
 from importlib.util import find_spec
+
 from .version import _get_version
 
 __version__ = _get_version()
 
-if find_spec('taipy'):
+if find_spec("taipy"):
     if find_spec("taipy.config"):
-        from taipy.config import Config
-        from taipy.config import Scope
-        from taipy.config import Frequency
+        from taipy.config import Config, Frequency, Scope
 
     if find_spec("taipy.core"):
+        from taipy.core._core import Core
+        from taipy.core.common.alias import CycleId, DataNodeId, JobId, PipelineId, ScenarioId, TaskId
+        from taipy.core.cycle.cycle import Cycle
+        from taipy.core.data.data_node import DataNode
+        from taipy.core.job.job import Job
+        from taipy.core.job.status import Status
+        from taipy.core.pipeline.pipeline import Pipeline
+        from taipy.core.scenario.scenario import Scenario
         from taipy.core.taipy import (
             cancel_job,
             clean_all_entities,
@@ -53,26 +60,18 @@ if find_spec('taipy'):
             unsubscribe_scenario,
             untag,
         )
-        from taipy.core._core import Core
-        from taipy.core.common.alias import CycleId, DataNodeId, JobId, PipelineId, ScenarioId, TaskId
-        from taipy.core.cycle.cycle import Cycle
-        from taipy.core.data.data_node import DataNode
-        from taipy.core.job.job import Job
-        from taipy.core.job.status import Status
-        from taipy.core.pipeline.pipeline import Pipeline
-        from taipy.core.scenario.scenario import Scenario
         from taipy.core.task.task import Task
 
-    if find_spec('taipy.gui'):
+    if find_spec("taipy.gui"):
         from taipy.gui import Gui
 
-        if find_spec('taipy.enterprise') and find_spec('taipy.enterprise.gui'):
+        if find_spec("taipy.enterprise") and find_spec("taipy.enterprise.gui"):
             from taipy.enterprise.gui import _init_gui_enterprise
 
             _init_gui_enterprise(Gui)
 
-    if find_spec('taipy.rest'):
+    if find_spec("taipy.rest"):
         from taipy.rest import Rest
 
-    if find_spec('taipy._run'):
+    if find_spec("taipy._run"):
         from taipy._run import _run as run

+ 4 - 1
src/taipy/_run.py

@@ -14,9 +14,9 @@ import typing as t
 
 from flask import Flask
 
+from taipy.core import Core
 from taipy.gui import Gui
 from taipy.rest import Rest
-from taipy.core import Core
 
 if sys.version_info >= (3, 10):
     from typing import TypeGuard
@@ -65,6 +65,8 @@ def _run(*apps: t.List[_AppType], **kwargs) -> t.Optional[Flask]:
         return app.run(**kwargs)
 
 
+# Avoid black adding too many empty lines
+# fmt: off
 if sys.version_info >= (3, 10):
     def __get_app(apps: t.Tuple[_AppType, ...], type_: t.Type[_AppTypeT]) -> t.Optional[_AppType]:
         def filter_isinstance(tl: _AppType) -> TypeGuard[_AppTypeT]:
@@ -74,3 +76,4 @@ if sys.version_info >= (3, 10):
 else:
     def __get_app(apps: t.Tuple[_AppType, ...], type_: t.Type[_AppTypeT]) -> t.Optional[_AppType]:
         return next(filter(lambda a: isinstance(a, type_), apps), None)
+# fmt: on

+ 1 - 1
tests/test_run.py

@@ -12,9 +12,9 @@
 from unittest import mock
 
 from src.taipy._run import _run
+from taipy.core import Core
 from taipy.gui import Gui
 from taipy.rest import Rest
-from taipy.core import Core
 
 
 @mock.patch("taipy.gui.Gui.run")