pip install cjm_fasthtml_jsonschemaRun the demo to see the library in action:
python demo_app.pyThen visit:
- http://localhost:5001/ - Demo page with example form from
./test_files/
$ python ./demo_app.py -h
usage: demo_app.py [-h] [--schema SCHEMA] [--port PORT] [--host HOST]
JSON Schema to UI Demo Application
options:
-h, --help show this help message and exit
--schema SCHEMA Path to the JSON schema file (default: test_files/voxtral_config_schema.json)
--port PORT Port to run the server on (default: 5001)
--host HOST Host to run the server on (default: 0.0.0.0)nbs/
├── components/ (1)
│ └── fields.ipynb # Field component generators for different JSON Schema types.
├── core/ (2)
│ ├── parser.ipynb # JSON Schema parsing utilities.
│ └── types.ipynb # Type definitions for JSON Schema elements.
└── generators/ (1)
└── form.ipynb # Main form generator that creates UI from JSON Schema.
Total: 4 notebooks across 3 directories
graph LR
components_fields[components.fields<br/>fields]
core_parser[core.parser<br/>parser]
core_types[core.types<br/>types]
generators_form[generators.form<br/>form]
components_fields --> core_types
core_parser --> core_types
generators_form --> core_parser
generators_form --> components_fields
4 cross-module dependencies detected
No CLI commands found in this project.
Detailed documentation for each module in the project:
Field component generators for different JSON Schema types.
from cjm_fasthtml_jsonschema.components.fields import (
create_label,
create_description,
create_string_field,
create_enum_field,
create_number_field,
create_range_field,
create_boolean_field,
create_field
)def create_label(
prop: SchemaProperty # SchemaProperty object
) -> FT: # Label component
"Create a label for a field."def create_description(
prop: SchemaProperty # SchemaProperty object
) -> Optional[FT]: # P component with description or None
"Create a description/help text for a field."def create_string_field(
prop: SchemaProperty, # SchemaProperty object
value: Any = None # Current value
) -> FT: # Div containing the field
"Create a string input field."def create_enum_field(
prop: SchemaProperty, # SchemaProperty object
value: Any = None # Current value
) -> FT: # Div containing the field
"Create an enum select dropdown field."def create_number_field(
prop: SchemaProperty, # SchemaProperty object
value: Any = None # Current value
) -> FT: # Div containing the field
"Create a number input field."def create_range_field(
prop: SchemaProperty, # SchemaProperty object
value: Any = None # Current value
) -> FT: # Div containing the field
"Create a range slider field."def create_boolean_field(
prop: SchemaProperty, # SchemaProperty object
value: Any = None # Current value
) -> FT: # Div containing the field
"Create a boolean toggle field."def create_field(
prop: SchemaProperty, # SchemaProperty object
value: Any = None # Current value
) -> FT: # Div containing the field
"Create an appropriate field based on the property type."Main form generator that creates UI from JSON Schema.
from cjm_fasthtml_jsonschema.generators.form import (
generate_form_ui
)def generate_form_ui(
schema: Dict[str, Any], # JSON Schema dictionary
values: Optional[Dict[str, Any]] = None, # Optional dictionary of current values
show_title: bool = True, # Whether to show the schema title
show_description: bool = True, # Whether to show schema description
compact: bool = False, # Use compact layout (less spacing)
card_wrapper: bool = True # Wrap the form in a card component
) -> FT: # FastHTML component containing the generated form UI
"Generate a FastHTML form UI from a JSON Schema."JSON Schema parsing utilities.
from cjm_fasthtml_jsonschema.core.parser import (
SchemaParser
)class SchemaParser:
def __init__(
self,
schema: Dict[str, Any] # JSON Schema dictionary
)
"Parse JSON Schema and extract property information."
def __init__(
self,
schema: Dict[str, Any] # JSON Schema dictionary
)
"Initialize parser with a JSON Schema."
def get_property(
self,
name: str # Property name
) -> Optional[SchemaProperty]: # SchemaProperty object or None if not found
"Get a specific property by name."
def get_required_properties(
self
) -> List[SchemaProperty]: # List of all required SchemaProperty objects
"Get all required properties."
def get_optional_properties(
self
) -> List[SchemaProperty]: # List of all optional SchemaProperty objects
"Get all optional properties."Type definitions for JSON Schema elements.
from cjm_fasthtml_jsonschema.core.types import (
SchemaProperty
)@dataclass
class SchemaProperty:
"Represents a single property in a JSON Schema."
name: str
schema: Dict[str, Any]
required: bool = False
value: Any
def type(
self
) -> str: # The property's type (e.g., 'string', 'number', 'boolean')
"Get the property type."
def is_nullable(
self
) -> bool: # True if the property allows null values
"Check if property allows null values."
def default(
self
) -> Any: # The default value for this property, or None if not specified
"Get default value if specified."
def description(
self
) -> Optional[str]: # The property's description text, or None if not provided
"Get property description."
def enum_values(
self
) -> Optional[List[Any]]: # List of allowed enum values, or None if not an enum
"Get enum values if property is an enum."
def examples(
self
) -> Optional[List[Any]]: # List of example values, or None if not provided
"Get example values if provided."
def minimum(
self
) -> Optional[Union[int, float]]: # Minimum allowed value for numeric types, or None if not specified
"Get minimum value for numeric types."
def maximum(
self
) -> Optional[Union[int, float]]: # Maximum allowed value for numeric types, or None if not specified
"Get maximum value for numeric types."
def min_length(
self
) -> Optional[int]: # Minimum length for string types, or None if not specified
"Get minimum length for string types."
def max_length(
self
) -> Optional[int]: # Maximum length for string types, or None if not specified
"Get maximum length for string types."
def pattern(
self
) -> Optional[str]: # Regex pattern for string validation, or None if not specified
"Get regex pattern for string validation."
def format(
self
) -> Optional[str]: # Format hint (e.g., 'email', 'uri', 'date'), or None if not specified
"Get format hint (e.g., 'email', 'uri', 'date')."