updated tests & docstrings of LookupLib

This commit is contained in:
dh1tw 2014-04-25 23:46:44 +02:00
parent 644306bea0
commit 4e4e94091d
19 changed files with 329 additions and 137 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,10 +1,27 @@
license license
======= =======
The MIT License (MIT) The MIT License (MIT)
bla bla bla Copyright (c) 2014 Tobias Wellnitz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Contact: Contact:
======== ========
Contact DH1TW Contact Tobias@dh1tw.de

View file

@ -32,9 +32,6 @@
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index" <a href="genindex.html" title="General Index"
accesskey="I">index</a></li> accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">pyhamtools 0.1 documentation</a> &raquo;</li> <li><a href="index.html">pyhamtools 0.1 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
@ -47,11 +44,26 @@
<div class="section" id="license"> <div class="section" id="license">
<h1>license<a class="headerlink" href="#license" title="Permalink to this headline"></a></h1> <h1>license<a class="headerlink" href="#license" title="Permalink to this headline"></a></h1>
<p>The MIT License (MIT)</p> <p>The MIT License (MIT)</p>
<p>bla bla bla</p> <p>Copyright (c) 2014 Tobias Wellnitz</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the &#8220;Software&#8221;), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.</p>
</div> </div>
<div class="section" id="contact"> <div class="section" id="contact">
<h1>Contact:<a class="headerlink" href="#contact" title="Permalink to this headline"></a></h1> <h1>Contact:<a class="headerlink" href="#contact" title="Permalink to this headline"></a></h1>
<p>Contact DH1TW</p> <p>Contact <a class="reference external" href="mailto:Tobias&#37;&#52;&#48;dh1tw&#46;de">Tobias<span>&#64;</span>dh1tw<span>&#46;</span>de</a></p>
</div> </div>
@ -94,9 +106,6 @@
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index" <a href="genindex.html" title="General Index"
>index</a></li> >index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">pyhamtools 0.1 documentation</a> &raquo;</li> <li><a href="index.html">pyhamtools 0.1 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>

View file

@ -56,16 +56,17 @@
</div> </div>
<span class="target" id="module-pyhamtools.lookuplib"></span><dl class="class"> <span class="target" id="module-pyhamtools.lookuplib"></span><dl class="class">
<dt id="pyhamtools.lookuplib.LookupLib"> <dt id="pyhamtools.lookuplib.LookupLib">
<em class="property">class </em><tt class="descclassname">pyhamtools.lookuplib.</tt><tt class="descname">LookupLib</tt><big>(</big><em>lookuptype='clublogxml'</em>, <em>apikey=None</em>, <em>filename=None</em>, <em>logger=None</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib" title="Permalink to this definition"></a></dt> <em class="property">class </em><tt class="descclassname">pyhamtools.lookuplib.</tt><tt class="descname">LookupLib</tt><big>(</big><em>lookuptype='countryfile'</em>, <em>apikey=None</em>, <em>filename=None</em>, <em>logger=None</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib" title="Permalink to this definition"></a></dt>
<dd><p>This class provides a homogeneous interface to three different Amateur Radio Callsign lookup sources:</p> <dd><p>This class is a wrapper for the following three Amateur Radio databases:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li>Clublog.org (daily updated XML File)</li> <li>Clublog.org (daily updated XML File)</li>
<li>Clublog.org (HTTPS lookup)</li> <li>Clublog.org (HTTPS lookup)</li>
<li>Country-files.com (infrequently updated PLIST File)</li> <li>Country-files.com (infrequently updated PLIST File)</li>
</ol> </ol>
<p>The class provides getters to access the data in a structured way. Even the interface is the same <p>It&#8217;s aim is to provide a homogeneous interface to different data sources.</p>
for all lookup sources, the returning data can be different. The documentation of the various <p>Typically it is injected as a dependency in the Callinfo class, but can also be used directly.</p>
methods provide more detail.</p> <p>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.</p>
<p>By default, LookupLib requires an Internet connection to download the libraries or perform the <p>By default, LookupLib requires an Internet connection to download the libraries or perform the
lookup against the Clublog API.</p> lookup against the Clublog API.</p>
<table class="docutils field-list" frame="void" rules="none"> <table class="docutils field-list" frame="void" rules="none">
@ -84,7 +85,7 @@ lookup against the Clublog API.</p>
</table> </table>
<dl class="method"> <dl class="method">
<dt id="pyhamtools.lookuplib.LookupLib.is_invalid_operation"> <dt id="pyhamtools.lookuplib.LookupLib.is_invalid_operation">
<tt class="descname">is_invalid_operation</tt><big>(</big><em>callsign</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>24</em>, <em>15</em>, <em>46</em>, <em>11</em>, <em>956076</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.is_invalid_operation" title="Permalink to this definition"></a></dt> <tt class="descname">is_invalid_operation</tt><big>(</big><em>callsign</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>25</em>, <em>21</em>, <em>44</em>, <em>34</em>, <em>169942</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.is_invalid_operation" title="Permalink to this definition"></a></dt>
<dd><p>Returns True if an operations is known as invalid</p> <dd><p>Returns True if an operations is known as invalid</p>
<table class="docutils field-list" frame="void" rules="none"> <table class="docutils field-list" frame="void" rules="none">
<col class="field-name" /> <col class="field-name" />
@ -103,7 +104,7 @@ lookup against the Clublog API.</p>
</td> </td>
</tr> </tr>
<tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple"> <tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple">
<li><tt class="xref py py-exc docutils literal"><span class="pre">NoResult</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">KeyError</span></tt> &#8211;
No matching callsign found</li> No matching callsign found</li>
<li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211;
API Key for Clublog missing or incorrect</li> API Key for Clublog missing or incorrect</li>
@ -112,6 +113,22 @@ API Key for Clublog missing or incorrect</li>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p class="rubric">Example</p>
<p>The following code checks the Clublog XML database if the operation is valid for two dates.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pyhamtools</span> <span class="kn">import</span> <span class="n">LookupLib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pytz</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">my_lookuplib</span> <span class="o">=</span> <span class="n">LookupLib</span><span class="p">(</span><span class="n">lookuptype</span><span class="o">=</span><span class="s">&quot;clublogxml&quot;</span><span class="p">,</span> <span class="n">apikey</span><span class="o">=</span><span class="s">&quot;myapikey&quot;</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">my_lookuplib</span><span class="o">.</span><span class="n">is_invalid_operation</span><span class="p">(</span><span class="s">&quot;5W1CFN&quot;</span><span class="p">)</span>
<span class="go">True</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">try</span><span class="p">:</span>
<span class="gp">&gt;&gt;&gt; </span> <span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="o">=</span><span class="mi">2012</span><span class="p">,</span> <span class="n">month</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">day</span><span class="o">=</span><span class="mi">31</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">pytz</span><span class="o">.</span><span class="n">UTC</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span> <span class="n">my_lookuplib</span><span class="o">.</span><span class="n">is_invalid_operation</span><span class="p">(</span><span class="s">&quot;5W1CFN&quot;</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="gp">&gt;&gt;&gt; </span> <span class="k">print</span> <span class="s">&quot;Seems to be invalid operation before 31.1.2012&quot;</span>
<span class="go">Seems to be an invalid operation before 31.1.2012</span>
</pre></div>
</div>
<div class="admonition note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>This method is available for</p> <p>This method is available for</p>
@ -123,7 +140,7 @@ API Key for Clublog missing or incorrect</li>
<dl class="method"> <dl class="method">
<dt id="pyhamtools.lookuplib.LookupLib.lookup_callsign"> <dt id="pyhamtools.lookuplib.LookupLib.lookup_callsign">
<tt class="descname">lookup_callsign</tt><big>(</big><em>callsign=None</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>24</em>, <em>15</em>, <em>46</em>, <em>11</em>, <em>956058</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.lookup_callsign" title="Permalink to this definition"></a></dt> <tt class="descname">lookup_callsign</tt><big>(</big><em>callsign=None</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>25</em>, <em>21</em>, <em>44</em>, <em>34</em>, <em>169924</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.lookup_callsign" title="Permalink to this definition"></a></dt>
<dd><p>Returns lookup data if an exception exists for a callsign</p> <dd><p>Returns lookup data if an exception exists for a callsign</p>
<table class="docutils field-list" frame="void" rules="none"> <table class="docutils field-list" frame="void" rules="none">
<col class="field-name" /> <col class="field-name" />
@ -142,7 +159,7 @@ API Key for Clublog missing or incorrect</li>
</td> </td>
</tr> </tr>
<tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple"> <tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple">
<li><tt class="xref py py-exc docutils literal"><span class="pre">NoResult</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">KeyError</span></tt> &#8211;
No matching callsign found</li> No matching callsign found</li>
<li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211;
API Key for Clublog missing or incorrect</li> API Key for Clublog missing or incorrect</li>
@ -151,6 +168,24 @@ API Key for Clublog missing or incorrect</li>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p class="rubric">Example</p>
<p>The following code queries the the online Clublog API for the callsign &#8220;VK9XO&#8221; on a specific date.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pyhamtools</span> <span class="kn">import</span> <span class="n">LookupLib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">pytz</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">my_lookuplib</span> <span class="o">=</span> <span class="n">LookupLib</span><span class="p">(</span><span class="n">lookuptype</span><span class="o">=</span><span class="s">&quot;clublogapi&quot;</span><span class="p">,</span> <span class="n">apikey</span><span class="o">=</span><span class="s">&quot;myapikey&quot;</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="o">=</span><span class="mi">1962</span><span class="p">,</span> <span class="n">month</span><span class="o">=</span><span class="mi">7</span><span class="p">,</span> <span class="n">day</span><span class="o">=</span><span class="mi">7</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="n">pytz</span><span class="o">.</span><span class="n">UTC</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">my_lookuplib</span><span class="o">.</span><span class="n">lookup_callsign</span><span class="p">(</span><span class="s">&quot;VK9XO&quot;</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">)</span>
<span class="go">{</span>
<span class="go"> &#39;country&#39;: &#39;CHRISTMAS ISLAND&#39;,</span>
<span class="go"> &#39;longitude&#39;: -105.7,</span>
<span class="go"> &#39;cqz&#39;: 29,</span>
<span class="go"> &#39;adif&#39;: 35,</span>
<span class="go"> &#39;latitude&#39;: -10.5,</span>
<span class="go"> &#39;continent&#39;: &#39;OC&#39;</span>
<span class="go">}</span>
</pre></div>
</div>
<div class="admonition note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>This method is available for</p> <p>This method is available for</p>
@ -176,11 +211,28 @@ API Key for Clublog missing or incorrect</li>
</tr> </tr>
<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">dict</td> <tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">dict</td>
</tr> </tr>
<tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><tt class="xref py py-exc docutils literal"><span class="pre">NoResult</span></tt> &#8211; <tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><tt class="xref py py-exc docutils literal"><span class="pre">KeyError</span></tt> &#8211;
No matching entity found</td> No matching entity found</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p class="rubric">Example</p>
<p>The following code queries the the Clublog XML database for the ADIF entity Turkmenistan, which has
the id 273.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pyhamtools</span> <span class="kn">import</span> <span class="n">LookupLib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">my_lookuplib</span> <span class="o">=</span> <span class="n">LookupLib</span><span class="p">(</span><span class="n">lookuptype</span><span class="o">=</span><span class="s">&quot;clublogapi&quot;</span><span class="p">,</span> <span class="n">apikey</span><span class="o">=</span><span class="s">&quot;myapikey&quot;</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">my_lookuplib</span><span class="o">.</span><span class="n">lookup_entity</span><span class="p">(</span><span class="mi">273</span><span class="p">)</span>
<span class="go">{</span>
<span class="go"> &#39;deleted&#39;: False,</span>
<span class="go"> &#39;country&#39;: &#39;TURKMENISTAN&#39;,</span>
<span class="go"> &#39;longitude&#39;: -58.4,</span>
<span class="go"> &#39;cqz&#39;: 17,</span>
<span class="go"> &#39;prefix&#39;: &#39;EZ&#39;,</span>
<span class="go"> &#39;latitude&#39;: 38.0,</span>
<span class="go"> &#39;continent&#39;: &#39;AS&#39;</span>
<span class="go">}</span>
</pre></div>
</div>
<div class="admonition note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>This method is available for the following lookup type</p> <p>This method is available for the following lookup type</p>
@ -192,7 +244,7 @@ No matching entity found</td>
<dl class="method"> <dl class="method">
<dt id="pyhamtools.lookuplib.LookupLib.lookup_prefix"> <dt id="pyhamtools.lookuplib.LookupLib.lookup_prefix">
<tt class="descname">lookup_prefix</tt><big>(</big><em>prefix</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>24</em>, <em>15</em>, <em>46</em>, <em>11</em>, <em>956058</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.lookup_prefix" title="Permalink to this definition"></a></dt> <tt class="descname">lookup_prefix</tt><big>(</big><em>prefix</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>25</em>, <em>21</em>, <em>44</em>, <em>34</em>, <em>169924</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.lookup_prefix" title="Permalink to this definition"></a></dt>
<dd><p>Returns lookup data of a Prefix</p> <dd><p>Returns lookup data of a Prefix</p>
<table class="docutils field-list" frame="void" rules="none"> <table class="docutils field-list" frame="void" rules="none">
<col class="field-name" /> <col class="field-name" />
@ -211,7 +263,7 @@ No matching entity found</td>
</td> </td>
</tr> </tr>
<tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple"> <tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple">
<li><tt class="xref py py-exc docutils literal"><span class="pre">NoResult</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">KeyError</span></tt> &#8211;
No matching Prefix found</li> No matching Prefix found</li>
<li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211;
API Key for Clublog missing or incorrect</li> API Key for Clublog missing or incorrect</li>
@ -220,6 +272,23 @@ API Key for Clublog missing or incorrect</li>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p class="rubric">Example</p>
<p>The following code shows how to obtain the information for the prefix &#8220;DH&#8221; from the countryfile.com
database (default database).</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pyhamtools</span> <span class="kn">import</span> <span class="n">LookupLib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">myLookupLib</span> <span class="o">=</span> <span class="n">LookupLib</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">myLookupLib</span><span class="o">.</span><span class="n">lookup_prefix</span><span class="p">(</span><span class="s">&quot;DH&quot;</span><span class="p">)</span>
<span class="go">{</span>
<span class="go"> &#39;adif&#39;: 230,</span>
<span class="go"> &#39;country&#39;: &#39;Fed. Rep. of Germany&#39;,</span>
<span class="go"> &#39;longitude&#39;: -10.0,</span>
<span class="go"> &#39;cqz&#39;: 14,</span>
<span class="go"> &#39;ituz&#39;: 28,</span>
<span class="go"> &#39;latitude&#39;: 51.0,</span>
<span class="go"> &#39;continent&#39;: &#39;EU&#39;</span>
<span class="go">}</span>
</pre></div>
</div>
<div class="admonition note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>This method is available for</p> <p>This method is available for</p>
@ -232,7 +301,7 @@ API Key for Clublog missing or incorrect</li>
<dl class="method"> <dl class="method">
<dt id="pyhamtools.lookuplib.LookupLib.lookup_zone_exception"> <dt id="pyhamtools.lookuplib.LookupLib.lookup_zone_exception">
<tt class="descname">lookup_zone_exception</tt><big>(</big><em>callsign</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>24</em>, <em>15</em>, <em>46</em>, <em>11</em>, <em>956082</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.lookup_zone_exception" title="Permalink to this definition"></a></dt> <tt class="descname">lookup_zone_exception</tt><big>(</big><em>callsign</em>, <em>timestamp=datetime.datetime(2014</em>, <em>4</em>, <em>25</em>, <em>21</em>, <em>44</em>, <em>34</em>, <em>169948</em>, <em>tzinfo=&lt;UTC&gt;)</em><big>)</big><a class="headerlink" href="#pyhamtools.lookuplib.LookupLib.lookup_zone_exception" title="Permalink to this definition"></a></dt>
<dd><p>Returns a CQ Zone if an exception exists for the given callsign</p> <dd><p>Returns a CQ Zone if an exception exists for the given callsign</p>
<p>Args: <p>Args:
callsign (string): Amateur radio callsign callsign (string): Amateur radio callsign
@ -248,7 +317,7 @@ timestamp (datetime, optional): datetime in UTC (tzinfo=pytz.UTC)</p>
</td> </td>
</tr> </tr>
<tr class="field-odd field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple"> <tr class="field-odd field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple">
<li><tt class="xref py py-exc docutils literal"><span class="pre">NoResult</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">KeyError</span></tt> &#8211;
No matching callsign found</li> No matching callsign found</li>
<li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211; <li><tt class="xref py py-exc docutils literal"><span class="pre">APIKeyMissingError</span></tt> &#8211;
API Key for Clublog missing or incorrect</li> API Key for Clublog missing or incorrect</li>
@ -257,6 +326,16 @@ API Key for Clublog missing or incorrect</li>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p class="rubric">Example</p>
<p>The following code checks the Clublog XML database if a CQ Zone exception exists for the callsign DP0GVN.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">pyhamtools</span> <span class="kn">import</span> <span class="n">LookupLib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">my_lookuplib</span> <span class="o">=</span> <span class="n">LookupLib</span><span class="p">(</span><span class="n">lookuptype</span><span class="o">=</span><span class="s">&quot;clublogxml&quot;</span><span class="p">,</span> <span class="n">apikey</span><span class="o">=</span><span class="s">&quot;myapikey&quot;</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">my_lookuplib</span><span class="o">.</span><span class="n">lookup_zone_exception</span><span class="p">(</span><span class="s">&quot;DP0GVN&quot;</span><span class="p">)</span>
<span class="go">38</span>
</pre></div>
</div>
<p>The prefix &#8220;DP&#8221; It is assigned to Germany, but the station is located in Antarctica, and therefore
in CQ Zone 38</p>
<div class="admonition note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>This method is available for</p> <p>This method is available for</p>

View file

@ -1 +1 @@
Search.setIndex({envversion:42,terms:{all:3,code:0,identifi:3,text:[],prefix:3,radio:[0,3],same:3,follow:[0,3],entiti:3,xml:3,current:0,clublogxml:3,zone:3,explain:[],except:3,dict:3,tzinfo:3,bool:3,logger:3,match:3,applic:0,lookup_ent:3,sourc:3,"return":3,string:3,variou:3,utc:3,python:[0,3],timestamp:3,veri:[],requir:3,infrequ:3,like:0,specif:3,bla:2,"default":3,stuff:[],necessari:0,contain:[0,3],found:3,readthedoc:0,page:0,some:0,see:0,callsign:[0,3],connect:3,arg:3,download:3,librari:[0,3],even:3,index:0,lookuptyp:3,lookup_prefix:3,lookup_zone_except:3,content:[],version:0,internet:3,print:[],irc:0,complic:[],method:3,kei:3,differ:3,dictionari:3,org:[0,3],come:0,lookup_callsign:3,valu:3,search:0,cty:3,against:3,datetim:3,countri:3,dh1tw:[0,1,2],com:[0,3],frequent:0,oper:3,apikeymissingerror:3,modul:[],filenam:3,api:3,"__name__":3,noresult:3,miss:3,given:3,log:3,wai:3,three:3,avail:3,interfac:3,paramet:3,type:3,more:3,amateur:[0,3],option:3,is_invalid_oper:3,pytz:3,pars:0,known:3,getter:3,"true":3,countryfil:3,none:3,provid:3,access:3,structur:3,record:3,apikei:3,can:3,str:3,webirc:0,creat:0,"int":3,clublogapi:3,exist:3,file:[0,3],deltaxrai:0,plist:3,incorrect:3,perform:3,detail:3,invalid:3,note:[],lookup:3,which:[0,3],you:0,mit:2,lookuplib:[],updat:3,http:[0,3],clublog:3,rais:3,adif:3,bsd:0,data:3,"class":[0,3],homogen:3,github:0,faster:0,descript:[],issu:0,hamtest:0,contact:[],getlogg:3,thi:3,time:3,hello:[],daili:3},objtypes:{"0":"py:module","1":"py:method","2":"py:class"},objnames:{"0":["py","module","Python module"],"1":["py","method","Python method"],"2":["py","class","Python class"]},filenames:["index","help","license","LookupLib"],titles:["PyHamTools","help","license","LookupLib"],objects:{pyhamtools:{lookuplib:[3,0,0,"-"]},"pyhamtools.lookuplib":{LookupLib:[3,2,1,""]},"pyhamtools.lookuplib.LookupLib":{lookup_prefix:[3,1,1,""],lookup_entity:[3,1,1,""],lookup_zone_exception:[3,1,1,""],lookup_callsign:[3,1,1,""],is_invalid_operation:[3,1,1,""]}},titleterms:{help:1,anoth:[],licens:2,clase:0,indic:0,content:[],header:[],contact:2,tabl:0,pyhamtool:0,document:[],simpl:[],modul:0,lookuplib:3,welcom:[]}}) Search.setIndex({envversion:42,terms:{all:[3,2],code:[0,3],identifi:3,show:3,illustr:[],text:[],clublog:3,obtain:[3,2],myapikei:3,prefix:3,radio:[0,3],same:3,permiss:2,follow:[0,3,2],data:3,bsd:0,entiti:3,xml:3,current:0,clublogxml:3,depend:3,copyright:2,how:3,holder:2,explain:[],tobia:2,except:3,should:[],tort:2,valid:3,dict:3,ituz:3,queri:3,tzinfo:3,aris:2,logger:3,therefor:3,match:3,merchant:2,applic:0,lookup_ent:3,sourc:3,"return":3,string:3,variou:3,utc:3,python:[0,3],timestamp:3,express:2,kind:2,softwar:2,whether:2,condit:2,veri:[],liabl:2,month:3,charg:2,requir:3,infrequ:3,warranti:2,like:0,specif:3,bla:[],"try":3,provid:[3,2],stuff:[],necessari:0,contain:[0,3],found:3,readthedoc:0,page:0,impli:2,right:2,deal:2,replac:3,some:0,see:0,callsign:[0,3],connect:[3,2],arg:3,download:3,http:[0,3],event:2,librari:[0,3],out:2,even:3,index:0,lookuptyp:3,turkmenistan:3,lookup_prefix:3,databas:3,rep:3,publish:2,lookup_zone_except:3,content:[],delet:3,written:[],version:0,inject:3,action:2,internet:3,print:3,"import":3,irc:0,complic:[],method:3,abov:2,kei:3,differ:3,free:2,dictionari:3,locat:3,come:0,lookup_callsign:3,valu:3,log:3,search:0,fit:2,island:3,cty:3,against:3,datetim:3,person:2,doctest:[],permit:2,fals:3,countri:3,typic:3,dh1tw:[0,1,2],com:[0,3],assign:3,frequent:0,oper:3,apikeymissingerror:3,directli:3,merg:2,modul:[],two:3,restrict:2,filenam:3,api:3,org:[0,3],noresult:[],bool:3,miss:3,damag:2,liabil:2,given:3,from:[3,2],christma:3,wai:[],whom:2,modifi:2,three:3,wrapper:3,avail:3,cqz:3,station:3,interfac:3,includ:2,paramet:3,type:3,more:3,"function":[],amateur:[0,3],option:3,copi:2,keyerror:3,notic:2,is_invalid_oper:3,pytz:3,pars:0,callinfo:3,particular:2,known:3,getter:[],herebi:2,"true":3,countryfil:3,none:3,sell:2,"default":3,access:[],structur:[],exampl:3,aim:3,record:3,contin:3,limit:2,can:3,str:3,webirc:0,otherwis:2,purpos:2,latitud:3,claim:2,substanti:2,creat:0,"int":3,clublogapi:3,year:3,my_lookuplib:3,ani:2,dp0gvn:3,antarctica:3,inform:3,exist:3,contract:2,file:[0,3,2],onlin:3,seem:3,deltaxrai:0,plist:3,incorrect:3,issu:0,mylookuplib:3,author:2,perform:3,apikei:3,detail:3,invalid:3,check:3,note:[],also:3,other:2,lookup:3,which:[0,3],you:0,subject:2,mit:2,lookuplib:[],updat:3,furnish:2,example_gener:[],"5w1cfn":3,germani:3,distribut:2,shall:2,fed:3,dai:3,befor:3,zone:3,rais:3,adif:3,sublicens:2,date:3,associ:2,"class":[0,3],longitud:3,homogen:3,noninfring:2,github:0,faster:0,"__name__":3,grant:2,descript:[],wellnitz:2,without:2,vk9xo:3,hamtest:0,portion:2,contact:[],getlogg:3,thi:[3,2],time:3,format:[],hello:[],daili:3},objtypes:{"0":"py:module","1":"py:method","2":"py:class"},objnames:{"0":["py","module","Python module"],"1":["py","method","Python method"],"2":["py","class","Python class"]},filenames:["index","help","license","LookupLib"],titles:["PyHamTools","help","license","LookupLib"],objects:{pyhamtools:{lookuplib:[3,0,0,"-"]},"pyhamtools.lookuplib":{LookupLib:[3,2,1,""]},"pyhamtools.lookuplib.LookupLib":{lookup_prefix:[3,1,1,""],lookup_entity:[3,1,1,""],lookup_zone_exception:[3,1,1,""],lookup_callsign:[3,1,1,""],is_invalid_operation:[3,1,1,""]}},titleterms:{help:1,anoth:[],licens:2,clase:0,indic:0,content:[],header:[],contact:2,tabl:0,pyhamtool:0,document:[],simpl:[],modul:0,lookuplib:3,welcom:[]}})

View file

@ -1,10 +1,27 @@
license license
======= =======
The MIT License (MIT) The MIT License (MIT)
bla bla bla Copyright (c) 2014 Tobias Wellnitz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Contact: Contact:
======== ========
Contact DH1TW Contact Tobias@dh1tw.de

View file

@ -1 +1,3 @@
from pyhamtools.lookuplib import LookupLib

View file

@ -1,14 +1,6 @@
# !/usr/bin/python # !/usr/bin/python
# Filename: exceptions.py # Filename: exceptions.py
class LookupError(KeyError):
""" Error while accessing the class """
pass
class NoResult(KeyError):
""" No matching result found """
pass
class APIKeyMissingError(AttributeError): class APIKeyMissingError(AttributeError):
""" API Key is Missing """ """ API Key is Missing """
pass pass

View file

@ -15,7 +15,7 @@ import pytz
from consts import LookupConventions as const from consts import LookupConventions as const
from exceptions import LookupError, APIKeyMissingError, NoResult from exceptions import APIKeyMissingError
UTC = pytz.UTC UTC = pytz.UTC
timestamp_now = datetime.utcnow().replace(tzinfo=UTC) timestamp_now = datetime.utcnow().replace(tzinfo=UTC)
@ -24,15 +24,18 @@ timestamp_now = datetime.utcnow().replace(tzinfo=UTC)
class LookupLib(object): class LookupLib(object):
""" """
This class provides a homogeneous interface to three different Amateur Radio Callsign lookup sources: This class is a wrapper for the following three Amateur Radio databases:
1. Clublog.org (daily updated XML File) 1. Clublog.org (daily updated XML File)
2. Clublog.org (HTTPS lookup) 2. Clublog.org (HTTPS lookup)
3. Country-files.com (infrequently updated PLIST File) 3. Country-files.com (infrequently updated PLIST File)
The class provides getters to access the data in a structured way. Even the interface is the same It's aim is to provide a homogeneous interface to different data sources.
for all lookup sources, the returning data can be different. The documentation of the various
methods provide more detail. Typically it is injected as a dependency in the Callinfo class, but 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 By default, LookupLib requires an Internet connection to download the libraries or perform the
lookup against the Clublog API. lookup against the Clublog API.
@ -44,7 +47,7 @@ class LookupLib(object):
logger (logging.getLogger(__name__), optional): Python logger logger (logging.getLogger(__name__), optional): Python logger
""" """
def __init__(self, lookuptype = "clublogxml", apikey=None, filename=None, logger=None): def __init__(self, lookuptype = "countryfile", apikey=None, filename=None, logger=None):
self._logger = None self._logger = None
if logger: if logger:
@ -70,12 +73,10 @@ class LookupLib(object):
self._zone_exceptions = {} self._zone_exceptions = {}
self._lookuptype = lookuptype self._lookuptype = lookuptype
if self._lookuptype == "clublogxml": if self._lookuptype == "clublogxml":
self._load_clublogXML(apikey=self._apikey, cty_file=self._lib_filename) self._load_clublogXML(apikey=self._apikey, cty_file=self._lib_filename)
elif self._lookuptype == "countryfile": elif self._lookuptype == "countryfile":
self._load_countryfile() self._load_countryfile(cty_file=self._lib_filename)
elif self._lookuptype == "clublogapi": elif self._lookuptype == "clublogapi":
pass pass
else: else:
@ -91,7 +92,25 @@ class LookupLib(object):
dict: Dictionary containing the country specific data dict: Dictionary containing the country specific data
Raises: Raises:
NoResult: No matching entity found KeyError: No matching entity found
Example:
The following code queries the the Clublog XML database for the ADIF entity Turkmenistan, which has
the id 273.
>>> from pyhamtools import LookupLib
>>> my_lookuplib = LookupLib(lookuptype="clublogapi", apikey="myapikey")
>>> print my_lookuplib.lookup_entity(273)
{
'deleted': False,
'country': 'TURKMENISTAN',
'longitude': -58.4,
'cqz': 17,
'prefix': 'EZ',
'latitude': 38.0,
'continent': 'AS'
}
Note: Note:
This method is available for the following lookup type This method is available for the following lookup type
@ -100,18 +119,14 @@ class LookupLib(object):
""" """
if entity is None:
raise LookupError
try: try:
entity = int(entity) entity = int(entity)
if entity in self._entities: if entity in self._entities:
return self._entities[entity] return self._entities[entity]
else: else:
raise NoResult raise KeyError
except: except:
raise NoResult raise KeyError
def lookup_callsign(self, callsign=None, timestamp=timestamp_now): def lookup_callsign(self, callsign=None, timestamp=timestamp_now):
""" """
@ -125,9 +140,27 @@ class LookupLib(object):
dict: Dictionary containing the country specific data of the callsign dict: Dictionary containing the country specific data of the callsign
Raises: Raises:
NoResult: No matching callsign found KeyError: No matching callsign found
APIKeyMissingError: API Key for Clublog missing or incorrect APIKeyMissingError: API Key for Clublog missing or incorrect
Example:
The following code queries the the online Clublog API for the callsign "VK9XO" on a specific date.
>>> from pyhamtools import LookupLib
>>> from datetime import datetime
>>> import pytz
>>> my_lookuplib = LookupLib(lookuptype="clublogapi", apikey="myapikey")
>>> timestamp = datetime(year=1962, month=7, day=7, tzinfo=pytz.UTC)
>>> print my_lookuplib.lookup_callsign("VK9XO", timestamp)
{
'country': 'CHRISTMAS ISLAND',
'longitude': -105.7,
'cqz': 29,
'adif': 35,
'latitude': -10.5,
'continent': 'OC'
}
Note: Note:
This method is available for This method is available for
@ -170,7 +203,7 @@ class LookupLib(object):
return self._callsign_exceptions[item] return self._callsign_exceptions[item]
# no matching case # no matching case
raise NoResult raise KeyError
def lookup_prefix(self, prefix, timestamp=timestamp_now): def lookup_prefix(self, prefix, timestamp=timestamp_now):
""" """
@ -184,9 +217,26 @@ class LookupLib(object):
dict: Dictionary containing the country specific data of the Prefix dict: Dictionary containing the country specific data of the Prefix
Raises: Raises:
NoResult: No matching Prefix found KeyError: No matching Prefix found
APIKeyMissingError: API Key for Clublog missing or incorrect APIKeyMissingError: API Key for Clublog missing or incorrect
Example:
The following code shows how to obtain the information for the prefix "DH" from the countryfile.com
database (default database).
>>> from pyhamtools import LookupLib
>>> myLookupLib = LookupLib()
>>> print myLookupLib.lookup_prefix("DH")
{
'adif': 230,
'country': 'Fed. Rep. of Germany',
'longitude': -10.0,
'cqz': 14,
'ituz': 28,
'latitude': 51.0,
'continent': 'EU'
}
Note: Note:
This method is available for This method is available for
@ -221,7 +271,7 @@ class LookupLib(object):
else: else:
return self._prefixes[item] return self._prefixes[item]
raise NoResult raise KeyError
def is_invalid_operation(self, callsign, timestamp=datetime.utcnow().replace(tzinfo=UTC)): def is_invalid_operation(self, callsign, timestamp=datetime.utcnow().replace(tzinfo=UTC)):
""" """
@ -235,9 +285,25 @@ class LookupLib(object):
bool: True if a record exists for this callsign (at the given time) bool: True if a record exists for this callsign (at the given time)
Raises: Raises:
NoResult: No matching callsign found KeyError: No matching callsign found
APIKeyMissingError: API Key for Clublog missing or incorrect APIKeyMissingError: API Key for Clublog missing or incorrect
Example:
The following code checks the Clublog XML database if the operation is valid for two dates.
>>> from pyhamtools import LookupLib
>>> from datetime import datetime
>>> import pytz
>>> my_lookuplib = LookupLib(lookuptype="clublogxml", apikey="myapikey")
>>> print my_lookuplib.is_invalid_operation("5W1CFN")
True
>>> try:
>>> timestamp = datetime(year=2012, month=1, day=31).replace(tzinfo=pytz.UTC)
>>> my_lookuplib.is_invalid_operation("5W1CFN", timestamp)
>>> except KeyError:
>>> print "Seems to be invalid operation before 31.1.2012"
Seems to be an invalid operation before 31.1.2012
Note: Note:
This method is available for This method is available for
@ -275,7 +341,7 @@ class LookupLib(object):
return True return True
#no matching case #no matching case
raise NoResult raise KeyError
def lookup_zone_exception(self, callsign, timestamp=datetime.utcnow().replace(tzinfo=UTC)): def lookup_zone_exception(self, callsign, timestamp=datetime.utcnow().replace(tzinfo=UTC)):
@ -290,9 +356,20 @@ class LookupLib(object):
int: Value of the the CQ Zone exception which exists for this callsign (at the given time) int: Value of the the CQ Zone exception which exists for this callsign (at the given time)
Raises: Raises:
NoResult: No matching callsign found KeyError: No matching callsign found
APIKeyMissingError: API Key for Clublog missing or incorrect APIKeyMissingError: API Key for Clublog missing or incorrect
Example:
The following code checks the Clublog XML database if a CQ Zone exception exists for the callsign DP0GVN.
>>> from pyhamtools import LookupLib
>>> my_lookuplib = LookupLib(lookuptype="clublogxml", apikey="myapikey")
>>> print my_lookuplib.lookup_zone_exception("DP0GVN")
38
The prefix "DP" It is assigned to Germany, but the station is located in Antarctica, and therefore
in CQ Zone 38
Note: Note:
This method is available for This method is available for
@ -328,7 +405,7 @@ class LookupLib(object):
return self._zone_exceptions[item][const.CQZ] return self._zone_exceptions[item][const.CQZ]
#no matching case #no matching case
raise NoResult raise KeyError
def _lookup_clublogAPI(self, callsign=None, timestamp=timestamp_now, url="https://secure.clublog.org/dxcc", apikey=None): def _lookup_clublogAPI(self, callsign=None, timestamp=timestamp_now, url="https://secure.clublog.org/dxcc", apikey=None):
""" Set up the Lookup object for Clublog Online API """ Set up the Lookup object for Clublog Online API
@ -362,7 +439,7 @@ class LookupLib(object):
elif item == "Continent": lookup[const.CONTINENT] = str(jsonLookup["Continent"]) elif item == "Continent": lookup[const.CONTINENT] = str(jsonLookup["Continent"])
if lookup[const.ADIF] == 0: if lookup[const.ADIF] == 0:
raise NoResult raise KeyError
else: else:
return lookup return lookup
@ -407,10 +484,6 @@ class LookupLib(object):
cwdFile = os.path.abspath(os.path.join(os.getcwd(), country_mapping_filename)) cwdFile = os.path.abspath(os.path.join(os.getcwd(), country_mapping_filename))
pkgFile = os.path.abspath(os.path.join(os.path.dirname(__file__), country_mapping_filename)) pkgFile = os.path.abspath(os.path.join(os.path.dirname(__file__), country_mapping_filename))
print cwdFile
print pkgFile
# from cwd # from cwd
if os.path.exists(cwdFile): if os.path.exists(cwdFile):
country_mapping_filename = cwdFile country_mapping_filename = cwdFile
@ -851,8 +924,9 @@ class LookupLib(object):
if response.status_code == requests.codes.ok: if response.status_code == requests.codes.ok:
return True return True
else: else:
self._logger.error("HTTP Repsonse: " + str(response.text)) err_str = "HTTP Status Code: " + str(response.status_code) + " HTTP Response: " + str(response.text)
self._logger.error(err_str)
if response.text.strip() == error1 or response.text.strip() == error2: if response.text.strip() == error1 or response.text.strip() == error2:
raise APIKeyMissingError raise APIKeyMissingError
else: else:
raise LookupError raise LookupError(err_str)

View file

@ -1,6 +1,9 @@
import pytest import pytest
import tempfile import tempfile
import os import os
from apikey import APIKEY
# #
# @pytest.fixture() # @pytest.fixture()
# def cleandir(): # def cleandir():
@ -44,10 +47,10 @@ def fixNone(request):
API_KEY = ""
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def fixApiKey(request): def fixApiKey(request):
return(API_KEY) return(APIKEY)
@pytest.fixture(scope="module", params=["clublogapi", "clublogxml", "countryfile"]) @pytest.fixture(scope="module", params=["clublogapi", "clublogxml", "countryfile"])
def fixGeneralApi(request, fixApiKey): def fixGeneralApi(request, fixApiKey):

View file

@ -11,10 +11,6 @@ def fixAnyValue(request):
class TestlookupLib: class TestlookupLib:
def test_construction_without_kwargs(self):
"""Load with non without any args & kwargs"""
with pytest.raises(APIKeyMissingError):
LookupLib()
def test_construction_with_invalid_kwargs(self, fixAnyValue): def test_construction_with_invalid_kwargs(self, fixAnyValue):
"""Load with non without any args & kwargs""" """Load with non without any args & kwargs"""

View file

@ -3,7 +3,7 @@ from datetime import datetime
from pyhamtools.lookuplib import LookupLib from pyhamtools.lookuplib import LookupLib
from pyhamtools.exceptions import APIKeyMissingError, LookupError, NoResult from pyhamtools.exceptions import APIKeyMissingError
#Fixtures #Fixtures
#=========================================================== #===========================================================
@ -93,27 +93,27 @@ class TestclublogApi_Getters:
assert fixClublogApi.lookup_callsign("DH1TW/MM") == response_Exception_DH1TW_MM assert fixClublogApi.lookup_callsign("DH1TW/MM") == response_Exception_DH1TW_MM
assert fixClublogApi.lookup_callsign("DH1TW/AM") == response_Exception_DH1TW_AM assert fixClublogApi.lookup_callsign("DH1TW/AM") == response_Exception_DH1TW_AM
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogApi.lookup_callsign("QRM") fixClublogApi.lookup_callsign("QRM")
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogApi.lookup_callsign("") fixClublogApi.lookup_callsign("")
#lookup_prefix(prefix, [date]) #lookup_prefix(prefix, [date])
#=============================== #===============================
def test_lookup_callsign(self, fixClublogApi): def test_lookup_callsign(self, fixClublogApi):
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogApi.lookup_prefix("DH") fixClublogApi.lookup_prefix("DH")
#is_invalid_operation(callsign, [date]) #is_invalid_operation(callsign, [date])
#=============================== #===============================
def test_is_invalid_operation(self, fixClublogApi): def test_is_invalid_operation(self, fixClublogApi):
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogApi.is_invalid_operation("5W1CFN") fixClublogApi.is_invalid_operation("5W1CFN")
#lookup_zone_exception(callsign, [date]) #lookup_zone_exception(callsign, [date])
#==================================== #====================================
def test_lookup_zone_exception(self, fixClublogApi): def test_lookup_zone_exception(self, fixClublogApi):
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogApi.lookup_zone_exception("dp0gvn") fixClublogApi.lookup_zone_exception("dp0gvn")

View file

@ -1,9 +1,10 @@
import pytest import pytest
from datetime import datetime from datetime import datetime
import pytz import pytz
import os
from pyhamtools.lookuplib import LookupLib from pyhamtools.lookuplib import LookupLib
from pyhamtools.exceptions import APIKeyMissingError, LookupError, NoResult from pyhamtools.exceptions import APIKeyMissingError
UTC = pytz.UTC UTC = pytz.UTC
@ -117,8 +118,11 @@ response_Prefix_ZD5_1964_to_1971 = {
} }
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def fixCtyXmlFile(request): def fix_cty_xml_file(request):
return "/Users/user/projects/pyhamtools/pyhamtools/cty.xml" dir = os.path.dirname(__file__)
cty_file_rel = "./fixtures/cty.xml"
cty_file_abs = os.path.join(dir, cty_file_rel)
return cty_file_abs
#TESTS #TESTS
@ -128,16 +132,16 @@ class TestClublogXML_Constructor:
def test_with_invalid_api_key(self): def test_with_invalid_api_key(self):
with pytest.raises(APIKeyMissingError): with pytest.raises(APIKeyMissingError):
lib = LookupLib(apikey="foo") lib = LookupLib(lookuptype="clublogxml", apikey="foo")
lib.lookup_entity(230) lib.lookup_entity(230)
def test_with_no_api_key(self): def test_with_no_api_key(self):
with pytest.raises(APIKeyMissingError): with pytest.raises(APIKeyMissingError):
lib = LookupLib() lib = LookupLib(lookuptype="clublogxml")
lib.lookup_entity(230) lib.lookup_entity(230)
def test_with_file(self, fixCtyXmlFile): def test_with_file(self, fix_cty_xml_file):
lib = LookupLib(filename=fixCtyXmlFile) lib = LookupLib(lookuptype="clublogxml", filename=fix_cty_xml_file)
assert lib.lookup_entity(230) == response_Entity_230 assert lib.lookup_entity(230) == response_Entity_230
class TestclublogXML_Getters: class TestclublogXML_Getters:
@ -149,13 +153,13 @@ class TestclublogXML_Getters:
assert fixClublogXML.lookup_entity(230) == response_Entity_230 assert fixClublogXML.lookup_entity(230) == response_Entity_230
assert fixClublogXML.lookup_entity("230") == response_Entity_230 assert fixClublogXML.lookup_entity("230") == response_Entity_230
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_entity("foo") fixClublogXML.lookup_entity("foo")
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_entity(1000) fixClublogXML.lookup_entity(1000)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_entity(999) fixClublogXML.lookup_entity(999)
@ -177,7 +181,7 @@ class TestclublogXML_Getters:
#timestamp < startdate #timestamp < startdate
timestamp = datetime(year=1962, month=7, day=5, tzinfo=UTC) timestamp = datetime(year=1962, month=7, day=5, tzinfo=UTC)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_callsign("vk9xo", timestamp) fixClublogXML.lookup_callsign("vk9xo", timestamp)
def test_lookup_callsign_exception_only_with_end_date(self, fixClublogXML): def test_lookup_callsign_exception_only_with_end_date(self, fixClublogXML):
@ -187,11 +191,11 @@ class TestclublogXML_Getters:
assert fixClublogXML.lookup_callsign("vk9xx", timestamp) == response_Exception_VK9XX_with_end_date assert fixClublogXML.lookup_callsign("vk9xx", timestamp) == response_Exception_VK9XX_with_end_date
# timestamp > enddate # timestamp > enddate
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_callsign("vk9xx") fixClublogXML.lookup_callsign("vk9xx")
timestamp = datetime(year=1975, month=9, day=16, tzinfo=UTC) timestamp = datetime(year=1975, month=9, day=16, tzinfo=UTC)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_callsign("vk9xx", timestamp) fixClublogXML.lookup_callsign("vk9xx", timestamp)
def test_lookup_callsign_exception_no_start_nor_end_date(self, fixClublogXML): def test_lookup_callsign_exception_no_start_nor_end_date(self, fixClublogXML):
@ -208,10 +212,10 @@ class TestclublogXML_Getters:
def test_lookup_prefix(self, fixClublogXML): def test_lookup_prefix(self, fixClublogXML):
assert fixClublogXML.lookup_prefix("DH") == response_Prefix_DH assert fixClublogXML.lookup_prefix("DH") == response_Prefix_DH
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_prefix("QRM") fixClublogXML.lookup_prefix("QRM")
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_prefix("") fixClublogXML.lookup_prefix("")
@ -223,7 +227,7 @@ class TestclublogXML_Getters:
#return empty dict - Prefix was not assigned at that time #return empty dict - Prefix was not assigned at that time
timestamp = datetime(year=1975, month=9, day=16).replace(tzinfo=UTC) timestamp = datetime(year=1975, month=9, day=16).replace(tzinfo=UTC)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_prefix("VK9", timestamp) fixClublogXML.lookup_prefix("VK9", timestamp)
#return new entity (Norfolk Island) #return new entity (Norfolk Island)
@ -233,14 +237,14 @@ class TestclublogXML_Getters:
def test_lookup_prefix_with_entities_having_start_and_stop(self, fixClublogXML): def test_lookup_prefix_with_entities_having_start_and_stop(self, fixClublogXML):
timestamp_before = datetime(year=1964, month=11, day=1).replace(tzinfo=UTC) timestamp_before = datetime(year=1964, month=11, day=1).replace(tzinfo=UTC)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_prefix("ZD5", timestamp_before) fixClublogXML.lookup_prefix("ZD5", timestamp_before)
timestamp_valid = datetime(year=1964, month=12, day=2).replace(tzinfo=UTC) timestamp_valid = datetime(year=1964, month=12, day=2).replace(tzinfo=UTC)
assert fixClublogXML.lookup_prefix("ZD5", timestamp_valid) == response_Prefix_ZD5_1964_to_1971 assert fixClublogXML.lookup_prefix("ZD5", timestamp_valid) == response_Prefix_ZD5_1964_to_1971
timestamp_after = datetime(year=1971, month=8, day=1).replace(tzinfo=UTC) timestamp_after = datetime(year=1971, month=8, day=1).replace(tzinfo=UTC)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_prefix("ZD5", timestamp_after) fixClublogXML.lookup_prefix("ZD5", timestamp_after)
@ -251,30 +255,30 @@ class TestclublogXML_Getters:
def test_is_invalid_operations(self, fixClublogXML): def test_is_invalid_operations(self, fixClublogXML):
#No dataset --> default Operation is True #No dataset --> default Operation is True
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.is_invalid_operation("dh1tw") fixClublogXML.is_invalid_operation("dh1tw")
#Invalid Operation with start and end date #Invalid Operation with start and end date
timestamp_before = datetime(year=1993, month=12, day=30).replace(tzinfo=UTC) timestamp_before = datetime(year=1993, month=12, day=30).replace(tzinfo=UTC)
timestamp = datetime(year=1994, month=12, day=30).replace(tzinfo=UTC) timestamp = datetime(year=1994, month=12, day=30).replace(tzinfo=UTC)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.is_invalid_operation("vk0mc") fixClublogXML.is_invalid_operation("vk0mc")
assert fixClublogXML.is_invalid_operation("vk0mc", timestamp) assert fixClublogXML.is_invalid_operation("vk0mc", timestamp)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.is_invalid_operation("vk0mc", timestamp_before) fixClublogXML.is_invalid_operation("vk0mc", timestamp_before)
#Invalid Operation with start date #Invalid Operation with start date
timestamp_before = datetime(year=2012, month=1, day=31).replace(tzinfo=UTC) timestamp_before = datetime(year=2012, month=1, day=31).replace(tzinfo=UTC)
assert fixClublogXML.is_invalid_operation("5W1CFN") assert fixClublogXML.is_invalid_operation("5W1CFN")
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.is_invalid_operation("5W1CFN", timestamp_before) fixClublogXML.is_invalid_operation("5W1CFN", timestamp_before)
#Invalid Operation with end date #Invalid Operation with end date
timestamp_before = datetime(year=2004, month=04, day=02).replace(tzinfo=UTC) timestamp_before = datetime(year=2004, month=04, day=02).replace(tzinfo=UTC)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.is_invalid_operation("T33C") fixClublogXML.is_invalid_operation("T33C")
assert fixClublogXML.is_invalid_operation("T33C", timestamp_before) assert fixClublogXML.is_invalid_operation("T33C", timestamp_before)
@ -287,7 +291,7 @@ class TestclublogXML_Getters:
def test_lookup_zone_exception(self, fixClublogXML): def test_lookup_zone_exception(self, fixClublogXML):
#No dataset --> default answer: None #No dataset --> default answer: None
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_zone_exception("dh1tw") fixClublogXML.lookup_zone_exception("dh1tw")
#zone exception with no date #zone exception with no date
@ -299,15 +303,15 @@ class TestclublogXML_Getters:
timestamp_after = datetime(year=1993, month=03, day=1).replace(tzinfo=UTC) timestamp_after = datetime(year=1993, month=03, day=1).replace(tzinfo=UTC)
assert fixClublogXML.lookup_zone_exception("dl1kvc/p", timestamp) == 38 assert fixClublogXML.lookup_zone_exception("dl1kvc/p", timestamp) == 38
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_zone_exception("dl1kvc/p", timestamp_before) fixClublogXML.lookup_zone_exception("dl1kvc/p", timestamp_before)
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_zone_exception("dl1kvc/p", timestamp_after) fixClublogXML.lookup_zone_exception("dl1kvc/p", timestamp_after)
#zone exception with start date #zone exception with start date
timestamp_before = datetime(year=2013, month=12, day=26).replace(tzinfo=UTC) timestamp_before = datetime(year=2013, month=12, day=26).replace(tzinfo=UTC)
assert fixClublogXML.lookup_zone_exception("dh1hb/p") assert fixClublogXML.lookup_zone_exception("dh1hb/p")
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixClublogXML.lookup_zone_exception("dh1hb/p", timestamp_before) fixClublogXML.lookup_zone_exception("dh1hb/p", timestamp_before)

View file

@ -1,8 +1,9 @@
import pytest import pytest
import os
from datetime import datetime from datetime import datetime
from pyhamtools.lookuplib import LookupLib from pyhamtools.lookuplib import LookupLib
from pyhamtools.exceptions import APIKeyMissingError, NoResult, LookupError from pyhamtools.exceptions import APIKeyMissingError
#Fixtures #Fixtures
#=========================================================== #===========================================================
@ -29,8 +30,11 @@ response_Exception_3D2RI = {
} }
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def fixPlistFile(request): def fix_plist_file(request):
return "/Users/user/projects/pyhamtools/pyhamtools/cty.plist" dir = os.path.dirname(__file__)
cty_file_rel = "./fixtures/cty.plist"
cty_file_abs = os.path.join(dir, cty_file_rel)
return cty_file_abs
#TESTS #TESTS
@ -39,25 +43,22 @@ def fixPlistFile(request):
#@pytest.mark.skipif(True, reason="slow test") #@pytest.mark.skipif(True, reason="slow test")
class Test_Countryfile_Constructor: class Test_Countryfile_Constructor:
def test_object_construction_with_invalid_files(self): def test_constructor_with_file_instead_of_downlad(self, fix_plist_file):
with pytest.raises(AttributeError): lib = LookupLib("countryfile", filename=fix_plist_file)
LookupLib("countryfile", download=False) assert lib.lookup_callsign("3D2RI") == response_Exception_3D2RI
with pytest.raises(AttributeError):
LookupLib("countryfile", filename="", download=False)
with pytest.raises(AttributeError):
LookupLib("countryfile", filename="foo bar", download=False)
def test_constructor_with_invalid_file(self):
with pytest.raises(IOError):
lib = LookupLib("countryfile", filename="foo bar")
lib.lookup_callsign("GB0BVL")
class Test_countryfile_Getter_Setter: class Test_countryfile_Getter_Setter:
#lookup_entity(adif) #lookup_entity(adif)
#=============================== #===============================
def test_getException(self, fixCountryFile): def test_getException(self, fixCountryFile):
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixCountryFile.lookup_entity(230) fixCountryFile.lookup_entity(230)
@ -66,10 +67,10 @@ class Test_countryfile_Getter_Setter:
def test_getException(self, fixCountryFile): def test_getException(self, fixCountryFile):
assert fixCountryFile.lookup_callsign("3D2RI") == response_Exception_3D2RI assert fixCountryFile.lookup_callsign("3D2RI") == response_Exception_3D2RI
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixCountryFile.lookup_callsign("QRM") fixCountryFile.lookup_callsign("QRM")
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixCountryFile.lookup_callsign("") fixCountryFile.lookup_callsign("")
@ -78,20 +79,20 @@ class Test_countryfile_Getter_Setter:
def test_lookup_prefix(self, fixCountryFile): def test_lookup_prefix(self, fixCountryFile):
assert fixCountryFile.lookup_prefix("DH") == response_Prefix_DH assert fixCountryFile.lookup_prefix("DH") == response_Prefix_DH
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixCountryFile.lookup_prefix("QRM") fixCountryFile.lookup_prefix("QRM")
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixCountryFile.lookup_prefix("") fixCountryFile.lookup_prefix("")
#is_invalid_operation(callsign, [date]) #is_invalid_operation(callsign, [date])
#=============================== #===============================
def test_is_invalid_operation(self, fixCountryFile): def test_is_invalid_operation(self, fixCountryFile):
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixCountryFile.is_invalid_operation("5W1CFN") fixCountryFile.is_invalid_operation("5W1CFN")
#lookup_zone_exception(callsign, [date]) #lookup_zone_exception(callsign, [date])
#==================================== #====================================
def test_lookup_zone_exception(self, fixCountryFile): def test_lookup_zone_exception(self, fixCountryFile):
with pytest.raises(NoResult): with pytest.raises(KeyError):
fixCountryFile.lookup_zone_exception("dp0gvn") fixCountryFile.lookup_zone_exception("dp0gvn")

View file

@ -4,8 +4,6 @@ import os
from datetime import datetime from datetime import datetime
from pyhamtools.exceptions import NoResult
#Fixtures #Fixtures
#=========================================================== #===========================================================
@ -91,7 +89,7 @@ class Test_Getter_Setter_Api_Types_for_all_sources:
assert type(entity[attr] is datetime) assert type(entity[attr] is datetime)
count +=1 count +=1
assert len(entity) == count assert len(entity) == count
except NoResult: except KeyError:
pass pass
def test_lookup_callsign(self, fixGeneralApi, fixExceptions): def test_lookup_callsign(self, fixGeneralApi, fixExceptions):
@ -130,7 +128,7 @@ class Test_Getter_Setter_Api_Types_for_all_sources:
#all attributes checked? #all attributes checked?
assert len(ex) == count assert len(ex) == count
except NoResult: except KeyError:
pass pass
except AttributeError: except AttributeError:
pass pass
@ -172,7 +170,7 @@ class Test_Getter_Setter_Api_Types_for_all_sources:
#all attributes checked? #all attributes checked?
assert len(prefix) == count assert len(prefix) == count
except NoResult: except KeyError:
pass pass
except AttributeError: except AttributeError:
pass pass
@ -182,7 +180,7 @@ class Test_Getter_Setter_Api_Types_for_all_sources:
try: try:
invOp = fixGeneralApi.is_invalid_operation(fixInvalidOperations) invOp = fixGeneralApi.is_invalid_operation(fixInvalidOperations)
assert type(invOp) is bool assert type(invOp) is bool
except NoResult: except KeyError:
pass pass
except AttributeError: except AttributeError:
pass pass
@ -191,7 +189,7 @@ class Test_Getter_Setter_Api_Types_for_all_sources:
try: try:
zEx = fixGeneralApi.lookup_zone_exception(fixZoneExceptions) zEx = fixGeneralApi.lookup_zone_exception(fixZoneExceptions)
assert type(zEx) is int assert type(zEx) is int
except NoResult: except KeyError:
pass pass
except AttributeError: except AttributeError:
pass pass
@ -201,7 +199,7 @@ class Test_Getter_Setter_Api_Types_for_all_sources:
response = fixGeneralApi.setException(fixSetExceptions) response = fixGeneralApi.setException(fixSetExceptions)
assert type(response) is bool assert type(response) is bool
assert fixGeneralApi.lookup_callsign(fixSetExceptions.keys()[0]) == fixSetExceptions[fixSetExceptions.keys()[0]] assert fixGeneralApi.lookup_callsign(fixSetExceptions.keys()[0]) == fixSetExceptions[fixSetExceptions.keys()[0]]
except NoResult: except KeyError:
pass pass
except AttributeError: except AttributeError:
pass pass