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.
Files changed (90) hide show
  1. {scriptplan-0.9.1/scriptplan.egg-info → scriptplan-0.9.2}/PKG-INFO +15 -7
  2. {scriptplan-0.9.1 → scriptplan-0.9.2}/README.md +13 -6
  3. {scriptplan-0.9.1 → scriptplan-0.9.2}/pyproject.toml +4 -3
  4. scriptplan-0.9.2/scriptplan/__init__.py +26 -0
  5. scriptplan-0.9.2/scriptplan/_cython/__init__.py +45 -0
  6. scriptplan-0.9.2/scriptplan/_cython/scoreboard_cy.c +11547 -0
  7. scriptplan-0.9.2/scriptplan/_cython/scoreboard_cy.pyx +174 -0
  8. scriptplan-0.9.2/scriptplan/_cython/time_utils_cy.c +11618 -0
  9. scriptplan-0.9.2/scriptplan/_cython/time_utils_cy.pyx +149 -0
  10. scriptplan-0.9.2/scriptplan/_cython/working_hours_cy.c +11742 -0
  11. scriptplan-0.9.2/scriptplan/_cython/working_hours_cy.pyx +150 -0
  12. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/cli/__init__.py +1 -1
  13. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/cli/main.py +72 -121
  14. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/cli/plan.py +70 -89
  15. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/account.py +21 -32
  16. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/allocation.py +3 -3
  17. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/booking.py +2 -7
  18. scriptplan-0.9.2/scriptplan/core/exceptions.py +319 -0
  19. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/journal.py +61 -40
  20. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/leave.py +7 -7
  21. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/limits.py +30 -37
  22. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/project.py +283 -271
  23. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/property.py +153 -122
  24. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/resource.py +11 -18
  25. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/resource_scenario.py +95 -85
  26. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/scenario.py +1 -1
  27. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/scenario_data.py +8 -11
  28. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/shift.py +6 -12
  29. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/task.py +5 -11
  30. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/task_scenario.py +211 -172
  31. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/timesheet.py +91 -85
  32. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/working_hours.py +28 -8
  33. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/macro_processor.py +34 -33
  34. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/tjp_parser.py +426 -484
  35. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/__init__.py +17 -17
  36. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/report.py +52 -46
  37. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/report_base.py +61 -81
  38. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/report_context.py +26 -25
  39. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/resource_report.py +39 -52
  40. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/table_report.py +120 -125
  41. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/task_report.py +48 -57
  42. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/report/text_report.py +34 -34
  43. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/scheduler/batch_processor.py +11 -38
  44. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/scheduler/scoreboard.py +49 -12
  45. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/data_cache.py +2 -2
  46. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/logger.py +16 -15
  47. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/message_handler.py +181 -127
  48. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/time.py +30 -28
  49. {scriptplan-0.9.1 → scriptplan-0.9.2/scriptplan.egg-info}/PKG-INFO +15 -7
  50. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/SOURCES.txt +9 -0
  51. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/requires.txt +1 -0
  52. scriptplan-0.9.2/setup.py +66 -0
  53. scriptplan-0.9.1/scriptplan/__init__.py +0 -22
  54. {scriptplan-0.9.1 → scriptplan-0.9.2}/LICENSE +0 -0
  55. {scriptplan-0.9.1 → scriptplan-0.9.2}/MANIFEST.in +0 -0
  56. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/core/__init__.py +0 -0
  57. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/__init__.py +0 -0
  58. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/parser/tjp.lark +0 -0
  59. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/py.typed +0 -0
  60. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/scheduler/__init__.py +0 -0
  61. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan/utils/__init__.py +0 -0
  62. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/dependency_links.txt +0 -0
  63. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/entry_points.txt +0 -0
  64. {scriptplan-0.9.1 → scriptplan-0.9.2}/scriptplan.egg-info/top_level.txt +0 -0
  65. {scriptplan-0.9.1 → scriptplan-0.9.2}/setup.cfg +0 -0
  66. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_account.py +0 -0
  67. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_attribute_base.py +0 -0
  68. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_batch_processor.py +0 -0
  69. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_cli.py +0 -0
  70. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_allocation.py +0 -0
  71. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_booking.py +0 -0
  72. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_project.py +0 -0
  73. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_resource.py +0 -0
  74. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_scenario.py +0 -0
  75. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_core_task.py +0 -0
  76. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_journal.py +0 -0
  77. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_logger.py +0 -0
  78. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_macro_processor.py +0 -0
  79. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_message_handler.py +0 -0
  80. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_parser.py +0 -0
  81. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_property_list.py +0 -0
  82. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_property_set.py +0 -0
  83. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_property_tree_node.py +0 -0
  84. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_report.py +0 -0
  85. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_scheduling.py +0 -0
  86. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_scheduling_validation.py +0 -0
  87. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_scoreboard.py +0 -0
  88. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_shift.py +0 -0
  89. {scriptplan-0.9.1 → scriptplan-0.9.2}/tests/test_timesheet.py +0 -0
  90. {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.1
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 2.0
236
+ Apache-2.0
236
237
 
238
+ ## Acknowledgments
237
239
 
238
- ## Why?
239
- This scheduler is part of Highway Workflow Egnine's worker capacity management system.
240
- I decided to open-source it for the community to benefit from its precise scheduling capabilities.
241
- Thanks to TaskJuggler's established syntax, users can easily adopt ScriptPlan without learning a new format.
242
- Credits to TaskJuggler for the original project definition language and concepts.
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 2.0
191
+ Apache-2.0
192
192
 
193
+ ## Acknowledgments
193
194
 
194
- ## Why?
195
- This scheduler is part of Highway Workflow Egnine's worker capacity management system.
196
- I decided to open-source it for the community to benefit from its precise scheduling capabilities.
197
- Thanks to TaskJuggler's established syntax, users can easily adopt ScriptPlan without learning a new format.
198
- Credits to TaskJuggler for the original project definition language and concepts.
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.1"
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]