diff --git a/.gitignore b/.gitignore index 525f2e2..fe450ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ .DS_Store .idea sphinx_presentation/build/ +sphinx_presentation/source/_build/ + +__pycache__ +.nox diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..dc81e8c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,39 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: "v4.4.0" + hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-symlinks + - id: check-yaml + exclude: test_recipes/bitarray/meta.yaml + - id: debug-statements + - id: end-of-file-fixer + - id: mixed-line-ending + - id: name-tests-test + args: ["--pytest-test-first"] + - id: requirements-txt-fixer + - id: trailing-whitespace + + - repo: https://github.com/psf/black + rev: "23.1.0" + hooks: + - id: black + + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: "v0.0.252" + hooks: + - id: ruff + + - repo: https://github.com/codespell-project/codespell + rev: "v2.2.2" + hooks: + - id: codespell + + - repo: https://github.com/pre-commit/pygrep-hooks + rev: "v1.10.0" + hooks: + - id: rst-backticks + - id: rst-directive-colons + - id: rst-inline-touching-normal diff --git a/CHANGES.rst b/CHANGES.rst index 171177e..29cba9c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -18,9 +18,9 @@ The sections are ordered from most recent to the oldest. Better handling data file in :ref:`setup_py_exercise_small_example_package` section ----------------------------------------------------------------------------------- -* Put package data in `data` directory. +* Put package data in ``data`` directory. * Reflect this change in the code. -* Add `package_data` to setup function. +* Add ``package_data`` to setup function. 2018-07 @@ -38,6 +38,4 @@ Making a Python Package Building and Uploading to PyPI ------------------------------ -* Update `Installing a wheel` tutorial adding :ref:`Install a package from TestPyPI ` section. - - +* Update ``Installing a wheel`` tutorial adding :ref:`Install a package from TestPyPI ` section. diff --git a/LICENSE b/LICENSE index abe0eac..b31879a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,13 +1,13 @@ This repository contain the materials for a tutorial. - + The code is licences under the Apache licence, version 2.0. - + Text and other non-code written materials are licenced under the Creative Commons Attribution-ShareAlike 4.0 International licence. - + Text of both licenses below: - - + + Apache License ============== Version 2.0, January 2004 @@ -531,8 +531,8 @@ Section 8 – Interpretation. --------------------------- a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully be mad without permission under this Public License. b. To the extent possible, if any provision of this Public License is @@ -548,5 +548,5 @@ Section 8 – Interpretation. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal + that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. diff --git a/README.md b/README.md index 9a09bba..aff0479 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ anaconda upload /Users/msarahan/miniconda3/conda-bld/osx-64/bitarray-0.8.1-py36h anaconda_upload is not set. Not uploading wheels: [] #################################################################################### -Resoource usage summary: +Resource usage summary: Total time: 0:00:36.9 CPU usage: sys=0:00:00.2, user=0:00:00.2 diff --git a/conda_build_recipes/03_copy_file/bld.bat b/conda_build_recipes/03_copy_file/bld.bat index 576c301..f91ba5a 100644 --- a/conda_build_recipes/03_copy_file/bld.bat +++ b/conda_build_recipes/03_copy_file/bld.bat @@ -1 +1 @@ -COPY somefile.txt %PREFIX% \ No newline at end of file +COPY somefile.txt %PREFIX% diff --git a/conda_build_recipes/04_python_in_build/bld.bat b/conda_build_recipes/04_python_in_build/bld.bat index d96252f..48057d2 100644 --- a/conda_build_recipes/04_python_in_build/bld.bat +++ b/conda_build_recipes/04_python_in_build/bld.bat @@ -1 +1 @@ -COPY somefile.py %SP_DIR% \ No newline at end of file +COPY somefile.py %SP_DIR% diff --git a/conda_build_recipes/05_test_python/bld.bat b/conda_build_recipes/05_test_python/bld.bat index d96252f..48057d2 100644 --- a/conda_build_recipes/05_test_python/bld.bat +++ b/conda_build_recipes/05_test_python/bld.bat @@ -1 +1 @@ -COPY somefile.py %SP_DIR% \ No newline at end of file +COPY somefile.py %SP_DIR% diff --git a/conda_build_recipes/06_has_run_exports/meta.yaml b/conda_build_recipes/06_has_run_exports/meta.yaml index eb09ba4..8e0a856 100644 --- a/conda_build_recipes/06_has_run_exports/meta.yaml +++ b/conda_build_recipes/06_has_run_exports/meta.yaml @@ -4,4 +4,4 @@ package: build: run_exports: - - {{ pin_subpackage("has_run_exports") }} + - '{{ pin_subpackage("has_run_exports") }}' diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 0000000..6a6fee8 --- /dev/null +++ b/noxfile.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +import nox + + +@nox.session(reuse_venv=True) +def docs(session: nox.Session) -> None: + """ + Build the docs. Pass "serve" to serve. + """ + + session.install("-r", "sphinx_presentation/requirements.txt") + session.chdir("sphinx_presentation/source") + + if "pdf" in session.posargs: + session.run("sphinx-build", "-M", "latexpdf", ".", "_build") + return + + session.run("sphinx-build", "-M", "html", ".", "_build") + + if "serve" in session.posargs: + session.log("Launching docs at http://localhost:8000/ - use Ctrl-C to quit") + session.run("python", "-m", "http.server", "8000", "-d", "_build/html") + elif session.posargs: + session.error("Unsupported argument to docs") diff --git a/setup_example/capitalize/capitalize/cap_data.txt b/setup_example/capitalize/capitalize/cap_data.txt index 10bbc59..d2e8e48 100644 --- a/setup_example/capitalize/capitalize/cap_data.txt +++ b/setup_example/capitalize/capitalize/cap_data.txt @@ -1,7 +1,7 @@ # list of words that don't get capitalized is -or +or a the it -to \ No newline at end of file +to diff --git a/setup_example/capitalize/capitalize/capital_mod.py b/setup_example/capitalize/capitalize/capital_mod.py index 66ddd6d..ef635fe 100644 --- a/setup_example/capitalize/capitalize/capital_mod.py +++ b/setup_example/capitalize/capitalize/capital_mod.py @@ -14,13 +14,13 @@ def load_special_words(data_file_name, words=None): from the data file in the package data file is a text file with one work per line - the # charactor is a comment -- everything after it will be ignored + the # character is a comment -- everything after it will be ignored """ words = set() if words is None else words with open(data_file_name) as data_file: for line in data_file: - word = line.split('#')[0].strip() + word = line.split("#")[0].strip() if word: words.add(word.lower()) return words @@ -45,7 +45,7 @@ def capitalize_line(instr, special_words=special_words): :type instr: string :param special_words: set of words that should not be capitalized - defaults to the words in the encosed data file + defaults to the words in the enclosed data file :type special_words: set of str :returns: a capitalized version of instr @@ -83,8 +83,8 @@ def capitalize(infilename, outfilename): :raises: IOError if infilename doesn't exist. """ - infile = open(infilename, 'U') - outfile = open(outfilename, 'w') + infile = open(infilename, "U") + outfile = open(outfilename, "w") for line in infile: outfile.write(capitalize_line(line)) diff --git a/setup_example/capitalize/capitalize/test/test_capital_mod.py b/setup_example/capitalize/capitalize/test/test_capital_mod.py index c6f16c7..f97a3c8 100644 --- a/setup_example/capitalize/capitalize/test/test_capital_mod.py +++ b/setup_example/capitalize/capitalize/test/test_capital_mod.py @@ -13,8 +13,9 @@ import capital_mod + # fixture that creates and removes a file with special words in it -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def special_words_path(): """ fixture to generate a special words file to test reading @@ -25,35 +26,37 @@ def special_words_path(): # A couple words for the file words = ["in", "As", "the"] temp_path = Path("special_words_file") - with open(temp_path, 'w') as outfile: + with open(temp_path, "w") as outfile: for word in words: outfile.write(word + "\n") # test comments, too: outfile.write("# random stuff") outfile.write(" in # comment after a word\n") - # the file wil be created and filled, then the path passed on + # the file will be created and filled, then the path passed on yield temp_path # at "teardown", the file will be removed os.remove(temp_path) # fixture that creates and removes a file with some test lines in it. -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def test_file_path(): """ Fixture to generate a file with some sample data in it """ # A couple words for the file temp_path = Path("input_test_file.txt") - with open(temp_path, 'w') as outfile: - outfile.write("""This is a really simple Text file. + with open(temp_path, "w") as outfile: + outfile.write( + """This is a really simple Text file. It is here so that I can test the capitalize script. And that's only there to try out packaging. So there. -""") - # the file wil be created and filled, then the path passed on +""" + ) + # the file will be created and filled, then the path passed on yield temp_path # at "teardown", the file will be removed os.remove(temp_path) @@ -70,15 +73,16 @@ def test_load_special_words(special_words_path): def test_capitalize_line(): - special = {'is', 'a', 'to'} - line = "this is a Line to capitalize" + special = {"is", "a", "to"} + line = "this is a Line to capitalize" expected = "This is a Line to Capitalize" result = capital_mod.capitalize_line(line, special_words=special) - assert result == expected + assert result == expected + def test_capitalize(test_file_path): - """ test an actual file """ + """test an actual file""" p = test_file_path new_file_path = (p.parent / (p.stem + "_cap")).with_suffix(p.suffix) @@ -92,7 +96,4 @@ def test_capitalize(test_file_path): And That's Only There to Try Out Packaging. So There.""" - assert contents.strip() == expected - - - + assert contents.strip() == expected diff --git a/sphinx_presentation/Makefile b/sphinx_presentation/Makefile index f122f0d..94e8cda 100644 --- a/sphinx_presentation/Makefile +++ b/sphinx_presentation/Makefile @@ -17,4 +17,4 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/sphinx_presentation/README.rst b/sphinx_presentation/README.rst index 75d23ff..85ef5ff 100644 --- a/sphinx_presentation/README.rst +++ b/sphinx_presentation/README.rst @@ -35,7 +35,7 @@ Thanks to the integration of this GitHub project with readthedocs, this happens automatically after the ``master`` branch is updated. Historically, the website was only updated if a contributor was locally generating -the associated web pages and commiting them on the `gh-pages` branch. +the associated web pages and committing them on the ``gh-pages`` branch. Building the slides diff --git a/sphinx_presentation/requirements.txt b/sphinx_presentation/requirements.txt index f4c15c3..8ffbf2a 100644 --- a/sphinx_presentation/requirements.txt +++ b/sphinx_presentation/requirements.txt @@ -1,2 +1,3 @@ +furo hieroglyph sphinx diff --git a/sphinx_presentation/slides2rst.py b/sphinx_presentation/slides2rst.py index c0373f8..4580608 100755 --- a/sphinx_presentation/slides2rst.py +++ b/sphinx_presentation/slides2rst.py @@ -17,7 +17,7 @@ rst.append("") # find end of title page: line = inlines.pop(0) -while line.strip() != '1': +while line.strip() != "1": rst.append(line) line = inlines.pop(0) @@ -44,22 +44,17 @@ rst.append("-" * len(header)) # content is the stuff above it - for line in inlines[:start_ind - 1]: + for line in inlines[: start_ind - 1]: rst.append(line) # footer is the stuff in between rst.append("") - for line in inlines[start_ind + 1:end_ind]: + for line in inlines[start_ind + 1 : end_ind]: rst.append(line) # clear it all out: - del inlines[:end_ind + 1] + del inlines[: end_ind + 1] # and clear out any empty lines while inlines and (not inlines[0].strip()): del inlines[0] - - - - -open(outfilename, 'w').write("\n".join(rst)) - +open(outfilename, "w").write("\n".join(rst)) diff --git a/sphinx_presentation/source/binaries_dependencies.rst b/sphinx_presentation/source/binaries_dependencies.rst index 9287335..3f385f1 100644 --- a/sphinx_presentation/source/binaries_dependencies.rst +++ b/sphinx_presentation/source/binaries_dependencies.rst @@ -16,7 +16,7 @@ In this section we will ... *headers, libraries, compilers, linkers, build systems, system introspection tools, package managers* * Understand basic requirements for binary compatibility: a) **C-runtime library - compatibility** and b) **shared library compatibilty** + compatibility** and b) **shared library compatibility** * Understand **scikit-build**'s role in coordinating components of the binary build process and **conda**'s role in resolving dependencies and creating compatible platform binaries @@ -39,7 +39,7 @@ Tutorial Within this the context, we explain how *scikit-build* and *conda-build* make life easier when we want to satisfy these requirements. - Finally, run an exercise where we build a native Python wth native binaries + Finally, run an exercise where we build a native Python with native binaries package and analyze the different stages of the build process. Motivation @@ -55,7 +55,7 @@ domains because of the: In order to achieve **high performance**, programs can: -1. **Minimized the number of operations** on the CPU required to acheive a certain +1. **Minimized the number of operations** on the CPU required to achieve a certain task 2. **Execute in parallel** to leverage multi-core, many-core, and GPGPU system architectures @@ -179,7 +179,7 @@ available for the build.* build host artifacts These are files required on the *host* system performing the build. This - includes **header files**, `*.h` files, which define the C program **symbols**, + includes **header files**, ``*.h`` files, which define the C program **symbols**, i.e. variable and function names, for the native binary with which we want to integrate. This also usually includes the native binaries themselves, i.e. the **executable or shared library**. An important exception to this rule @@ -248,15 +248,15 @@ packages. .. nextslide:: The C-runtime on macOS is determined by a build time option, the *osx -deployment target*, which defines the minmum version of macOS to support, e.g. -`10.9`. +deployment target*, which defines the minimum version of macOS to support, e.g. +``10.9``. A macOS system comes with support for running building binaries for its version of OSX and older versions of OSX. The XCode toolchain comes with SDK's that support multiple target versions of OSX. -When building a wheel, this can be specified with `--plat-name`:: +When building a wheel, this can be specified with ``--plat-name``:: python setup.py bdist_wheel --plat-name macosx-10.6-x86_64 @@ -303,7 +303,7 @@ build requirements. .. nextslide:: The **scikit-build** package is fundamentally just glue between -the `setuptools` Python module and `CMake `_. +the ``setuptools`` Python module and `CMake `_. .. nextslide:: diff --git a/sphinx_presentation/source/changes.rst b/sphinx_presentation/source/changes.rst index 1cb32f6..d76c92b 100644 --- a/sphinx_presentation/source/changes.rst +++ b/sphinx_presentation/source/changes.rst @@ -1 +1 @@ -.. include:: ../../CHANGES.rst \ No newline at end of file +.. include:: ../../CHANGES.rst diff --git a/sphinx_presentation/source/conda.rst b/sphinx_presentation/source/conda.rst index 357638d..b5be7a9 100644 --- a/sphinx_presentation/source/conda.rst +++ b/sphinx_presentation/source/conda.rst @@ -47,7 +47,7 @@ Introducing conda-build https://github.com/conda/conda-build -Excercise: let’s use ``conda-build`` +Exercise: let’s use ``conda-build`` ------------------------------------ .. code-block:: bash diff --git a/sphinx_presentation/source/conf.py b/sphinx_presentation/source/conf.py index b8ae3a4..7776556 100644 --- a/sphinx_presentation/source/conf.py +++ b/sphinx_presentation/source/conf.py @@ -19,14 +19,14 @@ # -- Project information ----------------------------------------------------- -project = 'The Joy of Packaging' -copyright = '2018, Assorted' -author = 'Assorted' +project = "The Joy of Packaging" +copyright = "2018, Assorted" +author = "Assorted" # The short X.Y version -version = '' +version = "" # The full version, including alpha/beta/rc tags -release = '0.1' +release = "0.1" # -- General configuration --------------------------------------------------- @@ -39,28 +39,28 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.githubpages', - 'hieroglyph', + "sphinx.ext.githubpages", + "hieroglyph", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The master toctree document. -master_doc = 'index' +master_doc = "index" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -68,7 +68,7 @@ exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # -- Options for HTML output ------------------------------------------------- @@ -76,7 +76,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "furo" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -103,7 +103,7 @@ # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. -htmlhelp_basename = 'TheJoyofPackagingdoc' +htmlhelp_basename = "TheJoyofPackagingdoc" # -- Options for LaTeX output ------------------------------------------------ @@ -112,15 +112,12 @@ # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # # 'preamble': '', - # Latex figure (float) alignment # # 'figure_align': 'htbp', @@ -130,8 +127,13 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'TheJoyofPackaging.tex', 'The Joy of Packaging Documentation', - 'Assorted', 'manual'), + ( + master_doc, + "TheJoyofPackaging.tex", + "The Joy of Packaging Documentation", + "Assorted", + "manual", + ), ] @@ -140,8 +142,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'thejoyofpackaging', 'The Joy of Packaging Documentation', - [author], 1) + (master_doc, "thejoyofpackaging", "The Joy of Packaging Documentation", [author], 1) ] @@ -151,10 +152,16 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'TheJoyofPackaging', 'The Joy of Packaging Documentation', - author, 'TheJoyofPackaging', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "TheJoyofPackaging", + "The Joy of Packaging Documentation", + author, + "TheJoyofPackaging", + "One line description of project.", + "Miscellaneous", + ), ] -# -- Extension configuration ------------------------------------------------- \ No newline at end of file +# -- Extension configuration ------------------------------------------------- diff --git a/sphinx_presentation/source/index.rst b/sphinx_presentation/source/index.rst index bb6fe23..f7d3070 100644 --- a/sphinx_presentation/source/index.rst +++ b/sphinx_presentation/source/index.rst @@ -1,7 +1,7 @@ .. The Joy of Packaging documentation master file, created by sphinx-quickstart on Fri Jul 6 14:55:10 2018. You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. + contain the root ``toctree`` directive. *************************** The Sheer Joy of Packaging! @@ -85,4 +85,3 @@ Jonathan Helmus: .. * :ref:`genindex` .. * :ref:`modindex` .. * :ref:`search` - diff --git a/sphinx_presentation/source/schedule.rst b/sphinx_presentation/source/schedule.rst index 9d9f26d..9323a50 100644 --- a/sphinx_presentation/source/schedule.rst +++ b/sphinx_presentation/source/schedule.rst @@ -105,7 +105,7 @@ Clone that repo now -- so you can follow along. *headers, libraries, compilers, linkers, build systems, system introspection tools, package managers* * Basic requirements for binary compatibility: a) **C-runtime library - compatibility** and b) **shared library compatibilty** + compatibility** and b) **shared library compatibility** * Joyous tools: **scikit-build**'s role in coordinating components of the binary build process and **conda**'s role in resolving dependencies and creating compatible platform binaries @@ -171,4 +171,3 @@ CI service overview & Conda-forge -- what are the pieces and how do they fit tog * Example to go from the conda-skeleton to a PR on staged-recipes * Comment on some special cases: cython extensions, non-python pkgs, the use of the CIs, etc. * Exercise: put a package on staged-recipes - diff --git a/sphinx_presentation/source/setup_py.rst b/sphinx_presentation/source/setup_py.rst index d75bb6d..4986d85 100644 --- a/sphinx_presentation/source/setup_py.rst +++ b/sphinx_presentation/source/setup_py.rst @@ -708,7 +708,7 @@ And try it:: FileNotFoundError: [Errno 2] No such file or directory: '.../capitalize/cap_data.txt' Our script cannot find the data file. We changed it's location but not the path -in the `capital_mod.py`. +in the ``capital_mod.py``. Let's fix this. On line 32 replace:: @@ -872,5 +872,3 @@ Break time! ----------- Up next: producing redistributable artifacts - - diff --git a/sphinx_presentation/source/uploading_pypi.rst b/sphinx_presentation/source/uploading_pypi.rst index b4b6407..6f65cb2 100644 --- a/sphinx_presentation/source/uploading_pypi.rst +++ b/sphinx_presentation/source/uploading_pypi.rst @@ -485,4 +485,3 @@ And one written by the author of the opinionated blog post above: https://github.com/ionelmc/cookiecutter-pylibrary Either are great starting points. - diff --git a/test_recipes/hello-cython/hello/__main__.py b/test_recipes/hello-cython/hello/__main__.py index 59019cf..c229bec 100644 --- a/test_recipes/hello-cython/hello/__main__.py +++ b/test_recipes/hello-cython/hello/__main__.py @@ -1,4 +1,4 @@ - if __name__ == "__main__": from . import _hello as hello + hello.hello("World") diff --git a/test_recipes/hello-cython/hello/_hello.pyx b/test_recipes/hello-cython/hello/_hello.pyx index 1ae0086..4c237b7 100644 --- a/test_recipes/hello-cython/hello/_hello.pyx +++ b/test_recipes/hello-cython/hello/_hello.pyx @@ -6,4 +6,3 @@ cpdef void hello(str strArg): cpdef long size(): "Returns elevation of Nevado Sajama." return 21463L - diff --git a/test_recipes/hello-cython/setup.py b/test_recipes/hello-cython/setup.py index 1618a2d..8e7d049 100644 --- a/test_recipes/hello-cython/setup.py +++ b/test_recipes/hello-cython/setup.py @@ -4,8 +4,8 @@ name="hello-cython", version="1.2.3", description="a minimal example package (cython version)", - author='The scikit-build team', + author="The scikit-build team", license="MIT", - packages=['hello_cython'], - package_dir={'hello_cython': 'hello'}, + packages=["hello_cython"], + package_dir={"hello_cython": "hello"}, )