Skip to main content

Break out the encoder as a separate file

ID
61dfab0
date
2025-01-10 11:26:30+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
52076e8
message
Break out the encoder as a separate file
changed files
2 files, 29 additions, 11 deletions

Changed files

src/javascript_data_files/__init__.py (6646) → src/javascript_data_files/__init__.py (6422)

diff --git a/src/javascript_data_files/__init__.py b/src/javascript_data_files/__init__.py
index 634cc05..53cf442 100644
--- a/src/javascript_data_files/__init__.py
+++ b/src/javascript_data_files/__init__.py
@@ -19,6 +19,8 @@ import textwrap
 import typing
 import uuid
 
+from .encoder import encode_as_js
+
 
 __version__ = "1.1.0"
 
@@ -53,16 +55,6 @@ def read_js(p: pathlib.Path | str, *, varname: str) -> typing.Any:
     return json.loads(json_string)
 
 
-def _create_js_string(value: typing.Any, varname: str) -> str:
-    """
-    Create a JavaScript string to write to a file.
-    """
-    json_string = json.dumps(value, indent=2)
-    js_string = f"const {varname} = {json_string};\n"
-
-    return js_string
-
-
 def write_js(
     p: pathlib.Path | str | io.TextIOBase | io.BufferedIOBase,
     *,
@@ -82,7 +74,7 @@ def write_js(
         'const redPentagon = {\n  "sides": 5,\n  "colour": "red"\n};\n'
 
     """
-    js_string = _create_js_string(value, varname)
+    js_string = encode_as_js(value, varname)
 
     if isinstance(p, io.TextIOBase):
         p.write(js_string)

src/javascript_data_files/encoder.py (0) → src/javascript_data_files/encoder.py (556)

diff --git a/src/javascript_data_files/encoder.py b/src/javascript_data_files/encoder.py
new file mode 100644
index 0000000..2dedbae
--- /dev/null
+++ b/src/javascript_data_files/encoder.py
@@ -0,0 +1,26 @@
+"""
+This file contains pure functions for converting Python values
+to JavaScript strings.
+
+It doesn't do any I/O.
+"""
+
+import json
+import typing
+
+
+def encode_as_json(value: typing.Any) -> str:
+    """
+    Convert a Python value to a JSON-encoded string.
+    """
+    return json.dumps(value, indent=2)
+
+
+def encode_as_js(value: typing.Any, varname: str) -> str:
+    """
+    Convert a Python value to a JSON-encoded JavaScript value.
+    """
+    json_string = encode_as_json(value)
+    js_string = f"const {varname} = {json_string};\n"
+
+    return js_string