chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,595 @@
|
||||
# @trigger.dev/python
|
||||
|
||||
## 4.5.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.3`
|
||||
- `@trigger.dev/build@4.5.3`
|
||||
- `@trigger.dev/core@4.5.3`
|
||||
|
||||
## 4.5.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.5.2`
|
||||
- `@trigger.dev/sdk@4.5.2`
|
||||
- `@trigger.dev/build@4.5.2`
|
||||
|
||||
## 4.5.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.5.1`
|
||||
- `@trigger.dev/core@4.5.1`
|
||||
- `@trigger.dev/sdk@4.5.1`
|
||||
|
||||
## 4.5.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.0`
|
||||
- `@trigger.dev/core@4.5.0`
|
||||
- `@trigger.dev/build@4.5.0`
|
||||
|
||||
## 4.5.0-rc.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.0-rc.7`
|
||||
- `@trigger.dev/core@4.5.0-rc.7`
|
||||
- `@trigger.dev/build@4.5.0-rc.7`
|
||||
|
||||
## 4.5.0-rc.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.0-rc.6`
|
||||
- `@trigger.dev/core@4.5.0-rc.6`
|
||||
- `@trigger.dev/build@4.5.0-rc.6`
|
||||
|
||||
## 4.5.0-rc.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.0-rc.5`
|
||||
- `@trigger.dev/core@4.5.0-rc.5`
|
||||
- `@trigger.dev/build@4.5.0-rc.5`
|
||||
|
||||
## 4.5.0-rc.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.0-rc.4`
|
||||
- `@trigger.dev/core@4.5.0-rc.4`
|
||||
- `@trigger.dev/build@4.5.0-rc.4`
|
||||
|
||||
## 4.5.0-rc.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.5.0-rc.3`
|
||||
- `@trigger.dev/build@4.5.0-rc.3`
|
||||
- `@trigger.dev/sdk@4.5.0-rc.3`
|
||||
|
||||
## 4.5.0-rc.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.0-rc.2`
|
||||
- `@trigger.dev/build@4.5.0-rc.2`
|
||||
- `@trigger.dev/core@4.5.0-rc.2`
|
||||
|
||||
## 4.5.0-rc.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.5.0-rc.1`
|
||||
- `@trigger.dev/build@4.5.0-rc.1`
|
||||
- `@trigger.dev/sdk@4.5.0-rc.1`
|
||||
|
||||
## 4.5.0-rc.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.5.0-rc.0`
|
||||
- `@trigger.dev/core@4.5.0-rc.0`
|
||||
- `@trigger.dev/build@4.5.0-rc.0`
|
||||
|
||||
## 4.4.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.4.6`
|
||||
- `@trigger.dev/build@4.4.6`
|
||||
- `@trigger.dev/sdk@4.4.6`
|
||||
|
||||
## 4.4.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.4.5`
|
||||
- `@trigger.dev/build@4.4.5`
|
||||
- `@trigger.dev/sdk@4.4.5`
|
||||
|
||||
## 4.4.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.4.4`
|
||||
- `@trigger.dev/core@4.4.4`
|
||||
- `@trigger.dev/build@4.4.4`
|
||||
|
||||
## 4.4.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.4.3`
|
||||
- `@trigger.dev/build@4.4.3`
|
||||
- `@trigger.dev/sdk@4.4.3`
|
||||
|
||||
## 4.4.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.4.2`
|
||||
- `@trigger.dev/build@4.4.2`
|
||||
- `@trigger.dev/core@4.4.2`
|
||||
|
||||
## 4.4.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.4.1`
|
||||
- `@trigger.dev/build@4.4.1`
|
||||
- `@trigger.dev/core@4.4.1`
|
||||
|
||||
## 4.4.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.4.0`
|
||||
- `@trigger.dev/sdk@4.4.0`
|
||||
- `@trigger.dev/build@4.4.0`
|
||||
|
||||
## 4.3.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.3.3`
|
||||
- `@trigger.dev/core@4.3.3`
|
||||
- `@trigger.dev/build@4.3.3`
|
||||
|
||||
## 4.3.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.3.2`
|
||||
- `@trigger.dev/build@4.3.2`
|
||||
- `@trigger.dev/core@4.3.2`
|
||||
|
||||
## 4.3.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.3.1`
|
||||
- `@trigger.dev/core@4.3.1`
|
||||
- `@trigger.dev/build@4.3.1`
|
||||
|
||||
## 4.3.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.3.0`
|
||||
- `@trigger.dev/build@4.3.0`
|
||||
- `@trigger.dev/sdk@4.3.0`
|
||||
|
||||
## 4.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.2.0`
|
||||
- `@trigger.dev/sdk@4.2.0`
|
||||
- `@trigger.dev/core@4.2.0`
|
||||
|
||||
## 4.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.1.2`
|
||||
- `@trigger.dev/core@4.1.2`
|
||||
- `@trigger.dev/sdk@4.1.2`
|
||||
|
||||
## 4.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.1.1`
|
||||
- `@trigger.dev/core@4.1.1`
|
||||
- `@trigger.dev/sdk@4.1.1`
|
||||
|
||||
## 4.1.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.1.0`
|
||||
- `@trigger.dev/build@4.1.0`
|
||||
- `@trigger.dev/core@4.1.0`
|
||||
|
||||
## 4.0.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.7`
|
||||
- `@trigger.dev/core@4.0.7`
|
||||
- `@trigger.dev/sdk@4.0.7`
|
||||
|
||||
## 4.0.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.6`
|
||||
- `@trigger.dev/build@4.0.6`
|
||||
- `@trigger.dev/sdk@4.0.6`
|
||||
|
||||
## 4.0.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.5`
|
||||
- `@trigger.dev/build@4.0.5`
|
||||
- `@trigger.dev/sdk@4.0.5`
|
||||
|
||||
## 4.0.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.4`
|
||||
- `@trigger.dev/core@4.0.4`
|
||||
- `@trigger.dev/sdk@4.0.4`
|
||||
|
||||
## 4.0.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.3`
|
||||
- `@trigger.dev/sdk@4.0.3`
|
||||
- `@trigger.dev/build@4.0.3`
|
||||
|
||||
## 4.0.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.2`
|
||||
- `@trigger.dev/core@4.0.2`
|
||||
- `@trigger.dev/sdk@4.0.2`
|
||||
|
||||
## 4.0.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.1`
|
||||
- `@trigger.dev/core@4.0.1`
|
||||
- `@trigger.dev/sdk@4.0.1`
|
||||
|
||||
## 4.0.0
|
||||
|
||||
### Major Changes
|
||||
|
||||
- Trigger.dev v4 release. Please see our upgrade to v4 docs to view the full changelog: https://trigger.dev/docs/upgrade-to-v4 ([#1869](https://github.com/triggerdotdev/trigger.dev/pull/1869))
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0`
|
||||
- `@trigger.dev/core@4.0.0`
|
||||
- `@trigger.dev/build@4.0.0`
|
||||
|
||||
## 4.0.0-v4-beta.28
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.28`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.28`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.28`
|
||||
|
||||
## 4.0.0-v4-beta.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.27`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.27`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.27`
|
||||
|
||||
## 4.0.0-v4-beta.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.26`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.26`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.26`
|
||||
|
||||
## 4.0.0-v4-beta.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.25`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.25`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.25`
|
||||
|
||||
## 4.0.0-v4-beta.24
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.24`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.24`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.24`
|
||||
|
||||
## 4.0.0-v4-beta.23
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.23`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.23`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.23`
|
||||
|
||||
## 4.0.0-v4-beta.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.22`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.22`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.22`
|
||||
|
||||
## 4.0.0-v4-beta.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.21`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.21`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.21`
|
||||
|
||||
## 4.0.0-v4-beta.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.20`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.20`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.20`
|
||||
|
||||
## 4.0.0-v4-beta.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.19`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.19`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.19`
|
||||
|
||||
## 4.0.0-v4-beta.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.18`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.18`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.18`
|
||||
|
||||
## 4.0.0-v4-beta.17
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.17`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.17`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.17`
|
||||
|
||||
## 4.0.0-v4-beta.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.16`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.16`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.16`
|
||||
|
||||
## 4.0.0-v4-beta.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.15`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.15`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.15`
|
||||
|
||||
## 4.0.0-v4-beta.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.14`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.14`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.14`
|
||||
|
||||
## 4.0.0-v4-beta.13
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.13`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.13`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.13`
|
||||
|
||||
## 4.0.0-v4-beta.12
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.12`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.12`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.12`
|
||||
|
||||
## 4.0.0-v4-beta.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.11`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.11`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.11`
|
||||
|
||||
## 4.0.0-v4-beta.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.10`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.10`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.10`
|
||||
|
||||
## 4.0.0-v4-beta.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.9`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.9`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.9`
|
||||
|
||||
## 4.0.0-v4-beta.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.8`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.8`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.8`
|
||||
|
||||
## 4.0.0-v4-beta.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.7`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.7`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.7`
|
||||
|
||||
## 4.0.0-v4-beta.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.6`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.6`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.6`
|
||||
|
||||
## 4.0.0-v4-beta.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.5`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.5`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.5`
|
||||
|
||||
## 4.0.0-v4-beta.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.4`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.4`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.4`
|
||||
|
||||
## 4.0.0-v4-beta.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.3`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.3`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.3`
|
||||
|
||||
## 4.0.0-v4-beta.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.2`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.2`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.2`
|
||||
|
||||
## 4.0.0-v4-beta.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.1`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.1`
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.1`
|
||||
|
||||
## 4.0.0-v4-beta.0
|
||||
|
||||
### Major Changes
|
||||
|
||||
- Trigger.dev v4 release. Please see our upgrade to v4 docs to view the full changelog: https://trigger.dev/docs/upgrade-to-v4 ([#1869](https://github.com/triggerdotdev/trigger.dev/pull/1869))
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@4.0.0-v4-beta.0`
|
||||
- `@trigger.dev/build@4.0.0-v4-beta.0`
|
||||
- `@trigger.dev/core@4.0.0-v4-beta.0`
|
||||
|
||||
## 3.3.17
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Introduced a new Python extension to enhance the build process. It now allows users to execute Python scripts with improved support and error handling. ([#1686](https://github.com/triggerdotdev/trigger.dev/pull/1686))
|
||||
- Updated dependencies:
|
||||
- `@trigger.dev/sdk@3.3.17`
|
||||
- `@trigger.dev/core@3.3.17`
|
||||
- `@trigger.dev/build@3.3.17`
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Trigger.dev
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,138 @@
|
||||
# Python Extension for Trigger.dev
|
||||
|
||||
The Python extension enhances Trigger.dev's build process by enabling limited support for executing Python scripts within your tasks.
|
||||
|
||||
## Overview
|
||||
|
||||
This extension introduces the <code>pythonExtension</code> build extension, which offers several key capabilities:
|
||||
|
||||
- **Install Python Dependencies (Except in Dev):** Automatically installs Python and specified dependencies using <code>pip</code>.
|
||||
- **Requirements File Support:** You can specify dependencies in a <code>requirements.txt</code> file.
|
||||
- **Inline Requirements:** Define dependencies directly within your <code>trigger.config.ts</code> file using the <code>requirements</code> option.
|
||||
- **Virtual Environment:** Creates a virtual environment (<code>/opt/venv</code>) inside containers to isolate Python dependencies.
|
||||
- **Helper Functions:** Provides a variety of functions for executing Python code:
|
||||
- <code>run</code>: Executes Python commands with proper environment setup.
|
||||
- <code>runInline</code>: Executes inline Python code directly from Node.
|
||||
- <code>runScript</code>: Executes standalone <code>.py</code> script files.
|
||||
- **Custom Python Path:** In development, you can configure <code>devPythonBinaryPath</code> to point to a custom Python installation.
|
||||
|
||||
## Usage
|
||||
|
||||
1. Add the extension to your <code>trigger.config.ts</code> file:
|
||||
|
||||
```typescript
|
||||
import { defineConfig } from "@trigger.dev/sdk/v3";
|
||||
import { pythonExtension } from "@trigger.dev/python/extension";
|
||||
|
||||
export default defineConfig({
|
||||
project: "<project ref>",
|
||||
build: {
|
||||
extensions: [
|
||||
pythonExtension({
|
||||
requirementsFile: "./requirements.txt", // Optional: Path to your requirements file
|
||||
devPythonBinaryPath: ".venv/bin/python", // Optional: Custom Python binary path
|
||||
scripts: ["src/python/**/*.py"], // Glob pattern for Python scripts
|
||||
}),
|
||||
],
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
2. (Optional) Create a <code>requirements.txt</code> file in your project root with the necessary Python dependencies.
|
||||
|
||||
```plaintext title="requirements.txt"
|
||||
pandas==1.3.3
|
||||
numpy==1.21.2
|
||||
```
|
||||
|
||||
```typescript title="trigger.config.ts"
|
||||
import { defineConfig } from "@trigger.dev/sdk/v3";
|
||||
import { pythonExtension } from "@trigger.dev/python/extension";
|
||||
|
||||
export default defineConfig({
|
||||
project: "<project ref>",
|
||||
build: {
|
||||
extensions: [
|
||||
pythonExtension({
|
||||
requirementsFile: "./requirements.txt",
|
||||
}),
|
||||
],
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
3. Execute Python scripts within your tasks using one of the provided functions:
|
||||
|
||||
### Running a Python Script
|
||||
|
||||
```typescript
|
||||
import { task } from "@trigger.dev/sdk/v3";
|
||||
import { python } from "@trigger.dev/python";
|
||||
|
||||
export const myScript = task({
|
||||
id: "my-python-script",
|
||||
run: async () => {
|
||||
const result = await python.runScript("my_script.py", ["hello", "world"]);
|
||||
return result.stdout;
|
||||
},
|
||||
});
|
||||
|
||||
export const myStreamingScript = task({
|
||||
id: "my-streaming-python-script",
|
||||
run: async () => {
|
||||
// You can also stream the output of the script
|
||||
const result = python.stream.runScript("my_script.py", ["hello", "world"]);
|
||||
|
||||
// result is an async iterable/readable stream
|
||||
for await (const chunk of streamingResult) {
|
||||
logger.debug("convert-url-to-markdown", {
|
||||
url: payload.url,
|
||||
chunk,
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Running Inline Python Code
|
||||
|
||||
```typescript
|
||||
import { task } from "@trigger.dev/sdk/v3";
|
||||
import { python } from "@trigger.dev/python";
|
||||
|
||||
export const myTask = task({
|
||||
id: "to_datetime-task",
|
||||
run: async () => {
|
||||
const result = await python.runInline(`
|
||||
import pandas as pd
|
||||
|
||||
pd.to_datetime("${+new Date() / 1000}")
|
||||
`);
|
||||
return result.stdout;
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Running Lower-Level Commands
|
||||
|
||||
```typescript
|
||||
import { task } from "@trigger.dev/sdk/v3";
|
||||
import { python } from "@trigger.dev/python";
|
||||
|
||||
export const pythonVersionTask = task({
|
||||
id: "python-version-task",
|
||||
run: async () => {
|
||||
const result = await python.run(["--version"]);
|
||||
return result.stdout; // Expected output: Python 3.12.8
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## Limitations
|
||||
|
||||
- This is a **partial implementation** and does not provide full Python support as an execution runtime for tasks.
|
||||
- Manual intervention may be required for installing and configuring binary dependencies in development environments.
|
||||
|
||||
## Additional Information
|
||||
|
||||
For more detailed documentation, visit the official docs at [Trigger.dev Documentation](https://trigger.dev/docs).
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"name": "@trigger.dev/python",
|
||||
"version": "4.5.3",
|
||||
"description": "Python runtime and build extension for Trigger.dev",
|
||||
"license": "MIT",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/triggerdotdev/trigger.dev",
|
||||
"directory": "packages/python"
|
||||
},
|
||||
"type": "module",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"tshy": {
|
||||
"selfLink": false,
|
||||
"main": true,
|
||||
"module": true,
|
||||
"project": "./tsconfig.src.json",
|
||||
"exports": {
|
||||
"./package.json": "./package.json",
|
||||
".": "./src/index.ts",
|
||||
"./extension": "./src/extension.ts"
|
||||
},
|
||||
"sourceDialects": [
|
||||
"@triggerdotdev/source"
|
||||
]
|
||||
},
|
||||
"typesVersions": {
|
||||
"*": {
|
||||
"extension": [
|
||||
"dist/commonjs/extension.d.ts"
|
||||
]
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist",
|
||||
"build": "tshy && pnpm run update-version",
|
||||
"dev": "tshy --watch",
|
||||
"typecheck": "tsc --noEmit -p tsconfig.src.json",
|
||||
"update-version": "tsx ../../scripts/updateVersion.ts",
|
||||
"check-exports": "attw --pack ."
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/core": "workspace:4.5.3",
|
||||
"tinyexec": "^0.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.20.0",
|
||||
"rimraf": "6.0.1",
|
||||
"tshy": "^3.0.2",
|
||||
"typescript": "^5.5.4",
|
||||
"tsx": "4.17.0",
|
||||
"esbuild": "^0.23.0",
|
||||
"@arethetypeswrong/cli": "^0.15.4",
|
||||
"@trigger.dev/build": "workspace:4.5.3",
|
||||
"@trigger.dev/sdk": "workspace:4.5.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^4.5.3",
|
||||
"@trigger.dev/build": "workspace:^4.5.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.20.0"
|
||||
},
|
||||
"exports": {
|
||||
"./package.json": "./package.json",
|
||||
".": {
|
||||
"import": {
|
||||
"@triggerdotdev/source": "./src/index.ts",
|
||||
"types": "./dist/esm/index.d.ts",
|
||||
"default": "./dist/esm/index.js"
|
||||
},
|
||||
"require": {
|
||||
"types": "./dist/commonjs/index.d.ts",
|
||||
"default": "./dist/commonjs/index.js"
|
||||
}
|
||||
},
|
||||
"./extension": {
|
||||
"import": {
|
||||
"@triggerdotdev/source": "./src/extension.ts",
|
||||
"types": "./dist/esm/extension.d.ts",
|
||||
"default": "./dist/esm/extension.js"
|
||||
},
|
||||
"require": {
|
||||
"types": "./dist/commonjs/extension.d.ts",
|
||||
"default": "./dist/commonjs/extension.js"
|
||||
}
|
||||
}
|
||||
},
|
||||
"main": "./dist/commonjs/index.js",
|
||||
"types": "./dist/commonjs/index.d.ts",
|
||||
"module": "./dist/esm/index.js"
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
import fs from "node:fs";
|
||||
import assert from "node:assert";
|
||||
import { addAdditionalFilesToBuild } from "@trigger.dev/build/internal";
|
||||
import type { BuildManifest } from "@trigger.dev/core/v3";
|
||||
import type { BuildContext, BuildExtension } from "@trigger.dev/core/v3/build";
|
||||
|
||||
export type PythonOptions = {
|
||||
requirements?: string[];
|
||||
requirementsFile?: string;
|
||||
/**
|
||||
* [Dev-only] The path to the python binary.
|
||||
*
|
||||
* @remarks
|
||||
* This option is typically used during local development or in specific testing environments
|
||||
* where a particular Python installation needs to be targeted. It should point to the full path of the python executable.
|
||||
*
|
||||
* Example: `/usr/bin/python3` or `C:\\Python39\\python.exe`
|
||||
*/
|
||||
devPythonBinaryPath?: string;
|
||||
/**
|
||||
* An array of glob patterns that specify which Python scripts are allowed to be executed.
|
||||
*
|
||||
* @remarks
|
||||
* These scripts will be copied to the container during the build process.
|
||||
*/
|
||||
scripts?: string[];
|
||||
};
|
||||
|
||||
const splitAndCleanComments = (str: string) =>
|
||||
str
|
||||
.split("\n")
|
||||
.map((line) => line.trim())
|
||||
.filter((line) => line && !line.startsWith("#"));
|
||||
|
||||
export function pythonExtension(options: PythonOptions = {}): BuildExtension {
|
||||
return new PythonExtension(options);
|
||||
}
|
||||
|
||||
class PythonExtension implements BuildExtension {
|
||||
public readonly name = "PythonExtension";
|
||||
|
||||
constructor(private options: PythonOptions = {}) {
|
||||
assert(
|
||||
!(this.options.requirements && this.options.requirementsFile),
|
||||
"Cannot specify both requirements and requirementsFile"
|
||||
);
|
||||
|
||||
if (this.options.requirementsFile) {
|
||||
assert(
|
||||
fs.existsSync(this.options.requirementsFile),
|
||||
`Requirements file not found: ${this.options.requirementsFile}`
|
||||
);
|
||||
this.options.requirements = splitAndCleanComments(
|
||||
fs.readFileSync(this.options.requirementsFile, "utf-8")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
async onBuildComplete(context: BuildContext, manifest: BuildManifest) {
|
||||
await addAdditionalFilesToBuild(
|
||||
"pythonExtension",
|
||||
{
|
||||
files: this.options.scripts ?? [],
|
||||
},
|
||||
context,
|
||||
manifest
|
||||
);
|
||||
|
||||
if (context.target === "dev") {
|
||||
if (this.options.devPythonBinaryPath) {
|
||||
process.env.PYTHON_BIN_PATH = this.options.devPythonBinaryPath;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
context.logger.debug(`Adding ${this.name} to the build`);
|
||||
|
||||
context.addLayer({
|
||||
id: "python-installation",
|
||||
image: {
|
||||
instructions: splitAndCleanComments(`
|
||||
# Install Python
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
python3 python3-pip python3-venv && \
|
||||
apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Set up Python environment
|
||||
RUN python3 -m venv /opt/venv
|
||||
ENV PATH="/opt/venv/bin:$PATH"
|
||||
`),
|
||||
},
|
||||
deploy: {
|
||||
env: {
|
||||
PYTHON_BIN_PATH: `/opt/venv/bin/python`,
|
||||
},
|
||||
override: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (this.options.requirementsFile) {
|
||||
if (this.options.requirements) {
|
||||
context.logger.warn(
|
||||
`[pythonExtension] Both options.requirements and options.requirementsFile are specified. requirements will be ignored.`
|
||||
);
|
||||
}
|
||||
|
||||
// Copy requirements file to the container
|
||||
await addAdditionalFilesToBuild(
|
||||
"pythonExtension",
|
||||
{
|
||||
files: [this.options.requirementsFile],
|
||||
},
|
||||
context,
|
||||
manifest
|
||||
);
|
||||
|
||||
// Add a layer to the build that installs the requirements
|
||||
context.addLayer({
|
||||
id: "python-dependencies",
|
||||
image: {
|
||||
instructions: splitAndCleanComments(`
|
||||
# Copy the requirements file
|
||||
COPY ${this.options.requirementsFile} .
|
||||
# Install dependencies
|
||||
RUN pip install --no-cache-dir -r ${this.options.requirementsFile}
|
||||
`),
|
||||
},
|
||||
deploy: {
|
||||
override: true,
|
||||
},
|
||||
});
|
||||
} else if (this.options.requirements) {
|
||||
context.addLayer({
|
||||
id: "python-dependencies",
|
||||
build: {
|
||||
env: {
|
||||
REQUIREMENTS_CONTENT: this.options.requirements?.join("\n") || "",
|
||||
},
|
||||
},
|
||||
image: {
|
||||
instructions: splitAndCleanComments(`
|
||||
ARG REQUIREMENTS_CONTENT
|
||||
RUN echo "$REQUIREMENTS_CONTENT" > requirements.txt
|
||||
|
||||
# Install dependencies
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
`),
|
||||
},
|
||||
deploy: {
|
||||
override: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,329 @@
|
||||
import type { AsyncIterableStream } from "@trigger.dev/core/v3";
|
||||
import {
|
||||
createAsyncIterableStreamFromAsyncIterable,
|
||||
SemanticInternalAttributes,
|
||||
taskContext,
|
||||
} from "@trigger.dev/core/v3";
|
||||
import { logger } from "@trigger.dev/sdk/v3";
|
||||
import { carrierFromContext } from "@trigger.dev/core/v3/otel";
|
||||
import assert from "node:assert";
|
||||
import fs from "node:fs";
|
||||
import type { Result, Options as XOptions } from "tinyexec";
|
||||
import { x } from "tinyexec";
|
||||
import { createTempFileSync, withTempFile } from "./utils/tempFiles.js";
|
||||
|
||||
export type PythonExecOptions = Partial<XOptions> & {
|
||||
env?: { [key: string]: string | undefined };
|
||||
};
|
||||
|
||||
export const python = {
|
||||
async run(scriptArgs: string[] = [], options: PythonExecOptions = {}): Promise<Result> {
|
||||
const pythonBin = process.env.PYTHON_BIN_PATH || "python";
|
||||
|
||||
const carrier = carrierFromContext();
|
||||
|
||||
return await logger.trace(
|
||||
"python.run()",
|
||||
async (span) => {
|
||||
const result = await x(pythonBin, scriptArgs, {
|
||||
...options,
|
||||
nodeOptions: {
|
||||
...(options.nodeOptions || {}),
|
||||
env: {
|
||||
...process.env,
|
||||
...options.env,
|
||||
TRACEPARENT: carrier["traceparent"],
|
||||
OTEL_RESOURCE_ATTRIBUTES: `${
|
||||
SemanticInternalAttributes.EXECUTION_ENVIRONMENT
|
||||
}=trigger,${Object.entries(taskContext.attributes)
|
||||
.map(([key, value]) => `${key}=${value}`)
|
||||
.join(",")}`,
|
||||
},
|
||||
},
|
||||
throwOnError: false, // Ensure errors are handled manually
|
||||
});
|
||||
|
||||
if (result.exitCode) {
|
||||
span.setAttribute("exitCode", result.exitCode);
|
||||
}
|
||||
|
||||
if (result.exitCode !== 0) {
|
||||
throw new Error(
|
||||
`${scriptArgs.join(" ")} exited with a non-zero code ${result.exitCode}:\n${
|
||||
result.stderr
|
||||
}`
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
{
|
||||
attributes: {
|
||||
pythonBin,
|
||||
args: scriptArgs.join(" "),
|
||||
[SemanticInternalAttributes.STYLE_ICON]: "python",
|
||||
},
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
async runScript(
|
||||
scriptPath: string,
|
||||
scriptArgs: string[] = [],
|
||||
options: PythonExecOptions = {}
|
||||
): Promise<Result> {
|
||||
assert(scriptPath, "Script path is required");
|
||||
assert(fs.existsSync(scriptPath), `Script does not exist: ${scriptPath}`);
|
||||
|
||||
return await logger.trace(
|
||||
"python.runScript()",
|
||||
async (span) => {
|
||||
span.setAttribute("scriptPath", scriptPath);
|
||||
|
||||
const carrier = carrierFromContext();
|
||||
|
||||
const result = await x(
|
||||
process.env.PYTHON_BIN_PATH || "python",
|
||||
[scriptPath, ...scriptArgs],
|
||||
{
|
||||
...options,
|
||||
nodeOptions: {
|
||||
...(options.nodeOptions || {}),
|
||||
env: {
|
||||
...process.env,
|
||||
...options.env,
|
||||
TRACEPARENT: carrier["traceparent"],
|
||||
OTEL_RESOURCE_ATTRIBUTES: `${
|
||||
SemanticInternalAttributes.EXECUTION_ENVIRONMENT
|
||||
}=trigger,${Object.entries(taskContext.attributes)
|
||||
.map(([key, value]) => `${key}=${value}`)
|
||||
.join(",")}`,
|
||||
OTEL_LOG_LEVEL: "DEBUG",
|
||||
},
|
||||
},
|
||||
throwOnError: false,
|
||||
}
|
||||
);
|
||||
|
||||
if (result.exitCode) {
|
||||
span.setAttribute("exitCode", result.exitCode);
|
||||
}
|
||||
|
||||
if (result.exitCode !== 0) {
|
||||
throw new Error(
|
||||
`${scriptPath} ${scriptArgs.join(" ")} exited with a non-zero code ${
|
||||
result.exitCode
|
||||
}:\n${result.stdout}\n${result.stderr}`
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
{
|
||||
attributes: {
|
||||
pythonBin: process.env.PYTHON_BIN_PATH || "python",
|
||||
scriptPath,
|
||||
args: scriptArgs.join(" "),
|
||||
[SemanticInternalAttributes.STYLE_ICON]: "python",
|
||||
},
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
async runInline(scriptContent: string, options: PythonExecOptions = {}): Promise<Result> {
|
||||
assert(scriptContent, "Script content is required");
|
||||
|
||||
return await logger.trace(
|
||||
"python.runInline()",
|
||||
async (span) => {
|
||||
span.setAttribute("contentLength", scriptContent.length);
|
||||
|
||||
// Using the withTempFile utility to handle the temporary file
|
||||
return await withTempFile(
|
||||
`script_${Date.now()}.py`,
|
||||
async (tempFilePath) => {
|
||||
span.setAttribute("tempFilePath", tempFilePath);
|
||||
|
||||
const carrier = carrierFromContext();
|
||||
|
||||
const pythonBin = process.env.PYTHON_BIN_PATH || "python";
|
||||
const result = await x(pythonBin, [tempFilePath], {
|
||||
...options,
|
||||
nodeOptions: {
|
||||
...(options.nodeOptions || {}),
|
||||
env: {
|
||||
...process.env,
|
||||
...options.env,
|
||||
TRACEPARENT: carrier["traceparent"],
|
||||
OTEL_RESOURCE_ATTRIBUTES: `${
|
||||
SemanticInternalAttributes.EXECUTION_ENVIRONMENT
|
||||
}=trigger,${Object.entries(taskContext.attributes)
|
||||
.map(([key, value]) => `${key}=${value}`)
|
||||
.join(",")}`,
|
||||
},
|
||||
},
|
||||
throwOnError: false,
|
||||
});
|
||||
|
||||
if (result.exitCode) {
|
||||
span.setAttribute("exitCode", result.exitCode);
|
||||
}
|
||||
|
||||
if (result.exitCode !== 0) {
|
||||
throw new Error(
|
||||
`Inline script exited with a non-zero code ${result.exitCode}:\n${result.stderr}`
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
scriptContent
|
||||
);
|
||||
},
|
||||
{
|
||||
attributes: {
|
||||
pythonBin: process.env.PYTHON_BIN_PATH || "python",
|
||||
contentPreview:
|
||||
scriptContent.substring(0, 100) + (scriptContent.length > 100 ? "..." : ""),
|
||||
[SemanticInternalAttributes.STYLE_ICON]: "python",
|
||||
},
|
||||
}
|
||||
);
|
||||
},
|
||||
// Stream namespace for streaming functions
|
||||
stream: {
|
||||
run(scriptArgs: string[] = [], options: PythonExecOptions = {}): AsyncIterableStream<string> {
|
||||
const pythonBin = process.env.PYTHON_BIN_PATH || "python";
|
||||
|
||||
const carrier = carrierFromContext();
|
||||
|
||||
const pythonProcess = x(pythonBin, scriptArgs, {
|
||||
...options,
|
||||
nodeOptions: {
|
||||
...(options.nodeOptions || {}),
|
||||
env: {
|
||||
...process.env,
|
||||
...options.env,
|
||||
TRACEPARENT: carrier["traceparent"],
|
||||
OTEL_RESOURCE_ATTRIBUTES: `${
|
||||
SemanticInternalAttributes.EXECUTION_ENVIRONMENT
|
||||
}=trigger,${Object.entries(taskContext.attributes)
|
||||
.map(([key, value]) => `${key}=${value}`)
|
||||
.join(",")}`,
|
||||
},
|
||||
},
|
||||
throwOnError: false,
|
||||
});
|
||||
|
||||
const span = logger.startSpan("python.stream.run()", {
|
||||
attributes: {
|
||||
pythonBin,
|
||||
args: scriptArgs.join(" "),
|
||||
[SemanticInternalAttributes.STYLE_ICON]: "python",
|
||||
},
|
||||
});
|
||||
|
||||
return createAsyncIterableStreamFromAsyncIterable(pythonProcess, {
|
||||
transform: (chunk, controller) => {
|
||||
controller.enqueue(chunk);
|
||||
},
|
||||
flush: () => {
|
||||
span.end();
|
||||
},
|
||||
});
|
||||
},
|
||||
runScript(
|
||||
scriptPath: string,
|
||||
scriptArgs: string[] = [],
|
||||
options: PythonExecOptions = {}
|
||||
): AsyncIterableStream<string> {
|
||||
assert(scriptPath, "Script path is required");
|
||||
assert(fs.existsSync(scriptPath), `Script does not exist: ${scriptPath}`);
|
||||
|
||||
const pythonBin = process.env.PYTHON_BIN_PATH || "python";
|
||||
|
||||
const carrier = carrierFromContext();
|
||||
|
||||
const pythonProcess = x(pythonBin, [scriptPath, ...scriptArgs], {
|
||||
...options,
|
||||
nodeOptions: {
|
||||
...(options.nodeOptions || {}),
|
||||
env: {
|
||||
...process.env,
|
||||
...options.env,
|
||||
TRACEPARENT: carrier["traceparent"],
|
||||
OTEL_RESOURCE_ATTRIBUTES: `${
|
||||
SemanticInternalAttributes.EXECUTION_ENVIRONMENT
|
||||
}=trigger,${Object.entries(taskContext.attributes)
|
||||
.map(([key, value]) => `${key}=${value}`)
|
||||
.join(",")}`,
|
||||
},
|
||||
},
|
||||
throwOnError: false,
|
||||
});
|
||||
|
||||
const span = logger.startSpan("python.stream.runScript()", {
|
||||
attributes: {
|
||||
pythonBin,
|
||||
scriptPath,
|
||||
args: scriptArgs.join(" "),
|
||||
[SemanticInternalAttributes.STYLE_ICON]: "python",
|
||||
},
|
||||
});
|
||||
|
||||
return createAsyncIterableStreamFromAsyncIterable(pythonProcess, {
|
||||
transform: (chunk, controller) => {
|
||||
controller.enqueue(chunk);
|
||||
},
|
||||
flush: () => {
|
||||
span.end();
|
||||
},
|
||||
});
|
||||
},
|
||||
runInline(scriptContent: string, options: PythonExecOptions = {}): AsyncIterableStream<string> {
|
||||
assert(scriptContent, "Script content is required");
|
||||
|
||||
const pythonBin = process.env.PYTHON_BIN_PATH || "python";
|
||||
|
||||
const pythonScriptPath = createTempFileSync(`script_${Date.now()}.py`, scriptContent);
|
||||
|
||||
const carrier = carrierFromContext();
|
||||
|
||||
const pythonProcess = x(pythonBin, [pythonScriptPath], {
|
||||
...options,
|
||||
nodeOptions: {
|
||||
...(options.nodeOptions || {}),
|
||||
env: {
|
||||
...process.env,
|
||||
...options.env,
|
||||
TRACEPARENT: carrier["traceparent"],
|
||||
OTEL_RESOURCE_ATTRIBUTES: `${
|
||||
SemanticInternalAttributes.EXECUTION_ENVIRONMENT
|
||||
}=trigger,${Object.entries(taskContext.attributes)
|
||||
.map(([key, value]) => `${key}=${value}`)
|
||||
.join(",")}`,
|
||||
},
|
||||
},
|
||||
throwOnError: false,
|
||||
});
|
||||
|
||||
const span = logger.startSpan("python.stream.runInline()", {
|
||||
attributes: {
|
||||
pythonBin,
|
||||
contentPreview:
|
||||
scriptContent.substring(0, 100) + (scriptContent.length > 100 ? "..." : ""),
|
||||
[SemanticInternalAttributes.STYLE_ICON]: "python",
|
||||
},
|
||||
});
|
||||
|
||||
return createAsyncIterableStreamFromAsyncIterable(pythonProcess, {
|
||||
transform: (chunk, controller) => {
|
||||
controller.enqueue(chunk);
|
||||
},
|
||||
flush: () => {
|
||||
span.end();
|
||||
},
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,39 @@
|
||||
import { mkdtempSync, writeFileSync } from "node:fs";
|
||||
import { mkdtemp, writeFile, rm } from "node:fs/promises";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
|
||||
/**
|
||||
* Creates a temporary file with a custom filename, passes it to the callback function, and ensures cleanup
|
||||
* @param filename The filename to use for the temporary file
|
||||
* @param callback Function that receives the path to the temporary file
|
||||
* @param content Optional content to write to the file
|
||||
* @returns Whatever the callback returns
|
||||
*/
|
||||
export async function withTempFile<T>(
|
||||
filename: string,
|
||||
callback: (filePath: string) => Promise<T>,
|
||||
content: string | Buffer = ""
|
||||
): Promise<T> {
|
||||
// Create temporary directory with random suffix
|
||||
const tempDir = await mkdtemp(join(tmpdir(), "app-"));
|
||||
const tempFile = join(tempDir, filename);
|
||||
|
||||
try {
|
||||
// Write to the temporary file with appropriate permissions
|
||||
await writeFile(tempFile, content, { mode: 0o600 });
|
||||
// Use the file
|
||||
return await callback(tempFile);
|
||||
} finally {
|
||||
// Clean up
|
||||
await rm(tempDir, { recursive: true, force: true });
|
||||
}
|
||||
}
|
||||
|
||||
export function createTempFileSync(filename: string, content: string | Buffer = ""): string {
|
||||
const tempDir = mkdtempSync(join(tmpdir(), "app-"));
|
||||
const tempFile = join(tempDir, filename);
|
||||
|
||||
writeFileSync(tempFile, content, { mode: 0o600 });
|
||||
return tempFile;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "../../.configs/tsconfig.base.json",
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.src.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"include": ["./src/**/*.ts"],
|
||||
"compilerOptions": {
|
||||
"isolatedDeclarations": false,
|
||||
"composite": true,
|
||||
"sourceMap": true,
|
||||
"customConditions": ["@triggerdotdev/source"]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user