# XrayClient
A comprehensive Python client for interacting with Xray Cloud's GraphQL API for test management in Jira. This library provides a robust interface for managing test plans, test executions, test runs, defects, evidence, and other Xray-related operations through GraphQL queries and mutations.
## 📚 Documentation
- **HTML Documentation**: [View Online](https://github.com/arusatech/xrayclient/tree/main/docs/html)
- **API Reference**: [API Docs](https://github.com/arusatech/xrayclient/tree/main/docs/html/xrayclient.html)
## ✨ Features
- **Jira Integration**: Full Jira REST API support for issue management
- **Xray GraphQL API**: Complete Xray Cloud GraphQL API integration
- **Test Management**: Create and manage test plans, test executions, and test runs
- **Evidence Management**: Add attachments and evidence to test runs
- **Defect Management**: Create defects from failed test runs
- **Authentication**: Secure authentication with both Jira and Xray Cloud
- **Error Handling**: Comprehensive error handling and logging
- **Type Hints**: Full type annotation support for better development experience
- **Table Parsing**: Automatic parsing of tabular data from test plan descriptions
- **File Operations**: Download attachments by extension or name
- **Natural Language Processing**: Generate JSON from natural language sentences
## 🚀 Installation
```bash
pip install xrayclient
```
Or install from source:
```bash
git clone https://github.com/arusatech/xrayclient.git
cd xrayclient
pip install -e .
```
## ⚡ Quick Start
### Basic Setup
```python
from xrayclient.xray_client import XrayGraphQL
# Initialize the client
client = XrayGraphQL()
```
### Environment Variables
Create a `.env` file in your project root with the following variables:
```env
# Jira Configuration
JIRA_SERVER=https://your-instance.atlassian.net
JIRA_USER=your-email@company.com
JIRA_API_KEY=your-jira-api-key
# Xray Cloud Configuration
XRAY_CLIENT_ID=your-xray-client-id
XRAY_CLIENT_SECRET=your-xray-client-secret
XRAY_BASE_URL=https://us.xray.cloud.getxray.app
```
## 📖 Usage Examples
### Test Plan Operations
```python
# Get all tests from a test plan
test_plan_tests = client.get_tests_from_test_plan("TEST-123")
print(test_plan_tests)
# Output: {'TEST-124': '10001', 'TEST-125': '10002'}
# Get test plan data with parsed tables
test_plan_data = client.get_test_plan_data("TEST-123")
print(test_plan_data)
# Output: {'column1': [1, 2, 3], 'column2': [4.5, 6.7, 8.9]}
```
### Test Execution Management
```python
# Create a test execution from a test plan
test_execution = client.create_test_execution_from_test_plan("TEST-123")
print(test_execution)
# Output: {
# 'TEST-124': {
# 'test_run_id': '5f7c3',
# 'test_execution_key': 'TEST-456',
# 'test_plan_key': 'TEST-123'
# }
# }
# Create a test execution with specific tests
test_execution = client.create_test_execution(
test_issue_keys=["TEST-124", "TEST-125"],
project_key="PROJ",
summary="Regression Test Execution",
description="Testing critical features"
)
```
### Test Run Operations
```python
# Get test run status
status, run_id = client.get_test_runstatus("TEST-124", "TEST-456")
print(f"Status: {status}, Run ID: {run_id}")
# Update test run status
success = client.update_test_run_status("test_run_id", "PASS")
print(success) # True
# Update test run comment
success = client.update_test_run_comment("test_run_id", "Test passed successfully")
print(success) # True
# Append to existing comment
success = client.append_test_run_comment("test_run_id", "Additional notes")
print(success) # True
```
### Evidence and Defect Management
```python
# Add evidence to a test run
evidence_added = client.add_evidence_to_test_run("test_run_id", "/path/to/screenshot.png")
print(evidence_added) # True
# Create a defect from a failed test run
defect = client.create_defect_from_test_run(
test_run_id="test_run_id",
project_key="PROJ",
parent_issue_key="TEST-456",
defect_summary="Login functionality broken",
defect_description="Users cannot log in with valid credentials"
)
print(defect)
```
### Test Set Operations
```python
# Get tests from a test set
test_set_tests = client.get_tests_from_test_set("TESTSET-123")
print(test_set_tests)
# Filter test sets by test case
test_sets = client.filter_test_set_by_test_case("TEST-124")
print(test_sets)
# Get tags for a test case
tags = client.filter_tags_by_test_case("TEST-124")
print(tags)
```
### Jira Issue Management
```python
# Create a new Jira issue
issue_key, issue_id = client.create_issue(
project_key="PROJ",
summary="New feature implementation",
description="Implement new login flow",
issue_type="Story",
priority="High",
labels=["feature", "login"],
attachments=["/path/to/screenshot.png"]
)
print(f"Created issue {issue_key} with ID {issue_id}")
# Get issue details
issue = client.get_issue("PROJ-123", fields=["summary", "status", "assignee"])
print(f"Issue: {issue['summary']} - Status: {issue['status']['name']}")
# Update issue summary
success = client.update_issue_summary("PROJ-123", "Updated summary")
print(success) # True
```
### Advanced Features
```python
# Download attachments by extension
attachments = client.download_attachment_by_extension("PROJ-123", ".png")
# Download attachments by name
attachments = client.download_attachment_by_name("PROJ-123", "screenshot")
# Generate JSON from natural language
json_data = client.generate_json_from_sentence("Create a test with priority high and assign to john")
print(json_data)
```
## 🔧 API Reference
### JiraHandler Class
The base class providing Jira REST API functionality.
#### Methods
- `create_issue(project_key, summary, description, **kwargs)` - Create a new Jira issue
- `get_issue(issue_key, fields=None)` - Retrieve a Jira issue
- `update_issue_summary(issue_key, new_summary)` - Update issue summary
- `make_jira_request(jira_key, url, method, payload, **kwargs)` - Make custom Jira requests
- `download_jira_attachment_by_id(attachment_id, mime_type)` - Download attachments
### XrayGraphQL Class
Extends JiraHandler to provide Xray Cloud GraphQL API functionality.
#### Authentication & Setup
- `__init__()` - Initialize XrayGraphQL client
- `_get_auth_token()` - Authenticate with Xray Cloud API
- `_make_graphql_request(query, variables)` - Make GraphQL requests
#### Test Plan Operations
- `get_tests_from_test_plan(test_plan)` - Get tests from test plan
- `get_test_plan_data(test_plan)` - Get parsed test plan data
#### Test Set Operations
- `get_tests_from_test_set(test_set)` - Get tests from test set
- `filter_test_set_by_test_case(test_key)` - Filter test sets by test case
- `filter_tags_by_test_case(test_key)` - Get tags for test case
#### Test Execution Operations
- `get_tests_from_test_execution(test_execution)` - Get tests from test execution
- `get_test_execution(test_execution)` - Get detailed test execution info
- `create_test_execution(test_issue_keys, project_key, summary, description)` - Create test execution
- `create_test_execution_from_test_plan(test_plan)` - Create test execution from plan
- `add_test_execution_to_test_plan(test_plan, test_execution)` - Add execution to plan
#### Test Run Operations
- `get_test_runstatus(test_case, test_execution)` - Get test run status
- `get_test_run_by_id(test_case_id, test_execution_id)` - Get test run by ID
- `update_test_run_status(test_run_id, test_run_status)` - Update test run status
- `update_test_run_comment(test_run_id, test_run_comment)` - Update test run comment
- `get_test_run_comment(test_run_id)` - Get test run comment
- `append_test_run_comment(test_run_id, test_run_comment)` - Append to comment
#### Evidence & Defect Management
- `add_evidence_to_test_run(test_run_id, evidence_path)` - Add evidence
- `create_defect_from_test_run(test_run_id, project_key, parent_issue_key, defect_summary, defect_description)` - Create defect
#### File Operations
- `download_attachment_by_extension(issue_key, extension)` - Download attachments by file extension
- `download_attachment_by_name(issue_key, filename)` - Download attachments by filename
#### Natural Language Processing
- `generate_json_from_sentence(sentence)` - Generate JSON from natural language
## 📋 Requirements
- Python >= 3.12
- jira >= 3.10.5, < 4.0.0
- jsonpath-nz >= 1.0.6, < 2.0.0
- requests >= 2.31.0, < 3.0.0
- spacy >= 3.8.7, < 4.0.0
## 🛠️ Development
### Setup Development Environment
```bash
git clone https://github.com/arusatech/xrayclient.git
cd xrayclient
pip install -e ".[dev]"
```
### Running Tests
```bash
# Run all tests
pytest
# Run with coverage
pytest --cov=xrayclient --cov-report=html
# Run specific test categories
pytest -m unit
pytest -m integration
pytest -m slow
```
### Code Quality
The project uses:
- **pytest** for testing
- **pytest-cov** for coverage reporting
- **pytest-mock** for mocking in tests
- **Type hints** for better code documentation
## 🔒 Error Handling
The library implements comprehensive error handling:
- All methods return `None` for failed operations instead of raising exceptions
- Detailed logging for debugging and error tracking
- Automatic retry logic for transient failures
- Graceful handling of authentication failures
## 🔐 Security
- Uses environment variables for sensitive configuration
- Supports API key authentication for both Jira and Xray
- Implements proper token management and refresh
- Handles secure file uploads for evidence
## 🤝 Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests for new functionality
5. Ensure all tests pass
6. Submit a pull request
## 📄 License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## 🆘 Support
For support and questions:
- Create an issue on GitHub
- Contact: yakub@arusatech.com
## 📝 Changelog
### Version 0.1.5
- Added spacy dependency for natural language processing
- Enhanced table parsing capabilities
- Improved error handling and logging
- Added file download operations
- Enhanced documentation
### Version 0.1.2
- Initial release
- Jira REST API integration
- Xray Cloud GraphQL API integration
- Complete test management functionality
- Evidence and defect management
- Comprehensive error handling and logging
Raw data
{
"_id": null,
"home_page": "https://github.com/arusatech/xrayclient",
"name": "xrayclient",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.12",
"maintainer_email": null,
"keywords": "xray, jira, test-management, graphql, api-client",
"author": "AR USA LLC",
"author_email": "arusa@arusatech.com",
"download_url": "https://files.pythonhosted.org/packages/36/ac/c22cb4c0b538c1eb01143233bcf0bdcbc97522ca785872a1315301b66fff/xrayclient-0.1.8.tar.gz",
"platform": null,
"description": "# XrayClient\n\nA comprehensive Python client for interacting with Xray Cloud's GraphQL API for test management in Jira. This library provides a robust interface for managing test plans, test executions, test runs, defects, evidence, and other Xray-related operations through GraphQL queries and mutations.\n\n## \ud83d\udcda Documentation\n\n- **HTML Documentation**: [View Online](https://github.com/arusatech/xrayclient/tree/main/docs/html)\n- **API Reference**: [API Docs](https://github.com/arusatech/xrayclient/tree/main/docs/html/xrayclient.html)\n\n## \u2728 Features\n\n- **Jira Integration**: Full Jira REST API support for issue management\n- **Xray GraphQL API**: Complete Xray Cloud GraphQL API integration\n- **Test Management**: Create and manage test plans, test executions, and test runs\n- **Evidence Management**: Add attachments and evidence to test runs\n- **Defect Management**: Create defects from failed test runs\n- **Authentication**: Secure authentication with both Jira and Xray Cloud\n- **Error Handling**: Comprehensive error handling and logging\n- **Type Hints**: Full type annotation support for better development experience\n- **Table Parsing**: Automatic parsing of tabular data from test plan descriptions\n- **File Operations**: Download attachments by extension or name\n- **Natural Language Processing**: Generate JSON from natural language sentences\n\n## \ud83d\ude80 Installation\n\n```bash\npip install xrayclient\n```\n\nOr install from source:\n\n```bash\ngit clone https://github.com/arusatech/xrayclient.git\ncd xrayclient\npip install -e .\n```\n\n## \u26a1 Quick Start\n\n### Basic Setup\n\n```python\nfrom xrayclient.xray_client import XrayGraphQL\n\n# Initialize the client\nclient = XrayGraphQL()\n```\n\n### Environment Variables\n\nCreate a `.env` file in your project root with the following variables:\n\n```env\n# Jira Configuration\nJIRA_SERVER=https://your-instance.atlassian.net\nJIRA_USER=your-email@company.com\nJIRA_API_KEY=your-jira-api-key\n\n# Xray Cloud Configuration\nXRAY_CLIENT_ID=your-xray-client-id\nXRAY_CLIENT_SECRET=your-xray-client-secret\nXRAY_BASE_URL=https://us.xray.cloud.getxray.app\n```\n\n## \ud83d\udcd6 Usage Examples\n\n### Test Plan Operations\n\n```python\n# Get all tests from a test plan\ntest_plan_tests = client.get_tests_from_test_plan(\"TEST-123\")\nprint(test_plan_tests)\n# Output: {'TEST-124': '10001', 'TEST-125': '10002'}\n\n# Get test plan data with parsed tables\ntest_plan_data = client.get_test_plan_data(\"TEST-123\")\nprint(test_plan_data)\n# Output: {'column1': [1, 2, 3], 'column2': [4.5, 6.7, 8.9]}\n```\n\n### Test Execution Management\n\n```python\n# Create a test execution from a test plan\ntest_execution = client.create_test_execution_from_test_plan(\"TEST-123\")\nprint(test_execution)\n# Output: {\n# 'TEST-124': {\n# 'test_run_id': '5f7c3',\n# 'test_execution_key': 'TEST-456',\n# 'test_plan_key': 'TEST-123'\n# }\n# }\n\n# Create a test execution with specific tests\ntest_execution = client.create_test_execution(\n test_issue_keys=[\"TEST-124\", \"TEST-125\"],\n project_key=\"PROJ\",\n summary=\"Regression Test Execution\",\n description=\"Testing critical features\"\n)\n```\n\n### Test Run Operations\n\n```python\n# Get test run status\nstatus, run_id = client.get_test_runstatus(\"TEST-124\", \"TEST-456\")\nprint(f\"Status: {status}, Run ID: {run_id}\")\n\n# Update test run status\nsuccess = client.update_test_run_status(\"test_run_id\", \"PASS\")\nprint(success) # True\n\n# Update test run comment\nsuccess = client.update_test_run_comment(\"test_run_id\", \"Test passed successfully\")\nprint(success) # True\n\n# Append to existing comment\nsuccess = client.append_test_run_comment(\"test_run_id\", \"Additional notes\")\nprint(success) # True\n```\n\n### Evidence and Defect Management\n\n```python\n# Add evidence to a test run\nevidence_added = client.add_evidence_to_test_run(\"test_run_id\", \"/path/to/screenshot.png\")\nprint(evidence_added) # True\n\n# Create a defect from a failed test run\ndefect = client.create_defect_from_test_run(\n test_run_id=\"test_run_id\",\n project_key=\"PROJ\",\n parent_issue_key=\"TEST-456\",\n defect_summary=\"Login functionality broken\",\n defect_description=\"Users cannot log in with valid credentials\"\n)\nprint(defect)\n```\n\n### Test Set Operations\n\n```python\n# Get tests from a test set\ntest_set_tests = client.get_tests_from_test_set(\"TESTSET-123\")\nprint(test_set_tests)\n\n# Filter test sets by test case\ntest_sets = client.filter_test_set_by_test_case(\"TEST-124\")\nprint(test_sets)\n\n# Get tags for a test case\ntags = client.filter_tags_by_test_case(\"TEST-124\")\nprint(tags)\n```\n\n### Jira Issue Management\n\n```python\n# Create a new Jira issue\nissue_key, issue_id = client.create_issue(\n project_key=\"PROJ\",\n summary=\"New feature implementation\",\n description=\"Implement new login flow\",\n issue_type=\"Story\",\n priority=\"High\",\n labels=[\"feature\", \"login\"],\n attachments=[\"/path/to/screenshot.png\"]\n)\nprint(f\"Created issue {issue_key} with ID {issue_id}\")\n\n# Get issue details\nissue = client.get_issue(\"PROJ-123\", fields=[\"summary\", \"status\", \"assignee\"])\nprint(f\"Issue: {issue['summary']} - Status: {issue['status']['name']}\")\n\n# Update issue summary\nsuccess = client.update_issue_summary(\"PROJ-123\", \"Updated summary\")\nprint(success) # True\n```\n\n### Advanced Features\n\n```python\n# Download attachments by extension\nattachments = client.download_attachment_by_extension(\"PROJ-123\", \".png\")\n\n# Download attachments by name\nattachments = client.download_attachment_by_name(\"PROJ-123\", \"screenshot\")\n\n# Generate JSON from natural language\njson_data = client.generate_json_from_sentence(\"Create a test with priority high and assign to john\")\nprint(json_data)\n```\n\n## \ud83d\udd27 API Reference\n\n### JiraHandler Class\n\nThe base class providing Jira REST API functionality.\n\n#### Methods\n\n- `create_issue(project_key, summary, description, **kwargs)` - Create a new Jira issue\n- `get_issue(issue_key, fields=None)` - Retrieve a Jira issue\n- `update_issue_summary(issue_key, new_summary)` - Update issue summary\n- `make_jira_request(jira_key, url, method, payload, **kwargs)` - Make custom Jira requests\n- `download_jira_attachment_by_id(attachment_id, mime_type)` - Download attachments\n\n### XrayGraphQL Class\n\nExtends JiraHandler to provide Xray Cloud GraphQL API functionality.\n\n#### Authentication & Setup\n- `__init__()` - Initialize XrayGraphQL client\n- `_get_auth_token()` - Authenticate with Xray Cloud API\n- `_make_graphql_request(query, variables)` - Make GraphQL requests\n\n#### Test Plan Operations\n- `get_tests_from_test_plan(test_plan)` - Get tests from test plan\n- `get_test_plan_data(test_plan)` - Get parsed test plan data\n\n#### Test Set Operations\n- `get_tests_from_test_set(test_set)` - Get tests from test set\n- `filter_test_set_by_test_case(test_key)` - Filter test sets by test case\n- `filter_tags_by_test_case(test_key)` - Get tags for test case\n\n#### Test Execution Operations\n- `get_tests_from_test_execution(test_execution)` - Get tests from test execution\n- `get_test_execution(test_execution)` - Get detailed test execution info\n- `create_test_execution(test_issue_keys, project_key, summary, description)` - Create test execution\n- `create_test_execution_from_test_plan(test_plan)` - Create test execution from plan\n- `add_test_execution_to_test_plan(test_plan, test_execution)` - Add execution to plan\n\n#### Test Run Operations\n- `get_test_runstatus(test_case, test_execution)` - Get test run status\n- `get_test_run_by_id(test_case_id, test_execution_id)` - Get test run by ID\n- `update_test_run_status(test_run_id, test_run_status)` - Update test run status\n- `update_test_run_comment(test_run_id, test_run_comment)` - Update test run comment\n- `get_test_run_comment(test_run_id)` - Get test run comment\n- `append_test_run_comment(test_run_id, test_run_comment)` - Append to comment\n\n#### Evidence & Defect Management\n- `add_evidence_to_test_run(test_run_id, evidence_path)` - Add evidence\n- `create_defect_from_test_run(test_run_id, project_key, parent_issue_key, defect_summary, defect_description)` - Create defect\n\n#### File Operations\n- `download_attachment_by_extension(issue_key, extension)` - Download attachments by file extension\n- `download_attachment_by_name(issue_key, filename)` - Download attachments by filename\n\n#### Natural Language Processing\n- `generate_json_from_sentence(sentence)` - Generate JSON from natural language\n\n## \ud83d\udccb Requirements\n\n- Python >= 3.12\n- jira >= 3.10.5, < 4.0.0\n- jsonpath-nz >= 1.0.6, < 2.0.0\n- requests >= 2.31.0, < 3.0.0\n- spacy >= 3.8.7, < 4.0.0\n\n## \ud83d\udee0\ufe0f Development\n\n### Setup Development Environment\n\n```bash\ngit clone https://github.com/arusatech/xrayclient.git\ncd xrayclient\npip install -e \".[dev]\"\n```\n\n### Running Tests\n\n```bash\n# Run all tests\npytest\n\n# Run with coverage\npytest --cov=xrayclient --cov-report=html\n\n# Run specific test categories\npytest -m unit\npytest -m integration\npytest -m slow\n```\n\n### Code Quality\n\nThe project uses:\n- **pytest** for testing\n- **pytest-cov** for coverage reporting\n- **pytest-mock** for mocking in tests\n- **Type hints** for better code documentation\n\n## \ud83d\udd12 Error Handling\n\nThe library implements comprehensive error handling:\n\n- All methods return `None` for failed operations instead of raising exceptions\n- Detailed logging for debugging and error tracking\n- Automatic retry logic for transient failures\n- Graceful handling of authentication failures\n\n## \ud83d\udd10 Security\n\n- Uses environment variables for sensitive configuration\n- Supports API key authentication for both Jira and Xray\n- Implements proper token management and refresh\n- Handles secure file uploads for evidence\n\n## \ud83e\udd1d Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests for new functionality\n5. Ensure all tests pass\n6. Submit a pull request\n\n## \ud83d\udcc4 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## \ud83c\udd98 Support\n\nFor support and questions:\n- Create an issue on GitHub\n- Contact: yakub@arusatech.com\n\n## \ud83d\udcdd Changelog\n\n### Version 0.1.5\n- Added spacy dependency for natural language processing\n- Enhanced table parsing capabilities\n- Improved error handling and logging\n- Added file download operations\n- Enhanced documentation\n\n### Version 0.1.2\n- Initial release\n- Jira REST API integration\n- Xray Cloud GraphQL API integration\n- Complete test management functionality\n- Evidence and defect management\n- Comprehensive error handling and logging\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python Client for Xray Test Management for Jira",
"version": "0.1.8",
"project_urls": {
"Documentation": "https://github.com/arusatech/xrayclient/tree/main/docs/html",
"Homepage": "https://github.com/arusatech/xrayclient",
"Repository": "https://github.com/arusatech/xrayclient"
},
"split_keywords": [
"xray",
" jira",
" test-management",
" graphql",
" api-client"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "e1ae9b1eea64b73236bf630a101c876b738789f1e0ceda0a213410f357e532b0",
"md5": "bf27a84e176708782661ac070c5a4e41",
"sha256": "d98b53bea557c40b28893a063e722fca14e0a3b7e26d154088e4294a669ef622"
},
"downloads": -1,
"filename": "xrayclient-0.1.8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bf27a84e176708782661ac070c5a4e41",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.14,>=3.12",
"size": 407286,
"upload_time": "2025-08-21T13:42:29",
"upload_time_iso_8601": "2025-08-21T13:42:29.398793Z",
"url": "https://files.pythonhosted.org/packages/e1/ae/9b1eea64b73236bf630a101c876b738789f1e0ceda0a213410f357e532b0/xrayclient-0.1.8-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "36acc22cb4c0b538c1eb01143233bcf0bdcbc97522ca785872a1315301b66fff",
"md5": "455d39cd43e22b7ba5f859d8ac027ac1",
"sha256": "f8d837fd00d88cf07f79963f5a4847cb057b0bf0248d8ebd81bb3a6761a7703f"
},
"downloads": -1,
"filename": "xrayclient-0.1.8.tar.gz",
"has_sig": false,
"md5_digest": "455d39cd43e22b7ba5f859d8ac027ac1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.12",
"size": 382742,
"upload_time": "2025-08-21T13:42:31",
"upload_time_iso_8601": "2025-08-21T13:42:31.218655Z",
"url": "https://files.pythonhosted.org/packages/36/ac/c22cb4c0b538c1eb01143233bcf0bdcbc97522ca785872a1315301b66fff/xrayclient-0.1.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-21 13:42:31",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "arusatech",
"github_project": "xrayclient",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "xrayclient"
}