示例#1
0
    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)
示例#2
0
    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)
示例#3
0
 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()