Move macros into separate feature.

It's enabled by default to avoid breakage, but this allows compiling
pyo3 with a lot less dependencies in case the macros are not needed.
This commit is contained in:
Mara Bos 2020-05-04 17:02:10 +02:00
parent 818ebf7ddf
commit dab8c2e4e7
5 changed files with 33 additions and 20 deletions

View File

@ -28,7 +28,9 @@ jobs:
toolchain: nightly
default: true
- run: rustup set default-host ${{ matrix.platform.rust-target }}
- name: Build
- name: Build without default features
run: cargo build --no-default-features --verbose
- name: Build with default features
run: cargo build --verbose
- name: Install test dependencies
run: |

View File

@ -19,14 +19,14 @@ travis-ci = { repository = "PyO3/pyo3", branch = "master" }
appveyor = { repository = "fafhrd91/pyo3" }
[dependencies]
indoc = "0.3.4"
inventory = "0.1.4"
indoc = { version = "0.3.4", optional = true }
inventory = { version = "0.1.4", optional = true }
libc = "0.2.62"
num-bigint = { version = "0.2", optional = true }
num-complex = { version = "0.2", optional = true }
paste = "0.1.6"
pyo3cls = { path = "pyo3cls", version = "=0.9.2" }
unindent = "0.1.4"
paste = { version = "0.1.6", optional = true }
pyo3cls = { path = "pyo3cls", version = "=0.9.2", optional = true }
unindent = { version = "0.1.4", optional = true }
[dev-dependencies]
assert_approx_eq = "1.1.0"
@ -36,7 +36,8 @@ trybuild = "1.0.23"
version_check = "0.9.1"
[features]
default = []
default = ["macros"]
macros = ["indoc", "inventory", "paste", "pyo3cls", "unindent"]
# this is no longer needed internally, but setuptools-rust assumes this feature
python3 = []

View File

@ -138,6 +138,7 @@ impl PySetterDef {
/// Allows arbitrary pymethod blocks to submit their methods, which are eventually
/// collected by pyclass.
#[doc(hidden)]
#[cfg(feature = "macros")]
pub trait PyMethodsInventory: inventory::Collect {
/// Create a new instance
fn new(methods: &'static [PyMethodDefType]) -> Self;
@ -149,6 +150,7 @@ pub trait PyMethodsInventory: inventory::Collect {
/// Implementation detail. Only to be used through the proc macros.
/// For pyclass derived structs, this trait collects method from all impl blocks using inventory.
#[doc(hidden)]
#[cfg(feature = "macros")]
pub trait PyMethodsImpl {
/// Normal methods. Mainly defined by `#[pymethod]`.
type Methods: PyMethodsInventory;
@ -161,3 +163,11 @@ pub trait PyMethodsImpl {
.collect()
}
}
#[doc(hidden)]
#[cfg(not(feature = "macros"))]
pub trait PyMethodsImpl {
fn py_methods() -> Vec<&'static PyMethodDefType> {
Vec::new()
}
}

View File

@ -150,21 +150,18 @@ pub use crate::type_object::{type_flags, PyTypeInfo};
// Since PyAny is as important as PyObject, we expose it to the top level.
pub use crate::types::PyAny;
// Re-exported for wrap_function
#[cfg(feature = "macros")]
#[doc(hidden)]
pub use paste;
// Re-exported for py_run
#[doc(hidden)]
pub use indoc;
// Re-exported for pymethods
#[doc(hidden)]
pub use inventory;
pub use {
indoc, // Re-exported for py_run
inventory, // Re-exported for pymethods
paste, // Re-exported for wrap_function
unindent, // Re-exported for py_run
};
// Re-exported for the `__wrap` functions
#[doc(hidden)]
pub use libc;
// Re-exported for py_run
#[doc(hidden)]
pub use unindent;
pub mod buffer;
#[doc(hidden)]
@ -197,6 +194,7 @@ pub mod type_object;
pub mod types;
/// The proc macros, which are also part of the prelude.
#[cfg(feature = "macros")]
pub mod proc_macro {
pub use pyo3cls::pymodule;
/// The proc macro attributes
@ -278,6 +276,7 @@ macro_rules! wrap_pymodule {
/// If you need to handle failures, please use [Python::run] directly.
///
#[macro_export]
#[cfg(feature = "macros")]
macro_rules! py_run {
($py:expr, $($val:ident)+, $code:literal) => {{
pyo3::py_run_impl!($py, $($val)+, pyo3::indoc::indoc!($code))
@ -289,6 +288,7 @@ macro_rules! py_run {
#[macro_export]
#[doc(hidden)]
#[cfg(feature = "macros")]
macro_rules! py_run_impl {
($py:expr, $($val:ident)+, $code:expr) => {{
use pyo3::types::IntoPyDict;

View File

@ -20,5 +20,5 @@ pub use crate::python::Python;
pub use crate::{FromPy, FromPyObject, IntoPy, IntoPyPointer, PyTryFrom, PyTryInto, ToPyObject};
// PyModule is only part of the prelude because we need it for the pymodule function
pub use crate::types::{PyAny, PyModule};
pub use pyo3cls::pymodule;
pub use pyo3cls::{pyclass, pyfunction, pymethods, pyproto};
#[cfg(feature = "macros")]
pub use pyo3cls::{pyclass, pyfunction, pymethods, pymodule, pyproto};