diff --git a/bin/findup b/bin/findup new file mode 100755 index 0000000..722eb35 --- /dev/null +++ b/bin/findup @@ -0,0 +1,14 @@ +#! /usr/bin/env python3 + +import sys +from mbutils import find_in_parent + +try: + print(find_in_parent(*sys.argv[1:])) + sys.exit(0) +except IOError: + print("File not found in any directory", file=sys.stderr) + sys.exit(1) +except TypeError: + print("No filename specified", file=sys.stderr) + sys.exit(2) diff --git a/lib/python/__pycache__/mbutils.cpython-35.pyc b/lib/python/__pycache__/mbutils.cpython-35.pyc new file mode 100644 index 0000000..f2f1380 Binary files /dev/null and b/lib/python/__pycache__/mbutils.cpython-35.pyc differ diff --git a/lib/python/mbutils.py b/lib/python/mbutils.py new file mode 100644 index 0000000..16f362c --- /dev/null +++ b/lib/python/mbutils.py @@ -0,0 +1,71 @@ +import json +import os +from os import path + +def find_in_parent(filename, starting_dir=None): + '''Look up the directory tree until you find a file.''' + if starting_dir is None: + starting_dir = os.getcwd() + + candidate_file = path.join(starting_dir, filename) + + if (path.isfile(candidate_file)): + return candidate_file + elif starting_dir == '/': + raise IOError('File not found in any directory') + else: + return find_in_parent(filename, path.dirname(starting_dir)) + +def _parse_composer_manifest(path): + '''Parse composer.json into dict''' + with open(path, 'r') as composer_file: + manifest = json.load(composer_file) + return manifest + +def _get_all_autoloaders(manifest): + '''Combine all PSR-0 and PSR-4 autoloaders''' + autoloaders = dict() + + for type in ['psr-0', 'psr-4']: + autoloaders.update(_get_autoloaders_by_type(manifest, type)) + + return dict((p, ns) for (ns, p) in autoloaders.items()) + +def _get_autoloaders_by_type(manifest, type): + '''Get one kind of autoloader''' + try: + return manifest['autoload'][type] + except KeyError: + return dict() + +def match_path(autoloaders, dirname): + '''Find namespace for a given path''' + prefixes = sorted(autoloaders.keys(), key=len) + + try: + prefix = next(p for p in prefixes if dirname.startswith(p)) + namespace = autoloaders[prefix] + remainder = dirname.replace(prefix, '', 1) + except StopIteration: + namespace = '' + remainder = dirname + + return (namespace, remainder) + +def convert_path(dirname): + '''Naively convert path to namespace''' + return dirname.replace('/', '\\') + +def get_namespace(dirname): + '''Convert dirname into namespace intelligently.''' + composer_json = find_in_parent('composer.json', dirname) + composer_manifest = _parse_composer_manifest(composer_json) + repo_root = path.dirname(composer_json) + relative_path = path.relpath(dirname, repo_root) + + autoloaders = _get_all_autoloaders(composer_manifest) + + (namespace, remainder) = match_path(autoloaders, relative_path) + + return namespace + convert_path(remainder) + diff --git a/lib/python/mbutils.pyc b/lib/python/mbutils.pyc new file mode 100644 index 0000000..af5642b Binary files /dev/null and b/lib/python/mbutils.pyc differ diff --git a/zsh/zshrc.symlink b/zsh/zshrc.symlink index c8127d1..43ce880 100644 --- a/zsh/zshrc.symlink +++ b/zsh/zshrc.symlink @@ -1,5 +1,4 @@ ## Path - # Default path export PATH="/sbin" PATH="/usr/sbin:$PATH" @@ -19,11 +18,14 @@ PATH="/usr/local/Cellar/ruby/$RUBY_VERSION/bin$PATH" PATH="/usr/texbin:$PATH" # Local path -PATH="$HOME/.config/bin:$PATH" +PATH="$HOME/Dropbox/dotfiles/bin:$PATH" # Composer (PHP) PATH="$HOME/.composer/vendor/bin:$PATH" +# Python +export PYTHONPATH="$PYTHONPATH:$HOME/Dropbox/dotfiles/lib/python" + ## RVM source /Users/maxbucknell/.rvm/scripts/rvm