ci: GHA basic format & pre-commit (#2309)

This commit is contained in:
Henry Schreiner 2020-07-20 13:35:21 -04:00 committed by GitHub
parent e248869893
commit d8c7ee00a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
60 changed files with 121 additions and 28 deletions

19
.github/workflows/format.yml vendored Normal file
View File

@ -0,0 +1,19 @@
name: Format
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
- stable
- "v*"
jobs:
pre-commit:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: pre-commit/action@v2.0.0

28
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,28 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.1.0
hooks:
- id: check-added-large-files
- id: check-case-conflict
- id: check-merge-conflict
- id: check-symlinks
- id: check-yaml
- id: debug-statements
- id: end-of-file-fixer
- id: mixed-line-ending
- id: requirements-txt-fixer
- id: trailing-whitespace
- id: fix-encoding-pragma
- repo: https://github.com/Lucas-C/pre-commit-hooks
rev: v1.1.7
hooks:
- id: remove-tabs
exclude: (Makefile|debian/rules|.gitmodules)(\.in)?$
- repo: https://gitlab.com/pycqa/flake8
rev: 3.8.2
hooks:
- id: flake8
additional_dependencies: [flake8-bugbear]
exclude: ^(docs/.*|tools/.*)$

View File

@ -27,11 +27,16 @@ adhere to the following rules to make the process as smooth as possible:
do add value by themselves. do add value by themselves.
* Add tests for any new functionality and run the test suite (``make pytest``) * Add tests for any new functionality and run the test suite (``make pytest``)
to ensure that no existing features break. to ensure that no existing features break.
* Please run ``flake8`` and ``tools/check-style.sh`` to check your code matches * Please run [``pre-commit``][pre-commit] and ``tools/check-style.sh`` to check
the project style. (Note that ``check-style.sh`` requires ``gawk``.) your code matches the project style. (Note that ``check-style.sh`` requires
``gawk``.) Use `pre-commit run --all-files` before committing (or use
installed-mode, check pre-commit docs) to verify your code passes before
pushing to save time.
* This project has a strong focus on providing general solutions using a * This project has a strong focus on providing general solutions using a
minimal amount of code, thus small pull requests are greatly preferred. minimal amount of code, thus small pull requests are greatly preferred.
[pre-commit]: https://pre-commit.com
### Licensing of contributions ### Licensing of contributions
pybind11 is provided under a BSD-style license that can be found in the pybind11 is provided under a BSD-style license that can be found in the

View File

@ -39,4 +39,3 @@ the last case of the above list.
chrono chrono
eigen eigen
custom custom

View File

@ -82,7 +82,7 @@ helper class that is defined as follows:
The macro :c:macro:`PYBIND11_OVERLOAD_PURE` should be used for pure virtual The macro :c:macro:`PYBIND11_OVERLOAD_PURE` should be used for pure virtual
functions, and :c:macro:`PYBIND11_OVERLOAD` should be used for functions which have functions, and :c:macro:`PYBIND11_OVERLOAD` should be used for functions which have
a default implementation. There are also two alternate macros a default implementation. There are also two alternate macros
:c:macro:`PYBIND11_OVERLOAD_PURE_NAME` and :c:macro:`PYBIND11_OVERLOAD_NAME` which :c:macro:`PYBIND11_OVERLOAD_PURE_NAME` and :c:macro:`PYBIND11_OVERLOAD_NAME` which
take a string-valued name argument between the *Parent class* and *Name of the take a string-valued name argument between the *Parent class* and *Name of the
function* slots, which defines the name of function in Python. This is required function* slots, which defines the name of function in Python. This is required
@ -1088,7 +1088,7 @@ Binding final classes
Some classes may not be appropriate to inherit from. In C++11, classes can Some classes may not be appropriate to inherit from. In C++11, classes can
use the ``final`` specifier to ensure that a class cannot be inherited from. use the ``final`` specifier to ensure that a class cannot be inherited from.
The ``py::is_final`` attribute can be used to ensure that Python classes The ``py::is_final`` attribute can be used to ensure that Python classes
cannot inherit from a specified type. The underlying C++ type does not need cannot inherit from a specified type. The underlying C++ type does not need
to be declared final. to be declared final.

View File

@ -218,7 +218,7 @@ collected:
Both approaches also expose a potentially dangerous ``_cleanup`` attribute in Both approaches also expose a potentially dangerous ``_cleanup`` attribute in
Python, which may be undesirable from an API standpoint (a premature explicit Python, which may be undesirable from an API standpoint (a premature explicit
call from Python might lead to undefined behavior). Yet another approach that call from Python might lead to undefined behavior). Yet another approach that
avoids this issue involves weak reference with a cleanup callback: avoids this issue involves weak reference with a cleanup callback:
.. code-block:: cpp .. code-block:: cpp
@ -283,9 +283,9 @@ work, it is important that all lines are indented consistently, i.e.:
---------- ----------
)mydelimiter"); )mydelimiter");
By default, pybind11 automatically generates and prepends a signature to the docstring of a function By default, pybind11 automatically generates and prepends a signature to the docstring of a function
registered with ``module::def()`` and ``class_::def()``. Sometimes this registered with ``module::def()`` and ``class_::def()``. Sometimes this
behavior is not desirable, because you want to provide your own signature or remove behavior is not desirable, because you want to provide your own signature or remove
the docstring completely to exclude the function from the Sphinx documentation. the docstring completely to exclude the function from the Sphinx documentation.
The class ``options`` allows you to selectively suppress auto-generated signatures: The class ``options`` allows you to selectively suppress auto-generated signatures:
@ -298,8 +298,8 @@ The class ``options`` allows you to selectively suppress auto-generated signatur
m.def("add", [](int a, int b) { return a + b; }, "A function which adds two numbers"); m.def("add", [](int a, int b) { return a + b; }, "A function which adds two numbers");
} }
Note that changes to the settings affect only function bindings created during the Note that changes to the settings affect only function bindings created during the
lifetime of the ``options`` instance. When it goes out of scope at the end of the module's init function, lifetime of the ``options`` instance. When it goes out of scope at the end of the module's init function,
the default settings are restored to prevent unwanted side effects. the default settings are restored to prevent unwanted side effects.
.. [#f4] http://www.sphinx-doc.org .. [#f4] http://www.sphinx-doc.org

View File

@ -60,7 +60,7 @@ This example obtains a reference to the Python ``Decimal`` class.
Calling Python functions Calling Python functions
======================== ========================
It is also possible to call Python classes, functions and methods It is also possible to call Python classes, functions and methods
via ``operator()``. via ``operator()``.
.. code-block:: cpp .. code-block:: cpp
@ -75,7 +75,7 @@ via ``operator()``.
py::object makedirs = os.attr("makedirs"); py::object makedirs = os.attr("makedirs");
makedirs("/tmp/path/to/somewhere"); makedirs("/tmp/path/to/somewhere");
One can convert the result obtained from Python to a pure C++ version One can convert the result obtained from Python to a pure C++ version
if a ``py::class_`` or type conversion is defined. if a ``py::class_`` or type conversion is defined.
.. code-block:: cpp .. code-block:: cpp
@ -99,8 +99,8 @@ Python method.
py::print(py::str(exp_pi)); py::print(py::str(exp_pi));
In the example above ``pi.attr("exp")`` is a *bound method*: it will always call In the example above ``pi.attr("exp")`` is a *bound method*: it will always call
the method for that same instance of the class. Alternately one can create an the method for that same instance of the class. Alternately one can create an
*unbound method* via the Python class (instead of instance) and pass the ``self`` *unbound method* via the Python class (instead of instance) and pass the ``self``
object explicitly, followed by other arguments. object explicitly, followed by other arguments.
.. code-block:: cpp .. code-block:: cpp

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import random import random
import os import os
import time import time

View File

@ -93,5 +93,3 @@ favor.
.. only:: latex .. only:: latex
.. image:: pybind11_vs_boost_python2.png .. image:: pybind11_vs_boost_python2.png

View File

@ -130,8 +130,8 @@ if not on_rtd: # only import and set the theme if we're building docs locally
else: else:
html_context = { html_context = {
'css_files': [ 'css_files': [
'//media.readthedocs.org/css/sphinx_rtd_theme.css', '//media.readthedocs.org/css/sphinx_rtd_theme.css',
'//media.readthedocs.org/css/readthedocs-doc-embed.css', '//media.readthedocs.org/css/readthedocs-doc-embed.css',
'_static/theme_overrides.css' '_static/theme_overrides.css'
] ]
} }

View File

@ -17,4 +17,3 @@ These features could be implemented but would lead to a significant increase in
complexity. I've decided to draw the line here to keep this project simple and complexity. I've decided to draw the line here to keep this project simple and
compact. Users who absolutely require these features are encouraged to fork compact. Users who absolutely require these features are encouraged to fork
pybind11. pybind11.

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from ._version import version_info, __version__ # noqa: F401 imported but unused from ._version import version_info, __version__ # noqa: F401 imported but unused

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from __future__ import print_function from __future__ import print_function
import argparse import argparse

View File

@ -1,2 +1,3 @@
# -*- coding: utf-8 -*-
version_info = (2, 5, 'dev1') version_info = (2, 5, 'dev1')
__version__ = '.'.join(map(str, version_info)) __version__ = '.'.join(map(str, version_info))

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
# Setup script for PyPI; use CMakeFile.txt to build extension modules # Setup script for PyPI; use CMakeFile.txt to build extension modules

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
"""pytest configuration """pytest configuration
Extends output capture as needed by pybind11: ignore constructors, optional unordered lines. Extends output capture as needed by pybind11: ignore constructors, optional unordered lines.

View File

@ -273,4 +273,3 @@ template <class T, typename... Values> void print_values(T *inst, Values &&...va
print_constr_details(inst, ":", values...); print_constr_details(inst, ":", values...);
track_values(inst, values...); track_values(inst, values...);
} }

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import asyncio import asyncio
import pytest import pytest
from pybind11_tests import async_module as m from pybind11_tests import async_module as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import io import io
import struct import struct
import sys import sys

View File

@ -1,4 +1,4 @@
# Python < 3 needs this: coding=utf-8 # -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import builtin_casters as m from pybind11_tests import builtin_casters as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import call_policies as m from pybind11_tests import call_policies as m
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import callbacks as m from pybind11_tests import callbacks as m
from threading import Thread from threading import Thread

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from pybind11_tests import chrono as m from pybind11_tests import chrono as m
import datetime import datetime

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import class_ as m from pybind11_tests import class_ as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import sys import sys
import test_cmake_build import test_cmake_build

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from pybind11_tests import constants_and_functions as m from pybind11_tests import constants_and_functions as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import copy_move_policies as m from pybind11_tests import copy_move_policies as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import custom_type_casters as m from pybind11_tests import custom_type_casters as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from pybind11_tests import docstring_options as m from pybind11_tests import docstring_options as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats
@ -143,7 +144,7 @@ def test_nonunit_stride_from_python():
counting_3d = np.arange(27.0, dtype=np.float32).reshape((3, 3, 3)) counting_3d = np.arange(27.0, dtype=np.float32).reshape((3, 3, 3))
slices = [counting_3d[0, :, :], counting_3d[:, 0, :], counting_3d[:, :, 0]] slices = [counting_3d[0, :, :], counting_3d[:, 0, :], counting_3d[:, :, 0]]
for slice_idx, ref_mat in enumerate(slices): for ref_mat in slices:
np.testing.assert_array_equal(m.double_mat_cm(ref_mat), 2.0 * ref_mat) np.testing.assert_array_equal(m.double_mat_cm(ref_mat), 2.0 * ref_mat)
np.testing.assert_array_equal(m.double_mat_rm(ref_mat), 2.0 * ref_mat) np.testing.assert_array_equal(m.double_mat_rm(ref_mat), 2.0 * ref_mat)
@ -172,7 +173,7 @@ def test_negative_stride_from_python(msg):
counting_3d = np.arange(27.0, dtype=np.float32).reshape((3, 3, 3)) counting_3d = np.arange(27.0, dtype=np.float32).reshape((3, 3, 3))
counting_3d = counting_3d[::-1, ::-1, ::-1] counting_3d = counting_3d[::-1, ::-1, ::-1]
slices = [counting_3d[0, :, :], counting_3d[:, 0, :], counting_3d[:, :, 0]] slices = [counting_3d[0, :, :], counting_3d[:, 0, :], counting_3d[:, :, 0]]
for slice_idx, ref_mat in enumerate(slices): for ref_mat in slices:
np.testing.assert_array_equal(m.double_mat_cm(ref_mat), 2.0 * ref_mat) np.testing.assert_array_equal(m.double_mat_cm(ref_mat), 2.0 * ref_mat)
np.testing.assert_array_equal(m.double_mat_rm(ref_mat), 2.0 * ref_mat) np.testing.assert_array_equal(m.double_mat_rm(ref_mat), 2.0 * ref_mat)

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from widget_module import Widget from widget_module import Widget

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import enums as m from pybind11_tests import enums as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import os import os
import pytest import pytest
from pybind11_tests import eval_ as m from pybind11_tests import eval_ as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# This file is called from 'test_eval.py' # This file is called from 'test_eval.py'
if 'call_test2' in locals(): if 'call_test2' in locals():

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import exceptions as m from pybind11_tests import exceptions as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
import re import re

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import multiprocessing import multiprocessing
import threading import threading
from pybind11_tests import gil_scoped as m from pybind11_tests import gil_scoped as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from pybind11_tests import iostream as m from pybind11_tests import iostream as m
import sys import sys

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import kwargs_and_defaults as m from pybind11_tests import kwargs_and_defaults as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import local_bindings as m from pybind11_tests import local_bindings as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import methods_and_attributes as m from pybind11_tests import methods_and_attributes as m
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from pybind11_tests import modules as m from pybind11_tests import modules as m
from pybind11_tests.modules import subsubmodule as ms from pybind11_tests.modules import subsubmodule as ms
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats
from pybind11_tests import multiple_inheritance as m from pybind11_tests import multiple_inheritance as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import numpy_array as m from pybind11_tests import numpy_array as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import re import re
import pytest import pytest
from pybind11_tests import numpy_dtypes as m from pybind11_tests import numpy_dtypes as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import numpy_vectorize as m from pybind11_tests import numpy_vectorize as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import opaque_types as m from pybind11_tests import opaque_types as m
from pybind11_tests import ConstructorStats, UserType from pybind11_tests import ConstructorStats, UserType

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import operators as m from pybind11_tests import operators as m
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import pickling as m from pybind11_tests import pickling as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from __future__ import division from __future__ import division
import pytest import pytest
import sys import sys

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import sequences_and_iterators as m from pybind11_tests import sequences_and_iterators as m
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import smart_ptr as m from pybind11_tests import smart_ptr as m
from pybind11_tests import ConstructorStats from pybind11_tests import ConstructorStats

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import stl as m from pybind11_tests import stl as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
import sys import sys
from pybind11_tests import stl_binders as m from pybind11_tests import stl_binders as m
@ -222,7 +223,8 @@ def test_noncopyable_containers():
for j in range(0, 5): for j in range(0, 5):
assert nvnc[i][j].value == j + 1 assert nvnc[i][j].value == j + 1
for k, v in nvnc.items(): # Note: maps do not have .values()
for _, v in nvnc.items():
for i, j in enumerate(v, start=1): for i, j in enumerate(v, start=1):
assert j.value == i assert j.value == i
@ -233,7 +235,7 @@ def test_noncopyable_containers():
assert nmnc[i][j].value == 10 * j assert nmnc[i][j].value == 10 * j
vsum = 0 vsum = 0
for k_o, v_o in nmnc.items(): for _, v_o in nmnc.items():
for k_i, v_i in v_o.items(): for k_i, v_i in v_o.items():
assert v_i.value == 10 * k_i assert v_i.value == 10 * k_i
vsum += v_i.value vsum += v_i.value
@ -247,7 +249,7 @@ def test_noncopyable_containers():
assert numnc[i][j].value == 10 * j assert numnc[i][j].value == 10 * j
vsum = 0 vsum = 0
for k_o, v_o in numnc.items(): for _, v_o in numnc.items():
for k_i, v_i in v_o.items(): for k_i, v_i in v_o.items():
assert v_i.value == 10 * k_i assert v_i.value == 10 * k_i
vsum += v_i.value vsum += v_i.value

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from pybind11_tests import tagbased_polymorphic as m from pybind11_tests import tagbased_polymorphic as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from pybind11_tests import union_ as m from pybind11_tests import union_ as m

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
from pybind11_tests import virtual_functions as m from pybind11_tests import virtual_functions as m

View File

@ -78,4 +78,3 @@ else (EIGEN3_INCLUDE_DIR)
mark_as_advanced(EIGEN3_INCLUDE_DIR) mark_as_advanced(EIGEN3_INCLUDE_DIR)
endif(EIGEN3_INCLUDE_DIR) endif(EIGEN3_INCLUDE_DIR)

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, division from __future__ import print_function, division
import os import os
import sys import sys
@ -35,4 +36,3 @@ else:
with open(save, 'w') as sf: with open(save, 'w') as sf:
sf.write(str(libsize)) sf.write(str(libsize))

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
# #
# Syntax: mkdoc.py [-I<path> ..] [.. a list of header files ..] # Syntax: mkdoc.py [-I<path> ..] [.. a list of header files ..]
# #