Releases: usethis-python/usethis-python
Releases · usethis-python/usethis-python
0.20.0
Immutable
release. Only release title and notes can be modified.
💥 Changes
- The
usethis cicommand (andusethis ci bitbucketsubcommand) has been removed, including all related code and documentation. The rationale is documented at this page of the documentation site; also see #1313. - The
--pre-commitoption forusethis inithas been renamed to--hookto be more general and to align with the newusethis hookcommand. This is partly in view of providing support for other Git hook tools in the future (specifically; prek).
🚀 New Features
- There is now a
usethis tool tycommand to manage thetytype checker from Astral. There is also a higher-levelusethis typecheckcommand which has the same effect, and an opt-in--typecheckoption forusethis init. There is also an associatedusethis badge tycommand to add a badge fortyto the README. - There is now a
usethis archcommand to manage architecture analysis tools such as Import Linter; currently this wrapsusethis tool import-linter. There is also an opt-in--archoption forusethis init. - There is now a
usethis hookcommand to manage Git hook tools; currently this wrapsusethis tool pre-commit. There is also an opt-in--hookoption forusethis init. usethis initnow accepts a--build-backendoption to specify the build backend to use in the generatedpyproject.tomlfile. By default, the build backend ishatch(equivalent to--build-backend=hatch), butuv_buildis also supported via--build-backend=uv.- The
usethis show sonarqubecommand is now considered ready for use. It now supports a--project-keyoption to specify the SonarQube project key, in addition to the previous method of using a dedicatedtool.usethis.sonarqube.project-keyconfiguration inpyproject.toml. - Ruff rule hierarchies are now respected. For example, when
"ALL"is selected, then other rules won't be explicitly added to the select list. Similarly, if"F"is ignored, then"F401"won't be explicitly ignored.
🐞 Bug Fixes
- Read-only operations on YAML files will no longer modify the file with cosmetic changes. There should also be a small performance improvement associated with avoiding unnecessary writes. It was incorrectly reported that this issue was fully resolved in v0.17.0, and the release notes have been retrospectively updated accordingly.
🦾 Robustness
- Submodules named
_version.pyin project packages will now be automatically excluded from the inferred Import Linter contracts, since these are often dynamically generated via tools such assetuptools_scmandhatch-vcs, and are not typical modules. - The
RUF059Ruff rule (unused-unpacked-variable) is now ignored by default for thetestsdirectory, since tests often include intentionally unused variables and the rule is overly strict in that context.
📚 Documentation
- The various
usethis showcommands are now explicitly documented in the README.
📦 Packaging
- The
mergedeepdependency has been removed, since the package has been unmaintained since 2021.
🔧 Internal Changes
- Import cycles have now been broken through the
is_likely_usedheuristic function which provides the canonical heuristic for determining whether a tool is used based on itsToolSpec. A lack of import cycles is now enforced by both Import Linter and basedpyright. - The
config_specmethod has been moved intoToolSpecto align more with the intention thatToolSpeccorresponds to aspects of the tool specification which are unopinionated and are based on the inherent design of the tool (whereas theToolsubclass may involve various heuristics and opinionated decisions). - The
Toolclass is now marked as@finalto discourage subclassing. Likewise,ToolSpecmethods are protected with@finalto avoid inadvertently overriding its methods in theToolsubclass. Similarly, the@overridedecorator is explicitly used for methods which are providing an override implementation of an abstract method from the base class inToolimplementation subclasses. - There is improved type compliance through the reduced use of
typing.Any, especially for theKeyValueFileManagerimplementation. Some of this has been achieved through increased runtime validation withpydantic, which should improve the intelligibility of error messages when invalid data is encountered in configuration files such aspyproject.toml. UsethisFileManagerhas been renamed toFileManagerwith view to pull the file manager logic into a separate dependency in the future (see #1256). To the same end, theusethis._iomodule containing theFileManagerandKeyValueFileManagerdefinitions has been consolidated into theusethis._filemodule, as well as theprint_keysfunction and theKeytype alias.- There is now a
FileManager.revert()method to reduce the need to access private attributes. Various other internal methods have been renamed to promote them from private usage to better reflect their usage. FileManagerandKeyValueFileManagerare now explicitly marked as abstract base classes.- All
typer.Optionobjects now reside in a central module atusethis._ui.options. This helps bring consistency within modules and helps bring attention to potential duplication of options across modules to improve the overall consistency of the CLI. - There is now a central
usethis._fallbackmodule for fallback versions of various packages. These provide the hard-coded values which are used when dynamic inference is not possible, such as when a backend such asuvis unavailable, or when populating pre-commit configuration. codecovandcodspeedworkflows no longer run for doc-only changes.- There are now linters and formatters for markdown (enforced via
prek). This is mostly to help facilitate the development and maintenance of agent skills.
What's Changed
- Bump
actions/upload-artifactandactions/download-artifactby @nathanjmcdougall in #1426 pkg._versionshould be added toexhaustive_ignoresin Import Lint… by @nathanjmcdougall in #1427- 1415 doc why doesnt usethis support automated setup of ci config by @nathanjmcdougall in #1428
- Move
config_specintoToolSpecby @Copilot in #1430 - Add
@finalto all methods inToolSpecandToolimplementations by @Copilot in #1432 - Explain how to maintain docs in agent skills by @nathanjmcdougall in #1435
- Remove import cycles by @nathanjmcdougall in #1436
- Remove
mergedeepdependency by @Copilot in #1437 - Use
__getitem__ -> objectinstead of__getitem__ -> AnyinFileManagers by @nathanjmcdougall in #1439 - enable
reportMissingTypeStubsin basedpyright by @nathanjmcdougall in #1441 - enable
reportInvalidAbstractMethodin basedpyright by @nathanjmcdougall in #1442 - Remove deprecated
usethis cifrom README and docs by @Copilot in #1445 - Reduce the use of
typing.Anyby @nathanjmcdougall in #1443 - Implement
usethis tool tyandusethis typecheckby @nathanjmcdougall in #1446 - Improve the type annotation of empty container initializations by @nathanjmcdougall in #1447
- 1329 enable reportunannotatedclassattribute in basedpyright by @nathanjmcdougall in #1448
- Avoid branding of
uvvs. uv in release notes/changelog by @Copilot in #1450 - Enable
reportImplicitOverridein basedpyright by @nathanjmcdougall in #1449 - Update license badge to point to the GitHub license tab as a hyperlink by @nathanjmcdougall in #1452
- Consolidate
usethis._iointousethis._fileas new modules by @nathanjmcdougall in #1457 - Skip codecov and codspeed workflows for doc-only changes by @Copilot in #1456
- Implement
usethis archcommand by @Copilot in #1451 - [Breaking Change] Add
usethis hookcommand and--hook/--no-hooktousethis initby @Copilot in #1454 - Enable
reportPrivateUsagein basedpyright by @nathanjmcdougall in #1460 - Centralize CLI options/arguments arguments by @nathanjmcdougall in #1458
- Implement
usethis badge tyby @Copilot in #1462 - Document
usethis showsubcommands in CLI overview page by @Copilot in #1461 - Set acyclic siblings contract for development by @nathanjmcdougall in #1470
- Add tests for Ruff dev deps not removed when using pre-commit by @Copilot in #1464
- Add a ...
0.19.0
Immutable
release. Only release title and notes can be modified.
🚧 Deprecations
- The
usethis ci bitbucketcommand, and theusethis cicommand in general, are deprecated. Their removal is planned for usethis 0.20.0. For feedback and discussion, please see #1313.
🐞 Bug Fixes
- Previously, parsing of
pyproject.tomlwould fail on some Unicode characters. This has been fixed by specifying the encoding explicitly.
🧹 Maintenance
- The latest version of the Bitbucket Pipelines configuration file schema is now supported, specifically source import pipelines (in addition to the legacy inline import pipelines).
📚 Documentation
- There is now documentation on how to add a new tool to usethis in
CONTRIBUTING.md. - There is now clearer guidance in
CONTRIBUTING.mdregarding the use of docstrings in the test suite. - The Scientific Python Library Development Guide is now mentioned in the README.
🔧 Internal Changes
- A bug in the pipeweld utility has been fixed. The bug did not functionally affect usethis, but involved incorrect insertion behaviour of Parallel components in the presence of empty Series branches.
- As of uv version 0.9.9, uv supports the
UV_NO_DEFAULT_GROUPSenvironment variable, which is now being used for CI configuration. This causes changes to tested behaviour of usethis, and so the lowest tested version of uv is now v0.9.9. Going forward, it is not recommended to use older versions of uv with usethis. - There are now various agent skills configured for agentic development.
- There is now explicit environment configuration for the GitHub Copilot agent.
- There are now separate GitHub Actions workflows for static checks, pytest, codspeed, and codecov analysis. This helps reduce the scope of permissions to repo secrets and generally simplifies things.
- There is now a GitHub Actions workflow for manually triggering a version bump to a specific package (for development). This is mostly to improve the maintenance experience for addressing CVEs.
- The
Toolclass now inherits fromToolSpecfor the methods which do not involve dynamic inference. - Many methods on the
ToolandToolSpecclasses have been renamed and reorganized for convenience, including the introduction of aToolMetaabstraction for grouping basic tool metadata (name, documentation URL, etc.). - There is now a dedicated module for heuristics for detecting tool usage.
- The logic for selecting CI vs. pre-commit is now abstracted into the
Toolclass instead of being repeated for individual tool implementations. - Various submodules of
usethis._integrationshave been promoted into their own higher level modules to accommodate these changes while preserving a layered architecture. - There are various improvements in type compliance via the enabling of various
basedpyrightrules which were previously disabled.
What's Changed
- Major architecture changes to improve CI vs. pre-commit selection logic by @nathanjmcdougall in #1286
- Fix structure of logic to determine whether to add new bitbucket steps by @nathanjmcdougall in #1296
- Bump Bitbucket schema .py file by @nathanjmcdougall in #1299
- Remove redundant basedpyright config by @nathanjmcdougall in #1301
- Give clearer guidance regarding the use of docstrings in the test suite by @nathanjmcdougall in #1302
- Enable
reportArgumentTypeinbasedpyrightby @nathanjmcdougall in #1305 - Enable
reportPrivateLocalImportUsageinbasedpyrightby @nathanjmcdougall in #1309 - Enable
reportAttributeAccessIssuein basedpyright by @nathanjmcdougall in #1307 - Remove
TYPE_CHECKINGprotected import cycles by @nathanjmcdougall in #1314 - Clarify intent of
Tool.namein docstring by @nathanjmcdougall in #1317 - Document how to add a new tool by @nathanjmcdougall in #1318
- Introduce
ToolSpecandToolMetaabstractions to keep tool classes more accessible by @nathanjmcdougall in #1342 - Bump
markdownas a dev dep by @nathanjmcdougall in #1344 - Specify an environment for CI Actions config by @nathanjmcdougall in #1347
- Bump
zizmorto v0.5.2 by @nathanjmcdougall in #1349 - Refactor
Tooldefaults into standaloneToolSpecmethods andis_likely_usedfunction by @Copilot in #1351 - Switch to CodSpeed simulation mode by @nathanjmcdougall in #1354
- Move to agent skills and
AGENTS.mdby @nathanjmcdougall in #1355 - 1362 create import linter skill by @nathanjmcdougall in #1364
- Add an agent skill to modify the Python module layout by @nathanjmcdougall in #1365
- Give contract strategy for
usethis-qa-import-linterby @nathanjmcdougall in #1370 - Give a strategy for broken references in `usethis-python-module-layou… by @nathanjmcdougall in #1372
- Add a
github-actions-updateskill by @nathanjmcdougall in #1374 - Skip CI for
.mdfile changes in.agentsdir by @Copilot in #1367 - Forbid
functools.singledispatch/singledispatchmethodvia Ruff banned-api by @Copilot in #1361 - Disable basedpyright rule
reportUnusedFunctiononly for tests by @nathanjmcdougall in #1375 - Explain the need to update the test directory structure in `usethis-p… by @nathanjmcdougall in #1379
- 1380 configure agent dev env by @nathanjmcdougall in #1383
- Split
usethis._tool.implintoimpl/specandimpl/basesubmodules by @Copilot in #1373 - Add a skill for modifying Python code by @nathanjmcdougall in #1384
- Mention
uv run pytest tests\test_suite.py::test_skeleton_matchesfo… by @nathanjmcdougall in #1387 - Explicitly activate the venv for copilot agent setup by @nathanjmcdougall in #1386
- Enable
reportUnreachablein basedpyright by @Copilot in #1376 - Bump the minimum supported version of uv to 0.9.9 by @nathanjmcdougall in #1390
- Add a GitHub Actions workflow for bumping dev deps with manual trigger by @nathanjmcdougall in #1394
- Add PR-generating capabilities to the
bump-dev-depworkflow by @nathanjmcdougall in #1396 - Enable
reportUnnecessaryTypeIgnoreCommentinbasedpyrightby @nathanjmcdougall in #1395 - Allow a failing uv-export run (means update has occurred) by @nathanjmcdougall in #1397
- Set git user config to use
github-actions[bot]by @nathanjmcdougall in #1400 - Enable
reportUnnecessaryComparisonin basedpyright by @Copilot in #1399 - Set
PREK_UV_SOURCE: githubfor prek in static checks GitHub action by @nathanjmcdougall in #1402 - Remove unnecesssary manual commit step in `.github\workflows\bump-dev… by @nathanjmcdougall in #1404
- Actions/fix commit permissions by @nathanjmcdougall in #1405
- Exclude
AGENTS.mdfrom triggering CI by @Copilot in #1409 - Clean up cosmetics on dev dep bumping by @nathanjmcdougall in #1411
- Explicitly instruct agents to use particular skills in
AGENTS.mdby @nathanjmcdougall in #1407 - Bump black to
26.3.1in dev lockfile by @nathanjmcdougall in #1393 - Enable
reportUnknownParameterTypein basedpyright by @Copilot in #1403 - Mention
sp-repo-reviewin the README by @nathanjmcdougall in #1418 - Enable
reportUnusedParameterin basedpyright by @Copilot in #1414 - Deprecate
usethis ciin v0.19.0 ahead of removal in v0.20.0 by @Copilot in #1416 - Fix a bug in
pipeweldfor inserti...
0.18.1
Immutable
release. Only release title and notes can be modified.
🐞 Bug Fixes
usethis showcommands will no longer hard-wrap outputs, which gave invalid results in some cases, e.g. when runningusethis show sonarqubewith longsonar.projectKeyfields.
🦾 Robustness
- Fallback icons (e.g.
√,□,i,×,!) for message icons (✔,☐,ℹ,✗,⚠) are now used for terminals which don't support unicode. - Identical warnings will now never display twice for the same command.
- When a backend is not being used, the inferred version of Python based on the current interpreter is now compared with the
requires-pythonbounds frompyproject.toml. If there is a mismatch, a warning is now emitted. - The
tomlidependency oncodespellis only declared as a dependency for Python versions 3.10 and below, since for versions 3.11 onwards,codespellusestomllibfrom the standard library. This is based on therequires-pythonbounds frompyproject.tomlif available, otherwise by the current interpreter.
📦 Packaging
- As per the notes for 0.16.0, Version 0.18.13 of ruamel.yaml introduced a regression relating to indentation. The new versions 0.19.0 and 0.19.1 of ruamel.yaml are now also excluded as dependency versions until this is addressed in a future release.
🔧 Internal Changes
- Rule management logic is now abstracted into the
Toolclass, reducing duplication between the logic used for deptry and Ruff. - Import Linter contracts for development have been moved from
pyproject.tomlto.importlinterfor tidiness.
What's Changed
- Use schema namespaces instead of messy lists of imported classes by @nathanjmcdougall in #1267
- Move tool management methods into
Toolto reduce duplication by @nathanjmcdougall in #1268 - Tweak grammar in SECURITY.md by @nathanjmcdougall in #1269
- Exclude
ruamel.yamlv0.19.0 and v0.19.1 due to regression by @nathanjmcdougall in #1274 - Add caching to
warn_printby @nathanjmcdougall in #1276 - 1183 respect requires python bounds in get supported major python versions for none backend by @nathanjmcdougall in #1273
- Move Import Linter config to
.importlinterto reduce clutter by @nathanjmcdougall in #1279 - Conditionally include tomli as a codespell dep based on Python version by @nathanjmcdougall in #1277
- Use fallback icon sets for terminals that don't support unicode by @nathanjmcdougall in #1278
- Refactor
get_required_minor_python_versionsfor clarity by @nathanjmcdougall in #1280 - Bump
urllib3by @nathanjmcdougall in #1281 - Enable soft wrapping for
plain_printby @nathanjmcdougall in #1288 - Add changelog for 0.18.1 by @nathanjmcdougall in #1290
Full Changelog: v0.18.0...v0.18.1
0.18.0
Immutable
release. Only release title and notes can be modified.
💥 Changes
- Previously, when available, uv would be used as a package manager backend when
pyproject.tomlexisted, even if there was no lockfile. This was considered to have too many false positives for projects using different systems (e.g.setup.pywith linter configuration inpyproject.toml). Now, in lieu of any other evidence such as[tool.uv]sections inpyproject.toml, the default is to use the--backend=nonebehaviour. - Previously, tools configured via
pre-commitwould not be declared as dev dependencies unless necessary, namely the tools codespell and pyproject-fmt. Now, they are always declared as dev dependencies (when using the uv package manager backend).
🚀 New Features
- Import Linter contract inference via
usethis tool import-linternow supports namespace packages. - The new
.coveragerc.tomlfile introduced by Coverage.py in v7.13.0 is now supported by usethis. - The new
pre-commitlanguage alias ofunsupportedinstead ofsystemintroduced inv4.4.0is now used when the minimum version of pre-commit is declared viaminimum_pre_commit_versionat 4.4.0 or greater. - The default Coverage.py configuration now sets
relative_files = trueto use relative paths e.g. in XML coverage reports. This helps improve robustness when parsing coverage reports as artifacts between CI jobs. - By default, usethis will now explicitly include dev dependencies in
requirements.txtexport configuration when usingusethis tool requirements.txt. Previously this was implicit via the editable install-e .declaration. - There is now a
usethis show backendcommand which emits the inferred backend (currently; one ofuvornone).
🐞 Bug Fixes
- There are no longer fatal crashes while running
usethis tool import-linterin the presence of empty directories in the source directory. - Root-level
.pyfiles (e.g.setup.py) are no longer considered packages for Import Linter contract inference when usingusethis tool import-linter.
🦾 Robustness
- A speedup of up to 30% has been achieved in some situations by using atomic writes (and reducing duplicated reads) for YAML files.
- When using the uv backend, if
pyproject.tomldoes not yet exist, it will not be created unnecessarily when runningusethis tool requirements.txt. - Test directory-related ignores for Ruff config (i.e. referencing
tests/**) are now only generated when thetestsdirectory actually exists. PT-code Ruff rules (relating to pytest) are explicitly ignored for non-tests directories.- Error messages for subprocess failures now emit the failing command for better diagnosability.
- Subprocess failures for uv no longer emit the full
pyproject.tomlcontents.
🧹 Maintenance
- The latest version of the Bitbucket Pipelines configuration file schema is now supported, specifically support for new options available regarding pipeline triggers and self-hosted runners.
📚 Documentation
- There is now dedicated guidance on the docs site for using usethis together with popular frameworks like Django, FastAPI, and Dagster.
- A detailed example of
usethis inithas been pulled out the README into a dedicated docs page. - The license is now documented on the docs site (in addition to the
LICENSEfile). - Branding (colours, project naming) etc. is now documented in
CONTRIBUTING.md. - There is now a favicon on the docs site.
- There are now dedicated 404 pages for the docs site.
- The correct URL is now used for the pyproject-fmt homepage.
📦 Packaging
- As per the notes for 0.16.0, Version 0.18.13 of ruamel.yaml introduced a regression relating to indentation. The new version 0.18.17 of ruamel.yaml is now also excluded as a dependency version until this is addressed in a future release.
🔧 Internal Changes
- As of uv version 0.8.18, uv now allows
pyproject.tomlto be missing[project]sections. This causes changes to tested behaviour of usethis, and so the lowest tested version of uv is now v0.8.18. Going forward, it is not recommended to use older versions of uv with usethis. - The GitHub Actions for publishing to PyPI now use separate build and publish steps to reduce the scope of publish token permissions.
- CI pipelines are now triggered for all changes, including documentation-only changes, since documentation includes tested codeblocks.
- Codspeed runners in CI now run on Python 3.13 to reduce duplication between Python 3.14 runners.
- The config for prek now uses the
priorityoption to enable concurrency between hooks. - The pyright-style type checker has been migrated from pyright to a similar alternative, basedpyright.
What's Changed
- Split build and publish environments for PyPI releases via GitHub Act… by @nathanjmcdougall in #1137
- Add trigger configuration support to Bitbucket pipelines config by @nathanjmcdougall in #1140
- Rework docs to add new detailed example section by @nathanjmcdougall in #1141
- Add missing uv setup step in
release.ymlby @nathanjmcdougall in #1145 - Enable strict built-in shadowing checks in Ruff by @nathanjmcdougall in #1146
- No longer exclude default groups (e.g. dev dependencies) when generat… by @nathanjmcdougall in #1147
- Add favicon by @nathanjmcdougall in #1156
- Bump
mkdocs-materialto fix 404 pages by @nathanjmcdougall in #1157 - Add
get_uv_versionfunction by @nathanjmcdougall in #1158 - Include license in the docs by @nathanjmcdougall in #1159
- Add a section describing how to use usethis with other frameworks lik… by @nathanjmcdougall in #1160
- Implement a
get_minimum_pre_commit_versionfunction by @nathanjmcdougall in #1165 - Bump bitbucket pipelines schema to include self-hosted config by @nathanjmcdougall in #1179
- Bump urllib3 by @nathanjmcdougall in #1178
- Support base-level namespace packages in
usethis tool import-linter… by @nathanjmcdougall in #1182 - Don't infer uv is used if there's no lockfile but
pyproject.tomla… by @nathanjmcdougall in #1163 - Forbid
ruamel-yaml0.18.17 by @nathanjmcdougall in #1191 - Clarify docstring in
use_ruffby @nathanjmcdougall in #1189 - Rewording README regarding roadmap timeframes by @nathanjmcdougall in #1196
- Refactor Python version logic into a dedicated class by @nathanjmcdougall in #1216
- Don't output
pyproject.tomlcontents inuvsubprocess fail error … by @nathanjmcdougall in #1217 - Trigger CI on doc-only changes by @nathanjmcdougall in #1219
- Add support for
.coveragerc.tomlby @nathanjmcdougall in #1222 - Move codspeed to 3.13 in CI to avoid duplicating runs with 3.14 by @nathanjmcdougall in #1223
- Use correct URL for
pyproject-fmthomepage by @nathanjmcdougall in #1224 - Fix case of empty package directory under
usethis tool import-linterby @nathanjmcdougall in #1227 - Ignore root-level
.pyfiles for Import Linter inference by @nathanjmcdougall in #1228 - Use consistent naming for "Dot" Config Managers by @nathanjmcdougall in #1229
- Ensure test directory ignore rules are only added if the
/testsexists by @nathanjmcdougall in #1232 - Use relative paths in Coverage.py configuration by @nathanjmcdougall in #1235
- Add support for new
unsupportedandunsupported_scriptlanguages … by @nathanjmcdougall in #1238 - Create a
get_pre_commit_versionfunction by @nathanjmcdougall in #1240 - Migrate the pre-commit and bitbucket YAML integrations to use FileManagers by @nathanjmcdougall in #1247
- Use adaptive logic to decide on correct alias for pre-commit system/u… by @nathanjmcdougall in #1241
- Properly introduce test-related rule config when adding pytest by @nathanjmcdougall in #1249
- Document in the copilot-instructions.md that .gitignore should never … by @nathanjmcdougall in https://github.com/usethis-python/usethis-p...
0.17.0
Immutable
release. Only release title and notes can be modified.
🚀 New Features
- The
usethis ci bitbucketcommand will now automatically use parallelism between pipeline steps where possible. - The
usethis ci bitbucketcommand now has a--no-matrix-pythonoption to opt-out of generating a Python version matrix for CI pipelines, i.e. to only test against a single Python version. - The behaviour of
--backend=noneis now the default when Poetry is detected, and a warning is displayed. This would change in a future release when a Poetry backend is implemented. - The command
usethis badge sockethas been added, which adds a Socket badge to the README for your PyPI package, giving a security scan rating.
🐞 Bug Fixes
usethis tool import-linterwill no longer addINPrules multiple times when run repeatedly.- The (undocumented)
usethis show sonarqubecommand previously gave invalid config for flat directory structures; this has been fixed. Also, the command no longer creates apyproject.tomlfile if it does not already exist. - When running
usethis tool requirements.txtwith--backend=none, the how-to-use message misleadingly implies that a pre-existingrequirements.txtfile would be modified; this message no longer displays in this case. - Read-only operations on YAML files will no longer modify the file with cosmetic changes in some cases. A full fix will be included in a future release.
🦾 Robustness
- Unrecognized entries (i.e. not found in the JSON Schema Store) in
.pre-commit-config.yamlandbitbucket-pipelines.ymlfiles will no longer cause validation errors or be dropped. Other minor improvements to the schema validation logic have also been made to improve robustness when roundtripping files. - The
usethis ci bitbucketcommand will add thepre-commitcache topre-commitsteps when using the--backend=nonebehaviour. - Running
usethis initwith--backend=nonewill now explicitly instruct the user about any dependencies that need to be managed manually. - References to Bitbucket Pipelines are now consistently capitalized and pluralized throughout the codebase.
📚 Documentation
- The FAQ now explicitly explains whether
uvis necessary to useusethis, and gives some guidance for Poetry users. - Instructions for implementing a new
usethis badgecommand in usethis have been added to the CONTRIBUTING.md file. - Some instructions for how to diagnose slow
pytestcollection speeds are now inCONTRIBUTING.md. - There is now an acknowledgements section in the README.
- The
CONTRIBUTING.mdfile now explains how to run the CLI from within a temporary project directory. - The
CONTRIBUTING.mdfile explicitly mentions that type annotations should not be included in docstrings. - The
CONTRIBUTING.mdfile now explains the details of theusethis._config.usethis_configglobal state object. - All
usethis toolcommands are now explicitly enumerated in the README. - The README now explicitly links to the ReadTheDocs site.
- The CLI Reference had issues with indentation of sub-bullet points; this has been resolved.
- A few badges have been moved and added to the Development section of the README.
📦 Packaging
- As per the notes for 0.16.0, Version 0.18.13 of
ruamel.yamlintroduced a regression relating to indentation. The new version 0.18.16 ofruamel.yamlis now also excluded as a dependency version until this is addressed in a future release.
🔧 Internal Changes
- There is now a method
Tool.default_command()to specify any CLI command associated with a tool, to reduce duplication across the codebase. - The
tytype checker from Astral has been added, and now runs via pre-commit hooks. Pyright continues to be used in the CI, but not via pre-commit. - The
zizmorCI runner no longer triggers for documentation-only changes. - There is now a
copilot-instructions.mdfile to configure GitHub Copilot. - The test to ensure the docs stay synchronized with the README has been weakened and no longer hard-codes any content from the README. This should reduce the flakiness of this test for README-only changes.
What's Changed
- Move badges down the README.md (#1030) by @nathanjmcdougall in #1031
- Forbid ruamel.yaml v0.18.16 and update README test to pass CI by @nathanjmcdougall in #1040
- Don't duplicate ignored rules matching glob by @nathanjmcdougall in #1042
- Fix print-how-to-use for requirements.txt with none backend by @nathanjmcdougall in #1043
- Add Ruff badge to development section of the README by @nathanjmcdougall in #1046
- Don't create pyproject.toml if it does not exist when showing SonarQu… by @nathanjmcdougall in #1048
- Add a read-only context manager for YAML files to prevent round-trip … by @nathanjmcdougall in #1047
- 1027 omissions in messages for usethis init backend=none by @nathanjmcdougall in #1049
- Explicitly document the
ruamel.yamldependency constraints in the 0… by @nathanjmcdougall in #1052 - Allow extra fields in YAML schema modules, add stricter validation by @nathanjmcdougall in #1050
- Add some documentation about whether uv is necessary by @nathanjmcdougall in #1054
- Add some instructions for diagnosing slow test collection speeds by @nathanjmcdougall in #1055
- Fix sub-bullet point markdown formatting in CLI reference by @nathanjmcdougall in #1057
- Ignore doc-only changes when triggering zizmor scanning by @nathanjmcdougall in #1056
- Explicitly link to the ReadTheDocs site from the README by @nathanjmcdougall in #1058
- Add explicit guidance for poetry users in FAQ by @nathanjmcdougall in #1060
- Support parallel step insertion and parallelism breakup in Bitbucket pipelines by @Copilot in #1051
- Add support for detecting poetry projects automatically and using the… by @nathanjmcdougall in #1059
- Explicitly mention all
usethis toolinterfaces in the README by @nathanjmcdougall in #1061 - Use consistent capitalization of bitbucket pipelines by @nathanjmcdougall in #1067
- Fix whitespace and grammar by @nathanjmcdougall in #1068
- Add acknowledgements section by @nathanjmcdougall in #1066
- Fix pluralization of
*_bitbucket_pipelines_configfunctions by @nathanjmcdougall in #1072 - Refactor the
src\usethis\_core\ci.pymodule by @nathanjmcdougall in #1073 - Fix Bitbucket pipelines capitalization/pluralization in docstrings by @nathanjmcdougall in #1074
- Weaken the README sync test to reduce content duplication by @nathanjmcdougall in #1083
- Tweak wording in README by @nathanjmcdougall in #1076
- Document how to add new badge implementations by @nathanjmcdougall in #1081
- 1063 usethis badge socket by @nathanjmcdougall in #1080
- Add CLI-level test for import pipeline error handling in Bitbucket integration by @Copilot in #1085
- Add copilot instructions file, improve CONTRIBUTING.md detail. by @nathanjmcdougall in #1087
- Migrate to Ruff 0.14.3 by @nathanjmcdougall in #1094
- Document test side-effect prevention guidelines by @Copilot in #1096
- Document usethis_config global state management by @Copilot in #1100
- Add Tool.default_command() to eliminate duplication in CI steps and help messages by @Copilot in #1088
- Fix SonarQube double indexing in flat layout by excluding tests from sources by @Copilot in #1091
- Disable
PLR0913in the interface layer by @nathanjmcdougall in #1105 - Add --matrix-python/--no-matrix-python flag to opt out of CI matrices by @Copilot in #1089
- Add helper methods to
get_sonar_project_propertiesby @nathanjmcdougall in #1107 json.schemastore.org->www.schemastore.orgby @nathanjmcdougall in #1109- Add
pre-commitcache to Bitbucket pipeline step for pre-commit for … by @nathanjmcdougall in https://github.com/usethis-python/...
0.16.0
Immutable
release. Only release title and notes can be modified.
0.16.0
🚀 New Features
- Most commands now accept a
--backendoption to specify the package manager backend to use. Up to this point, uv was the only supported backend. Now, a--backend=noneoption is available to use usethis without uv. This is a step toward supporting other backends such as Poetry in the future. When unspecified, heuristics will be used to determine the backend. - The use of
pyproject.tomlin a project is no longer assumed or imposed on a project when not using the uv backend. pre-commitconfigurations are now more conventional, preferring URL-based repo configuration instead of local repos withlanguage: system. The previous behaviour was designed to ensure synchronization of versions between the uv lockfile and thepre-commitconfiguration, but this is now provided by thesync-with-uvpre-commit hook, which is added automatically when usingpre-commitwith uv.- When using
usethis author, a message with the author's name is now outputted in the console.
🦾 Robustness
- Pydantic warnings relating to deprecated access to the
model_fieldsattribute on an instance should no longer occur. - The
tool.deptry.ignore_notebooksconfiguration for deptry is set explicitly to the default value offalseto hint that deptry is being used, and to hint on how to configure it.
🐞 Bug Fixes
- Previously, the
usethis ci bitbucketcommand would fail to add Import Linter configuration to the CI pipeline whenimport-linterwas detected. This has been fixed. - The
usethis badge pypicommand would generate markdown with invalid syntax due to a stray<character. This has been fixed.
🧹 Maintenance
- The default version of
pyproject-fmtwhen used as a pre-commit has been bumped from v2.6.0 to v2.11.0. - The latest version of the Bitbucket Pipelines configuration file schema is now supported, specifically inline and custom pipeline step types; the
input_variablesconfiguration for steps, and the new namescopedfor the artifacts upload type optionunshared.
📚 Documentation
- Hyperlinks in the README and CONTRIBUTING.md files now point to the stable documentation site (rather than the latest site).
- The configurator project is now documented as a similar project in the README.
📦 Packaging
- Python 3.14 is now formally supported.
clickis no longer a direct dependency.- Version 0.18.13 of
ruamel.yamlintroduced a regression relating to indentation. This version, along with 0.18.14 and 0.18.15, are now excluded as dependency versions to avoid this issue until it is addressed in a future release.
🔧 Internal Changes
- The CI configuration has been overhauled. uv is used in more conventional ways. A runner has been added for bleeding edge dependency versions. The CI now runs on a cron schedule.
zizmorhas been added for security scanning. Permissions are more tightly scoped and explained. All actions have been bumped to their latest versions. - The pre-commit hooks have been migrated to use
prekrather thanpre-commitfor development. pytest-sugarhas been added for a more user-friendly test suite output, andpytest-emojihas been removed.
What's Changed
- Fix typo in docstring of
Tool.get_install_methodby @nathanjmcdougall in #917 - Change hyperlinks to point to stable docs by @nathanjmcdougall in #918
- Bump bitbucket pipelines schema by @nathanjmcdougall in #926
- Remove stray brace in
get_pypi_badgeby @nathanjmcdougall in #925 - Display a message when setting an author with
add_authorby @nathanjmcdougall in #927 - Include error handling when trying to set UTF-8 outputs by @nathanjmcdougall in #928
- Add
--backendflag to over-ride manual detection of uv by @nathanjmcdougall in #826 - Update codecov badge token by @nathanjmcdougall in #931
- Bump Bitbucket pipelines schema to support custom steps and both inli… by @nathanjmcdougall in #940
- Only use
pyproject.tomlfor config when it already exists by @nathanjmcdougall in #934 - Bump pyproject-fmt to v2.7.0 by @nathanjmcdougall in #955
- Add support for the
input-variablesstep field in BitBucket pipelines by @nathanjmcdougall in #956 - Pass CI on uv 0.9.0 (Python 3.14) by @nathanjmcdougall in #961
- Avoid accessing model_fields on an instance in
fancy_model_dumpand… by @nathanjmcdougall in #964 - Declare Python 3.14 support by @nathanjmcdougall in #959
- Use
uv syncto set up dependencies inci.yamlby @nathanjmcdougall in #876 - Add CI runner for bleeding edge versions, refactor matrix configuration by @nathanjmcdougall in #965
- Migrate from
pre-committoprekby @nathanjmcdougall in #969 - Comply with
zizmorby @nathanjmcdougall in #971 - Add
pytest-sugarfor dev by @nathanjmcdougall in #974 - Configure cron schedule for CI by @nathanjmcdougall in #975
- Add
sync-with-uvand use more conventional pre-commit config by @nathanjmcdougall in #978 - Ensure Import Linter is added via
use_ci_bitbucketby @nathanjmcdougall in #988 - Enable max-deps CI worker on PRs by @nathanjmcdougall in #993
- Document
configuratoras a similar project by @nathanjmcdougall in #998 - Bump GitHub action versions by @nathanjmcdougall in #996
- Set
[tool.deptry.ignore_notebooks]explicitly asdeptryconfig by @nathanjmcdougall in #989 - 909 make bitbucket ci config backend agnostic by @nathanjmcdougall in #953
- Use
python-versionin setup-uv GitHub action and Consolidate CI steps by @nathanjmcdougall in #999 - Remove
pytest-emojiby @nathanjmcdougall in #1001 - Add
sync-with-uvfor repos usingpre-commitwithuvby @nathanjmcdougall in #1005 - Broaden exception handling in
test_matches_schema_storetests by @nathanjmcdougall in #1009 - Add
zizmorGitHub actions config by @nathanjmcdougall in #1007 - Remove unnecessary
contents: readpermissions by @nathanjmcdougall in #1019 - Move to standard pre-commit configuration where possible by @nathanjmcdougall in #1017
- 502 if uv isnt used dont add a pre commit config relying on uv by @nathanjmcdougall in #1023
- Add changelog for v0.16.0 by @nathanjmcdougall in #1025
Full Changelog: v0.15.2...v0.16.0
0.15.2
Immutable
release. Only release title and notes can be modified.
🦾 Robustness
- Previously, empty
.pre-commit-config.yamlfiles would cause errors, (since they are not considered valid by pre-commit). Now usethis will treat them as if they do not exist, and so will write new config to them if applicable, rather than raising a validation error for this case.
🐞 Bug Fixes
- When subprocessing uv, the
usethis initcommand will no longer use the default for--build-backend, and instead will always explicitly usehatch. This may change in the future if the default supported build backend forusethisbecomesuv_build, which is the new default for uv v0.8.0. This change avoids creating broken config which mixesuv_buildwithhatchconfig. - When adding Import Linter while using Ruff, the
INPrules are selected, but ignored for the tests directory. However, no message would be displayed in cases where those rules were already selected but not already ignored. Now, a message will be displayed in this case.
📚 Documentation
- A documentation site is now available at https://usethis.readthedocs.io/en/stable/. The CLI Reference section has been moved there from the README. Other minor wording and clarity improvements have been made.
- The CLI reference now mentions that
usethis tool pre-commitwill install hooks to Git.
🔧 Internal Changes
- The
docdependency group is no longer a default group. This reduces the dependencies required on CI.
What's Changed
- Reword changelog for v0.15.1 by @nathanjmcdougall in #873
- Rename
ensure_file_manager_existstoensure_managed_file_existsby @nathanjmcdougall in #872 - Use
uv syncto set up dependencies inci.yamlby @nathanjmcdougall in #874 - Revert "Use
uv syncto set up dependencies inci.yaml" by @nathanjmcdougall in #875 - Remove nested parenthesis in README by @nathanjmcdougall in #877
- Reword description of
usethis cito clarify there is no recommended… by @nathanjmcdougall in #878 - Mention that
usethis testincludes Coverage.py by @nathanjmcdougall in #879 - Remove idempotent encode-decode calls for unicode character by @nathanjmcdougall in #882
- 881 usethis tool import linter doesnt give message for ignoring inp by @nathanjmcdougall in #885
- Configure some tests to run offline by @nathanjmcdougall in #890
- Don't use
docgroup in testing CI by @nathanjmcdougall in #896 - Mention that
usethis tool pre-commitwill install hooks in the docs by @nathanjmcdougall in #899 - Break the README into docs pages, remove the CLI ref from the README by @nathanjmcdougall in #898
- Always use
--build-backend hatchforuv initsubprocesses from `u… by @nathanjmcdougall in #901 - Update
faq.mdfor grammar by @nathanjmcdougall in #903 - Support empty
.pre-commit-config.yaml filesby @nathanjmcdougall in #906 - Add changelog for v0.15.2 by @nathanjmcdougall in #914
Full Changelog: v0.15.1...v0.15.2
0.15.1
Immutable
release. Only release title and notes can be modified.
🐞 Bug Fixes
- Previously, when using Import Linter with Ruff, the
INPrule would be ignored in thetestsdirectory via an incorrect glob pattern of"*/tests/**"; this has been fixed to"tests/**". - A TOML integration problem could cause broken configuration in some cases. This could occur on deeply nested keys, such as the per-file-ignores for Ruff directories in
pyproject.tomlwhen using Import Linter. This has now been fixed.
📚 Documentation
- Some issues with mismatched bullet points in the CLI docs section of the README have been addressed.
- The opening paragraph of the README has been reworded for clarity, and various other minor changes have been made.
🔧 Internal Changes
- Changes to the CI and the test suite have been made to support uv v0.8.0. Newer features of uv are now required in the CI configuration, meaning the lowest tested version of uv is now v0.6.8. Going forward, it is not recommended to use older versions of uv with
usethis.
What's Changed
- Fix mismatched bullet points in README.md by @nathanjmcdougall in #858
- Fix bullet-point mismatch in README by @nathanjmcdougall in #857
- Clarify opening paragraph in README by @nathanjmcdougall in #859
- Grammar in
Manage the READMEvs.Manage READMEby @nathanjmcdougall in #860 - Implement
Dependency.to_requirements_stringby @nathanjmcdougall in #861 - For Import Linter, Fix INP config glob pattern, add its config when a… by @nathanjmcdougall in #864
- Support
uvv0.8.0 by @nathanjmcdougall in #867 - Update guidance on checking
uvversion to reflect change to `uv sel… by @nathanjmcdougall in #868 - Don't break Ruff TOML config when adding Import Linter by @nathanjmcdougall in #865
- Add changelog for v0.15.1 by @nathanjmcdougall in #871
Full Changelog: v0.15.0...v0.15.1
0.15.0
Immutable
release. Only release title and notes can be modified.
🚀 New Features
- The
usethis tool mkdocscommand has been implemented to manage MkDocs documentation sites. Also, the higher-levelusethis doccommand has been added, which has the same effect. - The
--docoption forusethis inithas been implemented to initialize MkDocs documentation sites by default. The old behaviour can be restored by passing--no-doc. - Coverage.py for measuring test coverage is now included by default when using
usethis testorusethis initwith the default--testoption. This provides out-of-the-box test coverage reporting. - The
--frozenoption is now supported in theusethis ciandusethis docstylecommands. Similar to other commands, this will leave the virtual environment and lockfile unchanged. - The
--offlineoption is now supported in theusethis docstylecommand. This will run the command without network access.
🦾 Robustness
- Incorrectly structured TOML files will emit better messages and in some cases will be handled gracefully, specifically in cases where a non-mapping value is encountered where a mapping is expected.
📦 Packaging
- Bounds are now placed on the build dependencies for usethis (i.e.
hatch-vcs>=0.5.0,<0.6.0andhatchling>=1.27.0,<1.28.0), which should improve reproducibility of builds in the long run.
🔧 Internal Changes
- A
YAMLFileManagerhas been implemented to manage YAML files, which is used for the MkDocs configuration filemkdocs.yml. - A new
get_project_depsmethod has been added to retrieve core project dependencies from thepyproject.tomlfile, specifically from theproject.dependenciessection. This will be used in a future release to support non-uv based backends, such as Poetry.
What's Changed
- Set bounds on build requirements by @nathanjmcdougall in #841
- Include Coverage.py as a default recommended test framework tool as a… by @nathanjmcdougall in #835
- 837 handle unexpected non mappings better in toml files by @nathanjmcdougall in #840
- 827 implement a yamlfilemanager by @nathanjmcdougall in #833
- Support
--frozeninusethis ciby @nathanjmcdougall in #845 - Support
--offlineand--frozeninusethis docstyleby @nathanjmcdougall in #846 - Bump pyright from v1.1.399 -> v1.1.403 by @nathanjmcdougall in #848
- Implement
get_project_depsand tests by @nathanjmcdougall in #853 - Update
ConfigEntrydocstring to sync with attributes by @nathanjmcdougall in #852 - Implement
usethis tool mkdocsby @nathanjmcdougall in #823 - Implement
usethis docandusethis init --docby @nathanjmcdougall in #854 - Changelog/0.15.0 by @nathanjmcdougall in #855
Full Changelog: v0.14.2...v0.15.0
0.14.2
Immutable
release. Only release title and notes can be modified.
🦾 Robustness
- The heuristics to determine whether a tool is used will now check the
pre-commitconfiguration to see whether there is apre-commithook for the tool. - When removing an entry of TOML configuration, usethis makes some effort to remove empty tables and sections. This was previously only done to one level of nesting, but it should now occur at multiple levels of nesting.
🐞 Bug Fixes
- The Codespell configuration for
pyproject.tomlwas giving invalid configuration for theignore-words-listoption, which was set to an empty list. Codespell requires this option to be non-empty. It is now set to["..."], which is consistent with the handling for other INI-based configuration files. - Previously, using the
--howoption forusethis toolcommands would not properly infer the way a tool was installed. For example, it would assume that a tool is installed as a pre-commit hook, simply becausepre-commitwas used for the project, without checking whether there actually are any hooks. This has been fixed, and more sophisticated heuristics are now used to determine how a tool is installed. - The message to suggest using
__init__.pyfiles when using Import Linter now checks explicitly whether you have theINPrules enabled in Ruff, rather than simply assuming that these rules would be enabled when Ruff is used. The message is only displayed if theseINPrules are not enabled. - Error messages now use more consistent punctuation and formatting.
🧹 Maintenance
- The default version of
pyproject-fmtwhen used as a pre-commit has been bumped from v2.5.0 to v2.6.0. - The latest version of the Bitbucket Pipelines configuration file schema is now supported, specifically support for new options available regarding concurrency groups.
📚 Documentation
- The FAQ is now included in the MkDocs build, and information about roundtripping is now included in the FAQ.
- Social Icon buttons for GitHub and PyPI have been added to the bottom of the MkDocs site.
🔧 Internal Changes
- Minor improvements to the CI configuration have been made; the CI will no longer trigger for changes to the MkDocs configuration files.
- There is now global state to turn off pre-commit detection for pre-commit integrations, which is a step toward providing an interface to forbid adding a tool as a pre-commit.
- In the previous release, the project moved to using the codspeed Walltime runner for CI benchmarks. This has been reverted back to using the GitHub-based codspeed runners, since the Walltime runner reports were not as detailed and there were usage limits.
What's Changed
- Move
roundtrip.mdtofaq.mdby @nathanjmcdougall in #789 - Break up long sentence in README blurb by @nathanjmcdougall in #794
- Bump Bitbucket pipelines schema: Add support for concurrency groups a… by @nathanjmcdougall in #797
- Don't trigger CI when mkdocs config changes by @nathanjmcdougall in #796
- 792 dont trigger ci for changes to mkdocs config by @nathanjmcdougall in #798
- Add FAQ to mkdocs config by @nathanjmcdougall in #791
- Bump the pyproject-fmt version to v2.6.0 from v2.5.0 Test that hard-… by @nathanjmcdougall in #799
- Add test that pre-commit hooks actually runs successfully when adding… by @nathanjmcdougall in #800
- Add global state to turn off pre-commit detection for pre-commit inte… by @nathanjmcdougall in #803
- Check runner.invoke has run successfully in tests by @nathanjmcdougall in #553
- Add social (GitHub, PyPI) icon links to mkdocs config by @nathanjmcdougall in #806
- Add
is_declared_as_depto functionalize checking whether a tool's c… by @nathanjmcdougall in #810 - 802 print how to use could give misleading message regarding pre commit by @nathanjmcdougall in #812
- Catch broader FileConfigError rather than FileDecodeError in is_used by @nathanjmcdougall in #816
- Update
print_how_to_usefor all tools to use new `get_install_metho… by @nathanjmcdougall in #814 - Check whether a pre-commit hook is used as a part of
is_usedheuris… by @nathanjmcdougall in #813 - Revert back to using GitHub-based codspeed runners instead of codspee… by @nathanjmcdougall in #820
- For Import linter, suggest init.py files when INP rules are not s… by @nathanjmcdougall in #821
- Improve error string formatting for consistency by @nathanjmcdougall in #818
- Tidy up cleanup logic for empty TOML sections by @nathanjmcdougall in #830
- Don't use empty ignore-words-list in pyproject.toml config for Codespell by @nathanjmcdougall in #832
- Changelog/0.14.2 by @nathanjmcdougall in #836
Full Changelog: v0.14.1...v0.14.2