scriptplan 0.9.1__tar.gz → 0.9.2__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.
- {scriptplan-0.9.1/scriptplan.egg-info → scriptplan-0.9.2}/PKG-INFO +15 -7
- {scriptplan-0.9.1 → scriptplan-0.9.2}/README.md +13 -6
- {scriptplan-0.9.1 → scriptplan-0.9.2}/pyproject.toml +4 -3
- scriptplan-0.9.2/scriptplan/__init__.py +26 -0
- scriptplan-0.9.2/scriptplan/_cython/__init__.py +45 -0
- scriptplan-0.9.2/scriptplan/_cython/scoreboard_cy.c +11547 -0
- scriptplan-0.9.2/scriptplan/_cython/scoreboard_cy.pyx +174 -0
- scriptplan-0.9.2/scriptplan/_cython/time_utils_cy.c +11618 -0
- scriptplan-0.9.2/scriptplan/_cython/time_utils_cy.pyx +149 -0
- scriptplan-0.9.2/scriptplan/_cython/working_hours_cy.c +11742 -0
- scriptplan-0.9.2/scriptplan/_cython/working_hours_cy.pyx +150 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/cli/__init__.py +1 -1
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/cli/main.py +72 -121
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/cli/plan.py +70 -89
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/account.py +21 -32
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/allocation.py +3 -3
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/booking.py +2 -7
- scriptplan-0.9.2/scriptplan/core/exceptions.py +319 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/journal.py +61 -40
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/leave.py +7 -7
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/limits.py +30 -37
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/project.py +283 -271
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/property.py +153 -122
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/resource.py +11 -18
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/resource_scenario.py +95 -85
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/scenario.py +1 -1
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/scenario_data.py +8 -11
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/shift.py +6 -12
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/task.py +5 -11
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/task_scenario.py +211 -172
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/timesheet.py +91 -85
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/working_hours.py +28 -8
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/macro_processor.py +34 -33
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/tjp_parser.py +426 -484
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/__init__.py +17 -17
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/report.py +52 -46
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/report_base.py +61 -81
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/report_context.py +26 -25
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/resource_report.py +39 -52
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/table_report.py +120 -125
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/task_report.py +48 -57
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/text_report.py +34 -34
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/scheduler/batch_processor.py +11 -38
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/scheduler/scoreboard.py +49 -12
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/data_cache.py +2 -2
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/logger.py +16 -15
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/message_handler.py +181 -127
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/time.py +30 -28
- {scriptplan-0.9.1 → scriptplan-0.9.2/scriptplan.egg-info}/PKG-INFO +15 -7
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/SOURCES.txt +9 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/requires.txt +1 -0
- scriptplan-0.9.2/setup.py +66 -0
- scriptplan-0.9.1/scriptplan/__init__.py +0 -22
- {scriptplan-0.9.1 → scriptplan-0.9.2}/LICENSE +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/MANIFEST.in +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/__init__.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/__init__.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/tjp.lark +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/py.typed +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/scheduler/__init__.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/__init__.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/dependency_links.txt +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/entry_points.txt +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/top_level.txt +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/setup.cfg +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_account.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_attribute_base.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_batch_processor.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_cli.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_allocation.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_booking.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_project.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_resource.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_scenario.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_task.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_journal.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_logger.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_macro_processor.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_message_handler.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_parser.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_property_list.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_property_set.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_property_tree_node.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_report.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_scheduling.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_scheduling_validation.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_scoreboard.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_shift.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_timesheet.py +0 -0
- {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_utils_time.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scriptplan
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
4
4
|
Summary: A precise project scheduling engine with minute-level accuracy for resource allocation and dependency management.
|
|
5
5
|
Author-email: Farshid Ashouri <farsheed.ashouri@gmail.com>
|
|
6
6
|
Maintainer-email: Farshid Ashouri <farsheed.ashouri@gmail.com>
|
|
@@ -40,6 +40,7 @@ Requires-Dist: build; extra == "dev"
|
|
|
40
40
|
Requires-Dist: twine; extra == "dev"
|
|
41
41
|
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
42
42
|
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
43
|
+
Requires-Dist: cython>=3.0.0; extra == "dev"
|
|
43
44
|
Dynamic: license-file
|
|
44
45
|
|
|
45
46
|
<p align="center">
|
|
@@ -232,14 +233,21 @@ delivery.assemble_b: 2025-07-16-08:00 -> 2025-07-17-16:00
|
|
|
232
233
|
|
|
233
234
|
## License
|
|
234
235
|
|
|
235
|
-
Apache
|
|
236
|
+
Apache-2.0
|
|
236
237
|
|
|
238
|
+
## Acknowledgments
|
|
237
239
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
240
|
+
ScriptPlan references [TaskJuggler](https://taskjuggler.org/) solely for **file format compatibility**. We have not used, modified, or copied any TaskJuggler source code. ScriptPlan is an independent, clean-room implementation.
|
|
241
|
+
|
|
242
|
+
- The `.tjp` file format is documented publicly and widely used in the project management community
|
|
243
|
+
- All scheduling algorithms, parser, and report generation in ScriptPlan are original implementations
|
|
244
|
+
- TaskJuggler is mentioned only to indicate that ScriptPlan can read the same project file format
|
|
245
|
+
|
|
246
|
+
If you're looking for the original TaskJuggler with its full feature set including interactive HTML reports and GUI tools, please visit [taskjuggler.org](https://taskjuggler.org/).
|
|
247
|
+
|
|
248
|
+
## Why ScriptPlan?
|
|
249
|
+
|
|
250
|
+
This scheduler is part of Highway Workflow Engine's worker capacity management system. I decided to open-source it for the community to benefit from its precise scheduling capabilities. Thanks to TaskJuggler's established syntax, users can easily adopt ScriptPlan without learning a new format.
|
|
243
251
|
|
|
244
252
|
Yours,
|
|
245
253
|
Farshid.
|
|
@@ -188,14 +188,21 @@ delivery.assemble_b: 2025-07-16-08:00 -> 2025-07-17-16:00
|
|
|
188
188
|
|
|
189
189
|
## License
|
|
190
190
|
|
|
191
|
-
Apache
|
|
191
|
+
Apache-2.0
|
|
192
192
|
|
|
193
|
+
## Acknowledgments
|
|
193
194
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
195
|
+
ScriptPlan references [TaskJuggler](https://taskjuggler.org/) solely for **file format compatibility**. We have not used, modified, or copied any TaskJuggler source code. ScriptPlan is an independent, clean-room implementation.
|
|
196
|
+
|
|
197
|
+
- The `.tjp` file format is documented publicly and widely used in the project management community
|
|
198
|
+
- All scheduling algorithms, parser, and report generation in ScriptPlan are original implementations
|
|
199
|
+
- TaskJuggler is mentioned only to indicate that ScriptPlan can read the same project file format
|
|
200
|
+
|
|
201
|
+
If you're looking for the original TaskJuggler with its full feature set including interactive HTML reports and GUI tools, please visit [taskjuggler.org](https://taskjuggler.org/).
|
|
202
|
+
|
|
203
|
+
## Why ScriptPlan?
|
|
204
|
+
|
|
205
|
+
This scheduler is part of Highway Workflow Engine's worker capacity management system. I decided to open-source it for the community to benefit from its precise scheduling capabilities. Thanks to TaskJuggler's established syntax, users can easily adopt ScriptPlan without learning a new format.
|
|
199
206
|
|
|
200
207
|
Yours,
|
|
201
208
|
Farshid.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["setuptools>=61.0", "wheel"]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel", "cython>=3.0.0"]
|
|
3
3
|
build-backend = "setuptools.build_meta"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "scriptplan"
|
|
7
|
-
version = "0.9.
|
|
7
|
+
version = "0.9.2"
|
|
8
8
|
description = "A precise project scheduling engine with minute-level accuracy for resource allocation and dependency management."
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "Farshid Ashouri", email = "farsheed.ashouri@gmail.com" },
|
|
@@ -50,6 +50,7 @@ dev = [
|
|
|
50
50
|
"twine",
|
|
51
51
|
"ruff>=0.1.0",
|
|
52
52
|
"mypy>=1.0.0",
|
|
53
|
+
"cython>=3.0.0",
|
|
53
54
|
]
|
|
54
55
|
|
|
55
56
|
[project.scripts]
|
|
@@ -70,7 +71,7 @@ where = ["."]
|
|
|
70
71
|
include = ["scriptplan*"]
|
|
71
72
|
|
|
72
73
|
[tool.setuptools.package-data]
|
|
73
|
-
scriptplan = ["py.typed", "parser/*.lark"]
|
|
74
|
+
scriptplan = ["py.typed", "parser/*.lark", "_cython/*.pyx"]
|
|
74
75
|
|
|
75
76
|
[tool.pytest.ini_options]
|
|
76
77
|
testpaths = ["tests"]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ScriptPlan - A Python implementation inspired by TaskJuggler.
|
|
3
|
+
|
|
4
|
+
This package provides project scheduling and resource management capabilities
|
|
5
|
+
compatible with the TaskJuggler Project Definition Language (.tjp files).
|
|
6
|
+
|
|
7
|
+
ScriptPlan owes its existence to TaskJuggler (https://taskjuggler.org/),
|
|
8
|
+
the pioneering open-source project management tool created by Chris Schlaeger.
|
|
9
|
+
The TJP file format and scheduling concepts originate from TaskJuggler.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
__version__ = "0.9.2"
|
|
13
|
+
__author__ = "ScriptPlan Team"
|
|
14
|
+
|
|
15
|
+
from scriptplan.core.project import Project
|
|
16
|
+
from scriptplan.core.resource import Resource
|
|
17
|
+
from scriptplan.core.scenario import Scenario
|
|
18
|
+
from scriptplan.core.task import Task
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"Project",
|
|
22
|
+
"Resource",
|
|
23
|
+
"Scenario",
|
|
24
|
+
"Task",
|
|
25
|
+
"__version__",
|
|
26
|
+
]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cython-optimized modules for ScriptPlan.
|
|
3
|
+
|
|
4
|
+
This package contains Cython implementations of performance-critical code.
|
|
5
|
+
Pure Python fallbacks are used if Cython extensions are not compiled.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# Track which optimized modules are available
|
|
9
|
+
CYTHON_AVAILABLE = {
|
|
10
|
+
"scoreboard": False,
|
|
11
|
+
"time_utils": False,
|
|
12
|
+
"working_hours": False,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
# Try to import Cython modules
|
|
16
|
+
try:
|
|
17
|
+
from scriptplan._cython import scoreboard_cy # noqa: F401
|
|
18
|
+
|
|
19
|
+
CYTHON_AVAILABLE["scoreboard"] = True
|
|
20
|
+
except ImportError:
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
from scriptplan._cython import time_utils_cy # noqa: F401
|
|
25
|
+
|
|
26
|
+
CYTHON_AVAILABLE["time_utils"] = True
|
|
27
|
+
except ImportError:
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
from scriptplan._cython import working_hours_cy # noqa: F401
|
|
32
|
+
|
|
33
|
+
CYTHON_AVAILABLE["working_hours"] = True
|
|
34
|
+
except ImportError:
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def is_optimized(module: str) -> bool:
|
|
39
|
+
"""Check if a Cython-optimized module is available."""
|
|
40
|
+
return CYTHON_AVAILABLE.get(module, False)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def get_available_optimizations() -> list[str]:
|
|
44
|
+
"""Get list of available Cython optimizations."""
|
|
45
|
+
return [k for k, v in CYTHON_AVAILABLE.items() if v]
|