From 4b2e6e131dc96e99c6c6de9d25e3f37b4dfc1af0 Mon Sep 17 00:00:00 2001 From: Max Bucknell Date: Tue, 8 Mar 2016 07:58:31 +0000 Subject: [PATCH] Add some Python utilities --- bin/findup | 14 ++++ lib/python/__pycache__/mbutils.cpython-35.pyc | Bin 0 -> 2660 bytes lib/python/mbutils.py | 71 ++++++++++++++++++ lib/python/mbutils.pyc | Bin 0 -> 3308 bytes zsh/zshrc.symlink | 6 +- 5 files changed, 89 insertions(+), 2 deletions(-) create mode 100755 bin/findup create mode 100644 lib/python/__pycache__/mbutils.cpython-35.pyc create mode 100644 lib/python/mbutils.py create mode 100644 lib/python/mbutils.pyc 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 0000000000000000000000000000000000000000..f2f13804cdfc2e62badeaabea11c615ac0ba4560 GIT binary patch literal 2660 zcmZuz(T*EM7ClwnZrc-kW)dKo$r93wkfH`<9JENQ)rM$AvLLjpA&UhG7Rc&xm1la~ zu4<~wVQkqim<8VWgMH_TkJ!H`X`l9qU&s@>)wah3Mw)TCtLpZ-=bn4+TyM8`zW>kv zKGhB2|JeEo0Q?O=xdb2p!H@&J&6=Ud{Bw?+Va(CvV1hve5Fx%{=miiphzQ>Ry%3@f z(eUdUL=$4iuOo;n5G}v1L$o1w{kj3M2eI$hO?r1Xx%xAqJ5HDji`1SC_zElm4FNnP zum-@K(S=b1<^UErXIKIY2Fr0C(C!>qaxA!i5@OD=WH9g2qDz-KMjYlTY>l#6GJMUT zuER!jlcLlq%92r(uE!S6-u|c7qj*xp_DseiGjd?Hna0*g8BdhW@_4Ez@i0>&PUB&g z%cJAxtTVg)ewNEvX&VpqM2R?4ajK@50g{H}x^&U0w1cmNp`2ZKt~2GLtfVlm{^3V| zH%1$`OTqh@>KCbz%DTG9j7rBc30#9t(%Q93n;M&`)4s?|Z+DO?k%`pGKArdxrVZfv zUpk+Z(v+QXdT}xtjFimt&Lg9X6MfMU+S1XolV>NLVrtK{>Woh&Hp|PSVrrTIYE+1Q zst#|l7Qe>#SjbvzkNe#L+o~HK_jS7mP_5=(XG@MBZu*Kbobwge3-0UlL~#7;#($vDmP_;L5+yZ7Q$ z3BP(LPA67V#?q9tT2Y$2_o|O~epLnPppt(7NZkW`aRZ-o;=kg2&M@TolzkaczjqUM z?72w-$B*tgu1d#>7btt)yniZ{yeQ0rm;#e-Bh2pfPo?drdEVawc62}2gETK69Bu9- zp$mNhqe(&PbO+VN%WV25)4rV+($z96$7K>2s)f6X=<~|DlBCq>{z|EbbB4q26LpBt0;3(6x4;;)-g3I1DTcLDZ+;+ctd)#M zWC41(RhnL7jrus@uJI2!^$l$ZRlwYydqA6jWrn`xCq z<`%t=Uhf)(k;CjlmM*GRuDRjFHH{pnnG(`e{kDSaEotWxT|%I*dGQ|bfZb+0?2xrt z#IA7D*)}8sOe}gsB7dHH@+vE$QI-S~($jJJ-=Chzd>Rk5dM1ta1&OV`ESI4$&)Me* zGxYW~GB3@IK3!{d-*foqHMQX8?QK-lb{kZqN}^&jqZur_8~~dMzGNgx`Wmi;NdrBk ziCs>zLOm!i{diXLld2l3Y#8YIs*Z$Y~T;iIDes p8@Yt;?`*y8vdE45V=X4Rd_d~*GHkIH+vj_`t*F&()myu*@E5zuP5b}= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..af5642bec27b312fd85b0856d8b28aef8881266e GIT binary patch literal 3308 zcmb_eYi}Dx6g@M3Bo0XvQu;_AVnIkXk0wP_LWrtVqJSz;D7I*;(8}6)#>vL(neFa4 zjV1d7qyoP27x-iR3VuM*xobNqUz?nDzktz%{b~KbxFcrL1*r~!)@em*VBJ!&U3I`g;z(m0Tp@M@d zH;jQ}jfs{gHHU z@PqgLXqZJ|-$o|MZ8!LQ6ouT{Xy`(cMk7CrdWkbp9QBgaZU)A*RlEz}+a$G-^C9Z_ zp)*n9qS%d2PT6iYX5nvpX9L6cMW_SVv!VOKv`Ch~bKnyvFOq^r!UBK?KYo+vJ`d*r z(1A|kI$4}s7v!}`au*M5lYoXr*^^p63CoNv#Cb^EUdJTm3EkM4#KggNXrM{Uaw)!G zI6oIQFSZ8p(eAL@cQ#G8?&m(+^+#LA2Yyg&rOEDAHVXURZ4GvZAxVqPY}BIR8ttv| zM7^w5^}1eFRmD}8P|-hzEQD{-S&$VYWc+o7RF|}u3{AAK`q*gv^u%biCBWi3fQNBj z*r@9VnJ;XWY@)%J}BF^9g{_+Ei;BV}*_O zV|M}70Q8rT-+)poC}u|cl+dmK_|AsNI~(;`_I&SDE{H^C0dF^HPab`5M^da>msnT$ zSnz3Go0S;>LV}Ac6?uuGdD@x)fg^XL0@z;5cIgsd#2;^9)iN@$Fwu3)_o(So8 zQO#5slZvRQf{jTPe?nSMg(5Ol99J-@;jz1pYN!c(hlI~mQ0|@7;1r&Ws~Fdq@a-nu znKlV$BG%<1i@P@J`8lAKjX(AOa&z+lKzO6+4w4y)&Dgm zt(L7nEbl-)oNvgCs~4{7L$>cv!*9(=r;C@sqgDtn6@vm^vXbem>(DWlXF* z^O*Xj;EZBqoYSPE&)a#>Y(Uf7iriMGO5^4#!fc|O)R->g8pc(=VjrnvvVd`2M!5wh z|E0EMb#YVrR|(T}6e@>-c?R&-rfITgT}Vfp#p!-8!$Xr%$OO}3BbKQ^|B{}3U3BAhkOs(r>eL*+b!&btR?BKlFQ04F8;!<7<6NWqA9)_x;Q#;t literal 0 HcmV?d00001 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