def __init__(self, config, project): self.config = config # required when brownie project is in a subfolder of another project config.rootdir = local(project._path) self.project = project self.project_path = project._path self.results = {} self.node_map = {} self.isolated = {} self.skip = {} self.contracts = dict( (k, v["bytecodeSha1"]) for k, v in project._build.items() if v["bytecode"] ) 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 self.project_path.joinpath(k).exists() and self._get_hash(k) == v["sha1"] ) 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 __init__(self, project): self.project = project self.project_path = 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(self.project_path.joinpath(path)) for confpath in filter(lambda k: k in path, sorted(self.conf_hashes)): hash_ += self.conf_hashes[confpath] return sha1(hash_.encode()).hexdigest()