From 9142ee174b2a0a923aa61e61c1fc9aad4677377f Mon Sep 17 00:00:00 2001 From: Paco Valdez Date: Wed, 16 Apr 2025 11:56:36 -0700 Subject: [PATCH 1/2] move tests --- tests/__init__.py | 0 tests/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 137 bytes tests/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 163 bytes .../e2e.cpython-310-pytest-7.4.0.pyc | Bin 0 -> 1557 bytes .../e2e.cpython-311-pytest-8.3.5.pyc | Bin 0 -> 3978 bytes .../test_e2e.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 1945 bytes tests/samples/cubeml/orders.yml | 34 +++++++ .../lkml/explores/orders_summary.model.lkml | 39 ++++++++ tests/samples/lkml/views/line_items.view.lkml | 90 ++++++++++++++++++ tests/samples/lkml/views/orders.view.lkml | 82 ++++++++++++++++ tests/samples/lkml/views/products.view.lkml | 52 ++++++++++ tests/test_e2e.py | 43 +++++++++ 12 files changed, 340 insertions(+) create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-310.pyc create mode 100644 tests/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/__pycache__/e2e.cpython-310-pytest-7.4.0.pyc create mode 100644 tests/__pycache__/e2e.cpython-311-pytest-8.3.5.pyc create mode 100644 tests/__pycache__/test_e2e.cpython-310-pytest-8.3.5.pyc create mode 100644 tests/samples/cubeml/orders.yml create mode 100644 tests/samples/lkml/explores/orders_summary.model.lkml create mode 100644 tests/samples/lkml/views/line_items.view.lkml create mode 100644 tests/samples/lkml/views/orders.view.lkml create mode 100644 tests/samples/lkml/views/products.view.lkml create mode 100644 tests/test_e2e.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/__init__.cpython-310.pyc b/tests/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecb9e511590a631884ffd5bf15b2ae29a1ab4652 GIT binary patch literal 137 zcmd1j<>g`k0^V=`(?RrO5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HHerR!OQL%nO zVsgHIa%obkeol67juDtul3H9+tREkrnU`4-AFo$Xd5gm)H$SB`C)EyQN--0VU||3N DkV74` literal 0 HcmV?d00001 diff --git a/tests/__pycache__/__init__.cpython-311.pyc b/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c4773a8794aaca9a2c66560e5ce7175030f146c GIT binary patch literal 163 zcmZ3^%ge<81pHCGX(0MBh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%S=DCIJKx) zzaTL=Uq87tDOEowJ2%G&ja8CbTvDtbAD@|*SrQ+wS5Wzj!zMRBr8Fniu80+A49KEl UejxFInURt40|SgGVg`x<0QHF_aR2}S literal 0 HcmV?d00001 diff --git a/tests/__pycache__/e2e.cpython-310-pytest-7.4.0.pyc b/tests/__pycache__/e2e.cpython-310-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1896fb06e17164cfb88776bdeb9d04b7c30528ac GIT binary patch literal 1557 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 b#Eb33i@UK-^ppgfcyu^qv`5D<_^kg2{p6(0 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_e2e.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_e2e.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f61354256c4065feeb178148180aaeb2451ffc56 GIT binary patch literal 1945 zcmZuyO>f&a7$zxNl4aSkoiuH+4;TZ6%~)rz`PgYG(hWr~TQ1A6RTn}v>BOyMd8FJV zhJ2}u-G%|X?6O0GUAAAb|H11{`vW`lknAND2gW)Hq~0&Sd_NviS-l=0cLR zm(re!(@7%K!0fU55McIUs12Betw2OL=HwNM9PU6|RELK`<&RFUJzy|gK6M~`7+=6p zKY)hgInGgzb5h_1$;pDu2}g6MAcZriih8kng8``Dvq*>Sxeva0jOjm2-)A^?lu ztp!kE(co(~-x|nTyb1ZYZX@0Sq#wqk4wv z8F3fCc1Nl+&hjpvZNC5EXed>VYjl62O@QR%Y6sHDaZN%&p}v zSb}i(5O7(KlO#J~)A48kYi2EjKZxOa_cOaM+1rCX+si%o_N|)4 zd%e310bypNty%x^HNJW0$-}R{?C?z3R61##4~{$evFN~A5QAKl2D4`HU?t$4GT@zV zTT<{T%>mG!%(5KLn-2CTXE~sq#ZtG}01{$SOynR-;gks-f|@;@j*{FQDmTf%Lg_n9 z9cR;oTT^zFWKZLSnWL+#OvOWCJm|(lTeML&ek5fk^*S475<+I?;Kt)P2aSY#3Q5mI zL`@B%s#$IizNUPdPBhIXVhoX8uPyUR)ls*usS?RhSM60XiSuJwGk$6&;?itumAPLs zrJtQu=F`ZxmFHq8TgC+*%Jz+`a>4fMg55um{0IzQ-|K$^xKRB`JjnXSN8f;L%TlJO zs&7jxwnT4orkj>gBXcj=yKD`7sPAB+xJgc_PXfH*&`Ohp`0Xp#^REc;FDWMQrI(br zmxKU~sr^#y{*NrYbV=LjVT6~ncMexBvfh99KY**wXSQ*S>3|vJPa!s@L&m Date: Wed, 16 Apr 2025 11:57:45 -0700 Subject: [PATCH 2/2] remove compiled files --- lkml2cube/tests/__init__.py | 0 lkml2cube/tests/samples/cubeml/orders.yml | 34 ------- .../lkml/explores/orders_summary.model.lkml | 39 -------- .../samples/lkml/views/line_items.view.lkml | 90 ------------------ .../tests/samples/lkml/views/orders.view.lkml | 82 ---------------- .../samples/lkml/views/products.view.lkml | 52 ---------- lkml2cube/tests/test_e2e.py | 43 --------- tests/__pycache__/__init__.cpython-310.pyc | Bin 137 -> 0 bytes tests/__pycache__/__init__.cpython-311.pyc | Bin 163 -> 0 bytes .../e2e.cpython-310-pytest-7.4.0.pyc | Bin 1557 -> 0 bytes .../e2e.cpython-311-pytest-8.3.5.pyc | Bin 3978 -> 0 bytes .../test_e2e.cpython-310-pytest-8.3.5.pyc | Bin 1945 -> 0 bytes 12 files changed, 340 deletions(-) delete mode 100644 lkml2cube/tests/__init__.py delete mode 100644 lkml2cube/tests/samples/cubeml/orders.yml delete mode 100644 lkml2cube/tests/samples/lkml/explores/orders_summary.model.lkml delete mode 100644 lkml2cube/tests/samples/lkml/views/line_items.view.lkml delete mode 100644 lkml2cube/tests/samples/lkml/views/orders.view.lkml delete mode 100644 lkml2cube/tests/samples/lkml/views/products.view.lkml delete mode 100644 lkml2cube/tests/test_e2e.py delete mode 100644 tests/__pycache__/__init__.cpython-310.pyc delete mode 100644 tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 tests/__pycache__/e2e.cpython-310-pytest-7.4.0.pyc delete mode 100644 tests/__pycache__/e2e.cpython-311-pytest-8.3.5.pyc delete mode 100644 tests/__pycache__/test_e2e.cpython-310-pytest-8.3.5.pyc diff --git a/lkml2cube/tests/__init__.py b/lkml2cube/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lkml2cube/tests/samples/cubeml/orders.yml b/lkml2cube/tests/samples/cubeml/orders.yml deleted file mode 100644 index 468abc1..0000000 --- a/lkml2cube/tests/samples/cubeml/orders.yml +++ /dev/null @@ -1,34 +0,0 @@ -cubes: -- description: Orders - dimensions: - - name: id - primary_key: true - sql: '{CUBE}."ID"' - type: number - - description: My description - name: item_id - sql: '{CUBE}.item_id' - title: Item ID - type: number - - name: order_status - sql: '{CUBE}."STATUS"' - type: string - - name: is_cancelled - sql: case {CUBE}."STATUS" when "CANCELLED" then true else false end - title: Is Cancelled - type: boolean - - name: created_at - sql: '{CUBE}."CREATED_AT"' - type: time - - name: completed_at - sql: '{CUBE}."COMPLETED_AT"' - type: time - joins: [] - measures: - - name: count - type: count - - name: order_count_distinct - sql: '{id}' - type: count_distinct_approx - name: orders - sql_table: '{{_user_attributes[''ecom_database'']}}.{{_user_attributes[''ecom_schema'']}}."ORDERS"' \ No newline at end of file diff --git a/lkml2cube/tests/samples/lkml/explores/orders_summary.model.lkml b/lkml2cube/tests/samples/lkml/explores/orders_summary.model.lkml deleted file mode 100644 index b3fce41..0000000 --- a/lkml2cube/tests/samples/lkml/explores/orders_summary.model.lkml +++ /dev/null @@ -1,39 +0,0 @@ -connection: "my_connection" - -include: "/views/*.view.lkml" # include all views in the views/ folder in this project -# include: "/**/*.view.lkml" # include all views in this project -# include: "/**/*.dashboard.lookml" # include a LookML dashboard called my_dashboard - - -explore: orders { - label: "Orders Summary" - - join: line_items { - relationship: one_to_many - sql_on: ${orders.id} = ${line_items.order_id} ;; - type: left_outer - } - - join: products { - relationship: many_to_one - sql_on: ${line_items.product_id} = ${products.id} ;; - type: left_outer - } - -} - -explore: line_items { - label: "Line Items Summary" - - join: orders { - relationship: many_to_one - sql_on: ${line_items.order_id} = ${orders.id} ;; - type: left_outer - } - - join: products { - relationship: many_to_one - sql_on: ${line_items.product_id} = ${products.id} ;; - type: left_outer - } -} diff --git a/lkml2cube/tests/samples/lkml/views/line_items.view.lkml b/lkml2cube/tests/samples/lkml/views/line_items.view.lkml deleted file mode 100644 index 4f3ff0e..0000000 --- a/lkml2cube/tests/samples/lkml/views/line_items.view.lkml +++ /dev/null @@ -1,90 +0,0 @@ -# The name of this view in Looker is "Line Items" -view: line_items { - view_label: "Line Items" - # The sql_table_name parameter indicates the underlying database table - # to be used for all fields in this view. - sql_table_name: {{_user_attributes['ecom_database']}}.{{_user_attributes['ecom_schema']}}."LINE_ITEMS" - ;; - # In order to join this view in an Explore, - # define primary_key: yes on a dimension that has no repeated values. - - dimension: id { - primary_key: yes - type: number - sql: ${TABLE}."ID" ;; - } - - # This table contains a foreign key to other tables. - # Joins are defined in explores - dimension: order_id { - hidden: yes - type: number - sql: ${TABLE}."ORDER_ID" ;; - } - - dimension: product_id { - hidden: yes - type: number - sql: ${TABLE}."PRODUCT_ID" ;; - } - - dimension: price { - type: number - sql: ${TABLE}."PRICE" ;; - } - - dimension: quantity { - label: "Quantity" - type: number - sql: ${TABLE}."QUANTITY" ;; - } - - # You can reference other dimensions while defining a dimension. - dimension: line_amount { - type: number - sql: ${quantity} * ${price};; - } - - dimension: quantity_bins { - type: tier - style: integer - bins: [0,10,50,100] - sql: ${quantity} ;; - } - - # A measure is a field that uses a SQL aggregate function. Here are defined sum and count - # measures for this view, but you can also add measures of many different aggregates. - - measure: total_quantity { - type: sum - sql: ${quantity} ;; - } - - measure: total_amount { - type: sum - sql: ${line_amount} ;; - } - - measure: count { - type: count - } - - - # Dates and timestamps can be represented in Looker using a dimension group of type: time. - # Looker converts dates and timestamps to the specified timeframes within the dimension group. - - dimension_group: created_at { - type: time - timeframes: [ - raw, - time, - date, - week, - month, - quarter, - year - ] - sql: ${TABLE}."CREATED_AT" ;; - } - -} \ No newline at end of file diff --git a/lkml2cube/tests/samples/lkml/views/orders.view.lkml b/lkml2cube/tests/samples/lkml/views/orders.view.lkml deleted file mode 100644 index 4f24a0c..0000000 --- a/lkml2cube/tests/samples/lkml/views/orders.view.lkml +++ /dev/null @@ -1,82 +0,0 @@ -# The name of this view in Looker is "Orders" -view: orders { - view_label: "Orders" - # The sql_table_name parameter indicates the underlying database table - # to be used for all fields in this view. - sql_table_name: {{_user_attributes['ecom_database']}}.{{_user_attributes['ecom_schema']}}."ORDERS" - ;; - # In order to join this view in an Explore, - # define primary_key: yes on a dimension that has no repeated values. - - dimension: id { - primary_key: yes - type: number - sql: ${TABLE}."ID" ;; - } - - dimension: item_id { - label: "Item ID" - description: "My description" - type: number - sql: ${TABLE}.item_id ;; - } - - # Here's what a typical dimension looks like in LookML. - # A dimension is a groupable field that can be used to filter query results. - # This dimension will be called "Order Status" in Explore. - - dimension: order_status { - type: string - sql: ${TABLE}."STATUS" ;; - } - - dimension: is_cancelled { - label: "Is Cancelled" - type: yesno - sql: case ${TABLE}."STATUS" when "CANCELLED" then true else false end ;; - } - - # A measure is a field that uses a SQL aggregate function. Here are defined count and count_distinct - # measures for this view, but you can also add measures of many different aggregates. - - measure: count { - type: count - } - - measure: order_count_distinct { - type: count_distinct - sql: ${id} ;; - } - - - # Dates and timestamps can be represented in Looker using a dimension group of type: time. - # Looker converts dates and timestamps to the specified timeframes within the dimension group. - - dimension_group: created_at { - type: time - timeframes: [ - raw, - time, - date, - week, - month, - quarter, - year - ] - sql: ${TABLE}."CREATED_AT" ;; - } - - dimension_group: completed_at { - type: time - timeframes: [ - raw, - time, - date, - week, - month, - quarter, - year - ] - sql: ${TABLE}."COMPLETED_AT" ;; - } -} \ No newline at end of file diff --git a/lkml2cube/tests/samples/lkml/views/products.view.lkml b/lkml2cube/tests/samples/lkml/views/products.view.lkml deleted file mode 100644 index aebde0f..0000000 --- a/lkml2cube/tests/samples/lkml/views/products.view.lkml +++ /dev/null @@ -1,52 +0,0 @@ -# The name of this view in Looker is "Products" -view: products { - view_label: "Products" - # The sql_table_name parameter indicates the underlying database table - # to be used for all fields in this view. - sql_table_name: {{_user_attributes['ecom_database']}}.{{_user_attributes['ecom_schema']}}."PRODUCTS" - ;; - # In order to join this view in an Explore, - # define primary_key: yes on a dimension that has no repeated values. - - dimension: id { - primary_key: yes - type: number - sql: ${TABLE}."ID" ;; - } - - # Here's what a typical dimension looks like in LookML. - # A dimension is a groupable field that can be used to filter query results. - # This dimension will be called "Product Category" in Explore. - - dimension: product_category { - type: string - sql: ${TABLE}."PRODUCT_CATEGORY" ;; - } - - - # A measure is a field that uses a SQL aggregate function. Here are defined count - # measure for this view, but you can also add measures of many different aggregates. - - measure: count { - type: count - } - - - # Dates and timestamps can be represented in Looker using a dimension group of type: time. - # Looker converts dates and timestamps to the specified timeframes within the dimension group. - - dimension_group: created_at { - type: time - timeframes: [ - raw, - time, - date, - week, - month, - quarter, - year - ] - sql: ${TABLE}."CREATED_AT" ;; - } - -} \ No newline at end of file diff --git a/lkml2cube/tests/test_e2e.py b/lkml2cube/tests/test_e2e.py deleted file mode 100644 index 93f080e..0000000 --- a/lkml2cube/tests/test_e2e.py +++ /dev/null @@ -1,43 +0,0 @@ -import pytest -import yaml - -from os.path import join, dirname - -from lkml2cube.parser.loader import file_loader -from lkml2cube.parser.views import parse_view -from lkml2cube.parser.explores import parse_explores, generate_cube_joins - -# Dynamically calculate the root directory -rootdir = join(dirname(__file__), "samples") - - -class TestExamples: - def test_simple_view(self): - file_path = "lkml/views/orders.view.lkml" - # print(join(rootdir, file_path)) - lookml_model = file_loader(join(rootdir, file_path), rootdir) - - # lookml_model can't be None - # if None it means file was not found or couldn't be parsed - assert lookml_model is not None - - cube_def = parse_view(lookml_model) - cube_def = generate_cube_joins(cube_def, lookml_model) - - # Convert the generated cube definition to a dictionary - generated_yaml = yaml.safe_load(yaml.dump(cube_def, allow_unicode=True)) - - # print("Expected yaml:") - # print(yaml.dump(generated_yaml, allow_unicode=True)) - - file_path = "cubeml/orders.yml" - # print(join(rootdir, file_path)) - with open(join(rootdir, file_path)) as f: - cube_model = yaml.safe_load(f) - - # print(cube_model) - - # Compare the two dictionaries - assert ( - generated_yaml == cube_model - ), "Generated YAML does not match the expected YAML" diff --git a/tests/__pycache__/__init__.cpython-310.pyc b/tests/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index ecb9e511590a631884ffd5bf15b2ae29a1ab4652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmd1j<>g`k0^V=`(?RrO5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HHerR!OQL%nO zVsgHIa%obkeol67juDtul3H9+tREkrnU`4-AFo$Xd5gm)H$SB`C)EyQN--0VU||3N DkV74` diff --git a/tests/__pycache__/__init__.cpython-311.pyc b/tests/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8c4773a8794aaca9a2c66560e5ce7175030f146c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmZ3^%ge<81pHCGX(0MBh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%S=DCIJKx) zzaTL=Uq87tDOEowJ2%G&ja8CbTvDtbAD@|*SrQ+wS5Wzj!zMRBr8Fniu80+A49KEl UejxFInURt40|SgGVg`x<0QHF_aR2}S diff --git a/tests/__pycache__/e2e.cpython-310-pytest-7.4.0.pyc b/tests/__pycache__/e2e.cpython-310-pytest-7.4.0.pyc deleted file mode 100644 index 1896fb06e17164cfb88776bdeb9d04b7c30528ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1557 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 b#Eb33i@UK-^ppgfcyu^qv`5D<_^kg2{p6(0 diff --git a/tests/__pycache__/test_e2e.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_e2e.cpython-310-pytest-8.3.5.pyc deleted file mode 100644 index f61354256c4065feeb178148180aaeb2451ffc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1945 zcmZuyO>f&a7$zxNl4aSkoiuH+4;TZ6%~)rz`PgYG(hWr~TQ1A6RTn}v>BOyMd8FJV zhJ2}u-G%|X?6O0GUAAAb|H11{`vW`lknAND2gW)Hq~0&Sd_NviS-l=0cLR zm(re!(@7%K!0fU55McIUs12Betw2OL=HwNM9PU6|RELK`<&RFUJzy|gK6M~`7+=6p zKY)hgInGgzb5h_1$;pDu2}g6MAcZriih8kng8``Dvq*>Sxeva0jOjm2-)A^?lu ztp!kE(co(~-x|nTyb1ZYZX@0Sq#wqk4wv z8F3fCc1Nl+&hjpvZNC5EXed>VYjl62O@QR%Y6sHDaZN%&p}v zSb}i(5O7(KlO#J~)A48kYi2EjKZxOa_cOaM+1rCX+si%o_N|)4 zd%e310bypNty%x^HNJW0$-}R{?C?z3R61##4~{$evFN~A5QAKl2D4`HU?t$4GT@zV zTT<{T%>mG!%(5KLn-2CTXE~sq#ZtG}01{$SOynR-;gks-f|@;@j*{FQDmTf%Lg_n9 z9cR;oTT^zFWKZLSnWL+#OvOWCJm|(lTeML&ek5fk^*S475<+I?;Kt)P2aSY#3Q5mI zL`@B%s#$IizNUPdPBhIXVhoX8uPyUR)ls*usS?RhSM60XiSuJwGk$6&;?itumAPLs zrJtQu=F`ZxmFHq8TgC+*%Jz+`a>4fMg55um{0IzQ-|K$^xKRB`JjnXSN8f;L%TlJO zs&7jxwnT4orkj>gBXcj=yKD`7sPAB+xJgc_PXfH*&`Ohp`0Xp#^REc;FDWMQrI(br zmxKU~sr^#y{*NrYbV=LjVT6~ncMexBvfh99KY**wXSQ*S>3|vJPa!s@L&m