Package pygccxml :: Package utils :: Module fs_utils |

# Source Code for Module pygccxml.utils.fs_utils

      1  # Copyright 2004-2008 Roman Yakovenko.
      2  # Distributed under the Boost Software License, Version 1.0. (See
      3  # accompanying file LICENSE_1_0.txt or copy at
      4  # http://www.boost.org/LICENSE_1_0.txt)
      5
      6  import os
      7  from types import *
      8
      9  ##If you want include files that doesn't have extension then use filter like '*.'
     10
     11 -def _make_list( argument ):
     12      if type(argument) in StringTypes:
     13          if argument:
     14              return [argument]
     15          else:
     16              return []
     17      elif type(argument) is ListType:
     18          return argument
     19      else:
     20          raise TypeError( 'Argument "%s" must be or list of strings or string.' % argument )
     21
     22 -class base_files_iterator:
     23 -    def __init__(self, file_exts, is_include_exts = True):
     24          self.__file_exts = _make_list( file_exts )
     25          self.__is_include_exts = is_include_exts
     26
     27 -    def _is_to_skip(self, file_path):
     28          if not self.__file_exts:
     29              return 0
     30          file_ext = os.path.splitext( file_path )[1]
     31          if not file_ext:
     32              file_ext = '.' + file_ext
     33          file_ext = '*' + file_ext
     34          if file_ext.lower() in self.__file_exts:
     35              return not self.__is_include_exts
     36          else:
     37              return self.__is_include_exts
     38
     39 -    def _subdirectories_and_files(self, directory_path):
     40          files, directories = [], []
     41          directory_contents = os.listdir(directory_path)
     42          for object_name in directory_contents:
     43              object_path = os.path.join(directory_path, object_name)
     44              if os.path.isfile( object_path ) and not self._is_to_skip( object_path ):
     45                  files.append( object_path )
     46              elif os.path.isdir( object_path ):
     47                  directories.append( object_path )
     48              else:
     49                  pass
     50          return directories, files
     51
     52 -    def __iter__(self):
     53          raise NotImplementedError
     54
     55 -    def next(self):
     56          raise NotImplementedError
     57
     58 -    def restart(self):
     59          raise NotImplementedError
     60
     61 -class files_walker(base_files_iterator):
     62 -    def __init__(self, directories, file_ext_filter = '', is_include_filter = True, is_recursive = True):
     63          base_files_iterator.__init__(self, file_ext_filter, is_include_filter)
     64          self.__directories = _make_list( directories )
     65          self.__is_recursive = is_recursive
     66          self.__file_generator = None
     67
     68 -    def __walk(self):
     69          directories = self.__directories[:]
     70          while directories:
     71              sub_directories, files = self._subdirectories_and_files( directories.pop(0) )
     72              if self.__is_recursive:
     73                  for directory in sub_directories:
     74                      directories.append( directory )
     75              for file_os in files:
     76                  yield file_os
     77
     78 -    def __iter__(self):
     79          self.__file_generator = self.__walk()
     80          return self
     81
     82 -    def next(self):
     83          return self.__file_generator.next()
     84
     85 -    def restart(self):
     86          self.__file_generator = None
     87
     88
     89 -class directories_walker:
     90 -    def __init__(self, directories, is_recursive = 1):
     91          self.__directories = []
     92          for root in _make_list( directories ):
     93              self.__directories.extend( self.__sub_directories( root ) )
     94          self.__is_recursive = is_recursive
     95          self.__directory_generator = None
     96
     97 -    def __sub_directories(self, directory_path):
     98          sub_directories = []
     99          directory_contains = os.listdir(directory_path)
    100          for object_in_directory in directory_contains:
    101              full_path = os.path.join(directory_path, object_in_directory)
    102              if os.path.isdir( full_path ):
    103                  sub_directories.append( full_path )
    104          return sub_directories
    105
    106 -    def __walk(self):
    107          directories = self.__directories[:]
    108          for curr_directory in directories:
    109              yield curr_directory
    110              if self.__is_recursive:
    111                  for f in directories_walker( [curr_directory], True ):
    112                      yield f
    113
    114 -    def __iter__(self):
    115          self.__directory_generator = self.__walk()
    116          return self
    117
    118 -    def next(self):
    119          return self.__directory_generator.next()
    120
    121 -    def restart(self):
    122          self.__directory_generator = None
    123
    124
    125  if '__main__' == __name__:
    126      pass
    127      #lFileCount = 0
    128      #for file_os in files_iterator( r'C:\Program Files\Microsoft Visual Studio\VC98\Include\stlport', ['*.h', '*.'], True, False):
    129          #print file_os
    130          #lFileCount += 1
    131      #print lFileCount
    132
    133      #~ for directory in directories_iterator( '/home/roman/language-binding', False ):
    134          #~ print directory
    135      #~ for directory in directories_iterator( '/home/roman/language-binding', True ):
    136          #~ print directory
    137