Metadata-Version: 2.4
Name: pysdccc
Version: 0.1.0
Summary: Python wrapper for SDCcc test tool
Project-URL: Homepage, https://github.com/Draegerwerk/pysdccc
Project-URL: Bug Tracker, https://github.com/Draegerwerk/pysdccc/issues
Project-URL: Changelog, https://github.com/Draegerwerk/pysdccc/blob/main/CHANGELOG.md
Project-URL: Repository, https://github.com/Draegerwerk/pysdccc.git
Author-email: Leon Budnick <leon.budnick@draeger.com>
License: MIT License
        
        Copyright (c) 2024 Dräger
        
        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.
License-File: LICENSE
Keywords: SDCcc,sdc,test,wrapper
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Requires-Python: <3.14,>=3.11
Requires-Dist: anyio>=4.7.0
Requires-Dist: httpx>=0.28.0
Requires-Dist: junitparser>=3.1.2
Provides-Extra: cli
Requires-Dist: click>=8.0; extra == 'cli'
Description-Content-Type: text/markdown

# pysdccc

This python packages provides a convenient way to execute the [SDCcc test suite](https://github.com/Draegerwerk/sdccc/).

This wrapper is only compatible with SDCcc versions later than [internal-baseline-001](https://github.com/Draegerwerk/SDCcc/releases/tag/internal-baseline-001).

## Installation

Download from pypi using `pip install pysdccc`. There is also an option to use this via the command line by installing `pysdccc[cli]`.

### Development

For this open source project the [Contributor License Agreement](Contributor_License_Agreement.md) governs all relevant activities and your contributions. By contributing to the project you agree to be bound by this Agreement and to licence your work accordingly.

1. clone the repository
2. install dependencies, e.g. with [`uv sync --dev --all-extras`](https://docs.astral.sh/uv/reference/cli/#uv-sync)

## Usage

### Quick start

```python
import pathlib
import subprocess

import pysdccc


def main():
    if not pysdccc.is_downloaded("my-specific-version"):
        pysdccc.download("https://url/to/sdccc.zip")

    runner = pysdccc.SdcccRunner(
        pathlib.Path("/path/to/sdccc/result/directory"),
    )

    try:
        # https://github.com/Draegerwerk/SDCcc/?tab=readme-ov-file#exit-codes
        return_code, direct_result, invariant_result = runner.run(
            config=pathlib.Path("/path/to/configuration/file.toml"),
            requirements=pathlib.Path("/path/to/requirements/file.toml"),
        )
    except subprocess.TimeoutExpired:
        print("Timeout occurred")
        return

    if direct_result is None or invariant_result is None:
        print("No result file available")
        return

    for test_case in direct_result + invariant_result:
        print(f"{test_case.name}: {test_case.is_passed}")
```
If you look for an async version

```python
import pathlib

import pysdccc


async def main():
    if not await pysdccc.ais_downloaded("my-specific-version"):
        await pysdccc.adownload("https://url/to/sdccc.zip")

    runner = pysdccc.SdcccRunnerAsync(
        pathlib.Path("/path/to/sdccc/result/directory"),
    )

    # https://github.com/Draegerwerk/SDCcc/?tab=readme-ov-file#exit-codes
    return_code, direct_result, invariant_result = await runner.run(
        config=pathlib.Path("/path/to/configuration/file.toml"),
        requirements=pathlib.Path("/path/to/requirements/file.toml"),
    )

    # checkout example from above ...
```

### Download an SDCcc executable

Check out `pysdccc.download` or `pysdccc.adownload`. If the command line interface of `pysdccc` is installed, the zipped source of SDCcc can be installed using this command: `pysdccc install https://url/to/sdccc.zip`

### Create configuration file

Configure the test consumer. Check the [test consumer configuration](https://github.com/Draegerwerk/SDCcc/?tab=readme-ov-file#test-consumer-configuration) for more information.

```python
import pathlib

import toml  # has to be installed by the user

import pysdccc

config = {
    'SDCcc': {
        ...  # add all relevant config parameter
    }
}
config_path = pathlib.Path('/path/to/configuration/file.toml')
config_path.write_text(toml.dumps(config))

runner = pysdccc.SdcccRunner(
    pathlib.Path('/path/to/sdccc/result/directory'),
)

runner.run(
    config=config_path,
    requirements=pathlib.Path('/path/to/requirements/file.toml'),
)

# or if you have already downloaded SDCcc
config = runner.get_config()  # load default configuration
config['SDCcc']['Consumer']['DeviceEpr'] = "urn:uuid:12345678-1234-1234-1234-123456789012"  # e.g. change device epr
# save and run as above
```

### Create requirements file

Enable or disable specific requirements. Check the [test requirements](https://github.com/Draegerwerk/SDCcc/?tab=readme-ov-file#enabling-tests) for more information.

```python
import pathlib

import toml  # has to be installed by the user

import pysdccc

requirements = {
    # the standard name is the key, the requirement from the standard is the value
    'BICEPS': {
        ...  # add all requirements to be tested
    }
}
requirements_path = pathlib.Path('/path/to/requirement/file.toml')
requirements_path.write_text(toml.dumps(requirements))

runner = pysdccc.SdcccRunner(
    pathlib.Path('/path/to/sdccc/result/directory'),
)
# optionally, check whether you did not add a requirement that is not available
runner.check_requirements(requirements_path)
runner.run(
    config=pathlib.Path('/path/to/configuration/file.toml'),
    requirements=requirements_path,
)

# or, if you have already downloaded SDCcc
requirements = runner.get_requirements()  # load default configuration
requirements['BICEPS']['R0033'] = False  # e.g. disable biceps R0033
# save and run as above
```

### Create test parameter configuration

Some tests require individual parameters. Check the [test parameter configuration](https://github.com/Draegerwerk/SDCcc/?tab=readme-ov-file#test-parameter-configuration) for more information.

```python
import pathlib

import toml  # has to be installed by the user

import pysdccc

testparameter_config = {
    'TestParameter': {
        ...
    }
}
testparameter_config_path = pathlib.Path('/path/to/test_parameter/file.toml')
testparameter_config_path.write_text(toml.dumps(testparameter_config))

runner = pysdccc.SdcccRunner(
    pathlib.Path('/path/to/sdccc/result/directory'),
)
runner.run(
    config=pathlib.Path('/path/to/configuration/file.toml'),
    requirements=pathlib.Path('/path/to/requirements/file.toml'),
    testparam=testparameter_config_path,
)

# or, if you have already downloaded SDCcc
testparameter_config = runner.get_test_parameter()  # load default configuration
testparameter_config['TestParameter']['Biceps547TimeInterval'] = 10
# save and run as above
```

### Execute SDCcc from command-line interface (cli)

There exists a cli wrapper for the SDCcc executable. If `pysdccc[cli]` is installed, `sdccc` can be used to execute arbitrary SDCcc commands, e.g. `sdccc --version`. More information can be found [here](https://github.com/draegerwerk/sdccc?tab=readme-ov-file#running-sdccc).

## Notices

`pysdccc` is not intended for use in medical products, clinical trials, clinical studies, or in clinical routine.

### ISO 9001

`pysdccc` was not developed according to ISO 9001.

## License

[MIT](https://choosealicense.com/licenses/mit/)
