prepare-assignment 0.4.4__tar.gz → 0.4.5__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 (90) hide show
  1. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/PKG-INFO +1 -1
  2. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/preparer.py +12 -14
  3. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/pyproject.toml +1 -1
  4. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_preparer.py +34 -1
  5. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  6. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  7. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/dependabot.yml +0 -0
  8. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/workflows/pr-title.yml +0 -0
  9. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/workflows/pypi-publish.yml +0 -0
  10. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/workflows/release.yml +0 -0
  11. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/workflows/semantic-release.yml +0 -0
  12. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.github/workflows/test.yml +0 -0
  13. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.gitignore +0 -0
  14. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/.releaserc.json +0 -0
  15. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/LICENSE +0 -0
  16. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/README.md +0 -0
  17. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/__init__.py +0 -0
  18. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/__main__.py +0 -0
  19. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/cli/__init__.py +0 -0
  20. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/cli/main.py +0 -0
  21. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/cli/task.py +0 -0
  22. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/cli/tasks.py +0 -0
  23. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/__init__.py +0 -0
  24. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/check.py +0 -0
  25. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/command.py +0 -0
  26. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/expression.py +0 -0
  27. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/main.py +0 -0
  28. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/runner.py +0 -0
  29. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/shell.py +0 -0
  30. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/subsituter.py +0 -0
  31. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/task_handler.py +0 -0
  32. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/validator.py +0 -0
  33. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/core/versions.py +0 -0
  34. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/__init__.py +0 -0
  35. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/config.py +0 -0
  36. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/constants.py +0 -0
  37. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/errors.py +0 -0
  38. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/job_environment.py +0 -0
  39. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/prepare.py +0 -0
  40. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/task_definition.py +0 -0
  41. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/task_properties.py +0 -0
  42. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/data/types.py +0 -0
  43. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/schemas/config.schema.json +0 -0
  44. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/schemas/prepare.schema.json +0 -0
  45. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/schemas/task.schema.json +0 -0
  46. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/__init__.py +0 -0
  47. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/config.py +0 -0
  48. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/default_validator.py +0 -0
  49. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/dependency.py +0 -0
  50. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/files.py +0 -0
  51. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/logger.py +0 -0
  52. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/paths.py +0 -0
  53. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/resources.py +0 -0
  54. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/tasks.py +0 -0
  55. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/virtual_env.py +0 -0
  56. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/prepare_assignment/utils/yml_loader.py +0 -0
  57. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/__init__.py +0 -0
  58. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/conftest.py +0 -0
  59. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/__init__.py +0 -0
  60. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_check.py +0 -0
  61. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_command.py +0 -0
  62. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_expression.py +0 -0
  63. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_resolve_version.py +0 -0
  64. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_runner.py +0 -0
  65. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_runner_process.py +0 -0
  66. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_shell.py +0 -0
  67. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_substituter.py +0 -0
  68. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_task_handler.py +0 -0
  69. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/core/test_validator.py +0 -0
  70. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/data/__init__.py +0 -0
  71. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/data/test_prepare.py +0 -0
  72. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/data/test_task_properties.py +0 -0
  73. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/data/test_types.py +0 -0
  74. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/test_dependencies.py +0 -0
  75. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/test_main.py +0 -0
  76. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/testproject/prepare.yml +0 -0
  77. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/testproject/solution/pom.xml +0 -0
  78. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/testproject/solution/src/main/java/gradelist/AssessmentResult.java +0 -0
  79. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/testproject/solution/src/main/java/gradelist/GradeList.java +0 -0
  80. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/testproject/solution/src/main/java/gradelist/Test.java +0 -0
  81. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/testproject/solution/src/test/java/gradelist/AssessmentResultTest.java +0 -0
  82. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/testproject/solution/src/test/java/gradelist/GradeListTest.java +0 -0
  83. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/utils/__init__.py +0 -0
  84. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/utils/test_config.py +0 -0
  85. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/utils/test_default_validator.py +0 -0
  86. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/utils/test_files.py +0 -0
  87. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/utils/test_logger.py +0 -0
  88. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/utils/test_paths.py +0 -0
  89. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/tests/utils/test_resources.py +0 -0
  90. {prepare_assignment-0.4.4 → prepare_assignment-0.4.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: prepare-assignment
3
- Version: 0.4.4
3
+ Version: 0.4.5
4
4
  Summary: Prepare assignment
5
5
  Author-email: Bonajo <m.bonajo@fontys.nl>
6
6
  License: MIT
@@ -77,18 +77,18 @@ def __build_json_schema(props: TaskProperties, task: TaskDefinition) -> Dict[str
77
77
  },
78
78
  "required": ["uses"],
79
79
  }
80
- if len(task.inputs) > 0:
81
- properties: Dict[str, Any] = {}
82
- required: List[str] = []
83
- for inp in task.inputs:
84
- properties[inp.name] = inp.to_schema_definition()
85
- if inp.required:
86
- required.append(inp.name)
87
- with_schema: Dict[str, Any] = {"type": "object", "additionalProperties": False, "properties": properties}
88
- if len(required) > 0:
89
- with_schema["required"] = required
90
- schema["required"].append("with")
91
- schema["properties"]["with"] = with_schema
80
+ # A task without inputs still accepts an empty 'with'
81
+ properties: Dict[str, Any] = {}
82
+ required: List[str] = []
83
+ for inp in task.inputs:
84
+ properties[inp.name] = inp.to_schema_definition()
85
+ if inp.required:
86
+ required.append(inp.name)
87
+ with_schema: Dict[str, Any] = {"type": "object", "additionalProperties": False, "properties": properties}
88
+ if len(required) > 0:
89
+ with_schema["required"] = required
90
+ schema["required"].append("with")
91
+ schema["properties"]["with"] = with_schema
92
92
  return schema
93
93
 
94
94
 
@@ -273,8 +273,6 @@ def __prepare_tasks(tasks: List[Any], parsed: Optional[Dict[str, ValidableTask]]
273
273
  else:
274
274
  logger.debug(f"Task '{props}' has already been loaded in this run")
275
275
  if check_inputs and file is not None:
276
- if task_def.get("with", None) is None:
277
- task_def["with"] = {}
278
276
  validate_tasks(file, task_def, parsed[str(props)]["schema"])
279
277
  logger.debug("All (sub-)tasks prepared")
280
278
  return parsed
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "prepare-assignment"
3
- version = "0.4.4"
3
+ version = "0.4.5"
4
4
  description = "Prepare assignment"
5
5
  authors = [{name = "Bonajo", email = "m.bonajo@fontys.nl"}]
6
6
  license = {text = "MIT"}
@@ -8,7 +8,7 @@ import pytest
8
8
  from pytest_mock import MockerFixture
9
9
 
10
10
  from prepare_assignment.core.preparer import prepare_tasks, __task_install_dependencies
11
- from prepare_assignment.data.errors import DependencyError, PrepareTaskError
11
+ from prepare_assignment.data.errors import DependencyError, PrepareTaskError, ValidationError
12
12
  from virtualenv import cli_run # type: ignore
13
13
 
14
14
  from prepare_assignment.utils.files import remove_tree
@@ -317,3 +317,36 @@ def test_cached_composite_duplicate_id_is_rejected(mocker: MockerFixture) -> Non
317
317
  with pytest.raises(PrepareTaskError) as exc:
318
318
  prepare_tasks("prepare.yml", prepare)
319
319
  assert "multiple steps with id 'same'" in str(exc.value.cause)
320
+
321
+
322
+ NO_INPUTS_TASK: Final[Dict[str, Any]] = {
323
+ 'id': 'noinputs',
324
+ 'name': 'No inputs',
325
+ 'description': 'Task without inputs',
326
+ 'runs': {'using': 'composite', 'tasks': [{'name': 'say', 'run': 'echo hello'}]}
327
+ }
328
+
329
+
330
+ @pytest.mark.parametrize("step", [
331
+ {'name': 'no with', 'uses': 'noinputs'},
332
+ {'name': 'empty with', 'uses': 'noinputs', 'with': {}},
333
+ {'name': 'null with', 'uses': 'noinputs', 'with': None},
334
+ ])
335
+ def test_task_without_inputs(mocker: MockerFixture, step: Dict[str, Any]) -> None:
336
+ __clean_cache()
337
+ mocker.patch("prepare_assignment.core.preparer.__download_task",
338
+ side_effect=lambda props: props.repo_path.mkdir(parents=True, exist_ok=True))
339
+ mocker.patch("prepare_assignment.core.preparer.validate_task_definition", return_value=NO_INPUTS_TASK)
340
+ mapping = prepare_tasks("prepare.yml", {'prepare': [step]})
341
+ assert list(mapping) == ["prepare-assignment/noinputs@latest"]
342
+
343
+
344
+ def test_task_without_inputs_rejects_unknown_input(mocker: MockerFixture) -> None:
345
+ __clean_cache()
346
+ mocker.patch("prepare_assignment.core.preparer.__download_task",
347
+ side_effect=lambda props: props.repo_path.mkdir(parents=True, exist_ok=True))
348
+ mocker.patch("prepare_assignment.core.preparer.validate_task_definition", return_value=NO_INPUTS_TASK)
349
+ step = {'name': 'typo', 'uses': 'noinputs', 'with': {'inptu': 'x'}}
350
+ with pytest.raises(ValidationError) as exc:
351
+ prepare_tasks("prepare.yml", {'prepare': [step]})
352
+ assert "'inptu' was unexpected" in exc.value.message