<div dir="ltr">Personally I&#39;d prefer to see this as a few separate patches. Especaially one that separates out the PEP8 stuff from the other problems.</div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Mar 31, 2018 at 11:44 AM, Matěj Cepl <span dir="ltr">&lt;<a href="mailto:mcepl@cepl.eu" target="_blank">mcepl@cepl.eu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">That means:<br>
    * Make it PEP8 compliant<br>
    * That unfortunately includes &#39;\t&#39; -&gt; &#39;    &#39; change (PEP8 doesn’t<br>
      like TABs), which makes for the massive diff.<br>
    * Don’t use deprecated API calls.<br>
        Use Sword.VersificationMgr.<wbr>getSystemVersificationMgr() instead<br>
            of Sword.VerseMgr.<wbr>getSystemVerseMgr().<br>
        Use popError() instead of Error().<br>
    * Switch to logging to make it a little bit more civilized.<br>
    * Don’t use RE when you don’t need it.<br>
    * Shorten the labels so they are not overflowing the screen.<br>
    * Don’t fool with PyQuery and use standard XML libraries.<br>
    * Use argparser.<br>
---<br>
 versification/av11n.py | 213 ++++++++++++++++++++++++++++--<wbr>-------------------<br>
 1 file changed, 124 insertions(+), 89 deletions(-)<br>
<br>
diff --git a/versification/av11n.py b/versification/av11n.py<br>
index 136a382..5386b8e 100755<br>
--- a/versification/av11n.py<br>
+++ b/versification/av11n.py<br>
@@ -1,4 +1,5 @@<br>
 #!/usr/bin/env python<br>
+# coding: utf-8<br>
 #<br>
 # This does a very roughshod attempt to compare the osisIDs found in an<br>
 # XML file with each of the versifications that SWORD knows about to help<br>
@@ -7,106 +8,140 @@<br>
 # in the proper order, although within each testament, it requires nothing<br>
 # special as for ordering.<br>
 #<br>
-# Invoke simply by calling the program and the file name.  If you want<br>
-# more output, change the following line to be True instead of False<br>
-verbose = False<br>
-debug = True<br>
-import sys<br>
+# Invoke simply by calling the program and the file name.<br>
+from __future__ import print_function<br>
+import argparse<br>
+import io<br>
+import logging<br>
 import re<br>
-verseid = re.compile(&#39;^.+\..+\..+$&#39;)<br>
+import sys<br>
+<br>
+# in normal state level should be debug.WARNING, debug.INFO and debug.DEBUG<br>
+# give additional information.<br>
+logging.basicConfig(format=&#39;%<wbr>(levelname)s:%(message)s&#39;,<br>
+                    level=logging.INFO)<br>
+log = logging.getLogger(&#39;<wbr>versification&#39;)<br>
+<br>
+try:<br>
+    import lxml.etree as ET<br>
+except ImportError:<br>
+    import xml.etree.ElementTree as ET<br>
+<br>
+OSIS_NS = &#39;<a href="http://www.bibletechnologies.net/2003/OSIS/namespace" rel="noreferrer" target="_blank">http://www.bibletechnologies.<wbr>net/2003/OSIS/namespace</a>&#39;<br>
+VERSEID_RE = re.compile(r&#39;^(.+\.\d+\.\d+).*<wbr>$&#39;)<br>
<br>
 # Inform the user that we need the SWORD extension<br>
 try:<br>
-       import Sword<br>
-except:<br>
-       print &quot;You do not have the SWORD library installed. Please install it.&quot;<br>
-       sys.exit(1)<br>
+    import Sword<br>
+except ImportError:<br>
+    log.exception(<br>
+        &quot;You do not have the SWORD library installed. Please install it.&quot;)<br>
+    sys.exit(1)<br>
<br>
-# Inform the user that we need pyquery, as it makes parsing XML files that much easier<br>
-try:<br>
-       from pyquery import PyQuery as pq<br>
-except:<br>
-       print &quot;You do not appear to have PyQuery installed. Please install it.&quot;<br>
-       sys.exit(2)<br>
+arg_parser = argparse.ArgumentParser(<br>
+    description=&#39;Compare OSIS file with available v11ns.&#39;)<br>
<br>
-# Without the name of a file, we cannot proceed any further<br>
-if len(sys.argv) &lt; 2 or sys.argv[1] == &#39;--help&#39;:<br>
-       print &quot;Usage: %s &lt;OSISfile&gt;&quot; % (sys.argv[0],)<br>
+arg_parser.add_argument(&#39;--<wbr>verbose&#39;, &#39;-v&#39;, action=&#39;count&#39;)<br>
+arg_parser.add_argument(&#39;<wbr>filename&#39;, nargs=1)<br>
+<br>
+<br>
+args = arg_parser.parse_args()<br>
+<br>
+if args.verbose:<br>
+    log.setLevel = logging.DEBUG<br>
+<br>
+log.debug(&#39;args = %s&#39;, args)<br>
<br>
 # Open the file<br>
-if debug:<br>
-       print &#39;Opening %s&#39; % (sys.argv[1],)<br>
-d = pq(filename=sys.argv[1])<br>
+log.debug(&#39;Opening %s&#39;, args.filename[0])<br>
+<br>
+tree = ET.parse(io.open(args.<wbr>filename[0], encoding=&#39;utf8&#39;)).getroot()<br>
 # Get the list of versifications<br>
-if debug:<br>
-       print &#39;Fetching a list of versifications&#39;<br>
-vmgr = Sword.VerseMgr.<wbr>getSystemVerseMgr()<br>
+log.debug(&#39;Fetching a list of v11ns&#39;)<br>
+vmgr = Sword.VersificationMgr.<wbr>getSystemVersificationMgr()<br>
 av11ns = vmgr.getVersificationSystems()<br>
+log.debug(&#39;av11ns = %s&#39;, av11ns)<br>
<br>
 # Get the list of all osisIDs<br>
-if debug:<br>
-       print &#39;Fetching a list of OSIS IDs&#39;<br>
-ids = d(&quot;*[osisID]&quot;)<br>
+log.debug(&#39;Fetching a list of OSIS IDs&#39;)<br>
+ids = set()<br>
+for item in tree.iter(&#39;{%s}verse&#39; % OSIS_NS):<br>
+    if &#39;osisID&#39; in item.attrib:<br>
+        ids.add(item.attrib[&#39;osisID&#39;].<wbr>split(&#39;!&#39;)[0])<br>
+log.debug(&#39;ids = len(%d)&#39;, len(ids))<br>
+<br>
 # Iterate each versification scheme<br>
 for v11n in av11ns:<br>
-       print &#39;Checking %s&#39; % (v11n.c_str(),)<br>
-       # Construct a list of the IDs in this versification<br>
-       key = Sword.VerseKey()<br>
-       key.setVersificationSystem(<wbr>v11n.c_str())<br>
-       otkeyList = [] # Anything left in this afterwards is missing from the OSIS ot<br>
-       ntkeyList = [] # Anything left in this afterwards is missing from the OSIS nt<br>
-       otextraKeys = [] # Anything that gets placed in here is extraneous OT material (we think)<br>
-       ntextraKeys = [] # Anything that gets placed in here is extraneous NT material (we think)<br>
-<br>
-       inNT = False<br>
-       while key.Error() == &#39;\x00&#39;:<br>
-               skey = key.getOSISRef()<br>
-               if not inNT and re.match(&#39;^Matt&#39;, skey): # Assume we enter the NT when we hit Matthew<br>
-                       inNT = True<br>
-               if inNT:<br>
-                       ntkeyList.append(skey)<br>
-               else:<br>
-                       otkeyList.append(skey)<br>
-               key.increment()<br>
-       ntkeyList = set(ntkeyList) # The &#39;in&#39; operator only works on a set<br>
-       otkeyList = set(otkeyList)<br>
-<br>
-       inNT = False<br>
-       # Now iterate the ones we have in this file<br>
-       for e in ids:<br>
-               osisid = e.attrib.get(&#39;osisID&#39;)<br>
-               #print &#39;Checking key %s&#39; % (osisid,)<br>
-               if osisid in otkeyList:<br>
-                       otkeyList.remove(osisid)<br>
-               elif osisid in ntkeyList:<br>
-                       ntkeyList.remove(osisid)<br>
-                       inNT = True<br>
-               elif verseid.match(osisid) and inNT:<br>
-                       ntextraKeys.append(osisid)<br>
-               elif verseid.match(osisid) and not inNT:<br>
-                       otextraKeys.append(osisid)<br>
-               # Ignore it if not verseid.match()<br>
-<br>
-       # Now let&#39;s see what is left over<br>
-       keyList = list(otkeyList.union(<wbr>ntkeyList)) # Sets in Python cannot be ordered<br>
-       keyList.sort()<br>
-       if len(keyList) &gt; 0:<br>
-               if verbose:<br>
-                       print &#39;\tThe following IDs do not appear in your file:&#39;<br>
-                       for k in keyList:<br>
-                               print k<br>
-               else:<br>
-                       print &#39;\tThere are %d OT IDs and %d NT IDs in the versification which are not in your file.&#39; % (len(otkeyList), len(ntkeyList))<br>
-       else:<br>
-               print &#39;\tYour file has all the references in this versification&#39;<br>
-<br>
-       # Now let&#39;s see if you had extra<br>
-       if len(otextraKeys + ntextraKeys) &gt; 0:<br>
-               if verbose:<br>
-                       print &#39;\tThe following IDs do not appear in the versification:&#39;<br>
-                       for k in ntextraKeys + otextraKeys:<br>
-                               print k<br>
-               else:<br>
-                       print &#39;\tThere are %d OT IDs and %d NT IDs in your file which do not appear in the versification.&#39; % (len(otextraKeys), len(ntextraKeys))<br>
-       else:<br>
-               print &#39;\tYour file has no extra references&#39;<br>
+    v11n_name = v11n.c_str()<br>
+    print(&#39;\nChecking %s:\n%s&#39; %<br>
+          (v11n_name, (len(v11n_name) + 10) * &#39;-&#39;))<br>
+    # Construct a list of the IDs in this versification<br>
+    key = Sword.VerseKey()<br>
+    key.setVersificationSystem(<wbr>v11n.c_str())<br>
+    # Anything left in this afterwards is missing from the OSIS ot<br>
+    otkeyList = []<br>
+    # Anything left in this afterwards is missing from the OSIS nt<br>
+    ntkeyList = []<br>
+    # Anything that gets placed in here is extraneous OT material (we think)<br>
+    otextraKeys = []<br>
+    # Anything that gets placed in here is extraneous NT material (we think)<br>
+    ntextraKeys = []<br>
+<br>
+    inNT = False<br>
+    while key.popError() == &#39;\x00&#39;:<br>
+        skey = key.getOSISRef()<br>
+        # Assume we enter the NT when we hit Matthew<br>
+        if not inNT and skey.startswith(&#39;Matt&#39;):<br>
+            inNT = True<br>
+        if inNT:<br>
+            ntkeyList.append(skey)<br>
+        else:<br>
+            otkeyList.append(skey)<br>
+        key.increment()<br>
+    ntkeyList = set(ntkeyList)  # The &#39;in&#39; operator only works on a set<br>
+    otkeyList = set(otkeyList)<br>
+<br>
+    inNT = False<br>
+    # Now iterate the ones we have in this file<br>
+    for osisid in ids:<br>
+#        log.debug(&#39;Checking key %s&#39;, osisid)<br>
+        if osisid in otkeyList:<br>
+            otkeyList.remove(osisid)<br>
+        elif osisid in ntkeyList:<br>
+            ntkeyList.remove(osisid)<br>
+            inNT = True<br>
+        else:<br>
+            verse_match = VERSEID_RE.match(osisid)<br>
+            if verse_match and inNT:<br>
+                ntextraKeys.append(verse_<wbr>match.group(1))<br>
+            elif verse_match and not inNT:<br>
+                otextraKeys.append(verse_<wbr>match.group(1))<br>
+            # Ignore it if not VERSEID_RE.match()<br>
+<br>
+    # Now let&#39;s see what is left over<br>
+    # Sets in Python cannot be ordered<br>
+    keyList = list(otkeyList.union(<wbr>ntkeyList))<br>
+    keyList.sort()<br>
+    if len(keyList) &gt; 0:<br>
+        if len(keyList) &lt; 100:<br>
+            <a href="http://log.info" rel="noreferrer" target="_blank">log.info</a>(&#39;\tThe following IDs don’t appear in your file:\n%s&#39;,<br>
+                     str(&quot;, &quot;.join(keyList)))<br>
+        print((&#39;\tThere are %d OT IDs and %d NT IDs &#39; +<br>
+               &#39;in v11n which aren’t in your file.&#39;) \<br>
+              % (len(otkeyList), len(ntkeyList)))<br>
+    else:<br>
+        print(&#39;\tYour file has all the references in this v11n&#39;)<br>
+<br>
+    # Now let&#39;s see if you had extra<br>
+    if len(otextraKeys + ntextraKeys) &gt; 0:<br>
+        # It doesn&#39;t make sense to print out lists longer than 100<br>
+        # they cannot be read anyway<br>
+        if len(keyList) &lt; 100:<br>
+            <a href="http://log.info" rel="noreferrer" target="_blank">log.info</a>(<br>
+                &#39;\tThe following IDs don’t appear in v11n:\n%s&#39;,<br>
+                str(&quot;, &quot;.join(keyList)))<br>
+        print(&#39;\tThere are %d OT IDs and %d NT IDs &#39; +<br>
+              &#39;in your file which don’t appear in v11n.&#39;) \<br>
+              % (len(otextraKeys), len(ntextraKeys))<br>
+    else:<br>
+        print(&#39;\tYour file has no extra references&#39;)<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.16.2<br>
<br>
<br>
______________________________<wbr>_________________<br>
sword-devel mailing list: <a href="mailto:sword-devel@crosswire.org">sword-devel@crosswire.org</a><br>
<a href="http://www.crosswire.org/mailman/listinfo/sword-devel" rel="noreferrer" target="_blank">http://www.crosswire.org/<wbr>mailman/listinfo/sword-devel</a><br>
Instructions to unsubscribe/change your settings at above page</font></span></blockquote></div><br></div>