Commits

Clark C. Evans committed 5bd8979

adding encode helper command

Comments (0)

Files changed (2)

src/htsql/ctl/__init__.py

 from .shell import ShellRoutine
 from .request import GetRoutine, PostRoutine
 from .regress import RegressRoutine
+from .encode import EncodeRoutine
 import sys
 
 
             DefaultRoutine,
             HelpRoutine,
             VersionRoutine,
+            EncodeRoutine,
             ExtensionRoutine,
             ServerRoutine,
             ShellRoutine,

src/htsql/ctl/encode.py

+#
+# Copyright (c) 2006-2008, Prometheus Research, LLC
+# See `LICENSE` for license information, `AUTHORS` for the list of authors.
+#
+
+"""
+:mod:`htsql.ctl.encode`
+=====================
+
+This module implements the `encode` routine.
+"""
+
+
+from .routine import Routine, Argument
+from ..core.validator import BoolVal
+import os, urllib
+
+
+class EncodeRoutine(Routine):
+    """
+    Implements the `encode` routine.
+    """
+
+    name = 'encode'
+    aliases = []
+    arguments = []
+    hint = """percent encode input for database or query URI"""
+    help = """
+    Run '%(executable)s encode' to percent-encode a query fragment or
+    database URI fragment so that it is a suitable for HTTP queries 
+    and command line arguments.  This can be run interactively or 
+    as a filter using standard input/output.
+    """
+
+    def run(self):
+        isatty = os.isatty(self.ctl.stdin.fileno())
+        if isatty:
+           self.ctl.out("Type your query fragment and finish with a blank line.")
+        if isatty:
+            chunks = []
+            while True:
+                chunk = self.ctl.stdin.readline().rstrip()
+                if not chunk:
+                    self.ctl.out("The percent-encoded fragment is:")
+                    self.ctl.out()
+                    break
+                chunks.append(chunk)
+            input = "\n".join(chunks)
+        else:
+            input = self.ctl.stdin.read().rstrip()
+        self.ctl.out(urllib.quote(input))
+        if isatty:
+            self.ctl.out()