Skip to content

Commit

Permalink
Move macros into separate feature.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
m-ou-se committed May 4, 2020
1 parent 0f07cf8 commit ada41c1
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 20 deletions.
4 changes: 3 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand Down
13 changes: 7 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ 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 }
num-traits = "0.2.8"
parking_lot = { version = "0.10.2" }
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"
Expand All @@ -41,7 +41,8 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

[features]
default = []
default = ["macros"]
macros = ["indoc", "inventory", "paste", "pyo3cls", "unindent"]

# this is no longer needed internally, but setuptools-rust assumes this feature
python3 = []
Expand Down
10 changes: 10 additions & 0 deletions src/class/methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,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;
Expand All @@ -130,6 +131,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;
Expand All @@ -142,3 +144,11 @@ pub trait PyMethodsImpl {
.collect()
}
}

#[doc(hidden)]
#[cfg(not(feature = "macros"))]
pub trait PyMethodsImpl {
fn py_methods() -> Vec<&'static PyMethodDefType> {
Vec::new()
}
}
22 changes: 11 additions & 11 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,21 +152,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 {
paste, // Re-exported for wrap_function
indoc, // Re-exported for py_run
inventory, // Re-exported for pymethods
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)]
Expand Down Expand Up @@ -199,6 +196,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
Expand Down Expand Up @@ -280,6 +278,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))
Expand All @@ -291,6 +290,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;
Expand Down
4 changes: 2 additions & 2 deletions src/prelude.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,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};

0 comments on commit ada41c1

Please sign in to comment.