-1

我正在为 model_mommy 编写测试,这是 django 非常有用的假对象。我想要一种让脚本自我维持的快速方法,它只需要为您的 django 项目中的自定义应用程序编写测试。现在它可能会为你使用的所有应用程序找到并编写测试,比如authtagging没有编写的和。如果您使用 mommy(或更改为混音器,它应该也可以工作),您可以使用该脚本。什么是os.walk查找哪些应用程序实际上是我的应用程序?谢谢

https://gist.github.com/codyc4321/81cbb25f99f2af709c03

4

1 回答 1

0
class ModelRunner(object):

    def __init__(self, starting_path):
        self.start_path = starting_path

    @property
    def model_files(self):
        model_files = []
        for root, dirs, files in os.walk(self.start_path):
            for f in files:
                if self.is_regular_models_file(f):
                    filename = os.path.join(root, f)
                    model_files.append(filename)
            for d in dirs:
                if self.is_models_dir(d):
                    model_files.extend(self.get_models_files_from_models_folder(os.path.join(root, d)))
        return model_files

    def get_models_files_from_models_folder(self, filepath):
        for root, _, files in os.walk(filepath):
            model_files = []
            for f in files:
                if f not in ['__init__.py'] and '.pyc' not in f:
                    filename = os.path.join(root, f)
                    model_files.append(filename)
            return model_files

    @property
    def apps(self):
        apps = []
        for f in self.model_files:
            apps.append(self.get_app_name_from_file(f))
        return apps

    def get_app_name_from_file(self, filepath):

        def find_models_dir(path):
            head, name = os.path.split(path)
            return path if name == 'models' else find_models_dir(head)

        if self.is_regular_models_file(filepath):
            head, _ = os.path.split(filepath)
            _, app_name = os.path.split(head)
            return app_name
        else:
            return find_models_dir(filepath)

    def is_regular_models_file(self, filepath):
        return get_filename(filepath) == 'models.py'

    def is_models_dir(self, filepath):
        return get_filename(filepath) == 'models'
于 2016-03-23T19:57:08.170 回答