Skip to content

Commit

Permalink
readme & publish to pypi
Browse files Browse the repository at this point in the history
  • Loading branch information
mytestopia committed Sep 12, 2024
1 parent 34423db commit a563627
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 7 deletions.
29 changes: 29 additions & 0 deletions .github/workflows/pypi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: PyPi

on:
push:
tags:
- "v*.*.*"

jobs:
publish_pypi:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.10"
- name: Install
run: pip3 install --quiet --upgrade setuptools wheel twine
- name: Build
run: python3 setup.py sdist bdist_wheel
- name: Publish
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_TOKEN }}
TWINE_REPOSITORY_URL: https://test.pypi.org/legacy/
run: twine upload dist/*

5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
.PHONY: install
install:
pip3 install --quiet --upgrade pip
pip3 install --quiet -r requirements.txt -r requirements-dev.txt

.PHONY: lint
lint:
python3 -m flake8 && python3 -m isort -m VERTICAL_HANGING_INDENT --check-only .
Expand Down
132 changes: 126 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,132 @@
# d42-typing

Local install:
d42-typing is a Python package designed to enhance type-checking capabilities within the d42 ecosystem.
This package introduces generated type definitions that make it easier to work with D42 schemas by
providing a more structured and robust type-checking mechanism.

- [Features](#features)
- [How it works](#how-it-works)
- [Example](#example)
- [Scalar schema](#scalar-schema)
- [Dict schema](#dict-schema)
- [Working type hints for PyCharm](#working-type-hints-for-pycharm)
- [Installation & Usage](#installation--usage)
- [How to configurate type auto-generation in PyCharm](#how-to-configurate-type-auto-generation-in-pycharm)


## Features

- Type Definitions: Provides comprehensive type definitions for various entities within Device42.
- Improved Type Checking: Enhances code safety and reliability by utilizing Python's type hints.

## How it works
- Generates Python type hints from d42 schemas.
- Creates `.pyi` files for each schema file in a specified folder (or default).
- Provides overloads for the `fake` method from d42 library.



## Example

#### Scalar schema
```python
from d42 import schema

# --- scalar.py
ValueSchema = schema.int | schema.float

# --- scalar.pyi
from ... import ...

ValueSchema: Union[IntSchema, FloatSchema]

# --- blahblah.pyi
from ... import ...

@overload
def fake(schema: ValueSchema) -> Union[int, float]:
pass
```
#### Dict schema
```python
# --- dict.py
from d42 import schema

DictSchema = schema.dict({
'id': schema.int,
'name': schema.str('default_name') | schema.str('custom_name'),
'phone': schema.str | schema.none,
})

# --- dict.pyi
from ... import ...

class _D42MetaUserSchema(type):

@overload
def __getitem__(cls, arg: Literal['id']) -> IntSchema:
pass

@overload
def __getitem__(cls, arg: Literal['name']) -> StrSchema:
pass

@overload
def __getitem__(cls, arg: Literal['phone']) -> Union[StrSchema, NoneSchema]:
pass

def __mod__(self, other):
pass

def __add__(self, other):
pass

class UserSchema(metaclass=_D42MetaUserSchema):

class type(TypedDict, total=False):
id: IntSchema.type
name: StrSchema.type
phone: Union[StrSchema.type, NoneSchema.type]

# --- blahblah.pyi
from typing import overload
from typing import Type
from _tests.schemas.test import UserSchema

@overload
def fake(schema: Type[UserSchema]) -> UserSchema.type:
pass

```
pip install -e .

#### Working type hints for PyCharm

<img src="assets/type_hints.png" alt="drawing" width="400"/>

## Installation & Usage

To install `d42-typing`, use the following command:

```sh
pip install d42-typing
```

Run
To generate type hints, run the following command:

```sh
d42-typing --path-to-schemas scenarios/schemas -a -v
# d42-typing --help
```
d42-typing --help
d42-typing --path-to-schemas _tests/schemas/new
```

### How to configurate type auto-generation in PyCharm

1. Set FileWatcher in PyCharm for auto-generating stubs

- Go to Pycharm → Settings → Tools → File Watchers
- Set the scope pattern: `file[project]:packages/e2e/schemas/*.py`

<img src="assets/file_watcher_1.png" alt="drawing" width="400"/> <img src="assets/file_watcher_2.png" alt="drawing" width="400"/>

2. Hide .pyi files (if needed):

Go to Settings → Editor → File Types → Ignored Files and Folders tab
Binary file added assets/file_watcher_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/file_watcher_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/type_hints.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 11 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,22 @@ def find_dev_required():
name="d42-typing",
version="0.0.2",
description=".pyi typing stubs generation for d42 schemas",
url="https://github.com/mytestopia/d42-typing",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",
install_requires=find_required(),
tests_require=find_dev_required(),
entry_points={
'console_scripts': ['d42-typing=app.main:main']
},
author="Anna",
author_email="testopia13@gmail.com",
packages=find_packages(),
packages=find_packages(exclude=["tests"]),
python_requires='>=3.10',
license="Apache-2.0",
classifiers=[
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
],
)

0 comments on commit a563627

Please sign in to comment.