+ if namespaces is not None:
+ self.namespace_filter = set(namespaces)
+ else:
+ self.namespace_filter = None
+
+ self.regex_schemas = []
+ self.regex_revision_pairs = self.make_matchmake_pairs(regex_match_revision, regex_revision_label)
+ self.regex_comment_pairs = self.make_matchmake_pairs(regex_match_comment, regex_comment_label)
+
+ if self.collapse_user is True:
+ if self.persist == PersistMethod.none:
+ revdata_type = RevDataCollapse
+ else:
+ revdata_type = RevDataCollapsePersistence
+ elif self.persist != PersistMethod.none:
+ revdata_type = RevDataPersistence
+ else:
+ revdata_type = RevDataBase
+
+ regex_fields = [(field.name, list[str], dc.field(default=None)) for field in self.regex_schemas]
+
+ self.revdata_type = make_dataclass('RevData_Parser',
+ fields=regex_fields,
+ bases=(revdata_type,))
+
+ self.revdata_type.pa_schema_fields = revdata_type.pa_schema_fields + self.regex_schemas
+
+ self.revdata_type.urlencode = self.urlencode
+
+ if output_parquet is True:
+ self.output_parquet = True
+ self.pq_writer = None
+ self.output_file = output_file
+ self.parquet_buffer = []
+ self.parquet_buffer_size = parquet_buffer_size
+ else:
+ self.print_header = True
+ if output_file == sys.stdout:
+
+ self.output_file = output_file
+ else:
+ self.output_file = open(output_file,'w')
+ self.output_parquet = False
+
+ def make_matchmake_pairs(self, patterns, labels):
+ if (patterns is not None and labels is not None) and \
+ (len(patterns) == len(labels)):
+ result = []
+ for pattern, label in zip(patterns, labels):
+ rp = RegexPair(pattern, label)
+ result.append(rp)
+ self.regex_schemas = self.regex_schemas + rp.get_pyarrow_fields()
+ return result
+ elif (patterns is None and labels is None):
+ return []
+ else:
+ sys.exit('Each regular expression *must* come with a corresponding label and vice versa.')
+
+ def matchmake(self, rev, rev_data):
+ rev_data = self.matchmake_revision(rev.text, rev_data)
+ rev_data = self.matchmake_comment(rev.comment, rev_data)
+ return rev_data
+
+ def matchmake_revision(self, text, rev_data):
+ return self.matchmake_pairs(text, rev_data, self.regex_revision_pairs)
+
+ def matchmake_comment(self, comment, rev_data):
+ return self.matchmake_pairs(comment, rev_data, self.regex_comment_pairs)
+
+ def matchmake_pairs(self, text, rev_data, pairs):
+ for pair in pairs:
+ rev_data = pair.matchmake(text, rev_data)
+ return rev_data
+