Skip to content

Commit 0eac7ef

Browse files
authored
Merge pull request #14 from rbob86/additional_lookml_rules
Added one rule, update example config file
2 parents 719446f + 4fc6a3a commit 0eac7ef

File tree

4 files changed

+52
-6
lines changed

4 files changed

+52
-6
lines changed

config.example.yaml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
- rule: field_requires_description
22
severity: warning
33
- rule: view_with_many_fields_requires_fields_hidden_by_default
4-
severity: ignore
5-
- rule: view_with_dimensions_and_measures_has_one_primary_key_defined
6-
severity: ignore
7-
- rule: dimension_group_of_type_time_requires_datatype
4+
severity: warning
5+
- rule: view_with_dimensions_and_measures_has_one_primary_key
86
severity: error
7+
- rule: dimension_group_of_type_time_requires_datatype
8+
severity: warning
99
- rule: dimension_group_of_type_time_requires_timeframe
1010
severity: warning
1111
- rule: explore_joins_require_relationship
12-
severity: ignore
12+
severity: warning
1313
- rule: explore_requires_description
14-
severity: ignore
14+
severity: warning
15+
- rule: explore_joins_contain_many_to_many_relationship
16+
severity: warning
1517
- rule: field_sql_html_requires_user_attribute_when_search_terms_found
1618
severity: error
1719
param_sets:

linter/rule_factory.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from linter.rules.explore_requires_description import ExploreRequiresDescription
1212
from linter.rules.explore_joins_require_relationship import ExploreJoinsRequireRelationship
1313
from linter.rules.field_sql_html_requires_user_attribute_when_search_terms_found import FieldSqlHtmlRequiresUserAttributeWhenSearchTermsFound
14+
from linter.rules.explore_joins_contain_many_to_many_relationship import ExploreJoinsContainManyToManyRelationship
1415

1516

1617
class RuleFactory:
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from linter.rule import Rule
2+
3+
4+
class ExploreJoinsContainManyToManyRelationship(Rule):
5+
def applies_to():
6+
return ('explore',)
7+
8+
def run(self, explore):
9+
joins = explore.get('joins', [])
10+
for join in joins:
11+
if 'relationship' in join:
12+
if join['relationship'] == "many_to_many":
13+
return False
14+
return True
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from linter.rule import Severity
2+
from linter.rules.explore_joins_contain_many_to_many_relationship import ExploreJoinsContainManyToManyRelationship
3+
4+
5+
def test_run_method_successfully_validates_explore_with_joins_and_no_many_to_many_relationships() -> None:
6+
rule = ExploreJoinsContainManyToManyRelationship(Severity.ERROR.value)
7+
8+
explore = {'sql_always_where': "${products.category} in\n (select ${products.category} from ${products.SQL_TABLE_NAME} products\n where ${products.brand} = 'Allegra K'\n group by 1)", 'joins': [{'type': 'left_outer', 'sql_on': '${order_items.user_id} = ${users.id}', 'relationship': 'many_to_one', 'name': 'users'}, {'fields': [
9+
'inventory_items.id'], 'type': 'left_outer', 'sql_on': '${order_items.inventory_item_id} = ${inventory_items.id}', 'relationship': 'many_to_one', 'name': 'inventory_items'}, {'type': 'left_outer', 'sql_on': '${inventory_items.product_id} = ${products.id}', 'relationship': 'many_to_one', 'name': 'products'}], 'name': 'order_items'}
10+
rule_result = rule.run(explore)
11+
assert rule_result == True
12+
13+
14+
def test_run_method_successfully_validates_explore_without_joins() -> None:
15+
rule = ExploreJoinsContainManyToManyRelationship(Severity.ERROR.value)
16+
17+
explore = {
18+
'sql_always_where': "${products.category} in\n (select ${products.category} from ${products.SQL_TABLE_NAME} products\n where ${products.brand} = 'Allegra K'\n group by 1)", 'name': 'order_items'}
19+
rule_result = rule.run(explore)
20+
assert rule_result == True
21+
22+
23+
def test_run_method_warns_when_explore_has_joins_and_with_many_to_many_relationship() -> None:
24+
rule = ExploreJoinsContainManyToManyRelationship(Severity.WARNING.value)
25+
26+
explore = {'sql_always_where': "${products.category} in\n (select ${products.category} from ${products.SQL_TABLE_NAME} products\n where ${products.brand} = 'Allegra K'\n group by 1)", 'joins': [{'type': 'left_outer', 'sql_on': '${order_items.user_id} = ${users.id}', 'name': 'users'}, {'fields': [
27+
'inventory_items.id'], 'type': 'left_outer', 'sql_on': '${order_items.inventory_item_id} = ${inventory_items.id}', 'relationship': 'many_to_many', 'name': 'inventory_items'}, {'type': 'left_outer', 'sql_on': '${inventory_items.product_id} = ${products.id}', 'relationship': 'many_to_one', 'name': 'products'}], 'name': 'order_items'}
28+
rule_result = rule.run(explore)
29+
assert rule_result == False

0 commit comments

Comments
 (0)