Skip to content

Commit b64f17f

Browse files
committed
Add new constructor methods
1 parent ebd12ce commit b64f17f

1 file changed

Lines changed: 112 additions & 0 deletions

File tree

harp/reader.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from harp.model import BitMask, GroupMask, Model, PayloadMember, Register
1414
from harp.io import MessageType, read
1515
from harp.schema import read_schema
16+
import requests
1617

1718

1819
@dataclass
@@ -75,6 +76,117 @@ def __dir__(self) -> Iterable[str]:
7576
def __getattr__(self, __name: str) -> RegisterReader:
7677
return self.registers[__name]
7778

79+
@staticmethod
80+
def from_file(
81+
filepath: PathLike,
82+
base_path: Optional[PathLike] = None,
83+
include_common_registers: bool = True,
84+
epoch: Optional[datetime] = None,
85+
keep_type: bool = False) -> "DeviceReader":
86+
87+
device = read_schema(filepath, include_common_registers)
88+
if base_path is None:
89+
path = Path(filepath).absolute().resolve()
90+
base_path = path.parent / device.device
91+
else:
92+
base_path = Path(base_path).absolute().resolve() / device.device
93+
94+
reg_readers = {
95+
name: _create_register_parser(
96+
device, name, _ReaderParams(base_path, epoch, keep_type)
97+
)
98+
for name in device.registers.keys()
99+
}
100+
return DeviceReader(device, reg_readers)
101+
102+
@staticmethod
103+
def from_url(
104+
url: str,
105+
base_path: Optional[PathLike] = None,
106+
include_common_registers: bool = True,
107+
epoch: Optional[datetime] = None,
108+
keep_type: bool = False,
109+
timeout: int = 5) -> "DeviceReader":
110+
111+
response = requests.get(url, timeout=timeout)
112+
text = response.text
113+
114+
device = read_schema(text, include_common_registers)
115+
if base_path is None:
116+
base_path = Path(device.device).absolute().resolve()
117+
else:
118+
base_path = Path(base_path).absolute().resolve()
119+
120+
reg_readers = {
121+
name: _create_register_parser(
122+
device, name, _ReaderParams(base_path, epoch, keep_type)
123+
)
124+
for name in device.registers.keys()
125+
}
126+
return DeviceReader(device, reg_readers)
127+
128+
@staticmethod
129+
def from_str(
130+
schema: str,
131+
base_path: Optional[PathLike] = None,
132+
include_common_registers: bool = True,
133+
epoch: Optional[datetime] = None,
134+
keep_type: bool = False) -> "DeviceReader":
135+
136+
device = read_schema(schema, include_common_registers)
137+
if base_path is None:
138+
base_path = Path(device.device).absolute().resolve()
139+
else:
140+
base_path = Path(base_path).absolute().resolve()
141+
142+
reg_readers = {
143+
name: _create_register_parser(
144+
device, name, _ReaderParams(base_path, epoch, keep_type)
145+
)
146+
for name in device.registers.keys()
147+
}
148+
return DeviceReader(device, reg_readers)
149+
150+
@staticmethod
151+
def from_model(
152+
model: Model,
153+
base_path: Optional[PathLike] = None,
154+
epoch: Optional[datetime] = None,
155+
keep_type: bool = False) -> "DeviceReader":
156+
157+
if base_path is None:
158+
base_path = Path(model.device).absolute().resolve()
159+
else:
160+
base_path = Path(base_path).absolute().resolve()
161+
162+
reg_readers = {
163+
name: _create_register_parser(
164+
model, name, _ReaderParams(base_path, epoch, keep_type)
165+
)
166+
for name in model.registers.keys()
167+
}
168+
return DeviceReader(model, reg_readers)
169+
170+
@staticmethod
171+
def from_dataset(
172+
dataset: PathLike,
173+
include_common_registers: bool = True,
174+
epoch: Optional[datetime] = None,
175+
keep_type: bool = False) -> "DeviceReader":
176+
177+
path = Path(dataset).absolute().resolve()
178+
is_dir = os.path.isdir(path)
179+
if is_dir:
180+
filepath = path / "device.yml"
181+
return DeviceReader.from_file(
182+
filepath=filepath,
183+
base_path=path,
184+
include_common_registers=include_common_registers,
185+
epoch=epoch,
186+
keep_type=keep_type)
187+
else:
188+
raise ValueError("The dataset must be a directory containing a device.yml file.")
189+
78190

79191
def _compose_parser(
80192
f: Callable[[DataFrame], DataFrame],

0 commit comments

Comments
 (0)