Rework specifying and layering of configuration
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 3.8k
- Forks
- 356
- PR merge metrics
- No merged PRs in 30d
Description
In GitLab by @ericvw on Dec 29, 2019, 07:30
After having spent some time making changes in CLI parsing, the configuration
file loading, and the layering of the configuration options, I would like to
simplify how configuration gets specified and layered. I wanted to raise this
issue for awareness and discussion before proceeding with this larger goal.
The user-facing would be the following:
- Allow
--configto be used multiple times for specifying configuration
files. Options in subsequent--configfile take precedence. The command
line arguments in the configuration files will be used as if they were
provided first on the command line before other options that are specified on
the command line. - Remove
--append-configin favor of--confignow that--configcan be
specified multiple times. - Keep
--isolatedto ignore the automatic detection of configuration (i.e.,
user configuration and the searching-up-the-paths configuration). However,
--configmay be specified with--isolatedto provide files to be parsed.
Below are the behaviors expected if the above changes were implemented:
# Configuration options found in the user's config path followed by
# configuration options found locally taking precedence.
flake8 file1.py file2.py
# Same as above with options in 'config.ini' taking precedence.
flake8 --config config.ini file1.py file2.py
# The '--max-line-length 99' takes precedence over the option specified in
# any configuration file.
flake8 --max-line-length 99 --config config.ini file1.py file2.py
# Configuration options in 'config2.ini' takes precedence over those in 'config1.ini'.
flake8 --config config1.ini --config2.ini file1.py file2.py
# Configuration options in 'config1.ini' takes precedence over those in 'config2.ini'.
flake8 --config2.ini --config config1.ini file1.py file2.py
# Default configuration is used and not read from the user's config path nor
# detecting local configuration.
flake8 --isolated file1.py file2.py
# Same as above, however, configuration options in 'config.ini' are used as if they were
# specified on the command line.
flake8 --isolated --config 'config.ini' file1.py file2.py
With these changes, the benefits are the following:
- Configuration files from
--configare just appended to a single list to be
parsed. If--isolatedis not specified, elide the user and local files
included in the list of configuration files to parse. - Handling of single configuration and what is considered "appended"
configuration is exactly the same. - With
--isolatedpresent, there is still an elegant way to specify a set of
configuration options via file without having to put them all on the command
line.
The following trade-offs are the following:
- The changes are backward-incompatible.
- Removal of
--append-config. - Changing the behavior of
--isolatedto allow--configin addition to. - Change the behavior of
--configto be specified multiple times.
- Removal of
@asottile and @sigmavirus24, would greatly appreciate your input and feedback
before I proceed forward. Thanks!
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing flake8's CLI parsing, configuration file loading, and configuration-layering paths; the issue does not name specific files or tests. Compare the current behavior with each shell example, then define the parsing order and precedence rules needed for repeated --config, removal of --append-config, and --isolated handling. Done means the listed behaviors are implemented and verified.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- cli, tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100