From 8a213ee41cf828ecbb591027e6b55cffee4b02c5 Mon Sep 17 00:00:00 2001 From: Ivan Vedernikov Date: Mon, 8 Jun 2020 15:11:19 +0500 Subject: [PATCH] Add proposal app skeleton for styling configs handling --- kn_defaults/styling/__init__.py | 1 + kn_defaults/styling/apps.py | 10 + kn_defaults/styling/checks.py | 28 +++ kn_defaults/styling/management/__init__.py | 0 .../styling/management/commands/__init__.py | 0 .../management/commands/copy_styling_conf.py | 28 +++ .../templates/kn_styling/.eslintrc.yml | 177 ++++++++++++++++++ .../styling/templates/kn_styling/.flake8 | 10 + .../styling/templates/kn_styling/.isort.cfg | 10 + .../kn_styling/.pre-commit-config.yaml | 72 +++++++ .../templates/kn_styling/.prettierrc.yml | 7 + 11 files changed, 343 insertions(+) create mode 100644 kn_defaults/styling/__init__.py create mode 100644 kn_defaults/styling/apps.py create mode 100644 kn_defaults/styling/checks.py create mode 100644 kn_defaults/styling/management/__init__.py create mode 100644 kn_defaults/styling/management/commands/__init__.py create mode 100644 kn_defaults/styling/management/commands/copy_styling_conf.py create mode 100644 kn_defaults/styling/templates/kn_styling/.eslintrc.yml create mode 100644 kn_defaults/styling/templates/kn_styling/.flake8 create mode 100644 kn_defaults/styling/templates/kn_styling/.isort.cfg create mode 100644 kn_defaults/styling/templates/kn_styling/.pre-commit-config.yaml create mode 100644 kn_defaults/styling/templates/kn_styling/.prettierrc.yml diff --git a/kn_defaults/styling/__init__.py b/kn_defaults/styling/__init__.py new file mode 100644 index 0000000..6c7496a --- /dev/null +++ b/kn_defaults/styling/__init__.py @@ -0,0 +1 @@ +default_app_config = 'kn_defaults.styling.apps.KnStylingConfig' diff --git a/kn_defaults/styling/apps.py b/kn_defaults/styling/apps.py new file mode 100644 index 0000000..b0b32b9 --- /dev/null +++ b/kn_defaults/styling/apps.py @@ -0,0 +1,10 @@ +from django.apps import AppConfig + + +class KnStylingConfig(AppConfig): + name = 'kn_defaults.styling' + verbose_name = 'KuwaitNet code styling helpers' + + def ready(self): + super().ready() + from . import checks diff --git a/kn_defaults/styling/checks.py b/kn_defaults/styling/checks.py new file mode 100644 index 0000000..400fd83 --- /dev/null +++ b/kn_defaults/styling/checks.py @@ -0,0 +1,28 @@ +from django.conf import settings +from django.core.checks import Error, register + +try: + from pip._internal.operations import freeze +except ImportError: # pip < 10.0 + from pip.operations import freeze + + +@register() +def check_pre_commit(app_configs, **kwargs): + errors = [] + installed = False + + for package in freeze.freeze(): + if package.startswith("pre-commit"): + installed = True + break + + if not installed and not settings.DEBUG: + errors.append( + Error('`pre-commit` must be installed in python PATH', + obj='settings', + id='kn_defaults.E004', + ) + ) + + return errors diff --git a/kn_defaults/styling/management/__init__.py b/kn_defaults/styling/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kn_defaults/styling/management/commands/__init__.py b/kn_defaults/styling/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kn_defaults/styling/management/commands/copy_styling_conf.py b/kn_defaults/styling/management/commands/copy_styling_conf.py new file mode 100644 index 0000000..a13acc8 --- /dev/null +++ b/kn_defaults/styling/management/commands/copy_styling_conf.py @@ -0,0 +1,28 @@ +# Here we need a command which copies configs from templates/ to project's root +# preferable to copy all of them by default but have an option to exclude any. +# Settings themselves are not final, we should discuss them. +import os +from contextlib import closing + +from django.conf import settings +from django.core.management import BaseCommand +from django.template.loader import render_to_string + +TEMPLATES_NAMES = [ + ".eslintrc.yml", + ".flake8", + ".isort.cfg", + ".pre-commit-config.yaml", + ".prettierrc.yml" +] + + +class Command(BaseCommand): + + def handle(self, *args, **options): + base_dir = getattr(settings, "BASE_DIR", None) + if not base_dir: + raise ValueError("`BASE_DIR` is not set") + for name in TEMPLATES_NAMES: + with closing(open(os.path.join(base_dir, "..", name), "w")) as fp: + fp.write(render_to_string(f"kn_styling/{name}")) diff --git a/kn_defaults/styling/templates/kn_styling/.eslintrc.yml b/kn_defaults/styling/templates/kn_styling/.eslintrc.yml new file mode 100644 index 0000000..5e420af --- /dev/null +++ b/kn_defaults/styling/templates/kn_styling/.eslintrc.yml @@ -0,0 +1,177 @@ +env: + browser: true + +# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 +parserOptions: + ecmaVersion: 2017 + +# Globals available in Odoo that shouldn't produce errorings +globals: + _: readonly + $: readonly + fuzzy: readonly + jQuery: readonly + moment: readonly + Promise: readonly + +# Styling is handled by Prettier, so we only need to enable AST rules; +# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890 +rules: + accessor-pairs: warn + array-callback-return: warn + callback-return: warn + capitalized-comments: + - warn + - always + - ignoreConsecutiveComments: true + ignoreInlineComments: true + complexity: + - warn + - 15 + constructor-super: warn + dot-notation: warn + eqeqeq: warn + global-require: warn + handle-callback-err: warn + id-blacklist: warn + id-match: warn + init-declarations: error + max-depth: warn + max-nested-callbacks: warn + max-statements-per-line: warn + no-alert: warn + no-array-constructor: warn + no-caller: warn + no-case-declarations: warn + no-class-assign: warn + no-cond-assign: error + no-const-assign: error + no-constant-condition: warn + no-control-regex: warn + no-debugger: error + no-delete-var: warn + no-div-regex: warn + no-dupe-args: error + no-dupe-class-members: error + no-dupe-keys: error + no-duplicate-case: error + no-duplicate-imports: error + no-else-return: warn + no-empty-character-class: warn + no-empty-pattern: error + no-empty: warn + no-eq-null: error + no-eval: error + no-ex-assign: error + no-extend-native: warn + no-extra-bind: warn + no-extra-boolean-cast: warn + no-extra-label: warn + no-fallthrough: warn + no-func-assign: error + no-global-assign: error + no-implicit-coercion: + - warn + - allow: ["~"] + no-implicit-globals: warn + no-implied-eval: warn + no-inline-comments: warn + no-inner-declarations: warn + no-invalid-regexp: warn + no-irregular-whitespace: warn + no-iterator: warn + no-label-var: warn + no-labels: warn + no-lone-blocks: warn + no-lonely-if: error + no-mixed-requires: error + no-multi-str: warn + no-native-reassign: error + no-negated-condition: warn + no-negated-in-lhs: error + no-new-func: warn + no-new-object: warn + no-new-require: warn + no-new-symbol: warn + no-new-wrappers: warn + no-new: warn + no-obj-calls: warn + no-octal-escape: warn + no-octal: warn + no-param-reassign: warn + no-path-concat: warn + no-process-env: warn + no-process-exit: warn + no-proto: warn + no-prototype-builtins: warn + no-redeclare: warn + no-regex-spaces: warn + no-restricted-globals: warn + no-restricted-imports: warn + no-restricted-modules: warn + no-restricted-syntax: warn + no-return-assign: error + no-script-url: warn + no-self-assign: warn + no-self-compare: warn + no-sequences: warn + no-shadow-restricted-names: warn + no-shadow: warn + no-sparse-arrays: warn + no-sync: warn + no-this-before-super: warn + no-throw-literal: warn + no-undef-init: warn + no-undef: error + no-unmodified-loop-condition: warn + no-unneeded-ternary: error + no-unreachable: error + no-unsafe-finally: error + no-unused-expressions: error + no-unused-labels: error + no-unused-vars: error + no-use-before-define: error + no-useless-call: warn + no-useless-computed-key: warn + no-useless-concat: warn + no-useless-constructor: warn + no-useless-escape: warn + no-useless-rename: warn + no-void: warn + no-with: warn + operator-assignment: [error, always] + prefer-const: warn + radix: warn + require-yield: warn + sort-imports: warn + spaced-comment: [error, always] + strict: [error, function] + use-isnan: error + valid-jsdoc: + - warn + - prefer: + arg: param + argument: param + augments: extends + constructor: class + exception: throws + func: function + method: function + prop: property + return: returns + virtual: abstract + yield: yields + preferType: + array: Array + bool: Boolean + boolean: Boolean + number: Number + object: Object + str: String + string: String + requireParamDescription: false + requireReturn: false + requireReturnDescription: false + requireReturnType: false + valid-typeof: warn + yoda: warn \ No newline at end of file diff --git a/kn_defaults/styling/templates/kn_styling/.flake8 b/kn_defaults/styling/templates/kn_styling/.flake8 new file mode 100644 index 0000000..c1f694c --- /dev/null +++ b/kn_defaults/styling/templates/kn_styling/.flake8 @@ -0,0 +1,10 @@ +[flake8] +max-line-length = 80 +max-complexity = 16 +# B = bugbear +# B9 = bugbear opinionated (incl line length) +select = C,E,F,W,B,B9 +# E203: whitespace before ':' (black behaviour) +# E501: flake8 line length (covered by bugbear B950) +# W503: line break before binary operator (black behaviour) +ignore = E203,E501,W503 \ No newline at end of file diff --git a/kn_defaults/styling/templates/kn_styling/.isort.cfg b/kn_defaults/styling/templates/kn_styling/.isort.cfg new file mode 100644 index 0000000..6ed9ad7 --- /dev/null +++ b/kn_defaults/styling/templates/kn_styling/.isort.cfg @@ -0,0 +1,10 @@ +[settings] +; see https://github.com/psf/black +multi_line_output=3 +include_trailing_comma=True +force_grid_wrap=0 +combine_as_imports=True +use_parentheses=True +line_length=88 +sections=FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER +default_section=THIRDPARTY \ No newline at end of file diff --git a/kn_defaults/styling/templates/kn_styling/.pre-commit-config.yaml b/kn_defaults/styling/templates/kn_styling/.pre-commit-config.yaml new file mode 100644 index 0000000..ceafd97 --- /dev/null +++ b/kn_defaults/styling/templates/kn_styling/.pre-commit-config.yaml @@ -0,0 +1,72 @@ +exclude: | + (?x) + # Maybe reactivate this when all README files include prettier ignore tags? + ^README\.rst$| + # You don't usually want a bot to modify your legal texts + (LICENSE.*|COPYING.*) +default_language_version: + python: python3 +repos: + - repo: https://github.com/psf/black + rev: 19.10b0 + hooks: + - id: black + exclude: /migrations/* + - repo: https://github.com/prettier/prettier + rev: "1.19.1" + hooks: + - id: prettier + exclude: /dist/* + - repo: https://github.com/pre-commit/mirrors-eslint + rev: v6.8.0 + hooks: + - id: eslint + verbose: true + args: + - --color + - --fix + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.4.0 + hooks: + - id: trailing-whitespace + # exclude autogenerated files + exclude: /README\.rst$|\.pot?$ + - id: end-of-file-fixer + # exclude autogenerated files + exclude: /README\.rst$|\.pot?$ + - id: debug-statements + - id: fix-encoding-pragma + args: ["--remove"] + - id: check-case-conflict + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-merge-conflict + # exclude files where underlines are not distinguishable from merge conflicts + exclude: /README\.rst$|^docs/.*\.rst$ + - id: check-symlinks + - id: check-xml + - id: mixed-line-ending + args: ["--fix=lf"] + - repo: https://gitlab.com/pycqa/flake8 + rev: 3.7.9 + hooks: + - id: flake8 + name: flake8 except __init__.py + exclude: (/__init__\.py$|/migrations/*) + additional_dependencies: ["flake8-bugbear==19.8.0"] + - id: flake8 + name: flake8 only __init__.py + args: ["--extend-ignore=F401"] # ignore unused imports in __init__.py + files: /__init__\.py$ + additional_dependencies: ["flake8-bugbear==19.8.0"] + - repo: https://github.com/asottile/pyupgrade + rev: v1.26.2 + hooks: + - id: pyupgrade + exclude: /migrations/* + - repo: https://github.com/pre-commit/mirrors-isort + rev: v4.3.21 + hooks: + - id: isort + name: isort except __init__.py + exclude: (/__init__\.py$|/migrations/*) diff --git a/kn_defaults/styling/templates/kn_styling/.prettierrc.yml b/kn_defaults/styling/templates/kn_styling/.prettierrc.yml new file mode 100644 index 0000000..128d271 --- /dev/null +++ b/kn_defaults/styling/templates/kn_styling/.prettierrc.yml @@ -0,0 +1,7 @@ +# Defaults for all prettier-supported languages. +# Prettier will complete this with settings from .editorconfig file. +bracketSpacing: false +printWidth: 88 +proseWrap: always +semi: false +trailingComma: "es5"