{"library":"pyats-reporter","title":"pyATS Reporter","description":"pyATS Reporter is a sub-component of the broader pyATS (Python Automated Test System) ecosystem, specializing in result collection and reporting for network automation tests. The pyATS framework itself is an end-to-end testing solution developed by Cisco Systems Inc., designed for data-driven, reusable, and scalable testing, suitable for Agile development iterations. The library is actively maintained with frequent updates, with the current version being 26.3, and requires Python 3.8 or higher.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install pyats-reporter","pip install pyats[full]"],"cli":null},"imports":["from pyats.reporter import Reporter"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport time\nfrom pyats import aetest\nfrom pyats.topology import loader\n\n# Create a dummy testbed.yaml file for demonstration\nwith open('testbed.yaml', 'w') as f:\n    f.write('''\n# Sample Testbed for pyATS Reporter Quickstart\ntestbed:\n  name: my_testbed\n  credentials:\n    default:\n      username: admin\n      password: ${PYATS_TESTBED_PASSWORD}\n  devices:\n    R1:\n      type: router\n      os: iosxe\n      connections:\n        cli:\n          protocol: ssh\n          ip: 10.1.1.1 # Placeholder IP, replace with a reachable device or mock\n''')\n\n# Create a simple AEtest job file\nwith open('my_test_job.py', 'w') as f:\n    f.write('''\nfrom pyats import aetest\nfrom pyats.topology import loader\n\nclass CommonSetup(aetest.CommonSetup):\n    @aetest.subsection\n    def connect_to_devices(self, testbed):\n        aetest.loop.mark(self.parent.testcases.test_basic_connectivity, device=testbed.devices.values())\n        for device in testbed.devices.values():\n            self.parent.parameters.update(device=device)\n            print(f\"Attempting to connect to {device.name}\")\n            # In a real scenario, this would attempt a connection.\n            # For quickstart, we'll simulate success.\n            # device.connect()\n            print(f\"Simulated connection to {device.name} successful.\")\n\nclass TestBasicConnectivity(aetest.Testcase):\n    @aetest.test\n    def test_ping_loopback(self, device):\n        print(f\"Testing connectivity for {device.name}\")\n        # In a real scenario, this would execute a command like `device.ping('1.1.1.1')`\n        # For quickstart, we'll simulate a passing test.\n        if device.name == 'R1':\n            self.passed(f\"Simulated ping successful on {device.name}\")\n        else:\n            self.failed(f\"Simulated ping failed on {device.name}\")\n\nclass CommonCleanup(aetest.CommonCleanup):\n    @aetest.subsection\n    def disconnect_from_devices(self, testbed):\n        for device in testbed.devices.values():\n            print(f\"Simulated disconnection from {device.name}\")\n            # In a real scenario: device.disconnect()\n''')\n\n# Set a dummy password for the quickstart's testbed if not already set\nos.environ['PYATS_TESTBED_PASSWORD'] = os.environ.get('PYATS_TESTBED_PASSWORD', 'your_password_here')\n\nprint(\"Running pyATS job... This will generate a report.\")\n# To run the job and generate a report, use the pyats CLI command\n# In a real environment, you'd run this from your terminal:\n# pyats run job my_test_job.py --testbed-file testbed.yaml\n# For this quickstart, we'll just demonstrate the files are set up.\n\nprint(\"A testbed.yaml and my_test_job.py have been created.\")\nprint(\"To run the test and generate a report, execute in your terminal:\")\nprint(\"  pyats run job my_test_job.py --testbed-file testbed.yaml\")\nprint(\"After running, view the report with:\")\nprint(\"  pyats logs view\")\nprint(\"Cleanup: Remove 'testbed.yaml' and 'my_test_job.py' if desired.\")","lang":"python","description":"The pyATS Reporter primarily functions as part of a larger pyATS test execution. This quickstart demonstrates how to set up and run a minimal pyATS job, which will automatically generate a report using `pyats-reporter` capabilities. The output can then be viewed through the `pyats logs view` command-line tool. A placeholder IP is used; replace with a reachable device or use pyATS mocking for actual execution without a physical device. Make sure to set `PYATS_TESTBED_PASSWORD` environment variable for the testbed credentials if running against a real device.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"25.9","pypi_latest":"26.4","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":70,"avg_install_s":29,"avg_import_s":null,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyats-reporter","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"208.0M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"broken","install_time_s":0.1,"import_time_s":null,"mem_mb":null,"disk_size":"1.2G"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyats-reporter","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":11,"import_time_s":null,"mem_mb":null,"disk_size":"108M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"broken","install_time_s":58.1,"import_time_s":null,"mem_mb":null,"disk_size":"993M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyats-reporter","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"full","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyats-reporter","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":9.6,"import_time_s":null,"mem_mb":null,"disk_size":"114M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"broken","install_time_s":56.3,"import_time_s":null,"mem_mb":null,"disk_size":"1.1G"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyats-reporter","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"full","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyats-reporter","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":7.4,"import_time_s":null,"mem_mb":null,"disk_size":"106M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"broken","install_time_s":58.7,"import_time_s":null,"mem_mb":null,"disk_size":"1.1G"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyats-reporter","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"full","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyats-reporter","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":8,"import_time_s":null,"mem_mb":null,"disk_size":"105M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"broken","install_time_s":57.2,"import_time_s":null,"mem_mb":null,"disk_size":"1.1G"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyats-reporter","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"110.1M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"broken","install_time_s":0.1,"import_time_s":null,"mem_mb":null,"disk_size":"972.1M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyats-reporter","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":13.4,"import_time_s":null,"mem_mb":null,"disk_size":"249M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"broken","install_time_s":68.7,"import_time_s":null,"mem_mb":null,"disk_size":"1.3G"}]}}