testzeus-sdk


Nametestzeus-sdk JSON
Version 0.0.13 PyPI version JSON
download
home_pagehttps://github.com/test-zeus-ai/testzeus-sdk
SummaryPython SDK for TestZeus testing platform
upload_time2025-07-14 09:57:46
maintainerNone
docs_urlNone
authorShriyansh Agnihotri
requires_python>=3.11
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.43605s