Sourcery CLI, plugin quality metrics, new refactorings
Sourcery CLI
Sourcery is now available as a command line interface. This enables several new use cases:
- Refactor files on your machine without needing to run Sourcery through PyCharm or VSCode
- Check every commit is refactored using a pre-commit hook
- Run a continuous integration job to check all code is refactored
This functionality is only available with Pro/Team subscriptions. If you’d like to try it out for your team please contact us.
Installation
The Sourcery command line interface can be installed by running:
pip install sourcery
Login
Once installed you can interactively login with:
sourcery login
which will open up a browser tab and ask for confirmation.
Usage
To display suggested refactorings as a diff:
sourcery refactor {file_or_directory}
And to apply those changes to the files:
sourcery refactor --in-place {file_or_directory}
Full documentation is available here.
Code quality metrics enabled by default in the IDE plugins
You can now hover over a method definition to see a quick view of its code quality. The metrics available are:
- Cognitive complexity - a measure of how much complex nested logic is in the method
- Size - a measure of how large the method is
- Working memory - a measure of how many variables you need to keep in mind to understand the most complex parts of the method
- Quality - a combination of the above metrics to give a percentage quality score
This can be switched off in the Sourcery section of the plugin settings.
New Refactorings
Use with
context manager to ensure file closure
A common way of opening and using files is:
file = open("welcome.txt")
data = file.read()
print(data)
file.close()
However if an exception is thrown in between the file being opened and closed
the call to file.close()
may end up being skipped. By using Python’s with
context manager the file is closed for you as soon as the block is exited.
with open("welcome.txt") as file:
data = file.read()
print(data)
Extending the list-comprehension
refactoring
We have now extended this refactoring to include an additional case, where
augmented assignment is used to add to the list rather than append
.
The following code:
files = []
for x in file_iterator:
if x[-4:] == ".csv":
files += [x]
will now be refactored as:
files = [x for x in file_iterator if x[-4:] == ".csv"]
Simplify if
expression by using or
Often we find ourselves setting a value if it evaluates to True, and otherwise using a default.
currency = args["currency"] if args["currency"] else DEFAULT_CURRENCY
This can be simplified to the following, which is a bit easier to read and
avoids the duplication of python›args['currency']
.
currency = args["currency"] or DEFAULT_CURRENCY
Bug Fixes
- Prevent
use-assigned-variable
from re-using properties