Skip to content

Commit 2e81651

Browse files
committed
fix logging
1 parent 9ebc64f commit 2e81651

File tree

5 files changed

+56
-7
lines changed

5 files changed

+56
-7
lines changed

pdal/libpdalpython.pyx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ cdef extern from "pdal/PipelineExecutor.hpp" namespace "pdal":
102102
string getMetadata() except +
103103
string getSchema() except +
104104
string getLog() except +
105-
int getLogLevel()
106-
void setLogLevel(int)
105+
void setLogLevel(int) except +
107106

108107

109108
cdef extern from "PyArray.hpp" namespace "pdal::python":
@@ -121,6 +120,7 @@ cdef extern from "PyPipeline.hpp" namespace "pdal::python":
121120
cdef class Pipeline:
122121
cdef PipelineExecutor* _executor
123122
cdef vector[shared_ptr[Array]] _inputs
123+
cdef int _loglevel
124124

125125
def __dealloc__(self):
126126
self.inputs = []
@@ -151,11 +151,12 @@ cdef class Pipeline:
151151

152152
@property
153153
def loglevel(self):
154-
return self._get_executor().getLogLevel()
154+
return self._loglevel
155155

156156
@loglevel.setter
157-
def loglevel(self, level):
158-
self._get_executor().setLogLevel(level)
157+
def loglevel(self, value):
158+
self._loglevel = value
159+
self._delete_executor()
159160

160161
@property
161162
def log(self):
@@ -226,6 +227,7 @@ cdef class Pipeline:
226227
if not self._executor:
227228
json_bytes = self._json.encode("UTF-8")
228229
self._executor = new PipelineExecutor(json_bytes)
230+
self._executor.setLogLevel(self._loglevel)
229231
readPipeline(self._executor, json_bytes)
230232
addArrayReaders(self._executor, self._inputs)
231233
return self._executor

pdal/pipeline.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,29 @@
22

33
import glob
44
import json
5+
import logging
56
from typing import Any, Container, Dict, Iterator, List, Optional, Sequence, Union, cast
67

78
import numpy as np
89

910
from . import libpdalpython
1011

1112

13+
LogLevelToPDAL = {
14+
logging.ERROR: 0,
15+
logging.WARNING: 1,
16+
logging.INFO: 2,
17+
logging.DEBUG: 8, # pdal::LogLevel::Debug5
18+
}
19+
LogLevelFromPDAL = {v: k for k, v in LogLevelToPDAL.items()}
20+
21+
1222
class Pipeline(libpdalpython.Pipeline):
1323
def __init__(
1424
self,
1525
spec: Union[None, str, Sequence[Stage]] = None,
1626
arrays: Sequence[np.ndarray] = (),
27+
loglevel: int = logging.ERROR,
1728
):
1829
self._stages: List[Stage] = []
1930
if spec:
@@ -22,11 +33,25 @@ def __init__(
2233
self |= stage
2334
if arrays:
2435
self.inputs = arrays
36+
self.loglevel = loglevel
2537

2638
@property
2739
def stages(self) -> List[Stage]:
2840
return list(self._stages)
2941

42+
@property
43+
def loglevel(self) -> int:
44+
return LogLevelFromPDAL[super().loglevel]
45+
46+
@loglevel.setter
47+
def loglevel(self, value: int) -> None:
48+
try:
49+
loglevel = LogLevelToPDAL[value]
50+
except KeyError:
51+
raise ValueError(f"Invalid level {value!r}")
52+
# super() property setter is not supported
53+
libpdalpython.Pipeline.loglevel.__set__(self, loglevel)
54+
3055
def __ior__(self, other: Union[Stage, Pipeline]) -> Pipeline:
3156
if isinstance(other, Stage):
3257
self._stages.append(other)

test/data/reproject.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{
88
"type":"filters.python",
99
"function":"filter",
10-
"source":"import numpy as np\n\ndef filter(ins,outs):\n\tcls = ins['Classification']\n\n\tkeep_classes = [1]\n\n\t# Use the first test for our base array.\n\tkeep = np.equal(cls, keep_classes[0])\n\n\t# For 1:n, test each predicate and join back\n\t# to our existing predicate array\n\tfor k in range(1,len(keep_classes)):\n\t\tt = np.equal(cls, keep_classes[k])\n\t\tkeep = keep + t\n\n\touts['Mask'] = keep\n\treturn True",
10+
"source":"import numpy as np\n\ndef filter(ins,outs):\n\tprint('entered filter()')\n\tcls = ins['Classification']\n\n\tkeep_classes = [1]\n\n\t# Use the first test for our base array.\n\tkeep = np.equal(cls, keep_classes[0])\n\n\t# For 1:n, test each predicate and join back\n\t# to our existing predicate array\n\tfor k in range(1,len(keep_classes)):\n\t\tt = np.equal(cls, keep_classes[k])\n\t\tkeep = keep + t\n\n\touts['Mask'] = keep\n\tprint('exiting filter()')\n\treturn True",
1111
"module":"anything"
1212
},
1313
"out2.las"

test/data/reproject.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
88
def filter(ins, outs):
9+
print("entered filter()")
910
cls = ins["Classification"]
1011
keep_classes = [1]
1112
@@ -19,6 +20,7 @@ def filter(ins, outs):
1920
keep = keep + t
2021
2122
outs["Mask"] = keep
23+
print("exiting filter()")
2224
return True
2325
""")
2426
|

test/test_pipeline.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import logging
23
import os
34
import sys
45

@@ -197,13 +198,32 @@ def test_infer_stage_type(self):
197198
assert pdal.Reader().type == ""
198199
assert pdal.Writer().type == ""
199200

201+
# fails against PDAL master; see https://github.com/PDAL/PDAL/issues/3566
202+
@pytest.mark.xfail
200203
@pytest.mark.parametrize("filename", ["reproject.json", "reproject.py"])
201204
def test_logging(self, filename):
202205
"""Can we fetch log output"""
203206
r = get_pipeline(filename)
207+
assert r.loglevel == logging.ERROR
208+
assert r.log == ""
209+
210+
for loglevel in logging.CRITICAL, -1:
211+
with pytest.raises(ValueError):
212+
r.loglevel = loglevel
213+
214+
count = r.execute()
215+
assert count == 789
216+
assert r.log == "entered filter()\n" + "exiting filter()\n"
217+
218+
r.loglevel = logging.DEBUG
219+
assert r.loglevel == logging.DEBUG
204220
count = r.execute()
205221
assert count == 789
206-
# assert r.log.split()[0] == "(pypipeline"
222+
assert "(pypipeline readers.las Debug)" in r.log
223+
assert "(pypipeline filters.python Debug)" in r.log
224+
assert "\nentered filter()\n" in r.log
225+
assert "\nexiting filter()\n" in r.log
226+
assert "(pypipeline writers.las Debug)" in r.log
207227

208228

209229
class TestArrayLoad:

0 commit comments

Comments
 (0)