GameDevTools
Overview ✅
GameDevTools is a collection of Python tools and utilities used in the game development
Table of Contents 📚
- Features
- Requirements
- Usage Examples
- Development & Testing
- Contribution Guide
- Support & Troubleshooting
- License & Credits
Features ✨
- Modules to copy a folder or files to a remote location or cloud drive (Amazon S3)
Requirements ⚙️
- Python 3.10 or newer
Usage Examples 🔧
-
uepyscripts.tools.archives.rotate_archives: this module allows to archive the result of packaging your game, in a shared folder. The arguments are:directory_path: The folder where to archive the packages. Note that this module will copy the archives in a sub-folder named after the current date with the formatYYYYMMdd. If a folder already exists with the same date, it will suffix with an incrementing counter_XXkeep_count: How many versions of the packages you want to keep indirectory_path. This will remove the extraneous sub-folders to only keepkeep_countitems.folder_output_file_name: Path to a text file where to write the path to the folder where the archive was copied. This is useful if you plan to use this folder for other tasks, such as sending a message in slack, or uploading the archives to an amazon S3 bucket
-
uepyscripts.tools.archives.upload_archives: this module allows to upload to an amazon S3 bucket all the files inside a folder. The arguments are:local_folder: The folder where to find the files to uploadbucket_name: The S3 bucket nameregion: The region of the bucketaccess_keyandsecret_key: The keys to access the bucketdestination_folder: The folder where to upload in the bucket. As withrotate_archives, a sub-folder with the date will be used, and if the folder exists, a suffix will be added.keep_count: Same as withrotate_archives, this is used to control how many archives you want to keep.output_file: Path to a text file where the uploaded files URLs will be stored. This can be used in your jenkinsfile to be sent to a slack channel for example.
Here's an example of how we use these 2 modules in our jenkinsfiles:
stage( 'Rotate Archives' ) {
pwsh """
. "Scripts/.venv/Scripts/gamedevtools-archives-rotate.exe" `
--directory_path = "//nas/Versions/OurGame/Development/WIP" `
--keep_count = "-1" `
--folder_output_file_name = "${env.WORKSPACE}/Saved/Temp/latest_archive_Development.txt"
"""
def folder_name = readFile "${env.WORKSPACE}/Saved/Temp/latest_archive_Development.txt"
slackSend( channel: '#channel', message: "New Development build available : ${folder_name}" )
}
stage( 'Upload Archives' ) {
def file = readFile "${env.WORKSPACE}/Saved/Temp/latest_archive_Development.txt"
pwsh """
. "Scripts/.venv/Scripts/gamedevtools-archives-upload.exe" `
--local_folder = "${file}" `
--bucket_name = "artifacts" `
--region = "eu-west-3" `
--access_key = "XXXXX" `
--secret_key = "YYYYY" `
--destination_folder = "Development/" `
--keep_count = "-1" `
--output_file = "${env.WORKSPACE}/Saved/Temp/uploaded_files_Development.txt" `
"""
def uploaded_files = readFile "${env.WORKSPACE}/Saved/Temp/uploaded_files_Development.txt"
def lines = uploaded_files.split('\n')
if ( lines.size() > 0 ) {
def message = 'Uploaded builds:\n'
lines.each { String line ->
def parts = line.split(' : ', 2)
if (parts.size() == 2) {
def url = parts[0].trim()
def filename = parts[1].trim()
message += "<${url}|${filename}>\n"
}
}
slackSend( channel: '#channel', message: message )
} else {
slackSend( channel: '#channel', color: 'danger', message: 'No files were uploaded' )
}
}
Development & Testing 🧪
-
Setup dev environment and install dependencies:
.\setup_venv.ps1 .\.venv\Scripts\Activate.ps1
-
Linting & formatting
- Use
ruff check .,ruff format .andmypy .
- Use
Contribution Guide 🤝
We welcome contributions — please follow these steps:
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-change - Run lint locally
- Submit a pull request describing the change
Support & Troubleshooting ❓
- Check
Config/anduepyscripts/internal/config.pyfor project-specific settings. - If
buildgraphfails, ensureConfig/Projecthas a validBuildgraphPathand the UAT tool is accessible. - When reporting issues, include:
- Python version
- Unreal Engine version
- Exact command and full logs
License & Credits 📝
License: MIT — see the LICENSE file.
Maintainers: Michael Delva and contributors (see AUTHORS or repository metadata).
Changelog: See CHANGELOG.md
Made with ❤️ for Game Dev developers — contributions and feedback are welcome! If this helped you, consider starring the repository. ⭐
Metadata
Release files for GameDevTools 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gamedevtools-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Release files / gamedevtools-1.2.0-py3-none-any.whl
| Download URL | gamedevtools-1.2.0-py3-none-any.whl |
|---|---|
| Size | 13.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0317438a3dac62032edab06d69f5878835f04b7386331f25ca3fc4d8aa24d56a
|
|
BLAKE2b-256 checksum How to use checksums |
0c219bad56a03f5f61ceb6fb5dad2415071bf09b49e94e7be2782756320163a0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 27, 2026.
Transparency log