From a6e8ac9d6e5176cde6ed1ecbf763f7bc8c673cdb Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 7 Nov 2010 06:55:07 -0500 Subject: [PATCH] Update. --- .../pycomplexity/autoload/.hg/00changelog.i | Bin 0 -> 57 bytes bundle/pycomplexity/autoload/.hg/branch | 1 + .../autoload/.hg/branchheads.cache | 2 + bundle/pycomplexity/autoload/.hg/dirstate | Bin 0 -> 1028 bytes bundle/pycomplexity/autoload/.hg/hgrc | 2 + bundle/pycomplexity/autoload/.hg/requires | 4 + .../autoload/.hg/store/00changelog.i | Bin 0 -> 14081 bytes .../autoload/.hg/store/00manifest.i | Bin 0 -> 13294 bytes .../.hg/store/data/_c_o_n_t_r_i_b_u_t_o_r_s.i | Bin 0 -> 304 bytes .../autoload/.hg/store/data/_t_o_d_o.txt.i | Bin 0 -> 159 bytes .../autoload/.hg/store/data/base.vim.i | Bin 0 -> 1268 bytes .../autoload/.hg/store/data/build.py.i | Bin 0 -> 216 bytes .../autoload/.hg/store/data/complexity.py.i | Bin 0 -> 12881 bytes .../autoload/.hg/store/data/complexity.vim.i | Bin 0 -> 8976 bytes .../.hg/store/data/grammar/count__nodes.py.i | Bin 0 -> 426 bytes .../.hg/store/data/grammar/everything.py.i | Bin 0 -> 571 bytes .../grammar/python__ast__node__types.txt.i | Bin 0 -> 394 bytes .../autoload/.hg/store/data/linum.el.i | Bin 0 -> 2560 bytes .../autoload/.hg/store/data/pycomplexity.el.i | Bin 0 -> 2369 bytes .../autoload/.hg/store/data/runtests.py.i | Bin 0 -> 254 bytes .../autoload/.hg/store/data/test.py.i | Bin 0 -> 8129 bytes .../.hg/store/data/tests/____init____.py.i | Bin 0 -> 66 bytes .../test__function__on__first__line.py.i | Bin 0 -> 102 bytes .../data/tests/manual/test__functions.py.i | Bin 0 -> 216 bytes .../test__high__complexity__module.py.i | Bin 0 -> 89 bytes .../tests/manual/test__update__function.py.i | Bin 0 -> 207 bytes .../data/tests/test__comprehensions.py.i | Bin 0 -> 406 bytes .../store/data/tests/test__conditionals.py.i | Bin 0 -> 458 bytes .../store/data/tests/test__exceptions.py.i | Bin 0 -> 522 bytes .../tests/test__functions__and__classes.py.i | Bin 0 -> 483 bytes .../store/data/tests/test__integration.py.i | Bin 0 -> 1020 bytes .../.hg/store/data/tests/test__loops.py.i | Bin 0 -> 787 bytes .../data/tests/test__scoped__objects.py.i | Bin 0 -> 1538 bytes .../data/tests/test__simple__statements.py.i | Bin 0 -> 291 bytes .../autoload/.hg/store/data/tests/utils.py.i | Bin 0 -> 301 bytes .../autoload/.hg/store/data/~2ehgignore.i | Bin 0 -> 254 bytes .../pycomplexity/autoload/.hg/store/fncache | 28 + bundle/pycomplexity/autoload/.hg/store/undo | Bin 0 -> 899 bytes bundle/pycomplexity/autoload/.hg/tags.cache | 2 + bundle/pycomplexity/autoload/.hg/undo.branch | 1 + bundle/pycomplexity/autoload/.hg/undo.desc | 3 + .../pycomplexity/autoload/.hg/undo.dirstate | 0 .../{ftplugin/python => autoload}/.hgignore | 0 bundle/pycomplexity/autoload/CONTRIBUTORS | 9 + bundle/pycomplexity/autoload/TODO.txt | 3 + bundle/pycomplexity/autoload/base.vim | 38 + .../{ftplugin/python => autoload}/build.py | 0 .../python => autoload}/complexity.py | 0 .../python => autoload}/complexity.vim | 0 .../grammar/count_nodes.py | 0 .../python => autoload}/grammar/everything.py | 0 .../grammar/python_ast_node_types.txt | 0 bundle/pycomplexity/autoload/linum.el | 192 ++ bundle/pycomplexity/autoload/pycomplexity.el | 155 ++ .../{ftplugin/python => autoload}/runtests.py | 0 .../pycomplexity/autoload/tests/__init__.py | 1 + .../manual/test_function_on_first_line.py | 29 + .../autoload/tests/manual/test_functions.py | 45 + .../manual/test_high_complexity_module.py | 2 + .../tests/manual/test_update_function.py | 9 + .../autoload/tests/test_comprehensions.py | 58 + .../autoload/tests/test_conditionals.py | 95 + .../autoload/tests/test_exceptions.py | 74 + .../autoload/tests/test_integration.py | 56 + .../pycomplexity/autoload/tests/test_loops.py | 135 ++ .../autoload/tests/test_scoped_objects.py | 163 ++ .../autoload/tests/test_simple_statements.py | 34 + bundle/pycomplexity/autoload/tests/utils.py | 8 + bundle/vim-pyflakes/README.mdown | 38 + .../vim-pyflakes/ftplugin/python_pyflakes.vim | 74 + plugin/minibufexpl.vim | 1838 +++++++++++++++++ plugin/pylint.vim | 127 ++ syntax/pdc.vim | 330 +++ 73 files changed, 3556 insertions(+) create mode 100644 bundle/pycomplexity/autoload/.hg/00changelog.i create mode 100644 bundle/pycomplexity/autoload/.hg/branch create mode 100644 bundle/pycomplexity/autoload/.hg/branchheads.cache create mode 100644 bundle/pycomplexity/autoload/.hg/dirstate create mode 100644 bundle/pycomplexity/autoload/.hg/hgrc create mode 100644 bundle/pycomplexity/autoload/.hg/requires create mode 100644 bundle/pycomplexity/autoload/.hg/store/00changelog.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/00manifest.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/_c_o_n_t_r_i_b_u_t_o_r_s.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/_t_o_d_o.txt.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/base.vim.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/build.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/complexity.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/complexity.vim.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/grammar/count__nodes.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/grammar/everything.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/grammar/python__ast__node__types.txt.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/linum.el.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/pycomplexity.el.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/runtests.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/test.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/____init____.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__function__on__first__line.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__functions.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__high__complexity__module.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__update__function.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__comprehensions.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__conditionals.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__exceptions.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__functions__and__classes.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__integration.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__loops.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__scoped__objects.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/test__simple__statements.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/tests/utils.py.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/data/~2ehgignore.i create mode 100644 bundle/pycomplexity/autoload/.hg/store/fncache create mode 100644 bundle/pycomplexity/autoload/.hg/store/undo create mode 100644 bundle/pycomplexity/autoload/.hg/tags.cache create mode 100644 bundle/pycomplexity/autoload/.hg/undo.branch create mode 100644 bundle/pycomplexity/autoload/.hg/undo.desc create mode 100644 bundle/pycomplexity/autoload/.hg/undo.dirstate rename bundle/pycomplexity/{ftplugin/python => autoload}/.hgignore (100%) create mode 100644 bundle/pycomplexity/autoload/CONTRIBUTORS create mode 100644 bundle/pycomplexity/autoload/TODO.txt create mode 100644 bundle/pycomplexity/autoload/base.vim rename bundle/pycomplexity/{ftplugin/python => autoload}/build.py (100%) rename bundle/pycomplexity/{ftplugin/python => autoload}/complexity.py (100%) rename bundle/pycomplexity/{ftplugin/python => autoload}/complexity.vim (100%) rename bundle/pycomplexity/{ftplugin/python => autoload}/grammar/count_nodes.py (100%) rename bundle/pycomplexity/{ftplugin/python => autoload}/grammar/everything.py (100%) rename bundle/pycomplexity/{ftplugin/python => autoload}/grammar/python_ast_node_types.txt (100%) create mode 100644 bundle/pycomplexity/autoload/linum.el create mode 100644 bundle/pycomplexity/autoload/pycomplexity.el rename bundle/pycomplexity/{ftplugin/python => autoload}/runtests.py (100%) create mode 100644 bundle/pycomplexity/autoload/tests/__init__.py create mode 100644 bundle/pycomplexity/autoload/tests/manual/test_function_on_first_line.py create mode 100644 bundle/pycomplexity/autoload/tests/manual/test_functions.py create mode 100644 bundle/pycomplexity/autoload/tests/manual/test_high_complexity_module.py create mode 100644 bundle/pycomplexity/autoload/tests/manual/test_update_function.py create mode 100644 bundle/pycomplexity/autoload/tests/test_comprehensions.py create mode 100644 bundle/pycomplexity/autoload/tests/test_conditionals.py create mode 100644 bundle/pycomplexity/autoload/tests/test_exceptions.py create mode 100644 bundle/pycomplexity/autoload/tests/test_integration.py create mode 100644 bundle/pycomplexity/autoload/tests/test_loops.py create mode 100644 bundle/pycomplexity/autoload/tests/test_scoped_objects.py create mode 100644 bundle/pycomplexity/autoload/tests/test_simple_statements.py create mode 100644 bundle/pycomplexity/autoload/tests/utils.py create mode 100644 bundle/vim-pyflakes/README.mdown create mode 100644 bundle/vim-pyflakes/ftplugin/python_pyflakes.vim create mode 100644 plugin/minibufexpl.vim create mode 100644 plugin/pylint.vim create mode 100644 syntax/pdc.vim diff --git a/bundle/pycomplexity/autoload/.hg/00changelog.i b/bundle/pycomplexity/autoload/.hg/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..d3a8311050e54c57c5be7cfe169e60a95768812c GIT binary patch literal 57 zcmWN_K?=Yi3h2Y+m z3;)26(1bcnsn<|SX->|$=iZaA&zJY(x6}KN*Sg<(emuH8d3ahtmJI*Cf0zG^M$|w& zVWPXSX~9@C2yX(@476oRnpoFe;9&z4R65EV{MgAXz=?mxtnv(;NkGo7WJ+ibQ)X*q zH}a>Ph=F${`;84MHOj;-^8o&tYS_{dQ(imH>U(3Rm?lK$WWnGUC%j@Trb9D!3wD= T==SsAZwH*ty(coeYrbtid*Q=4 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/hgrc b/bundle/pycomplexity/autoload/.hg/hgrc new file mode 100644 index 0000000..b4ab8d8 --- /dev/null +++ b/bundle/pycomplexity/autoload/.hg/hgrc @@ -0,0 +1,2 @@ +[paths] +default = http://bitbucket.org/garybernhardt/pycomplexity diff --git a/bundle/pycomplexity/autoload/.hg/requires b/bundle/pycomplexity/autoload/.hg/requires new file mode 100644 index 0000000..ca69271 --- /dev/null +++ b/bundle/pycomplexity/autoload/.hg/requires @@ -0,0 +1,4 @@ +revlogv1 +store +fncache +dotencode diff --git a/bundle/pycomplexity/autoload/.hg/store/00changelog.i b/bundle/pycomplexity/autoload/.hg/store/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..088dd93f1c27badb10df05fabef03397f6033d9f GIT binary patch literal 14081 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 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/00manifest.i b/bundle/pycomplexity/autoload/.hg/store/00manifest.i new file mode 100644 index 0000000000000000000000000000000000000000..0bdf1ee7ab28a0d6a6b11cf91b50fa88ee125b21 GIT binary patch literal 13294 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 V7!(Wxs1XH<v{{U=;Lz@5q literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/_c_o_n_t_r_i_b_u_t_o_r_s.i b/bundle/pycomplexity/autoload/.hg/store/data/_c_o_n_t_r_i_b_u_t_o_r_s.i new file mode 100644 index 0000000000000000000000000000000000000000..0969a4d91bdd4e69fc6d3a6c6cfdfc3629d3006d GIT binary patch literal 304 zcmZQzWME`~fPNsg63TY@4+XCs*x&fuJS*apxUo@a!v4yCPu{pe)qtsrIl8?Ec@G)z zxW1oxh;k(9W-%~; zoec7kLH9y6yBj*qnlpW0>Ftqn+`xF#7ODnDtpGAWSX2QBbQJj|FlCkR0s&3VKXE=|o|O!+KkU-}*p{+;P;m+F21v$H`3 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/base.vim.i b/bundle/pycomplexity/autoload/.hg/store/data/base.vim.i new file mode 100644 index 0000000000000000000000000000000000000000..099789f93069a406ceea32ff75b66f569962919b GIT binary patch literal 1268 zcmZQzWME_f14e%a2BvcmHUsN_D7Y$C_1304We<-VhuY!nc>Ws_t-qjZz*NPY+@R?E zLkc2w&%B4IA3ti0ly`WmQC{uxu|SvTH1Ssm*b|Hp9Jq@&IM_@3g7v2 zH)rb0MixEvcxl?Zm^VT3OkUN#M~N;9S5))O>Xpqr%)abbo7c7_m`l;=kW-PZ>8Wt3 z9n)3)z2#;%EobfD^QuM0wA|B3PW@zHg-c+p;^ck15;dG+d33wj6nE}W)IU8vK)tfN zgLg60;h?NH{Z9+tU;6rM1NYRjn|&Xv4$b@Sbz$T8=Wl0Ln<(xqZwt#|SikR#LHhk; zyOv*Af2jQcbH#M7^FA!;Typcb^Iov|bA9!5wR#6Xh6+%af+7M)#xO9jc!O9#U;rXO zF(S}<^f>>yIS0&I?);gwv7tBU|71Oo91K*<@tt_k@34V@i*}#w2j0tZTtQRs?PO$s zaI8`OhLv~j)o*U!mMP9ZD8JdyQK{YK)4M$%eZp2h{Ta75FK>Inq_z|Bj?do-U8?F9 z*D{{BBgKDd_?^nD4<8m-xLKC|S=u@$ecc^T%e(8htNr+}Fp0~s>6ctyS)fp6!T$>j z=D5BMC~D376g~_RKXRni{CmaJ z&bK-J7p^RuJHhRF;9_2{^c}}%EYUilr#?U6{DlcSbgwsVUbHF8V0K|do9Ub$IiodQ zwrcV`&y<2YHy>16Rk_^5XW15!wcVRv_Ds__zdtL;qfGbGI(MG*yw%T+{Vlz^rmy$e z%S&@+zx}-??$ad}E_J`-)9y!~n3mJ=MC{}Hzu&H<<;xYeeNKs$Jk!RR=$VmfEvx(S z{*L^{S-)<5*_@*L&?2s$ZRYVK7wbgxui4kF+*tq$W2V*MkhTW0enZ3D1V}T2;$~*U zzilxWnx_Z`TszhKp~TC|RB0Jh4UFms>f-})^pzCy@)dIO^U_m`6v~T$w1P%ru|h#n zYFTD}X|Y0CYEf}!eqOOcd1_Irq9zweKhra?DdG$a%xqv51A`ez7-Y5kUc2NeKinoA ze{iw))`i7gCafnSp=w~%Wgr8DxifPM@{39o$})2y#{LDX*bYo>I#9KCK$;n3tOn1A zWwY93j3-N}zkihV`{UB1eD9%Zz!Wg^cRTVm8Hl*N-nLw#u<>0-;%e*jiCTZ3{$H}? z$TW@RpLOoJa0HtB7Up%1iDd-=kZX*R6WBYgO8=zZu)CHyM>^x8I)fKXKvD1D8H^y}MI*Dm>n! Ko?#JZ@)H0eau`c6bC$DARwU<2=i+aDk`uq;1c>xvfqpoOby4`~RO;MhCsA`X>8R)am5+o7@ML z6{;R{2yS8Pe8E%gQYjpuFXD5tscoWq(4}*FK3^Wh+zLp!>}J%Qb??ckcMadv0;A`< zui|>eBxU!)yri))H|)2D&u1asmwT(v|Gm2ZO!$Q8tN9a+SH>4B9}#}K#CIwHMOk0R literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/complexity.py.i b/bundle/pycomplexity/autoload/.hg/store/data/complexity.py.i new file mode 100644 index 0000000000000000000000000000000000000000..a3b48184c80c2406f2f89f5e034911236fc8e420 GIT binary patch literal 12881 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 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/grammar/count__nodes.py.i b/bundle/pycomplexity/autoload/.hg/store/data/grammar/count__nodes.py.i new file mode 100644 index 0000000000000000000000000000000000000000..15cef1e04b047d84f1e7e9d9715b0ecdc3ae498e GIT binary patch literal 426 zcmZQzWME_f1I8={2IeFPn?d|P6r@%j+_LbW){z;!H`x>yuCH~!e9#!G2254VsSP@q zcUXaE?`KhuU{R&g8i%Da%kGxn+@kGtF!N%N!-KNd_s>tzF_~yJe?#TA`SWwnA9R1R z*Ph+lDaHBA^P`i)XY2er@wTO^^8b%HN7OLfzP)VCkC8E2elD z@KtN&CY%?}^0_;^{EOLyUm46%@4ZsaoekqY6*{xb@kPs?)iuq1oG$MI6)hdDxHR{$ zda(F6Bz=x&3zbw|k-+rGJ7~&_XwL2DgxH=c99@x2^f>cOmnW(#wYz!L7mFKtzYMr?wcG{(CX0?Sw7{Vnf8>UoENR0_-4B7op}C}%nv=&n&Z!B OMc@92Gv72@HnH_dp`G_l0}L)PEEH5^lRJ^QB;nN>b@ zL)BTQ_?`DWPS+mT;?SF``8lC#y; zyky>%xV;J#)S&nQf>2;A?F6$J7&JjND56%sdem1cwM=A5$f_TE*B{UEuWs&!s)16V zm<7kKCzrB9NJe5_c5#V9Nxp(tesP9^Pim@yMpjO0YD#LErb1eNkwQU!W?o5VUb;d_ cMrN@>Zf0>Yh?AF}lB$qjTB65QSHZ;v0B4Kq9RL6T literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/grammar/python__ast__node__types.txt.i b/bundle/pycomplexity/autoload/.hg/store/data/grammar/python__ast__node__types.txt.i new file mode 100644 index 0000000000000000000000000000000000000000..86f0eadde7102e6e766b7222c5921fde0cff59b7 GIT binary patch literal 394 zcmZQzWME_f14b_f2BvTbn?d|P6i62zlDCWriFu!zxAKCrImeB;b1a~0z*NN?*GY~= zhYWaJzgxPl6XHso;dGiocA58a!v&8bR^~A8tW{N=()(}oS6$1ZRoisCwLCgDdUc9i z6PSFc{pFlPir?#0+>^P^HJZ+!Z(;oH*KEU$*=#30Ji}C`wrg1y>vo$zuASSQ`bo`A z>`j%kpMppHG#16r$L>U`9Cp27%064gEqjINj;TivRliU!DEs*0W<~8%NdM>PE4&ojSKy&+F1r*1}&`t6+;1#}(Hzh>s`ZZ8$SCh%h`+p~{< h_ctwEIH}&vlV4t6VWsjC@5q|w&vX7VhX)<7002$du73ak literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/linum.el.i b/bundle/pycomplexity/autoload/.hg/store/data/linum.el.i new file mode 100644 index 0000000000000000000000000000000000000000..abd789c9e323a12a35c6da402c68d09ec0475fca GIT binary patch literal 2560 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 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/runtests.py.i b/bundle/pycomplexity/autoload/.hg/store/data/runtests.py.i new file mode 100644 index 0000000000000000000000000000000000000000..2bc4c1aa139d4d8bb29f3db5ac15ad9425242502 GIT binary patch literal 254 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 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/____init____.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/____init____.py.i new file mode 100644 index 0000000000000000000000000000000000000000..7df5ddf2cec7eb1c4750c9acd76b166f02ebadc9 GIT binary patch literal 66 wcmZQzWME`~045*>W2^m#f-{B(XZ^3;z3-C98v_r^6%6)wxdou=!Bi<106NPOQUCw| literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__function__on__first__line.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__function__on__first__line.py.i new file mode 100644 index 0000000000000000000000000000000000000000..736460c6d407d3ada6b961f59e1a2fad85d11f39 GIT binary patch literal 102 zcmZQzWME`~05t{%#!pbT@qZ`~3C=N}a-i1X$SOv6$0LPPHMx~)plZNW#T;)>-(ZfS k(u)_iJPKlHa%nwdqA+n*@SIf>EVPVxTz4>RuV^p?0ND>9@c;k- literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__functions.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__functions.py.i new file mode 100644 index 0000000000000000000000000000000000000000..8e8e2d6c1b93e2f6edbcdae7e1054676064a31b1 GIT binary patch literal 216 zcmZQzWME`~fEf%7Y*J9R_J1hoQ2155pL2?ob+*m%(7^dl^|BUoplZNW#T;)>-{2GH zy{}%_@+gR*sp-h0B)xSa3lcml?R*RZ6^(g4mOK+#uBGCXYTOkRyzx}>D&N!kx=JfV zy0@J%I%M|1e38ZGrX1l7Gp0pNo8>P0+2E|-S)cP73wPa|@$E_Kvx)L6o<08 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__high__complexity__module.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__high__complexity__module.py.i new file mode 100644 index 0000000000000000000000000000000000000000..be20718fab4c0e8aa49df047ec93b0024ef4a2f3 GIT binary patch literal 89 zcmZQzWME`~07)RV8p_uG4+SUkVhna$Y9@PDX|F!o=;l?(r@a@d2254V@eVoR6YLS< VaaPlhHK=*U*`ursmtUGJ0suNI8{Yr` literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__update__function.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/manual/test__update__function.py.i new file mode 100644 index 0000000000000000000000000000000000000000..08807658827e75d85c16d9cdbebbb3e5581fbc3e GIT binary patch literal 207 zcmZQzWME`~fPMxBMp-D^_CFM;*35KiJrozjwU*_D?|oCj`s$|#plZNW#hj)6zFdb4 z1X{n_9%VL1f z!|4CxwA&BQ9C4Z=U>qbOryVrm>||!W#)8c~s#(2F=T08dzO$r!&&)}B8oRpwxOiC$ ro=FmQd*gOl-!b^N^1k~!)}`$UJ-JGHpY^sUiADby@3QAMMOp&@tV~s^ literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__comprehensions.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__comprehensions.py.i new file mode 100644 index 0000000000000000000000000000000000000000..bf655563f9c60ae9f27f80ea919eaa5b4c85ae5f GIT binary patch literal 406 zcmZQzWME_f1I9202KG=0n?dbA6tG6?KX=>s=lJ#g0h6rbPQ0>m{&yIv2254V**f`r zU$cV1vG;aIj|j(9-LRkT`%A^wIYxH-WCatRvsv@&Hmd1HWqZ$lnjmoE`&si3tLNq( zP_B-XwaH}5`gW~SBX{%l878E^uUG?+J6=E7u&kQx@EQR&;b}DaUKmJ*nTHT-Em^fPUD&N^0ez0%TH`m6uV zN+exNcIoduY`@rfcO8mezJXV9XTODF)w>hSf5i&-KNY%so>?c4QRhAL90|uG xTTZzCU4B5s{J@^~Q|@fyWaEq!nz;L$)V&okPVfHz6k7j5b^6a=%w@%X4*^;q#kl|g literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__conditionals.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__conditionals.py.i new file mode 100644 index 0000000000000000000000000000000000000000..3f921f03eeea34453e91004fe769bf33ae2b1f47 GIT binary patch literal 458 zcmZQzWME_f1I8`}298S*HiO!KC{W6>U9Q}{;c}P2HPH?qeaka9-W-Rj0aF!owoW~p zcUXbv`1?w(DY28hm#)3cH}#iJ$N8&5ty~?~-n?x0+}dm6Wk03Bp{x1q`Ffsf_hdao z6x)2o53(>FpZs|uN4bq;Y1@tPP*oo8Mi0>z_H`=?!kk#rXL9cDTB11hoMQ$<$>KZ4 z+I+qNZrcxY$!Ks2M3i?ET-S`%^fY)pQ!V{w`x+3 z!=iWrev#PlhQk|nZ~6E+K;(;7%*k8*C*Msks-8W|Nc;NaQm%S|>fa38EE*F!F~c&`&Lc7<5~zdwcblj6Df#rJ}yHHH@H zs6GI4R2q}oO-+b+@^1z^FQoZ*l7Cl#q(dcj&$ArVe0NN@jc7L;@SsA>-^suX$Kwl xZk@1vOUe$nI8IBQu;6cR7Tx~Vc-k~jUijucMNMa|dHj`LH@3Xz7glpO0|0(L(hvXu literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__exceptions.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__exceptions.py.i new file mode 100644 index 0000000000000000000000000000000000000000..cb89cf3b8052f29e0780f02c754ad921666a9cb0 GIT binary patch literal 522 zcmV+l0`>g>0RRC20000000GJX00(0L00000001Wc|NsC0|Ns9HjhEsLzSTj7>QH=C z$8$O&Jp=*(00000000000001ZoV`>{Z`&{oz57=X*`YBIIM`b3V4#O|f1!6lvFS;G zBDo^n#Q%PjV;6DO1zpot2g9Po$M^W5CWaj_5>wH!bp&?ThR9HbUF+~*xzDn!a+(Ng zq$=7iDm+x!vJGAt?Q3WK?=k~fH8um3;@B?{@*XVHVrIl9aOaKm#-u0pU&Zv8>37i_MJjn%F7?Sbc#Qpeyu42F)?;UC2_Qy+uFyWq+f=}# z!NeT|b4nuA!Qb!+oUUs*@1fOf2)0=1j>OAg58J>-Aosc_FuHBg7qIcuB#0w{Oxy|9 z(n?OX+z>$+M;{0geBgWq+fKavkR+jjBt(+S4FNuN_E|ghr_4B{7$PLGky_QFuVKMW zTX}pDtRMb|^03h?pNRWpJArw5CssfKgy9r=P(J9+i;tc|{hxDq9Y(TUg)mLnRUq?5 M|Cwcf0OWV!zLN6!TmS$7 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__functions__and__classes.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__functions__and__classes.py.i new file mode 100644 index 0000000000000000000000000000000000000000..601f3a87bde0ff67ae92c8b6dfb1b135065c31a5 GIT binary patch literal 483 zcmZQzWME_f1IEP+3_MdHYzDReQ1E-{>k9%;WmcZe5x^p+R}ho#-tTvqpKsYY ziPdaDZ=ZQvVQ*xhS89P;_oTypGi{wT9jeKGR+sc3M%nBKKbOS4n8nMY{_uExe@yqH7b)+Oo(J_w3-aZ5MfR0T>|mR-rP(Jb zH)wJA<^COq8pXM7q@`M<-@pE-!*YRp*OB|%Cq$bkb#-iExGUYgW6S!g4LfuAZk^DR zZ$0qXhaqs~k0!HYT5547j&8aNy=UHDTJ`(gN~2Idb}h^O94xsyAD_N&Um~z#?&fQ) zR!(L#Yg0v3q%1ebw5vq|ky{&VrmnHsT_Zj-){fUFrN(*ft0iw| z7%V8s)L)Qt`phhmglm(^&Uy5Ijh}XlapUL3R`t_$>RSY~`kQv1dZhho*HwK-{!;Dp z%PnWjPf0NT&3{Z_y|>)!(s{r3bou$^8pu82S6pI1Ks?wj61 literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__integration.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__integration.py.i new file mode 100644 index 0000000000000000000000000000000000000000..4935423f4c4b7caf27a09cd8c76f722a77ba9d27 GIT binary patch literal 1020 zcmZQzWME_f1I8)_29{S4HiO!KC^)j!YQ6N0Yd=+{R{om%XYJDqGR9s|HDIb@&eCAV zyk-M|J)gTmiyFPJt~kl6+5U}puj|Crgt=?73^w&Peg1W8!IYpmGP5ihcU#Y!dDLmO zl#Wz(oR#+_hO28YiFt)?7pmT*=Q$~;D0zWXaF*7Dz~qlhcB)=|!dVfb!NwO>ereMD zWR;%$G0|_DdVCW|>xhH@U!U`ry;e?+ij0o?oas=9(${ z#zX5QlUMV`!0-Km>-DM)mtNxdZJRT>l4H_!*Q5FWb}!>`w0&tmfqUttoXq|0wmt68 z6qV$UDMQk|gW+h+w_BEES%G?L`9l7SFdT&E_7>jAlDfUHN zy??R;d4G4Fm-+QlNha^6Pq?y58LyrGapg7BXT4)va+2_> z;^1JDE0;fgzS`(?@~7)cu5H`6j>RxICGzrvbTe)On{k4Hf$b#3GzMdkFvwoTdqyA5 zUYC?Q?)11tQy-jXX_+xm z#mP1!{}OYFkoU?9uG4u{3})8oS9UJ?tISng&Ms%`Rgf`PV&!~MuGdoPR#F$c#8f3k zimuI-_Gk}F3p}}}=b`DJd9A_)NkJ9TcP6RIX?AYf)3S2ow^e^u45)9Fh}W%6UJj~>)t zC13xcJL7lg7wSG9hz9RE3w733KvNccAa!{I#CkJcbzP&lOhtI08_Pv@R#x{yKU zvrLw6x!@puSaU^O7KEO;uB0#ubsym%SD$Y}{d?#_ytZhJDsyHO3>3 XEoVH>F}?~eIDP(jA|J!*M6*QzLA$WZ literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__loops.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__loops.py.i new file mode 100644 index 0000000000000000000000000000000000000000..e4daf05c13c21712590251a45041e6f5351ad888 GIT binary patch literal 787 zcmV+u1MK_&0RRC20000000Pqh01jvX00000001Wc|NsC0|NsBp-_JyrNMo%gkT#8U z(N*{%3TTP|00000000000001ZoXu9jPUA2Tz4t3d=>d?cNDH@099CUv_p;)!+#@%c zG~On5LX3cXUN+5?t^&rz;oO07eB-i9D(dY~Dj!S#4I}ZP<)PR>PynU=~bIrE6$v-crwm z^~y3bd8hQM@L{!w*3|K6c6~7`Bgj5i))I;LQFl(^J468^5~?b&4xys8u6Gd^fGCFF zTi)Uu?ezop0C)~v?T{&G%UPC}l;?lqkJb^|r2Gj&SS(<<1#2*dUv`5J=w>19eJ3c= zsVd7Yllggfe>V$BlPB)n)?D}wO~@@4G5m096OzuqS5DPM4~~tqb17RQwIO&M0i)d$#}p literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__scoped__objects.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__scoped__objects.py.i new file mode 100644 index 0000000000000000000000000000000000000000..08dc436e9f30d62c10ded5dd405eb338da80b04c GIT binary patch literal 1538 zcmXw%dpOg39LImNPNPj0Z7qiy$|yp)lhhJQnaesT7E^>p?vkNB)yg$0qbbsIuVZp; zhuk`DErc;NhUDHE5gU$mIzKYHlAoC)*n z)phdd3s-dPaB;K!8K*n(UTg&+J>YI-3lutkMuX$G-B(AINRwkft#S$ws3D=W)9}(< zb<7cEqx?{f63E05mX<&0Gxw-7@vx?vZFIF>-Kk|Wo5NXgbX^tRUrAS*Wd<8Mp9SOy4g0OHcBB% zri!7HLxB;9@sAq!qU<3w-PA!0`^Y>wAsU0&&T<*C=ArAW^Ejy}bBEx>S_4w3J42&K z101G@yzX{w_8qd|H}8hSH&I|MynNo}RYV4=kRBc)8Q1{?;;Q;xzDI`pMB!CplyfOr ztWUz^SF0Q)^{qbBugbE|aqCwduWT?2rfX0^XPldE{U~8_4d9xEX>Oi9fFQ@S=X&dg z#gz$vN|))-efyA?^oL8AT;0g#9hrjPGh%tD&T5rEW;R&eHE_tWg6WEuDK;EC?xwxV znVwUAAxbvbp<*gr&vF5KL%%e-4mBDwR_?~>B;-DCDUnwFOVmJ}9_hBbXvmmjd$10i zxLi6v;0NU`YmHgwR&9rrwkc@9SHT>%kAwJ|#cpio3IObQDQ=q_5QkV2q%3t2{PdoTkrsVAVXAc=#knc|XknWkkSpKNZMFo|VL(x4{=8+Eev?b)85T-F@Qr z)%Z82c@OH3a#6RtXQLy^!CDe9P-)-XRB`a|;PhKoB!tlrQX+}SwWsMJPJ3)FYntY_cUvt907ERZUxI-q3nYI$uJu_iad+^K zkx_AI`7<9nY|PWH;AwME`mPea0@#sf@;Ih+&^(N`E+t|c%$SkCC=Mf&v`7G92jOGF z>nk&@U3=S@yhIC3&g{WqKX)*LCJSOD;V zI6+>U;&h4ICMKH$5{q;0jk$bzTRfYu|G{sch{uT29xMKN@higVjFh8i8q9$^wpWXb z_x3ccP&-t&fyxjC3317Fe6@3mCj#+GI{VY8ifdqYNDu;2*Mbi~M#u7J_)}jZ`@Gk@ zBNJl1tcD{}SW-%3DR9A-^H(|9YWH74;w`T=f5)~F6J3gK)W}u&<>XBcE`d);Qw~i? z?pBXodvP0K=S}h2=~F_w&c2n*t>Fas|8u<0UO3T+uoG6_nfa>FcdA_0E5iFWUB1h8 zM+D$c)o86%e6w@ziSf!uwMmJ-87F&OV literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/test__simple__statements.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/test__simple__statements.py.i new file mode 100644 index 0000000000000000000000000000000000000000..2a74bbea4d2a5d8752abf51fa63422f5c1edaee3 GIT binary patch literal 291 zcmZQzWME`~fX56BO#h&4wf|7CRKqa%@-u$;X`d}^d;`Tc8^H4Qls$$O6NoTv5 z6?u-ow{!h)X{LALx>mbx3%_L?S!uppcek(i%RFd%8ezPn%NPSZ}7-t@95g6qO(gmnM>!29^T?Bv7mFZi#Tb#2$j?89{n?!4f6qA_*mq#Ai=e_Owm z-?xXvmo*o*L&d_KqKES;u3rGL#- c*4bh+8jX0?%{wjUq0;bper+`q|GAq70W|=Hv;Y7A literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/tests/utils.py.i b/bundle/pycomplexity/autoload/.hg/store/data/tests/utils.py.i new file mode 100644 index 0000000000000000000000000000000000000000..ed5f58251bf6b46a91c072194a44e7a0e9a0b88b GIT binary patch literal 301 zcmZQzWME`~fCwN}17)lIhk{0hk_Xx|)zYTDKC?8v@81owL3D z_2pM}2Bqbig^o(US-<$)Z7Wm_n5vkQoRBafH6dXGd(z)6i~hv4KKXN}Y0j0dGn2ep z&)jMHvq)%zN2X_1O;H_JM}ucEMX5 KF(iIby$JxT!f*Zn literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/store/data/~2ehgignore.i b/bundle/pycomplexity/autoload/.hg/store/data/~2ehgignore.i new file mode 100644 index 0000000000000000000000000000000000000000..3c0d556220e28760a9804a97a5b9c2e9e155547c GIT binary patch literal 254 zcmZQzWME`~01+T13}v(ahl0s|Qx^|#0o2g z^ql-8E-k%+%49CE1jsZ720|)f-{7z*ba-@Z2bCS70-F^Z&pw> zFbd=j5N1uyD=UT=s0x;o1dSvA*s!4z3~MWscv_>pl*efL_c$Gfw9pEqZff6LA3wTIj=~P8 z-O$ioci(kJSUO=$^RE&~w9PosU|ql(dhA~gug?$fhyL}gMi2c{-=xdp=}|;%&Sa|Q zm`SU~PcGKP_OFiNGv8vo%SHtZL7a7Jw`zfQ=N-J`3Fz9h|b2i5QW;69tYi5B~Gf zZ;;q7%|{wWsJ(!3D(k<@v*&ZbZ?FxN8NApA9MMLm-vaqkSw*Ekp?5WSk?4zNS8*Fs z1Ys3OEn@s}4%eB_C5d;$*HH}j*tK(hw^)?UqXKvQK)JE%c->p1a?TJF&&r_P6y`*= F>rd;nKb!yn literal 0 HcmV?d00001 diff --git a/bundle/pycomplexity/autoload/.hg/tags.cache b/bundle/pycomplexity/autoload/.hg/tags.cache new file mode 100644 index 0000000..66a976b --- /dev/null +++ b/bundle/pycomplexity/autoload/.hg/tags.cache @@ -0,0 +1,2 @@ +70 ebdcc0d237c74189d8c479110eb38c2c5b408a99 + diff --git a/bundle/pycomplexity/autoload/.hg/undo.branch b/bundle/pycomplexity/autoload/.hg/undo.branch new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/bundle/pycomplexity/autoload/.hg/undo.branch @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/bundle/pycomplexity/autoload/.hg/undo.desc b/bundle/pycomplexity/autoload/.hg/undo.desc new file mode 100644 index 0000000..f3f540e --- /dev/null +++ b/bundle/pycomplexity/autoload/.hg/undo.desc @@ -0,0 +1,3 @@ +0 +pull +http://bitbucket.org/garybernhardt/pycomplexity diff --git a/bundle/pycomplexity/autoload/.hg/undo.dirstate b/bundle/pycomplexity/autoload/.hg/undo.dirstate new file mode 100644 index 0000000..e69de29 diff --git a/bundle/pycomplexity/ftplugin/python/.hgignore b/bundle/pycomplexity/autoload/.hgignore similarity index 100% rename from bundle/pycomplexity/ftplugin/python/.hgignore rename to bundle/pycomplexity/autoload/.hgignore diff --git a/bundle/pycomplexity/autoload/CONTRIBUTORS b/bundle/pycomplexity/autoload/CONTRIBUTORS new file mode 100644 index 0000000..e5a9486 --- /dev/null +++ b/bundle/pycomplexity/autoload/CONTRIBUTORS @@ -0,0 +1,9 @@ +Original vim script by Gary Bernhardt +Emacs support added by Ignas MikalajĹŤnas + +Patches contributed by: + - Godefroid Chapelle + - Steve Bedford + - Chris Clark + - Peter Prohaska + diff --git a/bundle/pycomplexity/autoload/TODO.txt b/bundle/pycomplexity/autoload/TODO.txt new file mode 100644 index 0000000..849e0c6 --- /dev/null +++ b/bundle/pycomplexity/autoload/TODO.txt @@ -0,0 +1,3 @@ +Should catching multiple exception types in an "except" increase complexity? + +Handle nested functions. diff --git a/bundle/pycomplexity/autoload/base.vim b/bundle/pycomplexity/autoload/base.vim new file mode 100644 index 0000000..1b85d36 --- /dev/null +++ b/bundle/pycomplexity/autoload/base.vim @@ -0,0 +1,38 @@ +" complexity.vim +" Gary Bernhardt (http://blog.extracheese.org) +" +" This will add cyclomatic complexity annotations to your source code. It is +" no longer wrong (as previous versions were!) + +if !has('signs') + finish +endif +if !has('python') + finish +endif +python << endpython +import vim +%(python_source)s +endpython + +function! ShowComplexity() + python << END +show_complexity() +END +" no idea why it is needed to update colors each time +" to actually see the colors +hi low_complexity guifg=#004400 guibg=#004400 +hi medium_complexity guifg=#bbbb00 guibg=#bbbb00 +hi high_complexity guifg=#ff2222 guibg=#ff2222 +endfunction + +hi SignColumn guifg=fg guibg=bg +hi low_complexity guifg=#004400 guibg=#004400 +hi medium_complexity guifg=#bbbb00 guibg=#bbbb00 +hi high_complexity guifg=#ff2222 guibg=#ff2222 +sign define low_complexity text=XX texthl=low_complexity +sign define medium_complexity text=XX texthl=medium_complexity +sign define high_complexity text=XX texthl=high_complexity + +autocmd! BufReadPost,BufWritePost,FileReadPost,FileWritePost *.py call ShowComplexity() + diff --git a/bundle/pycomplexity/ftplugin/python/build.py b/bundle/pycomplexity/autoload/build.py similarity index 100% rename from bundle/pycomplexity/ftplugin/python/build.py rename to bundle/pycomplexity/autoload/build.py diff --git a/bundle/pycomplexity/ftplugin/python/complexity.py b/bundle/pycomplexity/autoload/complexity.py similarity index 100% rename from bundle/pycomplexity/ftplugin/python/complexity.py rename to bundle/pycomplexity/autoload/complexity.py diff --git a/bundle/pycomplexity/ftplugin/python/complexity.vim b/bundle/pycomplexity/autoload/complexity.vim similarity index 100% rename from bundle/pycomplexity/ftplugin/python/complexity.vim rename to bundle/pycomplexity/autoload/complexity.vim diff --git a/bundle/pycomplexity/ftplugin/python/grammar/count_nodes.py b/bundle/pycomplexity/autoload/grammar/count_nodes.py similarity index 100% rename from bundle/pycomplexity/ftplugin/python/grammar/count_nodes.py rename to bundle/pycomplexity/autoload/grammar/count_nodes.py diff --git a/bundle/pycomplexity/ftplugin/python/grammar/everything.py b/bundle/pycomplexity/autoload/grammar/everything.py similarity index 100% rename from bundle/pycomplexity/ftplugin/python/grammar/everything.py rename to bundle/pycomplexity/autoload/grammar/everything.py diff --git a/bundle/pycomplexity/ftplugin/python/grammar/python_ast_node_types.txt b/bundle/pycomplexity/autoload/grammar/python_ast_node_types.txt similarity index 100% rename from bundle/pycomplexity/ftplugin/python/grammar/python_ast_node_types.txt rename to bundle/pycomplexity/autoload/grammar/python_ast_node_types.txt diff --git a/bundle/pycomplexity/autoload/linum.el b/bundle/pycomplexity/autoload/linum.el new file mode 100644 index 0000000..e09ba02 --- /dev/null +++ b/bundle/pycomplexity/autoload/linum.el @@ -0,0 +1,192 @@ +;;; linum.el --- Display line numbers to the left of buffers + +;; Copyright (C) 2007, 2008 Markus Triska + +;; Author: Markus Triska +;; Keywords: convenience + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This file is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file GPL.txt . If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; Display line numbers for the current buffer. Copy linum.el to your +;; load-path and add to your .emacs: + +;; (require 'linum) + +;; Then toggle display of line numbers with M-x linum-mode. To enable +;; line numbering in all buffers, use M-x global-linum-mode. + +;;; Code: + +(defconst linum-version "0.9wza") + +(defvar linum-overlays nil "Overlays used in this buffer.") +(defvar linum-available nil "Overlays available for reuse.") +(defvar linum-before-numbering-hook nil + "Functions run in each buffer before line numbering starts.") + +(mapc #'make-variable-buffer-local '(linum-overlays linum-available)) + +(defgroup linum nil + "Show line numbers to the left of buffers" + :group 'convenience) + +;;;###autoload +(defcustom linum-format 'dynamic + "Format used to display line numbers. Either a format string +like \"%7d\", 'dynamic to adapt the width as needed, or a +function that is called with a line number as its argument and +should evaluate to a string to be shown on that line. See also +`linum-before-numbering-hook'." + :group 'linum + :type 'sexp) + +(defface linum + '((t :inherit (shadow default))) + "Face for displaying line numbers in the display margin." + :group 'linum) + +(defcustom linum-eager t + "Whether line numbers should be updated after each command. +The conservative setting `nil' might miss some buffer changes, +and you have to scroll or press C-l to update the numbers." + :group 'linum + :type 'boolean) + +(defcustom linum-delay nil + "Delay updates to give Emacs a chance for other changes." + :group 'linum + :type 'boolean) + +;;;###autoload +(define-minor-mode linum-mode + "Toggle display of line numbers in the left marginal area." + :lighter "" ; for desktop.el + (if linum-mode + (progn + (if linum-eager + (add-hook 'post-command-hook (if linum-delay + 'linum-schedule + 'linum-update-current) nil t) + (add-hook 'after-change-functions 'linum-after-change nil t)) + (add-hook 'window-scroll-functions 'linum-after-scroll nil t) + ;; mistake in Emacs: window-size-change-functions cannot be local + (add-hook 'window-size-change-functions 'linum-after-size) + (add-hook 'change-major-mode-hook 'linum-delete-overlays nil t) + (add-hook 'window-configuration-change-hook + 'linum-after-config nil t) + (linum-update-current)) + (remove-hook 'post-command-hook 'linum-update-current t) + (remove-hook 'post-command-hook 'linum-schedule t) + (remove-hook 'window-size-change-functions 'linum-after-size) + (remove-hook 'window-scroll-functions 'linum-after-scroll t) + (remove-hook 'after-change-functions 'linum-after-change t) + (remove-hook 'window-configuration-change-hook 'linum-after-config t) + (remove-hook 'change-major-mode-hook 'linum-delete-overlays t) + (linum-delete-overlays))) + +;;;###autoload +(define-globalized-minor-mode global-linum-mode linum-mode linum-on) + +(defun linum-on () + (unless (minibufferp) + (linum-mode 1))) + +(defun linum-delete-overlays () + "Delete all overlays displaying line numbers for this buffer." + (mapc #'delete-overlay linum-overlays) + (setq linum-overlays nil) + (dolist (w (get-buffer-window-list (current-buffer) nil t)) + (set-window-margins w 0))) + +(defun linum-update-current () + "Update line numbers for the current buffer." + (linum-update (current-buffer))) + +(defun linum-update (buffer) + "Update line numbers for all windows displaying BUFFER." + (with-current-buffer buffer + (when linum-mode + (setq linum-available linum-overlays) + (setq linum-overlays nil) + (save-excursion + (mapc #'linum-update-window + (get-buffer-window-list buffer nil 'visible))) + (mapc #'delete-overlay linum-available) + (setq linum-available nil)))) + +(defun linum-update-window (win) + "Update line numbers for the portion visible in window WIN." + (goto-char (window-start win)) + (let ((line (line-number-at-pos)) + (limit (window-end win t)) + (fmt (cond ((stringp linum-format) linum-format) + ((eq linum-format 'dynamic) + (let ((w (length (number-to-string + (count-lines (point-min) (point-max)))))) + (concat "%" (number-to-string w) "d"))))) + (width 0)) + (run-hooks 'linum-before-numbering-hook) + ;; Create an overlay (or reuse an existing one) for each + ;; line visible in this window, if necessary. + (while (and (not (eobp)) (<= (point) limit)) + (let* ((str (if fmt + (propertize (format fmt line) 'face 'linum) + (funcall linum-format line))) + (visited (catch 'visited + (dolist (o (overlays-in (point) (point))) + (when (string= (overlay-get o 'linum-str) str) + (unless (memq o linum-overlays) + (push o linum-overlays)) + (setq linum-available (delete o linum-available)) + (throw 'visited t)))))) + (setq width (max width (length str))) + (unless visited + (let ((ov (if (null linum-available) + (make-overlay (point) (point)) + (move-overlay (pop linum-available) (point) (point))))) + (push ov linum-overlays) + (overlay-put ov 'before-string + (propertize " " 'display `((margin left-margin) ,str))) + (overlay-put ov 'linum-str str)))) + (forward-line) + (setq line (1+ line))) + (set-window-margins win width))) + +(defun linum-after-change (beg end len) + ;; update overlays on deletions, and after newlines are inserted + (when (or (= beg end) + (= end (point-max)) + ;; TODO: use string-match-p with CVS or new release + (string-match "\n" (buffer-substring-no-properties beg end))) + (linum-update-current))) + +(defun linum-after-scroll (win start) + (linum-update (window-buffer win))) + +(defun linum-after-size (frame) + (linum-after-config)) + +(defun linum-schedule () + ;; schedule an update; the delay gives Emacs a chance for display changes + (run-with-idle-timer 0 nil #'linum-update-current)) + +(defun linum-after-config () + (walk-windows (lambda (w) (linum-update (window-buffer w))) nil 'visible)) + +(provide 'linum) +;;; linum.el ends here diff --git a/bundle/pycomplexity/autoload/pycomplexity.el b/bundle/pycomplexity/autoload/pycomplexity.el new file mode 100644 index 0000000..47fdbe8 --- /dev/null +++ b/bundle/pycomplexity/autoload/pycomplexity.el @@ -0,0 +1,155 @@ +;;; pycomplexity.el --- Display python code complexity to the left of buffers + +;; Copyright (C) 2009 Ignas Mikalajunas + +;; Author: Ignas Mikalajunas +;; Keywords: convenience + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This file is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file GPL.txt . If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; Display complexity information for the current buffer. + +;; Add to your .emacs: + +;; (add-to-list 'load-path "~/.site-lisp/pycomplexity/") + +;; (require 'linum) +;; (require 'pycomplexity) +;; (add-hook 'python-mode-hook +;; (function (lambda () +;; (pycomplexity-mode) +;; (linum-mode)))) + +;;; Code: + +(defconst pycomplexity-version "0.1") + + +(defvar complexity-last-change 0 "Time last change to some python buffer happened.") +(defvar complexity-data nil "Calcuated code complexity information for this buffer.") +(make-variable-buffer-local 'complexity-data) + +(defgroup pycomplexity nil + "Show complexity information to the left of buffers" + :group 'convenience) + +(defface pycomplexity-complexity-low + '((t (:background "green" + :foreground "green"))) + "Face that marks simple code " + :group 'pycomplexity) + +(defface pycomplexity-complexity-normal + '((t (:background "yellow" + :foreground "yellow"))) + "Face that marks normal code " + :group 'pycomplexity) + +(defface pycomplexity-complexity-high + '((t (:background "red" + :foreground "red"))) + "Face that marks complex code " + :group 'pycomplexity) + +(defcustom pycomplexity-delay 5 + "Update coverage information once in this many seconds." + :group 'pycomplexity + :type 'int) + +(defcustom pycomplexity-python "python" + "Python interpreter used to run the complexity calculation script." + :group 'pycomplexity + :type 'string) + +(defcustom pycomplexity-script + (expand-file-name "complexity.py" + (file-name-directory (or load-file-name buffer-file-name))) + "Pycomplexity python script." + :group 'pycomplexity + :type 'string) + +;;;###autoload +(define-minor-mode pycomplexity-mode + "Toggle display complexity of the python code you are editing." + :lighter "" ; for desktop.el + (if pycomplexity-mode + (progn + (add-hook 'after-change-functions 'pycomplexity-on-change nil t) + (add-hook 'after-save-hook 'pycomplexity-on-change-force nil t) + (setf linum-format 'pycomplexity-line-format) + (pycomplexity-on-change-force)) + (setf linum-format 'dynamic) + (remove-hook 'after-change-functions 'pycomplexity-on-change t))) + +(defun pycomplexity-get-complexity (line data) + (multiple-value-bind (face str complexity) + (loop for info in data + for from = (first info) + for to = (second info) + for complexity = (third info) + when (and (>= line from) + (<= line to)) + return (cond ((> complexity 14) (values 'pycomplexity-complexity-high "h" complexity)) + ((> complexity 7) (values 'pycomplexity-complexity-normal "n" complexity)) + (t (values 'pycomplexity-complexity-low "l" complexity))) + when (< line from) + return (values 'default " " 0)) + (if face (values face str complexity) + (values 'default " " 0)))) + +(defun pycomplexity-line-format (line) + (multiple-value-bind (face str complexity) + (pycomplexity-get-complexity line complexity-data) + (propertize str 'face face + 'help-echo (format "Complexity of this function is %d" complexity)))) + + +(defun pycomplexity-make-buffer-copy () + (let* ((source-file-name buffer-file-name) + (file-name (flymake-create-temp-inplace source-file-name "complexity"))) + (make-directory (file-name-directory file-name) 1) + (write-region nil nil file-name nil 566) + file-name)) + +(defun pycomplexity-get-raw-complexity-data (file-name) + (shell-command-to-string (format "%s %s %s" + pycomplexity-python + pycomplexity-script + file-name))) + +(defun pycomplexity-on-change-force (&optional beg end len) + (pycomplexity-on-change beg end len t)) + +(defun pycomplexity-on-change (&optional beg end len force) + (let ((since-last-change (- (float-time) complexity-last-change))) + (when (or (> since-last-change pycomplexity-delay) force) + (setf complexity-last-change (float-time)) + (let* ((temp-source-file-name (pycomplexity-make-buffer-copy)) + (result (pycomplexity-get-raw-complexity-data temp-source-file-name)) + (data (loop + for line in (save-match-data (split-string result "[\n\r]+")) + for parsed-line = (loop for item in (split-string line) + when item collect (read item)) + when (and parsed-line + (equal (car (last parsed-line)) 'function)) + collect (subseq parsed-line 0 3)))) + (when data (setf complexity-data data)) + (delete-file temp-source-file-name))))) + +(provide 'pycomplexity) +;;; pycomplexity.el ends here diff --git a/bundle/pycomplexity/ftplugin/python/runtests.py b/bundle/pycomplexity/autoload/runtests.py similarity index 100% rename from bundle/pycomplexity/ftplugin/python/runtests.py rename to bundle/pycomplexity/autoload/runtests.py diff --git a/bundle/pycomplexity/autoload/tests/__init__.py b/bundle/pycomplexity/autoload/tests/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/__init__.py @@ -0,0 +1 @@ + diff --git a/bundle/pycomplexity/autoload/tests/manual/test_function_on_first_line.py b/bundle/pycomplexity/autoload/tests/manual/test_function_on_first_line.py new file mode 100644 index 0000000..979c8e5 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/manual/test_function_on_first_line.py @@ -0,0 +1,29 @@ +def RED(): + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + a if a else a + diff --git a/bundle/pycomplexity/autoload/tests/manual/test_functions.py b/bundle/pycomplexity/autoload/tests/manual/test_functions.py new file mode 100644 index 0000000..92e9a35 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/manual/test_functions.py @@ -0,0 +1,45 @@ +def one(): + pass + +def two(): + a if a else a + +def three(): + a if a else a if a else a + +def four(): + a if a else a if a else a if a else a + +def five(): + a if a else a if a else a if a else a if a else a + +def six(): + a if a else a if a else a if a else a if a else a if a else a + +def seven(): + a if a else a if a else a if a else a if a else a if a else a if a else a + +def eight(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + +def nine(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + +def ten(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + +def eleven(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + +def twelve(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + +def thirteen(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + +def fourteen(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + +def fifteen(): + a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + diff --git a/bundle/pycomplexity/autoload/tests/manual/test_high_complexity_module.py b/bundle/pycomplexity/autoload/tests/manual/test_high_complexity_module.py new file mode 100644 index 0000000..3acb1af --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/manual/test_high_complexity_module.py @@ -0,0 +1,2 @@ +a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a if a else a + diff --git a/bundle/pycomplexity/autoload/tests/manual/test_update_function.py b/bundle/pycomplexity/autoload/tests/manual/test_update_function.py new file mode 100644 index 0000000..2ff76d6 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/manual/test_update_function.py @@ -0,0 +1,9 @@ +def foo(): + x if x else x if x else x if x else x if x else x if x else x if x else x + # Delete this line, then save. The function should go from yellow to + # green. Then undo and save. The *whole thing* should go back to yellow. + x if x else x + pass + pass + pass + diff --git a/bundle/pycomplexity/autoload/tests/test_comprehensions.py b/bundle/pycomplexity/autoload/tests/test_comprehensions.py new file mode 100644 index 0000000..dbf4589 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/test_comprehensions.py @@ -0,0 +1,58 @@ +from tests.utils import complexity + + +class describe_list_comprehensions: + def test_list_comprehension(self): + assert complexity("[x for x in y]").score == 2 + + def test_list_comprehension_with_inline_conditional(self): + assert complexity("[x if y else z for x in x]").score == 3 + + def test_nested_list_comprehensions(self): + assert complexity("[x for x in [y for y in z]]").score == 3 + + def test_list_comprehensions_with_multiple_fors(self): + assert complexity("[x for x in y for y in z]").score == 3 + + def test_list_comprehension_with_conditional(self): + assert complexity("[x for x in y if x]").score == 3 + + def test_list_comprehension_with_multiple_conditionals(self): + assert complexity("[x for x in y if x and y]").score == 4 + + def test_list_comprehension_with_multiple_conditionals_and_fors(self): + assert complexity( + """ + [x for x in x + for y in y + if x and y] + """).score == 5 + + +class describe_generator_expression: + def test_generator_expression(self): + assert complexity("(x for x in y)").score == 2 + + def test_with_inline_conditional(self): + assert complexity("(x if y else z for x in x)").score == 3 + + def test_nested(self): + assert complexity("(x for x in (y for y in z))").score == 3 + + def test_with_multiple_fors(self): + assert complexity("(x for x in y for y in z)").score == 3 + + def test_with_conditional(self): + assert complexity("(x for x in y if x)").score == 3 + + def test_with_multiple_conditionals(self): + assert complexity("(x for x in y if x and y)").score == 4 + + def test_with_multiple_conditionals_and_fors(self): + assert complexity( + """ + (x for x in x + for y in y + if x and y) + """).score == 5 + diff --git a/bundle/pycomplexity/autoload/tests/test_conditionals.py b/bundle/pycomplexity/autoload/tests/test_conditionals.py new file mode 100644 index 0000000..feddf3c --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/test_conditionals.py @@ -0,0 +1,95 @@ +from tests.utils import complexity + + +class describe_conditionals: + def test_simple_branch(self): + assert complexity( + """ + if x: 1 + # implicit else + """).score == 2 + + def test_branch_with_else(self): + assert complexity( + """ + if x: 1 + else: 2 + """).score == 2 + + def test_branch_with_else_if(self): + assert complexity( + """ + if x: 1 + elif y: 2 + # implicit else + """).score == 3 + + def test_branch_with_else_if_and_else(self): + assert complexity( + """ + if x: 1 + elif y: 2 + else: 3 + """).score == 3 + + def test_child_nodes_of_ifs(self): + assert complexity( + """ + if x: + if y: 1 + else: 2 + else: 3 + """).score == 3 + + def test_child_nodes_of_elses(self): + assert complexity( + """ + if x: 1 + else: + if y: 1 + # implicit else + """).score == 3 + + def test_compound_conditionals(self): + assert complexity( + """ + if x or y: 1 + """).score == 3 + + def test_chained_compound_conditionals(self): + assert complexity( + """ + if a or b or c and d and e: 1 + """).score == 6 + + def test_nested_compound_conditionals(self): + assert complexity( + """ + if x or (y or z): 1 + """).score == 4 + + def test_logical_operator_inside_conditional_but_outside_test(self): + assert complexity( + """ + if x: + x and y + """).score == 2 + + +class describe_inline_conditionals: + def test_inline_conditionals(self): + assert complexity("b if c else d").score == 2 + + def test_nested_inline_conditionals(self): + assert complexity( + """ + (b + if c + else (d + if e + else f)) + """).score == 3 + + def test_logical_operator_in_inline_conditional(self): + assert complexity("a if b and c else d").score == 3 + diff --git a/bundle/pycomplexity/autoload/tests/test_exceptions.py b/bundle/pycomplexity/autoload/tests/test_exceptions.py new file mode 100644 index 0000000..56414c6 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/test_exceptions.py @@ -0,0 +1,74 @@ +from tests.utils import complexity + + +class describe_exception_handling: + def test_try(self): + assert complexity( + """ + try: 1 + except: 2 + """).score == 2 + + def test_try_with_multiple_excepts(self): + assert complexity( + """ + try: 1 + except A: 2 + except B: 3 + except C: 4 + """).score == 4 + + def test_try_with_multiple_exception_types_in_one_except(self): + assert complexity( + """ + try: 1 + except (A, B): 2 + """).score == 2 + + def test_try_with_child_nodes(self): + assert complexity( + """ + try: + if x: 1 + else: 2 + except: 2 + """).score == 3 + + def test_try_with_finally(self): + assert complexity( + """ + try: 1 + except: 2 + finally: 3 + """).score == 2 + + def test_try_with_else(self): + assert complexity( + """ + try: 1 + except: 2 + else: 3 + """).score == 2 + + def test_try_with_finally_and_child_nodes(self): + # Try/finally/else/except are all deceiving. The try and finally don't + # add any paths because they both always happen. An except adds one + # (it can either happen or not), but an else doesn't (it's equivalent + # to adding the code after the line in the try: that threw the + # exception, so it doesn't add a path). + assert complexity( + """ + try: + if a: 1 + else: 2 + except: + if a: 1 + else: 2 + else: + if a: 1 + else: 2 + finally: + if a: 1 + else: 2 + """).score == 6 + diff --git a/bundle/pycomplexity/autoload/tests/test_integration.py b/bundle/pycomplexity/autoload/tests/test_integration.py new file mode 100644 index 0000000..fe04613 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/test_integration.py @@ -0,0 +1,56 @@ +from tests.utils import complexity + + +class describe_integration: + def test_multiple_ifs_in_a_for_loop(self): + assert complexity( + """ + for x in y: + if x: pass + # implicit else + if y: pass + # implicit else + """).score == 4 + + def test_lambdas_in_a_function(self): + assert complexity( + """ + def foo(): + x = lambda: x if x else x + y if y else y + """).results.named('foo').score == 3 + + def test_a_big_hairy_mess(self): + assert complexity( + """ + while True: #1 + if x and y or (z and w): #4 + try: + x or y + raise x + except: #1 + 5 + finally: + break + else: + [x for x in [x and y for x in y if z or w]] #5 + try: + return + except A: #1 + return + except B: #1 + (y for y in z) #1 + finally: + raise (x for x in z) #1 + """).score == 15 + + def test_module_stat_comes_before_function_stat(self): + stats = complexity("def foo(): pass\npass").results + stat_names = [stat.name for stat in stats.ordered_by_line()] + assert stat_names == ['', 'foo'] + + def test_class_stat_comes_before_module_stat(self): + stats = complexity("class Foo: pass\npass").results + stat_names = [stat.name for stat in stats.ordered_by_line()] + assert stat_names == ['', 'Foo'] + diff --git a/bundle/pycomplexity/autoload/tests/test_loops.py b/bundle/pycomplexity/autoload/tests/test_loops.py new file mode 100644 index 0000000..7ef2107 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/test_loops.py @@ -0,0 +1,135 @@ +from tests.utils import complexity + + +class describe_for_loops: + def test_for_loops(self): + assert complexity( + """ + for x in y: 1 + # implicit else + """).score == 2 + + def test_else_clauses_on_for_loops(self): + assert complexity( + """ + for x in y: 1 + else: 2 + """).score == 2 + + def test_child_nodes_of_for_loops(self): + assert complexity( + """ + for x in y: + if x: 1 + else: 2 + # implicit else + """).score == 3 + + def test_child_nodes_in_for_loop_else_clauses(self): + assert complexity( + """ + for x in y: 1 + else: + if x: 2 + else: 3 + """).score == 3 + + def test_break_statements_in_for_loops(self): + # This seems like it should be more complex than an if with "pass"es, + # but it's not. The break just reroutes the "if" path: instead of + # going to the end of the loop and back up top, it goes straight back + # up. + assert complexity( + """ + for x in y: + if x: + break + """).score == 3 + + def test_break_statements_in_for_loops_with_else_clauses(self): + # A "break" in a for loop skips the "else". My intuitive + # interpretation is that this should increase CC by one. However, it's + # basically a GOTO, and GOTOs don't increase the CC. Drawing the graph + # out seems to confirm that a "break" with an "else" does not add a + # path. + assert complexity( + """ + for x in y: + if x: + break + else: + pass + """).score == 3 + + def test_continue_statement_in_for_loop(self): + assert complexity( + """ + for x in y: + if x: + continue + """).score == 3 + + +# These are basically identical to the "for" loop tests, but abstracting them +# to remove the duplication would be just as long and more confusing. +class describe_while_loops: + def test_while_loops(self): + assert complexity( + """ + while x: 1 + # implicit else + """).score == 2 + + def test_else_clauses_on_while_loops(self): + assert complexity( + """ + while x: 1 + else: 2 + """).score == 2 + + def test_child_nodes_of_while_loops(self): + assert complexity( + """ + while x: + if x: 1 + else: 2 + # implicit else + """).score == 3 + + def test_child_nodes_in_while_loop_else_clauses(self): + assert complexity( + """ + while x: 1 + else: + if x: 2 + else: 3 + """).score == 3 + + def test_break_statements_in_while_loops(self): + # See discussion for "for" loops above. + assert complexity( + """ + while x: + if x: + break + """).score == 3 + + def test_break_statements_in_while_loops_with_else_clauses(self): + # See discussion for for loops above. + assert complexity( + """ + while x: + if x: + break + else: + pass + """).score == 3 + + def test_continue_statement_in_while_loop(self): + assert complexity( + """ + while x: + if x: + continue + """).score == 3 + diff --git a/bundle/pycomplexity/autoload/tests/test_scoped_objects.py b/bundle/pycomplexity/autoload/tests/test_scoped_objects.py new file mode 100644 index 0000000..3eba3be --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/test_scoped_objects.py @@ -0,0 +1,163 @@ +from tests.utils import complexity + + +class describe_modules: + def test_that_they_are_scored(self): + assert complexity( + """ + a if a else a + """).results.named('').score == 2 + assert complexity( + """ + 0 if x else 1 if y else 2 + """).results.named('').score == 3 + + def test_that_they_know_their_names(self): + assert complexity("").results.named('').name == '' + + def test_that_they_know_their_line_range(self): + stats = complexity("").results.named('') + assert stats.start_line == 1 + assert stats.end_line == 1 + + stats = complexity( + """ + a + """).results.named('') + print '-%s-' % ( + """ + a + """) + assert stats.start_line == 1 + assert stats.end_line == 3 + + def test_module_with_function_in_it(self): + assert complexity( + """ + a if a else a + def foo(): + a if a else a + a if a else a + """).results.named('').score == 3 + + +class describe_functions: + def test_that_they_are_scored(self): + assert complexity( + """ + def foo(): + 0 if x else 1 + """).results.named('foo').score == 2 + assert complexity( + """ + def foo(): + 0 if x else 1 if y else 2 + """).results.named('foo').score == 3 + + def test_that_they_know_their_names(self): + assert complexity( + """ + def foo(): pass + """).results.named('foo').name == 'foo' + + def test_that_they_know_their_line_range(self): + stats = complexity("def foo(): pass").results.named('foo') + assert stats.start_line == 1 + assert stats.end_line == 1 + + stats = complexity( + """ + def foo(): pass + """).results.named('foo') + assert stats.start_line == 2 + assert stats.end_line == 2 + + +class describe_classes: + def test_that_they_are_scored(self): + assert complexity( + """ + class Foo: + 0 if x else 1 + """).results.named('Foo').score == 2 + assert complexity( + """ + class Foo: + 0 if x else 1 if y else 2 + """).results.named('Foo').score == 3 + + def test_that_they_know_their_names(self): + assert complexity( + """ + class Foo: pass + """).results.named('Foo').name == 'Foo' + + def test_that_they_know_their_line_range(self): + stats = complexity("class Foo: pass").results.named('Foo') + assert stats.start_line == 1 + assert stats.end_line == 1 + + stats = complexity( + """ + class Foo: + pass + """).results.named('Foo') + assert stats.start_line == 2 + assert stats.end_line == 3 + + def test_that_they_include_code_interspersed_with_methods(self): + stats = complexity( + """ + class Foo: + 0 if x else 1 + def foo(self): pass + 0 if x else 1 + """).results.named('Foo') + assert stats.score == 3 + assert stats.end_line == 5 + + + +class describe_methods: + def test_that_they_are_scored(self): + assert complexity( + """ + class Foo: + def foo(): + 0 if x else 1 + """).results.named('Foo.foo').score == 2 + assert complexity( + """ + class Foo: + def foo(): + 0 if x else 1 if y else 2 + """).results.named('Foo.foo').score == 3 + + def test_that_they_know_their_names(self): + assert complexity( + """ + class Foo: + def foo(): pass + """).results.named('Foo.foo').name == 'Foo.foo' + + def test_that_they_know_their_line_range(self): + stats = complexity( + """ + class Foo(): + def foo(): + pass + """).results.named('Foo.foo') + assert stats.start_line == 3 + assert stats.end_line == 4 + + stats = complexity( + """ + pass + class Foo: + def foo(): + pass + pass + """).results.named('Foo.foo') + assert stats.start_line == 4 + assert stats.end_line == 6 + diff --git a/bundle/pycomplexity/autoload/tests/test_simple_statements.py b/bundle/pycomplexity/autoload/tests/test_simple_statements.py new file mode 100644 index 0000000..4511692 --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/test_simple_statements.py @@ -0,0 +1,34 @@ +from tests.utils import complexity + + +class describe_simple_statements: + def test_pass(self): + assert complexity('pass').score == 1 + + def test_statement_sequence(self): + assert complexity( + """ + pass + pass + """).score == 1 + + def test_constant(self): + assert complexity("1").score == 1 + + def test_assignment(self): + assert complexity("x = 1").score == 1 + + def test_name(self): + assert complexity("a").score == 1 + + def test_sequence_of_names(self): + assert complexity( + """ + a + b + c + """).score == 1 + + def test_logical_operators(self): + assert complexity('a and b or (c or d and not e)').score == 1 + diff --git a/bundle/pycomplexity/autoload/tests/utils.py b/bundle/pycomplexity/autoload/tests/utils.py new file mode 100644 index 0000000..7118ded --- /dev/null +++ b/bundle/pycomplexity/autoload/tests/utils.py @@ -0,0 +1,8 @@ +from textwrap import dedent + +from complexity import compute_code_complexity + + +def complexity(code): + return compute_code_complexity(dedent(code)) + diff --git a/bundle/vim-pyflakes/README.mdown b/bundle/vim-pyflakes/README.mdown new file mode 100644 index 0000000..bbf4648 --- /dev/null +++ b/bundle/vim-pyflakes/README.mdown @@ -0,0 +1,38 @@ +Installation +------------ +1. Install [pyflakes](http://pypi.python.org/pypi/pyflakes/) +2. Copy the file `ftplugin/python_pyflakes.vim` to your `~/.vim/ftplugin` directory + + +Usage +----- +1. Open a Python file +2. Press `` to run `pyflakes` on it + +It shows the errors inside a quickfix window, which will allow your to quickly +jump to the error locations by simply pressing [Enter]. + + +Customization +------------- +If you don't want to use the `` key for pyflakes-checking, simply remap it to +another key. It autodetects whether it has been remapped and won't register +the `` key if so. For example, to remap it to `` instead, use: + + autocmd FileType python map :call Pyflakes() + + +Tips +---- +A tip might be to run the Pyflakes check every time you write a Python file, to +enable this, add the following line to your `.vimrc` file (thanks +[Godefroid](http://github.com/gotcha)!): + + autocmd BufWritePost *.py call Pyflakes() + + +This plugin goes well together with the following plugins: + +- [PEP8](http://github.com/nvie/vim-pep8) (Python coding style checker under ``) +- [PyUnit](http://github.com/nvie/vim-pyunit) (unit test helper under `` + and ``) diff --git a/bundle/vim-pyflakes/ftplugin/python_pyflakes.vim b/bundle/vim-pyflakes/ftplugin/python_pyflakes.vim new file mode 100644 index 0000000..b363a7a --- /dev/null +++ b/bundle/vim-pyflakes/ftplugin/python_pyflakes.vim @@ -0,0 +1,74 @@ +" +" Python filetype plugin for running pyflakes +" Language: Python (ft=python) +" Maintainer: Vincent Driessen +" Version: Vim 7 (may work with lower Vim versions, but not tested) +" URL: http://github.com/nvie/vim-pyflakes +" +" Only do this when not done yet for this buffer +if exists("b:loaded_pyflakes_ftplugin") + finish +endif +let b:loaded_pyflakes_ftplugin=1 + +let s:pyflakes_cmd="/usr/local/Cellar/python/2.7/Frameworks/Python.framework/Versions/2.7/bin//pyflakes" + +if !exists("*Pyflakes()") + function Pyflakes() + if !executable(s:pyflakes_cmd) + echoerr "File " . s:pyflakes_cmd . " not found. Please install it first." + return + endif + + set lazyredraw " delay redrawing + cclose " close any existing cwindows + + " store old grep settings (to restore later) + let l:old_gfm=&grepformat + let l:old_gp=&grepprg + + " write any changes before continuing + if &readonly == 0 + update + endif + + " perform the grep itself + let &grepformat="%f:%l: %m" + let &grepprg=s:pyflakes_cmd + silent! grep! % + + " restore grep settings + let &grepformat=l:old_gfm + let &grepprg=l:old_gp + + " open cwindow + let has_results=getqflist() != [] + if has_results + execute 'belowright copen' + setlocal wrap + nnoremap c :cclose + nnoremap q :cclose + endif + + set nolazyredraw + redraw! + + if has_results == 0 + " Show OK status + hi Green ctermfg=green + echohl Green + echon "Static analysis OK" + echohl + endif + endfunction +endif + +" Add mappings, unless the user didn't want this. +" The default mapping is registered under to by default, unless the user +" remapped it already (or a mapping exists already for ) +if !exists("no_plugin_maps") && !exists("no_pyflakes_maps") + if !hasmapto('Pyflakes(') + noremap :call Pyflakes() + noremap! :call Pyflakes() + endif +endif diff --git a/plugin/minibufexpl.vim b/plugin/minibufexpl.vim new file mode 100644 index 0000000..4e78063 --- /dev/null +++ b/plugin/minibufexpl.vim @@ -0,0 +1,1838 @@ +" Mini Buffer Explorer +" +" HINT: Type zR if you don't know how to use folds +" +" Script Info and Documentation {{{ +"============================================================================= +" Copyright: Copyright (C) 2002 & 2003 Bindu Wavell +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" minibufexplorer.vim is provided *as is* and comes with no +" warranty of any kind, either expressed or implied. In no +" event will the copyright holder be liable for any damamges +" resulting from the use of this software. +" +" Name Of File: minibufexpl.vim +" Description: Mini Buffer Explorer Vim Plugin +" Maintainer: Bindu Wavell +" URL: http://vim.sourceforge.net/scripts/script.php?script_id=159 +" Last Change: Sunday, June 21, 2004 +" Version: 6.3.2 +" Derived from Jeff Lanzarotta's bufexplorer.vim version 6.0.7 +" Jeff can be reached at (jefflanzarotta@yahoo.com) and the +" original plugin can be found at: +" http://lanzarotta.tripod.com/vim/plugin/6/bufexplorer.vim.zip +" +" Usage: Normally, this file should reside in the plugins +" directory and be automatically sourced. If not, you must +" manually source this file using ':source minibufexplorer.vim'. +" +" You may use the default keymappings of +" +" mbe - Opens MiniBufExplorer +" +" or you may want to add something like the following +" key mapping to your _vimrc/.vimrc file. +" +" map b :MiniBufExplorer +" +" However, in most cases you won't need any key-bindings at all. +" +" is usually backslash so type "\mbe" (quickly) to open +" the -MiniBufExplorer- window. +" +" Other keymappings include: mbc to close the Explorer +" window, mbu to force the Explorer to Update and +" mbt to toggle the Explorer window; it will open if +" closed or close if open. Each of these key bindings can be +" overridden (see the notes on mbe above.) +" +" You can map these additional commands as follows: +" +" map c :CMiniBufExplorer +" map u :UMiniBufExplorer +" map t :TMiniBufExplorer +" +" NOTE: you can change the key binding used in these mappings +" so that they fit with your configuration of vim. +" +" You can also call each of these features by typing the +" following in command mode: +" +" :MiniBufExplorer " Open and/or goto Explorer +" :CMiniBufExplorer " Close the Explorer if it's open +" :UMiniBufExplorer " Update Explorer without navigating +" :TMiniBufExplorer " Toggle the Explorer window open and +" closed. +" +" To control where the new split window goes relative to the +" current window, use the setting: +" +" let g:miniBufExplSplitBelow=0 " Put new window above +" " current or on the +" " left for vertical split +" let g:miniBufExplSplitBelow=1 " Put new window below +" " current or on the +" " right for vertical split +" +" The default for this is read from the &splitbelow VIM option. +" +" By default we are now (as of 6.0.2) forcing the -MiniBufExplorer- +" window to open up at the edge of the screen. You can turn this +" off by setting the following variable in your .vimrc: +" +" let g:miniBufExplSplitToEdge = 0 +" +" If you would like a vertical explorer you can assign the column +" width (in characters) you want for your explorer window with the +" following .vimrc variable (this was introduced in 6.3.0): +" +" let g:miniBufExplVSplit = 20 " column width in chars +" +" IN HORIZONTAL MODE: +" It is now (as of 6.1.1) possible to set a maximum height for +" the -MiniBufExplorer- window. You can set the max height by +" letting the following variable in your .vimrc: +" +" let g:miniBufExplMaxSize = +" +" setting this to 0 will mean the window gets as big as +" needed to fit all your buffers. +" +" NOTE: This was g:miniBufExplMaxHeight before 6.3.0; the old +" setting is backwards compatible if you don't use MaxSize. +" +" As of 6.2.2 it is possible to set a minimum height for the +" -MiniBufExplorer- window. You can set the min height by +" letting the following variable in your .vimrc: +" +" let g:miniBufExplMinSize = +" +" NOTE: This was g:miniBufExplMinHeight before 6.3.0; the old +" setting is backwards compatible if you don't use MinSize. +" +" IN VERTICAL MODE: (as of 6.3.0) +" By default the vertical explorer has a fixed width. If you put: +" +" let g:miniBufExplMaxSize = +" +" into your .vimrc then MBE will attempt to set the width of the +" MBE window to be as wide as your widest tab. The width will not +" exceed MaxSize even if you have wider tabs. +" +" Accepting the default value of 0 for this will give you a fixed +" width MBE window. +" +" You can specify a MinSize for the vertical explorer window by +" putting the following in your .vimrc: +" +" let g:miniBufExplMinSize = +" +" This will have no effect unless you also specivy MaxSize. +" +" By default we are now (as of 6.0.1) turning on the MoreThanOne +" option. This stops the -MiniBufExplorer- from opening +" automatically until more than one eligible buffer is available. +" You can turn this feature off by setting the following variable +" in your .vimrc: +" +" let g:miniBufExplorerMoreThanOne=1 +" +" (The following enhancement is as of 6.2.2) +" Setting this to 0 will cause the MBE window to be loaded even +" if no buffers are available. Setting it to 1 causes the MBE +" window to be loaded as soon as an eligible buffer is read. You +" can also set it to larger numbers. So if you set it to 4 for +" example the MBE window wouldn't auto-open until 4 eligibles +" buffers had been loaded. This is nice for folks that don't +" want an MBE window unless they are editing more than two or +" three buffers. +" +" To enable the optional mapping of Control + Vim Direction Keys +" [hjkl] to window movement commands, you can put the following into +" your .vimrc: +" +" let g:miniBufExplMapWindowNavVim = 1 +" +" To enable the optional mapping of Control + Arrow Keys to window +" movement commands, you can put the following into your .vimrc: +" +" let g:miniBufExplMapWindowNavArrows = 1 +" +" To enable the optional mapping of and to a +" function that will bring up the next or previous buffer in the +" current window, you can put the following into your .vimrc: +" +" let g:miniBufExplMapCTabSwitchBufs = 1 +" +" To enable the optional mapping of and to mappings +" that will move to the next and previous (respectively) window, you +" can put the following into your .vimrc: +" +" let g:miniBufExplMapCTabSwitchWindows = 1 +" +" +" NOTE: If you set the ...TabSwitchBufs AND ...TabSwitchWindows, +" ...TabSwitchBufs will be enabled and ...TabSwitchWindows +" will not. +" +" As of MBE 6.3.0, you can put the following into your .vimrc: +" +" let g:miniBufExplUseSingleClick = 1 +" +" If you would like to single click on tabs rather than double +" clicking on them to goto the selected buffer. +" +" NOTE: If you use the single click option in taglist.vim you may +" need to get an updated version that includes a patch I +" provided to allow both explorers to provide single click +" buffer selection. +" +" It is possible to customize the the highlighting for the tabs in +" the MBE by configuring the following highlighting groups: +" +" MBENormal - for buffers that have NOT CHANGED and +" are NOT VISIBLE. +" MBEChanged - for buffers that HAVE CHANGED and are +" NOT VISIBLE +" MBEVisibleNormal - buffers that have NOT CHANGED and are +" VISIBLE +" MBEVisibleChanged - buffers that have CHANGED and are VISIBLE +" +" You can either link to an existing highlighting group by +" adding a command like: +" +" hi link MBEVisibleChanged Error +" +" to your .vimrc or you can specify exact foreground and background +" colors using the following syntax: +" +" hi MBEChanged guibg=darkblue ctermbg=darkblue termbg=white +" +" NOTE: If you set a colorscheme in your .vimrc you should do it +" BEFORE updating the MBE highlighting groups. +" +" If you use other explorers like TagList you can (As of 6.2.8) put: +" +" let g:miniBufExplModSelTarget = 1 +" +" into your .vimrc in order to force MBE to try to place selected +" buffers into a window that does not have a nonmodifiable buffer. +" The upshot of this should be that if you go into MBE and select +" a buffer, the buffer should not show up in a window that is +" hosting an explorer. +" +" There is a VIM bug that can cause buffers to show up without +" their highlighting. The following setting will cause MBE to +" try and turn highlighting back on (introduced in 6.3.1): +" +" let g:miniBufExplForceSyntaxEnable = 1 +" +" MBE has had a basic debugging capability for quite some time. +" However, it has not been very friendly in the past. As of 6.0.8, +" you can put one of each of the following into your .vimrc: +" +" let g:miniBufExplorerDebugLevel = 0 " MBE serious errors output +" let g:miniBufExplorerDebugLevel = 4 " MBE all errors output +" let g:miniBufExplorerDebugLevel = 10 " MBE reports everything +" +" You can also set a DebugMode to cause output to be target as +" follows (default is mode 3): +" +" let g:miniBufExplorerDebugMode = 0 " Errors will show up in +" " a vim window +" let g:miniBufExplorerDebugMode = 1 " Uses VIM's echo function +" " to display on the screen +" let g:miniBufExplorerDebugMode = 2 " Writes to a file +" " MiniBufExplorer.DBG +" let g:miniBufExplorerDebugMode = 3 " Store output in global: +" " g:miniBufExplorerDebugOutput +" +" Or if you are able to start VIM, you might just perform these +" at a command prompt right before you do the operation that is +" failing. +" +" History: Moved to end of file +" +" Known Issues: When debugging is turned on and set to output to a window, there +" are some cases where the window is opened more than once, there +" are other cases where an old debug window can be lost. +" +" Several MBE commands can break the window history so [pnw] +" might not take you to the expected window. +" +" Todo: Add the ability to specify a regexp for eligible buffers +" allowing the ability to filter out certain buffers that +" you don't want to control from MBE +" +"============================================================================= +" }}} + +" Startup Check +" +" Has this plugin already been loaded? {{{ +" +if exists('loaded_minibufexplorer') + finish +endif +let loaded_minibufexplorer = 1 +" }}} + +" Mappings and Commands +" +" MBE Keyboard Mappings {{{ +" If we don't already have keyboard mappings for MBE then create them +" +if !hasmapto('MiniBufExplorer') + map mbe MiniBufExplorer +endif +if !hasmapto('CMiniBufExplorer') + map mbc CMiniBufExplorer +endif +if !hasmapto('UMiniBufExplorer') + map mbu UMiniBufExplorer +endif +if !hasmapto('TMiniBufExplorer') + map mbt TMiniBufExplorer +endif + +" }}} +" MBE