From 91c30879f142bea2092c906dbd04bb2ff5dd38ff Mon Sep 17 00:00:00 2001 From: dh1tw Date: Sun, 15 Jun 2014 14:06:17 +0700 Subject: [PATCH] Improved documentation --- README.md | 41 +++++++++- docs/build/doctrees/Callinfo.doctree | Bin 72849 -> 72931 bytes docs/build/doctrees/environment.pickle | Bin 11962 -> 12001 bytes docs/build/doctrees/lookuplib.doctree | Bin 55583 -> 68840 bytes docs/build/html/Callinfo.html | 50 ++++++------ docs/build/html/genindex.html | 8 +- docs/build/html/lookuplib.html | 87 +++++++++++++++++++-- docs/build/html/objects.inv | Bin 450 -> 473 bytes docs/build/html/searchindex.js | 2 +- pyhamtools/callinfo.py | 103 ++++++++++++------------- pyhamtools/lookuplib.py | 9 +-- test/test_lookuplib_redis.py | 42 ++++++++++ 12 files changed, 246 insertions(+), 96 deletions(-) create mode 100644 test/test_lookuplib_redis.py diff --git a/README.md b/README.md index 29bb371..24aac8e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,39 @@ -pyhamtools -========== +# pyhamtools -A Library with Amateur Radio specific Functions and Classes. +A Library with Amateur Radio specific Functions and Classes for any kind of Callsign Lookup Service, e.g. Logbooks +or DX-Clusters. Currently, +* [Country-Files.org](http://country-files.org), +* [Clublog Prefixes & Exceptions XML File](https://clublog.freshdesk.com/support/articles/54902-downloading-the-prefixes-and-exceptions-as) +* [Clublog DXCC Query API](http://clublog.freshdesk.com/support/articles/54904-how-to-query-club-log-for-dxcc) +* [Redis.io](http://redis.io) +are supported sources. +All services can be accessed through a unified interface. -The library is currently in Alpha state. Please do not use this library for operational code. +This Library is used in production at DxHeat.com. + +# Installation + +Easiest way to install pyhamtools is through the packet manager PIP: +`pip install pyhamtools' + +# How to use pyhamtools + +``` +>>> from pyhamtools import LookupLib, Callinfo +>>> my_lookuplib = LookupLib(lookuptype="countryfile") +>>> cic = Callinfo(my_lookuplib) +>>> cic.get_all("DH1TW") + { + 'country': 'Fed. Rep. of Germany', + 'adif': 230, + 'continent': 'EU', + 'latitude': 51.0, + 'longitude': -10.0, + 'cqz': 14, + 'ituz': 28 + } + +``` + +Check out the full documentation at: +[PyHamTools.readthedocs.org](pyhamtools.readthedocs.org/en/latest/index.html) \ No newline at end of file diff --git a/docs/build/doctrees/Callinfo.doctree b/docs/build/doctrees/Callinfo.doctree index be427816ed239c8316a5e9dd2dc6d77331729507..18d24383d278936fdaf855ac2b36407d30e6b34d 100644 GIT binary patch literal 72931 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⩔V?U3|*Y5rX z4#AsxS87hTIV|{~yp+W*2$>Fi6p!DS>}t)HuqMB*XWr!2j!daEd8Ug>&&22I{`c$r zJl>z`{SV-~&1`-wpDK0aXXo%SdkULDv?C;d5A%6{uph-+J@VO7W6IyfL`w*&IblDM z$*Iw`HkufXs<{d+wCldB=VBm@@sq(HObGJ9MyC z;ClHec5MW&(KiUr*SQ#w+ zc;lM76@_PRlc3apLJ-Vm$Mw#NZpTv2mpig8Cadw-iv1*R2O7Hh4rz3!uMw9xRK_|V zw0|N<)MHi(Cy=`U_a_i{jhLUJ4aVM$!ZY`XfsNNum?n_)G7){u&jbRe{h-2s;vzHm zLISk94+Va25=Y+s|5MU}en3>x1!o?RrD}_xF22dEf*1{BxVmSI?p{|0t z4ZZe=SUqZ4HIIeM`aOS`$3VrNeO%P>o~4@X*(X?XCU_Djo_R{>se;Js3)CQTaXl@J zC_{gV!!yKhT1-`+1rfUJITZLwOtB9XpjH@5_EDyKS6nd&4^7;bBM_luYFrp0og%Q6Ze$(RU`6?*jmtUjs z%xmHuNT*5>za%B2Ul;uwmY&bC?t^W8Oa7+X6O+-u5xDZ(8rY+#-#O?}%t0>%gBm&L zx6q8$*y65P!zra4^xJ9==b+y~OP@LDcZo2kz#^Q3eovg3gMJ@pp7}ua8o#YU!~Qd= zXPO#LJ%1<_kb3?d0i*g(J%0oojDe3)V7m?+t5eUP_$+GtwgwEUk#YV52yDjrQ?dL^ z^~!H+kgC2wUxgFRp9?ECu!HA`KN8=*)hlgXJi`15O;G#`6j%fV|m5$%iq@IQ(vG4oCyEMG7?(;4s9^v?T}iH;wt_Rm5dg%SEPqN4z7C1&Y4HieQn3Z3i9;?=5p&I}Wp}0WYFHdiX76=}P!ZYJVZUs|J zwctkKOt3id95FAMi2^3e-w1HXkLQ;s0RS~NMuFYp#l@;Yp@ABq{PL#4+$@9{n#z@5 z-dwP#E|vW97J~B;VoULwYe-d>|@Vi7XP|@Pk!}i>D~kAHtHOeFjdj@L1?RZHp>#T8bg#RU6C5oji*+c)uNmXJ+H*yiZZq`_UwE&XVLsQV5Yyj-N<7Ou&u+h(79M zB?ufQCW*U%7S5bi9&r2k^$TZVH;7&4tOw_wDN-upg=EVyYE+N=hziq3C6<+#c^Or> zrxyi6{5U%Ikh^tHQj&O%Xy%4!eE)<}W%B?9`y+&UWG&P_lEg<@Vo$_JTjIWx#8!b= zQp_!XI7Xa~wVdoFeVi(Bce#;$Jm4DHCy4gMFzrbRv=l>EpG>$L*{7g_J>Er9BT2kK zfVdtMOJ1k4j3$XsLnFLP$yds^$S&x`;7Y2XFp(>m?XXkP&n^m6o|Ux z=$uDkeUJQ0M006~#`j)mb(T=0*CbGBPRGlQgRhYL0m>4Lxs}fh+iM<1GUF3I)_9tQ5yAo(AhARJ*Ws`b@ zUvr0lVcK6LIHr{HAN9=LK!!2*punPD9AQlVNb#^lCNzb<1%Fu>QPV;R+2{y^9GKtYbd5x*Ssmr-&oAV-05xSJAW&A zZ~sg3u+1jfImg@l@jGG})xggmzbhc~$M4|`%aK*Doj?8nF!U`I4dstNBt>wmT&(=@ z@5pI!^T!{Ni237>ae`1G#p5O^<>2p6RF}2p4?161pd1Y#KY#ow>ecyU8qaa_8Ouoi z_;a*jG3Us#rZ7RxU!%S!&ZPg=hNYUYpqSNfT7&R1gn z7t5NLB*V`7AnCudN;}uxnPrgKd<_loj;#p%U!_fA1pXU=+ncw-1jOK~Z$Y)zZc91 zvaK)BT3_=sI1i2#UThW$Vj0U2-#!XCPNUES{g*|7U2#RPJ}Xc%E<8NG{}6gCFZc=; z-pqapkDh8(E~6?d3N=}kl>mn-QBG!Mv_qd&P)!LR-EYP2-$)>(Q1vr`2vy6lXMxzZjtb@Wc>*DApGm5g489pR~ zYcZGP?u82L33L4rW@t<*HaJGGWNR7(XS8Ijcx_;LHSdL<+P7@-JzSg8&Yy?EBgwoJ ze#4_ZKNkyD8aCKqm#LE`Y_NfTZf2~0kvD^FBM#4(=cP)$?LL;E8*DIPuMIXB%Z;X~ zaOIkQoE^TQB*rwX1oy@X!AAG`RLP77Cj8fk!ZQ;@mQql#Pco=Q+wrbZZ{Ia0ihd)X zemp#}SjN(*Ng|FKWd*VKHwGNN&t!VP-Doxe5zN~Zg=aRC1Utm3u!ct=h#oQUZM|+b zw`5z0Y)ea~8*b1m)_e{s?teL1h+A1iJup`H+IKXtN#Lk~m6-F^gu9owZNzcgfFtO) zt4Uv9pl~{93gPZyb9+=gGgTzC81y@+5|v+HpeWMs$TAlF+zGAl;La!zfW^^WV3c4z zSpELCt1x#9Fd=!GD#?;}2VBpLdx&;=n0C(uT8g38dlBx2;ohiVa|n^d!;kx_J+20& zlGT1JBlAldZ7_d-6rMQ%M`u1oMFtRaUik4{&TAk!P$UP1NGQh-(Htz`ApsChn!!r& z+?g1DJQQf*m`vqv-beV+S=a(%7n7NZb8H$xsd(HZTMm+0s>gjqh3TVKmX+{h8>+B1 zivk-&;ON{#?$$j?;m6sc$%SZq|Ac}tc|gIwAk@QZq4p7e?6Ab0BJQ%peTN^d0-NJGAtFt8fa+tn1fu5r1_`_LNhgRmG3Er8D0_(JKbj~OH zT9@V#!aOp-M1LQpN?dIx)&pFZ=Fy@(CQN&50xiW*<>Oe|orm2spne?)8!frJVS*I;D?rh?xFItdz%SX z?O!5{sA-d?E$w~_?NTDRZn;ccFSlGHL6<9Pa;h&-6B>FY%c`KuRcL{&SEIn*3pl#2 zp_p1-bB!>swV0t*`}=1)db2wk(`{zD<=Mf|wsDtySE_`E$*$Sje(ySQh#Fl{^?Jb7 zpEpS0jlRIjs{O?fh^vNbN1i!v63eItbUQqCvw)1c+=4U2c~wto6DRwbLP);36;KGF zs-d{cZKMhAf7Njpu6wO;2;Kg)rlMz_xt+WgH}Y}^i5Pjg6DL?oO9gN%lzO;^?owSA zo1f}@VS#eOk(awsua3OX0d&bdEbY@&MRW5rv|<3=i^4Pa;phesRj`*y5PM1Sabo=V zR2?=;Od1^Ke#`IyF?`T6)T*OJQTiQFGwxEj2iGtB@{qVb>~qDdd+>{)kDv`4)?*P| zq3)ML9~D7-s4U~I(8ow-?`7_nLLWyH9Pni*ld|>=lA0>`deK_hUhsdR^95nOXtA1ah57#jf1xvo{Z#pSY@NIw^>)Gi z2|KDi7`6YBmcfW!H=>XcCv+tzrTJ?1(?)j>)eqF(G z%WV~bd`<0%5y;mCZr2a8Gls-pY-|{tYN-5_Ya=HX{%~vKRR1IhI}T^q@eOdO5q5kN z&DhCV?4`TYN+HLEY7d7T-$F|~!-oCT#* zSiweF<|fI1@2^PF)^N!3J?Vgu<@*E-?>l7q0dUaQAELm{(KuFzEI;yDoTNKt%%U3M z%8x-|mjVA?JU>z0zU#U!#sx-qh1UW9L1?kLEQnTqN__k3>$sTD&<5Q zDcR1)3=jTE@GnB}kZ^?u|14Ot@Gk{teDEvr`ite&jADT6Q@)#it@bFN`T{lJE%&c1 zBk%9upbbWRivl}_;OH(kih>cLji$a6&fhIgzgF&2secGRS*ZcTq*MyFENWe`Spv9F zc1aWntmEjErE1m64iwHHi&I$$JXj6M+6)04E^-TjhlF5V#&S2po+9yNQU@I+5(F1+FWc^(>B_SSt&G*H>$@&@q5RXlNmD16m+>EDFzT zAaX01VyXpiD4cN?C%%}Mm&|wpljS!84*Btgz!Ly~8WT}qzhQB)YEWpPhJW{Duz!*; zHx6NjW^)DmHxVqVOC>0~so;F>+)TVSx4fFy!u9MH0=wT%j;sXU0;rgZsRL4#c@X?p zQkA?Fnk^~RUkW@K=kc8(CRMTpTM@abKPEK+6CJQM3hZhkzNvz5C;fvy@FU{e3S~Qs zqKm@%Ay^AMMWAHIZ%??3hEEl@9Rh9`L_5}`uP;zAZw5ON?xFxYqk`zQNH}6ZzpE-y z`Pc~=?WEt0Wh@##4Xtp%?kKP`362f^vl}I71Qx2J;nRh=XMhRGd#REvd2hhoTHt*| zzHgX(zXWnhqT*@7-HOTmQ9;~VB);Lzs>H=p6zLCS$pL>5PCRq4(0$rNREg743~6T& z?t<}$qT-nrk;H@XGu0kvMX6+!VHvrZ&q5o#--^OBZ8$pbQ-w$?wKx1MFfIuIYzrx zkNb!U(?>llE0MS&s&J1%;h7SS&OPLA-IElIFN>x(MC1D>6pTL{P_UmP)VZ}#`v}I* zv&2V;_()6KcQD>65DLaue?)qeIC++ny`+y;CGIXavX22=Bl}p<9v7xPK7p2E=;{*) zcO&~mRIrz^NNTJFK3Rac9u!Mnr?8B!1)h&acy|E`Y+#I|>pTjpJ+@D?B&Unyj1UP0 z`D6P`0nZA67*%Jpl03E()&idcs>L4a&f@QZ*bVh_aqgM(s04;O*>b3#uX@~P)So`P zfMw!Z;O_$p=Us>bzvhOca~_5DJ@PLS&BY-a-+Q5v|3g5*{t}^HS_`#*Yk@Dbd@dKC zD=eRWuLZVh#jc0`tp&bPBCoO{?bUL%Dshjy8|aS+cQ?>$M1O6V{<;Kuieisl&$2pU zbpx8<#~V?2<|Z6nH<7*Vrs})r&BDATz{EiLu_|%3o!DCe*F}DtXm1bG-jP5{F;w|Z zmi=7|{1YID6uI__S=UB}%g`uoH5 z4B4OTHqIi z5j8Ee7WhRXxNdm~70zjb9Lw_TQ3w?=wY+u!fMEIVHBjI3uZ^QI& ziDy&=e>w1P1!Q9CZJc@L9o1_u2YweYh@hsSwA6c~2=12EX(>cy229J&QywpLZ*)ni z_sMB-lTsg$h)Jmrae|m3#p6CHS96Fz{v=7xz zZ}SJVVeov4!ZV-Y=mrlJu$M@Xl3E7_yTno-9c4bZJpU-3f3iHA`$_C~LG8qp|C>-> zi1D9&#ydc(slA39Id#k%m+J1q)=shgRyBfK>1&Llv2)+lKB!0 zA$}4IH^_pmnZA;=*fE}t38~47=o5Q(+@+5FsHyGoPHQ4 zPE0@4;S3uutDb7kbHKU8NtJajT>bA&LD1fC3SzkQKnh|60ZaFtf*1)L^!zd?5P8M1 zIt8(;&!WbvY1d~p(h$pm%BCTf7vB|BPX%j?1Je2eT^CM8tSHpjun(@Im55(it?W3N zmC+76RzZQ)%3`9vFHi%GUF}PH@e#5yRjTp33<*;169Y~Al(tS6lHEl$7F5o3fOHLjvm1K?09g%P~S zbi`QTLfH*aV9l`@TaQzXS~I!q$3*DkgUxFz@d#xM@$r#jVu>EYmslYq)Ecr z*y4oJ5u2zbS=6S0LzJJ6*bFt8wmAy?fSgFJX=Gn5a7*D#wm6k^#8zrZme&NhZyM7P zTZ_v!mWxay-)c$Q3THcuQ%OfmQA4t%?E&{CF&!~gTz0Tr>;o&#t0nCyoSiIAC>^o0 zT9QTW0=Vx)q$74k4FY#Vfi=D&wN51aYJs~8XAg@L$}I5Jf4W+eh3*MBgoe@)d!Yq_ z_eO!$z9P4RDW+QRzQWnh;>1%5l%EzbS^oZjLw-CRaR2~NgFkTQnFGbeszITF8liN= zLBc#Zgc+LIm5w+>u&6GTbi@q7`IK>}c(qtw`t3%Sj@TVv50!hd2!=ag?v8t|t+jWX zR3=zRWM+aA&pK4;zxg3mFr8;8*w0YRk`*zlD;bJbBHLf6Ts$k=K!`5NqQLrOiAfcF z)9FFzXJ?pp=IUBcopaq9@UVVHH+q{lDWp`EvjF2ddW zVK*wC=@ALX6zGepMCI2PD2nukWh`M)LMt3lM&X%W9Ni6v5;R6535&ypIVZq`!TYD7z%I`?I`31I^?o#A zafT&1QzU1FNGQh->Ygp&IROxT^gULB*VM#>#koKWy{Q(4px);zDu3a^S$H0hT@?3x zoMU%p9AQ#{Y&k~1uX@}^RG2=xkYy!d@dH%ho{La;=3*S3d&u3oCn;g^L(yCkqVfF` z3fo=^DA->n)XQt3_K~o-!V+I8;;Sri-w6w=KrBG(M)uX>^drm3Ueed75_gvy+1CQD zk$s(LuMgASkU&c@boGsdyODhpDxSGnBsCHiw+Il|gJQ|+$1I}>i(AnM@7{(2J2c?v zI*-C?kL^1w$(YO#m9v-oEqc0>JMoMW*r zmB3IZTMqU6Rge3O`qO6*uuM!?JP0V9_YextJdC4r9){vyBp~9 zs9-UzNc?-j3#!EFDT?$jvaC*6yo4tB@nsa)MixicO=NGosXAftiZFi_U}B)Ws!Foh zUjwd-{58?O9;SUGftF&Z@|!Ge!eVM=^OD*RfaW(qhA|6Kc;+n}VT?L+k)*f>P&paA zsD#CD#r|!}-gewOs>D6uI__P_Z%X}}FSDIRx7DTixk zS=D8&Sx)B*3zQR1RV<}#+Q8u;UK4J76x_EnYl$E} zM3!}5KCDgZ>ThRKXo6enQQ$}C#2{7hrBDrc1`k(!Ls~~D>sl0TOj7&XnO@UXN(Hx( z^&?S)(fW*Iv{?^)qK4RkzP=>Htys=kF@~f~|FQ-RU<1p?qQJUT2~8DzwP>p>cVEtI zD6DZ7tN9g-kN<&R&batUgYV?Abw}2v@ZT5!6vr7eIko9VjT6WDtuDNS=J6X%Y@Ar< zMSCRpyk=WXrgKvIxG_j>Ki~E3{qRi3+LWqwfokoLQ`eTo0|bBK zHiZN!Btl_w3KF5&x%pDL#H~iEr=-`gT7qvno5=Rq#T*2_HU(U>%Vu)b=KuFyWwxNn zNEEYhQ@EY^wv_cTXH8q1_q55xZ~DJHh|E?n5f@ey3eRjUXJCam?XE9yeCXQ3?I@II z-bT3FT3kM^GMn3MaHajn*URTiEr(}1@@*~dDbZ|4RsH?Frbwm46!-Q5w>NJIO=FDu zo#!6OJoi+vs*&g30nJ$HE;)ROm1hdRipq8GBv?4ty)#<+%ysWVggFHk;avBw;>29{ zZa70eNA*;57px0%-ElLWc<(M{knrAvfRTMCyr%;PLvT+NSZt4Db;5gZ zpT$YdtMzGGjjZ=RAhlWVeZ_n~)$M2QG1p+g)05%UcUt(d$sw3Y_a}anz6Ff2GY0?& zvzk#L+ayjJ69wvGAMyA(-a&#N9D;|mQ2zT6!IHI@Avp8jhl*E=iU9T#A;9UfjvIT9Oe?$>N0a z-(|HVi|Pd&qWt{#;i$p1IVh0d5vete?5hRN6V4G9r;`6ZQVq%Sjsn~_jrng+T#mL} zWE%NaOFBk4$6B09{`)vJBuhFTa9CQ|D}vac3+x^T|0IH6QFhwPbZO%{3<;1C+hf1iyO2tEe|GCv}> zf+?n2@VUY{&*H>$*pz?1fXVVN037n;`S0%o05vW|fmQe7V%4C~K#frT`yydp9KsAu z^vZw#P_U>jmHhW5g7a1OQt`UX^3slVQ*+tY!|)8;9!hhk@}-pS@aA%0VoIh8cx3bM zq1sLF3h{`^tYn|BB#qrnuWuPw0TB+l8U?n85!+P37fgNO6F=L0jZm(&C>o^IifO~R z>jaJ|7ThkbC){P6ZxF{D1CHp}n`+WycNesCg1(t>7v8%C6|Alo340Orx2h7AkBwW< zPWsze#xl;gqZLlL1BGYq#L-Rhl%P=&$vFQ+n0E!3ko;3sk|o~_xXU=-Bl4ex$?r`d zrz9$VAK@-9cRwngc|at-;SZ`37f(^7e~2Xq;lnt=VtAqZw2!J1r==LuK1R69%RP>Y zXPyvAJmdVN+T*M!m8_m(8M(nejW&4y85Ev*7DwlOin891W}Kh1BtI9)^C1$-@w0Nj z5b%Wnh(3Cel_1)fm~nmyXyG*6&ZzepX=KLPS@<%LT^jC}IQPseIKrd?*>a5jO7*yp zs4#u>D$7d7`PZnzJ+Gng%~;NtDsi8=;r$^Qb9nzwv>%0O zKTe>f82bD7guCJW2`b2;h@?i^`BMSndQdERea14HcK#fVaPc2eVE1YqT@O-N?E(IU zCHb>Rz6_C2kUzk`67Vkp5JT&0R+0yJLfZMSpjzzl?kxTW#BRKQi*syQK_xKW$(G~& zJJsVpqyF^S-&rQ6o&NzSoHqbl0plm{aCFY2u)c@?lA>8EMB{reH2enw3igA9I=B{U z|I*GwET5s`GtBboU)tH!0UH;E)h%{W^e^|kwB!!Aa_uEELY27N-K}&a;qF$tjOa&& z>6cBQrzm#YaxANJ&&RhWnws^+T^%dFMzN*eWuO!Ts15AvTRaA+q?ZmDMxUTfo zM7w&Jc8vsDilNGDvb5{8_cOiO)P&SdnT}G{tc7;yy*3KZq;Q1ZS{Gi0RZnUxOGY7E z+~k$C<2u>yItY76sO5Pr*LL#E6c3vQ8vhIHHjc<^Q37bUD9D| zQdeiTwm}ng-xdY-KNbW0_8jr>+jA(OvY*+SB9!edioR%zWVV8r13$6CH-n6QHwbdX zW~yafWq^(A?jX)_?Snn-b|h)jKP`DDki*iQQDCDA2}>1xb!eL`b(ySPg|(Z-YQ6=1 z`9Ca^6^mX~(pj7Z(0f%b4pLOpXi}dksukU6*&V3x_y0cQ%^uJkT|FIzXZEDUe(s6g zs(!Yw%)v23czWrw$#j*Fdg{y?vlmdOr$@ARcbAb#(htX%%--U-502@f*mS-t)0r)q zebu-h8%LGqbShJ zWK=od-BmINtMw2Z*;nb|t@hKr7VI;ZH8apWJ-u9DOAB-?WoARsLq*ntV{2P?Yi~K< zQEKe!Zp)VHO7lwPY^TGlGc$pMr_&4yY*>w>bs*-|R#i5fksj26%^y4P3UAjm3@&x| zn$~RY;M}+wxrsB<1F6fjCDH@S^Ln!BfxAxMX;0Gz+FnkeS)6F{ZN~{BisI?N-Q`q? zP6PD?>O$H)%ckb-a7pe0)&_D8OO-PQABm+#cXqe+c4Wub*nMv_XCtNr;rA@QV{FZ~ zHJSo=VVoR>!ZRH>x^Y6i!jpA+WVMG(r$yi>=s~IyA;Usn6l|c9rlk1 zcY4Y6pml~R;+P)c`qTEbK^yiIA!Jm(t1WM`t>qSLSILw`)=S{fQnp;irnMz=II0bm zo@_T*pO)=vtJ7wvr8+YQ@NP2~N90anw(x__mR{3gjzU{{^<25!GkL;wsPso)!J0=*9 z7{f6BTC)^mjz)ccdSp+whn8CBm&`HZJ(4@{_Ou}X+KJR@$sDWJ5#?@5bSfT4hJ%z^ zHOKROL`SA;b}z;>2-~ve1hy@i?J_6wWEj$}S@c0?k2wi->aRX((SS84qiq_l8CY6^ zA9Y2UQ-oNT%XHuyN{(wYpJ;>9BYgcjG9~1m%>v@(ww#_`13lhtTHvQ{WQJ$A*lG^n zgLL5ZRG_6t(SQ;NbCBNwXPDF2Jg6-@t9Q0Jot)C6vYoTC95M4cvZY)$TQ+B)eL;Fn zY~bC~TTbGCCK(N;YFN~E7Aqr47%pACoh@@YeVMb-hE83kt+%tMC720H<{Y$RQp45H z9Vva}?^)!Lb26rjwt#Oo(`n8X?uzWT_I!srzXg*7Ou=wJ55V+Lz{amPag#Q4KC8mUIe5C>7}w=hntJV%o^TP%J#Ow%FYh+Lp6`e z&h6>OIL42aWla~JrOhR3Uyj}@_0Gcj4;X4)c&T_UZKpNPtcRJ)ggla$LuephuGVED zJ!Y;zb9zv3xqbW==1QK|`K)*mU1d4tyTYApt|r zw8Jpb*xx-d*Ak6aTxM3woP1k3XRbrbw4v#d)q~VrPsE|=eaBDPcj~UYnj2Uh(qh#z zH?p?HqVmBQIi(4fVnUF!G#D{Ak$f3U!sYDTGOuTJOxfIw*7@mSv$MD_W!TrZpkaD? zq{d~X7k;eP;iXPYoGry(+-^(eRhNZ zE)p-9Z!C$iG$6fH zzO7^)#JOi4!m%MYxNsfPR=FYeH<*SNE*ON`u)^s`o8{^X%i>)ox3vAtc(~p8v?X_7 zZba^g+(?^&T`jj(ZdBoYBv5+O%i%)8%v#3t1uU?SNDoWaBRC?6wlSkDk4i3X^VN?J m>)FSL-t;hct16ktfI7oGj$?W-t~=`f1S;6X8pqyQjsG8MmOnNC literal 72849 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�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 S4m#TYBpRN13fsO}&Ho>@92JfL diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index 55dac28f790b163ee7d91488aee4cda76f998a33..b62293ca2a0852c9a1f85d30bbe6711ae92d2011 100644 GIT binary patch literal 12001 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 literal 11962 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�Slwbjjp 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 N8Aq*-Yq7QA{{tEiyxjl* diff --git a/docs/build/html/Callinfo.html b/docs/build/html/Callinfo.html index 9530e74..99225ab 100644 --- a/docs/build/html/Callinfo.html +++ b/docs/build/html/Callinfo.html @@ -25,7 +25,7 @@ - +
-class pyhamtools.lookuplib.LookupLib(lookuptype='countryfile', apikey=None, filename=None, logger=None)
+class pyhamtools.lookuplib.LookupLib(lookuptype='countryfile', apikey=None, filename=None, logger=None, redis_instance=None, redis_prefix=None)

This class is a wrapper for the following three Amateur Radio databases:

  1. Clublog.org (daily updated XML File)
  2. @@ -64,28 +64,94 @@
  3. Country-files.com (infrequently updated PLIST File)

It’s aim is to provide a homogeneous interface to different databases.

-

Typically an instance of this class is injected as a dependency in the Callinfo class, but it can also be used directly.

+

Typically an instance of this class is injected as a dependency in the Callinfo class, but it can also +be used directly.

Even the interface is the same for all lookup sources, the returning data can be different. The documentation of the various methods provide more detail.

By default, LookupLib requires an Internet connection to download the libraries or perform the lookup against the Clublog API.

+

The entire lookup data can also be copied into Redis, which an extremely fast in-memory Key/Value store. +A LookupLib object can be instanciated to perform then all lookups in Redis, instead processing and loading +the data from Internet / File. This saves some time and allows several instances of LookupLib +to query the same data concurrently.

Parameters:
    -
  • lookuptype (str) – “clublogxml” or “clublogapi” or “countryfile”
  • +
  • lookuptype (str) – “clublogxml” or “clublogapi” or “countryfile” or “redis”
  • apikey (str) – Clublog API Key
  • -
  • filename (str, optional) – Filename for Clublog XML or Country-files.com cty.plist file. When a local file is used, no Internet connection not API Key is necessary.
  • +
  • filename (str, optional) – Filename for Clublog XML or Country-files.com cty.plist file. When a local file is
  • logger (logging.getLogger(__name__), optional) – Python logger
  • +
  • redis_instance (redis.Redis(), optional) – Instance of Redis
  • +
  • redis_prefix (str, optional) – Prefix to identify the lookup data set in Redis
+
+
+copy_data_in_redis(redis_prefix, redis_instance)
+

Copy the complete lookup data into redis. Old data will be overwritten.

+ +++ + + + + + + + +
Parameters:
    +
  • redis_prefix (str) – Prefix to distinguish the data in redis for the different looktypes
  • +
  • redis_instance (str) – an Instance of Redis
  • +
+
Returns:

returns True when the data has been copied successfully into Redis

+
Return type:

bool

+
+

Example

+

Copy the entire lookup data from the Country-files.com PLIST File into Redis. This example requires a running +instance of Redis, as well the python Redis connector (pip install redis-py).

+
>>> from pyhamtools import LookupLib
+>>> import redis
+>>> r = redis.Redis()
+>>> my_lookuplib = LookupLib(lookuptype="countryfile")
+>>> print my_lookuplib.copy_data_in_redis(redis_prefix="CF", redis_instance=r)
+True
+
+
+

Now let’s create an instance of LookupLib, using Redis to query the data +>>> from pyhamtools import LookupLib +>>> import redis +>>> r = redis.Redis() +>>> my_lookuplib = LookupLib(lookuptype=”countryfile”, redis_instance=r, redis_prefix=”CF”) +>>> my_lookuplib.lookup_callsign(“3D2RI”) +{

+
+
u’adif’: 460, +u’continent’: ‘OC’, +u’country’: ‘Rotuma Island’, +u’cqz’: 32, +u’ituz’: 56, +u’latitude’: -12.48, +u’longitude’: -177.08
+

}

+
+

Note

+

This method is available for the following lookup type

+
    +
  • clublogxml
  • +
  • countryfile
  • +
+
+
+
-is_invalid_operation(callsign, timestamp=datetime.datetime(2014, 4, 29, 13, 1, 27, 518550, tzinfo=<UTC>))
+is_invalid_operation(callsign, timestamp=datetime.datetime(2014, 6, 15, 7, 5, 27, 706858, tzinfo=<UTC>))

Returns True if an operations is known as invalid

@@ -134,13 +200,14 @@ API Key for Clublog missing or incorrect

This method is available for

  • clublogxml
  • +
  • redis
-lookup_callsign(callsign=None, timestamp=datetime.datetime(2014, 4, 29, 13, 1, 27, 518519, tzinfo=<UTC>))
+lookup_callsign(callsign=None, timestamp=datetime.datetime(2014, 6, 15, 7, 5, 27, 706831, tzinfo=<UTC>))

Returns lookup data if an exception exists for a callsign

@@ -193,6 +260,7 @@ API Key for Clublog missing or incorrect
  • clublogxml
  • clublogapi
  • countryfile
  • +
  • redis
  • @@ -238,13 +306,14 @@ the id 273.

    This method is available for the following lookup type

    • clublogxml
    • +
    • redis
    -lookup_prefix(prefix, timestamp=datetime.datetime(2014, 4, 29, 13, 1, 27, 518519, tzinfo=<UTC>))
    +lookup_prefix(prefix, timestamp=datetime.datetime(2014, 6, 15, 7, 5, 27, 706831, tzinfo=<UTC>))

    Returns lookup data of a Prefix

    @@ -295,13 +364,14 @@ database (default database).

    • clublogxml
    • countryfile
    • +
    • redis
    -lookup_zone_exception(callsign, timestamp=datetime.datetime(2014, 4, 29, 13, 1, 27, 518556, tzinfo=<UTC>))
    +lookup_zone_exception(callsign, timestamp=datetime.datetime(2014, 6, 15, 7, 5, 27, 706866, tzinfo=<UTC>))

    Returns a CQ Zone if an exception exists for the given callsign

    Args: callsign (string): Amateur radio callsign @@ -341,6 +411,7 @@ in CQ Zone 38

    This method is available for

    • clublogxml
    • +
    • redis
    diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv index ff5bbd74104e80267ecc235d5915c6af559d61d0..7d6004f549103870e42cad449d123f7dac33b0b3 100644 GIT binary patch delta 351 zcmV-l0igcE1K9(RgMarGmf9<*x#rqarBtfa2Ux~lU{%{o@KS}mzJN&@(kLaN2QI_T zFf;5rGUyHLL}0VFDg!H$m8japjW5!YoqZH91QLjXeooaL^EIJ zSZDfEVZ`K~JV@ASs2IslB+u%eWevI6FO8?S`+tens|PG@33W+LQ`JhNSV{D<27_U7 zOICFc`C@TX_o2rH!cZ(LTGZ(F0yocXezX6FhNvX-WsDA(e delta 328 zcmV-O0k{6y1HuE4gMa50mf9<*TyyQIQYuyI11w`Nu&V7P*i?|$7cfmBqDd${Sh9wh zVRmdAQfL)4%z3rfA_dK&gq3Y%#t(7fjecOSq-qW9rH6Jo*aguyIw}Iyfv99LCkAY! zy$8aZ$YEEug)p8-yI2!_)TPF>%d$7&=TGb~pa)EYIN;GEi+`rl+M{+e*??S=NTD^_ zjAp9m5xhqjpUF9R-t7k`@C7NBTsYljQIG+-%IDlz{L>OTj`mY%RGdnvgh#S7$BROj znvAmwj@%PZg;l*ctF0W2l4-GbqzM@B$8wmj39{Ug7TqG7Z|i7G1=gc)H)oR6`Pj~E zQ>b1nwQ%lcia{$AoyY=*Mnbvr*ngX>w!Uh)6$ZB6ZuIr(Urw#8Aj4+MY}2Y&PSU-u a@U|9j^dD*w3NwystBpL~D)$Sng(*JA>7p6{ diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index be7b384..22f971d 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:42,terms:{all:[4,5,2],code:[0,4,5],illustr:[],queri:5,month:5,prefix:[4,5],follow:[0,3,4,5,2],depend:[4,5],zone:[4,5],tobia:2,aris:2,merchant:2,digit:3,sourc:5,string:[4,5],fals:[4,5],util:[],veri:4,"try":5,item:4,get_contin:4,readthedoc:0,get_cqz:4,impli:2,consequ:4,download:5,even:5,index:0,lookup_prefix:5,asia:4,current:[0,4],delet:5,version:0,method:5,iaru:3,modifi:2,valu:5,search:0,cty:5,precis:4,datetim:[4,5],doctest:[],permit:2,action:2,typic:5,dh1tw:[0,4,1,2],freq_to_band:3,vp5:[],modul:[],africa:4,filenam:5,api:[4,5],callinfo:[],fed:[4,5],from:[3,4,5,2],usb:3,would:4,two:5,call:4,is_valid_callsign:4,type:[3,4,5],more:5,capit:4,notic:2,particular:2,known:5,herebi:2,none:[4,5],retriev:4,work:4,can:[4,5],purpos:[4,2],claim:2,onlin:5,plist:5,mylookuplib:5,get_country_nam:4,how:5,verifi:[],updat:5,befor:5,wrong:3,adif:[4,5],date:5,data:[4,5],github:0,grant:2,assign:5,issu:0,inform:[4,5],frequent:0,furnish:2,lsb:3,through:4,get_ituz:4,itu:4,paramet:[3,4,5],clublogxml:5,fit:2,tort:2,therefor:5,lookup_ent:5,"return":[3,4,5],python:[0,4,5],timestamp:[4,5],dai:5,band:3,qrp:[],name:4,mode:3,found:[4,5],replac:5,connect:[5,2],year:5,event:2,out:[3,2],lookuptyp:[4,5],rep:[4,5],publish:2,content:[],internet:5,print:[3,5],bla:[],differ:[4,5],free:2,dictionari:[3,4,5],org:[0,4,5],freq:3,lookup_callsign:5,hc2:4,frequenc:3,could:4,dp0gvn:5,gethomecal:[],south:4,oper:5,softwar:2,suffix:4,directli:5,restrict:2,construct:4,noresult:[],miss:[4,5],given:5,christma:5,associ:2,wrapper:5,station:5,option:[4,5],copi:2,getter:[],pars:0,holder:2,kind:2,provid:[4,5,2],structur:[],exampl:[3,4,5],str:[3,4,5],pre:4,bandplan:3,ani:[4,2],antarctica:[4,5],amateur:[0,4,5],dedic:4,sell:2,hamtest:0,note:[],also:5,contact:[],which:[0,5],get_adif_id:4,mit:[0,2],germani:[4,5],distribut:2,shall:2,object:4,most:4,sublicens:2,bsd:[],america:4,"class":[0,4,5],charg:2,homogen:5,don:4,wellnitz:2,show:5,text:[],myapikei:5,radio:[0,4,5],permiss:2,xml:[4,5],access:[],onli:4,locat:[4,5],copyright:2,explain:[],activ:4,should:[],dict:[3,4,5],ituz:[4,5],tzinfo:[4,5],local:5,variou:5,utc:[4,5],express:2,liabl:2,geo:[],requir:5,whether:2,stuff:[],contain:[0,3,4,5],where:4,see:0,arg:5,subject:2,oceania:4,databas:[4,5],written:[],"import":[3,4,5],irc:0,accord:3,kei:5,entir:4,come:0,against:5,etc:4,instanc:[4,5],countri:[4,5],com:[0,4,5],latitud:[4,5],damag:2,liabil:2,three:5,whom:2,is_invalid_oper:5,valueerror:4,convert:3,coordin:4,pytz:[4,5],"case":4,aim:5,"while":4,apikei:5,abov:2,webirc:0,my_lookuplib:[4,5],contract:2,substanti:2,seem:5,sever:4,author:2,perform:5,same:5,get_lat_long:4,lookuplib:[],"5w1cfn":5,http:[0,5],clublog:[4,5],rais:[3,4,5],noninfring:2,off:4,entri:4,clublogapi:5,vk9xo:5,person:2,without:[4,2],thi:[4,5,2],entiti:5,identifi:[4,5],obtain:[5,2],europ:4,except:5,valid:[4,5],bool:[4,5],logger:[4,5],match:5,applic:0,format:[],like:0,specif:[4,5],republ:4,necessari:[0,5],page:0,underli:4,right:2,deal:2,some:0,callsign:[0,4,5],home:4,librari:[0,5],feder:4,lookup_zone_except:5,inject:[4,5],condit:2,complic:[],"__name__":[4,5],island:5,slightli:4,unfortun:4,apikeymissingerror:5,"float":3,warranti:2,strip:4,ea1:[],merg:2,get_al:4,log:[4,5],wai:[],cqz:[4,5],avail:[4,5],reli:4,interfac:5,includ:2,"function":[],north:4,keyerror:[3,4,5],"true":[4,5],cic:4,countryfil:[4,5],"default":5,record:5,contin:[4,5],limit:2,otherwis:2,khz:3,creat:0,"int":[3,4,5],get_homecal:4,doesn:4,exist:[4,5],file:[0,4,5,2],deltaxrai:0,check:[4,5],incorrect:5,when:[4,5],detail:5,invalid:5,other:2,lookup:[4,5],you:0,example_gener:[],longitud:[4,5],turkmenistan:5,infrequ:5,faster:0,descript:[],portion:2,daili:5,time:5,hello:[],getlogg:[4,5]},objtypes:{"0":"py:module","1":"py:method","2":"py:function","3":"py:class"},objnames:{"0":["py","module","Python module"],"1":["py","method","Python method"],"2":["py","function","Python function"],"3":["py","class","Python class"]},filenames:["index","help","license","utils","Callinfo","LookupLib"],titles:["PyHamTools","help","license","utils","Callinfo","LookupLib"],objects:{pyhamtools:{utils:[3,0,0,"-"],callinfo:[4,0,0,"-"],lookuplib:[5,0,0,"-"]},"pyhamtools.utils":{freq_to_band:[3,2,1,""]},"pyhamtools.lookuplib":{LookupLib:[5,3,1,""]},"pyhamtools.lookuplib.LookupLib":{lookup_prefix:[5,1,1,""],lookup_entity:[5,1,1,""],lookup_zone_exception:[5,1,1,""],lookup_callsign:[5,1,1,""],is_invalid_operation:[5,1,1,""]},"pyhamtools.callinfo":{Callinfo:[4,3,1,""]},"pyhamtools.callinfo.Callinfo":{get_continent:[4,1,1,""],get_cqz:[4,1,1,""],get_homecall:[4,1,1,""],get_country_name:[4,1,1,""],get_all:[4,1,1,""],get_lat_long:[4,1,1,""],get_adif_id:[4,1,1,""],is_valid_callsign:[4,1,1,""],get_ituz:[4,1,1,""]}},titleterms:{content:[],help:1,anoth:[],licens:2,clase:0,indic:0,util:3,header:[],contact:2,callinfo:4,tabl:0,pyhamtool:0,document:[],simpl:[],modul:0,lookuplib:5,welcom:[]}}) \ No newline at end of file +Search.setIndex({envversion:42,terms:{all:[4,5,2],code:[0,4,5],illustr:[],queri:5,month:5,prefix:[4,5],follow:[0,3,4,5,2],depend:[4,5],zone:[4,5],tobia:2,aris:2,merchant:2,digit:3,sourc:5,string:[4,5],fals:[4,5],util:[],veri:4,"try":5,item:4,radio:[0,4,5],readthedoc:0,get_cqz:4,impli:2,consequ:4,download:5,even:5,index:0,lookup_prefix:5,asia:4,current:[0,4],delet:5,version:0,method:5,iaru:3,let:5,modifi:2,valu:5,search:0,cty:5,precis:4,datetim:[4,5],doctest:[],permit:2,action:2,extrem:5,typic:5,dh1tw:[0,4,1,2],freq_to_band:3,vp5:[],modul:[],africa:4,filenam:5,api:[4,5],instal:5,redi:5,callinfo:[],fed:[4,5],from:[3,4,5,2],usb:3,would:4,memori:5,two:5,connector:5,call:4,is_valid_callsign:4,type:[3,4,5],more:5,capit:4,notic:2,particular:2,known:5,herebi:2,none:[4,5],retriev:4,work:4,can:[4,5],purpos:[4,2],claim:2,process:5,onlin:5,plist:5,mylookuplib:5,get_country_nam:4,how:5,instead:5,updat:5,befor:5,wrong:3,adif:[4,5],date:5,"3d2ri":5,associ:2,github:0,author:2,gethomecal:[],issu:0,inform:[4,5],south:4,allow:5,furnish:2,lsb:3,through:4,get_ituz:4,itu:4,paramet:[3,4,5],clublogxml:5,fit:2,tort:2,therefor:5,lookup_ent:5,"return":[3,4,5],python:[0,4,5],timestamp:[4,5],dai:5,band:3,verifi:[],now:5,qrp:[],name:4,mode:3,found:[4,5],replac:5,"static":4,connect:[5,2],year:5,event:2,out:[3,2],lookuptyp:[4,5],rep:[4,5],publish:2,content:[],internet:5,print:[3,5],bla:[],differ:[4,5],free:2,dictionari:[3,4,5],org:[0,4,5],freq:3,lookup_callsign:5,hc2:4,frequenc:3,could:4,dp0gvn:5,assign:5,frequent:0,oper:5,softwar:2,suffix:4,directli:5,restrict:2,construct:4,noresult:[],miss:[4,5],given:5,christma:5,data:[4,5],wrapper:5,station:5,store:5,option:[4,5],copi:[5,2],getter:[],pars:0,holder:2,kind:2,provid:[4,5,2],structur:[],exampl:[3,4,5],str:[3,4,5],pre:4,"function":[],well:5,ani:[4,2],antarctica:[4,5],north:4,seem:5,sell:2,hamtest:0,note:[],also:5,contact:[],redis_prefix:5,which:[0,5],get_adif_id:4,instanci:5,germani:[4,5],distribut:2,shall:2,object:[4,5],most:4,sublicens:2,bsd:[],america:4,"class":[0,4,5],charg:2,homogen:5,don:4,wellnitz:2,show:5,text:[],myapikei:5,concurr:5,get_contin:4,permiss:2,xml:[4,5],access:[],onli:4,locat:[4,5],copyright:2,explain:[],activ:4,should:[],dict:[3,4,5],ituz:[4,5],tzinfo:[4,5],local:5,overwritten:5,variou:5,countryfil:[4,5],express:2,liabl:2,geo:[],requir:5,"default":5,stuff:[],contain:[0,3,4,5],where:4,set:5,copy_data_in_redi:5,see:0,arg:5,subject:2,oceania:4,databas:[4,5],written:[],"import":[3,4,5],irc:0,accord:3,kei:5,entir:[4,5],distinguish:5,come:0,against:5,etc:4,instanc:[4,5],countri:[4,5],com:[0,4,5],load:5,latitud:[4,5],damag:2,liabil:2,three:5,been:5,cqz:[4,5],is_invalid_oper:5,valueerror:4,convert:3,coordin:4,pytz:[4,5],"case":4,aim:5,"while":4,apikei:5,abov:2,webirc:0,my_lookuplib:[4,5],contract:2,substanti:2,dedic:4,sever:[4,5],grant:2,perform:5,same:5,get_lat_long:4,lookuplib:[],complet:5,"5w1cfn":5,http:[0,5],clublog:[4,5],rais:[3,4,5],noninfring:2,off:4,entri:4,clublogapi:5,vk9xo:5,person:2,without:[4,2],thi:[4,5,2],entiti:5,looktyp:5,identifi:[4,5],obtain:[5,2],europ:4,except:5,other:2,lookup:[4,5],logger:[4,5],save:5,match:5,applic:0,format:[],like:0,specif:[4,5],mit:[0,2],republ:4,necessari:0,page:0,underli:4,right:2,old:5,deal:2,some:[0,5],callsign:[0,4,5],home:4,successfulli:5,librari:[0,5],feder:4,lookup_zone_except:5,inject:[4,5],condit:2,complic:[],run:5,"__name__":[4,5],island:5,slightli:4,unfortun:4,apikeymissingerror:5,"float":3,warranti:2,strip:4,ea1:[],merg:2,get_al:4,log:[4,5],wai:[],whom:2,fast:5,avail:[4,5],reli:4,interfac:5,includ:2,bandplan:3,amateur:[0,4,5],keyerror:[3,4,5],redis_inst:5,rotuma:5,"true":[4,5],cic:4,utc:[4,5],whether:2,record:5,contin:[4,5],limit:2,otherwis:2,khz:3,creat:[0,5],"int":[3,4,5],get_homecal:4,doesn:4,exist:[4,5],file:[0,4,5,2],pip:5,deltaxrai:0,check:[4,5],incorrect:5,when:[4,5],detail:5,invalid:5,valid:[4,5],bool:[4,5],you:0,example_gener:[],longitud:[4,5],turkmenistan:5,infrequ:5,faster:0,descript:[],portion:2,getlogg:[4,5],time:5,hello:[],daili:5},objtypes:{"0":"py:module","1":"py:staticmethod","2":"py:method","3":"py:class","4":"py:function"},objnames:{"0":["py","module","Python module"],"1":["py","staticmethod","Python static method"],"2":["py","method","Python method"],"3":["py","class","Python class"],"4":["py","function","Python function"]},filenames:["index","help","license","utils","Callinfo","LookupLib"],titles:["PyHamTools","help","license","utils","Callinfo","LookupLib"],objects:{pyhamtools:{utils:[3,0,0,"-"],callinfo:[4,0,0,"-"],lookuplib:[5,0,0,"-"]},"pyhamtools.utils":{freq_to_band:[3,4,1,""]},"pyhamtools.lookuplib":{LookupLib:[5,3,1,""]},"pyhamtools.lookuplib.LookupLib":{lookup_entity:[5,2,1,""],lookup_zone_exception:[5,2,1,""],lookup_prefix:[5,2,1,""],copy_data_in_redis:[5,2,1,""],lookup_callsign:[5,2,1,""],is_invalid_operation:[5,2,1,""]},"pyhamtools.callinfo":{Callinfo:[4,3,1,""]},"pyhamtools.callinfo.Callinfo":{get_cqz:[4,2,1,""],get_continent:[4,2,1,""],get_homecall:[4,1,1,""],get_country_name:[4,2,1,""],get_all:[4,2,1,""],get_lat_long:[4,2,1,""],is_valid_callsign:[4,2,1,""],get_adif_id:[4,2,1,""],get_ituz:[4,2,1,""]}},titleterms:{util:3,help:1,anoth:[],licens:2,clase:0,simpl:[],indic:0,content:[],header:[],contact:2,tabl:0,pyhamtool:0,document:[],callinfo:4,modul:0,lookuplib:5,welcom:[]}}) \ No newline at end of file diff --git a/pyhamtools/callinfo.py b/pyhamtools/callinfo.py index e91f9e5..a7a0fd1 100644 --- a/pyhamtools/callinfo.py +++ b/pyhamtools/callinfo.py @@ -3,11 +3,8 @@ import logging from datetime import datetime import sys - import pytz - -from pyhamtools import LookupLib from pyhamtools.consts import LookupConventions as const @@ -19,6 +16,7 @@ if sys.version_info < (2, 7, ): def emit(self, record): pass + class Callinfo(object): """ The purpose of this class is to return data (country, latitude, longitude, CQ Zone...etc) for an @@ -47,7 +45,8 @@ class Callinfo(object): self._lookuplib = lookuplib self._callsign_info = None - def get_homecall(self, callsign): + @staticmethod + def get_homecall(callsign): """Strips off country prefixes (**HC2/**DH1TW) and activity suffixes (DH1TW**/P**). Args: @@ -60,13 +59,13 @@ class Callinfo(object): ValueError: No callsign found in string Example: - The following code retrieves the home call for "HC2/DH1TW/P" + The following code retrieves the home call for "HC2/DH1TW/P" - >>> from pyhamtools import LookupLib, Callinfo - >>> my_lookuplib = LookupLib(lookuptype="countryfile") - >>> cic = Callinfo(my_lookuplib) - >>> cic.get_homecall("HC2/DH1TW/P") - DH1TW + >>> from pyhamtools import LookupLib, Callinfo + >>> my_lookuplib = LookupLib(lookuptype="countryfile") + >>> cic = Callinfo(my_lookuplib) + >>> cic.get_homecall("HC2/DH1TW/P") + DH1TW """ @@ -78,12 +77,11 @@ class Callinfo(object): else: raise ValueError - def _iterate_prefix(self, callsign, timestamp=timestamp_now): """truncate call until it corresponds to a Prefix in the database""" prefix = callsign - while(len(prefix) > 0): + while len(prefix) > 0: try: return self._lookuplib.lookup_prefix(prefix, timestamp) except KeyError: @@ -91,19 +89,22 @@ class Callinfo(object): continue raise KeyError - def check_if_mm(self, callsign): + @staticmethod + def check_if_mm(callsign): if re.search("/MM$", callsign.upper()): return True else: return False - def check_if_am(self, callsign): + @staticmethod + def check_if_am(callsign): if re.search("/AM$", callsign.upper()): return True else: return False - def check_if_beacon(self, callsign): + @staticmethod + def check_if_beacon(callsign): if re.search("/B$", callsign.upper()): return True elif re.search("/BCN$", callsign.upper()): @@ -111,7 +112,6 @@ class Callinfo(object): else: return False - def _dismantle_callsign(self, callsign, timestamp=timestamp_now): """ try to identify the callsign's identity by analyzing it in the following order: @@ -142,7 +142,7 @@ class Callinfo(object): if appendix == 'MM': # special case Martime Mobile #self._mm = True - return { + return { 'adif': 999, 'continent': '', 'country': 'MARITIME MOBILE', @@ -151,7 +151,7 @@ class Callinfo(object): 'longitude': 0.0 } elif appendix == 'AM': # special case Aeronautic Mobile - return { + return { 'adif': 998, 'continent': '', 'country': 'AIRCAFT MOBILE', @@ -165,16 +165,16 @@ class Callinfo(object): elif appendix == 'QRPP': # special case QRPP callsign = re.sub('/QRPP', '', callsign) return self._iterate_prefix(callsign, timestamp) - elif appendix == 'BCN': #filter all beacons + elif appendix == 'BCN': # filter all beacons callsign = re.sub('/BCN', '', callsign) data = self._iterate_prefix(callsign, timestamp).copy() data[const.BEACON] = True return data - elif appendix == "LH": #Filter all Lighthouses + elif appendix == "LH": # Filter all Lighthouses callsign = re.sub('/LH', '', callsign) return self._iterate_prefix(callsign, timestamp) else: - #check if the appendix is a valid country prefix + # check if the appendix is a valid country prefix return self._iterate_prefix(re.sub('/', '', appendix), timestamp) # Single character appendix (callsign/x) @@ -182,9 +182,9 @@ class Callinfo(object): appendix = re.search('/[A-Z0-9]$', callsign) appendix = re.sub('/', '', appendix.group(0)) - if appendix == 'B': #special case Beacon + if appendix == 'B': # special case Beacon callsign = re.sub('/B', '', callsign) - data = self._iterate_prefix(callsign, timestamp).copy() + data = self._iterate_prefix(callsign, timestamp).copy() data[const.BEACON] = True return data @@ -223,7 +223,7 @@ class Callinfo(object): raise if self.check_if_mm(callsign): - return { + return { 'adif': 999, 'continent': '', 'country': 'MARITIME MOBILE', @@ -232,7 +232,7 @@ class Callinfo(object): 'longitude': 0.0 } elif self.check_if_am(callsign): - return { + return { 'adif': 998, 'continent': '', 'country': 'AIRCAFT MOBILE', @@ -253,7 +253,6 @@ class Callinfo(object): # Dismantel the callsign and check if the prefix is known return self._dismantle_callsign(callsign, timestamp) - def get_all(self, callsign, timestamp=timestamp_now): """ Lookup a callsign and return all data available from the underlying database @@ -268,14 +267,14 @@ class Callinfo(object): KeyError: Callsign could not be identified Example: - The following code returns all available information from the country-files.com database for the - callsign "DH1TW" + The following code returns all available information from the country-files.com database for the + callsign "DH1TW" - >>> from pyhamtools import LookupLib, Callinfo - >>> my_lookuplib = LookupLib(lookuptype="countryfile") - >>> cic = Callinfo(my_lookuplib) - >>> cic.get_all("DH1TW") - { + >>> from pyhamtools import LookupLib, Callinfo + >>> my_lookuplib = LookupLib(lookuptype="countryfile") + >>> cic = Callinfo(my_lookuplib) + >>> cic.get_all("DH1TW") + { 'country': 'Fed. Rep. of Germany', 'adif': 230, 'continent': 'EU', @@ -283,7 +282,7 @@ class Callinfo(object): 'longitude': -10.0, 'cqz': 14, 'ituz': 28 - } + } Note: The content of the returned data depends entirely on the injected @@ -313,13 +312,13 @@ class Callinfo(object): bool: True / False Example: - The following checks if "DH1TW" is a valid callsign + The following checks if "DH1TW" is a valid callsign - >>> from pyhamtools import LookupLib, Callinfo - >>> my_lookuplib = LookupLib(lookuptype="countryfile") - >>> cic = Callinfo(my_lookuplib) - >>> cic.is_valid_callsign("DH1TW") - True + >>> from pyhamtools import LookupLib, Callinfo + >>> my_lookuplib = LookupLib(lookuptype="countryfile") + >>> cic = Callinfo(my_lookuplib) + >>> cic.is_valid_callsign("DH1TW") + True """ try: @@ -342,16 +341,16 @@ class Callinfo(object): KeyError: No data found for callsign Example: - The following code returns Latitude & Longitude for "DH1TW" + The following code returns Latitude & Longitude for "DH1TW" - >>> from pyhamtools import LookupLib, Callinfo - >>> my_lookuplib = LookupLib(lookuptype="countryfile") - >>> cic = Callinfo(my_lookuplib) - >>> cic.get_lat_long("DH1TW") - { - 'latitude': 51.0, - 'longitude': -10.0 - } + >>> from pyhamtools import LookupLib, Callinfo + >>> my_lookuplib = LookupLib(lookuptype="countryfile") + >>> cic = Callinfo(my_lookuplib) + >>> cic.get_lat_long("DH1TW") + { + 'latitude': 51.0, + 'longitude': -10.0 + } Note: Unfortunately, in most cases the returned Latitude and Longitude are not very precise. @@ -361,8 +360,8 @@ class Callinfo(object): """ callsign_data = self.get_all(callsign, timestamp=timestamp) return { - const.LATITUDE : callsign_data[const.LATITUDE], - const.LONGITUDE : callsign_data[const.LONGITUDE] + const.LATITUDE: callsign_data[const.LATITUDE], + const.LONGITUDE: callsign_data[const.LONGITUDE] } def get_cqz(self, callsign, timestamp=timestamp_now): @@ -416,7 +415,7 @@ class Callinfo(object): Note: Don't rely on the country name when working with several instances of py:class:`Callinfo`. Clublog and Country-files.org use slightly different names - for countrys. Example: + for countries. Example: - Country-files.com: "Fed. Rep. of Germany" - Clublog: "FEDERAL REPUBLIC OF GERMANY" diff --git a/pyhamtools/lookuplib.py b/pyhamtools/lookuplib.py index 208ea0c..50b4564 100644 --- a/pyhamtools/lookuplib.py +++ b/pyhamtools/lookuplib.py @@ -7,7 +7,6 @@ from datetime import datetime import xml.etree.ElementTree as ET import urllib import json -import pickle import copy import sys @@ -49,7 +48,7 @@ class LookupLib(object): The entire lookup data can also be copied into Redis, which an extremely fast in-memory Key/Value store. A LookupLib object can be instanciated to perform then all lookups in Redis, instead processing and loading - the data from Internet / File. This saves some time and allows several instances of :py:call:`LookupLib` + the data from Internet / File. This saves some time and allows several instances of :py:class:`LookupLib` to query the same data concurrently. Args: @@ -107,7 +106,7 @@ class LookupLib(object): def copy_data_in_redis(self, redis_prefix, redis_instance): """ - Copy the complete lookup data and indexes of the object into redis. Old data will be overwritten. + Copy the complete lookup data into redis. Old data will be overwritten. Args: redis_prefix (str): Prefix to distinguish the data in redis for the different looktypes @@ -117,8 +116,8 @@ class LookupLib(object): bool: returns True when the data has been copied successfully into Redis Example: - Copy the entire lookup data from the Country-files.com PLIST File into Redis. A Redis Instance - needs to be installed, as well as copy of the python Redis connector (pip install redis-py) + Copy the entire lookup data from the Country-files.com PLIST File into Redis. This example requires a running + instance of Redis, as well the python Redis connector (pip install redis-py). >>> from pyhamtools import LookupLib >>> import redis diff --git a/test/test_lookuplib_redis.py b/test/test_lookuplib_redis.py new file mode 100644 index 0000000..b1a5b92 --- /dev/null +++ b/test/test_lookuplib_redis.py @@ -0,0 +1,42 @@ +import pytest +import json +from datetime import datetime + +import pytz +import redis + +from pyhamtools import LookupLib + + +UTC = pytz.UTC + +r = redis.Redis() + + +class TestStoreDataInRedis: + + def test_copy_data_in_redis(self, fixClublogXML, fix_redis): + + fixClublogXML.copy_data_in_redis("clx", redis.Redis()) + assert fix_redis.lookup_entity(280) == fixClublogXML.lookup_entity(280) + assert fix_redis.lookup_callsign("VK9XO") == fixClublogXML.lookup_callsign("VK9XO") + assert fix_redis.lookup_prefix("DH") == fixClublogXML.lookup_prefix("DH") + + with pytest.raises(KeyError): + fix_redis.is_invalid_operation("VK0MC") + + timestamp = datetime(year=1994, month=12, day=30).replace(tzinfo=UTC) + assert fix_redis.is_invalid_operation("VK0MC", timestamp) + + with pytest.raises(KeyError): + fix_redis.lookup_zone_exception("DH1TW") + + assert fix_redis.lookup_zone_exception("dp0gvn") == 38 + + + def test_copy_data_in_redis_2(self, fixCountryFile): + + lib = LookupLib(lookuptype="redis", redis_prefix="CF", redis_instance=r) + fixCountryFile.copy_data_in_redis("CF", r) + assert lib.lookup_callsign("3D2RI") == fixCountryFile.lookup_callsign("3D2RI") + assert lib.lookup_prefix("DH") == fixCountryFile.lookup_prefix("DH") \ No newline at end of file