]> git.scottworley.com Git - paperdoorknob/commitdiff
Bundle the things needed for a run together into a Spec
authorScott Worley <scottworley@scottworley.com>
Wed, 20 Dec 2023 01:29:14 +0000 (17:29 -0800)
committerScott Worley <scottworley@scottworley.com>
Wed, 20 Dec 2023 04:11:55 +0000 (20:11 -0800)
args.py [new file with mode: 0644]
paperdoorknob.py
paperdoorknob_test.py
setup.py
spec.py [new file with mode: 0644]

diff --git a/args.py b/args.py
new file mode 100644 (file)
index 0000000..2a03836
--- /dev/null
+++ b/args.py
@@ -0,0 +1,47 @@
+# paperdoorknob: Print glowfic
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, version 3.
+
+
+from argparse import ArgumentParser
+from contextlib import contextmanager
+import os.path
+
+from typing import Iterator
+
+from xdg_base_dirs import xdg_cache_home
+
+from fetch import CachingFetcher
+from spec import Spec
+from texify import PandocTexifier
+
+
+def _command_line_parser() -> ArgumentParser:
+    parser = ArgumentParser(prog='paperdoorknob', description='Print glowfic')
+    parser.add_argument(
+        '--cache_path',
+        metavar='PATH',
+        help='Where to keep the http cache (instead of %(default)s)',
+        default=os.path.join(xdg_cache_home(), "paperdoorknob"))
+    parser.add_argument(
+        '--out',
+        help='The filename stem at which to write output ' +
+             '(eg: "%(default)s" produces %(default)s.tex, %(default)s.pdf, etc.)',
+        default='book')
+    parser.add_argument('--pandoc', help='Location of the pandoc executable')
+    parser.add_argument(
+        '--timeout',
+        help='How long to wait for HTTP requests, in seconds',
+        default=30)
+    parser.add_argument('url', help='URL to retrieve')
+    return parser
+
+
+@contextmanager
+def spec_from_commandline_args() -> Iterator[Spec]:
+    args = _command_line_parser().parse_args()
+    with CachingFetcher(args.cache_path, args.timeout) as fetcher:
+        with open(args.out + '.tex', 'wb') as texout:
+            yield Spec(args.url, fetcher, PandocTexifier(args.pandoc or 'pandoc'), texout)
index 3b86cb8da08144c3862ab80b757b0194c086dbad..653d0c65d8d781790aceaff6d59f91a742a277ca 100644 (file)
@@ -5,39 +5,15 @@
 # Free Software Foundation, version 3.
 
 
-from argparse import ArgumentParser
 import itertools
-import os.path
 
-from typing import IO, Iterable
+from typing import Iterable
 
 from bs4 import BeautifulSoup
 from bs4.element import Tag
-from xdg_base_dirs import xdg_cache_home
-
-from fetch import CachingFetcher, Fetcher
-from texify import PandocTexifier, Texifier
-
-
-def command_line_parser() -> ArgumentParser:
-    parser = ArgumentParser(prog='paperdoorknob', description='Print glowfic')
-    parser.add_argument(
-        '--cache_path',
-        metavar='PATH',
-        help='Where to keep the http cache (instead of %(default)s)',
-        default=os.path.join(xdg_cache_home(), "paperdoorknob"))
-    parser.add_argument(
-        '--out',
-        help='The filename stem at which to write output ' +
-             '(eg: "%(default)s" produces %(default)s.text, %(default)s.pdf, etc.)',
-        default='book')
-    parser.add_argument('--pandoc', help='Location of the pandoc executable')
-    parser.add_argument(
-        '--timeout',
-        help='How long to wait for HTTP requests, in seconds',
-        default=30)
-    parser.add_argument('url', help='URL to retrieve')
-    return parser
+
+from args import spec_from_commandline_args
+from spec import Spec
 
 
 def parse(content: bytes) -> BeautifulSoup:
@@ -68,24 +44,17 @@ def replies(html: BeautifulSoup) -> Iterable[Tag]:
     return itertools.chain([text()], the_replies())
 
 
-def process(
-        url: str,
-        fetcher: Fetcher,
-        texifier: Texifier,
-        texout: IO[bytes]) -> None:
-    texout.write(b'\\documentclass{article}\n\\begin{document}\n')
-    html = clean(parse(fetcher.fetch(url)))
+def process(spec: Spec) -> None:
+    spec.texout.write(b'\\documentclass{article}\n\\begin{document}\n')
+    html = clean(parse(spec.fetcher.fetch(spec.url)))
     for r in replies(html):
-        texout.write(texifier.texify(r))
-    texout.write(b'\\end{document}\n')
+        spec.texout.write(spec.texifier.texify(r))
+    spec.texout.write(b'\\end{document}\n')
 
 
 def main() -> None:
-    args = command_line_parser().parse_args()
-    texifier = PandocTexifier(args.pandoc or 'pandoc')
-    with CachingFetcher(args.cache_path, args.timeout) as fetcher:
-        with open(args.out + '.tex', 'wb') as texout:
-            process(args.url, fetcher, texifier, texout)
+    with spec_from_commandline_args() as spec:
+        process(spec)
 
 
 if __name__ == '__main__':
index 4cead9772866e3425f227c55acb3c32063659627..baf79457a78f24499cc4f920dca4fe4576221a3d 100644 (file)
@@ -8,9 +8,12 @@
 import unittest
 import io
 import subprocess
+
 import paperdoorknob
+
 from testing.fakeserver import FakeGlowficServer
 from fetch import DirectFetcher
+from spec import Spec
 from texify import DirectTexifier, PandocTexifier, VerifyingTexifier
 
 TIMEOUT = 8
@@ -31,11 +34,14 @@ class TestPaperDoorknob(unittest.TestCase):
                              ["This is glowfic", "You sure?", "Pretty sure."])
 
     def testProcess(self) -> None:
-        texifier = PandocTexifier('pandoc')
         with DirectFetcher(TIMEOUT) as f:
             buf = io.BytesIO()
-            paperdoorknob.process(
-                f"http://localhost:{self._port}", f, texifier, buf)
+            spec = Spec(
+                f"http://localhost:{self._port}",
+                f,
+                PandocTexifier('pandoc'),
+                buf)
+            paperdoorknob.process(spec)
             self.assertEqual(buf.getvalue(), b'''\\documentclass{article}
 \\begin{document}
 This is glowfic
@@ -49,17 +55,20 @@ Pretty sure.
             PandocTexifier('pandoc'), DirectTexifier())
         with DirectFetcher(TIMEOUT) as f:
             buf = io.BytesIO()
-            paperdoorknob.process(
-                f"http://localhost:{self._port}", f, texifier, buf)
+            spec = Spec(f"http://localhost:{self._port}", f, texifier, buf)
+            paperdoorknob.process(spec)
 
     def testPDF(self) -> None:
-        texifier = PandocTexifier('pandoc')
         with DirectFetcher(TIMEOUT) as f:
             with open("test.tex", 'wb') as out:
-                paperdoorknob.process(
-                    f"http://localhost:{self._port}", f, texifier, out)
-            subprocess.run(['pdflatex', 'test.tex'],
-                           stdin=subprocess.DEVNULL, check=True)
+                spec = Spec(
+                    f"http://localhost:{self._port}",
+                    f,
+                    PandocTexifier('pandoc'),
+                    out)
+                paperdoorknob.process(spec)
+        subprocess.run(['pdflatex', 'test.tex'],
+                       stdin=subprocess.DEVNULL, check=True)
 
 
 if __name__ == '__main__':
index 6464879c1ece96c2dc0350829eb7ba4a7b2ba091..edaa429bc0fd6504f2647b9618074ec381534a81 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -8,8 +8,10 @@ setup(
     author_email="scottworley@scottworley.com",
     url="https://git.scottworley.com/paperdoorknob",
     py_modules=[
+        'args',
         'fetch',
         'paperdoorknob',
+        'spec',
         'texify',
     ],
     license="GPL-3.0",
diff --git a/spec.py b/spec.py
new file mode 100644 (file)
index 0000000..1322897
--- /dev/null
+++ b/spec.py
@@ -0,0 +1,21 @@
+# paperdoorknob: Print glowfic
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, version 3.
+
+
+from dataclasses import dataclass
+
+from typing import IO
+
+from fetch import Fetcher
+from texify import Texifier
+
+
+@dataclass(frozen=True)
+class Spec:
+    url: str
+    fetcher: Fetcher
+    texifier: Texifier
+    texout: IO[bytes]