| #!/usr/bin/env python |
| |
| """ |
| Scans each resource file in res/ applying various transformations |
| to fix invalid resource files. |
| """ |
| |
| import os |
| import os.path |
| import sys |
| import tempfile |
| |
| from consumers.duplicates import DuplicateRemover |
| from consumers.positional_arguments import PositionalArgumentFixer |
| |
| def do_it(res_path, consumers): |
| for file_path in enumerate_files(res_path): |
| eligible_consumers = filter(lambda c: c.matches(file_path), consumers) |
| if len(eligible_consumers) > 0: |
| print "checking {0} ...".format(file_path) |
| |
| original_contents = read_contents(file_path) |
| contents = original_contents |
| for c in eligible_consumers: |
| contents = c.consume(file_path, contents) |
| if original_contents != contents: |
| write_contents(file_path, contents) |
| |
| def enumerate_files(res_path): |
| """Enumerates all files in the resource directory.""" |
| values_directories = os.listdir(res_path) |
| values_directories = map(lambda f: os.path.join(res_path, f), values_directories) |
| all_files = [] |
| for dir in values_directories: |
| files = os.listdir(dir) |
| files = map(lambda f: os.path.join(dir, f), files) |
| for f in files: |
| yield f |
| |
| def read_contents(file_path): |
| """Reads the contents of file_path without decoding.""" |
| with open(file_path) as fin: |
| return fin.read() |
| |
| def write_contents(file_path, contents): |
| """Writes the bytes in contents to file_path by first writing to a temporary, then |
| renaming the temporary to file_path, ensuring a consistent write. |
| """ |
| dirname, basename = os.path.split(file_path) |
| temp_name = "" |
| with tempfile.NamedTemporaryFile(prefix=basename, dir=dirname, delete=False) as temp: |
| temp_name = temp.name |
| temp.write(contents) |
| os.rename(temp.name, file_path) |
| |
| if __name__ == '__main__': |
| if len(sys.argv) < 2: |
| print >> sys.stderr, "please specify a path to a resource directory" |
| sys.exit(1) |
| |
| res_path = os.path.abspath(sys.argv[1]) |
| print "looking in {0} ...".format(res_path) |
| do_it(res_path, [DuplicateRemover(), PositionalArgumentFixer()]) |