MyPy to TS generator
Project description
Warning: v0.1.0 this is not production ready
Converts MyPy types to TS types. Uses MyPy's internal api to gather type info.
Call as a cli, optionally directory watchable. Or import and invoke directly from your Python code.
Installation
pip
pip install myts
poetry
poetry add myts
Usage
In your code
Myts looks for any classes that inherit from MytsType to start building its dependency graph.
These by default will be included in the output TS.
Alternatively you can use the myts_export decorator on Enums and TypedDicts and classes that you would like to have exported without needing to be referenced by a MytsType class.
Note: Right now you cannot alias either of these, in a future version that will be okay.
from enum import IntEnum
from myts import MytsType, myts_export
@myts_export
class Fruit(IntEnum): # Will be in the TS output
apple = 0
orange = 1
banana = 2
class Vegetable(IntEnum): # Will not be, because it is not referenced ever and is not decorated with myts_export
carrot = 0
celery = 1
lettuce = 2
class Drink(IntEnum): # Will be in the output, reference by a MytsType below
water = 0
milk = 1
soda = 2
class BeveragePreference(MytsType): # Will export and will also export the Drink enum
drink: Drink
person: Person
CLI
To see all cli options run
myts -h
Simplest example
To generate the .ts files.
cd <myprojectroot>
myts --output your/output/dir/
A more complex example
Uses trim-root to remove a common py module path from the output.
Uses watch to automatically update generated ts when the py changes.
cd <myprojectroot>
myts --output your/output/dir/ -w
Py
import pathlib
import myts
config = myts.MytsConfiguration(
root=pathlib.Path('someprojdir'), # defaults to os.cwd()
output=pathlib.Path('someoutputdir'),
group='module', # 'single' or 'module' - single will output a single .ts file, 'module' will output files matching the `py` files they come from
preserve_structure=True, # No effect if group == 'single', otherwise determines output structure. If true folders will be created to match py paths
dry_run=False, # If true, just prints the paths of output files that would be written
output_file_name='types.ts', # Only used if group == 'single', determines the name of the single file generated
trim_root="myapp.some.path" # When preserving structure, use this to trim a common root
)
myts.export(config)
Roadmap
- Export to multiple files, flat folder or matching py module structure
- Support generics
- Watch for
pychanges and auto generatets - Export enum literal references preserved. I.e.
myvar: Literal[MyEnum.VAL]should export asmyvar: MyEnum.VAL - Config options for
- [Py api] override output names of vars and files
- Variable and type naming options (camelCase, PascalCase, snake_case)
- Interface vs type output
-
myts_exportparams to override naming and module grouping - Name overwriting using meta class on
MytsTypeor params tomyts_export
Example of functionality
Python (Mypy)
from myts import MytsType, myts_export
@myts_export # Flags for export even though it is never referenced
class MyNotReferencedEnum(StrEnum):
A = "🍁"
B = "🐝"
C = "👀"
class SomeEnum(IntEnum): # Automatically exported due to being reference by OtherThing
A = 5
B = 6
C = 12
class MyTypedDict[T](TypedDict): # Generics supported
a: NotRequired[T]
b: Literal["one", "two", "three"]
class Example(MytsType): # Inherits MytsType -- will be exported
something: str
other_thing: "OtherThing"
@dataclass
class OtherThing(MytsType):
thing: SomeEnum
info: MyTypedDict
Output (Typescript)
export enum MyNotReferencedEnum {
A = "🍁",
B = "🐝",
C = "👀",
}
export enum SomeEnum {
A = 5,
B = 6,
C = 12,
}
export type MyTypedDict<T> = {
a?: T;
b: "one" | "two" | "three";
};
export type Example = {
something: string;
otherThing: OtherThing;
};
export type OtherThing = {
thing: SomeEnum;
info: MyTypedDict;
};
Project details
Release history Release notifications | RSS feed
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 myts-0.1.1.tar.gz.
File metadata
- Download URL: myts-0.1.1.tar.gz
- Upload date:
- Size: 13.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b10814175ab6f9f533b0ccb8497981d364721da9ad08ac36f56585072ed3ccd2
|
|
| MD5 |
699fa7c2ece887959dbb63ecf10dff90
|
|
| BLAKE2b-256 |
2605294d3ae9b30f4efb6b475d3ce49c358c24592a176e9f928b20b3d3ffb1ed
|
File details
Details for the file myts-0.1.1-py3-none-any.whl.
File metadata
- Download URL: myts-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f2f7a809b5b1f7c1933820f0f4d531740b191b228ac867065a8c926851a4ed8
|
|
| MD5 |
41807ac254adc1463e4d7862ebb0a1d8
|
|
| BLAKE2b-256 |
fe90a476ac866257057ce40dd8fedaf4bb0c2adada16d28feb54854a66ed2af1
|