snk-cli 0.4.0__tar.gz → 0.5.0__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 (69) hide show
  1. {snk_cli-0.4.0 → snk_cli-0.5.0}/PKG-INFO +1 -1
  2. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/__about__.py +1 -1
  3. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/dynamic_typer.py +11 -2
  4. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/options/option.py +1 -0
  5. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/options/utils.py +4 -1
  6. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/snk.yaml +2 -0
  7. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/test_dynamic_options.py +34 -1
  8. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/test_snk_config.py +8 -1
  9. {snk_cli-0.4.0 → snk_cli-0.5.0}/.github/workflows/publish.yml +0 -0
  10. {snk_cli-0.4.0 → snk_cli-0.5.0}/.github/workflows/tests.yml +0 -0
  11. {snk_cli-0.4.0 → snk_cli-0.5.0}/.gitignore +0 -0
  12. {snk_cli-0.4.0 → snk_cli-0.5.0}/LICENSE.txt +0 -0
  13. {snk_cli-0.4.0 → snk_cli-0.5.0}/README.md +0 -0
  14. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/index.md +0 -0
  15. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/cli.md +0 -0
  16. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/config.md +0 -0
  17. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/dynamic_typer.md +0 -0
  18. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/options.md +0 -0
  19. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/subcommands.md +0 -0
  20. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/testing.md +0 -0
  21. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/utils.md +0 -0
  22. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/validate.md +0 -0
  23. {snk_cli-0.4.0 → snk_cli-0.5.0}/docs/reference/workflow.md +0 -0
  24. {snk_cli-0.4.0 → snk_cli-0.5.0}/mkdocs.yml +0 -0
  25. {snk_cli-0.4.0 → snk_cli-0.5.0}/pyproject.toml +0 -0
  26. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/__init__.py +0 -0
  27. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/cli.py +0 -0
  28. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/conda.py +0 -0
  29. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/config/__init__.py +0 -0
  30. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/config/config.py +0 -0
  31. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/config/utils.py +0 -0
  32. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/options/__init__.py +0 -0
  33. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/subcommands/__init__.py +0 -0
  34. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/subcommands/config.py +0 -0
  35. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/subcommands/env.py +0 -0
  36. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/subcommands/profile.py +0 -0
  37. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/subcommands/run.py +0 -0
  38. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/subcommands/script.py +0 -0
  39. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/testing.py +0 -0
  40. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/utils.py +0 -0
  41. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/validate.py +0 -0
  42. {snk_cli-0.4.0 → snk_cli-0.5.0}/src/snk_cli/workflow.py +0 -0
  43. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/__init__.py +0 -0
  44. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/conftest.py +0 -0
  45. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/artic_v4.1.bed +0 -0
  46. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/config.yaml +0 -0
  47. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/cov.fasta +0 -0
  48. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/print_config/Snakefile +0 -0
  49. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/print_config/cli.py +0 -0
  50. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/print_config/config.yaml +0 -0
  51. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/print_config/snk.yaml +0 -0
  52. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/cli.py +0 -0
  53. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/config.yaml +0 -0
  54. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/resources/data.txt +0 -0
  55. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/things/__about__.py +0 -0
  56. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/workflow/Snakefile +0 -0
  57. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/workflow/envs/wget.yml +0 -0
  58. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/workflow/profiles/base/config.yaml +0 -0
  59. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/workflow/profiles/slurm/config.yaml +0 -0
  60. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/data/workflow/workflow/scripts/hello.py +0 -0
  61. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/__init__.py +0 -0
  62. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/test_profile.py +0 -0
  63. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/test_run.py +0 -0
  64. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/test_subcommands.py +0 -0
  65. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/test_validate.py +0 -0
  66. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_cli/test_workflow_cli.py +0 -0
  67. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_conda_env.py +0 -0
  68. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/test_dynamic_typer.py +0 -0
  69. {snk_cli-0.4.0 → snk_cli-0.5.0}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: snk-cli
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Project-URL: Documentation, https://github.com/wytamma/snk-cli#readme
5
5
  Project-URL: Issues, https://github.com/wytamma/snk-cli/issues
6
6
  Project-URL: Source, https://github.com/wytamma/snk-cli
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024-present Wytamma Wirth <wytamma.wirth@me.com>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "0.4.0"
4
+ __version__ = "0.5.0"
@@ -2,6 +2,7 @@ import typer
2
2
  from typing import List, Callable
3
3
  from inspect import signature, Parameter
4
4
  from makefun import with_signature
5
+ from enum import Enum
5
6
 
6
7
  from .options import Option
7
8
  import sys
@@ -146,17 +147,25 @@ class DynamicTyper:
146
147
  >>> create_cli_parameter(option)
147
148
  Parameter('foo', kind=Parameter.POSITIONAL_OR_KEYWORD, default=typer.Option(..., help='[CONFIG] A number'), annotation=int)
148
149
  """
150
+ annotation_type = option.type
151
+ default = option.default
152
+ if option.type is Enum or option.choices:
153
+ if not option.choices:
154
+ raise ValueError(f"Enum type {option.name} requires choices to be defined.")
155
+ annotation_type = Enum('DynamicEnum', {e: e for e in option.choices})
156
+ if default:
157
+ default = annotation_type(default)
149
158
  return Parameter(
150
159
  option.name,
151
160
  kind=Parameter.POSITIONAL_OR_KEYWORD,
152
161
  default=typer.Option(
153
- ... if option.required else option.default,
162
+ ... if option.required else default,
154
163
  *[option.flag, option.short_flag] if option.short else [],
155
164
  help=f"{option.help}",
156
165
  rich_help_panel="Workflow Configuration",
157
166
  hidden=option.hidden,
158
167
  ),
159
- annotation=option.type,
168
+ annotation=annotation_type,
160
169
  )
161
170
 
162
171
  def check_if_option_passed_via_command_line(self, option: Option):
@@ -16,3 +16,4 @@ class Option:
16
16
  short_flag: Optional[str]
17
17
  hidden: bool = False
18
18
  from_annotation: bool = False
19
+ choices: Optional[list] = None
@@ -1,8 +1,9 @@
1
- from typing import List, Any
1
+ from typing import List
2
2
  from ..config.config import SnkConfig
3
3
  from ..utils import get_default_type, flatten
4
4
  from .option import Option
5
5
  from pathlib import Path
6
+ from enum import Enum
6
7
 
7
8
  types = {
8
9
  "int": int,
@@ -17,6 +18,7 @@ types = {
17
18
  "list[str]": List[str],
18
19
  "list[path]": List[Path],
19
20
  "list[int]": List[int],
21
+ "enum": Enum,
20
22
  }
21
23
 
22
24
  def get_keys_from_annotation(annotations):
@@ -78,6 +80,7 @@ def create_option_from_annotation(
78
80
  short_flag=f"-{short}" if short else None,
79
81
  hidden=hidden,
80
82
  from_annotation=from_annotation,
83
+ choices=annotation_values.get(f"{annotation_key}:choices", None),
81
84
  )
82
85
 
83
86
 
@@ -9,6 +9,8 @@ cli:
9
9
  type: bool
10
10
  null_annotation:
11
11
  default: null
12
+ enum:
13
+ choices: [a, b, c]
12
14
  test:
13
15
  another:
14
16
  test:
@@ -35,9 +35,42 @@ def test_create_option_from_annotation(
35
35
  assert option.default == "default_value"
36
36
  assert option.updated is False
37
37
  assert option.help == "Test help"
38
- assert option.type == str
38
+ assert option.type is str
39
39
  assert option.required is True
40
40
 
41
+ def test_create_option_from_annotation_with_short(
42
+ default_annotation_values, default_default_values
43
+ ):
44
+ default_annotation_values["test:short"] = "t"
45
+
46
+ option = create_option_from_annotation(
47
+ "test", default_annotation_values, default_default_values
48
+ )
49
+
50
+ assert option.short == "t"
51
+
52
+ def test_create_option_from_annotation_with_hidden(
53
+ default_annotation_values, default_default_values
54
+ ):
55
+ default_annotation_values["test:hidden"] = True
56
+
57
+ option = create_option_from_annotation(
58
+ "test", default_annotation_values, default_default_values
59
+ )
60
+
61
+ assert option.hidden is True
62
+
63
+ def test_create_option_from_annotation_with_enums(
64
+ default_annotation_values, default_default_values
65
+ ):
66
+ default_annotation_values["test:choices"] = ["a", "b", "c"]
67
+
68
+ option = create_option_from_annotation(
69
+ "test", default_annotation_values, default_default_values
70
+ )
71
+
72
+ assert option.choices == ["a", "b", "c"]
73
+
41
74
 
42
75
  @pytest.fixture
43
76
  def default_snakemake_config():
@@ -41,4 +41,11 @@ def test_non_standard_configfile(tmp_path):
41
41
  runner = dynamic_runner({}, SnkConfig(configfile=tmp_path / "config2.yaml"), tmp_path=tmp_path)
42
42
  res = runner.invoke(["run"])
43
43
  assert res.exit_code == 0, res.stderr
44
- assert "config2" in res.stdout, res.stderr
44
+ assert "config2" in res.stdout, res.stderr
45
+
46
+ def test_snk_config_with_enums(tmp_path):
47
+ runner = dynamic_runner({}, SnkConfig(cli={"test": {"choices": ["enum1", "enum2"], "type": "enum"}}), tmp_path=tmp_path)
48
+ res = runner.invoke(["run", "--help"])
49
+ assert res.exit_code == 0, res.stderr
50
+ assert "enum1" in res.stdout, res.stderr
51
+ assert "enum2" in res.stdout, res.stderr
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes