Skip to content

Commit 9c8bb7d

Browse files
committed
Add new constructor methods
1 parent 5bc3ebe commit 9c8bb7d

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
@@ -15,6 +15,7 @@
1515
from harp.io import MessageType, read
1616
from harp.model import BitMask, GroupMask, Model, PayloadMember, Register
1717
from harp.schema import read_schema
18+
import requests
1819

1920

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

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

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

0 commit comments

Comments
 (0)