Source code for bibpy.tools

# -*- coding: utf-8 -*-

"""A collection of functionality for bibpy's accompanying tools."""

import bibpy
import fnmatch
import os
import sys


[docs]def format_version(version): """Format a version number used by bibpy's accompanying tools.""" return '%(prog)s v{0}'.format(version)
[docs]def always_true(value): """A function that always returns True.""" return True
[docs]def always_false(value): """A function that always returns False.""" return False
[docs]def compose_predicates(predicates, pred_combiner): """Return a function that composes all the given predicates.""" def composed_predicates(value): return pred_combiner(pred(value) for pred in predicates) return composed_predicates
[docs]def iter_files(names, pattern, recursive): """Yield all files matching a specific file pattern in a directory.""" for name in names: if os.path.isdir(name): if not recursive: sys.exit("'{0}' is a directory, use [-r, --recursive]" " to recurse into directories".format(name)) else: for root, dirs, files in os.walk(name): for filename in fnmatch.filter(files, pattern): yield os.path.join(root, filename) else: yield name
# NOTE: Function is tested via script tests
[docs]def read_files(program_name, paths, processor, args): # pragma: no cover """Read files from some paths and apply a processor function to each.""" results = [] try: if not paths: # Read from sys.stdin results.extend(processor(sys.stdin, args)) else: for filename in iter_files(paths, '*.bib', args.recursive): # NOTE: Use scanFile if it ever gets into pyparsing to lazily # read and filter the bib source(s) results.extend(processor(filename, args)) return results except bibpy.error.ParseException as ex: sys.exit("{0}: {1}".format(program_name, ex)) except KeyboardInterrupt: sys.exit(1)
[docs]def close_output_handles(): """Ensure we close stdout and stderr when piping.""" sys.stdout.close() sys.stderr.close()
[docs]def get_abspath_for(curpath, path): """Return the absolute path for a path relative to a current path.""" return os.path.join(os.path.dirname(os.path.abspath(curpath)), path)