Как четко разделить проверку правил между классом модели и обычным именем класса в плагине Flake8? - PullRequest
1 голос
/ 28 января 2020

Я разрабатываю плагин flake8, который проверяет соглашение об именах классов: это имя класса модели и обычное имя класса.

Правила таковы:

# 1. Класс модели :

  • Имя класса должно начинаться с префикса 'TBL _'

  • Все в верхнем регистре

  • Разделяйте каждое слово подчеркиванием "_"

# 2. Нормальный класс :

  • Имя класса должно быть в регистре верблюда

  • Без подчеркивания "_" Разделенное слово.

Но дело в том, что это правило конфликтует друг с другом, что означает, что если один проходит, другой не проходит.

Например, у меня есть два класса, один для имени модели, другой - нормальный класс

test.py

class TBL_CUSTOMER():
    ID              =   db.Column(db.Numeric(25, 9), primary_key=True, autoincrement=True)
    PotentialCustomer   =   db.Column(db.String(12))
    FirstNameEn     =   db.Column(db.String(35))
    LastNameEn      =   db.Column(db.String(35))
    FirstNameKh     =   db.Column(db.String(35))
    LastNameKh      =   db.Column(db.String(35))

class Customer(object):

    def __init__(self):
        pass

    def HelloWorld():
        pass

Запустив комментарий $ flake8 test.py, первый класс TBL_CUSTOMER пропустит первое правило, но не выполнит второе правило, поэтому наоборот второе класс Customer.

Поэтому я хочу четко различить guish две проверки. Если это модель класса, проверьте первое правило. В противном случае, проверьте только второе правило.

Вот текущий код для этого:

mktflake8.py

import ast
import mktflake8config as mktf8


class Analyzer(ast.NodeVisitor):

    def __init__(self, *args, **kwargs):
        super(ast.NodeVisitor,self).__init__(*args, **kwargs)
        self.stats = []
        self.rule = mktf8.Rule()

    def visit_ClassDef(self, node):
        # Check the class name for model
        if not self.rule.checkTableName(node.name):
            msg = self.rule.convention.get('table')
            self.stats.append((node.lineno, node.col_offset, msg))

        # Check the normal class name
        if not self.rule.isCamelCase(node.name):
            msg = self.rule.convention.get('class')
            self.stats.append((node.lineno, node.col_offset, msg))

        self.generic_visit(node)


class Checker(object):
    options = None
    name = 'flake8_var'
    version = '0.1'

    def __init__(self, tree, filename):
        self.tree = tree
        self.filename = filename

    def run(self):
        parser = Analyzer()
        parser.visit(self.tree)

        for lineno, column, msg in parser.stats:
            yield (lineno, column, msg, Checker)

mktflake8config .py

class Rule(object):
    def __init__(self):
        self.convention = {
            'table'     : "PCK015 Table Name should start with MKT_, and all UPPER Case Seperated by '_'.",
            ‘class’     : “PCK016 Class Name should be in camel case.”
        }

    def isCamelCase(self, s):
        return s[0].isupper() \
        and s != s.lower() \
        and s != s.upper() \
        and "_" not in s

    def checkTableName(self, Name):
        if 'TBL_' in Name.upper() and Name.startswith('TBL_'):
            NameList = Name.split('_')
            for Name in NameList:
                if not Name.isupper():
                    return False

        return True

Как уже упоминалось, как я могу сделать для полного разделения этого правила? Спасибо

...