diff --git a/CHANGELOG.md b/CHANGELOG.md index 949c3856..5b22b7a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ ### Changed +* Moved to src/ based layout for generated packages * Moved from setup.cfg/.py to pyproject.toml [#351](https://github.com/NLeSC/python-template/issues/351) * Moved from prospector to ruff [#336](https://github.com/NLeSC/python-template/issues/336) * Renamed `project_name` to `directory_name` in cookiecutter questionnaire diff --git a/README.md b/README.md index b48dc112..e23cebc9 100644 --- a/README.md +++ b/README.md @@ -89,19 +89,6 @@ Good job! You have now generated the skeleton for your package: ```text my-python-project/ -├── CHANGELOG.md -├── CITATION.cff -├── CODE_OF_CONDUCT.md -├── CONTRIBUTING.md -├── docs -│ ├── conf.py -│ ├── index.rst -│ ├── make.bat -│ ├── Makefile -│ ├── _static -│ │ └── theme_overrides.css -│ └── _templates -│ └── .gitignore ├── .editorconfig ├── .githooks │ └── pre-commit @@ -115,26 +102,37 @@ my-python-project/ │ └── workflows │ ├── build.yml │ ├── cffconvert.yml -│ ├── lint.yml +│ ├── documentation.yml │ ├── markdown-link-check.yml │ ├── next_steps.yml │ └── sonarcloud.yml ├── .gitignore +├── .mlc-config.json +├── .readthedocs.yaml +├── CHANGELOG.md +├── CITATION.cff +├── CODE_OF_CONDUCT.md +├── CONTRIBUTING.md ├── LICENSE ├── MANIFEST.in -├── .mlc-config.json -├── my_python_package -│ ├── __init__.py -│ ├── my_module.py -│ └── __version__.py -├── next_steps.md ├── NOTICE -├── project_setup.md -├── .pylintrc -├── pyproject.toml ├── README.dev.md ├── README.md +├── docs +│ ├── Makefile +│ ├── _templates +│ │ └── .gitignore +│ ├── conf.py +│ ├── index.rst +│ └── make.bat +├── next_steps.md +├── project_setup.md +├── pyproject.toml ├── sonar-project.properties +├── src +│ └── my_python_package +│ ├── __init__.py +│ └── my_module.py └── tests ├── __init__.py └── test_my_module.py diff --git a/tests/test_project.py b/tests/test_project.py index 399dd799..c594fe46 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -83,11 +83,11 @@ def test_subpackage(baked_with_development_dependencies, project_env_bin_dir): """Test if subpackages end up in (wheel) distributions""" project_dir = baked_with_development_dependencies bin_dir = project_env_bin_dir - subpackage = (project_dir / 'my_python_package' / 'mysub') + subpackage = (project_dir / 'src' / 'my_python_package' / 'mysub') subpackage.mkdir() (subpackage / '__init__.py').write_text('FOO = "bar"\n', encoding="utf-8") - subsubpackage = (project_dir / 'my_python_package' / 'mysub' / 'mysub2') + subsubpackage = (project_dir / 'src' / 'my_python_package' / 'mysub' / 'mysub2') subsubpackage.mkdir() (subsubpackage / '__init__.py').write_text('FOO = "bar"\n', encoding="utf-8") @@ -179,7 +179,7 @@ def test_bumpversion(baked_with_development_dependencies, project_env_bin_dir): original_version = '0.1.0' assert original_version in (project_dir / 'pyproject.toml').read_text('utf-8') assert original_version in (project_dir / 'CITATION.cff').read_text('utf-8') - assert original_version in (project_dir / 'my_python_package' / '__init__.py').read_text('utf-8') + assert original_version in (project_dir / 'src' / 'my_python_package' / '__init__.py').read_text('utf-8') assert original_version in (project_dir / 'docs' / 'conf.py').read_text('utf-8') result = run([f'{bin_dir}bump-my-version', 'major'], project_dir) @@ -188,5 +188,5 @@ def test_bumpversion(baked_with_development_dependencies, project_env_bin_dir): expected_version = '1.0.0' assert expected_version in (project_dir / 'pyproject.toml').read_text('utf-8') assert expected_version in (project_dir / 'CITATION.cff').read_text('utf-8') - assert expected_version in (project_dir / 'my_python_package' / '__init__.py').read_text('utf-8') + assert expected_version in (project_dir / 'src' / 'my_python_package' / '__init__.py').read_text('utf-8') assert expected_version in (project_dir / 'docs' / 'conf.py').read_text('utf-8') diff --git a/{{cookiecutter.directory_name}}/.githooks/pre-commit b/{{cookiecutter.directory_name}}/.githooks/pre-commit index a0f9c2e0..8279d5a5 100755 --- a/{{cookiecutter.directory_name}}/.githooks/pre-commit +++ b/{{cookiecutter.directory_name}}/.githooks/pre-commit @@ -6,7 +6,7 @@ echo "Script $0 triggered ..." echo "Starting ruff analysis..." # quietly run ruff -ruff . --fix +ruff check . --fix # use return code to abort commit if necessary if [ $? != "0" ]; then diff --git a/{{cookiecutter.directory_name}}/docs/conf.py b/{{cookiecutter.directory_name}}/docs/conf.py index e0f32f0b..c73e3d3b 100644 --- a/{{cookiecutter.directory_name}}/docs/conf.py +++ b/{{cookiecutter.directory_name}}/docs/conf.py @@ -61,7 +61,7 @@ # -- Use autoapi.extension to run sphinx-apidoc ------- -autoapi_dirs = ['../{{ cookiecutter.package_name }}'] +autoapi_dirs = ['../src/{{ cookiecutter.package_name }}'] # -- Options for HTML output ---------------------------------------------- diff --git a/{{cookiecutter.directory_name}}/pyproject.toml b/{{cookiecutter.directory_name}}/pyproject.toml index 9dd96e77..e8bfc765 100644 --- a/{{cookiecutter.directory_name}}/pyproject.toml +++ b/{{cookiecutter.directory_name}}/pyproject.toml @@ -72,7 +72,7 @@ testpaths = ["tests"] [tool.coverage.run] branch = true -source = ["{{ cookiecutter.package_name }}"] +source = ["src/{{ cookiecutter.package_name }}"] command_line = "-m pytest" [tool.isort] @@ -80,14 +80,9 @@ lines_after_imports = 2 force_single_line = 1 no_lines_before = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] known_first_party = "{{ cookiecutter.package_name }}" -src_paths = ["{{ cookiecutter.package_name }}", "tests"] +src_paths = ["src/{{ cookiecutter.package_name }}", "tests"] line_length = 120 -# For completeness, until we move to an src-based layout -[tool.setuptools.packages.find] -include = ["{{ cookiecutter.package_name }}*"] -exclude = ["tests*"] - [tool.tox] legacy_tox_ini = """ [tox] @@ -99,6 +94,35 @@ extras = dev """ [tool.ruff] +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "venv", + ".venv", + "scripts", +] + +target-version = "py39" +line-length = 120 + + +[tool.ruff.lint] # Enable Pyflakes `E` and `F` codes by default. select = [ "F", # Pyflakes @@ -136,39 +160,14 @@ ignore = [ fixable = ["A", "B", "C", "D", "E", "F", "I"] unfixable = [] -exclude = [ - ".bzr", - ".direnv", - ".eggs", - ".git", - ".hg", - ".mypy_cache", - ".nox", - ".pants.d", - ".ruff_cache", - ".svn", - ".tox", - ".venv", - "__pypackages__", - "_build", - "buck-out", - "build", - "dist", - "node_modules", - "venv", - ".venv", - "scripts", -] per-file-ignores = {} # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" -target-version = "py39" -line-length = 120 -[tool.ruff.isort] +[tool.ruff.lint.isort] known-first-party = ["{{ cookiecutter.package_name }}"] force-single-line = true no-lines-before = ["future","standard-library","third-party","first-party","local-folder"] @@ -177,7 +176,7 @@ no-lines-before = ["future","standard-library","third-party","first-party","loca current_version = "{{ cookiecutter.version }}" [[tool.bumpversion.files]] -filename = "{{ cookiecutter.package_name }}/__init__.py" +filename = "src/{{ cookiecutter.package_name }}/__init__.py" [[tool.bumpversion.files]] filename = "pyproject.toml" diff --git a/{{cookiecutter.directory_name}}/sonar-project.properties b/{{cookiecutter.directory_name}}/sonar-project.properties index 02e14401..512f6831 100644 --- a/{{cookiecutter.directory_name}}/sonar-project.properties +++ b/{{cookiecutter.directory_name}}/sonar-project.properties @@ -1,7 +1,7 @@ sonar.organization={{ cookiecutter.github_organization }} sonar.projectKey={{ cookiecutter.github_organization }}_{{ cookiecutter.directory_name }} sonar.host.url=https://sonarcloud.io -sonar.sources={{ cookiecutter.package_name }}/ +sonar.sources=src/{{ cookiecutter.package_name }}/ sonar.tests=tests/ sonar.links.homepage={{ cookiecutter.repository_url }} sonar.links.scm={{ cookiecutter.repository }} diff --git a/{{cookiecutter.directory_name}}/{{cookiecutter.package_name}}/__init__.py b/{{cookiecutter.directory_name}}/src/{{cookiecutter.package_name}}/__init__.py similarity index 100% rename from {{cookiecutter.directory_name}}/{{cookiecutter.package_name}}/__init__.py rename to {{cookiecutter.directory_name}}/src/{{cookiecutter.package_name}}/__init__.py diff --git a/{{cookiecutter.directory_name}}/{{cookiecutter.package_name}}/my_module.py b/{{cookiecutter.directory_name}}/src/{{cookiecutter.package_name}}/my_module.py similarity index 100% rename from {{cookiecutter.directory_name}}/{{cookiecutter.package_name}}/my_module.py rename to {{cookiecutter.directory_name}}/src/{{cookiecutter.package_name}}/my_module.py