tasktree 0.0.13__tar.gz → 0.0.14__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 (75) hide show
  1. {tasktree-0.0.13 → tasktree-0.0.14}/PKG-INFO +1 -1
  2. {tasktree-0.0.13 → tasktree-0.0.14}/example/tasktree.yaml +5 -1
  3. {tasktree-0.0.13 → tasktree-0.0.14}/pyproject.toml +1 -1
  4. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/substitution.py +39 -19
  5. {tasktree-0.0.13 → tasktree-0.0.14}/.claude/settings.local.json +0 -0
  6. {tasktree-0.0.13 → tasktree-0.0.14}/.github/workflows/claude-code-review.yml +0 -0
  7. {tasktree-0.0.13 → tasktree-0.0.14}/.github/workflows/claude.yml +0 -0
  8. {tasktree-0.0.13 → tasktree-0.0.14}/.github/workflows/release.yml +0 -0
  9. {tasktree-0.0.13 → tasktree-0.0.14}/.github/workflows/test.yml +0 -0
  10. {tasktree-0.0.13 → tasktree-0.0.14}/.github/workflows/validate-pipx-install.yml +0 -0
  11. {tasktree-0.0.13 → tasktree-0.0.14}/.gitignore +0 -0
  12. {tasktree-0.0.13 → tasktree-0.0.14}/.python-version +0 -0
  13. {tasktree-0.0.13 → tasktree-0.0.14}/CLAUDE.md +0 -0
  14. {tasktree-0.0.13 → tasktree-0.0.14}/README.md +0 -0
  15. {tasktree-0.0.13 → tasktree-0.0.14}/example/source.txt +0 -0
  16. {tasktree-0.0.13 → tasktree-0.0.14}/requirements/implemented/01-basic-variables.md +0 -0
  17. {tasktree-0.0.13 → tasktree-0.0.14}/requirements/implemented/02-env-variable-type.md +0 -0
  18. {tasktree-0.0.13 → tasktree-0.0.14}/requirements/implemented/03-direct-env-substitution.md +0 -0
  19. {tasktree-0.0.13 → tasktree-0.0.14}/requirements/implemented/04-file-read-variables.md +0 -0
  20. {tasktree-0.0.13 → tasktree-0.0.14}/requirements/implemented/bug-report-dependency-triggering.md +0 -0
  21. {tasktree-0.0.13 → tasktree-0.0.14}/requirements/implemented/docker-task-environments.md +0 -0
  22. {tasktree-0.0.13 → tasktree-0.0.14}/requirements/implemented/shell-environment-requirements.md +0 -0
  23. {tasktree-0.0.13 → tasktree-0.0.14}/schema/README.md +0 -0
  24. {tasktree-0.0.13 → tasktree-0.0.14}/schema/tasktree-schema.json +0 -0
  25. {tasktree-0.0.13 → tasktree-0.0.14}/schema/vscode-settings-snippet.json +0 -0
  26. {tasktree-0.0.13 → tasktree-0.0.14}/src/__init__.py +0 -0
  27. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/__init__.py +0 -0
  28. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/cli.py +0 -0
  29. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/docker.py +0 -0
  30. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/executor.py +0 -0
  31. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/graph.py +0 -0
  32. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/hasher.py +0 -0
  33. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/parser.py +0 -0
  34. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/state.py +0 -0
  35. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/tasks.py +0 -0
  36. {tasktree-0.0.13 → tasktree-0.0.14}/src/tasktree/types.py +0 -0
  37. {tasktree-0.0.13 → tasktree-0.0.14}/tasktree.yaml +0 -0
  38. {tasktree-0.0.13 → tasktree-0.0.14}/tests/e2e/__init__.py +0 -0
  39. {tasktree-0.0.13 → tasktree-0.0.14}/tests/e2e/test_docker_basic.py +0 -0
  40. {tasktree-0.0.13 → tasktree-0.0.14}/tests/e2e/test_docker_environment.py +0 -0
  41. {tasktree-0.0.13 → tasktree-0.0.14}/tests/e2e/test_docker_ownership.py +0 -0
  42. {tasktree-0.0.13 → tasktree-0.0.14}/tests/e2e/test_docker_volumes.py +0 -0
  43. {tasktree-0.0.13 → tasktree-0.0.14}/tests/e2e/test_non_docker.py +0 -0
  44. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_arg_choices.py +0 -0
  45. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_arg_min_max.py +0 -0
  46. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_builtin_variables.py +0 -0
  47. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_clean_state.py +0 -0
  48. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_cli_options.py +0 -0
  49. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_dependency_execution.py +0 -0
  50. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_docker_build_args.py +0 -0
  51. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_end_to_end.py +0 -0
  52. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_exported_args.py +0 -0
  53. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_input_detection.py +0 -0
  54. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_missing_outputs.py +0 -0
  55. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_nested_imports.py +0 -0
  56. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_parameterized_dependencies.yaml +0 -0
  57. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_parameterized_deps_execution.py +0 -0
  58. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_state_persistence.py +0 -0
  59. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_variables.py +0 -0
  60. {tasktree-0.0.13 → tasktree-0.0.14}/tests/integration/test_working_directory.py +0 -0
  61. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_cli.py +0 -0
  62. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_dependency_parsing.py +0 -0
  63. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_docker.py +0 -0
  64. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_environment_tracking.py +0 -0
  65. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_executor.py +0 -0
  66. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_graph.py +0 -0
  67. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_hasher.py +0 -0
  68. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_list_formatting.py +0 -0
  69. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_parameterized_graph.py +0 -0
  70. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_parser.py +0 -0
  71. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_state.py +0 -0
  72. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_substitution.py +0 -0
  73. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_tasks.py +0 -0
  74. {tasktree-0.0.13 → tasktree-0.0.14}/tests/unit/test_types.py +0 -0
  75. {tasktree-0.0.13 → tasktree-0.0.14}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tasktree
3
- Version: 0.0.13
3
+ Version: 0.0.14
4
4
  Summary: A task automation tool with incremental execution
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: click>=8.1.0
@@ -1,9 +1,13 @@
1
+ variables:
2
+ log_level: { env: LOG_LEVEL, default: "info" }
3
+
1
4
  tasks:
2
5
  build:
3
6
  desc: Building outputs (imagine this is a call to Cargo, or gcc, or something)
4
7
  args:
5
8
  - build_type:
6
- choices: [ "debug", "release" ]
9
+ choices: [ "debug", "release", "{{ var.log_level }}" ]
10
+ default: "{{ var.log_level }}"
7
11
  - target:
8
12
  type: str
9
13
  choices:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tasktree"
3
- version = "0.0.13"
3
+ version = "0.0.14"
4
4
  description = "A task automation tool with incremental execution"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -5,6 +5,7 @@ and {{ env.NAME }} placeholders with their corresponding values.
5
5
  """
6
6
 
7
7
  import re
8
+ from random import choice
8
9
  from typing import Any
9
10
 
10
11
 
@@ -15,11 +16,11 @@ PLACEHOLDER_PATTERN = re.compile(
15
16
  )
16
17
 
17
18
 
18
- def substitute_variables(text: str, variables: dict[str, str]) -> str:
19
+ def substitute_variables(text: str | dict[str, Any], variables: dict[str, str]) -> str | dict[str, Any]:
19
20
  """Substitute {{ var.name }} placeholders with variable values.
20
21
 
21
22
  Args:
22
- text: Text containing {{ var.name }} placeholders
23
+ text: Text containing {{ var.name }} placeholders, or an argument dict with elements to be substituted
23
24
  variables: Dictionary mapping variable names to their string values
24
25
 
25
26
  Returns:
@@ -28,23 +29,42 @@ def substitute_variables(text: str, variables: dict[str, str]) -> str:
28
29
  Raises:
29
30
  ValueError: If a referenced variable is not defined
30
31
  """
31
- def replace_match(match: re.Match) -> str:
32
- prefix = match.group(1)
33
- name = match.group(2)
34
-
35
- # Only substitute var: placeholders
36
- if prefix != "var":
37
- return match.group(0) # Return unchanged
38
-
39
- if name not in variables:
40
- raise ValueError(
41
- f"Variable '{name}' is not defined. "
42
- f"Variables must be defined before use."
43
- )
44
-
45
- return variables[name]
46
-
47
- return PLACEHOLDER_PATTERN.sub(replace_match, text)
32
+ if isinstance(text, dict):
33
+ # The dict will only contain a single key, the value of this key should also be a dictionary, which contains
34
+ # the actual details of the argument.
35
+ assert len(text.keys()) == 1
36
+
37
+ for arg_name in text.keys():
38
+ # Pull out and substitute the individual fields of an argument one at a time
39
+ for field in [ "default", "min", "max" ]:
40
+ if field in text[arg_name]:
41
+ text[arg_name][field] = substitute_variables(text[arg_name][field], variables)
42
+
43
+ # choices is a list of things
44
+ if "choices" in text[arg_name]:
45
+ text[arg_name]["choices"] = [substitute_variables(c, variables) for c in text[arg_name]["choices"]]
46
+
47
+ return text
48
+ else:
49
+ raise ValueError("Empty arg dictionary")
50
+ else:
51
+ def replace_match(match: re.Match) -> str:
52
+ prefix = match.group(1)
53
+ name = match.group(2)
54
+
55
+ # Only substitute var: placeholders
56
+ if prefix != "var":
57
+ return match.group(0) # Return unchanged
58
+
59
+ if name not in variables:
60
+ raise ValueError(
61
+ f"Variable '{name}' is not defined. "
62
+ f"Variables must be defined before use."
63
+ )
64
+
65
+ return variables[name]
66
+
67
+ return PLACEHOLDER_PATTERN.sub(replace_match, text)
48
68
 
49
69
 
50
70
  def substitute_arguments(text: str, args: dict[str, Any], exported_args: set[str] | None = None) -> str:
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