Skip to content

Commit 404821f

Browse files
committed
Make filename optional for readers/writers
1 parent 7eb3be4 commit 404821f

File tree

3 files changed

+25
-25
lines changed

3 files changed

+25
-25
lines changed

pdal/drivers.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,12 @@ def __post_init__(self) -> None:
3434

3535
@property
3636
def factory(self) -> Callable[..., Stage]:
37-
factory: Callable[..., Stage]
38-
if self.type is Reader:
39-
factory = lambda filename, **kwargs: Reader(
40-
filename, type=self.name, **kwargs
41-
)
42-
elif self.type is Writer:
43-
factory = lambda filename=None, **kwargs: Writer(
44-
filename, type=self.name, **kwargs
37+
if self.options and self.options[0].name == "filename":
38+
factory = lambda filename, **kwargs: self.type(
39+
filename=filename, type=self.name, **kwargs
4540
)
4641
else:
47-
factory = lambda **kwargs: Filter(type=self.name, **kwargs)
42+
factory = lambda **kwargs: self.type(type=self.name, **kwargs)
4843
factory.__name__ = self.short_name
4944
factory.__qualname__ = f"{self.type.__name__}.{self.short_name}"
5045
factory.__doc__ = self.description

pdal/pipeline.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import glob
44
import json
5-
from abc import ABC, abstractmethod
65
from typing import Any, Container, Dict, Iterator, List, Optional, Sequence, Union, cast
76

87
import numpy as np
@@ -89,31 +88,31 @@ def options(self) -> Dict[str, Any]:
8988
return dict(self._options)
9089

9190
def pipeline(self, *arrays: np.ndarray) -> Pipeline:
92-
return Pipeline((self,), arrays=arrays)
91+
return Pipeline((self,), arrays)
9392

9493
def __or__(self, other: Union[Stage, Pipeline]) -> Pipeline:
9594
return Pipeline((self, other))
9695

9796

98-
class InferableTypeStage(ABC, Stage):
99-
@staticmethod
100-
@abstractmethod
101-
def infer_type(filename: str) -> str:
102-
"""Infer the driver type from the filename"""
97+
class InferableTypeStage(Stage):
98+
def __init__(self, filename: Optional[str] = None, **options: Any):
99+
if filename:
100+
options["filename"] = filename
101+
super().__init__(**options)
103102

104103
@property
105104
def type(self) -> str:
106105
try:
107106
return super().type
108107
except KeyError:
109-
return self.infer_type(self._options["filename"])
108+
filename = self._options.get("filename")
109+
return str(self._infer_type(filename) if filename else "")
110110

111+
_infer_type = staticmethod(lambda filename: "")
111112

112-
class Reader(InferableTypeStage):
113-
infer_type = staticmethod(libpdalpython.infer_reader_driver)
114113

115-
def __init__(self, filename: str, **options: Any):
116-
super().__init__(filename=filename, **options)
114+
class Reader(InferableTypeStage):
115+
_infer_type = staticmethod(libpdalpython.infer_reader_driver)
117116

118117

119118
class Filter(Stage):
@@ -122,10 +121,7 @@ def __init__(self, type: str, **options: Any):
122121

123122

124123
class Writer(InferableTypeStage):
125-
infer_type = staticmethod(libpdalpython.infer_writer_driver)
126-
127-
def __init__(self, filename: Optional[str] = None, **options: Any):
128-
super().__init__(filename=filename, **options)
124+
_infer_type = staticmethod(libpdalpython.infer_writer_driver)
129125

130126

131127
def _parse_stages(text: str) -> Iterator[Stage]:

test/test_pipeline.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,15 @@ def test_inputs(self):
188188
with pytest.raises(ValueError):
189189
(pdal.Reader("r") | f) | pipeline
190190

191+
def test_infer_stage_type(self):
192+
"""Can we infer stage type from the filename"""
193+
assert pdal.Reader("foo.las").type == "readers.las"
194+
assert pdal.Writer("foo.las").type == "writers.las"
195+
assert pdal.Reader("foo.xxx").type == ""
196+
assert pdal.Writer("foo.xxx").type == ""
197+
assert pdal.Reader().type == ""
198+
assert pdal.Writer().type == ""
199+
191200
@pytest.mark.parametrize("filename", ["reproject.json", "reproject.py"])
192201
def test_logging(self, filename):
193202
"""Can we fetch log output"""

0 commit comments

Comments
 (0)