python-code-validator


Namepython-code-validator JSON
Version 0.3.0 PyPI version JSON
download
home_pageNone
SummaryA flexible, AST-based framework for static validation of Python code using declarative JSON rules.
upload_time2025-07-19 20:44:47
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseMIT License Copyright (c) 2025 Ivan Kovach 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.
keywords validation linter static analysis testing education ast
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">
  <br/>
  <!-- <img src=".github/assets/logo.png" alt="logo" width="200" height="auto" /> -->
  <h1>Python Code Validator</h1>
  <p>
    <b>A flexible, AST-based framework for static validation of Python code using declarative JSON rules.</b>
  </p>
  <br/>

  <!-- Badges -->
  <p>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/stargazers"><img src="https://img.shields.io/github/stars/Qu1nel/PythonCodeValidator" alt="GitHub Stars"></a>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/network/members"><img src="https://img.shields.io/github/forks/Qu1nel/PythonCodeValidator" alt="GitHub Forks"></a>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/graphs/contributors"><img src="https://img.shields.io/github/contributors/Qu1nel/PythonCodeValidator" alt="Contributors"></a>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/issues/"><img src="https://img.shields.io/github/issues/Qu1nel/PythonCodeValidator" alt="Open Issues"></a>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/commits/main"><img src="https://img.shields.io/github/last-commit/Qu1nel/PythonCodeValidator" alt="Last Commit"></a>
  </p>
  <p>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/actions/workflows/ci.yml"><img src="https://github.com/Qu1nel/PythonCodeValidator/actions/workflows/ci.yml/badge.svg" alt="CI Status"></a>
    <a href="https://app.codecov.io/gh/Qu1nel/PythonCodeValidator"><img src="https://codecov.io/gh/Qu1nel/PythonCodeValidator/graph/badge.svg" alt="Coverage"></a>
    <a href="https://pypi.org/project/python-code-validator/"><img src="https://img.shields.io/pypi/v/python-code-validator.svg" alt="PyPI Version"></a>
    <a href="https://pypi.org/project/python-code-validator/"><img src="https://img.shields.io/pypi/pyversions/python-code-validator.svg" alt="Python Versions"></a>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/blob/main/LICENSE"><img src="https://img.shields.io/github/license/Qu1nel/PythonCodeValidator" alt="License"></a>
  </p>

  <h4>
    <a href="#-quick-usage-example">Usage Examples</a>
    <span>·</span>
    <a href="https://pythoncodevalidator.readthedocs.io/en/latest/">Full Documentation</a>
    <span>·</span>
    <a href="https://deepwiki.com/Qu1nel/PythonCodeValidator">AI documentation</a>
    <span>·</span>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/blob/main/docs/how_it_works/index.md">Developer's Guide</a>
    <span>·</span>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/issues/new?template=1-bug-report.md">Report a Bug</a>
    <span>·</span>
    <a href="https://github.com/Qu1nel/PythonCodeValidator/issues/new?template=4-feature-request.md">Request Feature</a>
  </h4>
</div>

<br/>

---

## Table of Contents

- [About The Project](#-about-the-project)
- [The Power of Combinatorics](#-the-power-of-combinatorics)
- [Key Features](#-key-features)
- [Getting Started](#-getting-started)
    - [Installation](#installation)
- [Usage Examples](#-quick-usage-example)
    - [Example 1: Simple Check](#example-1-simple-check)
    - [Example 2: Advanced Check](#example-2-advanced-check)
- [Documentation](#-documentation)
- [Contributing](#-contributing)
- [License](#-license)
- [Contact](#Contact)

## 📖 About The Project

**Python Code Validator** is an engine designed for educational platforms and automated testing systems. It solves a key
problem: **how to verify that a student's code meets specific structural and stylistic requirements *before* running
resource-intensive dynamic tests.**

Instead of writing complex Python scripts for each new validation rule, you can define them declaratively in a simple,
powerful **JSON format**. This allows teachers and curriculum developers to easily create and adapt validation scenarios
without deep programming knowledge. The framework analyzes the code's Abstract Syntax Tree (AST), providing a deep and
reliable way to enforce best practices.

## 📈 The Power of Combinatorics

The framework's power lies in its combinatorial architecture. It is built on a small set of primitive "bricks":
**Selectors** ($S$) that define *what* to find in the code, and **Constraints** ($C$) that define *what condition* to
check.

The number of unique validation rules ($R$) is not a sum, but a product of these components. A single rule can be
represented as:

$$R_{\text{single}} = S \times C$$

With approximately $10$ types of selectors and $10$ types of constraints, this already provides ~$100$ unique checks.
However,
the true flexibility comes from logical composition, allowing for a near-infinite number of validation scenarios:

$$R_{\text{total}} \approx S \times \sum_{k=1}^{|C|} \binom{|C|}{k} = S \times (2^{|C|} - 1)$$

This design provides **thousands of potential validation scenarios** out-of-the-box, offering extreme flexibility with
minimal complexity.

## ✨ Key Features

- **Declarative JSON Rules**: Define validation logic in a human-readable format.
- **Powerful Static Analysis**:
    - ✅ Check syntax and PEP8 compliance (`flake8`).
    - ✅ Enforce or forbid specific `import` statements.
    - ✅ Verify class structure, inheritance, and function signatures.
    - ✅ Forbid "magic numbers" or specific function calls like `eval`.
- **Precise Scoping**: Apply rules globally, or narrowly to a specific function, class, or method.
- **Extensible Architecture**: Easily add new, custom checks by creating new Selector or Constraint components.

## 🚀 Getting Started

### Installation

**1. For Users (from PyPI):**

Install the package with one command. This will make the `validate-code` command-line tool available.

```bash
pip install python-code-validator
```

**2. For Users (from source):**

If you want to install directly from the repository:

```bash
git clone https://github.com/Qu1nel/PythonCodeValidator.git
cd PythonCodeValidator
pip install .
```

**3. For Developers:**

To set up a full development environment, see the [Contributing Guidelines](./CONTRIBUTING.md).

## ⚡ Quick Usage Example

The validator is a command-line tool named `validate-code`.

### Example 1: Simple Check

Let's check if a required function exists.

**`solution_simple.py`:**

```python
# This file is missing the 'solve' function
def main():
    print("Hello")
```

**`rules_simple.json`:**

```json
{
  "validation_rules": [
    {
      "rule_id": 1,
      "message": "Required function 'solve' is missing.",
      "check": {
        "selector": {
          "type": "function_def",
          "name": "solve"
        },
        "constraint": {
          "type": "is_required"
        }
      }
    }
  ]
}
```

**Running the validator:**

```bash
$ validate-code solution_simple.py rules_simple.json
Starting validation for: solution_simple.py
Required function 'solve' is missing.
Validation failed.
```

### Example 2: Advanced Check

Let's enforce a complex rule: "In our game class, the `update` method must not contain any `print` statements."

**`game.py`:**

```python
import arcade


class MyGame(arcade.Window):
    def update(self, delta_time):
        print("Debugging player position...")  # Forbidden call
        self.player.x += 1
```

**`rules_advanced.json`:**

```json
{
  "validation_rules": [
    {
      "rule_id": 101,
      "message": "Do not use 'print' inside the 'update' method.",
      "check": {
        "selector": {
          "type": "function_call",
          "name": "print",
          "in_scope": {
            "class": "MyGame",
            "method": "update"
          }
        },
        "constraint": {
          "type": "is_forbidden"
        }
      }
    }
  ]
}
```

**Running the validator:**

```bash
$ validate-code game.py rules_advanced.json
Starting validation for: game.py
Do not use 'print' inside the 'update' method.
Validation failed.
```

## 📚 Documentation

- **Full User Guide & JSON Specification**: Our complete documentation is hosted on
  **[Read the Docs](https://[your-project].readthedocs.io)**.
- **Developer's Guide**: For a deep dive into the architecture, see the
  **[How It Works guide](./docs/how_it_works/index.md)**.
- **Interactive AI-Powered Docs**: **[DeepWiki](https://deepwiki.com/Qu1nel/PythonCodeValidator)**.

## 🤝 Contributing

Contributions make the open-source community an amazing place to learn, inspire, and create. Any contributions you make
are **greatly appreciated**.

Please read our **[Contributing Guidelines](./CONTRIBUTING.md)** to get started. This project adheres to the
**[Code of Conduct](./CODE_OF_CONDUCT.md)**.

## 📜 License

Distributed under the MIT License. See `LICENSE` for more information.

---

### Contact

Developed by **[Ivan Kovach (@Qu1nel)](https://github.com/Qu1nel)**.

Email: **[covach.qn@gmail.com](mailto:covach.qn@gmail.com)** Telegram: **[@qnllnq](https://t.me/qnllnq)**

<br/>

<p align="right"><a href="./LICENSE">MIT</a> © <a href="https://github.com/Qu1nel/">Ivan Kovach</a></p>

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "python-code-validator",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "validation, linter, static analysis, testing, education, ast",
    "author": null,
    "author_email": "Qu1nel <covach.qn@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/af/86/e5f1c54f30590c23a2dc87f567ce27498f4d137303e3e59c6a3841a25acc/python_code_validator-0.3.0.tar.gz",
    "platform": null,
    "description": "<div align=\"center\">\r\n  <br/>\r\n  <!-- <img src=\".github/assets/logo.png\" alt=\"logo\" width=\"200\" height=\"auto\" /> -->\r\n  <h1>Python Code Validator</h1>\r\n  <p>\r\n    <b>A flexible, AST-based framework for static validation of Python code using declarative JSON rules.</b>\r\n  </p>\r\n  <br/>\r\n\r\n  <!-- Badges -->\r\n  <p>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/stargazers\"><img src=\"https://img.shields.io/github/stars/Qu1nel/PythonCodeValidator\" alt=\"GitHub Stars\"></a>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/network/members\"><img src=\"https://img.shields.io/github/forks/Qu1nel/PythonCodeValidator\" alt=\"GitHub Forks\"></a>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/graphs/contributors\"><img src=\"https://img.shields.io/github/contributors/Qu1nel/PythonCodeValidator\" alt=\"Contributors\"></a>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/issues/\"><img src=\"https://img.shields.io/github/issues/Qu1nel/PythonCodeValidator\" alt=\"Open Issues\"></a>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/commits/main\"><img src=\"https://img.shields.io/github/last-commit/Qu1nel/PythonCodeValidator\" alt=\"Last Commit\"></a>\r\n  </p>\r\n  <p>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/actions/workflows/ci.yml\"><img src=\"https://github.com/Qu1nel/PythonCodeValidator/actions/workflows/ci.yml/badge.svg\" alt=\"CI Status\"></a>\r\n    <a href=\"https://app.codecov.io/gh/Qu1nel/PythonCodeValidator\"><img src=\"https://codecov.io/gh/Qu1nel/PythonCodeValidator/graph/badge.svg\" alt=\"Coverage\"></a>\r\n    <a href=\"https://pypi.org/project/python-code-validator/\"><img src=\"https://img.shields.io/pypi/v/python-code-validator.svg\" alt=\"PyPI Version\"></a>\r\n    <a href=\"https://pypi.org/project/python-code-validator/\"><img src=\"https://img.shields.io/pypi/pyversions/python-code-validator.svg\" alt=\"Python Versions\"></a>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/Qu1nel/PythonCodeValidator\" alt=\"License\"></a>\r\n  </p>\r\n\r\n  <h4>\r\n    <a href=\"#-quick-usage-example\">Usage Examples</a>\r\n    <span>\u00b7</span>\r\n    <a href=\"https://pythoncodevalidator.readthedocs.io/en/latest/\">Full Documentation</a>\r\n    <span>\u00b7</span>\r\n    <a href=\"https://deepwiki.com/Qu1nel/PythonCodeValidator\">AI documentation</a>\r\n    <span>\u00b7</span>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/blob/main/docs/how_it_works/index.md\">Developer's Guide</a>\r\n    <span>\u00b7</span>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/issues/new?template=1-bug-report.md\">Report a Bug</a>\r\n    <span>\u00b7</span>\r\n    <a href=\"https://github.com/Qu1nel/PythonCodeValidator/issues/new?template=4-feature-request.md\">Request Feature</a>\r\n  </h4>\r\n</div>\r\n\r\n<br/>\r\n\r\n---\r\n\r\n## Table of Contents\r\n\r\n- [About The Project](#-about-the-project)\r\n- [The Power of Combinatorics](#-the-power-of-combinatorics)\r\n- [Key Features](#-key-features)\r\n- [Getting Started](#-getting-started)\r\n    - [Installation](#installation)\r\n- [Usage Examples](#-quick-usage-example)\r\n    - [Example 1: Simple Check](#example-1-simple-check)\r\n    - [Example 2: Advanced Check](#example-2-advanced-check)\r\n- [Documentation](#-documentation)\r\n- [Contributing](#-contributing)\r\n- [License](#-license)\r\n- [Contact](#Contact)\r\n\r\n## \ud83d\udcd6 About The Project\r\n\r\n**Python Code Validator** is an engine designed for educational platforms and automated testing systems. It solves a key\r\nproblem: **how to verify that a student's code meets specific structural and stylistic requirements *before* running\r\nresource-intensive dynamic tests.**\r\n\r\nInstead of writing complex Python scripts for each new validation rule, you can define them declaratively in a simple,\r\npowerful **JSON format**. This allows teachers and curriculum developers to easily create and adapt validation scenarios\r\nwithout deep programming knowledge. The framework analyzes the code's Abstract Syntax Tree (AST), providing a deep and\r\nreliable way to enforce best practices.\r\n\r\n## \ud83d\udcc8 The Power of Combinatorics\r\n\r\nThe framework's power lies in its combinatorial architecture. It is built on a small set of primitive \"bricks\":\r\n**Selectors** ($S$) that define *what* to find in the code, and **Constraints** ($C$) that define *what condition* to\r\ncheck.\r\n\r\nThe number of unique validation rules ($R$) is not a sum, but a product of these components. A single rule can be\r\nrepresented as:\r\n\r\n$$R_{\\text{single}} = S \\times C$$\r\n\r\nWith approximately $10$ types of selectors and $10$ types of constraints, this already provides ~$100$ unique checks.\r\nHowever,\r\nthe true flexibility comes from logical composition, allowing for a near-infinite number of validation scenarios:\r\n\r\n$$R_{\\text{total}} \\approx S \\times \\sum_{k=1}^{|C|} \\binom{|C|}{k} = S \\times (2^{|C|} - 1)$$\r\n\r\nThis design provides **thousands of potential validation scenarios** out-of-the-box, offering extreme flexibility with\r\nminimal complexity.\r\n\r\n## \u2728 Key Features\r\n\r\n- **Declarative JSON Rules**: Define validation logic in a human-readable format.\r\n- **Powerful Static Analysis**:\r\n    - \u2705 Check syntax and PEP8 compliance (`flake8`).\r\n    - \u2705 Enforce or forbid specific `import` statements.\r\n    - \u2705 Verify class structure, inheritance, and function signatures.\r\n    - \u2705 Forbid \"magic numbers\" or specific function calls like `eval`.\r\n- **Precise Scoping**: Apply rules globally, or narrowly to a specific function, class, or method.\r\n- **Extensible Architecture**: Easily add new, custom checks by creating new Selector or Constraint components.\r\n\r\n## \ud83d\ude80 Getting Started\r\n\r\n### Installation\r\n\r\n**1. For Users (from PyPI):**\r\n\r\nInstall the package with one command. This will make the `validate-code` command-line tool available.\r\n\r\n```bash\r\npip install python-code-validator\r\n```\r\n\r\n**2. For Users (from source):**\r\n\r\nIf you want to install directly from the repository:\r\n\r\n```bash\r\ngit clone https://github.com/Qu1nel/PythonCodeValidator.git\r\ncd PythonCodeValidator\r\npip install .\r\n```\r\n\r\n**3. For Developers:**\r\n\r\nTo set up a full development environment, see the [Contributing Guidelines](./CONTRIBUTING.md).\r\n\r\n## \u26a1 Quick Usage Example\r\n\r\nThe validator is a command-line tool named `validate-code`.\r\n\r\n### Example 1: Simple Check\r\n\r\nLet's check if a required function exists.\r\n\r\n**`solution_simple.py`:**\r\n\r\n```python\r\n# This file is missing the 'solve' function\r\ndef main():\r\n    print(\"Hello\")\r\n```\r\n\r\n**`rules_simple.json`:**\r\n\r\n```json\r\n{\r\n  \"validation_rules\": [\r\n    {\r\n      \"rule_id\": 1,\r\n      \"message\": \"Required function 'solve' is missing.\",\r\n      \"check\": {\r\n        \"selector\": {\r\n          \"type\": \"function_def\",\r\n          \"name\": \"solve\"\r\n        },\r\n        \"constraint\": {\r\n          \"type\": \"is_required\"\r\n        }\r\n      }\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n**Running the validator:**\r\n\r\n```bash\r\n$ validate-code solution_simple.py rules_simple.json\r\nStarting validation for: solution_simple.py\r\nRequired function 'solve' is missing.\r\nValidation failed.\r\n```\r\n\r\n### Example 2: Advanced Check\r\n\r\nLet's enforce a complex rule: \"In our game class, the `update` method must not contain any `print` statements.\"\r\n\r\n**`game.py`:**\r\n\r\n```python\r\nimport arcade\r\n\r\n\r\nclass MyGame(arcade.Window):\r\n    def update(self, delta_time):\r\n        print(\"Debugging player position...\")  # Forbidden call\r\n        self.player.x += 1\r\n```\r\n\r\n**`rules_advanced.json`:**\r\n\r\n```json\r\n{\r\n  \"validation_rules\": [\r\n    {\r\n      \"rule_id\": 101,\r\n      \"message\": \"Do not use 'print' inside the 'update' method.\",\r\n      \"check\": {\r\n        \"selector\": {\r\n          \"type\": \"function_call\",\r\n          \"name\": \"print\",\r\n          \"in_scope\": {\r\n            \"class\": \"MyGame\",\r\n            \"method\": \"update\"\r\n          }\r\n        },\r\n        \"constraint\": {\r\n          \"type\": \"is_forbidden\"\r\n        }\r\n      }\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n**Running the validator:**\r\n\r\n```bash\r\n$ validate-code game.py rules_advanced.json\r\nStarting validation for: game.py\r\nDo not use 'print' inside the 'update' method.\r\nValidation failed.\r\n```\r\n\r\n## \ud83d\udcda Documentation\r\n\r\n- **Full User Guide & JSON Specification**: Our complete documentation is hosted on\r\n  **[Read the Docs](https://[your-project].readthedocs.io)**.\r\n- **Developer's Guide**: For a deep dive into the architecture, see the\r\n  **[How It Works guide](./docs/how_it_works/index.md)**.\r\n- **Interactive AI-Powered Docs**: **[DeepWiki](https://deepwiki.com/Qu1nel/PythonCodeValidator)**.\r\n\r\n## \ud83e\udd1d Contributing\r\n\r\nContributions make the open-source community an amazing place to learn, inspire, and create. Any contributions you make\r\nare **greatly appreciated**.\r\n\r\nPlease read our **[Contributing Guidelines](./CONTRIBUTING.md)** to get started. This project adheres to the\r\n**[Code of Conduct](./CODE_OF_CONDUCT.md)**.\r\n\r\n## \ud83d\udcdc License\r\n\r\nDistributed under the MIT License. See `LICENSE` for more information.\r\n\r\n---\r\n\r\n### Contact\r\n\r\nDeveloped by **[Ivan Kovach (@Qu1nel)](https://github.com/Qu1nel)**.\r\n\r\nEmail: **[covach.qn@gmail.com](mailto:covach.qn@gmail.com)** Telegram: **[@qnllnq](https://t.me/qnllnq)**\r\n\r\n<br/>\r\n\r\n<p align=\"right\"><a href=\"./LICENSE\">MIT</a> \u00a9 <a href=\"https://github.com/Qu1nel/\">Ivan Kovach</a></p>\r\n",
    "bugtrack_url": null,
    "license": "MIT License\r\n        \r\n        Copyright (c) 2025 Ivan Kovach\r\n        \r\n        Permission is hereby granted, free of charge, to any person obtaining a copy\r\n        of this software and associated documentation files (the \"Software\"), to deal\r\n        in the Software without restriction, including without limitation the rights\r\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n        copies of the Software, and to permit persons to whom the Software is\r\n        furnished to do so, subject to the following conditions:\r\n        \r\n        The above copyright notice and this permission notice shall be included in all\r\n        copies or substantial portions of the Software.\r\n        \r\n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n        SOFTWARE.\r\n        ",
    "summary": "A flexible, AST-based framework for static validation of Python code using declarative JSON rules.",
    "version": "0.3.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/Qu1nel/PythonCodeValidator/issues",
        "Documentation": "https://pythoncodevalidator.readthedocs.io/en/latest/",
        "Homepage": "https://github.com/Qu1nel/PythonCodeValidator"
    },
    "split_keywords": [
        "validation",
        " linter",
        " static analysis",
        " testing",
        " education",
        " ast"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e7661cdbb18acd931ae0645faa88d6b9e30e37e7b12275cae2e54b1167b71934",
                "md5": "d94bf827468a92f143e820c94644e00f",
                "sha256": "c3bb0fb106abc1f8b291433999ab2bf143752edf6d20d739fcae76e3487af50b"
            },
            "downloads": -1,
            "filename": "python_code_validator-0.3.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d94bf827468a92f143e820c94644e00f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 35550,
            "upload_time": "2025-07-19T20:44:45",
            "upload_time_iso_8601": "2025-07-19T20:44:45.674178Z",
            "url": "https://files.pythonhosted.org/packages/e7/66/1cdbb18acd931ae0645faa88d6b9e30e37e7b12275cae2e54b1167b71934/python_code_validator-0.3.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "af86e5f1c54f30590c23a2dc87f567ce27498f4d137303e3e59c6a3841a25acc",
                "md5": "55d744eb8f4a3e73490b1bb00b3989db",
                "sha256": "44cc40b1b36b33ddc2e01e9c85e20a468148efac832d2e72b23a55f25e401152"
            },
            "downloads": -1,
            "filename": "python_code_validator-0.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "55d744eb8f4a3e73490b1bb00b3989db",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 38623,
            "upload_time": "2025-07-19T20:44:47",
            "upload_time_iso_8601": "2025-07-19T20:44:47.087615Z",
            "url": "https://files.pythonhosted.org/packages/af/86/e5f1c54f30590c23a2dc87f567ce27498f4d137303e3e59c6a3841a25acc/python_code_validator-0.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-19 20:44:47",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Qu1nel",
    "github_project": "PythonCodeValidator",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "python-code-validator"
}
        
Elapsed time: 1.32359s