# Optics Framework
[](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)
[](LICENSE)
[](https://www.python.org/)
[](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)
[](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)
[](https://www.bestpractices.dev/projects/10842)
**Optics Framework** is a powerful, extensible no code test automation framework designed for **vision powered**, **data-driven testing** and **production app synthetic monitoring**. It enables seamless integration with intrusive action & detection drivers such as Appium / WebDriver as well as non-intrusive action drivers such as BLE mouse / keyboard and detection drivers such as video capture card and external web cams.
This framework was designed primarily for the following use cases:
1. Production app monitoring where access to USB debugging / developer mode and device screenshots is prohibited
2. Resilient self-healing test automation that rely on more than one element identifier and multiple fallbacks to ensure maximum recovery
3. Enable non-coders to build test automation scripts
---
## 🚀 Features
- **Vision powered detections:** UI object detections are powered by computer vision and not just on XPath elements.
- **No code automation:** No knowledge of programming languages or access to IDE needed to build automations scripts
- **Supports non-intrusive action drivers:** Non-intrusive action drivers such as BLE mouse and keyboard are supported
- **Data-Driven Testing (DDT):** Execute test cases dynamically with multiple datasets, enabling parameterized testing and iterative execution.
- **Extensible & Scalable:** Easily add new keywords and modules without any hassle.
- **AI Integration:** Choose which AI models to use for object recognition and OCR.
- **Self-healing capability:** Configure multiple drivers, screen capture methods, and detection techniques with priority-based execution. If a primary method fails, the system automatically switches to the next available method in the defined hierarchy
---
## 📦 Installation
### Install via `pip`
```bash
pip install optics-framework
```
---
## 🚀 Quick Start
### 1 Install Optics Framework
**Note**: Ensure Appium server is running and a virtual Android device is enabled before proceeding.
```bash
mkdir ~/test-code
cd ~/test-code
python3 -m venv venv
source venv/bin/activate
pip install optics-framework
```
> **⚠️ Important:** Conda environments are not supported for `easyocr` and `optics-framework` together, due to conflicting requirements for `numpy` (version 1.x vs 2.x). Please use a standard Python virtual environment instead.
### 2 Create a New Test Project
```bash
optics setup --install Appium EasyOCR
optics init --name my_test_project --path . --template contact
```
### 📌 Dry Run Test Cases
```bash
optics dry_run my_test_project
```
### 📌 Execute Test Cases
```bash
optics execute my_test_project
```
---
## 🛠️ Usage
### Execute Tests
```bash
optics execute <project_name>
```
### Initialize a New Project
```bash
optics init --name <project_name> --path <directory> --template <contact/youtube> --force
```
### List Available Keywords
```bash
optics list
```
### Display Help
```bash
optics --help
```
### Check Version
```bash
optics version
```
---
## 🏗️ Developer Guide
### Project Structure
```bash
Optics_Framework/
├── LICENSE
├── README.md
├── dev_requirements.txt
├── samples/ # Sample test cases and configurations
| ├── contact/
| ├── youtube/
├── pyproject.toml
├── tox.ini
├── docs/ # Documentation using Sphinx
├── optics_framework/ # Main package
│ ├── api/ # Core API modules
│ ├── common/ # Factories, interfaces, and utilities
│ ├── engines/ # Engine implementations (drivers, vision models, screenshot tools)
│ ├── helper/ # Configuration management
├── tests/ # Unit tests and test assets
│ ├── assets/ # Sample images for testing
│ ├── units/ # Unit tests organized by module
│ ├── functional/ # Functional tests organized by module
```
### Available Keywords
The following keywords are available and organized by category. These keywords can be used directly in your test cases or extended further for custom workflows.
<details>
<summary><strong>🔹 Core Keywords</strong></summary>
<ul>
<li>
<code>Clear Element Text (element, event_name=None)</code><br/>
Clears any existing text from the given input element.
</li>
<li>
<code>Detect and Press (element, timeout, event_name=None)</code><br/>
Detects if the element exists, then performs a press action on it.
</li>
<li>
<code>Enter Number (element, number, event_name=None)</code><br/>
Enters a numeric value into the specified input field.
</li>
<li>
<code>Enter Text (element, text, event_name=None)</code><br/>
Inputs the given text into the specified element.
</li>
<li>
<code>Get Text (element)</code><br/>
Retrieves the text content from the specified element.
</li>
<li>
<code>Press by Coordinates (x, y, repeat=1, event_name=None)</code><br/>
Performs a tap at the specified absolute screen coordinates.
</li>
<li>
<code>Press by Percentage (percent_x, percent_y, repeat=1, event_name=None)</code><br/>
Taps on a location based on percentage of screen width and height.
</li>
<li>
<code>Press Element (element, repeat=1, offset_x=0, offset_y=0, event_name=None)</code><br/>
Taps on a given element with optional offset and repeat parameters.
</li>
<li>
<code>Press Element with Index (element, index=0, event_name=None)</code><br/>
Presses the element found at the specified index from multiple matches.
</li>
<li>
<code>Press Keycode (keycode, event_name)</code><br/>
Simulates pressing a hardware key using a keycode.
</li>
<li>
<code>Scroll (direction, event_name=None)</code><br/>
Scrolls the screen in the specified direction.
</li>
<li>
<code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>
Scrolls starting from a specific element in the given direction.
</li>
<li>
<code>Scroll Until Element Appears (element, direction, timeout, event_name=None)</code><br/>
Continuously scrolls until the target element becomes visible or the timeout is reached.
</li>
<li>
<code>Select Dropdown Option (element, option, event_name=None)</code><br/>
Selects an option from a dropdown field by visible text.
</li>
<li>
<code>Sleep (duration)</code><br/>
Pauses execution for a specified number of seconds.
</li>
<li>
<code>Swipe (x, y, direction='right', swipe_length=50, event_name=None)</code><br/>
Swipes from a coordinate point in the given direction and length.
</li>
<li>
<code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>
Scrolls starting from the position of a given element.
</li>
<li>
<code>Swipe Until Element Appears (element, direction, timeout, event_name=None)</code><br/>
Swipes repeatedly until the element is detected or timeout is reached.
</li>
</ul>
</details>
<details>
<summary><strong>🔹 AppManagement</strong></summary>
<ul>
<li>
<code>Close And Terminate App(package_name, event_name)</code><br/>
Closes and fully terminates the specified application using its package name.
</li>
<li>
<code>Force Terminate App(event_name)</code><br/>
Forcefully terminates the currently running application.
</li>
<li>
<code>Get App Version</code><br/>
Returns the version of the currently running application.
</li>
<li>
<code>Initialise Setup</code><br/>
Prepares the environment for performing application management operations.
</li>
<li>
<code>Launch App (event_name=None)</code><br/>
Launches the default application configured in the session.
</li>
<li>
<code>Start Appium Session (event_name=None)</code><br/>
Starts a new Appium session for the current application.
</li>
<li>
<code>Start Other App (package_name, event_name)</code><br/>
Launches a different application using the provided package name.
</li>
</ul>
</details>
<details>
<summary><strong>🔹 FlowControl</strong></summary>
<ul>
<li>
<code>Condition </code><br/>
Evaluates multiple conditions and executes corresponding modules if the condition is true.
</li>
<li>
<code>Evaluate (param1, param2)</code><br/>
Evaluates a mathematical or logical expression and stores the result in a variable.
</li>
<li>
<code>Read Data (input_element, file_path, index=None)</code><br/>
Reads data from a CSV file, API URL, or list and assigns it to a variable.
</li>
<li>
<code>Run Loop (target, *args)</code><br/>
Runs a loop either by count or by iterating over variable-value pairs.
</li>
</ul>
</details>
<details>
<summary><strong>🔹 Verifier</strong></summary>
<ul>
<li>
<code>Assert Equality (output, expression)</code><br/>
Compares two values and checks if they are equal.
</li>
<li>
<code>Assert Images Vision (frame, images, element_status, rule)</code><br/>
Searches for the specified image templates within the frame using vision-based template matching.
</li>
<li>
<code>Assert Presence (elements, timeout=30, rule='any', event_name=None)</code><br/>
Verifies the presence of given elements using Appium or vision-based fallback logic.
</li>
<li>
<code>Assert Texts Vision (frame, texts, element_status, rule)</code><br/>
Searches for text in the given frame using OCR and updates element status.
</li>
<li>
<code>Is Element (element, element_state, timeout, event_name)</code><br/>
Checks if a given element exists.
</li>
<li>
<code>Validate Element (element, timeout=10, rule='all', event_name=None)</code><br/>
Validates if the given element is present on the screen using defined rule and timeout.
</li>
<li>
<code>Validate Screen (elements, timeout=30, rule='any', event_name=None)</code><br/>
Validates the presence of a set of elements on a screen using the defined rule.
</li>
<li>
<code>Vision Search (elements, timeout, rule)</code><br/>
Performs vision-based search to detect text or image elements in the screen.
</li>
</ul>
</details>
### Setup Development Environment
```bash
git clone git@github.com:mozarkai/optics-framework.git
cd Optics_Framework
pipx install poetry
poetry install --with dev
```
### Running Tests
```bash
poetry install --with tests
poetry run pytest
```
### Build Documentation
```bash
poetry install --with docs
poetry run mkdocs serve
```
### Packaging the Project
```bash
poetry build
```
---
## 📜 Contributing
We welcome contributions! Please follow these steps:
1. Fork the repository.
2. Create a new feature branch.
3. Commit your changes.
4. Open a pull request.
Ensure your code follows **PEP8** standards and is formatted with **Black**.
---
## 🎯 Roadmap
Here are the key initiatives planned for the upcoming quarter:
1. MCP Servicer: Introduce a dedicated service to handle MCP (Model Context Protocol), improving scalability and modularity across the framework.
2. Omniparser Integration: Seamlessly integrate Omniparser to enable robust and flexible element extraction and location.
3. Playwright Integration: Add support for Playwright to enhance browser automation capabilities, enabling cross-browser testing with modern and powerful tooling.
4. Audio Support: Extend the framework to support audio inputs and outputs, enabling testing and verification of voice-based or sound-related interactions.
---
## 📄 License
This project is licensed under the **Apache 2.0 License**. See the [LICENSE](https://github.com/mozarkai/optics-framework?tab=Apache-2.0-1-ov-file) file for details.
---
## 📞 Support
For support, please open an issue on GitHub or contact us at [@malto101], [@davidamo9] or [lalit@mozark.ai] .
Happy Testing! 🚀
Raw data
{
"_id": null,
"home_page": null,
"name": "optics-framework",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.12",
"maintainer_email": null,
"keywords": "test automation, framework, mobile automation",
"author": "Lalitanand Dandge",
"author_email": "lalit@mozark.ai",
"download_url": "https://files.pythonhosted.org/packages/7d/fb/f61e3d33b1a17467187829130a107fd9d19ba9b4f00743e5f2b1731ec53f/optics_framework-1.3.4.tar.gz",
"platform": null,
"description": "# Optics Framework\n[](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)\n[](LICENSE)\n[](https://www.python.org/)\n[](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)\n[](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)\n[](https://www.bestpractices.dev/projects/10842)\n\n\n**Optics Framework** is a powerful, extensible no code test automation framework designed for **vision powered**, **data-driven testing** and **production app synthetic monitoring**. It enables seamless integration with intrusive action & detection drivers such as Appium / WebDriver as well as non-intrusive action drivers such as BLE mouse / keyboard and detection drivers such as video capture card and external web cams.\n\nThis framework was designed primarily for the following use cases:\n\n1. Production app monitoring where access to USB debugging / developer mode and device screenshots is prohibited\n2. Resilient self-healing test automation that rely on more than one element identifier and multiple fallbacks to ensure maximum recovery\n3. Enable non-coders to build test automation scripts\n\n---\n\n## \ud83d\ude80 Features\n\n- **Vision powered detections:** UI object detections are powered by computer vision and not just on XPath elements.\n- **No code automation:** No knowledge of programming languages or access to IDE needed to build automations scripts\n- **Supports non-intrusive action drivers:** Non-intrusive action drivers such as BLE mouse and keyboard are supported\n- **Data-Driven Testing (DDT):** Execute test cases dynamically with multiple datasets, enabling parameterized testing and iterative execution.\n- **Extensible & Scalable:** Easily add new keywords and modules without any hassle.\n- **AI Integration:** Choose which AI models to use for object recognition and OCR.\n- **Self-healing capability:** Configure multiple drivers, screen capture methods, and detection techniques with priority-based execution. If a primary method fails, the system automatically switches to the next available method in the defined hierarchy\n\n---\n\n## \ud83d\udce6 Installation\n\n### Install via `pip`\n\n```bash\npip install optics-framework\n```\n\n---\n\n## \ud83d\ude80 Quick Start\n\n### 1 Install Optics Framework\n\n**Note**: Ensure Appium server is running and a virtual Android device is enabled before proceeding.\n\n```bash\nmkdir ~/test-code\ncd ~/test-code\npython3 -m venv venv\nsource venv/bin/activate\npip install optics-framework\n```\n\n> **\u26a0\ufe0f Important:** Conda environments are not supported for `easyocr` and `optics-framework` together, due to conflicting requirements for `numpy` (version 1.x vs 2.x). Please use a standard Python virtual environment instead.\n\n### 2 Create a New Test Project\n\n```bash\noptics setup --install Appium EasyOCR\noptics init --name my_test_project --path . --template contact\n```\n\n### \ud83d\udccc Dry Run Test Cases\n\n```bash\noptics dry_run my_test_project\n```\n\n### \ud83d\udccc Execute Test Cases\n\n```bash\noptics execute my_test_project\n```\n\n---\n\n## \ud83d\udee0\ufe0f Usage\n\n### Execute Tests\n\n```bash\noptics execute <project_name>\n```\n\n### Initialize a New Project\n\n```bash\noptics init --name <project_name> --path <directory> --template <contact/youtube> --force\n```\n\n### List Available Keywords\n\n```bash\noptics list\n```\n\n### Display Help\n\n```bash\noptics --help\n```\n\n### Check Version\n\n```bash\noptics version\n```\n\n---\n\n## \ud83c\udfd7\ufe0f Developer Guide\n\n### Project Structure\n\n```bash\nOptics_Framework/\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 dev_requirements.txt\n\u251c\u2500\u2500 samples/ # Sample test cases and configurations\n| \u251c\u2500\u2500 contact/\n| \u251c\u2500\u2500 youtube/\n\u251c\u2500\u2500 pyproject.toml\n\u251c\u2500\u2500 tox.ini\n\u251c\u2500\u2500 docs/ # Documentation using Sphinx\n\u251c\u2500\u2500 optics_framework/ # Main package\n\u2502 \u251c\u2500\u2500 api/ # Core API modules\n\u2502 \u251c\u2500\u2500 common/ # Factories, interfaces, and utilities\n\u2502 \u251c\u2500\u2500 engines/ # Engine implementations (drivers, vision models, screenshot tools)\n\u2502 \u251c\u2500\u2500 helper/ # Configuration management\n\u251c\u2500\u2500 tests/ # Unit tests and test assets\n\u2502 \u251c\u2500\u2500 assets/ # Sample images for testing\n\u2502 \u251c\u2500\u2500 units/ # Unit tests organized by module\n\u2502 \u251c\u2500\u2500 functional/ # Functional tests organized by module\n\n```\n\n### Available Keywords\n\nThe following keywords are available and organized by category. These keywords can be used directly in your test cases or extended further for custom workflows.\n<details>\n<summary><strong>\ud83d\udd39 Core Keywords</strong></summary>\n\n<ul>\n <li>\n <code>Clear Element Text (element, event_name=None)</code><br/>\n Clears any existing text from the given input element.\n </li>\n <li>\n <code>Detect and Press (element, timeout, event_name=None)</code><br/>\n Detects if the element exists, then performs a press action on it.\n </li>\n <li>\n <code>Enter Number (element, number, event_name=None)</code><br/>\n Enters a numeric value into the specified input field.\n </li>\n <li>\n <code>Enter Text (element, text, event_name=None)</code><br/>\n Inputs the given text into the specified element.\n </li>\n <li>\n <code>Get Text (element)</code><br/>\n Retrieves the text content from the specified element.\n </li>\n <li>\n <code>Press by Coordinates (x, y, repeat=1, event_name=None)</code><br/>\n Performs a tap at the specified absolute screen coordinates.\n </li>\n <li>\n <code>Press by Percentage (percent_x, percent_y, repeat=1, event_name=None)</code><br/>\n Taps on a location based on percentage of screen width and height.\n </li>\n <li>\n <code>Press Element (element, repeat=1, offset_x=0, offset_y=0, event_name=None)</code><br/>\n Taps on a given element with optional offset and repeat parameters.\n </li>\n <li>\n <code>Press Element with Index (element, index=0, event_name=None)</code><br/>\n Presses the element found at the specified index from multiple matches.\n </li>\n <li>\n <code>Press Keycode (keycode, event_name)</code><br/>\n Simulates pressing a hardware key using a keycode.\n </li>\n <li>\n <code>Scroll (direction, event_name=None)</code><br/>\n Scrolls the screen in the specified direction.\n </li>\n <li>\n <code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>\n Scrolls starting from a specific element in the given direction.\n </li>\n <li>\n <code>Scroll Until Element Appears (element, direction, timeout, event_name=None)</code><br/>\n Continuously scrolls until the target element becomes visible or the timeout is reached.\n </li>\n <li>\n <code>Select Dropdown Option (element, option, event_name=None)</code><br/>\n Selects an option from a dropdown field by visible text.\n </li>\n <li>\n <code>Sleep (duration)</code><br/>\n Pauses execution for a specified number of seconds.\n </li>\n <li>\n <code>Swipe (x, y, direction='right', swipe_length=50, event_name=None)</code><br/>\n Swipes from a coordinate point in the given direction and length.\n </li>\n <li>\n <code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>\n Scrolls starting from the position of a given element.\n </li>\n <li>\n <code>Swipe Until Element Appears (element, direction, timeout, event_name=None)</code><br/>\n Swipes repeatedly until the element is detected or timeout is reached.\n </li>\n</ul>\n\n</details>\n\n<details>\n<summary><strong>\ud83d\udd39 AppManagement</strong></summary>\n\n<ul>\n <li>\n <code>Close And Terminate App(package_name, event_name)</code><br/>\n Closes and fully terminates the specified application using its package name.\n </li>\n <li>\n <code>Force Terminate App(event_name)</code><br/>\n Forcefully terminates the currently running application.\n </li>\n <li>\n <code>Get App Version</code><br/>\n Returns the version of the currently running application.\n </li>\n <li>\n <code>Initialise Setup</code><br/>\n Prepares the environment for performing application management operations.\n </li>\n <li>\n <code>Launch App (event_name=None)</code><br/>\n Launches the default application configured in the session.\n </li>\n <li>\n <code>Start Appium Session (event_name=None)</code><br/>\n Starts a new Appium session for the current application.\n </li>\n <li>\n <code>Start Other App (package_name, event_name)</code><br/>\n Launches a different application using the provided package name.\n </li>\n</ul>\n\n</details>\n\n\n<details>\n<summary><strong>\ud83d\udd39 FlowControl</strong></summary>\n\n<ul>\n <li>\n <code>Condition </code><br/>\n Evaluates multiple conditions and executes corresponding modules if the condition is true.\n </li>\n <li>\n <code>Evaluate (param1, param2)</code><br/>\n Evaluates a mathematical or logical expression and stores the result in a variable.\n </li>\n <li>\n <code>Read Data (input_element, file_path, index=None)</code><br/>\n Reads data from a CSV file, API URL, or list and assigns it to a variable.\n </li>\n <li>\n <code>Run Loop (target, *args)</code><br/>\n Runs a loop either by count or by iterating over variable-value pairs.\n </li>\n</ul>\n\n</details>\n\n<details>\n<summary><strong>\ud83d\udd39 Verifier</strong></summary>\n\n<ul>\n <li>\n <code>Assert Equality (output, expression)</code><br/>\n Compares two values and checks if they are equal.\n </li>\n <li>\n <code>Assert Images Vision (frame, images, element_status, rule)</code><br/>\n Searches for the specified image templates within the frame using vision-based template matching.\n </li>\n <li>\n <code>Assert Presence (elements, timeout=30, rule='any', event_name=None)</code><br/>\n Verifies the presence of given elements using Appium or vision-based fallback logic.\n </li>\n <li>\n <code>Assert Texts Vision (frame, texts, element_status, rule)</code><br/>\n Searches for text in the given frame using OCR and updates element status.\n </li>\n <li>\n <code>Is Element (element, element_state, timeout, event_name)</code><br/>\n Checks if a given element exists.\n </li>\n <li>\n <code>Validate Element (element, timeout=10, rule='all', event_name=None)</code><br/>\n Validates if the given element is present on the screen using defined rule and timeout.\n </li>\n <li>\n <code>Validate Screen (elements, timeout=30, rule='any', event_name=None)</code><br/>\n Validates the presence of a set of elements on a screen using the defined rule.\n </li>\n <li>\n <code>Vision Search (elements, timeout, rule)</code><br/>\n Performs vision-based search to detect text or image elements in the screen.\n </li>\n</ul>\n\n</details>\n\n\n### Setup Development Environment\n\n```bash\ngit clone git@github.com:mozarkai/optics-framework.git\ncd Optics_Framework\npipx install poetry\npoetry install --with dev\n```\n\n### Running Tests\n\n```bash\npoetry install --with tests\npoetry run pytest\n```\n\n### Build Documentation\n\n```bash\npoetry install --with docs\npoetry run mkdocs serve\n```\n\n### Packaging the Project\n\n```bash\npoetry build\n```\n\n---\n\n## \ud83d\udcdc Contributing\n\nWe welcome contributions! Please follow these steps:\n\n1. Fork the repository.\n2. Create a new feature branch.\n3. Commit your changes.\n4. Open a pull request.\n\nEnsure your code follows **PEP8** standards and is formatted with **Black**.\n\n---\n\n## \ud83c\udfaf Roadmap\n\nHere are the key initiatives planned for the upcoming quarter:\n\n1. MCP Servicer: Introduce a dedicated service to handle MCP (Model Context Protocol), improving scalability and modularity across the framework.\n2. Omniparser Integration: Seamlessly integrate Omniparser to enable robust and flexible element extraction and location.\n3. Playwright Integration: Add support for Playwright to enhance browser automation capabilities, enabling cross-browser testing with modern and powerful tooling.\n4. Audio Support: Extend the framework to support audio inputs and outputs, enabling testing and verification of voice-based or sound-related interactions.\n\n---\n\n## \ud83d\udcc4 License\n\nThis project is licensed under the **Apache 2.0 License**. See the [LICENSE](https://github.com/mozarkai/optics-framework?tab=Apache-2.0-1-ov-file) file for details.\n\n---\n\n## \ud83d\udcde Support\n\nFor support, please open an issue on GitHub or contact us at [@malto101], [@davidamo9] or [lalit@mozark.ai] .\n\nHappy Testing! \ud83d\ude80\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "A flexible and modular test automation framework that can be used to automate any mobile application.",
"version": "1.3.4",
"project_urls": null,
"split_keywords": [
"test automation",
" framework",
" mobile automation"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0527a41fa0d28267f0e28c041243c666e84335dd683fc44768cbbc706be307cb",
"md5": "bce678ca0a760ae48e1a44f0495e8ff6",
"sha256": "27746d8e72d075f6ae6c1bd86ce6b9788533c12736759c6fada0d09b14a457a4"
},
"downloads": -1,
"filename": "optics_framework-1.3.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bce678ca0a760ae48e1a44f0495e8ff6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.12",
"size": 170818,
"upload_time": "2025-07-08T11:28:59",
"upload_time_iso_8601": "2025-07-08T11:28:59.773176Z",
"url": "https://files.pythonhosted.org/packages/05/27/a41fa0d28267f0e28c041243c666e84335dd683fc44768cbbc706be307cb/optics_framework-1.3.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7dfbf61e3d33b1a17467187829130a107fd9d19ba9b4f00743e5f2b1731ec53f",
"md5": "103689733d486a77ec4b8e4469302d62",
"sha256": "b079bc1e8536bb657e82199bd4a5312cbc3d403052038265b54a651cc0eda5c7"
},
"downloads": -1,
"filename": "optics_framework-1.3.4.tar.gz",
"has_sig": false,
"md5_digest": "103689733d486a77ec4b8e4469302d62",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.12",
"size": 133282,
"upload_time": "2025-07-08T11:29:02",
"upload_time_iso_8601": "2025-07-08T11:29:02.231303Z",
"url": "https://files.pythonhosted.org/packages/7d/fb/f61e3d33b1a17467187829130a107fd9d19ba9b4f00743e5f2b1731ec53f/optics_framework-1.3.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-08 11:29:02",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "optics-framework"
}