2016-03-23 29 views
-1

Ben django için model_mommy, çok kullanışlı sahte nesneler için testler yazıyorum. Komut dosyasını kendi başına sürdürmek için hızlı bir yol istiyorum ve yalnızca django projenizdeki özel uygulamalarınız için testler yazması gerekiyor. Şu anda kullandığınız tüm uygulamalar için testler yazabilir ve yazabilirsiniz. Yazdığınız auth ve tagging gibi. Senaryoyu anneni kullanırsan (ya da mikser için değiştirirsen) kullanabilirsiniz. Hangi uygulamaların benimki olduğunu bulmak için dağınık bir os.walk olmadan sorunsuz bir yol nedir? Eğer, özel ve üçüncü taraf/doğal uygulamalar arasında ayrım yapar; django

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

+0

gerçekten belli değil ederiz? Özel ve üçüncü taraf uygulamaları arasında ayrım yapmak istiyorum, umarım 'django.apps.apps' özelliği içinde. bu hiç belli değil – codyc4321

cevap

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'