Skip to content

Commit d746d6b

Browse files
committed
Fix pybind iterator
1 parent 4be6901 commit d746d6b

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

src/filepattern/cpp/bindings.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,39 +36,54 @@ PYBIND11_MODULE(backend, m){
3636
.def_static("getRegex", &FilePattern::getRegex)
3737
.def_static("inferPattern", py::overload_cast<const std::string&, std::string&, const std::string&>(&FilePattern::inferPattern))
3838
.def_static("inferPattern", py::overload_cast<std::vector<std::string>&, std::string&>(&FilePattern::inferPattern))
39+
.def("isGrouped", [](FilePattern &v){
40+
auto& pattern_obj = v.getPatternObject();
41+
return !(pattern_obj->group_.size() == 0 || (pattern_obj->group_.size() != 0 && pattern_obj->group_[0] == ""));
42+
})
3943
.def("iterator", [](FilePattern &v){
4044

4145
auto& pattern_obj = v.getPatternObject();
4246

4347
if(pattern_obj != nullptr) {
4448

45-
if(pattern_obj->group_.size() == 0 || (pattern_obj->group_.size() != 0 && pattern_obj->group_[0] == "")){
49+
return py::make_iterator(pattern_obj->valid_files_.begin(), pattern_obj->valid_files_.end());
50+
51+
}
52+
53+
}, py::keep_alive<0, 1>())
54+
.def("iteratorExternal", [](FilePattern &v){
4655

47-
return py::make_iterator(pattern_obj->valid_files_.begin(), pattern_obj->valid_files_.end());
48-
49-
} else {
56+
auto& pattern_obj = v.getPatternObject();
5057

51-
return py::make_iterator(pattern_obj->valid_grouped_files_.begin(), pattern_obj->valid_grouped_files_.end());
58+
if(pattern_obj != nullptr) {
5259

53-
}
60+
v.next();
61+
return py::make_iterator(pattern_obj->current_block_.begin(), pattern_obj->current_block_.end());
62+
5463
}
64+
5565
}, py::keep_alive<0, 1>())
56-
.def("iteratorExternal", [](FilePattern &v){
66+
.def("iteratorGrouped", [](FilePattern &v){
5767

5868
auto& pattern_obj = v.getPatternObject();
5969

6070
if(pattern_obj != nullptr) {
71+
72+
return py::make_iterator(pattern_obj->valid_grouped_files_.begin(), pattern_obj->valid_grouped_files_.end());
6173

62-
if(pattern_obj->group_.size() == 0 || (pattern_obj->group_.size() != 0 && pattern_obj->group_[0] == "")) {
74+
}
6375

64-
v.next();
65-
return py::make_iterator(pattern_obj->current_block_.begin(), pattern_obj->current_block_.end());
76+
}, py::keep_alive<0, 1>())
77+
.def("iteratorGroupedExternal", [](FilePattern &v){
6678

67-
} else {
79+
auto& pattern_obj = v.getPatternObject();
80+
81+
if(pattern_obj != nullptr) {
6882

6983
v.nextGroup();
7084
return py::make_iterator(pattern_obj->current_group_.begin(), pattern_obj->current_group_.end());
71-
}
85+
7286
}
87+
7388
}, py::keep_alive<0, 1>());
7489
}

src/filepattern/filepattern.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,13 @@ def __iter__(self) -> Union[List[Tuple[List[Tuple[str, Union[str, int, float]]],
259259
"""
260260

261261
if self._block_size == "":
262-
for file in self._file_pattern.iterator():
262+
263+
if (self._file_pattern.isGrouped()):
264+
iterator = self._file_pattern.iteratorGrouped()
265+
else:
266+
iterator = self._file_pattern.iterator()
267+
268+
for file in iterator:
263269
if (self.pydantic_iterator):
264270

265271
if (isinstance(file[0], dict)):
@@ -280,8 +286,15 @@ def __iter__(self) -> Union[List[Tuple[List[Tuple[str, Union[str, int, float]]],
280286
else:
281287
yield file
282288
else:
289+
283290
while True:
284-
for block in self._file_pattern.iteratorExternal():
291+
292+
if (self._file_pattern.isGrouped()):
293+
iterator = self._file_pattern.iteratorGroupedExternal()
294+
else:
295+
iterator = self._file_pattern.iteratorExternal()
296+
297+
for block in iterator:
285298

286299
if self._length() == 0:
287300
break

0 commit comments

Comments
 (0)