]> git.scottworley.com Git - pinch/commitdiff
Use SimpleNamespace for typed records
authorScott Worley <scottworley@scottworley.com>
Wed, 8 Apr 2020 23:40:24 +0000 (16:40 -0700)
committerScott Worley <scottworley@scottworley.com>
Wed, 8 Apr 2020 23:40:24 +0000 (16:40 -0700)
pinch.py
test.sh

index f974d1c0adc3982dbc08e469ed0eed4c4f1b682b..cdc0ba8c64fbac003e623badbd49f471cf675816 100644 (file)
--- a/pinch.py
+++ b/pinch.py
@@ -6,12 +6,12 @@ import os
 import os.path
 import shutil
 import tempfile
+import types
 import urllib.parse
 import urllib.request
 import xml.dom.minidom
 
 from typing import (
-    Any,
     Dict,
     Iterable,
     List,
@@ -20,6 +20,22 @@ from typing import (
 )
 
 
+class InfoTableEntry(types.SimpleNamespace):
+    content: bytes
+    digest: str
+    file: str
+    size: int
+    url: str
+
+
+class Info(types.SimpleNamespace):
+    channel_html: bytes
+    forwarded_url: str
+    git_revision: str
+    table: Dict[str, InfoTableEntry]
+    url: str
+
+
 class VerificationError(Exception):
     pass
 
@@ -86,74 +102,75 @@ def compare(a: str,
     return filecmp.cmpfiles(a, b, files, shallow=False)
 
 
-def fetch(v: Verification, channel_url: str) -> Dict[str, Any]:
-    info: Dict[str, Any] = {'url': channel_url}
+def fetch(v: Verification, channel_url: str) -> Info:
+    info = Info()
+    info.url = channel_url
     v.status('Fetching channel')
     request = urllib.request.urlopen(
         'https://channels.nixos.org/nixos-20.03', timeout=10)
-    info['channel_html'] = request.read()
-    info['forwarded_url'] = request.geturl()
+    info.channel_html = request.read()
+    info.forwarded_url = request.geturl()
     v.result(request.status == 200)
-    v.check('Got forwarded', info['url'] != info['forwarded_url'])
+    v.check('Got forwarded', info.url != info.forwarded_url)
     return info
 
 
-def parse(v: Verification, info: Dict[str, Any]) -> None:
+def parse(v: Verification, info: Info) -> None:
     v.status('Parsing channel description as XML')
-    d = xml.dom.minidom.parseString(info['channel_html'])
+    d = xml.dom.minidom.parseString(info.channel_html)
     v.ok()
 
     v.status('Extracting git commit')
     git_commit_node = d.getElementsByTagName('tt')[0]
-    info['git_commit'] = git_commit_node.firstChild.nodeValue
+    info.git_commit = git_commit_node.firstChild.nodeValue
     v.ok()
     v.status('Verifying git commit label')
     v.result(git_commit_node.previousSibling.nodeValue == 'Git commit ')
 
     v.status('Parsing table')
-    info['table'] = {}
+    info.table = {}
     for row in d.getElementsByTagName('tr')[1:]:
         name = row.childNodes[0].firstChild.firstChild.nodeValue
         url = row.childNodes[0].firstChild.getAttribute('href')
         size = int(row.childNodes[1].firstChild.nodeValue)
         digest = row.childNodes[2].firstChild.firstChild.nodeValue
-        info['table'][name] = {'url': url, 'digest': digest, 'size': size}
+        info.table[name] = InfoTableEntry(url=url, digest=digest, size=size)
     v.ok()
 
 
-def fetch_resources(v: Verification, info: Dict[str, Any]) -> None:
+def fetch_resources(v: Verification, info: Info) -> None:
 
     for resource in ['git-revision', 'nixexprs.tar.xz']:
-        fields = info['table'][resource]
+        fields = info.table[resource]
         v.status('Fetching resource "%s"' % resource)
-        url = urllib.parse.urljoin(info['forwarded_url'], fields['url'])
+        url = urllib.parse.urljoin(info.forwarded_url, fields.url)
         request = urllib.request.urlopen(url, timeout=10)
-        if fields['size'] < 4096:
-            fields['content'] = request.read()
+        if fields.size < 4096:
+            fields.content = request.read()
         else:
             with tempfile.NamedTemporaryFile(suffix='.nixexprs.tar.xz', delete=False) as tmp_file:
                 shutil.copyfileobj(request, tmp_file)
-                fields['file'] = tmp_file.name
+                fields.file = tmp_file.name
         v.result(request.status == 200)
         v.status('Verifying digest for "%s"' % resource)
-        if fields['size'] < 4096:
-            actual_hash = hashlib.sha256(fields['content']).hexdigest()
+        if fields.size < 4096:
+            actual_hash = hashlib.sha256(fields.content).hexdigest()
         else:
             hasher = hashlib.sha256()
-            with open(fields['file'], 'rb') as f:
+            with open(fields.file, 'rb') as f:
                 # pylint: disable=cell-var-from-loop
                 for block in iter(lambda: f.read(4096), b''):
                     hasher.update(block)
             actual_hash = hasher.hexdigest()
-        v.result(actual_hash == fields['digest'])
+        v.result(actual_hash == fields.digest)
     v.check('Verifying git commit on main page matches git commit in table',
-            info['table']['git-revision']['content'].decode() == info['git_commit'])
+            info.table['git-revision'].content.decode() == info.git_commit)
 
 
-def extract_channel(v: Verification, info: Dict[str, Any]) -> None:
+def extract_channel(v: Verification, info: Info) -> None:
     with tempfile.TemporaryDirectory() as d:
         v.status('Extracting nixexprs.tar.xz')
-        shutil.unpack_archive(info['table']['nixexprs.tar.xz']['file'], d)
+        shutil.unpack_archive(info.table['nixexprs.tar.xz'].file, d)
         v.ok()
         v.status('Removing temporary directory')
     v.ok()
diff --git a/test.sh b/test.sh
index cea63ba4ef47cf7c65dde3e09049ffde20638aa5..779a65b7c91e67940221a58a2a93a60dc8c4cecf 100755 (executable)
--- a/test.sh
+++ b/test.sh
@@ -8,7 +8,7 @@ find . -name '*.py' -print0 | xargs -0 mypy --strict --ignore-missing-imports
 
 find . -name '*_test.py' -print0 | xargs -0 -r -n1 python3
 
-find . -name '*.py' -print0 | xargs -0 pylint --reports=n --persistent=n --ignore-imports=y -d invalid-name,missing-docstring
+find . -name '*.py' -print0 | xargs -0 pylint --reports=n --persistent=n --ignore-imports=y -d invalid-name,missing-docstring,too-few-public-methods
 
 formatting_needs_fixing=$(
   find . -name '*.py' -print0 |