You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

147 line
4.0 KiB

  1. # This file specifies rules for correctness according to how frappe doctype data model works.
  2. rules:
  3. - id: frappe-modifying-but-not-comitting
  4. patterns:
  5. - pattern: |
  6. def $METHOD(self, ...):
  7. ...
  8. self.$ATTR = ...
  9. - pattern-not: |
  10. def $METHOD(self, ...):
  11. ...
  12. self.$ATTR = ...
  13. ...
  14. self.db_set(..., self.$ATTR, ...)
  15. - pattern-not: |
  16. def $METHOD(self, ...):
  17. ...
  18. self.$ATTR = $SOME_VAR
  19. ...
  20. self.db_set(..., $SOME_VAR, ...)
  21. - pattern-not: |
  22. def $METHOD(self, ...):
  23. ...
  24. self.$ATTR = $SOME_VAR
  25. ...
  26. self.save()
  27. - metavariable-regex:
  28. metavariable: '$ATTR'
  29. # this is negative look-ahead, add more attrs to ignore like (ignore|ignore_this_too|ignore_me)
  30. regex: '^(?!ignore_linked_doctypes|status_updater)(.*)$'
  31. - metavariable-regex:
  32. metavariable: "$METHOD"
  33. regex: "(on_submit|on_cancel)"
  34. message: |
  35. DocType modified in self.$METHOD. Please check if modification of self.$ATTR is commited to database.
  36. languages: [python]
  37. severity: ERROR
  38. - id: frappe-modifying-but-not-comitting-other-method
  39. patterns:
  40. - pattern: |
  41. class $DOCTYPE(...):
  42. def $METHOD(self, ...):
  43. ...
  44. self.$ANOTHER_METHOD()
  45. ...
  46. def $ANOTHER_METHOD(self, ...):
  47. ...
  48. self.$ATTR = ...
  49. - pattern-not: |
  50. class $DOCTYPE(...):
  51. def $METHOD(self, ...):
  52. ...
  53. self.$ANOTHER_METHOD()
  54. ...
  55. def $ANOTHER_METHOD(self, ...):
  56. ...
  57. self.$ATTR = ...
  58. ...
  59. self.db_set(..., self.$ATTR, ...)
  60. - pattern-not: |
  61. class $DOCTYPE(...):
  62. def $METHOD(self, ...):
  63. ...
  64. self.$ANOTHER_METHOD()
  65. ...
  66. def $ANOTHER_METHOD(self, ...):
  67. ...
  68. self.$ATTR = $SOME_VAR
  69. ...
  70. self.db_set(..., $SOME_VAR, ...)
  71. - pattern-not: |
  72. class $DOCTYPE(...):
  73. def $METHOD(self, ...):
  74. ...
  75. self.$ANOTHER_METHOD()
  76. ...
  77. self.save()
  78. def $ANOTHER_METHOD(self, ...):
  79. ...
  80. self.$ATTR = ...
  81. - metavariable-regex:
  82. metavariable: "$METHOD"
  83. regex: "(on_submit|on_cancel)"
  84. message: |
  85. self.$ANOTHER_METHOD is called from self.$METHOD, check if changes to self.$ATTR are commited to database.
  86. languages: [python]
  87. severity: ERROR
  88. - id: frappe-print-function-in-doctypes
  89. pattern: print(...)
  90. message: |
  91. Did you mean to leave this print statement in? Consider using msgprint or logger instead of print statement.
  92. languages: [python]
  93. severity: WARNING
  94. paths:
  95. include:
  96. - "*/**/doctype/*"
  97. - id: frappe-modifying-child-tables-while-iterating
  98. pattern-either:
  99. - pattern: |
  100. for $ROW in self.$TABLE:
  101. ...
  102. self.remove(...)
  103. - pattern: |
  104. for $ROW in self.$TABLE:
  105. ...
  106. self.append(...)
  107. message: |
  108. Child table being modified while iterating on it.
  109. languages: [python]
  110. severity: ERROR
  111. paths:
  112. include:
  113. - "*/**/doctype/*"
  114. - id: frappe-same-key-assigned-twice
  115. pattern-either:
  116. - pattern: |
  117. {..., $X: $A, ..., $X: $B, ...}
  118. - pattern: |
  119. dict(..., ($X, $A), ..., ($X, $B), ...)
  120. - pattern: |
  121. _dict(..., ($X, $A), ..., ($X, $B), ...)
  122. message: |
  123. key `$X` is uselessly assigned twice. This could be a potential bug.
  124. languages: [python]
  125. severity: ERROR
  126. - id: frappe-using-db-sql
  127. pattern-either:
  128. - pattern: frappe.db.sql(...)
  129. - pattern: frappe.db.sql_ddl(...)
  130. - pattern: frappe.db.sql_list(...)
  131. paths:
  132. exclude:
  133. - "test_*.py"
  134. message: |
  135. The PR contains a SQL query that may be re-written with frappe.qb (https://frappeframework.com/docs/user/en/api/query-builder) or the Database API (https://frappeframework.com/docs/user/en/api/database)
  136. languages: [python]
  137. severity: ERROR