def __init__(self, options):
self.options = options
+ self.dict = None
+
+ def __valid_dict_line (self, line):
+ if len(line) <= 0:
+ return False
+
+ if '=' not in line:
+ return False
+
+ # Comment lines are not really valid
+ if re.match ('^(\s*#.*|\s*)$', line):
+ return False
+
+ # Make sure that there is a definition and it is valid
+ try:
+ (regex, directory) = line.split('=')
+ regex = regex.strip()
+ directory = directory.strip()
+ except:
+ return False
+
+ # Make sure they have length
+ if len(regex) <= 0 or len(directory) <= 0:
+ return False
+
+ # I guess that it's valid now
+ return True
def parse_dict(self):
"""Parses a dictionary file containing the sort definitions in the form:
- DIRECTORY = PATTERN
+ REGEX_PATTERN = DIRECTORY
Returns a list of tuples of the form (compiled_regex, to_directory)"""
try:
f = open(self.options.dict_file, 'r', 0)
try:
- data = f.read()
+ raw_lines = f.readlines()
finally:
f.close()
except IOError:
logging.critical ('Opening dictionary: %s FAILED' % self.options.dict_file)
sys.exit()
- ### Get a LIST containing each line in the file
- lines = [l for l in data.split('\n') if len(l) > 0]
-
- ### Remove comments / blank lines (zero length lines already removed above)
- regex = re.compile ('^\s*#.*$')
- lines = [l for l in lines if not re.match (regex, l)]
- regex = re.compile ('^\s*$')
- lines = [l for l in lines if not re.match (regex, l)]
-
- ### Split each line into a tuple, and strip each element of spaces
- result = self.split_lines(lines)
- result = [(re.compile(r), d) for r, d in result]
-
- ### Give some information about the dictionary we are using
- logging.info ('Successfully loaded %d records from %s\n' % \
- (len(result), self.options.dict_file))
-
- return tuple(result)
-
- def split_lines(self, lines):
+ ### Find all of the valid lines in the file
+ valid_lines = [l for l in raw_lines if self.__valid_dict_line (l)]
+ # Set up variable for result
result = []
- for l in lines:
-
- try:
- r, d = l.split('=')
- r = r.strip()
- d = d.strip()
- except ValueError:
- logging.warning ('Bad line in dictionary: "%s"' % l)
- continue
+ ### Split each line into a tuple, and strip each element of spaces
+ for l in valid_lines:
+ (regex, directory) = l.split('=')
+ regex = regex.strip()
+ directory = directory.strip()
- result.append((r, d))
+ # Fix up the directory if necessary
+ if directory[0] != '/':
+ directory = os.path.join (self.options.output_dir, directory)
- return result
+ # Fix up the regex
+ if regex[0] != '^':
+ regex = '^' + regex
- def get_matches(self, files, pattern):
- """get_matches(files, pattern):
+ if regex[-1] != '$':
+ regex += '$'
- files is type LIST
- pattern is type sre.SRE_Pattern
+ # Store the result
+ result.append ( (re.compile (regex), directory) )
- Returns a list of the files matching the pattern as type sre.SRE_Match."""
+ ### Give some information about the dictionary we are using
+ logging.info ('Successfully loaded %d records from %s\n' % \
+ (len(result), self.options.dict_file))
- matches = [m for m in files if pattern.search(m)]
- return matches
+ return tuple (result)
def as_makedirs (self, dirname):
"""Call os.makedirs(dirname), but check first whether we are in pretend
ret = 0
- ## Check for a non-default directory
- if todir[0] != '/':
- todir = os.path.join(self.options.output_dir, todir)
+ # Leave immediately if we have nothing to do
+ if len(files) <= 0:
+ return ret
## Create the directory if it doesn't exist
ret = self.as_makedirs (todir)
return ret
- def __dir_walker(self, dict, root, dirs, files):
-
- ## Get all of the files in the directory that are of the correct types
- types_re = re.compile(TYPES_REGEX, re.IGNORECASE)
- raw_matches = [f for f in files if types_re.match(f)]
-
- ### Loop through the dictionary and try to move everything that matches
- for regex, todir in dict:
- matches = self.get_matches(raw_matches, regex)
+ def __dir_walker(self, rootdir, files):
- ## Move the files if we've found some
- if len(matches) > 0:
- self.move_files(matches, root, todir)
+ for (r,d) in self.dict:
+ matches = [f for f in files if r.match(f)]
+ self.move_files (matches, rootdir, d)
def get_user_choice(self, prompt):
logging.info ('')
## Parse the dictionary
- dict = self.parse_dict()
+ self.dict = self.parse_dict()
if self.options.recursive:
## Start walking through directories
for root, dirs, files in os.walk(self.options.start_dir):
- self.__dir_walker(dict, root, dirs, files)
+ self.__dir_walker(root, files)
else:
- self.__dir_walker(dict, self.options.start_dir,
- [d for d in os.listdir(self.options.start_dir) if os.path.isdir(d)],
- [f for f in os.listdir(self.options.start_dir) if os.path.isfile(f)])
+ self.__dir_walker(self.options.start_dir, [f for f in
+ os.listdir(self.options.start_dir) if os.path.isfile(f)])
### MAIN IS HERE ###