A TypeSpec parser that generates Python dataclasses
Project description
TypeSpec Parser for Python
A Python library that parses TypeSpec definitions and generates idiomatic data models for Python, C++, Rust, Go, Zig, and V.
Features
- Parse TypeSpec model definitions
- Generate Python dataclasses with type hints
- Generate C++ headers
- Generate Rust structs and enums
- Generate Go structs, string enum aliases, constants, and JSON tags
- Generate Zig structs and enums
- Generate V structs and enums
- Support for enums
- Support for 1:1 and 1:n relationships
- Command-line interface
Installation
Using uv
uv pip install tsc-py
Running without installing
uvx tsc-py schema.tsp
Usage
Command Line
# Parse a TypeSpec file and output to stdout
tsc-py schema.tsp
# Parse a TypeSpec file and save to a Python file
tsc-py schema.tsp -o models.py
# Generate other languages
tsc-py schema.tsp --language rust -o models.rs
tsc-py schema.tsp --language go -o models.go
tsc-py schema.tsp --language zig -o models.zig
tsc-py schema.tsp --language vlang -o models.v
# Use a custom Jinja template for the selected language
tsc-py schema.tsp --language rust --template custom-rust.j2 -o models.rs
Python API
from typespec_parser import TypeSpecParser
parser = TypeSpecParser()
parser.parse("""
model User {
name: string;
age: integer;
email: string?;
}
enum Status {
active,
inactive,
}
""")
# Generate Python dataclasses
code = parser.generate_python()
print(code)
# Generate Rust, Go, Zig, or V
rust_code = parser.generate_rust()
go_code = parser.generate_go(package_name="models")
zig_code = parser.generate_zig()
v_code = parser.generate_vlang(module_name="models")
# Override the built-in Jinja template
custom_rust = parser.generate_rust(template_path="custom-rust.j2")
Example
Given the following TypeSpec:
model User {
name: string;
age: integer;
email: string?;
addresses: Address[];
}
model Address {
street: string;
city: string;
country: string;
}
enum Status {
active,
inactive,
}
The parser will generate:
from dataclasses import dataclass
from typing import List, Optional
from enum import Enum
class Status(Enum):
ACTIVE = 'active'
INACTIVE = 'inactive'
@dataclass
class Address:
street: str
city: str
country: str
@dataclass
class User:
name: str
age: int
email: Optional[str]
addresses: List[Address]
It can also generate idiomatic models for other languages:
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Status {
Active,
Inactive,
}
#[derive(Debug, Clone, PartialEq)]
pub struct User {
pub name: String,
pub age: i32,
pub email: Option<String>,
pub addresses: Vec<Address>,
}
package typespec
type Status string
const (
StatusActive Status = "active"
StatusInactive Status = "inactive"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Email *string `json:"email"`
Addresses []Address `json:"addresses"`
}
const std = @import("std");
pub const Status = enum {
active,
inactive,
};
pub const User = struct {
name: []const u8,
age: i32,
email: ?[]const u8,
addresses: []Address,
};
module typespec
pub enum Status {
active
inactive
}
pub struct User {
pub:
name string
age int
email ?string
addresses []Address
}
See Code Generation for language-specific notes and custom template context.
Development
This project uses uv for dependency management and packaging.
To install dependencies and set up the development environment:
uv sync --dev
To run tests:
uv run pytest
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tsc_py-0.1.3.tar.gz.
File metadata
- Download URL: tsc_py-0.1.3.tar.gz
- Upload date:
- Size: 20.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4098094618c2a9dbc7fa966e84f95878119b58821c0ec19e7e4a3a12848aa212
|
|
| MD5 |
c2618265e33cd08216c80eb5e2bef970
|
|
| BLAKE2b-256 |
b58bebb01416fdcfee838eebf477a5e6608695751f55bd19fcb6f86f8397c5a1
|
File details
Details for the file tsc_py-0.1.3-py3-none-any.whl.
File metadata
- Download URL: tsc_py-0.1.3-py3-none-any.whl
- Upload date:
- Size: 22.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c75ad851e303ad1cb58e02a6f2c38265cab7421d32fa90d8bc8c5eeae1705a6b
|
|
| MD5 |
db4c3594713d9c19e788889535386ed4
|
|
| BLAKE2b-256 |
f13f26c6398bc9b40b96c42e5bbb3795dbd77476d5ce56d31437c068eac59003
|