From ac4737da852aab29255d18fb6a18b307fb0b3732 Mon Sep 17 00:00:00 2001 From: Sosokker Date: Sun, 11 May 2025 17:33:10 +0700 Subject: [PATCH] Moved all crawler-ai content into 'crawler_ai_project_files' subdirectory --- __pycache__/config.cpython-312.pyc | Bin 0 -> 3295 bytes __pycache__/crawler_logic.cpython-312.pyc | Bin 0 -> 17301 bytes __pycache__/log_stream.cpython-312.pyc | Bin 0 -> 1648 bytes __pycache__/logging_utils.cpython-312.pyc | Bin 0 -> 3108 bytes __pycache__/main.cpython-312.pyc | Bin 0 -> 6502 bytes __pycache__/models.cpython-312.pyc | Bin 0 -> 8078 bytes __pycache__/services.cpython-312.pyc | Bin 0 -> 3888 bytes __pycache__/stores.cpython-312.pyc | Bin 0 -> 2977 bytes .../.gitignore | 0 .../.python-version | 0 .../README.md | 0 .../config.py | 0 .../ingestion}/adapters/__init__.py | 0 .../ingestion}/adapters/api_adapter.py | 0 .../ingestion}/adapters/base.py | 0 .../ingestion}/adapters/file_adapter.py | 0 .../adapters/web_scraper_adapter.py | 0 .../ingestion}/ingestor.py | 0 .../log}/__init__.py | 0 .../log}/log_stream.py | 0 .../log}/logging_utils.py | 0 main.py => crawler_ai_project_files/main.py | 0 .../models.py | 0 .../normalization}/__init__.py | 0 .../normalization}/base.py | 0 .../normalization}/normalizer.py | 0 .../normalization}/utils.py | 0 .../pyproject.toml | 0 .../sample.json | 0 .../schema.yaml | 0 .../services.py | 0 .../stores.py | 0 crawler_ai_project_files/testfile | 28 ++++++++++++++++++ .../tests}/__init__.py | 0 .../tests}/test_api_adapter.py | 0 uv.lock => crawler_ai_project_files/uv.lock | 0 36 files changed, 28 insertions(+) create mode 100644 __pycache__/config.cpython-312.pyc create mode 100644 __pycache__/crawler_logic.cpython-312.pyc create mode 100644 __pycache__/log_stream.cpython-312.pyc create mode 100644 __pycache__/logging_utils.cpython-312.pyc create mode 100644 __pycache__/main.cpython-312.pyc create mode 100644 __pycache__/models.cpython-312.pyc create mode 100644 __pycache__/services.cpython-312.pyc create mode 100644 __pycache__/stores.cpython-312.pyc rename .gitignore => crawler_ai_project_files/.gitignore (100%) rename .python-version => crawler_ai_project_files/.python-version (100%) rename README.md => crawler_ai_project_files/README.md (100%) rename config.py => crawler_ai_project_files/config.py (100%) rename {ingestion => crawler_ai_project_files/ingestion}/adapters/__init__.py (100%) rename {ingestion => crawler_ai_project_files/ingestion}/adapters/api_adapter.py (100%) rename {ingestion => crawler_ai_project_files/ingestion}/adapters/base.py (100%) rename {ingestion => crawler_ai_project_files/ingestion}/adapters/file_adapter.py (100%) rename {ingestion => crawler_ai_project_files/ingestion}/adapters/web_scraper_adapter.py (100%) rename {ingestion => crawler_ai_project_files/ingestion}/ingestor.py (100%) rename {log => crawler_ai_project_files/log}/__init__.py (100%) rename {log => crawler_ai_project_files/log}/log_stream.py (100%) rename {log => crawler_ai_project_files/log}/logging_utils.py (100%) rename main.py => crawler_ai_project_files/main.py (100%) rename models.py => crawler_ai_project_files/models.py (100%) rename {normalization => crawler_ai_project_files/normalization}/__init__.py (100%) rename {normalization => crawler_ai_project_files/normalization}/base.py (100%) rename {normalization => crawler_ai_project_files/normalization}/normalizer.py (100%) rename {normalization => crawler_ai_project_files/normalization}/utils.py (100%) rename pyproject.toml => crawler_ai_project_files/pyproject.toml (100%) rename {data => crawler_ai_project_files}/sample.json (100%) rename schema.yaml => crawler_ai_project_files/schema.yaml (100%) rename services.py => crawler_ai_project_files/services.py (100%) rename stores.py => crawler_ai_project_files/stores.py (100%) create mode 100644 crawler_ai_project_files/testfile rename {tests => crawler_ai_project_files/tests}/__init__.py (100%) rename {tests => crawler_ai_project_files/tests}/test_api_adapter.py (100%) rename uv.lock => crawler_ai_project_files/uv.lock (100%) diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbd389eb14f3493330487b8dd53f87ed3d581d8f GIT binary patch literal 3295 zcmai0O>7&-6`tiTxfFkv6h)De9Lwt{4$azXLQzj?EN_xn8nx4%CA_ri=HfFH@kYUT=_?EQlR;31HKOyz+p9MV_$)T`cG_fe4c`>g= zb}8&*@Wf%AfzM|JkL(t_a*N=TJ%V5M3Y_ed{W2#9WJ(VH*(n6%RwXEh@JE$d0J4nS z_6Z}j%EwK9*y79W&C!9ZTaJ9<6hioHkbCo0jpeAqJ##epLik9j4#m@yYClq{Q}H&X zB1cMfDZZvu^hl{=cqOR#Ek9X1as#j0V0m4BZ50TeYgD}ZpF}7XrwnhtAjzU!&=qYJ zPnnFQFP53U#?0H`i$%iZe=R{x)fNVMvdU-Gyuxb*ozE6lG?|xlzTBqV)}b`7D;QAH zrM_ILpc#xw*+gn+cp@=6Rt^=4iYBT33q`&6okH)js;LH-&fxW=IFw0>R}-@acR4Yc zOdZU9m#5MnHdkARQZwUI=}dCOV#S??s{w1c78DbbS%8J#8!eKiFTz4moyP+CytFJC z?jkI#sZ+pgmR)@Y)elL+#u>v|D&|$)aOMlQu))F1RQh^yG%+P6QrE@Fp^QN;sHA{adXpOf<7&8t!g>m@<`<~)>cN)yUhm$UE!l9q+Mi?}@7S z#M3~{`xau}+QVCb;gMB{oj_m>AHl`;o7nSqj}xz&G5ZY13df9st$H(RGF1VOaWQ*B zTQQ@s#5AZl;Go__$u(m{&TX_xvjp9tD>Mw-FzJc|V>0{5wh~sMr-4n*Y0A0mXY0)z zr~pf&J4}UvmwrYYrYU_`8@9q6txbiw8?tHCVv}_}v1z{M#<|{N*?!Q=9_w7$YvwvG z?uVO|>#}d@Jpf?9cAnq#5ohzp zJ1JB)3y;P6_=$;0KC4K$0ORN{s|$6R(jx<6#$(^4iK2JcT(i{FNfOR;+`U9^ek`xcw-Y zK_AYdjDUoji2Lo9`=ffG6S+HoVB2=M;C=O;`p8$~PHoUHyxfkjwH~_qeB${e<_$vR^N6*ir&~LVUvp+@8Y>wBW?;w~Fx<*Eu#Z6zE$y}Qe$C48Xqx~>5JvBKrV}vaB z$k51mLYz#GCX9f^yPlXDPERM|w87|bMKP!WgTil8Di!a7xAd~A4|P<3;oulVVUQ^A~Q1$cHf-Of$6+P-nq{&7vz<^auE(om7bN2+vWi|%;A1Rh=emO1?c(}H|w zH*aiCBG2F!^FEGl^eh5x^^R@?+UxC@hU%f{dY~RXgFqNB2Ts(v?z*q5-ugzJ3%&HR zVFv=i-7rlJJUzDyaJPBx%kbxedt~_1_a+s5)Uyk4*I=8&=Obw9`rodYV>G9r#e8)x zzej|2XDATt+<^Dj?yaHDel(D%1;*BWbuPLwM=lKN=tcd*HEsl(6YPB8c-Zo33+fs` z=f-QnMy0u4{EXZYo7Dlp5dxz RxaJu};{x&scUjZN{{?ZJQz!rc literal 0 HcmV?d00001 diff --git a/__pycache__/crawler_logic.cpython-312.pyc b/__pycache__/crawler_logic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..084ffd00fb99fb39c00084fd9e8b0b2f63c2a1b0 GIT binary patch literal 17301 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 literal 0 HcmV?d00001 diff --git a/__pycache__/logging_utils.cpython-312.pyc b/__pycache__/logging_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1edfd9734de382eeeee15fb4b868044bc78bd875 GIT binary patch literal 3108 zcma)8O>7(25q|qa?vf%!illz5q$(|0tmz<1(gta)+71$1mg~fHVnr@M8)moMl}vg0 z?2mR!mz zV00wT%zJO%?CiX6=Ix)t;UEF}!$jZJBxrxfL6-(P%I*k9$Q?3IRHAY^DRNnkL!H<8 zqL3AeVpe2hLH8B?S$|Q=N<}#cMQVK(c+BUkho%0)GIUYhl%Q3?$6= zv-yZO@5gyHp-NgvmEjlAfa4xD=xKeP7V@+(Xi;X@uSFN4YGmD)9Z;j|BpU-CA=n*S z5Y>ToF&k$(uf{-6JoO}Ir9RX9LcbaZ&x5OCdhnkR6-jfBUoS5%YBbF|zW1tHRdakZ z#frI_798L ziVPw0B}vQwhZ%;HFH_aPFp?em&*4+km)}+l%`_BhUd~hH16`vpDuv6K%tC1~S2YW| zF;!W0B1PqzmV@b>>xYhj9}LV$1FMn04Ggv7qpjibR%`_SVK^}K%jX*7k0WxwzjnGE zBcWLB+%6cCJOJ7wEC7}kox$89OWsmXS>r5DZ^ zRnrldjB?5Gsnue|Nc&vG;+CFsCxGD5N+w-3e6YeGNQcp_j4MW=bd4T_A?DWj9k3c{ zg%clL*|<_W-3rI+vm3eXaMBJZH%GR@M_?{C(ipz|(spdpj!kYBw_>l>-u{aeuBSfF z*s&x3NKAMJDLa;GB}N-Z?ZjkjWTF*60RN5e-F{;`p0eYq&6TbA%bqdwwzw6W>dZWe z$b-RKfhRE%7_Kkd^4PXKZp-7pe)YH0zncD{ur=}epXH%Q0{+@8RQyFW5C7A45 z!5ywYi-(3HW}YfMG>^k?_xr#;h0rYMJ`D6;h_KM1UWsjR*A5c`?u0$?Npti$uuSs| zC+yG-e5GWqbHc}TrT8;dIdNkGnoYHm!|vJXF;mC%a$eDm6QH<8FT+j)Bl&lYG!{00 z@>zL%>=k?LmHUUc#(wl*`RlP6mgx7P*ZUU=x~Wk|(n{B{>!*Oh zF(+xU*GOGNvTaWAs!~#+_d!cH&_VL2$)p?l!2bkHkAT4o@H0*TgBW+BgC9$^AGf}f zTF=y9v&GS!f#Ex&w?}v6=%dI?E1GyBi7|ieY&%GjM;?la`bArOzSWm#iU}7ndlQaN zXNb803Lc6H(k19o6K3a>p%bFzKI++8td4p$zjx(0di8JxUgh4%BFEkCz-1s;m@>-J z2-iokysWXr!f9itF)-{-mg0F`Q%X-CEPWBye~5z7 z+FZ7WrXI>K?S!6hTx^C8fypOhw)EYd&}ic|J2c)Fh@5nD zBUtFr-isElSFv~5{)W59cdG`wB0zdCK6)1|yf9w10B@EH0gy|vFB%vWYh+!tguHJA zv_T-hfp%^JcEsR^XMb__R<*u(|I!~%H?OG8viX>h)GXgzz4IUM52#KU)xU(rE2|ku|C(BtY__La*Is1CMKIC zT0c}b8Yk;3x2It0u|LSg8b4?g5MRWZc<}mHCx3sOsm%-7=A|q4g`7JoTyN5z`L9Dj*_!W^>f{ul3IjD7$B literal 0 HcmV?d00001 diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b9524af98b801dfe9e6f9964d3f1f9328295000 GIT binary patch literal 6502 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 literal 0 HcmV?d00001 diff --git a/__pycache__/services.cpython-312.pyc b/__pycache__/services.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09c532e175fcad8f140518fa87736f276e611df8 GIT binary patch literal 3888 zcmd5!v+j#>a>EUR`If=1dQFqKv?6h#yi6@FuOzU z%$grBiB(xCmMl4GDjCa(oW2oZsjd{MM2(av&4Vo>bYCL^PQi2=bSsMUM~mG^Ui7acm<-q!i@bedE(I`B5nc^M1e?%4uwcM zqK+gPC6iQ?BJdok&`BoBSTvsd$p!sMn%d zr6gGzElrk1%aY~Max~|XTocdOj_i#hCo!U1q{kT1bCrtvX6c|e{SsQ|P6_eJ1XR;0 zk=G=6NsddruJY216i@3CKP68|ikyu%`=+tSIP`E+?ga%=B1jDnvBbpU09QLMYcHJv|kJ z=~PTn6A5J1^u-lPNIf>`v0cMrCTnvhgEeIljR*&(;*Px}05_sZ^n28Yw&*6%3riEl zQu)~ly0BazGQ={GW9A(hhepg2y3=0NT{e{g6V~Cd`P^u07ReRRmh<)rpnGjC(IJvW zvQLdEQg`X)d<^JdP#H&T&)0I>%0z`t?TyQM5@{6TaP9YuIf!S=RL%g3_Ku1hC$tp$ro_v73ooFqo1Vgrkw??hecsvyT5ht=f)-eY`!h?NmY~-+^~^)Ye6{I0y}uzd3kk=*O5vjor*|WTG6p| z&Sp-b-=uo_yU)x83ZQvcppKibGcwrU-_!pRYSc{5zqvrJd81Vx3e!B4;wluiIah94 z68SmSo;2N>nuc*Hrq51E2*6@YIvk0diOe-cEKNQsYZ?Y?ERt>HRcKE%noM_RPhYre zF8JSSw3@EanbT+c!so(WrgLC06bcUv%pKkrVq8s5DUy!-otE`+{;>p%39=%I9emIM zabYrP2|^Va@wBq(bCGOwb`~DIfsTnM(x%Qlu2bHw%*+5|p$Q#$K2%`}&1)D$VFpN;KVLd0!Ba z=|rBOt=3FecqT4Q;X4|{trX%LP|ywWs|0ang7xUnbfayI<+st~3fRa_Tu7-YIW8zB ziDV!y$}oUcC@f_Xl7b>Jvf;t?;iz$5 z$PQmzXXD7>O8)K91#auvmIc?Bz9S2vt?Jr4jkg-#JD#n6ZlQN8P<3ML2kV^~Q zU-*vvYHYjg@Zzv>?Cg4E&=~sZ=8&*9BxEBO*TsY}p2~{q4nPf|)A4rz%1=4AD|w@? zFI#!qC_BC7tKIZ9uK605d`tAw<(2NNFSO9L^BCwPmZD5m&lZc@zy+fFnlz$&a*8+JE<&akBsZxWNyvkBk}@q|FQCYZu0| zBl7xW%23nU$xFzaA31ulH?BU%ZUt}!o}5i%G`2Z9wl+Gp!6vrZns-9)F}Hg+*rtE( zmIF`VZ-Az2@JK;Cd&bA7YpM!4VXmOQmvUu(zFf&8>8{6bF^cu?i)^^*_k zI)lBXFH}AgMQN)i-~GH7Bd-C@=#TS`0@ntjThp}xJjkc zs2JdmYSjT)gC`lQj%#KGQpkN|wdN=l=88g<{Zi(>w`>m8B&#-*qi>+r{O3|Et;>pL z6(8$$w+fHR+NIBW)7}SSbXEqevJNhNP-~#>TnR$KUhFC ztbzK6An*{>eg(W=0`Ei6_z<-H5k%HNWQRFH1Q##edHvSwI{=X@lr?+ DBh7g& literal 0 HcmV?d00001 diff --git a/__pycache__/stores.cpython-312.pyc b/__pycache__/stores.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1da06fbbd7c339adca60062ef34b1407676ae0a2 GIT binary patch literal 2977 zcmb_e&2JM&6rWvB)?e{Q630zRLN|nbn2*pFND+ckgcC?X0fC^EMP<3(P1sbX>ghw?xQOoY+rOZLt1@K*$ogNE8wyilB%oAuYzlv?Jz7(-;*{ z=14WArI?g<#+-akQ?9ft=Hla~lso3uNX(;(s-(K7!uAG@enNZ|CTg=H9f2NfeKp&z zhK)U{+d9!!alwk)ZC#^R+%MRPDxO<37F4{d1U7VQD?H5vRhq%F1*{zZVI?X)uxhQX z=bqZ?#8mNvO`8&^@41ClZO6XM)Gt2ZO;HCZms)z&L^{=2=B4%B; zS~HmwOw{vdirS+_U$+xYr!Adw*`r3E6LMsVqq!l&5lEY#m2j!}P*|<)Hs{DWOuucD z6A)K9#|07*ukZ56@SI>OM1Tj7M^;YAx;j%2?GQJLP)pPli|UEAYB`NemL*lg@+A4U zN<3jkTnrsxcy>$5nn^t~V@c_ZqNWVXb*`2t7C@UIHg0GllzGv9Q=ApcfnU1p$Q$Se z9`moB=;6z!6NYLU31(hSvcybEWqT9a2Uw6URT@H4Zg1v=cZ@DeJ;cf~_`BRl< zvc3P-*zKzYx~=SO%b#6`6$xvH<{3m_wmBjYwtxs|tIt#&2et&Ww^~CCl353|Rx^kjG3Z7Gyha-|JO<6} z3rFXVE_W8aeQUIjZ3B4{-ui&M!#or(U?h|z zUi1?3q;^f!>jA9B&vKp{8IO*QpB#@k8SC#|nFtPSK|%}#!#fN}i2H9Qp%Y1ne(wXt zaa1<=7hE_re`s;E=vy12Mv((b2VZ7<5d-g=rOm{HIs(^WHl@DJ4uK3ylJPq<6^9@Qzlowi|8Nmuus{ZWCS5;~?x)08k;tw+ zdH3xDi*#{fDRVco7VIl{`-^0Exo;p(^9pFfrIwyTOV66Ory%Vpl7Wik6GAKDQqORq zXShOO@_6|BW8WQH$6-aLLjST-A<(US^ho+P@J*mF@Xk8UD}E~MT&ByHzKnk!FLdlh z;m(RbC VN1;a(rQy*6{N6aZ!9_eQ{{S_*ZrA_- literal 0 HcmV?d00001 diff --git a/.gitignore b/crawler_ai_project_files/.gitignore similarity index 100% rename from .gitignore rename to crawler_ai_project_files/.gitignore diff --git a/.python-version b/crawler_ai_project_files/.python-version similarity index 100% rename from .python-version rename to crawler_ai_project_files/.python-version diff --git a/README.md b/crawler_ai_project_files/README.md similarity index 100% rename from README.md rename to crawler_ai_project_files/README.md diff --git a/config.py b/crawler_ai_project_files/config.py similarity index 100% rename from config.py rename to crawler_ai_project_files/config.py diff --git a/ingestion/adapters/__init__.py b/crawler_ai_project_files/ingestion/adapters/__init__.py similarity index 100% rename from ingestion/adapters/__init__.py rename to crawler_ai_project_files/ingestion/adapters/__init__.py diff --git a/ingestion/adapters/api_adapter.py b/crawler_ai_project_files/ingestion/adapters/api_adapter.py similarity index 100% rename from ingestion/adapters/api_adapter.py rename to crawler_ai_project_files/ingestion/adapters/api_adapter.py diff --git a/ingestion/adapters/base.py b/crawler_ai_project_files/ingestion/adapters/base.py similarity index 100% rename from ingestion/adapters/base.py rename to crawler_ai_project_files/ingestion/adapters/base.py diff --git a/ingestion/adapters/file_adapter.py b/crawler_ai_project_files/ingestion/adapters/file_adapter.py similarity index 100% rename from ingestion/adapters/file_adapter.py rename to crawler_ai_project_files/ingestion/adapters/file_adapter.py diff --git a/ingestion/adapters/web_scraper_adapter.py b/crawler_ai_project_files/ingestion/adapters/web_scraper_adapter.py similarity index 100% rename from ingestion/adapters/web_scraper_adapter.py rename to crawler_ai_project_files/ingestion/adapters/web_scraper_adapter.py diff --git a/ingestion/ingestor.py b/crawler_ai_project_files/ingestion/ingestor.py similarity index 100% rename from ingestion/ingestor.py rename to crawler_ai_project_files/ingestion/ingestor.py diff --git a/log/__init__.py b/crawler_ai_project_files/log/__init__.py similarity index 100% rename from log/__init__.py rename to crawler_ai_project_files/log/__init__.py diff --git a/log/log_stream.py b/crawler_ai_project_files/log/log_stream.py similarity index 100% rename from log/log_stream.py rename to crawler_ai_project_files/log/log_stream.py diff --git a/log/logging_utils.py b/crawler_ai_project_files/log/logging_utils.py similarity index 100% rename from log/logging_utils.py rename to crawler_ai_project_files/log/logging_utils.py diff --git a/main.py b/crawler_ai_project_files/main.py similarity index 100% rename from main.py rename to crawler_ai_project_files/main.py diff --git a/models.py b/crawler_ai_project_files/models.py similarity index 100% rename from models.py rename to crawler_ai_project_files/models.py diff --git a/normalization/__init__.py b/crawler_ai_project_files/normalization/__init__.py similarity index 100% rename from normalization/__init__.py rename to crawler_ai_project_files/normalization/__init__.py diff --git a/normalization/base.py b/crawler_ai_project_files/normalization/base.py similarity index 100% rename from normalization/base.py rename to crawler_ai_project_files/normalization/base.py diff --git a/normalization/normalizer.py b/crawler_ai_project_files/normalization/normalizer.py similarity index 100% rename from normalization/normalizer.py rename to crawler_ai_project_files/normalization/normalizer.py diff --git a/normalization/utils.py b/crawler_ai_project_files/normalization/utils.py similarity index 100% rename from normalization/utils.py rename to crawler_ai_project_files/normalization/utils.py diff --git a/pyproject.toml b/crawler_ai_project_files/pyproject.toml similarity index 100% rename from pyproject.toml rename to crawler_ai_project_files/pyproject.toml diff --git a/data/sample.json b/crawler_ai_project_files/sample.json similarity index 100% rename from data/sample.json rename to crawler_ai_project_files/sample.json diff --git a/schema.yaml b/crawler_ai_project_files/schema.yaml similarity index 100% rename from schema.yaml rename to crawler_ai_project_files/schema.yaml diff --git a/services.py b/crawler_ai_project_files/services.py similarity index 100% rename from services.py rename to crawler_ai_project_files/services.py diff --git a/stores.py b/crawler_ai_project_files/stores.py similarity index 100% rename from stores.py rename to crawler_ai_project_files/stores.py diff --git a/crawler_ai_project_files/testfile b/crawler_ai_project_files/testfile new file mode 100644 index 0000000..887d41b --- /dev/null +++ b/crawler_ai_project_files/testfile @@ -0,0 +1,28 @@ +{ + "name": "Demo Data Pipeline", + "sources": [ + { + "type": "api", + "config": { + "url": "https://dummyjson.com/posts" + } + }, + { + "type": "scrape", + "config": { + "urls": [ + "https://www.thairath.co.th/home", + "https://www.thaipbs.or.th/news" + ], + "prompt": "Extract all post in the pages along with its brief details and url" + } + }, + { + "type": "file", + "config": { + "path": "/data/sample.json", + "format": "json" + } + } + ] +} \ No newline at end of file diff --git a/tests/__init__.py b/crawler_ai_project_files/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to crawler_ai_project_files/tests/__init__.py diff --git a/tests/test_api_adapter.py b/crawler_ai_project_files/tests/test_api_adapter.py similarity index 100% rename from tests/test_api_adapter.py rename to crawler_ai_project_files/tests/test_api_adapter.py diff --git a/uv.lock b/crawler_ai_project_files/uv.lock similarity index 100% rename from uv.lock rename to crawler_ai_project_files/uv.lock