From 2b0dcaf864cbb134f420c2bb98a9a3b91139eeda Mon Sep 17 00:00:00 2001 From: Marco M Date: Thu, 5 Aug 2021 21:34:12 +0200 Subject: [PATCH 01/10] Update README --- README.md | 80 ++++++----------------------------------- docs/logo.png | Bin 23562 -> 0 bytes docs/sample-output.png | Bin 52509 -> 0 bytes 3 files changed, 10 insertions(+), 70 deletions(-) delete mode 100644 docs/logo.png delete mode 100644 docs/sample-output.png diff --git a/README.md b/README.md index 6f05335..7d80f45 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,24 @@ -# editorconfig-checker +# editorconfig-checker.python +A Python wrapper to provide a pip-installable [editorconfig-checker](https://github.com/editorconfig-checker/editorconfig-checker) binary. -![Logo](https://raw.githubusercontent.com/editorconfig-checker/editorconfig-checker.python/master/docs/logo.png "Logo") +Internally, this package provides a convenient way to download the pre-built `editorconfig-checker` binary for your particular platform. -Buy Me A Coffee - -## What? - -This is a tool to check if your files consider your `.editorconfig`. -Most tools - like linters for example - only test one filetype and need an extra configuration. -This tool only needs your editorconfig to check all files. - -![Sample Output](https://raw.githubusercontent.com/editorconfig-checker/editorconfig-checker.python/master/docs/sample-output.png "Sample output") - -## Important - -This is only a wrapper for the core [editorconfig-checker](https://github.com/editorconfig-checker/editorconfig-checker). -You should have a look at this repository to know how this tool can be used and what possibilities/caveats are there. -This version can be used in the same way as the core as every argument is simply passed down to it. ## Installation - ``` -$ pip install . # from cloned repo +$ pip install . # from source code $ pip install editorconfig-checker # from PyPI ``` + ## Usage +After installation, the `editorconfig-checker` binary should be available in your environment +(or `editorconfig-checker.exe` on Windows). -``` -$ editorconfig-checker -help -USAGE: - -config string - config - -debug - print debugging information - -disable-end-of-line - disables the trailing whitespace check - -disable-indentation - disables the indentation check - -disable-insert-final-newline - disables the final newline check - -disable-trim-trailing-whitespace - disables the trailing whitespace check - -dry-run - show which files would be checked - -exclude string - a regex which files should be excluded from checking - needs to be a valid regular expression - -h print the help - -help - print the help - -ignore-defaults - ignore default excludes - -init - creates an initial configuration - -no-color - dont print colors - -v print debugging information - -verbose - print debugging information - -version - print the version number -``` ## Usage with the pre-commit git hooks framework - -editorconfig-checker can be included as a hook for [pre-commit](https://pre-commit.com/). The easiest way to get started is to add this configuration to your `.pre-commit-config.yaml`: +`editorconfig-checker` can be included as a hook for [pre-commit](https://pre-commit.com/). +The easiest way to get started is to add this configuration to your `.pre-commit-config.yaml`: ```yaml repos: @@ -74,18 +28,4 @@ repos: - id: editorconfig-checker ``` -See the [pre-commit docs](https://pre-commit.com/#pre-commit-configyaml---hooks) for how to customize this configuration. - -## Run tests - -The test script uses `docker`. After installing it, you can run the test with: -``` -$ ./test.sh -``` - -## Support - -If you have any questions or just want to chat join #editorconfig-checker on -freenode(IRC). -If you don't have an IRC-client set up you can use the -[freenode webchat](https://webchat.freenode.net/?channels=editorconfig-checker). +See the [pre-commit docs](https://pre-commit.com/#pre-commit-configyaml---hooks) to check how to customize this configuration. diff --git a/docs/logo.png b/docs/logo.png deleted file mode 100644 index 322b979ae91eae854c2c61ca38e3d3d35121462b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23562 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 From 87711444a27f5afccd125d8382142fbb8b828d30 Mon Sep 17 00:00:00 2001 From: Marco M Date: Thu, 5 Aug 2021 21:42:50 +0200 Subject: [PATCH 02/10] Remove dependabot --- .github/dependabot.yml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 8f48c03..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: 2 -registries: - python-index-pypi-python-org-simple: - type: python-index - url: https://pypi.python.org/simple/ - replaces-base: false - username: "${{secrets.PYTHON_INDEX_PYPI_PYTHON_ORG_SIMPLE_USERNAME}}" - password: "${{secrets.PYTHON_INDEX_PYPI_PYTHON_ORG_SIMPLE_PASSWORD}}" - -updates: -- package-ecosystem: pip - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 - ignore: - - dependency-name: pycodestyle - versions: - - 2.7.0 - registries: - - python-index-pypi-python-org-simple From e05b1726c60e5338c8e9644fc750ef1033e55919 Mon Sep 17 00:00:00 2001 From: Marco M Date: Thu, 5 Aug 2021 21:43:38 +0200 Subject: [PATCH 03/10] Remove requirements --- requirements.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 67cfc1f..0000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flake8==3.9.1 -pycodestyle==2.6.0 -requests==2.25.1 From 46d7d2f0d36cd583d4b26096430b6fe8429e24ff Mon Sep 17 00:00:00 2001 From: Marco M Date: Sat, 7 Aug 2021 10:41:53 +0200 Subject: [PATCH 04/10] Add "publish" and "test" targets --- Makefile | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index fcec853..7bd33b5 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,27 @@ .PHONY: help help: @echo "Available targets:" - @echo " - help : Print this help message." - @echo " - clean : Remove generated files." - @echo " - coding_style : Run coding style tools." + @echo " - help : Print this help message." + @echo " - clean : Remove generated files." + @echo " - coding-style : Run coding style tools." + @echo " - publish : Publish package to PyPI." + @echo " - test : Run coding style tools and tests." .PHONY: all all: help .PHONY: clean clean: - @rm -rf build dist editorconfig_checker.egg-info editorconfig_checker/bin + rm -rf build dist editorconfig_checker.egg-info editorconfig_checker/bin -.PHONY: coding_style -coding_style: - @pycodestyle --ignore E501 . - @flake8 --ignore E501 . +.PHONY: coding-style +coding-style: + flake8 --ignore E501 setup.py + +.PHONY: publish +publish: + bash publish.sh + +.PHONY: test +test: coding-style + bash test.sh From d686b5a46a024166f435ead6ab3a35cf165fb8e2 Mon Sep 17 00:00:00 2001 From: Marco M Date: Sat, 7 Aug 2021 10:42:11 +0200 Subject: [PATCH 05/10] Refactor test script --- test.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test.sh b/test.sh index 85c4424..0116338 100644 --- a/test.sh +++ b/test.sh @@ -8,16 +8,16 @@ PY_DOCKER_IMAGES=("2.7.16-slim" "3.7.4-slim") # "editorconfig-checker" -> PyPI package PACKAGES=("." "editorconfig-checker") -DOCKERFILE_TEMPLATE=tests/Dockerfile.template +DOCKERFILE_TEMPLATE="tests/Dockerfile.template" for py_docker_image in "${PY_DOCKER_IMAGES[@]}"; do for package in "${PACKAGES[@]}"; do is_local="0" if [[ "$package" == "." ]]; then - package_pp=local + package_pp="local" is_local="1" elif [[ "$package" == "editorconfig-checker" ]]; then - package_pp=pypi + package_pp="pypi" else echo "Unknown package '$package'. Valid values are '.' and 'editorconfig-checker'." exit 1 @@ -26,25 +26,25 @@ for py_docker_image in "${PY_DOCKER_IMAGES[@]}"; do echo "docker image: $py_docker_image ~ package: $package ($package_pp)" # Generate a valid Dockerfile from a template file - dockerfile=tests/Dockerfile-$py_docker_image-$package_pp - cp $DOCKERFILE_TEMPLATE $dockerfile - sed -i '' "s/\$IMAGE/$py_docker_image/g" $dockerfile - sed -i '' "s/\$PACKAGE/$package/g" $dockerfile + dockerfile="tests/Dockerfile-$py_docker_image-$package_pp" + cp "$DOCKERFILE_TEMPLATE" "$dockerfile" + sed -i "s/\$IMAGE/$py_docker_image/g" "$dockerfile" + sed -i "s/\$PACKAGE/$package/g" "$dockerfile" echo "Running docker file in $dockerfile" # Build & run - docker_image=editorconfig-checker-$py_docker_image-$package_pp:latest - docker build -t $docker_image -f $dockerfile --no-cache --quiet . - docker run --rm $docker_image + docker_image="editorconfig-checker-$py_docker_image-$package_pp:latest" + docker build -t "$docker_image" -f "$dockerfile" --no-cache --quiet . + docker run --rm "$docker_image" # Run coding style tools if [[ "$is_local" == "1" ]]; then - docker run --rm $docker_image make coding_style + docker run --rm "$docker_image" make coding_style fi # Remove the created image - docker image rm $docker_image > /dev/null + docker image rm "$docker_image" > /dev/null echo "" done From fc580feca238f8ffa63dd4980304bae39292057b Mon Sep 17 00:00:00 2001 From: Marco M Date: Sat, 7 Aug 2021 10:42:35 +0200 Subject: [PATCH 06/10] Add dev requirements --- dev_requirements.txt | 1 + tests/Dockerfile.template | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 dev_requirements.txt diff --git a/dev_requirements.txt b/dev_requirements.txt new file mode 100644 index 0000000..5b6fa90 --- /dev/null +++ b/dev_requirements.txt @@ -0,0 +1 @@ +flake8==3.9.1 diff --git a/tests/Dockerfile.template b/tests/Dockerfile.template index 1a70947..846d158 100644 --- a/tests/Dockerfile.template +++ b/tests/Dockerfile.template @@ -7,5 +7,5 @@ WORKDIR /app RUN set -x \ && apt-get update \ && apt-get install -y make \ - && pip install -r requirements.txt \ + && pip install -r dev_requirements.txt \ && pip install --no-cache-dir $PACKAGE From 459adab45c6e91b02ba546ad259280d842c3a345 Mon Sep 17 00:00:00 2001 From: Marco M Date: Sat, 7 Aug 2021 10:44:02 +0200 Subject: [PATCH 07/10] Move wrapper logic in the setup --- README.md | 7 +- editorconfig_checker/__init__.py | 3 - editorconfig_checker/__main__.py | 13 -- editorconfig_checker/wrapper.py | 121 ----------------- publish.sh | 6 +- setup.cfg | 25 ++++ setup.py | 222 +++++++++++++++++++++++-------- 7 files changed, 199 insertions(+), 198 deletions(-) delete mode 100644 editorconfig_checker/__init__.py delete mode 100644 editorconfig_checker/__main__.py delete mode 100644 editorconfig_checker/wrapper.py create mode 100644 setup.cfg diff --git a/README.md b/README.md index 7d80f45..fc50cc5 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,11 @@ $ pip install editorconfig-checker # from PyPI ## Usage -After installation, the `editorconfig-checker` binary should be available in your environment -(or `editorconfig-checker.exe` on Windows). +After installation, the `ec` binary should be available in your environment (or `ec.exe` on Windows): + +``` +$ ec -version +``` ## Usage with the pre-commit git hooks framework diff --git a/editorconfig_checker/__init__.py b/editorconfig_checker/__init__.py deleted file mode 100644 index 7cf27e9..0000000 --- a/editorconfig_checker/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -__version__ = '2.3.5' diff --git a/editorconfig_checker/__main__.py b/editorconfig_checker/__main__.py deleted file mode 100644 index f7b069f..0000000 --- a/editorconfig_checker/__main__.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -from sys import argv, exit as sys_exit - -from editorconfig_checker.wrapper import run_editor_config_checker - - -def main(): - return run_editor_config_checker(argv[1:]) - - -if __name__ == "__main__": - sys_exit(main()) diff --git a/editorconfig_checker/wrapper.py b/editorconfig_checker/wrapper.py deleted file mode 100644 index 30f2ff9..0000000 --- a/editorconfig_checker/wrapper.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -from os import remove, rename -from os.path import abspath, dirname, isfile, join as path_join -from platform import architecture, system -from subprocess import call -from tarfile import open as tar_open - -from requests import get - -from editorconfig_checker import __version__ - -EXECUTION_PATH = dirname(abspath(__file__)) - - -def run_editor_config_checker(args): - def get_checker_name(): - ''' - Return the `editorconfig-checker` executable name based on the: - 1) OS. - 2) Architecture. - 3) Executable extension. - - :return: `editorconfig-checker` executable name - :rtype: str - ''' - if isinstance(architecture(), tuple) and len(architecture()): - arch = architecture()[0] - - return 'ec-{}-{}{}'.format( - system().lower(), - 'amd64' if arch == '64bit' else '386', - '.exe' if system() == 'Windows' else '' - ) - - def get_checker_name_with_version(): - ''' - Return the `editorconfig-checker` executable name together with its version. - - :return: `editorconfig-checker` executable name with its version - :rtype: str - ''' - return '{}-{}'.format(get_checker_name(), __version__) - - def download_tar(): - ''' - Download the tar which contains the `editorconfig-checker` executable - from Github. - - :return: Absolute path of the tar file if everything goes fine. - Otherwise, the function returns `None`. - :rtype: Optional[str] - ''' - try: - tar_name = '{}.tar.gz'.format(get_checker_name()) - tar_url = ( - 'https://github.com/editorconfig-checker/editorconfig-checker' - '/releases/download/{}/{}'.format(__version__, tar_name) - ) - tar_path = path_join(EXECUTION_PATH, tar_name) - - response = get(tar_url, stream=True) - if response.status_code == 200: - with open(tar_path, 'wb') as fp: - fp.write(response.raw.read()) - - return tar_path - - return None - except BaseException: - return None - - def process_tar(tar_path): - ''' - Extract the directory `bin` contained in the tar file and remove - the archive. - - :return: `True` if the tar has been processed correctly. - Otherwise, the function returns `False`. - :rtype: bool - ''' - if not isfile(tar_path): - return 1 - - ok = True - tar = None - try: - tar = tar_open(tar_path, 'r') - tar.extractall(path=EXECUTION_PATH) - tar.close() - - # Rename executable based on the version - old_fn = path_join(EXECUTION_PATH, 'bin', get_checker_name()) - new_fn = path_join(EXECUTION_PATH, 'bin', get_checker_name_with_version()) - rename(old_fn, new_fn) - except BaseException: - if tar: - tar.close() - ok = False - - # No error if 'remove' raises an exception. The aim of the function - # is to extract the executable from the archive. - try: - remove(tar_path) - except BaseException: - pass - - return ok - - # Check if the `editorconfig-checker` exists - edc_path = path_join(EXECUTION_PATH, 'bin', get_checker_name_with_version()) - if not isfile(edc_path): - # `editorconfig-checker` does not exist in the system. Try to download it - tar_path = download_tar() - if not tar_path: - return 1 - - if not process_tar(tar_path): - return 2 - - return call([edc_path] + args) diff --git a/publish.sh b/publish.sh index 4c32afa..39f4fbe 100644 --- a/publish.sh +++ b/publish.sh @@ -2,10 +2,8 @@ set -e -# Run tests -bash test.sh - -# Remove generated files +# Run tests & cleanup +make test make clean # Build & publish (currently, we push the package under the username `mmicu_00`) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..707dcb1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,25 @@ +[metadata] +name = editorconfig-checker +description = Python wrapper around invoking editorconfig-checker (https://github.com/editorconfig-checker/editorconfig-checker) +long_description = file: README.md +long_description_content_type = text/markdown +url = https://github.com/editorconfig-checker/editorconfig-checker.python +author = Marco M. +author_email = mmicu.github00@gmail.com +license = MIT +license_file = LICENSE +classifiers = + Programming Language :: Python + Programming Language :: Python :: 2 + Programming Language :: Python :: 2.7 + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.5 + Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + Topic :: Text Processing + Topic :: Utilities + +[options] +python_requires = >=2.7 diff --git a/setup.py b/setup.py index 0b4aa82..ac99af6 100644 --- a/setup.py +++ b/setup.py @@ -1,60 +1,172 @@ #!/usr/bin/python3 # -*- coding: utf-8 -*- -from io import open as io_open -from os import path as os_path -from re import search as re_search +""" +This setup logic is highly ispired to the one used in `https://github.com/shellcheck-py/shellcheck-py`. + +After `https://github.com/editorconfig-checker/editorconfig-checker.python/issues/15` was opened, +we decided to move the wrapper logic directly in the setup phase. + +During setup, the tarball that contains the executable will be downloaded based on +the target machine and its content extracted in the proper output directory. + +Once the setup is complete, the `ec` executable should be available on your machine. +""" + +from io import BytesIO +from distutils.command.build import build as orig_build +from distutils.core import Command +from os import chmod, makedirs, path, stat +from platform import architecture, system from setuptools import setup +from setuptools.command.install import install as orig_install +from stat import S_IXUSR, S_IXGRP, S_IXOTH +from tarfile import open as tarfile_open + +try: + # Python 3 + from urllib.request import urlopen +except ImportError: + # Python 2.7 + from urllib2 import urlopen + + +EDITORCONFIG_CHECKER_CORE_VERSION = '2.3.5' +WRAPPER_VERSION = '2.3.51' +EDITORCONFIG_CHECKER_EXE_NAME = 'ec' + + +def get_tarball_url(): + def get_ec_name_by_system(): + if isinstance(architecture(), tuple) and len(architecture()) > 0: + arch = architecture()[0] + else: + raise ValueError('Cannot obtain architecture') + + return 'ec-{}-{}{}'.format( + system().lower(), + 'amd64' if arch == '64bit' else '386', + '.exe' if system() == 'Windows' else '' + ) + + return 'https://github.com/editorconfig-checker/editorconfig-checker/releases/download/{}/{}'.format( + EDITORCONFIG_CHECKER_CORE_VERSION, + '{}.tar.gz'.format(get_ec_name_by_system()) + ) + + +def download_tarball(url): + sock = urlopen(url) + code = sock.getcode() + + if code != 200: + sock.close() + raise ValueError('HTTP failure. Code: {}'.format(code)) + + data = sock.read() + sock.close() + + return data + + +def extract_tarball(url, data): + with BytesIO(data) as bio: + if '.tar.' in url: + with tarfile_open(fileobj=bio) as tarf: + for info in tarf.getmembers(): + if info.isfile() and info.name.startswith('bin/ec-'): + return tarf.extractfile(info).read() + + raise AssertionError('unreachable `extract` function') + + +def save_executables(data, base_dir): + exe = EDITORCONFIG_CHECKER_EXE_NAME + if system() == 'Windows': + exe += '.exe' + + output_path = path.join(base_dir, exe) + makedirs(base_dir) + + with open(output_path, 'wb') as fp: + fp.write(data) + + # Mark as executable ~ https://stackoverflow.com/a/14105527 + mode = stat(output_path).st_mode + mode |= S_IXUSR | S_IXGRP | S_IXOTH + chmod(output_path, mode) + + +class build(orig_build): + sub_commands = orig_build.sub_commands + [('fetch_binaries', None)] + + +class install(orig_install): + sub_commands = orig_install.sub_commands + [('install_editorconfig_checker', None)] + + +class fetch_binaries(Command): + build_temp = None + + def initialize_options(self): + pass + + def finalize_options(self): + self.set_undefined_options('build', ('build_temp', 'build_temp')) + + def run(self): + # save binary to self.build_temp + url = get_tarball_url() + archive = download_tarball(url) + data = extract_tarball(url, archive) + save_executables(data, self.build_temp) + + +class install_editorconfig_checker(Command): + description = 'install the editorconfig-checker executable' + outfiles = () + build_dir = install_dir = None + + def initialize_options(self): + pass + + def finalize_options(self): + # this initializes attributes based on other commands' attributes + self.set_undefined_options('build', ('build_temp', 'build_dir')) + self.set_undefined_options('install', ('install_scripts', 'install_dir')) + + def run(self): + self.outfiles = self.copy_tree(self.build_dir, self.install_dir) + + def get_outputs(self): + return self.outfiles + + +command_overrides = { + 'install': install, + 'install_editorconfig_checker': install_editorconfig_checker, + 'build': build, + 'fetch_binaries': fetch_binaries, +} + + +try: + from wheel.bdist_wheel import bdist_wheel as orig_bdist_wheel +except ImportError: + pass +else: + class bdist_wheel(orig_bdist_wheel): + def finalize_options(self): + orig_bdist_wheel.finalize_options(self) + # Mark us as not a pure python package + self.root_is_pure = False + + def get_tag(self): + _, _, plat = orig_bdist_wheel.get_tag(self) + # We don't contain any python source, nor any python extensions + return 'py2.py3', 'none', plat + + command_overrides['bdist_wheel'] = bdist_wheel + -with io_open('README.md', 'rt', encoding='utf8') as fp: - readme = fp.read() - -with io_open(os_path.join('editorconfig_checker', '__init__.py'), 'rt', encoding='utf8') as fp: - version = re_search(r'__version__ = \'(.*?)\'', fp.read()).group(1) - -setup( - name='editorconfig-checker', - version=version, - url='https://editorconfig-checker.github.io', - project_urls={ - 'Documentation': 'https://editorconfig-checker.github.io', - 'Code': 'https://github.com/editorconfig-checker/editorconfig-checker.python', - 'Issue tracker': 'https://github.com/editorconfig-checker/editorconfig-checker/issues', - }, - license='MIT', - author='Marco M.', - author_email='mmicu.github00@gmail.com', - maintainer='Marco M., Max StrĂ¼bing', - maintainer_email='mmicu.github00@gmail.com, mxstrbng@gmail.com', - description='A tool to verify that your files are in harmony with your .editorconfig', - long_description=readme, - long_description_content_type='text/markdown', - classifiers=[ - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Topic :: Text Processing', - 'Topic :: Utilities' - ], - packages=['editorconfig_checker'], - include_package_data=True, - python_requires='>=2.7', - install_requires=[ - 'requests>=2.22' - ], - extras_require={ - 'dev': [ - 'flake8', - 'pycodestyle' - ] - }, - entry_points={ - 'console_scripts': [ - 'editorconfig-checker = editorconfig_checker.__main__:main' - ] - } -) +setup(version=WRAPPER_VERSION, cmdclass=command_overrides) From b3acc6f9c55c1d1f84f679c8fc3696a43acc0a1c Mon Sep 17 00:00:00 2001 From: Marco M Date: Sat, 7 Aug 2021 10:49:44 +0200 Subject: [PATCH 08/10] Update version to 2.3.52 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ac99af6..0975145 100644 --- a/setup.py +++ b/setup.py @@ -31,8 +31,8 @@ from urllib2 import urlopen +WRAPPER_VERSION = '2.3.52' EDITORCONFIG_CHECKER_CORE_VERSION = '2.3.5' -WRAPPER_VERSION = '2.3.51' EDITORCONFIG_CHECKER_EXE_NAME = 'ec' From c22c136171036079e9673d09ae0022ad88a28a19 Mon Sep 17 00:00:00 2001 From: Marco M Date: Sat, 7 Aug 2021 11:01:32 +0200 Subject: [PATCH 09/10] Remove "bdist_wheel" stage --- publish.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publish.sh b/publish.sh index 39f4fbe..56121bd 100644 --- a/publish.sh +++ b/publish.sh @@ -7,5 +7,5 @@ make test make clean # Build & publish (currently, we push the package under the username `mmicu_00`) -python3 setup.py sdist bdist_wheel +python3 setup.py sdist twine upload dist/* From ae50b417fbb4605e6781d1e68be945c2951b0be8 Mon Sep 17 00:00:00 2001 From: Marco M Date: Mon, 9 Aug 2021 14:16:01 +0200 Subject: [PATCH 10/10] Change editorconfig-checker entry --- .pre-commit-hooks.yaml | 2 +- README.md | 1 + setup.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index 87a618f..2e3157e 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -1,7 +1,7 @@ - id: editorconfig-checker name: editorconfig-checker description: '`editorconfig-checker` is a tool to check if your files consider your .editorconfig-rules.' - entry: editorconfig-checker + entry: ec language: python types: [text] require_serial: true diff --git a/README.md b/README.md index fc50cc5..7468674 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ repos: rev: '' # pick a git hash / tag to point to hooks: - id: editorconfig-checker + alias: ec ``` See the [pre-commit docs](https://pre-commit.com/#pre-commit-configyaml---hooks) to check how to customize this configuration. diff --git a/setup.py b/setup.py index 0975145..def4620 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ from urllib2 import urlopen -WRAPPER_VERSION = '2.3.52' +WRAPPER_VERSION = '2.3.53' EDITORCONFIG_CHECKER_CORE_VERSION = '2.3.5' EDITORCONFIG_CHECKER_EXE_NAME = 'ec'