about summary refs log tree commit diff
path: root/r_qtl
diff options
context:
space:
mode:
Diffstat (limited to 'r_qtl')
-rw-r--r--r_qtl/__init__.py1
-rw-r--r--r_qtl/errors.py8
-rw-r--r--r_qtl/r_qtl2.py32
3 files changed, 41 insertions, 0 deletions
diff --git a/r_qtl/__init__.py b/r_qtl/__init__.py
new file mode 100644
index 0000000..5663832
--- /dev/null
+++ b/r_qtl/__init__.py
@@ -0,0 +1 @@
+"""The R/qtl parsing and processing code."""
diff --git a/r_qtl/errors.py b/r_qtl/errors.py
new file mode 100644
index 0000000..648611e
--- /dev/null
+++ b/r_qtl/errors.py
@@ -0,0 +1,8 @@
+"""R/qtl and R/qtl2 error types."""
+from collections import namedtuple
+
+class RQTLError(Exception):
+    """Base class for R/qtl and R/qtl2 errors."""
+
+class InvalidFormat(RQTLError):
+    """Raised when the format of the file(s) is invalid."""
diff --git a/r_qtl/r_qtl2.py b/r_qtl/r_qtl2.py
new file mode 100644
index 0000000..9c9d67b
--- /dev/null
+++ b/r_qtl/r_qtl2.py
@@ -0,0 +1,32 @@
+"""The R/qtl2 parsing and processing code."""
+import json
+import yaml
+from pathlib import Path
+from typing import List, Union
+from zipfile import ZipFile, ZipInfo, is_zipfile
+
+from quality_control.debug import __pk__
+from r_qtl.errors import InvalidFormat
+
+def control_data(zfile: ZipFile) -> dict:
+    """Retrieve the control file from the zip file info."""
+    files = tuple(filename
+                  for filename in zfile.namelist()
+                  if (filename.endswith(".yaml") or filename.endswith(".json")))
+    num_files = len(files)
+    if num_files == 0:
+        raise InvalidFormat("Expected a json or yaml control file.")
+
+    if num_files > 1:
+        raise InvalidFormat("Found more than one possible control file.")
+
+    return (json.loads(zfile.read(files[0]))
+            if files[0].endswith(".json")
+            else yaml.safe_load(zfile.read(files[0])))
+
+
+def read_r_qtl2_files(filepath: Path):
+    """Read R/qtl2 format zip files."""
+    with ZipFile(filepath, "r") as zfile:
+        cf = control_data(zfile)
+        raise NotImplementedError("Implementation is incomplete.")