aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.")