From 69142bb95a50d4b1451bdc8b017603615d283347 Mon Sep 17 00:00:00 2001 From: Roi Lipman Date: Tue, 3 Dec 2024 16:26:06 +0200 Subject: [PATCH 1/3] process local folder --- .gitignore | 42 ++++++++++++++++++ api/__pycache__/__init__.cpython-312.pyc | Bin 456 -> 0 bytes api/__pycache__/app.cpython-312.pyc | Bin 16913 -> 0 bytes api/__pycache__/auto_complete.cpython-312.pyc | Bin 458 -> 0 bytes api/__pycache__/graph.cpython-312.pyc | Bin 31685 -> 0 bytes api/__pycache__/info.cpython-312.pyc | Bin 4721 -> 0 bytes api/__pycache__/llm.cpython-312.pyc | Bin 4261 -> 0 bytes api/__pycache__/project.cpython-312.pyc | Bin 5174 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 0 bytes .../__pycache__/analyzer.cpython-312.pyc | Bin 1365 -> 0 bytes .../source_analyzer.cpython-312.pyc | Bin 7766 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 1204 -> 0 bytes .../c/__pycache__/analyzer.cpython-312.pyc | Bin 19407 -> 0 bytes .../__pycache__/analyzer.cpython-312.pyc | Bin 18211 -> 0 bytes api/analyzers/source_analyzer.py | 6 ++- .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 0 bytes .../lcov/__pycache__/__init__.cpython-312.pyc | Bin 213 -> 0 bytes .../lcov/__pycache__/lcov.cpython-312.pyc | Bin 6486 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 387 -> 0 bytes .../__pycache__/argument.cpython-312.pyc | Bin 1736 -> 0 bytes api/entities/__pycache__/cls.cpython-312.pyc | Bin 2478 -> 0 bytes .../entity_encoder.cpython-312.pyc | Bin 1615 -> 0 bytes api/entities/__pycache__/file.cpython-312.pyc | Bin 1670 -> 0 bytes .../__pycache__/function.cpython-312.pyc | Bin 3261 -> 0 bytes .../__pycache__/struct.cpython-312.pyc | Bin 3080 -> 0 bytes api/index.py | 41 +++++++++++++++++ 26 files changed, 87 insertions(+), 2 deletions(-) delete mode 100644 api/__pycache__/__init__.cpython-312.pyc delete mode 100644 api/__pycache__/app.cpython-312.pyc delete mode 100644 api/__pycache__/auto_complete.cpython-312.pyc delete mode 100644 api/__pycache__/graph.cpython-312.pyc delete mode 100644 api/__pycache__/info.cpython-312.pyc delete mode 100644 api/__pycache__/llm.cpython-312.pyc delete mode 100644 api/__pycache__/project.cpython-312.pyc delete mode 100644 api/analyzers/__pycache__/__init__.cpython-312.pyc delete mode 100644 api/analyzers/__pycache__/analyzer.cpython-312.pyc delete mode 100644 api/analyzers/__pycache__/source_analyzer.cpython-312.pyc delete mode 100644 api/analyzers/__pycache__/utils.cpython-312.pyc delete mode 100644 api/analyzers/c/__pycache__/analyzer.cpython-312.pyc delete mode 100644 api/analyzers/python/__pycache__/analyzer.cpython-312.pyc delete mode 100644 api/code_coverage/__pycache__/__init__.cpython-312.pyc delete mode 100644 api/code_coverage/lcov/__pycache__/__init__.cpython-312.pyc delete mode 100644 api/code_coverage/lcov/__pycache__/lcov.cpython-312.pyc delete mode 100644 api/entities/__pycache__/__init__.cpython-312.pyc delete mode 100644 api/entities/__pycache__/argument.cpython-312.pyc delete mode 100644 api/entities/__pycache__/cls.cpython-312.pyc delete mode 100644 api/entities/__pycache__/entity_encoder.cpython-312.pyc delete mode 100644 api/entities/__pycache__/file.cpython-312.pyc delete mode 100644 api/entities/__pycache__/function.cpython-312.pyc delete mode 100644 api/entities/__pycache__/struct.cpython-312.pyc diff --git a/.gitignore b/.gitignore index f01f8e4..6d844eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,44 @@ +# Byte-compiled files +*.pyc +*.pyo +*.pyd +__pycache__/ + +# Virtual environments +venv/ +env/ +.virtualenv/ + +# Distribution/build files +build/ +dist/ +*.egg-info/ +.eggs/ + +# IDE settings +.vscode/ +.idea/ +*.swp + +# Logs and debugging +*.log +*.trace + +# OS-specific files +.DS_Store +Thumbs.db + +# Testing and coverage +htmlcov/ +*.cover +.coverage +.cache/ +pytest_cache/ + +# Jupyter Notebook checkpoints +.ipynb_checkpoints/ + +# Custom settings .env +*.sqlite3 .vercel diff --git a/api/__pycache__/__init__.cpython-312.pyc b/api/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0fd6c0d029486a20bd7b5356dafc3901800d742a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmYk1Jx;?g6vvn21CoxOh^ofBXEE&k(InAp-ybs2@o#A85lSTH?UF` zCN`vQOgJS}JXz1b_vydie18bWuF~^lmjHaU!Jk)#|1x2A zmnF>ElDnl|M>gx{-rU>F6E@h^haEX=Cm+p61ZsEM`!s4`N;J7J&ZcT_v0OT4TDys)BGr8%`5i{3_OK|kGDD>YNmhncnK5N{ z3nAUM-H&*TVZ`rI(ggJ}Ehwv>P^y{Ym5j{0T|)b`D!J**1;Y|$&rH9-+IaZB3{swB zkW_W>z~xd28eyCWfMXg*k8f8Y0p6e UhYcL9;G}`m1}5(?k$a}^2gSmG%m4rY diff --git a/api/__pycache__/app.cpython-312.pyc b/api/__pycache__/app.cpython-312.pyc deleted file mode 100644 index d8aeeff7402c5bb834a3a6cab9c910eefb25ff77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16913 zcmdU0Yiu0Xb)J2{hFp@%Hz{efBE?-rBqd8u99ovGCoNkhZIQMkIteq{8InsccbS=4 zN!%_Q8Zeqw4b(E+!c1c${E;6loTBbO{fio>fPezUFv~#dL`GHAf1Dr1Dpmo*4T_#~ z?>tw#q%0@~x{zisXU;wMG537mIp^N}mxhKg1D_}6`ep~7VwnHLKa7u8FMPh=#W3$N z0wcIG%oP20O}XH2cgFqqZWrG1WIPMrDK9B|Grk4?l%JG+nZQDDDoD!yOlToI6^3#^ z2xcM+>=aAxhcXQdjZ=*a(W&S{(^S(!^Hj5oaWi7@L%jn;%9UxEYJs~g^LvdBTHkOt zVf|&4gzzsSAG+yZL}SbRKI577Ew+CMUJzxOp9R6BTl0~JntvuIE$~Xp zJ~~_k9{B(HzrsZRxZyoU(I<;x6n$zL#u)xGQ)K3S_Ug1OxCHmC>lYs5WeDCk8Dm

IYM5~e(KpRS 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 Ox89D5kMVYse*PbQ5{NGV diff --git a/api/__pycache__/auto_complete.cpython-312.pyc b/api/__pycache__/auto_complete.cpython-312.pyc deleted file mode 100644 index 4e5b9e56c973bdc5ae15bf612ccba2c11569270a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmZ8eF-yZh6u!G$Vlf6+aVoV-7PE;Iu{gPP>DHx$+%-`f6J8RuP@zKy#lf*19Tk6y zi{K)MPEKxxIyw0+Z9#nS-uvFY@4okrdv=_4g0>&k!!hPhU98Mnf_WXmga{&NpTx97 zDG^LEVW4x#dX_N9ykiV3ckPQJ)uqZj20x7y2bm_yNCB9-qcB*;*Y)Ds(HjZq$3^YkOi)r0V`Vd5}0US@k)GZojno_M+e;Qtt z#L^3kfp?L>S(f^N^nyglZm2i^3;iNbxEwlR#zd&RjHxAy4h z&EB|c-ZZCsuXgQ)*XGzIEte~^)LpD-WI2=qj|6P&gZ=|mIfxTc^yMLJVyPdW)iBHq aO6dpLnsG*VrpAn5x^I{1q5Z9^QsWo9$7Emt diff --git a/api/__pycache__/graph.cpython-312.pyc b/api/__pycache__/graph.cpython-312.pyc deleted file mode 100644 index c7e6ae49f4bc6bf3d485d0ba82817c48e1c4ad71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31685 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 KEAkJ~_f7YTJy2cXQL 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 iX4FLiQ9c~B(ISmwb}s(YCl0nJy)y}G zCs`p>Rml^q`an>H$YW6U!F|hP!qZAsC9eo-c0g*S^3s>eYIs=Dm!5OSV>^i{Rez*j z$@ll1Gxy&4&UeoEcY%PHKsh~rcq|?uX}%|63-{&W|*_2ls2uUEDzNt_0dc$tywOrnNu_qFP#KciBS4&;i2L7 zxLNWWxT(j&FbNA$i<`;0=0=m5g#MI-IqCu-1J#wc-6zNOw03fADtq#dPH!8NvAA|J zuB+PU7>!MiS9ekU#AMbAjG4Xt?947R@95H>)xE4-TH@>OI<=t`Q9#Q2v@)fzm-63BJH=qrBa=-E_Q2Grs zb}N-M#x+BUDRDiM(c%af#nhD{O-&lgl#$GgDOzSaN%c%x%b3b^j3z-zGfsG!jUfge zqn8cPC`H8+Oubi$lD=-kba(Qs*eBbEB!Qtyw!>fZs*R8$f)z63f zhoX_6_E$|^jSLU}3{B zcX68S2NYkDRSzlvZn%%p$^}pbmJs8{G*ovJX~7>?I4gpsvd=Luk>T%65G!@W- z_oCpvAY9CGO*!9Zx$NoOp&_7DBWdb1s~DQ8#HT1lk11)Hdav@f)rOrBn?}Dv-cykG zlmuY0^R3Vc;Ct$32w^k`zy?dS4Gw3CC`enOOAkO5mKg2QgSf^~OF-&uhk=3jjE<<- zAPj*8n_=yZ&||ocf+?r~e=fwIUwQ67G|#;Xwl3ay9_*YKiZ0^u-ghmy=8Xpz7jJLK zM-fu~1%F}xnbl*fZH0ylFXW3qy!O>^$J@sJH{5a_-0lz!}1DC)Qxf z1{V;!NjqSNxw?T^G6f(8;6lKsNk{{fT>VZ>#C9|XtX+ok4$~;mtK|0CKrUHAFn8wm zch<7jtAyokhz3%$5$(PcqZv@8U9i91$PVM|QLGT-wXtmzEMzhzZ2uS}@n<}M3b7q} z2e$V&JxqL^SR7vJdfs?!-uHc|<(0qg{@}u3;Xrpjod2M3_G+Q^+J=8a;L}PskKSG{=Y`zRr!QqG{1+! z**8mdCYD)Km^L zAFp0o{kYJ2VZ(p1I>vmIPv&nH8X_BV-)5+(AUEyy!qcnGtG>0KwO_2o3yq&`$d`A8 z7!qlN6ssBQHcy{hSpTrKj~AZt67<7+XbWBkCS!IScA42p48xd)QxPi5cPnNjk3c%PX5@_;utXZw!!ckG#XRkoBWNZ;=ibv~U3hY6%Jj|N> j^(`C~k2b>!OhL2s^JO*Pvnu3IKh1o1uy{H<)NhIL35*qt}? zzVqhIdvE{g^SKc`?<}27{dNGM@A#zoC=Fo$?*RM(X-Jc@D8@%yR?698Hi^S>R?guV z7BJ4*b4pCfIbx2SGv>^>Vy>J!=FWLyo}4%4m5>b)lo@I&XpgXZvOQ};n*E8gX{*mb zzJn-9o96r+#{wWHu-PC}yEGRG0>%xPZVqc6cpb2&XkJ+BS&<^X|8nZZh{Qs-3q-$` zo+mn?s+s2z(|5tkcL6&GKGEddQ5*s``7h0$DdNQ3_eP?Vuna&bj&5?)^j)up^RU=`h zTeB?rlw>W~95D1BJiRXGuT|yx-`EgZ8mQDEAdIk;tOhC&3_DiobNbx z24R24(|0_-1hpglau-Fq7nyUes6!TqB7u4Cz8Arip9OQNP%`2suMtj4J}IUt(U?-y z)1MRx!v)n`nqw}5CgO&vQj5_~F9!**hRu z(?F}Jc3uwCM#ZBJAdg_?%r}doGuhfFuVPG2WDSGYgfKk+yEM6!&ymSgab@yBo-P{& zH9;m5P;%obUKXujHk+F$tgx=QMv`fr#G4xEYapx#UgOWu43yEcK>zPo%Qp_*mrz$< zwfp3=uEFZyslAccc1PaW9(kiWe7bt#)Pc($>^|_K;Lu^*X!S(ciaTrJdmcCXe{fcP z&-0CR;;X$kHsC+7k9WDj^xsIx+g|H`)nTJJG|{^m*OonS-my6RdU*{wxma?1VQ@aqC7s?(%f)hJ@_CUEIHo z``6_ie6otYjTzp-!|j=K2cNF>3EIJJJov})$8T?>o?fU7&F)d{xr2}?klm5Gqspm`mdbBEJ>}c`5T5u!c*xQ;BLeh>+0i zi>peiU`BtDU+qnaMmhTW#9PrMB$}n@rAx1``Yo#knvcjL+tG7i2=nH6j~!2lb~oan zTrK4(f^q`|4fSwB_k*;#6c^OYn^;oKxBnsjN zFkd^<#FtYB&wM;9h3N$@tSg?NL^TPZ;?Pg)CcO;H|A5!{2tH+WprC>1#>bWZ%jJc= z{)=1D=}P}h`IZ2GS?RyJg?oV{bf)U-+Y1ivg(h}GQ`@1brxz=s`2zB2B_crn4S+R3N~jeemQcuW`sW@^DoJ0V zKeY~7LM9J8@w|vD*)pwQX;MLF(hf(t-R*VMW-G}@YI^}!k|B`f#Z~vO8=HSOyz0I~ zj6z;F$h%=UWA1%M(!73DA2TSGOqzuFy8$4!6F{$+nfRONa4k_E~!;~ z>ZdHL#xi{m=(gZB2z<(D&vRn^X2o-^Jo5~DzF7Ed;n4@{57#qW-H{!9VGp~0_rarw zk1|{C(>r*y8tB;#gtr6X#{-qXh4PKPmvit;AkI0`OQ*PnL!#JGH5E6s2tMEQ52R^f{rq2|Uq-hsW&VYhYk0{f^{$WaBR+orksWzYRy@OHXAS$M@yGH$f}s|6O1+QX TtbwH7$7jT_apr)}gjqiVGeLK4 diff --git a/api/__pycache__/project.cpython-312.pyc b/api/__pycache__/project.cpython-312.pyc deleted file mode 100644 index 8f7478bcb112990f93a4ffa1ed66f316a2e773f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5174 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 J{Djhv`7c9%V%z`# diff --git a/api/analyzers/__pycache__/__init__.cpython-312.pyc b/api/analyzers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2dc9e364652d85146ab563094369df57333f03cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmX@j%ge<81Z#s;(sh9JV-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9i2>VNJ$c ze8KspMaij-d5JldRjEaOnoPI&i@`$iiBPd3W}woQ44**;{<7E4$j?pHPcN<1FV8Q^ zE-pw+PSsD&Pf3kWFG?)PKxV@97wgBzXXa&=#K-FuRNmsS$<0qG%}KQ@;sBZlaz!zS R@qw93R)`^ZMSk?pGP1&!9|> zR)F!Q0DA}{ECtAdryNM3Y{?Q}B~U`uQbWzsBqXET2&=mYYeYRz@_4H>kj&B-P}-)% z)h#FOnKD;eH*fK?PKTw`anq2by%@WBL@vvPGEM~8Lj+k8MwUzzED;sUMB7=Ich50a zu_r+E6#`;(h#z&0gvKsmjNrzxaL=gwabuf2P4C>jPn{$o)Xeih zWh3tF5I3ELwD-}z!c|5Bk5IHaYZY?ZZvywNSfXLp!p=G4_V^4r0K?(*j+Ymj+~I#Hm})s7~_5bc)_+G^_?KMQ21k@z&)4!nCr(rBDx61 zWe{0&SpjH@0&SUqaP~lmUG!eNFp{g9{vsVA@pvU4)z=Q|Ynk$9`#ZcFE2y-bIgKt( z&`ULUUpg|^56$)59najqLC$QVte{z@E211P!xahqPTsrXbX*E|HJ>MI?|93+ay{R` lCS4VNlK8R9LW~qil0Km7N3`+@UHze6lJw{7ClZgW=5KV6Q4jzC diff --git a/api/analyzers/__pycache__/source_analyzer.cpython-312.pyc b/api/analyzers/__pycache__/source_analyzer.cpython-312.pyc deleted file mode 100644 index 19cb66ba5a4de094d7faa4f9fe70e72f6a2ea6db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7766 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 CX02lY diff --git a/api/analyzers/__pycache__/utils.cpython-312.pyc b/api/analyzers/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 310ac87eb76192ce32755d86ec5630dbd3ab8809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 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 WGk&hWY|tFiq@1n)O_3NG!~X)*XCV#% diff --git a/api/analyzers/source_analyzer.py b/api/analyzers/source_analyzer.py index 0324014..c0fc786 100644 --- a/api/analyzers/source_analyzer.py +++ b/api/analyzers/source_analyzer.py @@ -135,7 +135,7 @@ def analyze_sources(self, ignore: List[str]) -> None: # Second pass analysis of the source code self.second_pass(ignore, executor) - def analyze(self, path: str, g: Graph, ignore: Optional[List[str]] = []) -> None: + def analyze_local_folder(self, path: str, g: Graph, ignore: Optional[List[str]] = []) -> None: """ Analyze path. @@ -144,6 +144,8 @@ def analyze(self, path: str, g: Graph, ignore: Optional[List[str]] = []) -> None ignore (List(str)): List of paths to skip """ + logging.info(f"Analyzing local folder {path}") + # Save original working directory for later restore original_dir = Path.cwd() @@ -179,4 +181,4 @@ def analyze_local_repository(self, path: str, ignore: Optional[List[str]] = []) self.graph.set_graph_commit(head.hexsha) return self.graph - + diff --git a/api/code_coverage/__pycache__/__init__.cpython-312.pyc b/api/code_coverage/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 81ccbfa0540a73fabe721d9a4734c6b5668f4bbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmX@j%ge<81Qr=8=^{Y-F^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-j6gw6##@Y9 zen65XCpo`tCBtWsj$h9D8Tq-X`st;W`sMjW*~JBk$*KCu`6;RK=|zbJ85m5U*3_cJ x^i=)$_{_Y_lK6PNg34PQHo5sJr8%i~MI1mgL6#MR7$2A!85!>~2p6#dIRN;4FeLy0 diff --git a/api/code_coverage/lcov/__pycache__/__init__.cpython-312.pyc b/api/code_coverage/lcov/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 76736582edb4e4eeaa587410d538ecd11ed25b70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmX@j%ge<81Qr=8=?XylF^B^LOi;#W0U%>KLkdF*V-7{%vWp86lT-DR z^HWme(~A-dGBB7x{i#KX>8bi4ll0@`GxIV_;^XxSDsOSv&^u diff --git a/api/code_coverage/lcov/__pycache__/lcov.cpython-312.pyc b/api/code_coverage/lcov/__pycache__/lcov.cpython-312.pyc deleted file mode 100644 index ad2e82afabd45c8f3bd624e6af143476b96b7c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6486 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 diff --git a/api/entities/__pycache__/argument.cpython-312.pyc b/api/entities/__pycache__/argument.cpython-312.pyc deleted file mode 100644 index 3ec0c0fd913d242f9b32a102b62b7a6ae0d0538e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1736 zcmcIkJ#5=n5Ppw8`eE(LiG^BD;(&;w+H3-A@e-pAP^U>z59;7#Q4tV~_#`WqNac}2 zN>v3scyNIfbtlOPiYy%>6h%9xQ-Q8snxcb1v_ODN-H50_flR$4DMn7yv2QqjclYji z-`$Zv&(10Y&bQm=>(@m>o}w~2QVhoD0rZJUOxh$ZTA`E(5@-U{WTU0+X1y2zFC6rCQ3A_oa$#icG8t zW(sgB#%aK5z!|V-0B7N~SwHhGuXkF^a(&4%TFjSSug!En#hKgTR=En)l7j`KK3)aU zCp}?LFojQr9_d|v(aU$VX2c>tM;witm>{Q$vyBm z8;OR&Se&}*xLn&%%ZTlo>h3_Axcs$aw?h)@>ZF$+LEO!YsvWl$Qd|d?|4O00$7)8W z={l-wt7Y3_FOru1^bKp*vhP|$f#WoM3E!cKzT~iGEi~~o*d1&T)cgE$X~%A{QoZAq z?%I6UX&Y5ms@f*g>)dGXOhf2Cw1qjPgiPD>GrHb@Zs~gW#H3Ga6BF*2a|Xm72~Luk z69?~%@=FI-pX3V%(!J~`zjz>ho*jdqRFg@7f??tOHUPj{!rX2HdimUk1qDyMp3~m@ zn=3@W6BpPfvCxEXett-USY*3SQMdrO_O}3;WRAAHLNP* zGK5AS%M2h`30wnTw&7Fe4i>A%>yXlQb_Y6^o7x66EWsUT9mF2_J-0Y0eqH!2_tt2> z@FX|?h4+~^xcXr0XzOwA&0lky57)oDG`#dk{!#fsd3<5>m&|6^J59lF3s+XxeMQ$> zw%KVSp3(I?9ith0MA$u!UklHn$fI}zgfHE)?Iu43a7e<0;r>Rz45R)54heHU diff --git a/api/entities/__pycache__/cls.cpython-312.pyc b/api/entities/__pycache__/cls.cpython-312.pyc deleted file mode 100644 index 88c6a6c5c7c8f48545712e8e4700e5c359093a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2478 zcmb7G-D@0G6uxFbjeBq6d@C@F^v`)H0mspUJ(G{TyLrsE~Hja?442?&|qpLv6T2DHHDcWBlFs_d8 z@2cm9uHAH39KOML=Z5Q{K(Fr16o+navxQ)GsPRC)F=G;&HD`?v8&0CPJ?b!Hx#89u zMhIilFgGx$Gw*s1-IF11;I0g@?$19BOnS&)#s|7*OlCy*7%%?h+_3Ly4a4pmd(s&1 zIP-S9iBA~%M%DMQu_R?O55I^p>3Shj&GFA;G*R%LJm^bYTi~}@9eeX>P9l8IEX}(R z|6h`-sW8p~rt(SSlg=l8sLVnn2TpVTnGOMuOm_6o86b_F+IW=|f!u`XKPhH%Q@2X#` z53fEtdbv-8E5dkh{KQ>-Q@{Ng)KfW{wyE7-0d_LR#x}cZKX94f7k+P&h{Mrf_}-f2fkY{{rnv4=w-z diff --git a/api/entities/__pycache__/entity_encoder.cpython-312.pyc b/api/entities/__pycache__/entity_encoder.cpython-312.pyc deleted file mode 100644 index 4adff1d9c43e39f7479209589a2563b1e09bf9c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1615 zcmaJ=&ubGw6rP#gB%7v9wY4h#fGsGvAO=COhzP|BA`->wrBKUucTCnMyJ2=~jkZ!n z=%IoUEA7F9C$UuU;zj=jFO~KnOF=;|-Xig$C*Pah#6;8wJMYcgH*daq-+S+Rdb$Y6 zQ1L+FIV0pVZknRTM&mLV%fu!&Es-)Eqh&V6%F38RiOo2*6|P=WZS}r7mar3?#rq`e zlXi+L@m_;{O4`g$gRND&jLcWO!camr@7X+5&)5Z6FPcFyq;8lLJeU@)MPnSOl=y4p z!B{4<->1Adc`^1s(- zH~d^CL92EhFQs{SMK?sOQn3wG^cc~D37c3ra3T7^lfr-uEc2vwx9G)CTIskO0}*)R zH7t^w*6rYkWi8etNm9fvw6G+GB6gsSjSv+O z(d)Y2S;7i5vOpqm#{6@z%#%+?a<2-jg_q98z|gAmV*Aq6v%x3s3+Mg7(1(Bj`j$|- zvvr~*vOmIsA^d#I`M7U*oBF12cp%w91P-nw;w>1RO%TA4N3s@MBJ=lgXm6bWA1bBo zRJ!SFZ>^3~2vJJgDeN&R9jCCJr2HP!dlcxnb^3~n!>9+I9?gg@=L$A3Ox45sv^(W` zGj4}h52_V@Lcfjb5I5!wE$ni9$Mpl#wYb2_M0{eMB%cDCOEMLv&)l?lC2%}f^ntT| zGWz2wl?Y&b5rNnTL2`s5dbd*BYlBOdH&c7IdiSgxUA(id?cYlG*M^sZ&Gf$i`@Up% zt?wS+$X;F7uF3(+8|hHHW|pQrVNXW5C1gY!spQ0M|x@7Cx9 LU9rCt)bh?>?MhF$ diff --git a/api/entities/__pycache__/file.cpython-312.pyc b/api/entities/__pycache__/file.cpython-312.pyc deleted file mode 100644 index beae41c67a47f0db8f8c6fc474484a9e8633e74a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1670 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 A)c^nh diff --git a/api/entities/__pycache__/struct.cpython-312.pyc b/api/entities/__pycache__/struct.cpython-312.pyc deleted file mode 100644 index 2b2373168011b4f5f4cf44570a202681cf3809c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3080 zcmb7G-)kI29G~6$wR?9-u1#!{wAHn3>TOJNwU(l#6biMaFIO-M5|w4S+1zb<*}LxU z5ig$7hX@rE6MRTwl{O$)DMEeg|KLjl6_2Gt!6)C&L=b%PGqZc!%du4)*ze5u=YD7A zGvAq?1_sgu?T6XpWg|t%Z;a`-cre&Kj=?&igbG!%D9i~05y@pj#T7zh_e9@nPHe{2 z#P5tz1y8zKcg>omS4+Our`dqneGh|mVvsq3k~xtIb1^C!aT>!HHxfpC40@U{k~E1g zMWy*Hl~>|(DVj3k^CC@SEYZvgnUlFs7JkesNe7@wHzjq@OU}A>qvS4MOe<(_8g<)n z49j&CU2(WZSu))UI7?qN6y2iulvhnO1p*yL<7v?pC}wv-M(7da`4eG{@C# z*GsXXVNow>8*an4ilt;QPu8*JiQ(IQ2V|YJgci{-@>@#;Cxl!KT(F#kwBq2HCvU9; zxbB9KG69$9>Y9Qo>R%%a&y`L0ie_!2hjth2vU4`%m?xX3 zlE>WDv&vf)!{-|oHEd<6VwNh33t_N;rlU|}-n0z5Cj?*6o)Da`&G&fvi^_h-8kSSZ zck%KrV!uBXZbXnpxE;#gILbw1UT;*ft8Psx)-24;kLlBJkCeP=xrjB(HcY7^<-LKh zHhy}whFvn0QjJDL!WMVqyn*5Wj8asSHp7LDQ$}ow5t$Ko{JiA6X;i7BCcU_0ROg>* z=&%U>-2OgSsMHpXLb=f_EY<95PF*h<1(vy1w)J|YcL>}A4~A3lH*Tih^dwC)0TNAH z9-8IHVWul!sW~$sH%Mokj6Z)f{+Zk!JK}eT(Mj#Gqv!_PV+y+Llc|}T@y|26@F1lS z%U}laapbo#K=}~dP}@TB=oSt;+ae1g>R}o*OQ5k^gyIw|gt+hO2!RGCVxjk>1xjd= z(6DLrHE2@M@PfBj1&stvw?6eKp^>3sbLnfh$Tx$tL`@f$NB4lvq-VPr^hA?-skg0b zR&B}ZGh+uWFznN?^AfGWG3dtb^9hlDR*BF6xy-Lm<718oR3$G}(H-4&ZF?B=d?oYSaa^BvD1WLUSV}Rn&q?p4x=>ewThIUalA2~*2iyiixH0x6SU6vT+#rvK#x^Ft zJ@9BK-yR-)k{el<*W^1B-%V~!Zs(?UNMc{1-7kzm$SkEb36|=Xx}AG@Cjnt6N%lRr zKDagrabc^loqJ^`#l#X5XVdIU;5BgC?JFDR%2VNZbNwXhCdpm@$G{D8BY@#&rYuXlg% z#a(2tqTsUC?Q&xgcgWt$)eWBs&3b6cfBDp|sEWK|cuBopM-@_Id`JB|@DS$Wu(_c$ z`Bg;LDb;w0>iTddJWm5sBScD>pW|#4uNhy)v z7~Uo5c1GmH$<6^eably?A?WV--Cg=8KdA|5o+j!^=lq$U dx7n#+KymhibYg-a{7Me}6@N`Qu|q((&p*XejN$+Q diff --git a/api/index.py b/api/index.py index 2c0398c..bf1d3e7 100644 --- a/api/index.py +++ b/api/index.py @@ -1,6 +1,7 @@ import os import datetime from api import * +from pathlib import Path from typing import Optional from functools import wraps from falkordb import FalkorDB @@ -309,3 +310,43 @@ def chat(): response = { 'status': 'success', 'response': answer } return jsonify(response), 200 + +@app.route('/analyze_folder', methods=['POST']) +@token_required # Apply token authentication decorator +def analyze_folder(): + """ + Endpoint to analyze local source code + Expects 'path' and optionaly an ignore list. + + Returns: + Status code + """ + + # Get JSON data from the request + data = request.get_json() + + # Get query parameters + path = data.get('path') + ignore = data.get('ignore', []) + + # Validate 'path' parameter + if not path: + logging.error("'path' is missing from the request.") + return jsonify({"status": "'path' is required."}), 400 + + proj_name = Path(path).name + + # Initialize the graph with the provided project name + g = Graph(proj_name) + + # Analyze source code within given folder + analyzer = SourceAnalyzer() + analyzer.analyze_local_folder(path, g, ignore) + + # Return response + response = { + 'status': 'success' + } + + return jsonify(response), 200 + From 3de17bb5d5da963da7c60de32e19d49165e81caf Mon Sep 17 00:00:00 2001 From: Roi Lipman Date: Tue, 3 Dec 2024 18:28:39 +0200 Subject: [PATCH 2/3] improved process local dir endpoint --- api/index.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/api/index.py b/api/index.py index bf1d3e7..79598a3 100644 --- a/api/index.py +++ b/api/index.py @@ -316,10 +316,14 @@ def chat(): def analyze_folder(): """ Endpoint to analyze local source code - Expects 'path' and optionaly an ignore list. + Expects 'path' and optionally an ignore list. Returns: - Status code + JSON response with status and error message if applicable + Status codes: + 200: Success + 400: Invalid input + 500: Internal server error """ # Get JSON data from the request @@ -329,11 +333,21 @@ def analyze_folder(): path = data.get('path') ignore = data.get('ignore', []) - # Validate 'path' parameter + # Validate input parameters if not path: logging.error("'path' is missing from the request.") return jsonify({"status": "'path' is required."}), 400 + # Validate path exists and is a directory + if not os.path.isdir(path): + logging.error(f"Path '{path}' does not exist or is not a directory") + return jsonify({"status": "Invalid path: must be an existing directory"}), 400 + + # Validate ignore list contains valid paths + if not isinstance(ignore, list): + logging.error("'ignore' must be a list of paths") + return jsonify({"status": "'ignore' must be a list of paths"}), 400 + proj_name = Path(path).name # Initialize the graph with the provided project name @@ -345,8 +359,8 @@ def analyze_folder(): # Return response response = { - 'status': 'success' - } - + 'status': 'success', + 'project': proj_name + } return jsonify(response), 200 From 49c2f1643668212f7e4b07482eece64eee78343f Mon Sep 17 00:00:00 2001 From: Roi Lipman Date: Tue, 3 Dec 2024 18:51:41 +0200 Subject: [PATCH 3/3] updated readme --- README.md | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index df365cf..1fb6a2d 100644 --- a/README.md +++ b/README.md @@ -5,25 +5,44 @@ ## Getting Started [Live Demo](https://code-graph.falkordb.com/) +## Running locally +### Run FalkorDB +Free cloud instance: https://app.falkordb.cloud/signup + +Or by running locally with docker: ```bash -flask --app code_graph run --debug +docker run -p 6379:6379 -p 3000:3000 -it --rm falkordb/falkordb:latest ``` -Process local git repository, ignoring specific folder(s) +### Config +Create your own `.env` file from the `.env.template` file +Start the server: ```bash -curl -X POST http://127.0.0.1:5000/process_local_repo -H "Content-Type: application/json" -d '{"repo": "/Users/roilipman/Dev/FalkorDB", "ignore": ["./.github", "./sbin", "./.git","./deps", "./bin", "./build"]}' +flask --app api/index.py run --debug ``` -Process code coverage - +### Creating a graph +Process a local source folder: ```bash -curl -X POST http://127.0.0.1:5000/process_code_coverage -H "Content-Type: application/json" -d '{"lcov": "/Users/roilipman/Dev/code_graph/code_graph/code_coverage/lcov/falkordb.lcov", "repo": "FalkorDB"}' +curl -X POST http://127.0.0.1:5000/analyze_folder -H "Content-Type: application/json" -d '{"path": "", "ignore": []}' -H "Authorization: <.ENV_SECRET_TOKEN>" ``` -Process git information - +For example: ```bash -curl -X POST http://127.0.0.1:5000/process_git_history -H "Content-Type: application/json" -d '{"repo": "/Users/roilipman/Dev/falkorDB"}' +curl -X POST http://127.0.0.1:5000/analyze_folder -H "Content-Type: application/json" -d '{"path": "/Users/roilipman/Dev/GraphRAG-SDK", "ignore": ["./.github", "./build"]}' -H "Authorization: OpenSesame" ``` +## Working with your graph +Once the source code analysis completes your FalkorDB DB will be populated with +a graph representation of your source code, the graph name should be the same as +the name of the folder you've requested to analyze, for the example above a graph named: +"GraphRAG-SDK". + +At the moment only the Python and C languages are supported, we do intend to support additional languages. + +At this point you can explore and query your source code using various tools +Here are several options: +1. FalkorDB built-in UI +2. One of FalkorDB's [clients](https://docs.falkordb.com/clients.html) +3. Use FalkorDB [GraphRAG-SDK](https://github.com/FalkorDB/GraphRAG-SDK) to connect an LLM for natural language exploration.