From 65227b0cb926df38fde0fd53a8a1b06a5fd9b68a Mon Sep 17 00:00:00 2001 From: Ian Kollipara Date: Thu, 24 Oct 2024 21:02:04 -0500 Subject: [PATCH 01/11] Added changes needed to support pyproject.toml --- green/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/green/config.py b/green/config.py index b32538e..1cd4f33 100644 --- a/green/config.py +++ b/green/config.py @@ -16,6 +16,7 @@ import pathlib # pragma: no cover import sys # pragma: no cover import tempfile # pragma: no cover +import tomllib from textwrap import dedent # pragma: no cover from typing import Callable, Sequence # pragma: no cover @@ -628,7 +629,7 @@ def getConfig( # pragma: no cover cwd = pathlib.Path.cwd() # Medium priority - for cfg_file in ("setup.cfg", ".green"): + for cfg_file in ("setup.cfg", ".green", "pyproject.toml"): config_path = cwd / cfg_file if config_path.is_file(): filepaths.append(config_path) @@ -647,6 +648,9 @@ def getConfig( # pragma: no cover # only if they use setup.cfg if config_path.name == "setup.cfg": parser.read(config_path) + elif config_path.name == "pyproject.toml": + data = tomllib.load(config_path.open("rb"))["tool"] + parser.read_dict(data, source="green") else: parser.read_file(ConfigFile(config_path)) From 08ac511153d4833f7f912e04456f642cbe6d9e64 Mon Sep 17 00:00:00 2001 From: Ian Kollipara Date: Thu, 24 Oct 2024 21:06:31 -0500 Subject: [PATCH 02/11] Switched from tomllib to tomlkit to support 3.8 compat --- green/config.py | 4 ++-- requirements.txt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/green/config.py b/green/config.py index 1cd4f33..a9e1305 100644 --- a/green/config.py +++ b/green/config.py @@ -16,11 +16,11 @@ import pathlib # pragma: no cover import sys # pragma: no cover import tempfile # pragma: no cover -import tomllib from textwrap import dedent # pragma: no cover from typing import Callable, Sequence # pragma: no cover import coverage # pragma: no cover +import tomlkit coverage_version = f"Coverage {coverage.__version__}" # pragma: no cover @@ -649,7 +649,7 @@ def getConfig( # pragma: no cover if config_path.name == "setup.cfg": parser.read(config_path) elif config_path.name == "pyproject.toml": - data = tomllib.load(config_path.open("rb"))["tool"] + data = tomlkit.load(config_path.open("rb"))["tool"] parser.read_dict(data, source="green") else: parser.read_file(ConfigFile(config_path)) diff --git a/requirements.txt b/requirements.txt index 536838f..2949631 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ coverage lxml setuptools unidecode +tomlkit From ecd2914fb8c1ecc0147cd51b3e0cb68a097e396a Mon Sep 17 00:00:00 2001 From: Ian Kollipara Date: Thu, 24 Oct 2024 21:18:37 -0500 Subject: [PATCH 03/11] Updated README to include changes --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 036e5de..029396e 100644 --- a/README.md +++ b/README.md @@ -99,9 +99,10 @@ in the resolution chain overwriting earlier settings (last setting wins). 1) `$HOME/.green` 2) A config file specified by the environment variable `$GREEN_CONFIG` 3) `setup.cfg` in the current working directory of test run -4) `.green` in the current working directory of the test run -5) A config file specified by the command-line argument `--config FILE` -6) [Command-line arguments](https://github.com/CleanCut/green/blob/main/cli-options.txt) +4) `pyproject.toml` in the current working directory of test run +5) `.green` in the current working directory of the test run +6) A config file specified by the command-line argument `--config FILE` +7) [Command-line arguments](https://github.com/CleanCut/green/blob/main/cli-options.txt) Any arguments specified in more than one place will be overwritten by the value of the LAST place the setting is seen. So, for example, if a setting @@ -463,9 +464,9 @@ To run the unittests, we would change to the parent directory of the project $ green proj .... - + Ran 4 tests in 0.125s using 8 processes - + OK (passes=4) Okay, so that's the classic short-form output for unit tests. Green really @@ -475,7 +476,7 @@ shines when you start getting more verbose: $ green -vvv proj Green 4.1.0, Coverage 7.4.1, Python 3.12.2 - + test_foo TestAnswer . answer() returns 42 @@ -483,9 +484,9 @@ shines when you start getting more verbose: TestSchool . test_age . test_food - + Ran 4 tests in 0.123s using 8 processes - + OK (passes=4) Notes: @@ -624,5 +625,5 @@ Wait! What about the other test runners? - **the ones I missed** -- Er, haven't heard of them yet either. I'd love to hear **your** feedback regarding Green. Like it? Hate it? Have -some awesome suggestions? Whatever the case, go +some awesome suggestions? Whatever the case, go [open a discussion](https://github.com/CleanCut/green/discussions) From 918a498caa3865f451374e7a8ee0522968ad7d90 Mon Sep 17 00:00:00 2001 From: Ian Kollipara Date: Fri, 25 Oct 2024 20:24:05 -0500 Subject: [PATCH 04/11] Removed tomlkit, added tests --- green/config.py | 13 ++- green/test/test_config.py | 225 +++++++++++++++++++++++++++++++++----- requirements.txt | 1 - 3 files changed, 206 insertions(+), 33 deletions(-) diff --git a/green/config.py b/green/config.py index a9e1305..f750f64 100644 --- a/green/config.py +++ b/green/config.py @@ -20,7 +20,13 @@ from typing import Callable, Sequence # pragma: no cover import coverage # pragma: no cover -import tomlkit + +try: + import tomllib # pragma: no cover + + supports_tomllib = True +except ImportError: + supports_tomllib = False coverage_version = f"Coverage {coverage.__version__}" # pragma: no cover @@ -629,7 +635,8 @@ def getConfig( # pragma: no cover cwd = pathlib.Path.cwd() # Medium priority - for cfg_file in ("setup.cfg", ".green", "pyproject.toml"): + config_files = [] if not supports_tomllib else ["pyproject.toml"] + for cfg_file in config_files + ["setup.cfg", ".green"]: config_path = cwd / cfg_file if config_path.is_file(): filepaths.append(config_path) @@ -649,7 +656,7 @@ def getConfig( # pragma: no cover if config_path.name == "setup.cfg": parser.read(config_path) elif config_path.name == "pyproject.toml": - data = tomlkit.load(config_path.open("rb"))["tool"] + data = tomllib.load(config_path.open("rb"))["tool"] parser.read_dict(data, source="green") else: parser.read_file(ConfigFile(config_path)) diff --git a/green/test/test_config.py b/green/test/test_config.py index 09f268f..421b2fa 100644 --- a/green/test/test_config.py +++ b/green/test/test_config.py @@ -2,12 +2,13 @@ import configparser import copy -import pathlib -from io import StringIO import os +import pathlib import shutil +import sys import tempfile import unittest +from io import StringIO from typing import Sequence from green import config @@ -133,6 +134,17 @@ def setUp(self): f"verbose = {self.setup_verbose}", ], ) + self.pyproject_filename = cwd_dir / "pyproject.toml" + self.pyproject_failfast = True + self.pyproject_verbose = 2 + self._write_file( + self.pyproject_filename, + [ + "[tool.green]", + f"verbose = {self.pyproject_verbose}", + f"failfast = {str(self.pyproject_failfast).lower()}", + ], + ) class TestConfig(ConfigBase): @@ -140,14 +152,15 @@ class TestConfig(ConfigBase): All variations of config file parsing works as expected. """ - def test_cmd_env_nodef_nosetup(self): + def test_cmd_env_nodef_nosetup_nopyproject(self): """ Setup: --config on cmd, $GREEN_CONFIG is set, $HOME/.green does not - exist, setup.cfg does not exist + exist, setup.cfg does not exist, pyproject.toml does not exist Result: load --config """ self.default_filename.unlink(missing_ok=True) self.setup_filename.unlink(missing_ok=True) + self.pyproject_filename.unlink(missing_ok=True) with ModifiedEnvironment( GREEN_CONFIG=str(self.env_filename), HOME=str(self.tmpd) ): @@ -168,14 +181,15 @@ def test_cmd_env_nodef_nosetup(self): configparser.NoOptionError, cfg.getboolean, "green", "verbose" ) - def test_cmd_noenv_def_nosetup(self): + def test_cmd_noenv_def_nosetup_nopyproject(self): """ Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green exists, - setup.cfg does not exist + setup.cfg does not exist, pypproject.toml does not exist Result: load --config """ os.unlink(self.env_filename) os.remove(self.setup_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig(self.cmd_filename) self.assertEqual(["green"], cfg.sections()) @@ -192,15 +206,16 @@ def test_cmd_noenv_def_nosetup(self): configparser.NoOptionError, cfg.getboolean, "green", "verbose" ) - def test_cmd_noenv_nodef_nosetup(self): + def test_cmd_noenv_nodef_nosetup_nopyproject(self): """ Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green does not - exist, setup.cfg does not exist + exist, setup.cfg does not exist, pyproject.toml does not exist Result: load --config """ os.unlink(self.env_filename) os.unlink(self.default_filename) os.remove(self.setup_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig(self.cmd_filename) self.assertEqual(["green"], cfg.sections()) @@ -227,6 +242,7 @@ def test_nocmd_env_cwd(self): os.chdir(self.tmpd) # setUp is already set to restore us to our pre-testing cwd os.unlink(self.cmd_filename) os.remove(self.setup_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment( GREEN_CONFIG=str(self.env_filename), HOME=str(self.tmpd) ): @@ -247,14 +263,15 @@ def test_nocmd_env_cwd(self): configparser.NoOptionError, cfg.getint, "green", "verbose" ) - def test_nocmd_env_def_nosetup(self): + def test_nocmd_env_def_nosetup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green exists, - setup.cfg does not exist + setup.cfg does not exist, pyproject.toml does not exist Result: load $GREEN_CONFIG """ self.cmd_filename.unlink(missing_ok=True) self.setup_filename.unlink(missing_ok=True) + self.pyproject_filename.unlink(missing_ok=True) with ModifiedEnvironment( GREEN_CONFIG=str(self.env_filename), HOME=str(self.tmpd) ): @@ -273,15 +290,16 @@ def test_nocmd_env_def_nosetup(self): configparser.NoOptionError, cfg.getboolean, "green", "verbose" ) - def test_nocmd_env_nodef_nosetup(self): + def test_nocmd_env_nodef_nosetup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green does not - exist, setup.cfg does not exist + exist, setup.cfg does not exist, pyproject.toml does not exist Result: load $GREEN_CONFIG """ self.cmd_filename.unlink(missing_ok=True) self.default_filename.unlink(missing_ok=True) self.setup_filename.unlink(missing_ok=True) + self.pyproject_filename.unlink(missing_ok=True) with ModifiedEnvironment( GREEN_CONFIG=str(self.env_filename), HOME=str(self.tmpd) ): @@ -302,15 +320,16 @@ def test_nocmd_env_nodef_nosetup(self): configparser.NoOptionError, cfg.getboolean, "green", "verbose" ) - def test_nocmd_noenv_def_nosetup(self): + def test_nocmd_noenv_def_nosetup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG unset, $HOME/.green exists, - setup.cfg does not exist + setup.cfg does not exist, pyproject.toml does not exist Result: load $HOME/.green """ os.unlink(self.cmd_filename) os.unlink(self.env_filename) os.remove(self.setup_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig() self.assertEqual(["green"], cfg.sections()) @@ -329,16 +348,17 @@ def test_nocmd_noenv_def_nosetup(self): configparser.NoOptionError, cfg.getboolean, "green", "verbose" ) - def test_nocmd_noenv_nodef_nosetup(self): + def test_nocmd_noenv_nodef_nosetup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG unset, no $HOME/.green, - setup.cfg does not exist + setup.cfg does not exist, pyproject.toml does not exist Result: empty config """ os.unlink(self.default_filename) os.unlink(self.env_filename) os.unlink(self.cmd_filename) os.remove(self.setup_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig() self.assertEqual([], cfg.sections()) @@ -355,13 +375,14 @@ def test_nocmd_noenv_nodef_nosetup(self): self.assertRaises(configparser.NoSectionError, cfg.get, "green", "version") self.assertRaises(configparser.NoSectionError, cfg.get, "green", "verbose") - def test_cmd_env_nodef_setup(self): + def test_cmd_env_nodef_setup_nopyproject(self): """ Setup: --config on cmd, $GREEN_CONFIG is set, $HOME/.green does not - exist, setup.cfg exists + exist, setup.cfg exists, pyproject.toml does not exist Result: load --config """ os.unlink(self.default_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment( GREEN_CONFIG=str(self.env_filename), HOME=str(self.tmpd) ): @@ -381,13 +402,14 @@ def test_cmd_env_nodef_setup(self): configparser.NoOptionError, cfg.getboolean, "green", "version" ) - def test_cmd_noenv_def_setup(self): + def test_cmd_noenv_def_setup_nopyproject(self): """ Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green exists, - setup.cfg exists + setup.cfg exists, pyproject.toml does not exist Result: load --config """ os.unlink(self.env_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig(self.cmd_filename) self.assertEqual(["green"], cfg.sections()) @@ -403,7 +425,7 @@ def test_cmd_noenv_def_setup(self): self.assertEqual(self.setup_verbose, cfg.getint("green", "verbose")) self.assertEqual(self.setup_failfast, cfg.getboolean("green", "failfast")) - def test_cmd_noenv_nodef_setup(self): + def test_cmd_noenv_nodef_setup_nopyproject(self): """ Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green does not exist, setup.cfg exists @@ -411,6 +433,7 @@ def test_cmd_noenv_nodef_setup(self): """ os.unlink(self.env_filename) os.unlink(self.default_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig(self.cmd_filename) self.assertEqual(["green"], cfg.sections()) @@ -428,13 +451,14 @@ def test_cmd_noenv_nodef_setup(self): self.assertEqual(self.setup_verbose, cfg.getint("green", "verbose")) self.assertEqual(self.setup_failfast, cfg.getboolean("green", "failfast")) - def test_nocmd_env_def_setup(self): + def test_nocmd_env_def_setup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green exists, - setup.cfg exists + setup.cfg exists, pyproject.toml does not exist Result: load $GREEN_CONFIG """ os.unlink(self.cmd_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment( GREEN_CONFIG=str(self.env_filename), HOME=str(self.tmpd) ): @@ -452,14 +476,15 @@ def test_nocmd_env_def_setup(self): self.assertEqual(self.setup_verbose, cfg.getint("green", "verbose")) self.assertEqual(self.setup_failfast, cfg.getboolean("green", "failfast")) - def test_nocmd_env_nodef_setup(self): + def test_nocmd_env_nodef_setup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green does not - exist, setup.cfg exists + exist, setup.cfg exists, pyproject.toml does not exist Result: load $GREEN_CONFIG """ os.unlink(self.cmd_filename) os.unlink(self.default_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment( GREEN_CONFIG=str(self.env_filename), HOME=str(self.tmpd) ): @@ -479,14 +504,15 @@ def test_nocmd_env_nodef_setup(self): self.assertEqual(self.setup_verbose, cfg.getint("green", "verbose")) self.assertEqual(self.setup_failfast, cfg.getboolean("green", "failfast")) - def test_nocmd_noenv_def_setup(self): + def test_nocmd_noenv_def_setup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG unset, $HOME/.green exists, - setup.cfg exists + setup.cfg exists, pyproject.toml does not exist Result: load $HOME/.green """ os.unlink(self.cmd_filename) os.unlink(self.env_filename) + os.unlink(self.pyproject_filename) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig() self.assertEqual(["green"], cfg.sections()) @@ -504,15 +530,16 @@ def test_nocmd_noenv_def_setup(self): self.assertEqual(self.setup_verbose, cfg.getint("green", "verbose")) self.assertEqual(self.setup_failfast, cfg.getboolean("green", "failfast")) - def test_nocmd_noenv_nodef_setup(self): + def test_nocmd_noenv_nodef_setup_nopyproject(self): """ Setup: no --config option, $GREEN_CONFIG unset, no $HOME/.green, - setup.cfg exists + setup.cfg exists, pyproject.toml does not exist Result: empty config """ self.default_filename.unlink(missing_ok=True) self.env_filename.unlink(missing_ok=True) self.cmd_filename.unlink(missing_ok=True) + self.pyproject_filename.unlink(missing_ok=True) with ModifiedEnvironment(GREEN_CONFIG=None, HOME=str(self.tmpd)): cfg = config.getConfig() self.assertEqual(self.setup_verbose, cfg.getint("green", "verbose")) @@ -529,6 +556,146 @@ def test_nocmd_noenv_nodef_setup(self): ) self.assertRaises(configparser.NoOptionError, cfg.get, "green", "version") + def test_nocmd_noenv_nodef_nosetup_pyproject(self): + """ + Setup: no --config option, $GREEN_CONFIG is unset, $HOME/.green does not exist, setup.cfg does not exist, pyproject.toml exists + Result: load pyproject.toml + """ + os.unlink(self.cmd_filename) + os.unlink(self.default_filename) + os.unlink(self.setup_filename) + with ModifiedEnvironment( + HOME=str(self.tmpd), + ): + cfg = config.getConfig() + self.assertEqual(["green"], cfg.sections()) + if sys.version_info.minor >= 11: + self.assertEqual( + self.pyproject_failfast, cfg.getboolean("green", "failfast") + ) + self.assertEqual(self.pyproject_verbose, cfg.getint("green", "verbose")) + else: + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "failfast" + ) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "verbose" + ) + + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "omit-patterns" + ) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "run-coverage" + ) + self.assertRaises(configparser.NoOptionError, cfg.get, "green", "logging") + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "no-skip-report" + ) + self.assertRaises(configparser.NoOptionError, cfg.get, "green", "version") + + def test_cmd_noenv_nodef_nosetup_pyproject(self): + """ + Setup: --config option, $GREEN_CONFIG is unset, $HOME/.green does not exist, setup.cfg does not exist, pyproject.toml exists + Result: load --config + """ + os.unlink(self.default_filename) + os.unlink(self.setup_filename) + with ModifiedEnvironment( + HOME=str(self.tmpd), + ): + cfg = config.getConfig(self.cmd_filename) + self.assertEqual(["green"], cfg.sections()) + self.assertEqual(str(self.cmd_filename), cfg.get("green", "omit-patterns")) + self.assertEqual(self.cmd_logging, cfg.getboolean("green", "logging")) + self.assertEqual( + self.cmd_run_coverage, cfg.getboolean("green", "run-coverage") + ) + self.assertEqual(self.pyproject_filename, cfg.getboolean("failfast")) + self.assertEqual(self.pyproject_verbose, cfg.getint("green", "verbose")) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "no-skip-report" + ) + self.assertRaises(configparser.NoOptionError, cfg.get, "green", "version") + + def test_nocmd_noenv_nodef_setup_pyproject(self): + """ + Setup: no --config option, $GREEN_CONFIG is unset, $HOME/.green does not exist, setup.cfg exists, pyproject.toml exists + Result: load setup.cfg + """ + os.unlink(self.default_filename) + os.unlink(self.cmd_filename) + with ModifiedEnvironment(HOME=str(self.tmpd)): + cfg = config.getConfig() + self.assertEqual(["green"], cfg.sections()) + self.assertEqual(self.setup_failfast, cfg.getboolean("green", "failfast")) + self.assertEqual(self.setup_verbose, cfg.getint("green", "verbose")) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "omit-patterns" + ) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "run-coverage" + ) + self.assertRaises(configparser.NoOptionError, cfg.get, "green", "logging") + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "no-skip-report" + ) + self.assertRaises(configparser.NoOptionError, cfg.get, "green", "version") + + def test_nocmd_noenv_def_nosetup_pyproject(self): + """ + Setup: no --config option, $GREEN_CONFIG is unset, $HOME/.green exists, setup.cfg does not exist, pyproject exists + Result: load $HOME/.green + """ + os.unlink(self.env_filename) + os.unlink(self.setup_filename) + os.unlink(self.cmd_filename) + with ModifiedEnvironment(HOME=str(self.tmpd)): + cfg = config.getConfig() + self.assertEqual(["green"], cfg.sections()) + self.assertEqual(self.default_failfast, cfg.getboolean("green", "failfast")) + self.assertEqual(self.default_logging, cfg.getboolean("green", "logging")) + self.assertEqual( + self.default_termcolor, cfg.getboolean("green", "termcolor") + ) + self.assertEqual(self.default_version, cfg.getboolean("green", "version")) + self.assertEqual( + str(self.default_filename), cfg.get("green", "omit-patterns") + ) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "run-coverage" + ) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "no-skip-report" + ) + + def test_nocmd_env_nodef_nosetup_pyproject(self): + """ + Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green does not exist, setup.cfg does not exist, pyproject.toml exists + Result: load $GREEN_CONFIG + """ + os.unlink(self.cmd_filename) + os.unlink(self.setup_filename) + os.unlink(self.default_filename) + with ModifiedEnvironment( + HOME=str(self.tmpd), GREEN_CONFIG=str(self.env_filename) + ): + cfg = config.getConfig() + self.assertEqual(["green"], cfg.sections()) + self.assertEqual(self.env_logging, cfg.getboolean("green", "logging")) + self.assertEqual( + self.env_no_skip_report, cfg.getboolean("green", "no-skip-report") + ) + self.assertEqual(str(self.env_filename), cfg.get("green", "omit-patterns")) + self.assertRaises( + configparser.NoOptionError, cfg.get, "green", "run-coverage" + ) + self.assertRaises(configparser.NoOptionError, cfg.get, "green", "termcolor") + self.assertEqual( + self.pyproject_failfast, cfg.getboolean("green", "failfast") + ) + self.assertRaises(configparser.NoOptionError, cfg.get, "green", "version") + class TestMergeConfig(ConfigBase): """ diff --git a/requirements.txt b/requirements.txt index 2949631..536838f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,3 @@ coverage lxml setuptools unidecode -tomlkit From 6dc1b734dd39fce845cc3183a18a396fa9130eb4 Mon Sep 17 00:00:00 2001 From: Ian Kollipara Date: Mon, 28 Oct 2024 16:04:31 -0500 Subject: [PATCH 05/11] Added optional toml support for python < 3.11 using tomli --- README.md | 2 +- green/config.py | 5 ++++- setup.cfg | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 029396e..d6f09f6 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Quick Start ----------- ```bash -pip3 install green # To upgrade: "pip3 install --upgrade green" +pip3 install green # To upgrade: "pip3 install --upgrade green"; To include pyproject.toml support in python <= 3.11 "pip3 install green[toml]" ``` Now run green... diff --git a/green/config.py b/green/config.py index f750f64..726d4e8 100644 --- a/green/config.py +++ b/green/config.py @@ -22,7 +22,10 @@ import coverage # pragma: no cover try: - import tomllib # pragma: no cover + if sys.version_info >= (3, 11): + import tomllib + else: + import tomli as tomllib supports_tomllib = True except ImportError: diff --git a/setup.cfg b/setup.cfg index c68d4cd..2e1d428 100644 --- a/setup.cfg +++ b/setup.cfg @@ -75,6 +75,7 @@ packages = find: [options.extras_require] dev = file:requirements-dev.txt +toml = tomli>=1.10 ; python_version < "3.11" [options.package_data] green = VERSION, shell_completion.sh From f044a22d15f41b9a845212387a4dc58c8747fb6e Mon Sep 17 00:00:00 2001 From: Ian Kollipara Date: Sun, 10 Nov 2024 14:38:11 -0600 Subject: [PATCH 06/11] Update README.md Co-authored-by: Stephane Odul <1504511+sodul@users.noreply.github.com> --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d6f09f6..7714d3d 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,11 @@ Quick Start ----------- ```bash -pip3 install green # To upgrade: "pip3 install --upgrade green"; To include pyproject.toml support in python <= 3.11 "pip3 install green[toml]" +pip3 install green +# To upgrade: +pip3 install --upgrade green +# To add pyproject.toml support in python < 3.11: +pip3 install 'green[toml]' ``` Now run green... From 2d95005c2701d424ec578085c6860acd5b0bfc3d Mon Sep 17 00:00:00 2001 From: Ian Kollipara Date: Sun, 10 Nov 2024 14:38:41 -0600 Subject: [PATCH 07/11] Adjusted version identifier syntax --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 2e1d428..1973c23 100644 --- a/setup.cfg +++ b/setup.cfg @@ -75,7 +75,7 @@ packages = find: [options.extras_require] dev = file:requirements-dev.txt -toml = tomli>=1.10 ; python_version < "3.11" +toml = tomli>=1.10;python_version<'3.11' [options.package_data] green = VERSION, shell_completion.sh From df3d550cadf968601282d30632b186fe58b89c5c Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Tue, 12 Nov 2024 10:55:23 -0700 Subject: [PATCH 08/11] Update green/config.py --- green/config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/green/config.py b/green/config.py index 726d4e8..fb964fc 100644 --- a/green/config.py +++ b/green/config.py @@ -638,7 +638,9 @@ def getConfig( # pragma: no cover cwd = pathlib.Path.cwd() # Medium priority - config_files = [] if not supports_tomllib else ["pyproject.toml"] + config_files = ["pyproject.toml", "setup.cfg", ".green"] + if not supports_tomllib: + config_files.remove("pyproject.toml") for cfg_file in config_files + ["setup.cfg", ".green"]: config_path = cwd / cfg_file if config_path.is_file(): From 1ba15ff4a43ab7f008585f2651919a74e36c3932 Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Tue, 12 Nov 2024 10:57:18 -0700 Subject: [PATCH 09/11] Update setup.cfg --- setup.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 1973c23..1335127 100644 --- a/setup.cfg +++ b/setup.cfg @@ -75,7 +75,9 @@ packages = find: [options.extras_require] dev = file:requirements-dev.txt -toml = tomli>=1.10;python_version<'3.11' +# For the version marker syntax to work, the value needs to be on a dangling line +toml = + tomli>=1.10; python_version<'3.11' [options.package_data] green = VERSION, shell_completion.sh From 1cb5e6b1b5e4362651b09d14bb47f10d8841fe55 Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Tue, 12 Nov 2024 11:04:39 -0700 Subject: [PATCH 10/11] Update green/test/test_config.py --- green/test/test_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/green/test/test_config.py b/green/test/test_config.py index 421b2fa..53dc0a8 100644 --- a/green/test/test_config.py +++ b/green/test/test_config.py @@ -611,7 +611,7 @@ def test_cmd_noenv_nodef_nosetup_pyproject(self): self.assertEqual( self.cmd_run_coverage, cfg.getboolean("green", "run-coverage") ) - self.assertEqual(self.pyproject_filename, cfg.getboolean("failfast")) + self.assertEqual(self.pyproject_filename, cfg.getboolean("green", "failfast")) self.assertEqual(self.pyproject_verbose, cfg.getint("green", "verbose")) self.assertRaises( configparser.NoOptionError, cfg.get, "green", "no-skip-report" From 7e1b8ade6aa7e785418f494a12b09973b899cb4f Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Tue, 12 Nov 2024 11:12:00 -0700 Subject: [PATCH 11/11] Update green/test/test_config.py --- green/test/test_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/green/test/test_config.py b/green/test/test_config.py index 53dc0a8..e1c5a05 100644 --- a/green/test/test_config.py +++ b/green/test/test_config.py @@ -611,7 +611,7 @@ def test_cmd_noenv_nodef_nosetup_pyproject(self): self.assertEqual( self.cmd_run_coverage, cfg.getboolean("green", "run-coverage") ) - self.assertEqual(self.pyproject_filename, cfg.getboolean("green", "failfast")) + self.assertEqual(self.pyproject_failfast, cfg.getboolean("green", "failfast")) self.assertEqual(self.pyproject_verbose, cfg.getint("green", "verbose")) self.assertRaises( configparser.NoOptionError, cfg.get, "green", "no-skip-report"