Skip to content

Commit

Permalink
Python 3.11, 3.12 and Debian Bullseye compatibility (#178)
Browse files Browse the repository at this point in the history
- Debian Bullseye and pyenv was picking up old web3-ethereum-defi version
- Create a Docker script to check installation on Debian Bullseye
- This did not then use the correct version of [safe-pysha3](https://github.com/5afe/pysha3), but picked up the old pysha3 package
- Make `pyproject.toml` to say we are compatible all they way to Python 3.12
- [pkgutil compatibility fixes](https://stackoverflow.com/questions/77364550/attributeerror-module-pkgutil-has-no-attribute-impimporter-did-you-mean).
- [Upgrade to Pandas 2.x](pandas-dev/pandas#53665), needed for Python 3.12 compatibility
- Upgrade to the latest Web3.py 6.x version
- Python 3.12 changes `ast` module and this has breaking changes with `eth_trace` library. Workaround them.
- Disable `test_fallback_double_fault` because new Web3.py does not like `MagicMock` results
- Bump to `zope.dottedname` 6.0 needed [for Python 3.11 compatibility](https://pypi.org/project/zope.dottedname/)
  • Loading branch information
miohtama authored Nov 26, 2023
1 parent b2bb7e9 commit 35f09f9
Show file tree
Hide file tree
Showing 10 changed files with 1,466 additions and 1,265 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ jobs:
cache-dependency-path: contracts/aave-v3-deploy/package-lock.json
- name: Install poetry
run: pipx install poetry
- name: Set up Python 3.10
- name: Set up Python 3.12
uses: actions/setup-python@v3
with:
python-version: '3.10'
python-version: '3.12'
cache: 'poetry'
- name: Install dependencies
run: |
poetry env use '3.10'
poetry env use '3.12'
poetry install --all-extras
- name: Install Ganache
run: yarn global add ganache
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,7 @@ uni-v2-last-block-state.txt
docs/source/tutorials/aave.json

# hardhat export
contracts/aave-v3-deploy/hardhat-deployment-export.json
contracts/aave-v3-deploy/hardhat-deployment-export.json

# pyenv local
.python-version
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# 0.23.2

- Fix installation error on Debian Bullseye and Python 3.11: `fatal error: pystrhex.h: No such file or directory`
- Bump compatibility all the way up to Python 3.12

# 0.23.1

- Feature: Add 1delta integration position handlers
Expand Down
8 changes: 7 additions & 1 deletion eth_defi/trace.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,13 @@ def depth(self) -> int:

@property
def title(self) -> str:
call_type = self.call.call_type.value
try:
call_type = self.call.call_type.value
except AttributeError:
# Python 3.12+
# AST module changes?
call_type = str(self.call.call_type)

address_hex_str = self.call.address.hex() if self.call.address else None

try:
Expand Down
2,547 changes: 1,298 additions & 1,249 deletions poetry.lock

Large diffs are not rendered by default.

23 changes: 12 additions & 11 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,39 +13,40 @@ packages = [
]

[tool.poetry.dependencies]
python = ">=3.10,<3.11"
python = ">=3.10,<=3.12"
Sphinx = {version = "^4.5.0", optional = true}
sphinx-rtd-theme = {version = "^1.0.0", optional = true}
sphinx-sitemap = {version = "^2.2.0", optional = true}
sphinx-autodoc-typehints = {version = "^1.16.0", optional = true}
psutil = "^5.9.0"
ujson = "5.7.0"
ujson = "5.8.0"
cachetools = "^5.3.2"
futureproof = "^0.3.1"
setuptools = {version = "^69.0.2"}
eth-bloom = "^2.0.0"
evm-trace = "^0.1.0a17"
web3 = {version = "6.11.3", extras = ["tester"]}
tqdm-loggable = "^0.1.3"
sigfig = "^1.3.2"
tqdm = {version = "^4.64.0", optional = true}
pandas = {version = "^1.4.2", optional = true}
pandas = {version = "^2.1.3", optional = true}
gql = {extras = ["requests"], version = "^3.3.0", optional = true}
nbsphinx = {version = "^0.8.9", optional = true}
jupyter = {version = "^1.0.0", optional = true}
matplotlib = {version = "^3.5.2", optional = true}
plotly = {version = "^5.8.2", optional = true}
furo = {version = "^2022.6.4.1", optional = true}
pyarrow = {version = "*", optional = true}
setuptools = {version = "^65.6.3"}
eth-bloom = "^2.0.0"
evm-trace = "^0.1.0a17"
web3 = {version = "6.0.0", extras = ["tester"]}
tqdm-loggable = "^0.1.3"
sigfig = "^1.3.2"
zope-dottedname = {version = "^6.0", optional = true}
pytest-xdist = {version = "^3.3.1", optional = true}

# https://github.com/apache/arrow/pull/35412
# Last checked 2023-07, still broken
urllib3 = "<2"
cachetools = "^5.3.2"


[tool.poetry.dev-dependencies]
pytest = "^6.2.5"
pytest = "^7.4.3"
pytest-mock = "^3.7.0"
sphinx-rtd-theme = "^1.0.0"
sphinx-sitemap = "^2.2.0"
Expand Down
5 changes: 5 additions & 0 deletions scripts/debian-bullseye-compatibility/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM debian:bullseye
RUN apt-get update
RUN apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
RUN apt-get install -y curl git

82 changes: 82 additions & 0 deletions scripts/debian-bullseye-compatibility/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
Check installations issues on Debian Bullseye

- Debian Bullseye
- Python 3.11
- pyenv
- pysha3 installation issue
- See [safe-pysha3 replacing pysha3](https://github.com/5afe/pysha3)


## Running

Create image:

```shell
docker build --no-cache -t pysha3-test .
```

Run the shell script within the image:


```shell
docker run -v `pwd`:`pwd` -w `pwd` --entrypoint `pwd`/check-install.sh pysha3-test
```

## Manual inspection of running Debian Bullseye

Map source tree as we so we can do direct install from local source for trials.

```shell
docker run -it -v `pwd`:`pwd` -v $(realpath $PWD/../..):`pwd`/web3-ethereum-defi -w `pwd` --entrypoint /bin/bash pysha3-test
```

Then run the script:

```shell
./check-install.sh
```

Or to active Python environment:

```shell
/root/.pyenv/bin/pyenv global 3.12

```

## pysha3 error

```
Using cached netaddr-0.9.0-py3-none-any.whl (2.2 MB)
Building wheels for collected packages: pysha3
Building wheel for pysha3 (pyproject.toml) ... error
error: subprocess-exited-with-error
× Building wheel for pysha3 (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [18 lines of output]
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-cpython-311
copying sha3.py -> build/lib.linux-x86_64-cpython-311
running build_ext
building '_pysha3' extension
creating build/temp.linux-x86_64-cpython-311
creating build/temp.linux-x86_64-cpython-311/Modules
creating build/temp.linux-x86_64-cpython-311/Modules/_sha3
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPY_WITH_KECCAK=1 -I/home/user/.pyenv/versions/3.11.4/include/python3.11 -c Modules/_sha3/sha3module.c -o build/temp.linux-x86_64-cpython-311/Modules/_sha3/sha3module.o
In file included from Modules/_sha3/sha3module.c:20:
Modules/_sha3/backport.inc:78:10: fatal error: pystrhex.h: No such file or directory
78 | #include "pystrhex.h"
| ^~~~~~~~~~~~
compilation terminated.
error: command '/usr/bin/gcc' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pysha3
Failed to build pysha3
ERROR: Could not build wheels for pysha3, which is required to install pyproject.toml-based projects
```
49 changes: 49 additions & 0 deletions scripts/debian-bullseye-compatibility/check-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/usr/bin/env bash
#
# Taken from https://raw.githubusercontent.com/SCBuergel/SEQS/main/install-scripts/python_appVM.sh
#

set -e
set -u

echo "I am $(whoami)"

echo "Installing Python on appVM"
curl https://pyenv.run | bash

echo "setting .profile..."
echo -e "\
export PYENV_ROOT=\"\$HOME/.pyenv\"\n\
command -v pyenv >/dev/null || export PATH=\"\$PYENV_ROOT/bin:\$PATH\"\n\
eval \"\$(pyenv init -)\"" >> ~/.profile

echo "reloading .profile twice..."
source ~/.profile
source ~/.profile

echo "setting .bashrc..."
echo "eval \"\$(/root/.pyenv/bin/pyenv virtualenv-init -)\"" >> ~/.bashrc

echo "installing latest python..."
pyenv install 3.12

echo "setting symlink..."
ln -f -s /usr/bin/python3 /usr/local/bin/python

echo "setting global python version..."
pyenv global 3.12

echo "installing virtualenv..."
pip install virtualenv

echo "updating pip..."
pip install --upgrade pip

echo "Pip is $(which pip)"
echo "Python is $(which python)"
pip --version
pip install safe-pysha3
pip install -e web3-ethereum-defi

# Set up poetry
curl -sSL https://install.python-poetry.org | python3 -
1 change: 1 addition & 0 deletions tests/rpc/test_fallback_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ def test_fallback_double_fault(fallback_provider: FallbackProvider, provider_1,
assert fallback_provider.retry_count == 6


@pytest.mark.skip(reason="Web 6.12 breaks with MagicMock")
def test_fallback_double_fault_recovery(fallback_provider: FallbackProvider, provider_1, provider_2):
"""Fallback fails on both providers, but then recover."""

Expand Down

0 comments on commit 35f09f9

Please sign in to comment.