Skip to content

Commit

Permalink
refactor: compiler
Browse files Browse the repository at this point in the history
  • Loading branch information
antazoey committed Mar 27, 2024
1 parent 03aafed commit 7350e2b
Show file tree
Hide file tree
Showing 32 changed files with 1,283 additions and 1,190 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Initialize CodeQL
uses: github/codeql-action/init@v2
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/prtitle.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.10"

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.10"

Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.10"

Expand All @@ -42,10 +42,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.10"

Expand All @@ -69,10 +69,10 @@ jobs:
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

Expand All @@ -95,10 +95,10 @@ jobs:
# fail-fast: true

# steps:
# - uses: actions/checkout@v3
# - uses: actions/checkout@v4

# - name: Setup Python
# uses: actions/setup-python@v4
# uses: actions/setup-python@v5
# with:
# python-version: "3.10"

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ search those dependencies for the path.

```yaml
dependencies:
- name: OpenZeppelin
- name: openzeppelin
github: OpenZeppelin/openzeppelin-contracts
version: 4.4.2
Expand Down
3 changes: 2 additions & 1 deletion ape_solidity/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from ape import plugins

from .compiler import Extension, SolidityCompiler, SolidityConfig
from ._utils import Extension
from .compiler import SolidityCompiler, SolidityConfig


@plugins.register(plugins.Config)
Expand Down
95 changes: 2 additions & 93 deletions ape_solidity/_utils.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
import json
import os
import re
from enum import Enum
from pathlib import Path
from typing import Dict, List, Optional, Sequence, Set, Union
from typing import Dict, List, Optional, Sequence, Union

from ape.exceptions import CompilerError
from ape.utils import pragma_str_to_specifier_set
from packaging.specifiers import SpecifierSet
from packaging.version import InvalidVersion
from packaging.version import Version
from packaging.version import Version as _Version
from pydantic import BaseModel, field_validator
from solcx.install import get_executable
from solcx.wrapper import get_solc_version as get_solc_version_from_binary

from ape_solidity.exceptions import IncorrectMappingFormatError

OUTPUT_SELECTION = [
"abi",
"bin-runtime",
Expand All @@ -32,83 +26,7 @@ class Extension(Enum):
SOL = ".sol"


class ImportRemapping(BaseModel):
entry: str
packages_cache: Path

@field_validator("entry", mode="before")
@classmethod
def validate_entry(cls, value):
if len((value or "").split("=")) != 2:
raise IncorrectMappingFormatError()

return value

@property
def _parts(self) -> List[str]:
return self.entry.split("=")

# path normalization needed in case delimiter in remapping key/value
# and system path delimiter are different (Windows as an example)
@property
def key(self) -> str:
return os.path.normpath(self._parts[0])

@property
def name(self) -> str:
suffix_str = os.path.normpath(self._parts[1])
return suffix_str.split(os.path.sep)[0]

@property
def package_id(self) -> Path:
suffix = Path(self._parts[1])
data_folder_cache = self.packages_cache / suffix

try:
_Version(suffix.name)
if not suffix.name.startswith("v"):
suffix = suffix.parent / f"v{suffix.name}"

except InvalidVersion:
# The user did not specify a version_id suffix in their mapping.
# We try to smartly figure one out, else error.
if len(Path(suffix).parents) == 1 and data_folder_cache.is_dir():
version_ids = [d.name for d in data_folder_cache.iterdir()]
if len(version_ids) == 1:
# Use only version ID available.
suffix = suffix / version_ids[0]

elif not version_ids:
raise CompilerError(f"Missing dependency '{suffix}'.")

else:
options_str = ", ".join(version_ids)
raise CompilerError(
"Ambiguous version reference. "
f"Please set import remapping value to {suffix}/{{version_id}} "
f"where 'version_id' is one of '{options_str}'."
)

return suffix


class ImportRemappingBuilder:
def __init__(self, contracts_cache: Path):
# import_map maps import keys like `@openzeppelin/contracts`
# to str paths in the contracts' .cache folder.
self.import_map: Dict[str, str] = {}
self.dependencies_added: Set[Path] = set()
self.contracts_cache = contracts_cache

def add_entry(self, remapping: ImportRemapping):
path = remapping.package_id
if not str(path).startswith(f".cache{os.path.sep}"):
path = Path(".cache") / path

self.import_map[remapping.key] = str(path)


def get_import_lines(source_paths: Set[Path]) -> Dict[Path, List[str]]:
def get_import_lines(source_paths: Sequence[Path]) -> Dict[Path, List[str]]:
imports_dict: Dict[Path, List[str]] = {}

for filepath in source_paths:
Expand Down Expand Up @@ -184,15 +102,6 @@ def add_commit_hash(version: Union[str, Version]) -> Version:
return get_solc_version_from_binary(solc, with_commit_hash=True)


def verify_contract_filepaths(contract_filepaths: Sequence[Path]) -> Set[Path]:
invalid_files = [p.name for p in contract_filepaths if p.suffix != Extension.SOL.value]
if not invalid_files:
return set(contract_filepaths)

sources_str = "', '".join(invalid_files)
raise CompilerError(f"Unable to compile '{sources_str}' using Solidity compiler.")


def select_version(pragma_spec: SpecifierSet, options: Sequence[Version]) -> Optional[Version]:
choices = sorted(list(pragma_spec.filter(options)), reverse=True)
return choices[0] if choices else None
Expand Down
Loading

0 comments on commit 7350e2b

Please sign in to comment.