Skip to content

Commit

Permalink
add github pipeline & pre-commit checks
Browse files Browse the repository at this point in the history
  • Loading branch information
xnuinside committed Jan 7, 2022
1 parent ad98961 commit b928e84
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 50 deletions.
61 changes: 57 additions & 4 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ classifiers = [

[tool.poetry.dependencies]
python = "^3.8"
table-meta = "^0.2.1"
table-meta = "0.2.2"
jinja2 = "^3.0.3"

[tool.poetry.dev-dependencies]
Expand All @@ -23,6 +23,7 @@ m2r2 = "^0.3.2"
twine = "^3.7.1"
pre-commit = "^2.16.0"
py-models-parser = "^0.6.0"
flake8 = "^4.0.1"

[build-system]
requires = ["poetry>=0.12"]
Expand Down
3 changes: 1 addition & 2 deletions simple_ddl_generator/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from simple_ddl_generator.core import DDLGenerator


__all__ = ['DDLGenerator']
__all__ = ["DDLGenerator"]
26 changes: 15 additions & 11 deletions simple_ddl_generator/core.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
from table_meta import ddl_to_meta, models_to_meta, TableMeta
from typing import Dict

from table_meta import TableMeta, ddl_to_meta, models_to_meta

from simple_ddl_generator.generator import Generator
from simple_ddl_generator.models_data import prepare_models_data


class DDLGenerator:

def __init__(self, data: Dict, dialect: str = 'sql') -> None:
def __init__(self, data: Dict, dialect: str = "sql") -> None:
self.data = data
self.ddl_output = None
self.dialect = dialect

def convert_to_table_meta(self):
print(self.data, 'DATAAA')
if not isinstance(self.data, dict) or not isinstance(self.data['tables'][0], TableMeta):
if isinstance(self.data, dict) and not "attrs" in self.data['tables'][0]:

if not isinstance(self.data, dict) or not isinstance(
self.data["tables"][0], TableMeta
):
if isinstance(self.data, dict) and "attrs" not in self.data["tables"][0]:
self.prepared_data = ddl_to_meta(self.data)
else:
self.prepare_models_data()
Expand All @@ -26,13 +30,13 @@ def prepare_models_data(self):
def generate(self) -> str:
self.convert_to_table_meta()
self.generate_ddl()

return self.ddl_output

def to_file(self, file_name) -> None:
""" saves ddl to file """
"""saves ddl to file"""
self.generate()
with open(file_name, 'w+') as target_file:
with open(file_name, "w+") as target_file:
target_file.write(self.ddl_output)

def generate_ddl(self) -> str:
Expand Down
25 changes: 15 additions & 10 deletions simple_ddl_generator/generator.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
import pathlib
from table_meta.model import TableMeta

from jinja2 import Environment, FileSystemLoader
from table_meta.model import TableMeta

templates_dir = pathlib.Path(__file__).parents[0] / 'templates'
templates_dir = pathlib.Path(__file__).parents[0] / "templates"

jinja2_env = Environment(loader=FileSystemLoader(templates_dir))


hql_table_properties = ['location', 'row_format', 'fields_terminated_by',
'lines_terminated_by', 'map_keys_terminated_by', 'collection_items_terminated_by', 'stored_as']
hql_table_properties = [
"location",
"row_format",
"fields_terminated_by",
"lines_terminated_by",
"map_keys_terminated_by",
"collection_items_terminated_by",
"stored_as",
]


class Generator:

def __init__(self, data: TableMeta, dialect: str) -> None:
self.data = data
self.dialect = dialect

def render_template(self) -> str:
template = jinja2_env.get_template('common.jinja2')
template = jinja2_env.get_template("common.jinja2")

return template.render(
properties_as_is=hql_table_properties,
**self.data)
return template.render(properties_as_is=hql_table_properties, **self.data)
7 changes: 4 additions & 3 deletions simple_ddl_generator/models_data.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from typing import Dict

from simple_ddl_generator.type_converter import prepare_type


def default_cleaner(default_value: str):
if default_value:
if 'datetime.' in default_value:
default_value = default_value.split('datetime.')[-1]
if "datetime." in default_value:
default_value = default_value.split("datetime.")[-1]
return default_value


Expand All @@ -14,4 +15,4 @@ def prepare_models_data(data: Dict):
for column in table.columns:
column.type = prepare_type(column.type)
column.default = default_cleaner(column.default)
return data
return data
22 changes: 11 additions & 11 deletions simple_ddl_generator/type_converter.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from typing import Dict
from table_meta.model import Column

uuid_types = ("uuid", "uuid4", "uuid1")
arrays_types = ("list", "tuple", "set", )
arrays_types = (
"list",
"tuple",
"set",
)

string_types = (
"str",
Expand All @@ -15,7 +18,7 @@
"String",
)

text_types = ("text")
text_types = "text"
datetime_types = (
"time",
"datetime.datetime",
Expand All @@ -37,10 +40,7 @@

boolean_types = ("boolean", "bool")

timestamp_types = (
"timestamp",
"datetime.time"
)
timestamp_types = ("timestamp", "datetime.time")
datetime_types = (
"DATETIME",
"DATE",
Expand All @@ -61,9 +61,9 @@
jsonb_types: "JSONB",
uuid_types: "UUID",
arrays_types: "ARRAY",

}


def populate_types_mapping(mapper: Dict) -> Dict:
types_mapping = {}
for type_group, value in mapper.items():
Expand All @@ -76,11 +76,11 @@ def prepare_type(_type: str) -> str:
if "Optional" in _type:
# python Optional type
_type = _type.split("Optional[")[1].replace("]", "")

column_data_type = _type.split("[")[0]

for type_collection, mapped_value in models_types_mapping.items():
if column_data_type.lower() in type_collection:
return mapped_value

return column_data_type
6 changes: 3 additions & 3 deletions tests/test_py_models_parser_output.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from simple_ddl_generator import DDLGenerator

from py_models_parser import parse

from simple_ddl_generator import DDLGenerator


def test_ddl_from_pydantic_model():
model_from = """class Material(BaseModel):
Expand All @@ -26,4 +26,4 @@ def test_ddl_from_pydantic_model():
additional_properties JSON,
created_at DATETIME DEFAULT now(),
updated_at DATETIME);"""
assert expected == g.result
assert expected == g.result
10 changes: 5 additions & 5 deletions tests/test_simple_ddl_generator.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from simple_ddl_generator import DDLGenerator
from simple_ddl_parser import DDLParser

from simple_ddl_generator import DDLGenerator


def test_simple_generation():
expected = 'CREATE TABLE "new_table";'

ddl = "create table new_table;"
data = DDLParser(ddl).run(group_by_type=True, output_mode="bigquery")
g = DDLGenerator(data)
Expand Down Expand Up @@ -48,7 +49,6 @@ def test_partitioned_by():
assert g.result == expected



def test_hql_several_more_properties():
ddl = """CREATE TABLE IF NOT EXISTS default.salesorderdetail(
SalesOrderID int,
Expand Down Expand Up @@ -84,5 +84,5 @@ def test_hql_several_more_properties():
MAP KEYS TERMINATED BY '\003'
COLLECTION ITEMS TERMINATED BY '\002'
STORED AS TEXTFILE;"""
assert expected == g.result

assert expected == g.result

0 comments on commit b928e84

Please sign in to comment.