134 lines
3.5 KiB
YAML
134 lines
3.5 KiB
YAML
# This file specifies rules for correctness according to how frappe doctype data model works.
|
|
|
|
rules:
|
|
- id: frappe-modifying-but-not-comitting
|
|
patterns:
|
|
- pattern: |
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ATTR = ...
|
|
- pattern-not: |
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ATTR = ...
|
|
...
|
|
self.db_set(..., self.$ATTR, ...)
|
|
- pattern-not: |
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ATTR = $SOME_VAR
|
|
...
|
|
self.db_set(..., $SOME_VAR, ...)
|
|
- pattern-not: |
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ATTR = $SOME_VAR
|
|
...
|
|
self.save()
|
|
- metavariable-regex:
|
|
metavariable: '$ATTR'
|
|
# this is negative look-ahead, add more attrs to ignore like (ignore|ignore_this_too|ignore_me)
|
|
regex: '^(?!ignore_linked_doctypes|status_updater)(.*)$'
|
|
- metavariable-regex:
|
|
metavariable: "$METHOD"
|
|
regex: "(on_submit|on_cancel)"
|
|
message: |
|
|
DocType modified in self.$METHOD. Please check if modification of self.$ATTR is commited to database.
|
|
languages: [python]
|
|
severity: ERROR
|
|
|
|
- id: frappe-modifying-but-not-comitting-other-method
|
|
patterns:
|
|
- pattern: |
|
|
class $DOCTYPE(...):
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ANOTHER_METHOD()
|
|
...
|
|
|
|
def $ANOTHER_METHOD(self, ...):
|
|
...
|
|
self.$ATTR = ...
|
|
- pattern-not: |
|
|
class $DOCTYPE(...):
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ANOTHER_METHOD()
|
|
...
|
|
|
|
def $ANOTHER_METHOD(self, ...):
|
|
...
|
|
self.$ATTR = ...
|
|
...
|
|
self.db_set(..., self.$ATTR, ...)
|
|
- pattern-not: |
|
|
class $DOCTYPE(...):
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ANOTHER_METHOD()
|
|
...
|
|
|
|
def $ANOTHER_METHOD(self, ...):
|
|
...
|
|
self.$ATTR = $SOME_VAR
|
|
...
|
|
self.db_set(..., $SOME_VAR, ...)
|
|
- pattern-not: |
|
|
class $DOCTYPE(...):
|
|
def $METHOD(self, ...):
|
|
...
|
|
self.$ANOTHER_METHOD()
|
|
...
|
|
self.save()
|
|
def $ANOTHER_METHOD(self, ...):
|
|
...
|
|
self.$ATTR = ...
|
|
- metavariable-regex:
|
|
metavariable: "$METHOD"
|
|
regex: "(on_submit|on_cancel)"
|
|
message: |
|
|
self.$ANOTHER_METHOD is called from self.$METHOD, check if changes to self.$ATTR are commited to database.
|
|
languages: [python]
|
|
severity: ERROR
|
|
|
|
- id: frappe-print-function-in-doctypes
|
|
pattern: print(...)
|
|
message: |
|
|
Did you mean to leave this print statement in? Consider using msgprint or logger instead of print statement.
|
|
languages: [python]
|
|
severity: WARNING
|
|
paths:
|
|
include:
|
|
- "*/**/doctype/*"
|
|
|
|
- id: frappe-modifying-child-tables-while-iterating
|
|
pattern-either:
|
|
- pattern: |
|
|
for $ROW in self.$TABLE:
|
|
...
|
|
self.remove(...)
|
|
- pattern: |
|
|
for $ROW in self.$TABLE:
|
|
...
|
|
self.append(...)
|
|
message: |
|
|
Child table being modified while iterating on it.
|
|
languages: [python]
|
|
severity: ERROR
|
|
paths:
|
|
include:
|
|
- "*/**/doctype/*"
|
|
|
|
- id: frappe-same-key-assigned-twice
|
|
pattern-either:
|
|
- pattern: |
|
|
{..., $X: $A, ..., $X: $B, ...}
|
|
- pattern: |
|
|
dict(..., ($X, $A), ..., ($X, $B), ...)
|
|
- pattern: |
|
|
_dict(..., ($X, $A), ..., ($X, $B), ...)
|
|
message: |
|
|
key `$X` is uselessly assigned twice. This could be a potential bug.
|
|
languages: [python]
|
|
severity: ERROR
|