analytics-ingest


Nameanalytics-ingest JSON
Version 0.1.69 PyPI version JSON
download
home_pageNone
Summary- Integeration test for signal added.
upload_time2025-07-30 11:09:51
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Analytics Ingest Client

A lightweight Python library to batch and push automotive telemetry data—such as signals, Diagnostic Trouble Codes (DTCs), GPS data, and network statistics—to a GraphQL backend.

---

## 🔧 Features

- Supports Python 3.11+
- Clean, single-class interface: `IcsAnalytics`
- In-memory caching for resolved IDs (message id or configuration)
- Batching support (by interval, count, or signal limit)
- Async-safe request queuing (only 1 request at a time)
- Minimal dependency footprint
- Easy to test and integrate
- Supports signals, DTCs, GPS, and network stats ingestion

---

## 📦 Installation

```bash
pip install analytics-ingest
```

---

## 🚀 Usage

### Basic Example

```python
from analytics_ingest import IcsAnalytics

client = IcsAnalytics(
    device_id=123,
    vehicle_id=456,
    fleet_id=789,
    org_id=1011,
    graphql_endpoint="https://your-backend/graphql",
    batch_size=100,
    batch_interval_seconds=10,
    max_signal_count=100
)

# Add signals (list of dicts)
client.add_signal([
    {'name': 'VehicleIdentificationNumber', 'unit': '', 'messageName': 'BusQuery_IDDecoding_F190_VSSAL', 'networkName': 'Cluster_6_TestTool', 'ecuName': '', 'arbId': '', 'fileId': '1234', 'paramType': 'TEXT', 'signalType': 'DID', 'messageDate': '2025-07-15T01:40:00.000000', 'paramId': 'F190', 'data': [{'value': 0.04, 'time': '1970-01-07T18:28:54Z'}]},
    # ... more signals ...
])

# Add DTCs (list of dicts)
client.add_dtc([{'messageName': 'DTC Message99B049', 'name': 'DTC Message99B049', 'networkName': 'Cluster_6_TestTool', 'ecuName': 'VCU_Android_GAS', 'ecuId': '14DA80F1', 'messageDate': '2025-07-15T01:42:20.385429', 'fileId': '1234', 'data': [{'dtcId': 'B19B0-49', 'description': 'Head-Up Display - Internal Electronic Failure', 'status': '2F', 'time': '2025-07-15T01:42:15.979524'}]} 
# ... more DTCs ...
])

# Add GPS data (dict)
client.add_gps([
    {"time": "2025-07-28T12:34:56.789Z", "latitude": 37.7749, "longitude": -122.4194, "accuracy": 10.5, "altitude": 120.3, "speed": 45.2, "bearing": 75.0, "available": {"accuracy": True, "altitude": True, "bearing": False, "speed": True, "time": True}},
    {"time": "2025-07-28T12:35:56.789Z", "latitude": 37.7750, "longitude": -122.4195}
    # ... more GPS ...
])


# Add network stats (dict)
client.add_network_stats({
    "name": "CAN1",
    "vehicleId": 456,
    "uploadId": 1,
    "totalMessages": 1000,
    "matchedMessages": 950,
    "unmatchedMessages": 50,
    "errorMessages": 0,
    "longMessageParts": 0,
    "rate": 500.0
})

# Graceful shutdown (flushes any remaining data)
client.close()
```

---

## ⚙️ Configuration

You can configure the client via constructor arguments or environment variables (e.g., `GRAPH_ENDPOINT`).

- `device_id`, `vehicle_id`, `fleet_id`, `org_id`: Required identifiers
- `graphql_endpoint`: URL to your GraphQL backend
- `batch_size`: Number of items per batch (default: 100)
- `batch_interval_seconds`: Max seconds between batch sends (default: 10)
- `max_signal_count`: Max signals per batch (default: 100)

---

## 🛠️ Error Handling & Logging

- Uses exceptions for invalid input or backend errors
- Replaceable `print` statements with logging recommended for production
- Retries failed batch sends on next interval

---

## 🧪 Testing

Run all test cases:

```
PYTHONPATH=src python3 -m unittest discover -s tests -v
```

Build and upload package:

```
python3 -m build
python -m twine upload dist/*
```

---

## 💡 Improvements & Roadmap

- Add more usage examples and API documentation
- Integrate a logging framework
- Increase test coverage and add integration tests
- Allow dynamic runtime configuration
- Expose a fully async API
- Add metrics and monitoring hooks
- Enforce linting and type checking in CI

---

## 🤝 Contributing

Pull requests and issues are welcome! Please add tests for new features and follow PEP8 style guidelines.

---

## 📄 License

MIT License
Readme.txt
4 KB

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "analytics-ingest",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "Haseeb Saif Ullah <hsaif@intrepidcs.com>",
    "download_url": "https://files.pythonhosted.org/packages/fc/4b/a95e3824ad355e7bdc9d9cbd18b12b226a7fefaf2ee94b6fcbbc7086b526/analytics_ingest-0.1.69.tar.gz",
    "platform": null,
    "description": "# Analytics Ingest Client\n\nA lightweight Python library to batch and push automotive telemetry data\u2014such as signals, Diagnostic Trouble Codes (DTCs), GPS data, and network statistics\u2014to a GraphQL backend.\n\n---\n\n## \ud83d\udd27 Features\n\n- Supports Python 3.11+\n- Clean, single-class interface: `IcsAnalytics`\n- In-memory caching for resolved IDs (message id or configuration)\n- Batching support (by interval, count, or signal limit)\n- Async-safe request queuing (only 1 request at a time)\n- Minimal dependency footprint\n- Easy to test and integrate\n- Supports signals, DTCs, GPS, and network stats ingestion\n\n---\n\n## \ud83d\udce6 Installation\n\n```bash\npip install analytics-ingest\n```\n\n---\n\n## \ud83d\ude80 Usage\n\n### Basic Example\n\n```python\nfrom analytics_ingest import IcsAnalytics\n\nclient = IcsAnalytics(\n    device_id=123,\n    vehicle_id=456,\n    fleet_id=789,\n    org_id=1011,\n    graphql_endpoint=\"https://your-backend/graphql\",\n    batch_size=100,\n    batch_interval_seconds=10,\n    max_signal_count=100\n)\n\n# Add signals (list of dicts)\nclient.add_signal([\n    {'name': 'VehicleIdentificationNumber', 'unit': '', 'messageName': 'BusQuery_IDDecoding_F190_VSSAL', 'networkName': 'Cluster_6_TestTool', 'ecuName': '', 'arbId': '', 'fileId': '1234', 'paramType': 'TEXT', 'signalType': 'DID', 'messageDate': '2025-07-15T01:40:00.000000', 'paramId': 'F190', 'data': [{'value': 0.04, 'time': '1970-01-07T18:28:54Z'}]},\n    # ... more signals ...\n])\n\n# Add DTCs (list of dicts)\nclient.add_dtc([{'messageName': 'DTC Message99B049', 'name': 'DTC Message99B049', 'networkName': 'Cluster_6_TestTool', 'ecuName': 'VCU_Android_GAS', 'ecuId': '14DA80F1', 'messageDate': '2025-07-15T01:42:20.385429', 'fileId': '1234', 'data': [{'dtcId': 'B19B0-49', 'description': 'Head-Up Display - Internal Electronic Failure', 'status': '2F', 'time': '2025-07-15T01:42:15.979524'}]} \n# ... more DTCs ...\n])\n\n# Add GPS data (dict)\nclient.add_gps([\n    {\"time\": \"2025-07-28T12:34:56.789Z\", \"latitude\": 37.7749, \"longitude\": -122.4194, \"accuracy\": 10.5, \"altitude\": 120.3, \"speed\": 45.2, \"bearing\": 75.0, \"available\": {\"accuracy\": True, \"altitude\": True, \"bearing\": False, \"speed\": True, \"time\": True}},\n    {\"time\": \"2025-07-28T12:35:56.789Z\", \"latitude\": 37.7750, \"longitude\": -122.4195}\n    # ... more GPS ...\n])\n\n\n# Add network stats (dict)\nclient.add_network_stats({\n    \"name\": \"CAN1\",\n    \"vehicleId\": 456,\n    \"uploadId\": 1,\n    \"totalMessages\": 1000,\n    \"matchedMessages\": 950,\n    \"unmatchedMessages\": 50,\n    \"errorMessages\": 0,\n    \"longMessageParts\": 0,\n    \"rate\": 500.0\n})\n\n# Graceful shutdown (flushes any remaining data)\nclient.close()\n```\n\n---\n\n## \u2699\ufe0f Configuration\n\nYou can configure the client via constructor arguments or environment variables (e.g., `GRAPH_ENDPOINT`).\n\n- `device_id`, `vehicle_id`, `fleet_id`, `org_id`: Required identifiers\n- `graphql_endpoint`: URL to your GraphQL backend\n- `batch_size`: Number of items per batch (default: 100)\n- `batch_interval_seconds`: Max seconds between batch sends (default: 10)\n- `max_signal_count`: Max signals per batch (default: 100)\n\n---\n\n## \ud83d\udee0\ufe0f Error Handling & Logging\n\n- Uses exceptions for invalid input or backend errors\n- Replaceable `print` statements with logging recommended for production\n- Retries failed batch sends on next interval\n\n---\n\n## \ud83e\uddea Testing\n\nRun all test cases:\n\n```\nPYTHONPATH=src python3 -m unittest discover -s tests -v\n```\n\nBuild and upload package:\n\n```\npython3 -m build\npython -m twine upload dist/*\n```\n\n---\n\n## \ud83d\udca1 Improvements & Roadmap\n\n- Add more usage examples and API documentation\n- Integrate a logging framework\n- Increase test coverage and add integration tests\n- Allow dynamic runtime configuration\n- Expose a fully async API\n- Add metrics and monitoring hooks\n- Enforce linting and type checking in CI\n\n---\n\n## \ud83e\udd1d Contributing\n\nPull requests and issues are welcome! Please add tests for new features and follow PEP8 style guidelines.\n\n---\n\n## \ud83d\udcc4 License\n\nMIT License\nReadme.txt\n4 KB\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "- Integeration test for signal added.",
    "version": "0.1.69",
    "project_urls": null,
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fb5241b2a0501b07aecb63c40a31c37f8ad6e4121021c44cbc4121ae690bc56e",
                "md5": "880c442aa7e4dcc530681a88844e214b",
                "sha256": "62ca620c19a1d7bc8493b3af4086036a9a28b7822b81640375b405a5c0941cc9"
            },
            "downloads": -1,
            "filename": "analytics_ingest-0.1.69-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "880c442aa7e4dcc530681a88844e214b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 23326,
            "upload_time": "2025-07-30T11:09:50",
            "upload_time_iso_8601": "2025-07-30T11:09:50.346367Z",
            "url": "https://files.pythonhosted.org/packages/fb/52/41b2a0501b07aecb63c40a31c37f8ad6e4121021c44cbc4121ae690bc56e/analytics_ingest-0.1.69-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fc4ba95e3824ad355e7bdc9d9cbd18b12b226a7fefaf2ee94b6fcbbc7086b526",
                "md5": "e0239a65a95b9c4f6350c872daab45a7",
                "sha256": "cef31cef1fa1f831547c0847bbe0ab3d038b7e64cb1b2c7c1fe890434ba4aafd"
            },
            "downloads": -1,
            "filename": "analytics_ingest-0.1.69.tar.gz",
            "has_sig": false,
            "md5_digest": "e0239a65a95b9c4f6350c872daab45a7",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 19525,
            "upload_time": "2025-07-30T11:09:51",
            "upload_time_iso_8601": "2025-07-30T11:09:51.744259Z",
            "url": "https://files.pythonhosted.org/packages/fc/4b/a95e3824ad355e7bdc9d9cbd18b12b226a7fefaf2ee94b6fcbbc7086b526/analytics_ingest-0.1.69.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-30 11:09:51",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "analytics-ingest"
}
        
Elapsed time: 1.03640s