diff options
author | Stephan Richter <stephan.richter@gmail.com> | 2019-01-23 16:20:22 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2019-06-10 17:15:32 -0400 |
commit | fce522d35b7c69b2bfddc204fd5f5b91225b4986 (patch) | |
tree | c0b85333f3f0a4d2f4145ca39c745cc0ad0877f4 /coverage/sqldata.py | |
parent | f1b93b4c2953dd944b8d6d30645b9445766366e1 (diff) | |
download | python-coveragepy-git-fce522d35b7c69b2bfddc204fd5f5b91225b4986.tar.gz |
Support for multiple, glob-based contexts in result queries.
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r-- | coverage/sqldata.py | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/coverage/sqldata.py b/coverage/sqldata.py index f8961fa6..5ba393d4 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -546,7 +546,30 @@ class CoverageSqliteData(SimpleReprMixin): return row[0] or "" return "" # File was measured, but no tracer associated. - def lines(self, filename, context=None): + + def set_query_contexts(self, contexts=None): + """Set query contexts for future `lines`, `arcs` etc. calls.""" + self._query_context_ids = self._get_query_context_ids(contexts) \ + if contexts is not None else None + self._query_contexts = contexts + + def _get_query_context_ids(self, contexts=None): + if contexts is not None: + if not len(contexts): + return None + self._start_using() + with self._connect() as con: + # Context entries can be globs, so convert '*' with '%'. + context_selectors = [context.replace('*', '%') for context in contexts] + context_clause = ' or '.join(['contenxt like ?']*len(contexts)) + con.execute( + "select id from context where " + context_clause, context_selectors) + return [row[0] for row in con.fetchall()] + elif self._query_contexts is not None: + return self._query_context_ids + return None + + def lines(self, filename, contexts=None): self._start_using() if self.has_arcs(): arcs = self.arcs(filename, context=context) @@ -561,13 +584,14 @@ class CoverageSqliteData(SimpleReprMixin): else: query = "select distinct lineno from line where file_id = ?" data = [file_id] - if context is not None: - query += " and context_id = ?" - data += [self._context_id(context)] + context_ids = self._get_query_context_ids(contexts) + if context_ids is not None: + query += " and context_id IN ?" + data += [context_ids] linenos = con.execute(query, data) return [lineno for lineno, in linenos] - def arcs(self, filename, context=None): + def arcs(self, filename, contexts=None): self._start_using() with self._connect() as con: file_id = self._file_id(filename) @@ -576,9 +600,10 @@ class CoverageSqliteData(SimpleReprMixin): else: query = "select distinct fromno, tono from arc where file_id = ?" data = [file_id] - if context is not None: - query += " and context_id = ?" - data += [self._context_id(context)] + context_ids = self._get_query_context_ids(contexts) + if context_ids is not None: + query += " and context_id IN ?" + data += [context_ids] arcs = con.execute(query, data) return list(arcs) |