config-cli-gui 0.2.1__tar.gz → 0.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/HISTORY.md +23 -0
  2. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/PKG-INFO +1 -1
  3. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/config.yaml +2 -2
  4. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/usage/cli.md +1 -1
  5. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/usage/config.md +1 -1
  6. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui/_version.py +3 -3
  7. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui/cli.py +0 -10
  8. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui/config.py +3 -0
  9. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui.egg-info/PKG-INFO +1 -1
  10. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui.egg-info/SOURCES.txt +1 -0
  11. config_cli_gui-0.2.3/tests/test_cli.py +157 -0
  12. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/test_config_manager.py +5 -4
  13. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/FUNDING.yml +0 -0
  14. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/actions/setup-environment/action.yml +0 -0
  18. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/dependabot.yml +0 -0
  19. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/init.sh +0 -0
  20. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/release_message.sh +0 -0
  21. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/update_funding.py +0 -0
  22. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/workflows/main.yml +0 -0
  23. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/workflows/release.yml +0 -0
  24. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.github/workflows/update_readme.yml +0 -0
  25. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.gitignore +0 -0
  26. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.idea/runConfigurations/config_generate.xml +0 -0
  27. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.idea/runConfigurations/example_project_cli.xml +0 -0
  28. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.idea/runConfigurations/example_project_gui.xml +0 -0
  29. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.pre-commit-config.yaml +0 -0
  30. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/.readthedocs.yaml +0 -0
  31. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/LICENSE +0 -0
  32. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/Makefile +0 -0
  33. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/README.md +0 -0
  34. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/.nav.yml +0 -0
  35. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/_static/img/favicon.png +0 -0
  36. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/_static/img/logo.png +0 -0
  37. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/css/custom.css +0 -0
  38. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/develop/contributing.md +0 -0
  39. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/develop/make_windows.md +0 -0
  40. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/develop/naming_convention.md +0 -0
  41. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/funding/funding.md +0 -0
  42. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/getting-started/install.md +0 -0
  43. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/getting-started/virtual-environment.md +0 -0
  44. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/docs/index.md +0 -0
  45. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/mkdocs.yml +0 -0
  46. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/pyproject.toml +0 -0
  47. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/scripts/show_filelist.ps1 +0 -0
  48. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/scripts/show_tree.ps1 +0 -0
  49. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/scripts/show_tree.py +0 -0
  50. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/scripts/update_readme.py +0 -0
  51. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/setup.cfg +0 -0
  52. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/__init__.py +0 -0
  53. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui/__init__.py +0 -0
  54. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui/docs.py +0 -0
  55. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui/gui.py +0 -0
  56. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui.egg-info/dependency_links.txt +0 -0
  57. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui.egg-info/entry_points.txt +0 -0
  58. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui.egg-info/requires.txt +0 -0
  59. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/src/config_cli_gui.egg-info/top_level.txt +0 -0
  60. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/template.yml.url +0 -0
  61. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/__init__.py +0 -0
  62. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/__init__.py +0 -0
  63. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/__main__.py +0 -0
  64. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/cli/__init__.py +0 -0
  65. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/cli/__main__.py +0 -0
  66. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/cli/cli_example.py +0 -0
  67. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/config/__init__.py +0 -0
  68. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/config/config_example.py +0 -0
  69. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/core/__init__.py +0 -0
  70. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/core/base.py +0 -0
  71. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/core/logging.py +0 -0
  72. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/example.gpx +0 -0
  73. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/gui/__init__.py +0 -0
  74. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/gui/__main__.py +0 -0
  75. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/gui/config.yaml +0 -0
  76. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/example_project/gui/gui_example.py +0 -0
  77. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/test_docs.py +0 -0
  78. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/tests/test_generic_cli.py +0 -0
  79. {config_cli_gui-0.2.1 → config_cli_gui-0.2.3}/uv.lock +0 -0
@@ -4,6 +4,29 @@ Changelog
4
4
 
5
5
  (unreleased)
6
6
  ------------
7
+ - Color: return rgb tuple. [Paul Magister]
8
+ - Color: return rgb tuple. [Paul Magister]
9
+ - #9 cli: no .logger import. [Paul Magister]
10
+ - #9 cli: new defaults. [Paul Magister]
11
+
12
+
13
+ 0.2.2 (2025-11-14)
14
+ ------------------
15
+ - Docs: Update HISTORY.md for release 0.2.2. [Paul Magister]
16
+ - #9 cli: unittests. [Paul Magister]
17
+
18
+
19
+ 0.2.1 (2025-11-14)
20
+ ------------------
21
+ - #9 Fix cli bugs: allow toggle or bool. [Paul Magister]
22
+ - #9 Fix cli bugs. [Paul Magister]
23
+ - #9 Fix problems and add ide configs. [Paul Magister]
24
+ - #9 fix cli_example.py. [Paul Magister]
25
+
26
+
27
+ 0.2.0 (2025-11-13)
28
+ ------------------
29
+ - Docs: Update HISTORY.md for release 0.2.0. [Paul Magister]
7
30
  - #9 fix posix path issue. [Paul Magister]
8
31
  - #9 fix posix path issue. [Paul Magister]
9
32
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: config-cli-gui
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: Feature-rich Python project template for config-cli-gui.
5
5
  Author: pamagister
6
6
  Requires-Python: <3.12,>=3.10
@@ -16,8 +16,8 @@ app:
16
16
  # Maximum number of worker threads | type=int, default=4
17
17
  max_workers: 4
18
18
  cli:
19
- # Include elevation data in waypoints | type=bool, default=True [CLI]
20
- elevation: true
19
+ # Include elevation data in waypoints | type=bool, default=False [CLI]
20
+ elevation: false
21
21
  # Extract starting points of each track as waypoint | type=bool, default=True [CLI]
22
22
  extract_waypoints: true
23
23
  # Path to input (file or folder) | type=str, default= [CLI]
@@ -14,7 +14,7 @@ python -m app [OPTIONS] input
14
14
  | `--output` | str | Path to output destination | *required* | - |
15
15
  | `--min_dist` | int | Maximum distance between two waypoints | 20 | - |
16
16
  | `--extract_waypoints` | bool | Extract starting points of each track as waypoint | True | [True, False] |
17
- | `--elevation` | bool | Include elevation data in waypoints | True | [True, False] |
17
+ | `--elevation` | bool | Include elevation data in waypoints | False | [True, False] |
18
18
 
19
19
 
20
20
  ## Examples
@@ -11,7 +11,7 @@ The parameters in the cli category can be accessed via the command line interfac
11
11
  | output | str | Path to output destination | '' | - |
12
12
  | min_dist | int | Maximum distance between two waypoints | 20 | - |
13
13
  | extract_waypoints | bool | Extract starting points of each track as waypoint | True | [True, False] |
14
- | elevation | bool | Include elevation data in waypoints | True | [True, False] |
14
+ | elevation | bool | Include elevation data in waypoints | False | [True, False] |
15
15
 
16
16
  ## Category "app"
17
17
 
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.2.1'
32
- __version_tuple__ = version_tuple = (0, 2, 1)
31
+ __version__ = version = '0.2.3'
32
+ __version_tuple__ = version_tuple = (0, 2, 3)
33
33
 
34
- __commit_id__ = commit_id = 'ge612edfc1'
34
+ __commit_id__ = commit_id = 'g888cf5630'
@@ -120,16 +120,6 @@ class CliGenerator:
120
120
  overrides = self.create_config_overrides(args)
121
121
  config.apply_overrides(overrides)
122
122
 
123
- # Try to get logger if logging is configured
124
- try:
125
- from .logging import get_logger
126
-
127
- logger = get_logger(f"{self.app_name}.cli")
128
- logger.info(f"Starting {self.app_name} CLI")
129
- logger.debug(f"Command line arguments: {vars(args)}")
130
- except ImportError:
131
- pass
132
-
133
123
  # Optional validation
134
124
  if validator and not validator(config):
135
125
  print("Configuration validation failed.")
@@ -20,6 +20,9 @@ class Color:
20
20
  def to_list(self) -> list[int]:
21
21
  return [self.r, self.g, self.b]
22
22
 
23
+ def to_rgb(self) -> tuple[float]:
24
+ return (self.r / 255, self.g / 255, self.b / 255)
25
+
23
26
  def to_hex(self) -> str:
24
27
  return f"#{self.r:02x}{self.g:02x}{self.b:02x}"
25
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: config-cli-gui
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: Feature-rich Python project template for config-cli-gui.
5
5
  Author: pamagister
6
6
  Requires-Python: <3.12,>=3.10
@@ -56,6 +56,7 @@ src/config_cli_gui.egg-info/entry_points.txt
56
56
  src/config_cli_gui.egg-info/requires.txt
57
57
  src/config_cli_gui.egg-info/top_level.txt
58
58
  tests/__init__.py
59
+ tests/test_cli.py
59
60
  tests/test_config_manager.py
60
61
  tests/test_docs.py
61
62
  tests/test_generic_cli.py
@@ -0,0 +1,157 @@
1
+ import sys
2
+ from unittest.mock import mock_open, patch
3
+
4
+ import pytest
5
+
6
+ from config_cli_gui.cli import CliGenerator
7
+ from tests.example_project.config.config_example import ProjectConfigManager
8
+
9
+ # ----------------------------------------------------------------------
10
+ # Mock config.yaml content
11
+ # ----------------------------------------------------------------------
12
+ MOCK_YAML = """\
13
+ app:
14
+ date_format: '%Y-%m-%d'
15
+ enable_console_logging: true
16
+ enable_file_logging: true
17
+
18
+ cli:
19
+ elevation: true
20
+ extract_waypoints: true
21
+ input: ''
22
+ min_dist: 20
23
+ output: ''
24
+ """
25
+
26
+
27
+ # ----------------------------------------------------------------------
28
+ # Fixtures
29
+ # ----------------------------------------------------------------------
30
+ @pytest.fixture
31
+ def config_manager():
32
+ return ProjectConfigManager()
33
+
34
+
35
+ @pytest.fixture
36
+ def cli_gen(config_manager):
37
+ return CliGenerator(config_manager)
38
+
39
+
40
+ # ----------------------------------------------------------------------
41
+ # Tests
42
+ # ----------------------------------------------------------------------
43
+ def test_positional_argument_parsing(cli_gen):
44
+ argv = [
45
+ "prog",
46
+ "--min_dist",
47
+ "77",
48
+ "tests/example_project/example.gpx",
49
+ ]
50
+
51
+ with patch.object(sys, "argv", argv):
52
+ parser = cli_gen.create_argument_parser()
53
+ args = parser.parse_args()
54
+
55
+ assert args.input == "tests/example_project/example.gpx"
56
+ assert args.min_dist == "77" or args.min_dist == 77
57
+
58
+
59
+ def test_boolean_explicit_true(cli_gen):
60
+ argv = [
61
+ "prog",
62
+ "--elevation",
63
+ "true",
64
+ "tests/file.gpx",
65
+ ]
66
+
67
+ with patch.object(sys, "argv", argv):
68
+ parser = cli_gen.create_argument_parser()
69
+ args = parser.parse_args()
70
+
71
+ assert args.elevation is True
72
+
73
+
74
+ def test_boolean_explicit_false(cli_gen):
75
+ argv = [
76
+ "prog",
77
+ "--elevation",
78
+ "false",
79
+ "tests/file.gpx",
80
+ ]
81
+
82
+ with patch.object(sys, "argv", argv):
83
+ parser = cli_gen.create_argument_parser()
84
+ args = parser.parse_args()
85
+
86
+ assert args.elevation is False
87
+
88
+
89
+ def test_boolean_toggle(cli_gen):
90
+ # default elevation=False in CliConfig → toggle makes it True
91
+ argv = [
92
+ "prog",
93
+ "--elevation",
94
+ "--min_dist",
95
+ "42",
96
+ "tests/file.gpx",
97
+ ]
98
+
99
+ with patch.object(sys, "argv", argv):
100
+ parser = cli_gen.create_argument_parser()
101
+ args = parser.parse_args()
102
+
103
+ assert args.elevation is True
104
+
105
+
106
+ def test_load_config_file_and_override(cli_gen):
107
+ argv = [
108
+ "prog",
109
+ "--config",
110
+ "config.yaml",
111
+ "--min_dist",
112
+ "42",
113
+ "--elevation",
114
+ "false",
115
+ "tests/example_project/file.gpx",
116
+ ]
117
+
118
+ with patch.object(sys, "argv", argv):
119
+ with patch("builtins.open", mock_open(read_data=MOCK_YAML)):
120
+ with patch("pathlib.Path.exists", return_value=True):
121
+ params = {}
122
+
123
+ def fake_main(conf):
124
+ nonlocal params
125
+ params["input"] = conf.cli.input.value
126
+ params["min_dist"] = conf.cli.min_dist.value
127
+ params["elevation"] = conf.cli.elevation.value
128
+ params["extract_waypoints"] = conf.cli.extract_waypoints.value
129
+ return 0
130
+
131
+ exit_code = cli_gen.run_cli(main_function=fake_main)
132
+
133
+ assert exit_code == 0
134
+ assert params["input"] == "tests/example_project/file.gpx"
135
+ assert params["min_dist"] == "42" or params["min_dist"] == 42
136
+ assert params["elevation"] is False # override
137
+ assert params["extract_waypoints"] is True # from config file
138
+
139
+
140
+ def test_cli_overrides_applied_correctly(cli_gen):
141
+ argv = [
142
+ "prog",
143
+ "--min_dist",
144
+ "55",
145
+ "--output",
146
+ "out.gpx",
147
+ "tests/input.gpx",
148
+ ]
149
+
150
+ with patch.object(sys, "argv", argv):
151
+ parser = cli_gen.create_argument_parser()
152
+ args = parser.parse_args()
153
+ overrides = cli_gen.create_config_overrides(args)
154
+
155
+ assert overrides["cli__min_dist"] == "55" or overrides["cli__min_dist"] == 55
156
+ assert overrides["cli__output"] == "out.gpx"
157
+ assert overrides["cli__input"] == "tests/input.gpx"
@@ -30,10 +30,11 @@ class ExampleCategory(ConfigCategory):
30
30
 
31
31
 
32
32
  def test_color_basic():
33
- c = Color(10, 20, 30)
34
- assert c.to_list() == [10, 20, 30]
35
- assert c.to_hex() == "#0a141e"
36
- assert str(c) == "#0a141e"
33
+ c = Color(0, 51, 255)
34
+ assert c.to_list() == [0, 51, 255]
35
+ assert c.to_hex() == "#0033ff"
36
+ assert c.to_rgb() == (0.0, 0.2, 1.0)
37
+ assert str(c) == "#0033ff"
37
38
 
38
39
 
39
40
  def test_color_clamping():
File without changes
File without changes
File without changes
File without changes
File without changes