Skip to main content

Declarative API scaffold: define your data model in .storm format and generate complete C# (.NET) or PHP (Laravel) backends with zero boilerplate

Project description

⚡ API Starter Kit

Declare your data model once. Generate everything.

Python 3.10+ 148 tests passed MIT License Templates


A CLI tool that scaffolds full‑stack API projects from a declarative schema file.
Write your data model in .storm format and get complete, production‑ready backend code — controllers, services, models, DTOs, migrations, OpenAPI annotations — in C# (.NET) or PHP (Laravel 12+) with zero boilerplate.


📦 Quick Start

# 1. Install Python dependencies
pip install -r requirements.txt

# 2. Scaffold a project (pick your template)
python main.py --init --template dotnet-csharp --name MyApi          # .NET
python main.py --init --template laravel-php                         # Laravel

# 3. Edit schema.storm to define your data model

# 4. Generate all source files
python main.py --generate

🧭 Commands

Flag Alias Description
--init -i Scaffold a new project from a template
--generate -g Regenerate all source files from schema.storm
--template -t Template: dotnet-csharp, dotnet-csharp-clean-architecture, or laravel-php
--name -n Project name (defaults to current folder name)

🏗️ Templates

Template Stack ORM Auth
dotnet-csharp ASP.NET Core Web API EF Core (SQL Server) ASP.NET Identity
dotnet-csharp-clean-architecture Clean Architecture (Domain → Application → Infrastructure → API) EF Core (SQL Server) ASP.NET Identity
laravel-php Laravel 13+ · PHP 8.5+ Eloquent — (pkg ready)

📐 Schema Language (.storm)

Define your entire data model in a clean, readable syntax — one file, no ceremony.

// ═══ Enums ═══════════════════════════════════════════════════════════════

enum Status {
    Active   = "active",
    Inactive = "inactive",
    Pending  = "pending"
}

enum Role {
    Admin = "admin",
    User  = "user"
}

// ═══ Tables ═════════════════════════════════════════════════════════════

table User {
    id:        uuid pk;
    name:      string(min=2, max=100);
    email:     string(max=255) unique;
    password:  string(max=255);
    role:      Role;
    status:    Status;
    createdAt: datetime;
    updatedAt: datetime;
}

table Product {
    id:        int? pk;
    name:      string(min=1, max=200);
    price:     double(min=0) = 0;
    stock:     int(min=0) = 0;
    status:    Status;
    ownerId:   uuid;
    owner:     User;            // ← FK: BelongsTo User
    createdAt: datetime;
    updatedAt: datetime;
}

🔤 Type System

Storm Type C# PHP / OA Migration Notes
int int integer integer Supports pk, unique, min, max
long long integer bigInteger
float float number float
double double number double
string string string string Supports min, max
bool bool boolean boolean
uuid Guid string uuid
datetime DateTime string (date‑time) dateTime
  • Append ? for nullable: int?, uuid?
  • Reference another table → foreign key (BelongsTo / HasMany generated automatically)
  • Reference an enum → typed enum column with casts
  • Default values support constant expressions: price:double = 0, qty:int = 5 * 4

🧮 Expressions

Constant expressions in default values are evaluated at parse time:

Expression Result
5 * 4 20
(1 + 2) * 3 9
-5 -5
!true false

🎯 Generated Artifacts

.NET (dotnet-csharp / clean‑architecture)

File Path Description
{Entity}.cs Models/ Entity class (User extends IdentityUser)
{Entity}RequestDto.cs Dtos/ Create / update payload
{Entity}ResponseDto.cs Dtos/ Full API response
{Entity}ResponseSimplifiedDto.cs Dtos/ Lightweight response (no FK expansion)
I{Entity}Service.cs IServices/ Interface: CRUD + FK + Enum pagination
{Entity}Service.cs Services/ EF Core + AutoMapper implementation
{Entity}Controller.cs Controllers/ REST API with Swagger + Scalar annotations
{Entity}MappingProfile.cs Mappers/ AutoMapper profile
Program.cs / App bootstrap: Identity, DbContext, AutoMapper, Scrutor, Scalar
AppDbContext.cs Data/ EF Core context with DbSet<T>

Shared base files (once):

File Description
IGenericService.cs Generic CRUD interface
GenericService.cs Generic EF Core implementation
GenericController.cs Generic REST controller
PaginatedResult.cs Pagination DTO + extension
PaginateQuery.cs Query parameters: page, rows

Clean Architecture maps the same files into namespace‑aware paths:
Domain/, Application/, Infrastructure/, API/.

Laravel PHP

File Path Description
{Entity}.php app/Models/ Eloquent model with #[OA\Schema] annotations
{Entity}Controller.php app/Controllers/ Full CRUD with #[OA\Get/Post/Put/Delete]
{Entity}Service.php app/Services/ Pagination, CRUD, FK & enum filters, validation rules
{Enum}.php app/Static/ PHP 8.1+ backed enum with #[OA\Schema]
Controller.php app/Controllers/ Base controller with ok(), notFound() + shared OA schemas
*_create_*_table.php database/migrations/ Schema migration with FK cascades
api.php routes/ All RESTful routes including FK & enum filter endpoints

🔗 Auto‑Generated Endpoints

For a Product table with FK owner:User and enum status:Status:

C#

Method Route Description
GET /api/Product Paginated list (search, filter, page, rows)
GET /api/Product/{id} Single item by ID
GET /api/Product/user/{ownerId} Paginated list filtered by User
GET /api/Product/status/{status} Paginated list filtered by Status
POST /api/Product Create
PUT /api/Product/{id} Update
DELETE /api/Product/{id} Delete

PHP

Method Route Description
GET /api/product Paginated list
GET /api/product/{id} Single item
GET /api/product/user/{ownerId} Filtered by User
GET /api/product/status/{status} Filtered by Status
POST /api/product/create Create
PUT /api/product/update/{id} Update
DELETE /api/product/delete/{id} Delete

📁 Project Structure

apistarterkit/
├── main.py                    # CLI entry point
├── storm.config.json          # Project config (auto‑generated)
├── schema.storm               # Your data model (edit this!)
├── requirements.txt           # Python deps
│
├── src/                       # Core engine
│   ├── interpreter.py         # Code generator (C# + PHP)
│   ├── parser.py              # Recursive‑descent parser
│   ├── tokenizer.py           # Lexer
│   ├── ast.py                 # AST node types
│   ├── enum.py                # Enum AST handler
│   ├── table.py               # Table AST handler
│   ├── column.py              # Column type system
│   ├── template.py            # Template enum
│   ├── error_handler.py       # Formatted error reporting
│   ├── keyword.py             # Language keywords
│   ├── tok_type.py            # Token type enum
│   ├── tok.py                 # Token class
│   ├── pos.py                 # Position tracking
│   ├── generic_controller_csharp.py
│   ├── generic_service_csharp.py
│   ├── generic_mapper_csharp.py
│   ├── generic_pagination_csharp.py
│   └── generic_query_chsarp.py
│
├── tests/                     # Test suite (148 tests)
│   ├── conftest.py
│   ├── test_codegen.py        # Template output tests (70)
│   ├── test_parser.py         # Parser correctness (33)
│   ├── test_tokenizer.py      # Lexer correctness (26)
│   ├── test_error_handler.py  # Error formatting (5)
│   └── test_integration.py    # End‑to‑end parse (7)
│
└── pyvenv/                    # Python virtual environment

📦 Dependencies

C# (.NET)

Auto‑installed during --init:

Package Purpose
Microsoft.EntityFrameworkCore ORM
Microsoft.EntityFrameworkCore.SqlServer SQL Server provider
Microsoft.EntityFrameworkCore.Design Migrations
Microsoft.AspNetCore.Identity.EntityFrameworkCore ASP.NET Identity
AutoMapper Object mapping
Scrutor Assembly scanning / DI
Scalar.AspNetCore OpenAPI UI

PHP (Laravel)

Auto‑installed during --init:

Package Purpose
laravel/framework Core framework (^13.0)
zircote/swagger-php OpenAPI attribute annotations
spatie/laravel-query-builder Eloquent query builder

✅ Requirements

Dependency Version Required For
Python 3.10+ CLI runtime (all templates)
.NET SDK 8.0+ dotnet-csharp, dotnet-csharp-clean-architecture
EF Core CLI dotnet-ef dotnet-csharp, dotnet-csharp-clean-architecture
PHP 8.5+ laravel-php
Composer laravel-php

🧪 Testing

# Full suite (148 tests)
python -m pytest tests/ -q

# Code‑generation only
python -m pytest tests/test_codegen.py -v

# With coverage
python -m pytest tests/ --cov=src

⚙️ Workflow

flowchart LR
    A["<b>schema.storm</b><br/>Declarative schema"] --> B("<b>main.py</b><br/>Storm CLI")
    B --> C["<b>Parser</b><br/>AST + validation"]
    C --> D["<b>Interpreter</b><br/>Dependency graph"]
    D --> E{Template}
    E -->|dotnet-csharp| F["<b>C#/.NET</b><br/>Models, DTOs, Services<br/>Controllers, Mappers<br/>DbContext, Program.cs"]
    E -->|clean-arch| G["<b>C# Clean Arch</b><br/>Domain / Application<br/>Infrastructure / API"]
    E -->|laravel-php| H["<b>PHP / Laravel</b><br/>Models + OA Schemas<br/>Controllers + OA Routes<br/>Services, Migrations<br/>Routes"]

📄 License

MIT — see LICENSE.

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

storm_cli-1.0.0.tar.gz (49.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

storm_cli-1.0.0-py3-none-any.whl (39.9 kB view details)

Uploaded Python 3

File details

Details for the file storm_cli-1.0.0.tar.gz.

File metadata

  • Download URL: storm_cli-1.0.0.tar.gz
  • Upload date:
  • Size: 49.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for storm_cli-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a3ebf522febfe35d1a6deeecf6a1c1e9f6627cd421e8539acf225a56d3f7ce0d
MD5 9ff9872619a9f87b50f3757fdaf7ff52
BLAKE2b-256 5763e4bd50248445463d7abe8c5051ecfaf264402dad1c5212c25bbea54e82b1

See more details on using hashes here.

File details

Details for the file storm_cli-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: storm_cli-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 39.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for storm_cli-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1d849986a99eceb27c28c8ff5bd6771dff10341d6a50558397ba6a17191b0915
MD5 db2bb9ee45eb1774556bdb60b149333b
BLAKE2b-256 d5cc7e2c3c6e8ee2373ce72104806fbd47c715515e14c1ead76ec1d3d4a94e87

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page