From 0e9a6555d1485aedff59744f401fbb7070b55566 Mon Sep 17 00:00:00 2001 From: Bart Schuijt Date: Mon, 26 May 2025 14:48:10 +0200 Subject: [PATCH 1/4] initial commit --- sqlmesh/core/linter/rules/builtin.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sqlmesh/core/linter/rules/builtin.py b/sqlmesh/core/linter/rules/builtin.py index 9f93a24236..ecb70b4f7b 100644 --- a/sqlmesh/core/linter/rules/builtin.py +++ b/sqlmesh/core/linter/rules/builtin.py @@ -9,6 +9,7 @@ from sqlmesh.core.linter.rule import Rule, RuleViolation from sqlmesh.core.linter.definition import RuleSet from sqlmesh.core.model import Model, SqlModel +from pathlib import Path class NoSelectStar(Rule): @@ -56,4 +57,18 @@ def check_model(self, model: Model) -> t.Optional[RuleViolation]: return self.violation() if not model.audits and not model.kind.is_symbolic else None +class FilenameEqualsModelname(Rule): + """The filename should equal the model name""" + + def check_model(self, model: Model) -> t.Optional[RuleViolation]: + # Rule violated if the model's name (schema.table_name) does not match the file name (foo/bar/table_name.sql). + full_model_name = model.name + table_name = full_model_name.split(".", 1)[1] + path = Path(model._path) + return ( + self.violation() + if (table_name != path.stem) and not model.kind.is_symbolic + else None + ) + BUILTIN_RULES = RuleSet(subclasses(__name__, Rule, (Rule,))) From 2009619ca09e5fc346ff06ea9f4e3ea608dac245 Mon Sep 17 00:00:00 2001 From: Bart Schuijt Date: Mon, 26 May 2025 14:53:31 +0200 Subject: [PATCH 2/4] last component of str --- sqlmesh/core/linter/rules/builtin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlmesh/core/linter/rules/builtin.py b/sqlmesh/core/linter/rules/builtin.py index ecb70b4f7b..f1a164bff0 100644 --- a/sqlmesh/core/linter/rules/builtin.py +++ b/sqlmesh/core/linter/rules/builtin.py @@ -63,7 +63,7 @@ class FilenameEqualsModelname(Rule): def check_model(self, model: Model) -> t.Optional[RuleViolation]: # Rule violated if the model's name (schema.table_name) does not match the file name (foo/bar/table_name.sql). full_model_name = model.name - table_name = full_model_name.split(".", 1)[1] + table_name = full_model_name.split(".")[-1] path = Path(model._path) return ( self.violation() From 92df0325a1d9ea3e27962720df5c7244e2c55214 Mon Sep 17 00:00:00 2001 From: Bart Schuijt Date: Fri, 6 Jun 2025 11:53:44 +0200 Subject: [PATCH 3/4] make style --- sqlmesh/core/linter/rules/builtin.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sqlmesh/core/linter/rules/builtin.py b/sqlmesh/core/linter/rules/builtin.py index f1a164bff0..fb2eb0231e 100644 --- a/sqlmesh/core/linter/rules/builtin.py +++ b/sqlmesh/core/linter/rules/builtin.py @@ -66,9 +66,8 @@ def check_model(self, model: Model) -> t.Optional[RuleViolation]: table_name = full_model_name.split(".")[-1] path = Path(model._path) return ( - self.violation() - if (table_name != path.stem) and not model.kind.is_symbolic - else None + self.violation() if (table_name != path.stem) and not model.kind.is_symbolic else None ) + BUILTIN_RULES = RuleSet(subclasses(__name__, Rule, (Rule,))) From 838002ad62c89c1a01cb7756251e6fa73d485d0e Mon Sep 17 00:00:00 2001 From: Bart Schuijt Date: Fri, 6 Jun 2025 12:07:06 +0200 Subject: [PATCH 4/4] remove redundant logic --- sqlmesh/core/linter/rules/builtin.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sqlmesh/core/linter/rules/builtin.py b/sqlmesh/core/linter/rules/builtin.py index fb2eb0231e..1361fbe649 100644 --- a/sqlmesh/core/linter/rules/builtin.py +++ b/sqlmesh/core/linter/rules/builtin.py @@ -62,11 +62,10 @@ class FilenameEqualsModelname(Rule): def check_model(self, model: Model) -> t.Optional[RuleViolation]: # Rule violated if the model's name (schema.table_name) does not match the file name (foo/bar/table_name.sql). - full_model_name = model.name - table_name = full_model_name.split(".")[-1] - path = Path(model._path) return ( - self.violation() if (table_name != path.stem) and not model.kind.is_symbolic else None + self.violation() + if (model.name.split(".")[-1] != Path(model._path).stem) and not model.kind.is_symbolic + else None )