# TestZeus SDK
Python SDK for the TestZeus testing platform.
## Installation
Install the package using pip:
```bash
pip install testzeus-sdk
```
Or use Poetry:
```bash
poetry add testzeus-sdk
```
## Components
### Python SDK
The TestZeus SDK provides programmatic access to the TestZeus testing platform through a Python interface.
### Command Line Interface (CLI)
The TestZeus CLI provides a command-line interface for interacting with the TestZeus platform. For detailed CLI documentation, see the [CLI README](testzeus-cli/README.md).
```bash
# Install CLI
pip install testzeus-cli
# Login to TestZeus
testzeus login
# List tests
testzeus tests list
```
## Getting Started with SDK
```python
import asyncio
from testzeus_sdk import TestZeusClient
async def main():
# Create a client with email/password
client = TestZeusClient(email="your-email", password="your-password")
# Use as a context manager
async with client:
# Your code here
pass
# Run the example
asyncio.run(main())
```
## Authentication
The SDK supports three authentication methods:
### Email/Password
```python
client = TestZeusClient(email="your-email", password="your-password")
```
### Environment Variables
```
export TESTZEUS_EMAIL="your-email"
export TESTZEUS_PASSWORD="your-password"
```
Then create the client without parameters:
```python
client = TestZeusClient()
```
## Core Functionality
### Tests Management
#### List Tests
```python
# Get list of tests with filters and sorting
tests = await client.tests.get_list(
expand='tags', # Expand related entities
sort='id', # Sort by field
filters={ # Filter results
'id': 'y9b88f17vabx476'
}
)
print(tests)
print(tests['items'][0].data) # Access test data
```
#### Advanced Filtering
The SDK supports powerful filtering capabilities using PocketBase filter syntax. All managers that extend `BaseManager` support these filtering options:
##### Simple Filters (Backward Compatible)
```python
# Basic field matching
filters = {
"name": "Test Name",
"status": "active",
"priority": 5
}
# List values (OR condition)
filters = {
"status": ["active", "pending", "draft"] # status = "active" OR status = "pending" OR status = "draft"
}
```
##### Advanced Operators
```python
# Use complex operators with value objects
filters = {
"created": {"operator": ">", "value": "2023-01-01"}, # created > "2023-01-01"
"priority": {"operator": ">=", "value": 3}, # priority >= 3
"name": {"operator": "~", "value": "test"}, # name LIKE "%test%"
"description": {"operator": "!~", "value": "old"} # description NOT LIKE "%old%"
}
```
##### Supported Operators
**Comparison Operators:**
- `=` - Equal (default when no operator specified)
- `!=` - Not equal
- `>` - Greater than
- `>=` - Greater than or equal
- `<` - Less than
- `<=` - Less than or equal
**String Operators:**
- `~` - Like/Contains (auto-wraps with % for wildcard matching)
- `!~` - Not Like/Contains
**Array Operators (for multi-value fields):**
- `?=` - Any/At least one equal
- `?!=` - Any/At least one not equal
- `?>` - Any/At least one greater than
- `?>=` - Any/At least one greater than or equal
- `?<` - Any/At least one less than
- `?<=` - Any/At least one less than or equal
- `?~` - Any/At least one like/contains
- `?!~` - Any/At least one not like/contains
##### Array Operators with Lists
```python
# Check if any tag matches the values
filters = {
"tags": {"operator": "?=", "value": ["urgent", "important"]}
}
# Result: (tags ?= "urgent" || tags ?= "important")
```
##### Logical Grouping
**AND Conditions:**
```python
filters = {
"$and": [
{"status": "active"},
{"priority": {"operator": ">", "value": 3}},
{"created": {"operator": ">", "value": "2023-01-01"}}
]
}
# Result: (status = "active" && priority > 3 && created > "2023-01-01")
```
**OR Conditions:**
```python
filters = {
"$or": [
{"status": "urgent"},
{"priority": {"operator": ">=", "value": 8}}
]
}
# Result: (status = "urgent" || priority >= 8)
```
**Complex Combinations:**
```python
filters = {
"tenant": "abc123", # Always filter by current tenant
"$or": [
{"status": "active"},
{
"$and": [
{"status": "draft"},
{"modified": {"operator": ">", "value": "2023-01-01"}},
{"tags": {"operator": "?=", "value": ["review", "pending"]}}
]
}
]
}
# Result: tenant = "abc123" && (status = "active" || (status = "draft" && modified > "2023-01-01" && (tags ?= "review" || tags ?= "pending")))
```
##### Practical Examples
**Filter tests by date range:**
```python
tests = await client.tests.get_list(
filters={
"$and": [
{"created": {"operator": ">=", "value": "2023-01-01"}},
{"created": {"operator": "<", "value": "2023-12-31"}}
]
}
)
```
**Filter by multiple statuses and search in name:**
```python
tests = await client.tests.get_list(
filters={
"status": ["active", "pending"],
"name": {"operator": "~", "value": "integration"}
}
)
```
**Filter test runs by status and date:**
```python
test_runs = await client.test_runs.get_list(
filters={
"$and": [
{"status": {"operator": "!=", "value": "draft"}},
{"start_time": {"operator": ">", "value": "2023-01-01T00:00:00Z"}}
]
},
sort="-created" # Sort by created date descending
)
```
**Filter environments by tags:**
```python
environments = await client.environments.get_list(
filters={
"tags": {"operator": "?=", "value": ["production", "staging"]}
}
)
```
#### Get Single Test
```python
# Get test by ID
test = await client.tests.get_one('311137kown88nd6')
print(test.data)
```
#### Create Test
```python
# Create a new test
new_test = await client.tests.create(
name="New Test",
test_feature="Example feature",
status="draft", # Optional: 'draft', 'ready', 'deleted'
test_data=["data_id1", "data_id2"], # Optional: List of test data IDs
tags=["tag1", "tag2"], # Optional: List of tag IDs
environment="env_id" # Optional: Environment ID
)
```
#### Update Test
```python
# Update test properties
updated_test = await client.tests.update(
'test_id',
name='Updated Test Name'
)
print(updated_test.data)
```
#### Delete Test
```python
# Delete a test
await client.tests.delete('test_id')
```
### Test Runs Management
#### Create and Start Test Run
```python
# Create and start a test run
test_run = await client.test_runs.create_and_start(
name="Test Run Name",
test="Test Name or ID"
)
print(test_run.data)
```
#### Track Test Run Status
```python
# Get test run by ID
test_run = await client.test_runs.get_one('test_run_id')
# Check test run status
if test_run.is_running():
print("Test is currently running")
elif test_run.is_completed():
print("Test has completed successfully")
elif test_run.is_failed():
print("Test has failed")
elif test_run.is_crashed():
print("Test has crashed")
elif test_run.is_cancelled():
print("Test was cancelled")
elif test_run.is_pending():
print("Test is pending")
# Get test run duration
duration = test_run.get_duration()
if duration:
print(f"Test run took {duration} seconds")
```
#### Get Detailed Test Run Information
```python
# Get expanded test run details including all outputs, steps, and attachments
expanded_test_run = await client.test_runs.get_expanded('test_run_id')
# Access different components of the test run
test_run_data = expanded_test_run['test_run']
test_run_dashs = expanded_test_run['test_run_dashs']
test_run_dash_outputs = expanded_test_run['test_run_dash_outputs']
test_run_dash_output_steps = expanded_test_run['test_run_dash_output_steps']
test_run_dash_outputs_attachments = expanded_test_run['test_run_dash_outputs_attachments']
# Print test run details
print(f"Test Run Name: {test_run_data['name']}")
print(f"Status: {test_run_data['status']}")
print(f"Start Time: {test_run_data['start_time']}")
print(f"End Time: {test_run_data['end_time']}")
# Print test run steps
for step in test_run_dash_output_steps:
print(f"Step: {step['name']}")
print(f"Status: {step['status']}")
print(f"Is Passed: {step['is_passed']}")
print(f"Assert Summary: {step['assert_summary']}")
```
#### Cancel Test Run
```python
# Cancel a running test
try:
cancelled_test = await client.test_runs.cancel('test_run_id')
print(f"Test run cancelled: {cancelled_test.status}")
except ValueError as e:
print(f"Cannot cancel test: {str(e)}")
```
#### Download Test Run Attachments
```python
# Download all attachments for a test run
download_attachment = await client.test_runs.download_all_attachments(
'test_run_id',
'local/path/to/save'
)
# Download specific attachment
attachment = await client.test_run_dash_outputs_attachments.download_attachment(
'attachment_id',
'local/path/to/save'
)
```
#### Monitor Test Run Progress
```python
import asyncio
import time
async def monitor_test_run(test_run_id: str, check_interval: int = 5):
"""
Monitor a test run's progress until completion
Args:
test_run_id: ID of the test run to monitor
check_interval: Time between status checks in seconds
"""
while True:
test_run = await client.test_runs.get_one(test_run_id)
if test_run.is_completed():
print("Test run completed successfully!")
break
elif test_run.is_failed():
print("Test run failed!")
break
elif test_run.is_crashed():
print("Test run crashed!")
break
elif test_run.is_cancelled():
print("Test run was cancelled!")
break
print(f"Test run status: {test_run.status}")
await asyncio.sleep(check_interval)
# Usage
await monitor_test_run('test_run_id')
```
### Test Data Management
```python
# Create test data
test_data = await client.test_data.create({
"name": "Test Data",
"type": "test", # Optional: defaults to "test"
"status": "draft" # Optional: defaults to "draft"
})
```
### Environment Management
```python
# List environments
environments = await client.environments.get_list()
# Get environment by ID
environment = await client.environments.get_one('env_id')
```
### Tags Management
```python
# List tags
tags = await client.tags.get_list()
# Create tag
tag = await client.tags.create({
"name": "New Tag"
})
```
## Available Managers
The SDK provides managers for all TestZeus collections:
- `client.tests` - Tests
- `client.test_runs` - Test Runs
- `client.test_run_dashs` - Test Run Dashboards
- `client.test_data` - Test Data
- `client.environments` - Environments
- `client.tags` - Tags
- `client.agent_configs` - Agent Configurations
- `client.test_devices` - Test Devices
- `client.test_designs` - Test Designs
- `client.test_run_dash_outputs` - Test Run Dashboard Outputs
- `client.test_run_dash_output_steps` - Test Run Dashboard Output Steps
- `client.tenant_consumption` - Tenant Consumption
- `client.tenant_consumption_logs` - Tenant Consumption Logs
## Contributing
1. Clone the repository
2. Install dependencies with Poetry: `poetry install`
3. Run tests: `poetry run pytest`
## License
MIT
## Release Process
This project uses automated releases through GitHub Actions. The process is:
1. To create a new release, use one of the following make commands:
```bash
# Interactive version bump (will prompt for version type)
make release
# Specific version bumps
make release-patch # Increments the patch version (e.g., 1.0.0 -> 1.0.1)
make release-minor # Increments the minor version (e.g., 1.0.0 -> 1.1.0)
make release-major # Increments the major version (e.g., 1.0.0 -> 2.0.0)
make release-custom # Set a custom version (will prompt for version)
```
2. The command will:
- Update the version in pyproject.toml
- Commit the change with a release message
- Create a git tag for the version (e.g., v1.0.1)
- Push the commit and tag to GitHub
3. The GitHub Actions workflow will automatically:
- Detect the new tag
- Build the package
- Run tests
- Publish the package to PyPI
Note: The release workflow only runs on tagged releases (not on pushes to the main branch).
Raw data
{
"_id": null,
"home_page": "https://github.com/test-zeus-ai/testzeus-sdk",
"name": "testzeus-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": null,
"author": "Shriyansh Agnihotri",
"author_email": "shriyansh@testzeus.com",
"download_url": "https://files.pythonhosted.org/packages/3e/28/a2e6df9cf192e29fc0daf23813ffe0d104c497d87a1028630501a5076f26/testzeus_sdk-0.0.13.tar.gz",
"platform": null,
"description": "# TestZeus SDK\n\nPython SDK for the TestZeus testing platform.\n\n## Installation\n\nInstall the package using pip:\n\n```bash\npip install testzeus-sdk\n```\n\nOr use Poetry:\n\n```bash\npoetry add testzeus-sdk\n```\n\n## Components\n\n### Python SDK\nThe TestZeus SDK provides programmatic access to the TestZeus testing platform through a Python interface.\n\n### Command Line Interface (CLI)\nThe TestZeus CLI provides a command-line interface for interacting with the TestZeus platform. For detailed CLI documentation, see the [CLI README](testzeus-cli/README.md).\n\n```bash\n# Install CLI\npip install testzeus-cli\n\n# Login to TestZeus\ntestzeus login\n\n# List tests\ntestzeus tests list\n```\n\n## Getting Started with SDK\n\n```python\nimport asyncio\nfrom testzeus_sdk import TestZeusClient\n\nasync def main():\n # Create a client with email/password\n client = TestZeusClient(email=\"your-email\", password=\"your-password\")\n \n # Use as a context manager\n async with client:\n # Your code here\n pass\n\n# Run the example\nasyncio.run(main())\n```\n\n## Authentication\n\nThe SDK supports three authentication methods:\n\n### Email/Password\n\n```python\nclient = TestZeusClient(email=\"your-email\", password=\"your-password\")\n```\n\n### Environment Variables\n\n```\nexport TESTZEUS_EMAIL=\"your-email\"\nexport TESTZEUS_PASSWORD=\"your-password\"\n```\n\nThen create the client without parameters:\n\n```python\nclient = TestZeusClient()\n```\n\n## Core Functionality\n\n### Tests Management\n\n#### List Tests\n```python\n# Get list of tests with filters and sorting\ntests = await client.tests.get_list(\n expand='tags', # Expand related entities\n sort='id', # Sort by field\n filters={ # Filter results\n 'id': 'y9b88f17vabx476'\n }\n)\nprint(tests)\nprint(tests['items'][0].data) # Access test data\n```\n\n#### Advanced Filtering\n\nThe SDK supports powerful filtering capabilities using PocketBase filter syntax. All managers that extend `BaseManager` support these filtering options:\n\n##### Simple Filters (Backward Compatible)\n```python\n# Basic field matching\nfilters = {\n \"name\": \"Test Name\",\n \"status\": \"active\",\n \"priority\": 5\n}\n\n# List values (OR condition)\nfilters = {\n \"status\": [\"active\", \"pending\", \"draft\"] # status = \"active\" OR status = \"pending\" OR status = \"draft\"\n}\n```\n\n##### Advanced Operators\n```python\n# Use complex operators with value objects\nfilters = {\n \"created\": {\"operator\": \">\", \"value\": \"2023-01-01\"}, # created > \"2023-01-01\"\n \"priority\": {\"operator\": \">=\", \"value\": 3}, # priority >= 3\n \"name\": {\"operator\": \"~\", \"value\": \"test\"}, # name LIKE \"%test%\"\n \"description\": {\"operator\": \"!~\", \"value\": \"old\"} # description NOT LIKE \"%old%\"\n}\n```\n\n##### Supported Operators\n\n**Comparison Operators:**\n- `=` - Equal (default when no operator specified)\n- `!=` - Not equal\n- `>` - Greater than\n- `>=` - Greater than or equal\n- `<` - Less than\n- `<=` - Less than or equal\n\n**String Operators:**\n- `~` - Like/Contains (auto-wraps with % for wildcard matching)\n- `!~` - Not Like/Contains\n\n**Array Operators (for multi-value fields):**\n- `?=` - Any/At least one equal\n- `?!=` - Any/At least one not equal\n- `?>` - Any/At least one greater than\n- `?>=` - Any/At least one greater than or equal\n- `?<` - Any/At least one less than\n- `?<=` - Any/At least one less than or equal\n- `?~` - Any/At least one like/contains\n- `?!~` - Any/At least one not like/contains\n\n##### Array Operators with Lists\n```python\n# Check if any tag matches the values\nfilters = {\n \"tags\": {\"operator\": \"?=\", \"value\": [\"urgent\", \"important\"]}\n}\n# Result: (tags ?= \"urgent\" || tags ?= \"important\")\n```\n\n##### Logical Grouping\n\n**AND Conditions:**\n```python\nfilters = {\n \"$and\": [\n {\"status\": \"active\"},\n {\"priority\": {\"operator\": \">\", \"value\": 3}},\n {\"created\": {\"operator\": \">\", \"value\": \"2023-01-01\"}}\n ]\n}\n# Result: (status = \"active\" && priority > 3 && created > \"2023-01-01\")\n```\n\n**OR Conditions:**\n```python\nfilters = {\n \"$or\": [\n {\"status\": \"urgent\"},\n {\"priority\": {\"operator\": \">=\", \"value\": 8}}\n ]\n}\n# Result: (status = \"urgent\" || priority >= 8)\n```\n\n**Complex Combinations:**\n```python\nfilters = {\n \"tenant\": \"abc123\", # Always filter by current tenant\n \"$or\": [\n {\"status\": \"active\"},\n {\n \"$and\": [\n {\"status\": \"draft\"},\n {\"modified\": {\"operator\": \">\", \"value\": \"2023-01-01\"}},\n {\"tags\": {\"operator\": \"?=\", \"value\": [\"review\", \"pending\"]}}\n ]\n }\n ]\n}\n# Result: tenant = \"abc123\" && (status = \"active\" || (status = \"draft\" && modified > \"2023-01-01\" && (tags ?= \"review\" || tags ?= \"pending\")))\n```\n\n##### Practical Examples\n\n**Filter tests by date range:**\n```python\ntests = await client.tests.get_list(\n filters={\n \"$and\": [\n {\"created\": {\"operator\": \">=\", \"value\": \"2023-01-01\"}},\n {\"created\": {\"operator\": \"<\", \"value\": \"2023-12-31\"}}\n ]\n }\n)\n```\n\n**Filter by multiple statuses and search in name:**\n```python\ntests = await client.tests.get_list(\n filters={\n \"status\": [\"active\", \"pending\"],\n \"name\": {\"operator\": \"~\", \"value\": \"integration\"}\n }\n)\n```\n\n**Filter test runs by status and date:**\n```python\ntest_runs = await client.test_runs.get_list(\n filters={\n \"$and\": [\n {\"status\": {\"operator\": \"!=\", \"value\": \"draft\"}},\n {\"start_time\": {\"operator\": \">\", \"value\": \"2023-01-01T00:00:00Z\"}}\n ]\n },\n sort=\"-created\" # Sort by created date descending\n)\n```\n\n**Filter environments by tags:**\n```python\nenvironments = await client.environments.get_list(\n filters={\n \"tags\": {\"operator\": \"?=\", \"value\": [\"production\", \"staging\"]}\n }\n)\n```\n\n#### Get Single Test\n```python\n# Get test by ID\ntest = await client.tests.get_one('311137kown88nd6')\nprint(test.data)\n```\n\n#### Create Test\n```python\n# Create a new test\nnew_test = await client.tests.create(\n name=\"New Test\",\n test_feature=\"Example feature\",\n status=\"draft\", # Optional: 'draft', 'ready', 'deleted'\n test_data=[\"data_id1\", \"data_id2\"], # Optional: List of test data IDs\n tags=[\"tag1\", \"tag2\"], # Optional: List of tag IDs\n environment=\"env_id\" # Optional: Environment ID\n)\n```\n\n#### Update Test\n```python\n# Update test properties\nupdated_test = await client.tests.update(\n 'test_id',\n name='Updated Test Name'\n)\nprint(updated_test.data)\n```\n\n#### Delete Test\n```python\n# Delete a test\nawait client.tests.delete('test_id')\n```\n\n### Test Runs Management\n\n#### Create and Start Test Run\n```python\n# Create and start a test run\ntest_run = await client.test_runs.create_and_start(\n name=\"Test Run Name\",\n test=\"Test Name or ID\"\n)\nprint(test_run.data)\n```\n\n#### Track Test Run Status\n```python\n# Get test run by ID\ntest_run = await client.test_runs.get_one('test_run_id')\n\n# Check test run status\nif test_run.is_running():\n print(\"Test is currently running\")\nelif test_run.is_completed():\n print(\"Test has completed successfully\")\nelif test_run.is_failed():\n print(\"Test has failed\")\nelif test_run.is_crashed():\n print(\"Test has crashed\")\nelif test_run.is_cancelled():\n print(\"Test was cancelled\")\nelif test_run.is_pending():\n print(\"Test is pending\")\n\n# Get test run duration\nduration = test_run.get_duration()\nif duration:\n print(f\"Test run took {duration} seconds\")\n```\n\n#### Get Detailed Test Run Information\n```python\n# Get expanded test run details including all outputs, steps, and attachments\nexpanded_test_run = await client.test_runs.get_expanded('test_run_id')\n\n# Access different components of the test run\ntest_run_data = expanded_test_run['test_run']\ntest_run_dashs = expanded_test_run['test_run_dashs']\ntest_run_dash_outputs = expanded_test_run['test_run_dash_outputs']\ntest_run_dash_output_steps = expanded_test_run['test_run_dash_output_steps']\ntest_run_dash_outputs_attachments = expanded_test_run['test_run_dash_outputs_attachments']\n\n# Print test run details\nprint(f\"Test Run Name: {test_run_data['name']}\")\nprint(f\"Status: {test_run_data['status']}\")\nprint(f\"Start Time: {test_run_data['start_time']}\")\nprint(f\"End Time: {test_run_data['end_time']}\")\n\n# Print test run steps\nfor step in test_run_dash_output_steps:\n print(f\"Step: {step['name']}\")\n print(f\"Status: {step['status']}\")\n print(f\"Is Passed: {step['is_passed']}\")\n print(f\"Assert Summary: {step['assert_summary']}\")\n```\n\n#### Cancel Test Run\n```python\n# Cancel a running test\ntry:\n cancelled_test = await client.test_runs.cancel('test_run_id')\n print(f\"Test run cancelled: {cancelled_test.status}\")\nexcept ValueError as e:\n print(f\"Cannot cancel test: {str(e)}\")\n```\n\n#### Download Test Run Attachments\n```python\n# Download all attachments for a test run\ndownload_attachment = await client.test_runs.download_all_attachments(\n 'test_run_id',\n 'local/path/to/save'\n)\n\n# Download specific attachment\nattachment = await client.test_run_dash_outputs_attachments.download_attachment(\n 'attachment_id',\n 'local/path/to/save'\n)\n```\n\n#### Monitor Test Run Progress\n```python\nimport asyncio\nimport time\n\nasync def monitor_test_run(test_run_id: str, check_interval: int = 5):\n \"\"\"\n Monitor a test run's progress until completion\n \n Args:\n test_run_id: ID of the test run to monitor\n check_interval: Time between status checks in seconds\n \"\"\"\n while True:\n test_run = await client.test_runs.get_one(test_run_id)\n \n if test_run.is_completed():\n print(\"Test run completed successfully!\")\n break\n elif test_run.is_failed():\n print(\"Test run failed!\")\n break\n elif test_run.is_crashed():\n print(\"Test run crashed!\")\n break\n elif test_run.is_cancelled():\n print(\"Test run was cancelled!\")\n break\n \n print(f\"Test run status: {test_run.status}\")\n await asyncio.sleep(check_interval)\n\n# Usage\nawait monitor_test_run('test_run_id')\n```\n\n### Test Data Management\n\n```python\n# Create test data\ntest_data = await client.test_data.create({\n \"name\": \"Test Data\",\n \"type\": \"test\", # Optional: defaults to \"test\"\n \"status\": \"draft\" # Optional: defaults to \"draft\"\n})\n```\n\n### Environment Management\n\n```python\n# List environments\nenvironments = await client.environments.get_list()\n\n# Get environment by ID\nenvironment = await client.environments.get_one('env_id')\n```\n\n### Tags Management\n\n```python\n# List tags\ntags = await client.tags.get_list()\n\n# Create tag\ntag = await client.tags.create({\n \"name\": \"New Tag\"\n})\n```\n\n## Available Managers\n\nThe SDK provides managers for all TestZeus collections:\n\n- `client.tests` - Tests\n- `client.test_runs` - Test Runs\n- `client.test_run_dashs` - Test Run Dashboards\n- `client.test_data` - Test Data\n- `client.environments` - Environments\n- `client.tags` - Tags\n- `client.agent_configs` - Agent Configurations\n- `client.test_devices` - Test Devices\n- `client.test_designs` - Test Designs\n- `client.test_run_dash_outputs` - Test Run Dashboard Outputs\n- `client.test_run_dash_output_steps` - Test Run Dashboard Output Steps\n- `client.tenant_consumption` - Tenant Consumption\n- `client.tenant_consumption_logs` - Tenant Consumption Logs\n\n## Contributing\n\n1. Clone the repository\n2. Install dependencies with Poetry: `poetry install`\n3. Run tests: `poetry run pytest`\n\n## License\n\nMIT\n\n## Release Process\n\nThis project uses automated releases through GitHub Actions. The process is:\n\n1. To create a new release, use one of the following make commands:\n ```bash\n # Interactive version bump (will prompt for version type)\n make release\n\n # Specific version bumps\n make release-patch # Increments the patch version (e.g., 1.0.0 -> 1.0.1)\n make release-minor # Increments the minor version (e.g., 1.0.0 -> 1.1.0)\n make release-major # Increments the major version (e.g., 1.0.0 -> 2.0.0)\n make release-custom # Set a custom version (will prompt for version)\n ```\n\n2. The command will:\n - Update the version in pyproject.toml\n - Commit the change with a release message\n - Create a git tag for the version (e.g., v1.0.1)\n - Push the commit and tag to GitHub\n\n3. The GitHub Actions workflow will automatically:\n - Detect the new tag\n - Build the package\n - Run tests\n - Publish the package to PyPI\n\nNote: The release workflow only runs on tagged releases (not on pushes to the main branch).\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python SDK for TestZeus testing platform",
"version": "0.0.13",
"project_urls": {
"Homepage": "https://github.com/test-zeus-ai/testzeus-sdk",
"Repository": "https://github.com/test-zeus-ai/testzeus-sdk"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "9032518f7a3ba1c76f1abb0278ef5a4a0ef43fbcb02121bfc020851ddfe2903b",
"md5": "7b838503b79249a79c12d85b3ef42ffb",
"sha256": "ed9f8146f2a417c314297e213f1fe4190bf51ae678a93d0976e571ddfa99d2a2"
},
"downloads": -1,
"filename": "testzeus_sdk-0.0.13-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7b838503b79249a79c12d85b3ef42ffb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 68151,
"upload_time": "2025-07-14T09:57:45",
"upload_time_iso_8601": "2025-07-14T09:57:45.615830Z",
"url": "https://files.pythonhosted.org/packages/90/32/518f7a3ba1c76f1abb0278ef5a4a0ef43fbcb02121bfc020851ddfe2903b/testzeus_sdk-0.0.13-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3e28a2e6df9cf192e29fc0daf23813ffe0d104c497d87a1028630501a5076f26",
"md5": "c90441cf4893cbe59f3a4d28da9e7b68",
"sha256": "273c36df0a1e76c3fd3e8cc2f1ad82f40465c3397644cc4eb4c0021eb4585fc8"
},
"downloads": -1,
"filename": "testzeus_sdk-0.0.13.tar.gz",
"has_sig": false,
"md5_digest": "c90441cf4893cbe59f3a4d28da9e7b68",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 38875,
"upload_time": "2025-07-14T09:57:46",
"upload_time_iso_8601": "2025-07-14T09:57:46.575848Z",
"url": "https://files.pythonhosted.org/packages/3e/28/a2e6df9cf192e29fc0daf23813ffe0d104c497d87a1028630501a5076f26/testzeus_sdk-0.0.13.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-14 09:57:46",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "test-zeus-ai",
"github_project": "testzeus-sdk",
"github_not_found": true,
"lcname": "testzeus-sdk"
}