Beispiel #1
0
def get_interface_codes(root_path: Path, contract_sources: ContractCodes) -> Dict:
    interface_codes: Dict = {}
    interfaces: Dict = {}

    for file_path, code in contract_sources.items():
        interfaces[file_path] = {}
        parent_path = root_path.joinpath(file_path).parent

        interface_codes = extract_file_interface_imports(code)
        for interface_name, interface_path in interface_codes.items():

            base_paths = [parent_path]
            if not interface_path.startswith('.') and root_path.joinpath(file_path).exists():
                base_paths.append(root_path)
            elif interface_path.startswith('../') and parent_path == root_path:
                raise FileNotFoundError(
                    f"{file_path} - Cannot perform relative import outside of base folder"
                )

            valid_path = get_interface_file_path(base_paths, interface_path)
            with valid_path.open() as fh:
                code = fh.read()
                if valid_path.suffix == '.json':
                    interfaces[file_path][interface_name] = {
                        'type': 'json',
                        'code': json.loads(code.encode())
                    }
                else:
                    interfaces[file_path][interface_name] = {
                        'type': 'vyper',
                        'code': code
                    }

    return interfaces
Beispiel #2
0
def get_interface_codes(
    root_path: Union[Path, None],
    contract_path: ContractPath,
    contract_sources: ContractCodes,
    interface_sources: Dict,
) -> Dict:
    interface_codes: Dict = {}
    interfaces: Dict = {}

    code = contract_sources[contract_path]
    interface_codes = extract_file_interface_imports(code)
    for interface_name, interface_path in interface_codes.items():
        path = Path(contract_path).parent.joinpath(interface_path).as_posix()
        keys = [_standardize_path(path)]
        if not interface_path.startswith("."):
            keys.append(interface_path)

        key = next((i for i in keys if i in interface_sources), None)
        if key:
            interfaces[interface_name] = interface_sources[key]
            continue

        key = next((i + ".vy" for i in keys if i + ".vy" in contract_sources),
                   None)
        if key:
            interfaces[interface_name] = {
                "type": "vyper",
                "code": contract_sources[key]
            }
            continue

        if root_path is None:
            raise FileNotFoundError(
                f"Cannot locate interface '{interface_path}{{.vy,.json}}'")

        parent_path = root_path.joinpath(contract_path).parent
        base_paths = [parent_path]
        if not interface_path.startswith("."):
            base_paths.append(root_path)
        elif interface_path.startswith("../") and len(
                Path(contract_path).parent.parts) < Path(
                    interface_path).parts.count(".."):
            raise FileNotFoundError(
                f"{contract_path} - Cannot perform relative import outside of base folder"
            )

        valid_path = get_interface_file_path(base_paths, interface_path)
        with valid_path.open() as fh:
            code = fh.read()
        if valid_path.suffix == ".json":
            interfaces[interface_name] = {
                "type": "json",
                "code": json.loads(code.encode())
            }
        else:
            interfaces[interface_name] = {"type": "vyper", "code": code}

    return interfaces
Beispiel #3
0
def test_extract_file_interface_imports(assert_compile_failed):
    code = """
import a as FooBarInterface
    """

    assert extract_file_interface_imports(code) == {'FooBarInterface': 'a'}

    invalid_no_alias_code = """
import a
    """
    assert_compile_failed(
        lambda: extract_file_interface_imports(invalid_no_alias_code), StructureException
    )

    invalid_interfac_already_exists_code = """
import a as A
import a as A
    """
    assert_compile_failed(lambda: extract_file_interface_imports(invalid_interfac_already_exists_code), StructureException)  # noqa: E501
Beispiel #4
0
def get_interface_codes(root_path: Union[Path,
                                         None], contract_path: ContractPath,
                        contract_sources: ContractCodes,
                        interface_sources: Dict) -> Dict:
    interface_codes: Dict = {}
    interfaces: Dict = {}

    code = contract_sources[contract_path]
    interface_codes = extract_file_interface_imports(code)
    for interface_name, interface_path in interface_codes.items():
        keys = [
            Path(contract_path).parent.joinpath(interface_path).as_posix(),
            interface_path
        ]

        key = next((i for i in keys if i in interface_sources), None)
        if key:
            interfaces[interface_name] = interface_sources[key]
            continue

        key = next((i + ".vy" for i in keys if i + ".vy" in contract_sources),
                   None)
        if key:
            interfaces[interface_name] = {
                'type': 'vyper',
                'code': contract_sources[key]
            }
            continue

        if root_path is None:
            raise FileNotFoundError(
                f"Cannot locate interface '{interface_path}{{.vy,.json}}'")

        parent_path = root_path.joinpath(contract_path).parent
        base_paths = [parent_path]
        if not interface_path.startswith('.'):
            base_paths.append(root_path)
        elif interface_path.startswith('../') and parent_path == root_path:
            raise FileNotFoundError(
                f"{contract_path} - Cannot perform relative import outside of base folder"
            )

        valid_path = get_interface_file_path(base_paths, interface_path)
        with valid_path.open() as fh:
            code = fh.read()
        if valid_path.suffix == '.json':
            interfaces[interface_name] = {
                'type': 'json',
                'code': json.loads(code.encode())
            }
        else:
            interfaces[interface_name] = {'type': 'vyper', 'code': code}

    return interfaces
Beispiel #5
0
def get_interface_codes(root_path: Path,
                        contract_sources: ContractCodes) -> Dict:
    interface_codes: Dict = {}
    interfaces: Dict = {}

    for file_path, code in contract_sources.items():
        interfaces[file_path] = {}
        parent_path = root_path.joinpath(file_path).parent

        interface_codes = extract_file_interface_imports(code)
        for interface_name, interface_path in interface_codes.items():

            base_paths = [parent_path]
            if not interface_path.startswith(".") and root_path.joinpath(
                    file_path).exists():
                base_paths.append(root_path)
            elif interface_path.startswith("../") and len(
                    Path(file_path).parent.parts) < Path(
                        interface_path).parts.count(".."):
                raise FileNotFoundError(
                    f"{file_path} - Cannot perform relative import outside of base folder"
                )

            valid_path = get_interface_file_path(base_paths, interface_path)
            with valid_path.open() as fh:
                code = fh.read()
                if valid_path.suffix == ".json":
                    interfaces[file_path][interface_name] = {
                        "type": "json",
                        "code": json.loads(code.encode()),
                    }
                else:
                    interfaces[file_path][interface_name] = {
                        "type": "vyper",
                        "code": code
                    }

    return interfaces
Beispiel #6
0
def test_extract_file_interface_imports_raises(code, assert_compile_failed):
    assert_compile_failed(lambda: extract_file_interface_imports(code),
                          StructureException)
Beispiel #7
0
def test_extract_file_interface_imports(code):

    assert extract_file_interface_imports(code[0]) == {'Foo': code[1]}