Parser for Different Python Models (pure Python classes, Pydantic, Enums, ORMs: DjangoORM, Tortoise, SqlAlchemy, GinoORM, PonyORM, Pydal) to extract information about columns(attrs), model, table args,etc in one format.
MIT License
It's as second Parser that done by me, first is a https://github.com/xnuinside/simple-ddl-parser for SQL DDL with different dialects.
Py-Models-Parser can parse & extract information from models & table definitions:
Number of supported models will be increased, check 'TODO' section, if you want to have support of different models types - please open the issue.
Py-Models-Parser written with PEG parser and it's python implementation - parsimonious. It's pretty new and I did not cover all possible test cases, so if you will have an issue - please just open an issue in this case with example, I will fix it as soon as possible.
Py-Models-Parser take as input different Python code with Models and provide output in standard form:
[
'name': 'ModelName',
'parents': ['BaseModel'], # class parents that defined in (), for example: `class MaterialType(str, Enum):` parents - str, Enum
'attrs':
{
'type': 'integer',
'name': 'attr_name',
'default': 'default_value',
'properties': {
...
}
},
'properties': {
'table_name': ...
}
]
For ORM models 'attrs' contains Columns of course.
3 keys - 'type', 'name', 'default' exists in parse result 'attrs' of all Models 'properties' key contains additional information for attribut or column depend on Model type, for example, in ORM models it can contains 'foreign_key' key if this column used ForeignKey, or 'server_default' if it is a SqlAlchemy model or GinoORM.
Model level 'properties' contains information relative to model, for example, if it ORM model - table_name
NOTE: it's is a text parser, so it don't import or load your code, parser work with source code as text, not objects in Python. So to run parser you DO NOT NEED install dependencies for models, that you tries to parse - only models.
pip install py-models-parser
Library detect automaticaly that type of models you tries to parse. You can check a lot of examples in test/ folder on the GitHub
from py_models_parser import parse
models_str = """from gino import Gino
db = Gino()
class OrderItems(db.Model):
__tablename__ = 'order_items'
product_no = db.Column(db.Integer(), db.ForeignKey('products.product_no'), ondelete="RESTRICT", primary_key=True)
order_id = db.Column(db.Integer(), db.ForeignKey('orders.order_id'), ondelete="CASCADE", primary_key=True)
type = db.Column(db.Integer(), db.ForeignKey('types.type_id'), ondelete="RESTRICT", onupdate="CASCADE")
"""
result = parse(models_str)
from py_models_parser import parse_from_file
file_path = "path/to/your/models.py"
# for example: tests/data/dataclass_defaults.py
result = parse_from_file(file_path)
pmp path_to_models.py
# for example: pmp tests/data/dataclass_defaults.py
Output from cli can be dumped in 'output_models.json' file - use flag '-d' '--dump' if you want to change target file name, provide it after argument like '-d target_file.json'
# example how to dump output from cli
pmp path_to_models.py -d target_file.json
You can find a lot of output examples in tests - https://github.com/xnuinside/py-models-parser/tree/main/tests
For model from point 1 (above) library will produce the result:
[
{
"attrs": [
{
"default": None,
"name": "product_no",
"properties": {
"foreign_key": "'products.product_no'",
"ondelete": '"RESTRICT"',
"primary_key": "True",
},
"type": "db.Integer()",
},
{
"default": None,
"name": "order_id",
"properties": {
"foreign_key": "'orders.order_id'",
"ondelete": '"CASCADE"',
"primary_key": "True",
},
"type": "db.Integer()",
},
{
"default": None,
"name": "type",
"properties": {
"foreign_key": "'types.type_id'",
"ondelete": '"RESTRICT"',
"onupdate": '"CASCADE"',
},
"type": "db.Integer()",
},
],
"name": "OrderItems",
"parents": ["db.Model"],
"properties": {"table_name": "'order_items'"},
}
]
v0.7.0 Updates:
v0.6.0 Features:
v0.5.1 Fixes:
v0.5.0
v0.4.0
*&^%$#!±~
§<>` now does not cause any errorsv0.3.0
pmp
command with args -d, --dumpv0.2.0
v0.1.1