backend/code_coverage_backend/report.py (71 lines of code) (raw):

# -*- coding: utf-8 -*- # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import os import structlog from code_coverage_backend.hgmo import hgmo_revision_details from code_coverage_tools.gcp import DEFAULT_FILTER logger = structlog.get_logger(__name__) class Report(object): """ A single coverage report """ def __init__( self, base_dir, repository, changeset, platform=DEFAULT_FILTER, suite=DEFAULT_FILTER, push_id=None, date=None, ): assert isinstance(repository, str) assert isinstance(changeset, str) self.base_dir = base_dir self.repository = repository self.changeset = changeset self.platform = platform self.suite = suite # Get extra information from HGMO if push_id or date: self.push_id = push_id self.date = date else: self.push_id, date = hgmo_revision_details(repository, changeset) self.date = int(date) def __str__(self): return self.name def __repr__(self): return self.name def __eq__(self, other): return isinstance(other, Report) and ( self.base_dir, self.repository, self.changeset, self.platform, self.suite, ) == ( other.base_dir, other.repository, other.changeset, other.platform, other.suite, ) @property def name(self): return "{}/{}/{}:{}".format( self.repository, self.changeset, self.platform, self.suite ) @property def path(self): """Local path on FS, decompressed""" return os.path.join(self.base_dir, f"{self.name}.json") @property def archive_path(self): """Local path on FS, compressed""" return f"{self.path}.zstd" @property def gcp_path(self): """Remote path on GCP storage""" return f"{self.name}.json.zstd" @property def key_overall(self): """Redis key to store the overall coverage data for this report""" platform = self.platform or "all" suite = self.suite or "all" return f"overall:{self.repository}:{self.changeset}:{platform}:{suite}" @property def ttl(self): """Time to live in seconds for the full report Will be None (no expiry) for full report (all:all) Otherwise set to 2 weeks """ if self.suite == DEFAULT_FILTER and self.platform == DEFAULT_FILTER: return return 15 * 24 * 3600