Skip to main content

MyPy to TS generator

Project description

Myts

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

-- If you're somehow reading this right now, it's not on PyPI yet, working on it.

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 py changes and auto generate ts
  • Export enum literal references preserved. I.e. myvar: Literal[MyEnum.VAL] should export as myvar: 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_export params to override naming and module grouping
  • Name overwriting using meta class on MytsType or params to myts_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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

myts-0.1.0.tar.gz (13.0 kB view details)

Uploaded Source

Built Distribution

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

myts-0.1.0-py3-none-any.whl (15.0 kB view details)

Uploaded Python 3

File details

Details for the file myts-0.1.0.tar.gz.

File metadata

  • Download URL: myts-0.1.0.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

Hashes for myts-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3da6a64bb27236e15895075305e4d9f82d2a68618cdb4db014484ab4b069cb34
MD5 0a51cdb12b081564cd4c28311a4703e4
BLAKE2b-256 c6f646d5f87f3d63be2fc0a31ab23ba3908a0a36b4af7e4220d3603a8b8e0880

See more details on using hashes here.

File details

Details for the file myts-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: myts-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 15.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for myts-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6016154e8126fe53ea65a28f8dc698e7aeb0a21c98ed66dce96f6f3ee8038457
MD5 badf3d409cf47fbe94b35cff1030413d
BLAKE2b-256 c28d050c943f7e9e481d7b6799a790ef7cbc0889f82917bce47fbd830ef901cf

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