mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2024-12-24 11:09:23 -05:00
Add a stub Rust crate (#12595)
This commit is contained in:
parent
3d20115115
commit
c9b7e97355
@ -4,8 +4,12 @@
|
|||||||
# things to include
|
# things to include
|
||||||
!docker
|
!docker
|
||||||
!synapse
|
!synapse
|
||||||
|
!rust
|
||||||
!README.rst
|
!README.rst
|
||||||
!pyproject.toml
|
!pyproject.toml
|
||||||
!poetry.lock
|
!poetry.lock
|
||||||
|
!build_rust.py
|
||||||
|
|
||||||
|
rust/target
|
||||||
|
|
||||||
**/__pycache__
|
**/__pycache__
|
||||||
|
65
.github/workflows/release-artifacts.yml
vendored
65
.github/workflows/release-artifacts.yml
vendored
@ -15,7 +15,7 @@ on:
|
|||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
@ -89,9 +89,67 @@ jobs:
|
|||||||
name: debs
|
name: debs
|
||||||
path: debs/*
|
path: debs/*
|
||||||
|
|
||||||
|
build-wheels:
|
||||||
|
name: Build wheels on ${{ matrix.os }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-20.04, macos-10.15]
|
||||||
|
is_pr:
|
||||||
|
- ${{ startsWith(github.ref, 'refs/pull/') }}
|
||||||
|
|
||||||
|
exclude:
|
||||||
|
# Don't build macos wheels on PR CI.
|
||||||
|
- is_pr: true
|
||||||
|
os: "macos-10.15"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
|
||||||
|
- name: Install cibuildwheel
|
||||||
|
run: python -m pip install cibuildwheel==2.9.0 poetry==1.2.0
|
||||||
|
|
||||||
|
# Only build a single wheel in CI.
|
||||||
|
- name: Set env vars.
|
||||||
|
run: |
|
||||||
|
echo "CIBW_BUILD="cp37-manylinux_x86_64"" >> $GITHUB_ENV
|
||||||
|
if: startsWith(github.ref, 'refs/pull/')
|
||||||
|
|
||||||
|
- name: Build wheels
|
||||||
|
run: python -m cibuildwheel --output-dir wheelhouse
|
||||||
|
env:
|
||||||
|
# Skip testing for platforms which various libraries don't have wheels
|
||||||
|
# for, and so need extra build deps.
|
||||||
|
CIBW_TEST_SKIP: pp39-* *i686* *musl* pp37-macosx*
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Wheel
|
||||||
|
path: ./wheelhouse/*.whl
|
||||||
|
|
||||||
build-sdist:
|
build-sdist:
|
||||||
name: "Build pypi distribution files"
|
name: Build sdist
|
||||||
uses: "matrix-org/backend-meta/.github/workflows/packaging.yml@v1"
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ !startsWith(github.ref, 'refs/pull/') }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
|
||||||
|
- run: pip install build
|
||||||
|
|
||||||
|
- name: Build sdist
|
||||||
|
run: python -m build --sdist
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: Sdist
|
||||||
|
path: dist/*.tar.gz
|
||||||
|
|
||||||
|
|
||||||
# if it's a tag, create a release and attach the artifacts to it
|
# if it's a tag, create a release and attach the artifacts to it
|
||||||
attach-assets:
|
attach-assets:
|
||||||
@ -99,6 +157,7 @@ jobs:
|
|||||||
if: ${{ !failure() && !cancelled() && startsWith(github.ref, 'refs/tags/') }}
|
if: ${{ !failure() && !cancelled() && startsWith(github.ref, 'refs/tags/') }}
|
||||||
needs:
|
needs:
|
||||||
- build-debs
|
- build-debs
|
||||||
|
- build-wheels
|
||||||
- build-sdist
|
- build-sdist
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
19
.github/workflows/tests.yml
vendored
19
.github/workflows/tests.yml
vendored
@ -139,6 +139,12 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Install Rust
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: 1.61.0
|
||||||
|
override: true
|
||||||
|
|
||||||
# There aren't wheels for some of the older deps, so we need to install
|
# There aren't wheels for some of the older deps, so we need to install
|
||||||
# their build dependencies
|
# their build dependencies
|
||||||
- run: |
|
- run: |
|
||||||
@ -175,7 +181,7 @@ jobs:
|
|||||||
python-version: '3.7'
|
python-version: '3.7'
|
||||||
extras: "all test"
|
extras: "all test"
|
||||||
|
|
||||||
- run: poetry run trial -j 2 tests
|
- run: poetry run trial -j2 tests
|
||||||
- name: Dump logs
|
- name: Dump logs
|
||||||
# Logs are most useful when the command fails, always include them.
|
# Logs are most useful when the command fails, always include them.
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
@ -247,6 +253,11 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Prepare test blacklist
|
- name: Prepare test blacklist
|
||||||
run: cat sytest-blacklist .ci/worker-blacklist > synapse-blacklist-with-workers
|
run: cat sytest-blacklist .ci/worker-blacklist > synapse-blacklist-with-workers
|
||||||
|
- name: Install Rust
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: 1.61.0
|
||||||
|
override: true
|
||||||
- name: Run SyTest
|
- name: Run SyTest
|
||||||
run: /bootstrap.sh synapse
|
run: /bootstrap.sh synapse
|
||||||
working-directory: /src
|
working-directory: /src
|
||||||
@ -353,6 +364,12 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: synapse
|
path: synapse
|
||||||
|
|
||||||
|
- name: Install Rust
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: 1.61.0
|
||||||
|
override: true
|
||||||
|
|
||||||
- name: Prepare Complement's Prerequisites
|
- name: Prepare Complement's Prerequisites
|
||||||
run: synapse/.ci/scripts/setup_complement_prerequisites.sh
|
run: synapse/.ci/scripts/setup_complement_prerequisites.sh
|
||||||
|
|
||||||
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -60,3 +60,10 @@ book/
|
|||||||
# complement
|
# complement
|
||||||
/complement-*
|
/complement-*
|
||||||
/master.tar.gz
|
/master.tar.gz
|
||||||
|
|
||||||
|
# rust
|
||||||
|
/target/
|
||||||
|
/synapse/*.so
|
||||||
|
|
||||||
|
# Poetry will create a setup.py, which we don't want to include.
|
||||||
|
/setup.py
|
||||||
|
5
Cargo.toml
Normal file
5
Cargo.toml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# We make the whole Synapse folder a workspace so that we can run `cargo`
|
||||||
|
# commands from the root (rather than having to cd into rust/).
|
||||||
|
|
||||||
|
[workspace]
|
||||||
|
members = ["rust"]
|
20
build_rust.py
Normal file
20
build_rust.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# A build script for poetry that adds the rust extension.
|
||||||
|
|
||||||
|
import os
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
from setuptools_rust import Binding, RustExtension
|
||||||
|
|
||||||
|
|
||||||
|
def build(setup_kwargs: Dict[str, Any]) -> None:
|
||||||
|
original_project_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
cargo_toml_path = os.path.join(original_project_dir, "rust", "Cargo.toml")
|
||||||
|
|
||||||
|
extension = RustExtension(
|
||||||
|
target="synapse.synapse_rust",
|
||||||
|
path=cargo_toml_path,
|
||||||
|
binding=Binding.PyO3,
|
||||||
|
py_limited_api=True,
|
||||||
|
)
|
||||||
|
setup_kwargs.setdefault("rust_extensions", []).append(extension)
|
||||||
|
setup_kwargs["zip_safe"] = False
|
1
changelog.d/12595.misc
Normal file
1
changelog.d/12595.misc
Normal file
@ -0,0 +1 @@
|
|||||||
|
Add a stub Rust crate.
|
7
debian/build_virtualenv
vendored
7
debian/build_virtualenv
vendored
@ -61,7 +61,7 @@ dh_virtualenv \
|
|||||||
--extras="all,systemd,test" \
|
--extras="all,systemd,test" \
|
||||||
--requirements="exported_requirements.txt"
|
--requirements="exported_requirements.txt"
|
||||||
|
|
||||||
PACKAGE_BUILD_DIR="debian/matrix-synapse-py3"
|
PACKAGE_BUILD_DIR="$(pwd)/debian/matrix-synapse-py3"
|
||||||
VIRTUALENV_DIR="${PACKAGE_BUILD_DIR}${DH_VIRTUALENV_INSTALL_ROOT}/matrix-synapse"
|
VIRTUALENV_DIR="${PACKAGE_BUILD_DIR}${DH_VIRTUALENV_INSTALL_ROOT}/matrix-synapse"
|
||||||
TARGET_PYTHON="${VIRTUALENV_DIR}/bin/python"
|
TARGET_PYTHON="${VIRTUALENV_DIR}/bin/python"
|
||||||
|
|
||||||
@ -78,9 +78,14 @@ case "$DEB_BUILD_OPTIONS" in
|
|||||||
|
|
||||||
cp -r tests "$tmpdir"
|
cp -r tests "$tmpdir"
|
||||||
|
|
||||||
|
# To avoid pulling in the unbuilt Synapse in the local directory
|
||||||
|
pushd /
|
||||||
|
|
||||||
PYTHONPATH="$tmpdir" \
|
PYTHONPATH="$tmpdir" \
|
||||||
"${TARGET_PYTHON}" -m twisted.trial --reporter=text -j2 tests
|
"${TARGET_PYTHON}" -m twisted.trial --reporter=text -j2 tests
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
4
debian/changelog
vendored
4
debian/changelog
vendored
@ -12,11 +12,15 @@ matrix-synapse-py3 (1.66.0) stable; urgency=medium
|
|||||||
|
|
||||||
matrix-synapse-py3 (1.66.0~rc2+nmu1) UNRELEASED; urgency=medium
|
matrix-synapse-py3 (1.66.0~rc2+nmu1) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
[ Jörg Behrmann ]
|
||||||
* Update debhelper to compatibility level 12.
|
* Update debhelper to compatibility level 12.
|
||||||
* Drop the preinst script stopping synapse.
|
* Drop the preinst script stopping synapse.
|
||||||
* Allocate a group for the system user.
|
* Allocate a group for the system user.
|
||||||
* Change dpkg-statoverride to --force-statoverride-add.
|
* Change dpkg-statoverride to --force-statoverride-add.
|
||||||
|
|
||||||
|
[ Erik Johnston ]
|
||||||
|
* Disable `dh_auto_configure` as it broke during Rust build.
|
||||||
|
|
||||||
-- Jörg Behrmann <behrmann@physik.fu-berlin.de> Tue, 23 Aug 2022 17:17:00 +0100
|
-- Jörg Behrmann <behrmann@physik.fu-berlin.de> Tue, 23 Aug 2022 17:17:00 +0100
|
||||||
|
|
||||||
matrix-synapse-py3 (1.66.0~rc2) stable; urgency=medium
|
matrix-synapse-py3 (1.66.0~rc2) stable; urgency=medium
|
||||||
|
2
debian/rules
vendored
2
debian/rules
vendored
@ -12,6 +12,8 @@ override_dh_installsystemd:
|
|||||||
# we don't really want to strip the symbols from our object files.
|
# we don't really want to strip the symbols from our object files.
|
||||||
override_dh_strip:
|
override_dh_strip:
|
||||||
|
|
||||||
|
override_dh_auto_configure:
|
||||||
|
|
||||||
# many libraries pulled from PyPI have allocatable sections after
|
# many libraries pulled from PyPI have allocatable sections after
|
||||||
# non-allocatable ones on which dwz errors out. For those without the issue the
|
# non-allocatable ones on which dwz errors out. For those without the issue the
|
||||||
# gains are only marginal
|
# gains are only marginal
|
||||||
|
@ -92,11 +92,20 @@ RUN \
|
|||||||
libxml++2.6-dev \
|
libxml++2.6-dev \
|
||||||
libxslt1-dev \
|
libxslt1-dev \
|
||||||
openssl \
|
openssl \
|
||||||
rustc \
|
|
||||||
zlib1g-dev \
|
zlib1g-dev \
|
||||||
git \
|
git \
|
||||||
|
curl \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
|
||||||
|
# Install rust and ensure its in the PATH
|
||||||
|
ENV RUSTUP_HOME=/rust
|
||||||
|
ENV CARGO_HOME=/cargo
|
||||||
|
ENV PATH=/cargo/bin:/rust/bin:$PATH
|
||||||
|
RUN mkdir /rust /cargo
|
||||||
|
|
||||||
|
RUN curl -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain stable
|
||||||
|
|
||||||
# To speed up rebuilds, install all of the dependencies before we copy over
|
# To speed up rebuilds, install all of the dependencies before we copy over
|
||||||
# the whole synapse project, so that this layer in the Docker cache can be
|
# the whole synapse project, so that this layer in the Docker cache can be
|
||||||
# used while you develop on the source
|
# used while you develop on the source
|
||||||
@ -108,8 +117,9 @@ RUN --mount=type=cache,target=/root/.cache/pip \
|
|||||||
|
|
||||||
# Copy over the rest of the synapse source code.
|
# Copy over the rest of the synapse source code.
|
||||||
COPY synapse /synapse/synapse/
|
COPY synapse /synapse/synapse/
|
||||||
|
COPY rust /synapse/rust/
|
||||||
# ... and what we need to `pip install`.
|
# ... and what we need to `pip install`.
|
||||||
COPY pyproject.toml README.rst /synapse/
|
COPY pyproject.toml README.rst build_rust.py /synapse/
|
||||||
|
|
||||||
# Repeat of earlier build argument declaration, as this is a new build stage.
|
# Repeat of earlier build argument declaration, as this is a new build stage.
|
||||||
ARG TEST_ONLY_IGNORE_POETRY_LOCKFILE
|
ARG TEST_ONLY_IGNORE_POETRY_LOCKFILE
|
||||||
|
@ -72,6 +72,7 @@ RUN apt-get update -qq -o Acquire::Languages=none \
|
|||||||
&& env DEBIAN_FRONTEND=noninteractive apt-get install \
|
&& env DEBIAN_FRONTEND=noninteractive apt-get install \
|
||||||
-yqq --no-install-recommends -o Dpkg::Options::=--force-unsafe-io \
|
-yqq --no-install-recommends -o Dpkg::Options::=--force-unsafe-io \
|
||||||
build-essential \
|
build-essential \
|
||||||
|
curl \
|
||||||
debhelper \
|
debhelper \
|
||||||
devscripts \
|
devscripts \
|
||||||
libsystemd-dev \
|
libsystemd-dev \
|
||||||
@ -85,6 +86,15 @@ RUN apt-get update -qq -o Acquire::Languages=none \
|
|||||||
libpq-dev \
|
libpq-dev \
|
||||||
xmlsec1
|
xmlsec1
|
||||||
|
|
||||||
|
# Install rust and ensure it's in the PATH
|
||||||
|
ENV RUSTUP_HOME=/rust
|
||||||
|
ENV CARGO_HOME=/cargo
|
||||||
|
ENV PATH=/cargo/bin:/rust/bin:$PATH
|
||||||
|
RUN mkdir /rust /cargo
|
||||||
|
|
||||||
|
RUN curl -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain stable
|
||||||
|
|
||||||
|
|
||||||
COPY --from=builder /dh-virtualenv_1.2.2-1_all.deb /
|
COPY --from=builder /dh-virtualenv_1.2.2-1_all.deb /
|
||||||
|
|
||||||
# install dhvirtualenv. Update the apt cache again first, in case we got a
|
# install dhvirtualenv. Update the apt cache again first, in case we got a
|
||||||
|
@ -18,6 +18,12 @@ documented at [https://endoflife.date/python](https://endoflife.date/python) and
|
|||||||
[https://endoflife.date/postgresql](https://endoflife.date/postgresql).
|
[https://endoflife.date/postgresql](https://endoflife.date/postgresql).
|
||||||
|
|
||||||
|
|
||||||
|
A Rust compiler is required to build Synapse from source. For any given release
|
||||||
|
the minimum required version may be bumped up to a recent Rust version, and so
|
||||||
|
people building from source should ensure they can fetch recent versions of Rust
|
||||||
|
(e.g. by using [rustup](https://rustup.rs/)).
|
||||||
|
|
||||||
|
|
||||||
Context
|
Context
|
||||||
-------
|
-------
|
||||||
|
|
||||||
@ -31,3 +37,10 @@ long process.
|
|||||||
By following the upstream support life cycles Synapse can ensure that its
|
By following the upstream support life cycles Synapse can ensure that its
|
||||||
dependencies continue to get security patches, while not requiring system admins
|
dependencies continue to get security patches, while not requiring system admins
|
||||||
to constantly update their platform dependencies to the latest versions.
|
to constantly update their platform dependencies to the latest versions.
|
||||||
|
|
||||||
|
For Rust, the situation is a bit different given that a) the Rust foundation
|
||||||
|
does not generally support older Rust versions, and b) the library ecosystem
|
||||||
|
generally bump their minimum support Rust versions frequently. In general, the
|
||||||
|
Synapse team will try to avoid updating the dependency on Rust to the absolute
|
||||||
|
latest version, but introducing a formal policy is hard given the constraints of
|
||||||
|
the ecosystem.
|
||||||
|
@ -28,6 +28,9 @@ The source code of Synapse is hosted on GitHub. You will also need [a recent ver
|
|||||||
|
|
||||||
For some tests, you will need [a recent version of Docker](https://docs.docker.com/get-docker/).
|
For some tests, you will need [a recent version of Docker](https://docs.docker.com/get-docker/).
|
||||||
|
|
||||||
|
A recent version of the Rust compiler is needed to build the native modules. The
|
||||||
|
easiest way of installing the latest version is to use [rustup](https://rustup.rs/).
|
||||||
|
|
||||||
|
|
||||||
# 3. Get the source.
|
# 3. Get the source.
|
||||||
|
|
||||||
@ -114,6 +117,11 @@ Some documentation also exists in [Synapse's GitHub
|
|||||||
Wiki](https://github.com/matrix-org/synapse/wiki), although this is primarily
|
Wiki](https://github.com/matrix-org/synapse/wiki), although this is primarily
|
||||||
contributed to by community authors.
|
contributed to by community authors.
|
||||||
|
|
||||||
|
When changes are made to any Rust code then you must call either `poetry install`
|
||||||
|
or `maturin develop` (if installed) to rebuild the Rust code. Using [`maturin`](https://github.com/PyO3/maturin)
|
||||||
|
is quicker than `poetry install`, so is recommended when making frequent
|
||||||
|
changes to the Rust code.
|
||||||
|
|
||||||
|
|
||||||
# 8. Test, test, test!
|
# 8. Test, test, test!
|
||||||
<a name="test-test-test"></a>
|
<a name="test-test-test"></a>
|
||||||
@ -195,7 +203,7 @@ The database file can then be inspected with:
|
|||||||
sqlite3 _trial_temp/test.db
|
sqlite3 _trial_temp/test.db
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that the database file is cleared at the beginning of each test run. Thus it
|
Note that the database file is cleared at the beginning of each test run. Thus it
|
||||||
will always only contain the data generated by the *last run test*. Though generally
|
will always only contain the data generated by the *last run test*. Though generally
|
||||||
when debugging, one is only running a single test anyway.
|
when debugging, one is only running a single test anyway.
|
||||||
|
|
||||||
|
@ -196,6 +196,10 @@ System requirements:
|
|||||||
- Python 3.7 or later, up to Python 3.10.
|
- Python 3.7 or later, up to Python 3.10.
|
||||||
- At least 1GB of free RAM if you want to join large public rooms like #matrix:matrix.org
|
- At least 1GB of free RAM if you want to join large public rooms like #matrix:matrix.org
|
||||||
|
|
||||||
|
If building on an uncommon architecture for which pre-built wheels are
|
||||||
|
unavailable, you will need to have a recent Rust compiler installed. The easiest
|
||||||
|
way of installing the latest version is to use [rustup](https://rustup.rs/).
|
||||||
|
|
||||||
To install the Synapse homeserver run:
|
To install the Synapse homeserver run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
6
mypy.ini
6
mypy.ini
@ -16,7 +16,8 @@ files =
|
|||||||
docker/,
|
docker/,
|
||||||
scripts-dev/,
|
scripts-dev/,
|
||||||
synapse/,
|
synapse/,
|
||||||
tests/
|
tests/,
|
||||||
|
build_rust.py
|
||||||
|
|
||||||
# Note: Better exclusion syntax coming in mypy > 0.910
|
# Note: Better exclusion syntax coming in mypy > 0.910
|
||||||
# https://github.com/python/mypy/pull/11329
|
# https://github.com/python/mypy/pull/11329
|
||||||
@ -181,3 +182,6 @@ ignore_missing_imports = True
|
|||||||
|
|
||||||
[mypy-incremental.*]
|
[mypy-incremental.*]
|
||||||
ignore_missing_imports = True
|
ignore_missing_imports = True
|
||||||
|
|
||||||
|
[mypy-setuptools_rust.*]
|
||||||
|
ignore_missing_imports = True
|
||||||
|
35
poetry.lock
generated
35
poetry.lock
generated
@ -1035,6 +1035,18 @@ python-versions = ">=3.6"
|
|||||||
cryptography = ">=2.0"
|
cryptography = ">=2.0"
|
||||||
jeepney = ">=0.6"
|
jeepney = ">=0.6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semantic-version"
|
||||||
|
version = "2.10.0"
|
||||||
|
description = "A library implementing the 'SemVer' scheme."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"]
|
||||||
|
doc = ["Sphinx", "sphinx-rtd-theme"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sentry-sdk"
|
name = "sentry-sdk"
|
||||||
version = "1.5.11"
|
version = "1.5.11"
|
||||||
@ -1099,6 +1111,19 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g
|
|||||||
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "setuptools-rust"
|
||||||
|
version = "1.5.1"
|
||||||
|
description = "Setuptools Rust extension plugin"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
semantic-version = ">=2.8.2,<3"
|
||||||
|
setuptools = ">=62.4"
|
||||||
|
typing-extensions = ">=3.7.4.3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signedjson"
|
name = "signedjson"
|
||||||
version = "1.1.4"
|
version = "1.1.4"
|
||||||
@ -1600,7 +1625,7 @@ url_preview = ["lxml"]
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.7.1"
|
python-versions = "^3.7.1"
|
||||||
content-hash = "0df36bf75561fef340a7af704ed379b235f07a7d4a231aaccec5e7afb87159ca"
|
content-hash = "79cfa09d59f9f8b5ef24318fb860df1915f54328692aa56d04331ecbdd92a8cb"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
attrs = [
|
attrs = [
|
||||||
@ -2472,6 +2497,10 @@ secretstorage = [
|
|||||||
{file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"},
|
{file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"},
|
||||||
{file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"},
|
{file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"},
|
||||||
]
|
]
|
||||||
|
semantic-version = [
|
||||||
|
{file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"},
|
||||||
|
{file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"},
|
||||||
|
]
|
||||||
sentry-sdk = [
|
sentry-sdk = [
|
||||||
{file = "sentry-sdk-1.5.11.tar.gz", hash = "sha256:6c01d9d0b65935fd275adc120194737d1df317dce811e642cbf0394d0d37a007"},
|
{file = "sentry-sdk-1.5.11.tar.gz", hash = "sha256:6c01d9d0b65935fd275adc120194737d1df317dce811e642cbf0394d0d37a007"},
|
||||||
{file = "sentry_sdk-1.5.11-py2.py3-none-any.whl", hash = "sha256:c17179183cac614e900cbd048dab03f49a48e2820182ec686c25e7ce46f8548f"},
|
{file = "sentry_sdk-1.5.11-py2.py3-none-any.whl", hash = "sha256:c17179183cac614e900cbd048dab03f49a48e2820182ec686c25e7ce46f8548f"},
|
||||||
@ -2484,6 +2513,10 @@ setuptools = [
|
|||||||
{file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"},
|
{file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"},
|
||||||
{file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"},
|
{file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"},
|
||||||
]
|
]
|
||||||
|
setuptools-rust = [
|
||||||
|
{file = "setuptools-rust-1.5.1.tar.gz", hash = "sha256:0e05e456645d59429cb1021370aede73c0760e9360bbfdaaefb5bced530eb9d7"},
|
||||||
|
{file = "setuptools_rust-1.5.1-py3-none-any.whl", hash = "sha256:306b236ff3aa5229180e58292610d0c2c51bb488191122d2fc559ae4caeb7d5e"},
|
||||||
|
]
|
||||||
signedjson = [
|
signedjson = [
|
||||||
{file = "signedjson-1.1.4-py3-none-any.whl", hash = "sha256:45569ec54241c65d2403fe3faf7169be5322547706a231e884ca2b427f23d228"},
|
{file = "signedjson-1.1.4-py3-none-any.whl", hash = "sha256:45569ec54241c65d2403fe3faf7169be5322547706a231e884ca2b427f23d228"},
|
||||||
{file = "signedjson-1.1.4.tar.gz", hash = "sha256:cd91c56af53f169ef032c62e9c4a3292dc158866933318d0592e3462db3d6492"},
|
{file = "signedjson-1.1.4.tar.gz", hash = "sha256:cd91c56af53f169ef032c62e9c4a3292dc158866933318d0592e3462db3d6492"},
|
||||||
|
@ -52,6 +52,9 @@ include_trailing_comma = true
|
|||||||
combine_as_imports = true
|
combine_as_imports = true
|
||||||
skip_gitignore = true
|
skip_gitignore = true
|
||||||
|
|
||||||
|
[tool.maturin]
|
||||||
|
manifest-path = "rust/Cargo.toml"
|
||||||
|
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "matrix-synapse"
|
name = "matrix-synapse"
|
||||||
version = "1.66.0"
|
version = "1.66.0"
|
||||||
@ -82,7 +85,16 @@ include = [
|
|||||||
{ path = "sytest-blacklist", format = "sdist" },
|
{ path = "sytest-blacklist", format = "sdist" },
|
||||||
{ path = "tests", format = "sdist" },
|
{ path = "tests", format = "sdist" },
|
||||||
{ path = "UPGRADE.rst", format = "sdist" },
|
{ path = "UPGRADE.rst", format = "sdist" },
|
||||||
|
{ path = "Cargo.toml", format = "sdist" },
|
||||||
|
{ path = "rust/Cargo.toml", format = "sdist" },
|
||||||
|
{ path = "rust/Cargo.lock", format = "sdist" },
|
||||||
|
{ path = "rust/src/**", format = "sdist" },
|
||||||
]
|
]
|
||||||
|
exclude = [
|
||||||
|
{ path = "synapse/*.so", format = "sdist"}
|
||||||
|
]
|
||||||
|
|
||||||
|
build = "build_rust.py"
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
synapse_homeserver = "synapse.app.homeserver:main"
|
synapse_homeserver = "synapse.app.homeserver:main"
|
||||||
@ -161,6 +173,15 @@ importlib_metadata = { version = ">=1.4", python = "<3.8" }
|
|||||||
# This is the most recent version of Pydantic with available on common distros.
|
# This is the most recent version of Pydantic with available on common distros.
|
||||||
pydantic = ">=1.7.4"
|
pydantic = ">=1.7.4"
|
||||||
|
|
||||||
|
# This is for building the rust components during "poetry install", which
|
||||||
|
# currently ignores the `build-system.requires` directive (c.f.
|
||||||
|
# https://github.com/python-poetry/poetry/issues/6154). Both `pip install` and
|
||||||
|
# `poetry build` do the right thing without this explicit dependency.
|
||||||
|
#
|
||||||
|
# This isn't really a dev-dependency, as `poetry install --no-dev` will fail,
|
||||||
|
# but the alternative is to add it to the main list of deps where it isn't
|
||||||
|
# needed.
|
||||||
|
setuptools_rust = ">=1.3"
|
||||||
|
|
||||||
|
|
||||||
# Optional Dependencies
|
# Optional Dependencies
|
||||||
@ -285,5 +306,21 @@ twine = "*"
|
|||||||
towncrier = ">=18.6.0rc1"
|
towncrier = ">=18.6.0rc1"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0", "setuptools_rust>=1.3"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
||||||
|
|
||||||
|
[tool.cibuildwheel]
|
||||||
|
# Skip unsupported platforms (by us or by Rust).
|
||||||
|
skip = "cp36* *-musllinux_i686"
|
||||||
|
|
||||||
|
# We need a rust compiler
|
||||||
|
before-all = "curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable -y"
|
||||||
|
environment= { PATH = "$PATH:$HOME/.cargo/bin" }
|
||||||
|
|
||||||
|
# For some reason if we don't manually clean the build directory we
|
||||||
|
# can end up polluting the next build with a .so that is for the wrong
|
||||||
|
# Python version.
|
||||||
|
before-build = "rm -rf {project}/build"
|
||||||
|
build-frontend = "build"
|
||||||
|
test-command = "python -c 'from synapse.synapse_rust import sum_as_string; print(sum_as_string(1, 2))'"
|
||||||
|
21
rust/Cargo.toml
Normal file
21
rust/Cargo.toml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
[package]
|
||||||
|
# We name the package `synapse` so that things like logging have the right
|
||||||
|
# logging target.
|
||||||
|
name = "synapse"
|
||||||
|
|
||||||
|
# dummy version. See pyproject.toml for the Synapse's version number.
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
edition = "2021"
|
||||||
|
rust-version = "1.61.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "synapse"
|
||||||
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
|
[package.metadata.maturin]
|
||||||
|
# This is where we tell maturin where to place the built library.
|
||||||
|
name = "synapse.synapse_rust"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
pyo3 = { version = "0.16.5", features = ["extension-module", "macros", "abi3", "abi3-py37"] }
|
15
rust/src/lib.rs
Normal file
15
rust/src/lib.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
use pyo3::prelude::*;
|
||||||
|
|
||||||
|
/// Formats the sum of two numbers as string.
|
||||||
|
#[pyfunction]
|
||||||
|
#[pyo3(text_signature = "(a, b, /)")]
|
||||||
|
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
|
||||||
|
Ok((a + b).to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The entry point for defining the Python module.
|
||||||
|
#[pymodule]
|
||||||
|
fn synapse_rust(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
|
||||||
|
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
0
stubs/synapse/__init__.pyi
Normal file
0
stubs/synapse/__init__.pyi
Normal file
1
stubs/synapse/synapse_rust.pyi
Normal file
1
stubs/synapse/synapse_rust.pyi
Normal file
@ -0,0 +1 @@
|
|||||||
|
def sum_as_string(a: int, b: int) -> str: ...
|
11
tests/test_rust.py
Normal file
11
tests/test_rust.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from synapse.synapse_rust import sum_as_string
|
||||||
|
|
||||||
|
from tests import unittest
|
||||||
|
|
||||||
|
|
||||||
|
class RustTestCase(unittest.TestCase):
|
||||||
|
"""Basic tests to ensure that we can call into Rust code."""
|
||||||
|
|
||||||
|
def test_basic(self):
|
||||||
|
result = sum_as_string(1, 2)
|
||||||
|
self.assertEqual("3", result)
|
Loading…
Reference in New Issue
Block a user