tlpytools 0.2.1__tar.gz → 0.2.3__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 (60) hide show
  1. {tlpytools-0.2.1 → tlpytools-0.2.3}/.github/copilot-instructions.md +2 -2
  2. {tlpytools-0.2.1 → tlpytools-0.2.3}/.github/workflows/deploy.yml +1 -1
  3. {tlpytools-0.2.1 → tlpytools-0.2.3}/CHANGELOG.md +11 -0
  4. {tlpytools-0.2.1 → tlpytools-0.2.3}/DEVELOPER_GUIDE.md +4 -4
  5. {tlpytools-0.2.1 → tlpytools-0.2.3}/PKG-INFO +1 -1
  6. {tlpytools-0.2.1 → tlpytools-0.2.3}/pyproject.toml +1 -1
  7. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/__init__.py +1 -1
  8. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/orchestrator.py +26 -22
  9. {tlpytools-0.2.1 → tlpytools-0.2.3}/uv.lock +764 -755
  10. {tlpytools-0.2.1 → tlpytools-0.2.3}/.env.example +0 -0
  11. {tlpytools-0.2.1 → tlpytools-0.2.3}/.github/skills/README.md +0 -0
  12. {tlpytools-0.2.1 → tlpytools-0.2.3}/.github/skills/prepare-official-release/SKILL.md +0 -0
  13. {tlpytools-0.2.1 → tlpytools-0.2.3}/.github/workflows/code-formatting-pr.yml +0 -0
  14. {tlpytools-0.2.1 → tlpytools-0.2.3}/.github/workflows/code-formatting.yml +0 -0
  15. {tlpytools-0.2.1 → tlpytools-0.2.3}/.github/workflows/test.yml +0 -0
  16. {tlpytools-0.2.1 → tlpytools-0.2.3}/.gitignore +0 -0
  17. {tlpytools-0.2.1 → tlpytools-0.2.3}/.pre-commit-config.yaml +0 -0
  18. {tlpytools-0.2.1 → tlpytools-0.2.3}/.python-version +0 -0
  19. {tlpytools-0.2.1 → tlpytools-0.2.3}/ENVIRONMENT_VARIABLES.md +0 -0
  20. {tlpytools-0.2.1 → tlpytools-0.2.3}/Makefile +0 -0
  21. {tlpytools-0.2.1 → tlpytools-0.2.3}/README.md +0 -0
  22. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/adls_server.md +0 -0
  23. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/azure_credential_manager.md +0 -0
  24. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/diagrams/README.md +0 -0
  25. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/diagrams/orca_cloud_workflow.drawio +0 -0
  26. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/diagrams/orca_detailed_steps.drawio +0 -0
  27. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/diagrams/orca_file_structure.drawio +0 -0
  28. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/diagrams/orca_local_workflow.drawio +0 -0
  29. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/diagrams/orca_main_features.drawio +0 -0
  30. {tlpytools-0.2.1 → tlpytools-0.2.3}/docs/unified_logging.md +0 -0
  31. {tlpytools-0.2.1 → tlpytools-0.2.3}/requirements.txt +0 -0
  32. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/examples/batchtask.py +0 -0
  33. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/examples/data_files/example.csv +0 -0
  34. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/examples/mydataproject.py +0 -0
  35. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/examples/readwritedata.py +0 -0
  36. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/examples/unified_logging.py +0 -0
  37. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/adls_server.py +0 -0
  38. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/azure_credential.py +0 -0
  39. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/config.py +0 -0
  40. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/data.py +0 -0
  41. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/data_store.py +0 -0
  42. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/env_config.py +0 -0
  43. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/log.py +0 -0
  44. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/README.md +0 -0
  45. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/__init__.py +0 -0
  46. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/__main__.py +0 -0
  47. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/batch_task_runner.py +0 -0
  48. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/cli.py +0 -0
  49. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/orca_model_config_barebone.yaml +0 -0
  50. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/orca/orca_model_config_example.yaml +0 -0
  51. {tlpytools-0.2.1 → tlpytools-0.2.3}/src/tlpytools/sql_server.py +0 -0
  52. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/README.md +0 -0
  53. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/__init__.py +0 -0
  54. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/conftest.py +0 -0
  55. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/run_tests.py +0 -0
  56. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/test_azure_credential.py +0 -0
  57. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/test_basic.py +0 -0
  58. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/test_core.py +0 -0
  59. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/test_orca_integration.py +0 -0
  60. {tlpytools-0.2.1 → tlpytools-0.2.3}/tests/test_orca_unit.py +0 -0
@@ -98,8 +98,8 @@ Interpretation for agent PRs:
98
98
 
99
99
  Observed result:
100
100
  - Build succeeds and produces:
101
- - `dist/tlpytools-0.2.1.tar.gz`
102
- - `dist/tlpytools-0.2.1-py3-none-any.whl`
101
+ - `dist/tlpytools-0.2.3.tar.gz`
102
+ - `dist/tlpytools-0.2.3-py3-none-any.whl`
103
103
 
104
104
  ### 5) Run
105
105
  - ORCA CLI (module form):
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
  inputs:
6
6
  version:
7
- description: 'Version number to release (e.g., 0.2.1)'
7
+ description: 'Version number to release (e.g., 0.2.3)'
8
8
  required: true
9
9
  type: string
10
10
  prerelease:
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to TLPyTools will be documented in this file.
4
4
 
5
+ ## [0.2.3]
6
+
7
+ ### Fixed
8
+ * Fix python cmd syntax issue introduced in 0.2.2
9
+
10
+ ## [0.2.2]
11
+
12
+ ### Fixed
13
+ * Fix python path leaks by cleaning up PYTHONPATH and PYTHONHOME during sub component model runs
14
+ * Clear stale errors when resuming or starting new runs on old scenario folders
15
+
5
16
  ## [0.2.1]
6
17
 
7
18
  ### Changed
@@ -200,7 +200,7 @@ make check-all
200
200
  4. Click **"Run workflow"** button
201
201
  5. Fill in the required information:
202
202
  - **Branch**: Select `main` (or your release branch)
203
- - **Version number**: Enter the new version (e.g., `0.2.1`)
203
+ - **Version number**: Enter the new version (e.g., `0.2.3`)
204
204
  - **Is this a pre-release?**: Check if this is a pre-release version
205
205
 
206
206
  #### 3. Monitor the Release
@@ -219,7 +219,7 @@ After the workflow completes:
219
219
 
220
220
  ```bash
221
221
  # Verify the package is available on PyPI
222
- pip install tlpytools==0.2.1 # Replace with your version
222
+ pip install tlpytools==0.2.3 # Replace with your version
223
223
 
224
224
  # Test installation in a fresh environment
225
225
  python -c "import tlpytools; print(tlpytools.__version__)"
@@ -235,8 +235,8 @@ TLPyTools follows semantic versioning (SemVer):
235
235
 
236
236
  Examples:
237
237
  - `0.1.7` → `0.1.8` (patch release)
238
- - `0.1.8` → `0.2.1` (minor release)
239
- - `0.2.1` → `1.0.0` (major release)
238
+ - `0.1.8` → `0.2.3` (minor release)
239
+ - `0.2.3` → `1.0.0` (major release)
240
240
 
241
241
  ### Pre-releases
242
242
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tlpytools
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: TransLink's Python Tools - A comprehensive toolkit for transportation modeling and forecasting
5
5
  Project-URL: Homepage, https://github.com/TransLinkForecasting/tlpytools
6
6
  Project-URL: Bug Tracker, https://github.com/TransLinkForecasting/tlpytools/issues
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tlpytools"
7
- version = "0.2.1"
7
+ version = "0.2.3"
8
8
  description = "TransLink's Python Tools - A comprehensive toolkit for transportation modeling and forecasting"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10.0, <3.13"
@@ -2,7 +2,7 @@
2
2
  TLPyTools - A set of tools for building models at the TransLink Forecasting Team
3
3
  """
4
4
 
5
- __version__ = "0.2.1"
5
+ __version__ = "0.2.3"
6
6
 
7
7
  # Core modules that should always be available (minimal dependencies)
8
8
  from . import log
@@ -3737,16 +3737,20 @@ class OrcaOrchestrator:
3737
3737
 
3738
3738
  # Create a platform-specific command to set the PYTHONPATH
3739
3739
  # Use step_directory instead of os.getcwd() for consistency
3740
+ # PYTHONHOME and PYTHONPATH are cleared first to prevent the parent
3741
+ # Python process (e.g. Jupyter/tlpytools env) from leaking its
3742
+ # library paths into the component subprocess
3740
3743
  if os.name == "nt": # Windows
3741
- # On Windows, use SET command
3744
+ # Use quoted SET form to clear PYTHONHOME without risk of
3745
+ # capturing trailing whitespace (bare "set VAR= " would set
3746
+ # VAR to a space, breaking the Python stdlib path lookup).
3742
3747
  pythonpath_cmd = (
3743
- f"set PYTHONPATH={ORCA_DIR};{step_directory};%PYTHONPATH% && "
3748
+ f'set "PYTHONHOME=" && '
3749
+ f'set "PYTHONPATH={ORCA_DIR};{step_directory}" && '
3744
3750
  )
3745
3751
  else: # Unix/Linux/Mac
3746
3752
  # On Unix-like systems, use export command
3747
- pythonpath_cmd = (
3748
- f"export PYTHONPATH={ORCA_DIR}:{step_directory}:$PYTHONPATH && "
3749
- )
3753
+ pythonpath_cmd = f"unset PYTHONHOME && export PYTHONPATH={ORCA_DIR}:{step_directory} && "
3750
3754
 
3751
3755
  # Modify the command to ensure environment can be found
3752
3756
  modified_command = f"{pythonpath_cmd}{command}"
@@ -6269,8 +6273,8 @@ class OrcaOrchestrator:
6269
6273
  # Reload configuration to pick up any YAML changes
6270
6274
  self.reload_configuration()
6271
6275
 
6272
- # Update status
6273
- self.state.update(status="running")
6276
+ # Update status and clear any stale error from a previous failed run
6277
+ self.state.update(status="running", error=None)
6274
6278
 
6275
6279
  # Add safety counter to prevent infinite loops
6276
6280
  max_steps = self.state.get("total_iterations", 1) * len(
@@ -6334,8 +6338,8 @@ class OrcaOrchestrator:
6334
6338
  self.logger.error("Error executing step: %s", step_name)
6335
6339
  return False
6336
6340
 
6337
- # Update state to reflect completion
6338
- self.state.update(status="completed")
6341
+ # Update state to reflect completion and clear any previously recorded error
6342
+ self.state.update(status="completed", error=None)
6339
6343
  self.logger.info("Model run completed successfully")
6340
6344
  return True
6341
6345
 
@@ -6356,8 +6360,8 @@ class OrcaOrchestrator:
6356
6360
  # Reload configuration to pick up any YAML changes
6357
6361
  self.reload_configuration()
6358
6362
 
6359
- # Update status
6360
- self.state.update(status="running")
6363
+ # Update status and clear any stale error from a previous failed run
6364
+ self.state.update(status="running", error=None)
6361
6365
 
6362
6366
  # Add safety counter to prevent infinite loops
6363
6367
  max_steps = self.state.get("total_iterations", 1) * len(
@@ -6437,8 +6441,8 @@ class OrcaOrchestrator:
6437
6441
 
6438
6442
  return False
6439
6443
 
6440
- # Update state to reflect completion
6441
- self.state.update(status="completed")
6444
+ # Update state to reflect completion and clear any previously recorded error
6445
+ self.state.update(status="completed", error=None)
6442
6446
 
6443
6447
  # Final sync to cloud after completion
6444
6448
  self.logger.info("Final state sync to cloud after model completion")
@@ -6495,12 +6499,12 @@ class OrcaOrchestrator:
6495
6499
  current_iter,
6496
6500
  max_iteration,
6497
6501
  )
6498
- self.state.update(status="completed")
6502
+ self.state.update(status="completed", error=None)
6499
6503
  return True
6500
6504
 
6501
- # Update status to running if not already
6505
+ # Update status to running if not already, clearing any stale error
6502
6506
  if self.state.get("status") != "running":
6503
- self.state.update(status="running")
6507
+ self.state.update(status="running", error=None)
6504
6508
 
6505
6509
  # Get the next step to execute
6506
6510
  step_name = self.state.get_next_step()
@@ -6517,7 +6521,7 @@ class OrcaOrchestrator:
6517
6521
  # Check if we've exceeded the total iterations
6518
6522
  if self.state.is_all_iterations_complete():
6519
6523
  self.logger.info("All iterations completed")
6520
- self.state.update(status="completed")
6524
+ self.state.update(status="completed", error=None)
6521
6525
  return True
6522
6526
 
6523
6527
  # Get the first step of the new iteration
@@ -6552,7 +6556,7 @@ class OrcaOrchestrator:
6552
6556
 
6553
6557
  # Check if we just completed the last iteration
6554
6558
  if self.state.is_all_iterations_complete():
6555
- self.state.update(status="completed")
6559
+ self.state.update(status="completed", error=None)
6556
6560
  self.logger.info("Model run completed successfully")
6557
6561
 
6558
6562
  self.logger.info("Step '%s' completed successfully", step_name)
@@ -6597,12 +6601,12 @@ class OrcaOrchestrator:
6597
6601
  current_iter,
6598
6602
  max_iteration,
6599
6603
  )
6600
- self.state.update(status="completed")
6604
+ self.state.update(status="completed", error=None)
6601
6605
  return True
6602
6606
 
6603
- # Update status to running if not already
6607
+ # Update status to running if not already, clearing any stale error
6604
6608
  if self.state.get("status") != "running":
6605
- self.state.update(status="running")
6609
+ self.state.update(status="running", error=None)
6606
6610
 
6607
6611
  # Remember the starting iteration
6608
6612
  starting_iter = self.state.get_display_iteration()
@@ -6624,7 +6628,7 @@ class OrcaOrchestrator:
6624
6628
 
6625
6629
  # Check if we've completed all iterations
6626
6630
  if self.state.is_all_iterations_complete():
6627
- self.state.update(status="completed")
6631
+ self.state.update(status="completed", error=None)
6628
6632
  self.logger.info("All iterations completed")
6629
6633
 
6630
6634
  return True