diff --git a/poetry.lock b/poetry.lock index c44894c..c29e566 100644 --- a/poetry.lock +++ b/poetry.lock @@ -130,6 +130,19 @@ version = "3.4.2" docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] +[[package]] +category = "dev" +description = "the modular source code checker: pep8 pyflakes and co" +name = "flake8" +optional = false +python-versions = ">=3.6" +version = "4.0.1" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + [[package]] category = "dev" description = "File identification library for Python" @@ -231,6 +244,14 @@ optional = false python-versions = ">=3.6" version = "2.0.1" +[[package]] +category = "dev" +description = "McCabe checker, plugin for flake8" +name = "mccabe" +optional = false +python-versions = "*" +version = "0.6.1" + [[package]] category = "dev" description = "The fastest markdown parser in pure Python" @@ -354,6 +375,14 @@ version = "0.6.0" [package.dependencies] parsimonious = ">=0.8.1,<0.9.0" +[[package]] +category = "dev" +description = "Python style guide checker" +name = "pycodestyle" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.8.0" + [[package]] category = "dev" description = "C parser in Python" @@ -378,6 +407,14 @@ typing-extensions = ">=3.7.4.3" dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] +[[package]] +category = "dev" +description = "passive checker of Python programs" +name = "pyflakes" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.4.0" + [[package]] category = "dev" description = "Pygments is a syntax highlighting package written in Python." @@ -536,7 +573,7 @@ description = "Universal class that created to be a middleware, universal mappin name = "table-meta" optional = false python-versions = ">=3.6.2,<4.0" -version = "0.2.1" +version = "0.2.2" [package.dependencies] pydantic = ">=1.8.2,<2.0.0" @@ -652,7 +689,7 @@ docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] -content-hash = "e17e7b1fc05217f4a332539d8946e45fe81522de4d33fd7dadeb1d9e4ae0ff6a" +content-hash = "2e0143985b8c865155302730f4f9a25b7ad8825b9b9d845a52db0c2ecc1be54b" lock-version = "1.0" python-versions = "^3.8" @@ -771,6 +808,10 @@ filelock = [ {file = "filelock-3.4.2-py3-none-any.whl", hash = "sha256:cf0fc6a2f8d26bd900f19bf33915ca70ba4dd8c56903eeb14e1e7a2fd7590146"}, {file = "filelock-3.4.2.tar.gz", hash = "sha256:38b4f4c989f9d06d44524df1b24bd19e167d851f19b50bf3e3559952dddc5b80"}, ] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] identify = [ {file = "identify-2.4.1-py2.py3-none-any.whl", hash = "sha256:0192893ff68b03d37fed553e261d4a22f94ea974093aefb33b29df2ff35fed3c"}, {file = "identify-2.4.1.tar.gz", hash = "sha256:64d4885e539f505dd8ffb5e93c142a1db45480452b1594cacd3e91dca9a984e9"}, @@ -835,6 +876,10 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] mistune = [ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, @@ -882,6 +927,10 @@ py-models-parser = [ {file = "py-models-parser-0.6.0.tar.gz", hash = "sha256:3dffed9ee79c9d7d62de1dfd939122bc6c48fc314c839c79d94d835f0d2633ae"}, {file = "py_models_parser-0.6.0-py3-none-any.whl", hash = "sha256:0b6d0996ad56aa3fa98fe8ec2be74980e444959be84413ce855362f1573b8dfb"}, ] +pycodestyle = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] pycparser = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, @@ -923,6 +972,10 @@ pydantic = [ {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, ] +pyflakes = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] pygments = [ {file = "Pygments-2.11.1-py3-none-any.whl", hash = "sha256:9135c1af61eec0f650cd1ea1ed8ce298e54d56bcd8cc2ef46edd7702c171337c"}, {file = "Pygments-2.11.1.tar.gz", hash = "sha256:59b895e326f0fb0d733fd28c6839bd18ad0687ba20efc26d4277fd1d30b971f4"}, @@ -1003,8 +1056,8 @@ six = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] table-meta = [ - {file = "table-meta-0.2.1.tar.gz", hash = "sha256:baaf91d5a483db05258f280cab46c5b52b1207aea3fd2f5f197cd6732f55d79a"}, - {file = "table_meta-0.2.1-py3-none-any.whl", hash = "sha256:7749a8ef93ae581f2a018cb195b6b4b934fe4a80602f8339191ebcda11d1c2eb"}, + {file = "table-meta-0.2.2.tar.gz", hash = "sha256:c570cb3cffa63a6f7ef29611f7c979dbdf26484ae607a67511a4b1591cac5c7f"}, + {file = "table_meta-0.2.2-py3-none-any.whl", hash = "sha256:8830cfcd85e3fa029babac71136e3bdcbadbdb4e980d198580796068600d9a6c"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/pyproject.toml b/pyproject.toml index 84531c1..e791d1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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] @@ -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"] diff --git a/simple_ddl_generator/__init__.py b/simple_ddl_generator/__init__.py index 01206a9..35ef1c3 100644 --- a/simple_ddl_generator/__init__.py +++ b/simple_ddl_generator/__init__.py @@ -1,4 +1,3 @@ from simple_ddl_generator.core import DDLGenerator - -__all__ = ['DDLGenerator'] +__all__ = ["DDLGenerator"] diff --git a/simple_ddl_generator/core.py b/simple_ddl_generator/core.py index 3e59e2d..3686cd5 100644 --- a/simple_ddl_generator/core.py +++ b/simple_ddl_generator/core.py @@ -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() @@ -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: diff --git a/simple_ddl_generator/generator.py b/simple_ddl_generator/generator.py index aab54a8..7807a6f 100644 --- a/simple_ddl_generator/generator.py +++ b/simple_ddl_generator/generator.py @@ -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) diff --git a/simple_ddl_generator/models_data.py b/simple_ddl_generator/models_data.py index 42ff8b8..0b7f5e4 100644 --- a/simple_ddl_generator/models_data.py +++ b/simple_ddl_generator/models_data.py @@ -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 @@ -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 \ No newline at end of file + return data diff --git a/simple_ddl_generator/type_converter.py b/simple_ddl_generator/type_converter.py index 9e2f226..063b79b 100644 --- a/simple_ddl_generator/type_converter.py +++ b/simple_ddl_generator/type_converter.py @@ -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", @@ -15,7 +18,7 @@ "String", ) -text_types = ("text") +text_types = "text" datetime_types = ( "time", "datetime.datetime", @@ -37,10 +40,7 @@ boolean_types = ("boolean", "bool") -timestamp_types = ( - "timestamp", - "datetime.time" -) +timestamp_types = ("timestamp", "datetime.time") datetime_types = ( "DATETIME", "DATE", @@ -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(): @@ -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 diff --git a/tests/test_py_models_parser_output.py b/tests/test_py_models_parser_output.py index d32daf5..39d91e9 100644 --- a/tests/test_py_models_parser_output.py +++ b/tests/test_py_models_parser_output.py @@ -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): @@ -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 \ No newline at end of file + assert expected == g.result diff --git a/tests/test_simple_ddl_generator.py b/tests/test_simple_ddl_generator.py index 4a7f2b4..eeb8221 100644 --- a/tests/test_simple_ddl_generator.py +++ b/tests/test_simple_ddl_generator.py @@ -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) @@ -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, @@ -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 \ No newline at end of file + + assert expected == g.result