From 4fc01991da50b97a465d712bf0bc604d3679db42 Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Date: Wed, 9 Apr 2025 23:47:17 -0300 Subject: [PATCH] Adds README and LICENSE --- LICENSE | 21 ++++++ README.md | 170 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 1 + 3 files changed, 192 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c032988 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Vitor Hideyoshi + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5cfcb99 --- /dev/null +++ b/README.md @@ -0,0 +1,170 @@ +# Jambo - JSON Schema to Pydantic Converter + +**Jambo** is a Python package that automatically converts [JSON Schema](https://json-schema.org/) definitions into [Pydantic](https://docs.pydantic.dev/) models. +It's designed to streamline schema validation and enforce type safety using Pydantic's powerful validation features. + +Created to simplifying the process of dynamically generating Pydantic models for AI frameworks like [LangChain](https://www.langchain.com/), [CrewAI](https://www.crewai.com/), and others. + +--- + +## โœจ Features + +- โœ… Convert JSON Schema into Pydantic models dynamically +- ๐Ÿ”’ Supports validation for strings, integers, floats, booleans, arrays, and nested objects +- โš™๏ธ Enforces constraints like `minLength`, `maxLength`, `pattern`, `minimum`, `maximum`, `uniqueItems`, and more +- ๐Ÿ“ฆ Zero config โ€” just pass your schema and get a model + +--- + +## ๐Ÿ“ฆ Installation + +```bash +pip install jambo +``` + +--- + +## ๐Ÿš€ Usage + +```python +from jambo.schema_converter import SchemaConverter + +schema = { + "title": "Person", + "type": "object", + "properties": { + "name": {"type": "string"}, + "age": {"type": "integer"}, + }, + "required": ["name"], +} + +Person = SchemaConverter.build(schema) + +obj = Person(name="Alice", age=30) +print(obj) +``` + +--- + +## โœ… Example Validations + +### Strings with constraints + +```python +schema = { + "title": "EmailExample", + "type": "object", + "properties": { + "email": { + "type": "string", + "minLength": 5, + "maxLength": 50, + "pattern": r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", + }, + }, + "required": ["email"], +} + +Model = SchemaConverter.build(schema) +obj = Model(email="user@example.com") +print(obj) +``` + +### Integers with bounds + +```python +schema = { + "title": "AgeExample", + "type": "object", + "properties": { + "age": {"type": "integer", "minimum": 0, "maximum": 120} + }, + "required": ["age"], +} + +Model = SchemaConverter.build(schema) +obj = Model(age=25) +print(obj) +``` + +### Nested Objects + +```python +schema = { + "title": "NestedObjectExample", + "type": "object", + "properties": { + "address": { + "type": "object", + "properties": { + "street": {"type": "string"}, + "city": {"type": "string"}, + }, + "required": ["street", "city"], + } + }, + "required": ["address"], +} + +Model = SchemaConverter.build(schema) +obj = Model(address={"street": "Main St", "city": "Gotham"}) +print(obj) +``` + +--- + +## ๐Ÿงช Running Tests + +To run the test suite: + +```bash +poe tests +``` + +Or manually: + +```bash +python -m unittest discover -s tests -v +``` + +--- + +## ๐Ÿ›  Development Setup + +To set up the project locally: + +1. Clone the repository +2. Install [uv](https://github.com/astral-sh/uv) (if not already installed) +3. Install dependencies: + +```bash +uv sync +``` + +4. Set up git hooks: + +```bash +poe create-hooks +``` + +--- + +## ๐Ÿ“Œ Roadmap / TODO + +- [ ] Support for `enum` and `const` +- [ ] Support for `anyOf`, `allOf`, `oneOf` +- [ ] Schema ref (`$ref`) resolution +- [ ] Better error reporting for unsupported schema types + +--- + +## ๐Ÿค Contributing + +PRs are welcome! This project uses MIT for licensing, so feel free to fork and modify as you see fit. + +--- + +## ๐Ÿงพ License + +MIT License. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 32fc4ea..107ede0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,6 +3,7 @@ name = "jambo" dynamic = ["version"] description = "Add your description here" requires-python = ">=3.10,<4.0" +readme = "README.md" # Project Dependencies dependencies = [