def __init__(self, path): self.project_path = path self.active_path = None self.count = 0 self.results = None self.isolated = set() self.conf_hashes = dict( (self._path(i.parent), get_ast_hash(i)) for i in Path(path).glob('tests/**/conftest.py')) try: with path.joinpath('build/tests.json').open() as fp: hashes = json.load(fp) except (FileNotFoundError, json.decoder.JSONDecodeError): hashes = {'tests': {}, 'contracts': {}, 'tx': {}} self.tests = dict( (k, v) for k, v in hashes['tests'].items() if Path(k).exists() and self._get_hash(k) == v['sha1']) self.contracts = dict( (k, v['bytecodeSha1']) for k, v in build.items() if v['bytecode']) changed_contracts = set( k for k, v in hashes['contracts'].items() if k not in self.contracts or v != self.contracts[k]) if changed_contracts: for txhash, coverage_eval in hashes['tx'].items(): if not changed_contracts.intersection(coverage_eval.keys()): coverage.add_cached(txhash, coverage_eval) self.tests = dict( (k, v) for k, v in self.tests.items() if v['isolated'] is not False and not changed_contracts.intersection(v['isolated'])) else: for txhash, coverage_eval in hashes['tx'].items(): coverage.add_cached(txhash, coverage_eval)
def __init__(self, project): self.project = project self.project_path = project._project_path self.active_path = None self.count = 0 self.results = None self.isolated = set() glob = self.project_path.glob("tests/**/conftest.py") self.conf_hashes = dict( (self._path(i.parent), get_ast_hash(i)) for i in glob) try: with self.project_path.joinpath("build/tests.json").open() as fp: hashes = json.load(fp) except (FileNotFoundError, json.decoder.JSONDecodeError): hashes = {"tests": {}, "contracts": {}, "tx": {}} self.tests = dict( (k, v) for k, v in hashes["tests"].items() if Path(k).exists() and self._get_hash(k) == v["sha1"]) build = self.project._build self.contracts = dict( (k, v["bytecodeSha1"]) for k, v in build.items() if v["bytecode"]) changed_contracts = set( k for k, v in hashes["contracts"].items() if k not in self.contracts or v != self.contracts[k]) if changed_contracts: for txhash, coverage_eval in hashes["tx"].items(): if not changed_contracts.intersection(coverage_eval.keys()): coverage.add_cached_transaction(txhash, coverage_eval) self.tests = dict( (k, v) for k, v in self.tests.items() if v["isolated"] is not False and not changed_contracts.intersection(v["isolated"])) else: for txhash, coverage_eval in hashes["tx"].items(): coverage.add_cached_transaction(txhash, coverage_eval)
def _get_hash(self, path): hash_ = get_ast_hash(path) for confpath in filter(lambda k: k in path, sorted(self.conf_hashes)): hash_ += self.conf_hashes[confpath] return sha1(hash_.encode()).hexdigest()