diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 5b62966..8fd8458 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -6,7 +6,7 @@ jobs: audit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - uses: actions-rs/audit-check@v1 with: token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 59c2e0d..7dea5f4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,107 +1,124 @@ -name: Continuous integration +name: CI -on: [push, pull_request] +on: + pull_request: + push: + branches: + - master jobs: - test: - name: Test + rustfmt: + name: rustfmt / stable runs-on: ubuntu-latest - strategy: - matrix: - rust: - - stable - - beta - - 1.45.2 - steps: - - uses: actions/checkout@v1 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: ${{ matrix.rust }} - override: true - - run: sudo DEBIAN_FRONTEND=noninteractive apt-get update - - run: sudo DEBIAN_FRONTEND=noninteractive apt-get -y install postfix - - run: smtp-sink 2525 1000& - - uses: actions-rs/cargo@v1 - with: - command: test - args: --no-default-features --features=native-tls,builder,r2d2,smtp-transport,file-transport,sendmail-transport - - run: rm target/debug/deps/liblettre-* - - uses: actions-rs/cargo@v1 - with: - command: test - - run: rm target/debug/deps/liblettre-* - - uses: actions-rs/cargo@v1 - with: - command: test - args: --no-default-features --features=builder,smtp-transport,file-transport,sendmail-transport - - run: rm target/debug/deps/liblettre-* - - uses: actions-rs/cargo@v1 - with: - command: test - args: --features=async-std1 - - uses: actions-rs/cargo@v1 - with: - command: test - args: --features=tokio02 - - uses: actions-rs/cargo@v1 - with: - command: test - args: --features=tokio03 - check: - name: Check - runs-on: ubuntu-latest - strategy: - matrix: - rust: - - stable - - beta - - 1.45.2 steps: - - uses: actions/checkout@v1 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: ${{ matrix.rust }} - override: true - - uses: actions-rs/cargo@v1 - with: - command: check + - name: Checkout + uses: actions/checkout@v2 - fmt: - name: Rustfmt - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check + - name: Install rust + run: | + rustup update --no-self-update stable + rustup component add rustfmt + + - name: cargo fmt + run: cargo fmt --all -- --check clippy: - name: Clippy + name: clippy / stable runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Install rust + run: | + rustup update --no-self-update stable + rustup component add clippy + + - name: Run clippy + run: cargo clippy --all-features --all-targets -- -D warnings + + check: + name: check / stable + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup cache + uses: actions/cache@v2 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-check + + - name: Install rust + run: rustup update --no-self-update stable + + - name: Install cargo hack + run: cargo install cargo-hack --debug + + - name: Check with cargo hack + run: cargo hack check --feature-powerset --depth 3 + + test: + name: test / ${{ matrix.name }} + runs-on: ubuntu-latest + strategy: matrix: - rust: - - stable - steps: - - uses: actions/checkout@v1 - - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ matrix.rust }} - override: true - - uses: actions-rs/cargo@v1 - with: - command: clippy - args: -- -D warnings + include: + - name: stable + rust: stable + - name: beta + rust: beta + - name: 1.45.2 + rust: 1.45.2 + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup cache + uses: actions/cache@v2 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-test-${{ matrix.rust }} + + - name: Install rust + run: | + rustup default ${{ matrix.rust }} + rustup update --no-self-update ${{ matrix.rust }} + + - name: Install postfix + run: | + DEBIAN_FRONTEND=noninteractive sudo apt-get update + DEBIAN_FRONTEND=noninteractive sudo apt-get -y install postfix + + - name: Run SMTP server + run: smtp-sink 2525 1000& + + - name: Test with no default features + run: cargo test --no-default-features + + - name: Test with default features + run: cargo test + + - name: Test with all features + run: cargo test --all-features + # coverage: # name: Coverage # runs-on: ubuntu-latest # steps: -# - uses: actions/checkout@v1 +# - uses: actions/checkout@v2 # - uses: actions-rs/toolchain@v1 # with: # toolchain: nightly diff --git a/Cargo.toml b/Cargo.toml index 0b48699..b27fb65 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -102,33 +102,33 @@ rustdoc-args = ["--cfg", "docsrs"] [[example]] name = "smtp" -required-features = ["smtp-transport"] +required-features = ["smtp-transport", "builder"] [[example]] name = "smtp_tls" -required-features = ["smtp-transport", "native-tls"] +required-features = ["smtp-transport", "native-tls", "builder"] [[example]] name = "smtp_starttls" -required-features = ["smtp-transport", "native-tls"] +required-features = ["smtp-transport", "native-tls", "builder"] [[example]] name = "smtp_selfsigned" -required-features = ["smtp-transport", "native-tls"] +required-features = ["smtp-transport", "native-tls", "builder"] [[example]] name = "tokio02_smtp_tls" -required-features = ["smtp-transport", "tokio02", "tokio02-native-tls"] +required-features = ["smtp-transport", "tokio02", "tokio02-native-tls", "builder"] [[example]] name = "tokio02_smtp_starttls" -required-features = ["smtp-transport", "tokio02", "tokio02-native-tls"] +required-features = ["smtp-transport", "tokio02", "tokio02-native-tls", "builder"] [[example]] name = "tokio03_smtp_tls" -required-features = ["smtp-transport", "tokio03", "tokio03-native-tls"] +required-features = ["smtp-transport", "tokio03", "tokio03-native-tls", "builder"] [[example]] name = "tokio03_smtp_starttls" -required-features = ["smtp-transport", "tokio03", "tokio03-native-tls"] +required-features = ["smtp-transport", "tokio03", "tokio03-native-tls", "builder"] diff --git a/src/lib.rs b/src/lib.rs index 1178488..1ac63b7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -163,6 +163,7 @@ pub trait Tokio03Transport { } #[cfg(test)] +#[cfg(feature = "builder")] mod test { use super::*; use crate::message::{header, Mailbox, Mailboxes}; diff --git a/src/transport/file/mod.rs b/src/transport/file/mod.rs index 058f4ab..711641b 100644 --- a/src/transport/file/mod.rs +++ b/src/transport/file/mod.rs @@ -5,11 +5,13 @@ //! ## Sync example //! //! ```rust +//! # use std::error::Error; +//! +//! # #[cfg(all(feature = "file-transport", feature = "builder"))] +//! # fn main() -> Result<(), Box> { //! use std::env::temp_dir; //! use lettre::{Transport, Message, FileTransport}; //! -//! # use std::error::Error; -//! # fn main() -> Result<(), Box> { //! // Write to the local temp directory //! let sender = FileTransport::new(temp_dir()); //! let email = Message::builder() @@ -23,13 +25,18 @@ //! assert!(result.is_ok()); //! # Ok(()) //! # } +//! +//! # #[cfg(not(all(feature = "file-transport", feature = "builder")))] +//! # fn main() {} //! ``` //! +//! //! ## Async tokio 0.2 //! -//! ```rust +//! ```rust,no_run //! # use std::error::Error; -//! # #[cfg(feature = "tokio02")] +//! +//! # #[cfg(all(feature = "tokio02", feature = "file-transport", feature = "builder"))] //! # async fn run() -> Result<(), Box> { //! use std::env::temp_dir; //! use lettre::{Tokio02Transport, Message, FileTransport}; @@ -51,9 +58,10 @@ //! //! ## Async async-std 1.x //! -//! ```rust +//! ```rust,no_run //! # use std::error::Error; -//! # #[cfg(feature = "async-std1")] +//! +//! # #[cfg(all(feature = "async-std1", feature = "file-transport", feature = "builder"))] //! # async fn run() -> Result<(), Box> { //! use std::env::temp_dir; //! use lettre::{AsyncStd1Transport, Message, FileTransport}; diff --git a/src/transport/sendmail/mod.rs b/src/transport/sendmail/mod.rs index 6c1450f..5a20f1b 100644 --- a/src/transport/sendmail/mod.rs +++ b/src/transport/sendmail/mod.rs @@ -3,10 +3,12 @@ //! ## Sync example //! //! ```rust -//! use lettre::{Message, Transport, SendmailTransport}; -//! //! # use std::error::Error; +//! +//! # #[cfg(all(feature = "sendmail-transport", feature = "builder"))] //! # fn main() -> Result<(), Box> { +//! # use lettre::{Message, Transport, SendmailTransport}; +//! //! let email = Message::builder() //! .from("NoBody ".parse()?) //! .reply_to("Yuin ".parse()?) @@ -19,13 +21,17 @@ //! assert!(result.is_ok()); //! # Ok(()) //! # } +//! +//! # #[cfg(not(all(feature = "sendmail-transport", feature = "builder")))] +//! # fn main() {} //! ``` //! //! ## Async tokio 0.2 example //! -//! ```rust +//! ```rust,no_run //! # use std::error::Error; -//! # #[cfg(feature = "tokio02")] +//! +//! # #[cfg(all(feature = "tokio02", feature = "sendmail-transport", feature = "builder"))] //! # async fn run() -> Result<(), Box> { //! use lettre::{Message, Tokio02Transport, SendmailTransport}; //! @@ -45,9 +51,10 @@ //! //! ## Async async-std 1.x example //! -//!```rust +//!```rust,no_run //! # use std::error::Error; -//! # #[cfg(feature = "async-std1")] +//! +//! # #[cfg(all(feature = "async-std1", feature = "sendmail-transport", feature = "builder"))] //! # async fn run() -> Result<(), Box> { //! use lettre::{Message, AsyncStd1Transport, SendmailTransport}; //! diff --git a/src/transport/smtp/client/async_net.rs b/src/transport/smtp/client/async_net.rs index b8ac910..c565172 100644 --- a/src/transport/smtp/client/async_net.rs +++ b/src/transport/smtp/client/async_net.rs @@ -1,4 +1,4 @@ -#[cfg(feature = "tokio02-rustls-tls")] +#[cfg(any(feature = "tokio02-rustls-tls", feature = "tokio03-rustls-tls"))] use std::sync::Arc; use std::{ net::{Shutdown, SocketAddr}, diff --git a/src/transport/smtp/client/mod.rs b/src/transport/smtp/client/mod.rs index 1168ce4..3d7f23e 100644 --- a/src/transport/smtp/client/mod.rs +++ b/src/transport/smtp/client/mod.rs @@ -3,8 +3,9 @@ //! `SmtpConnection` allows manually sending SMTP commands. //! //! ```rust,no_run -//! # #[cfg(feature = "smtp-transport")] //! # use std::error::Error; +//! +//! # #[cfg(feature = "smtp-transport")] //! # fn main() -> Result<(), Box> { //! use lettre::transport::smtp::{SMTP_PORT, extension::ClientId, commands::*, client::SmtpConnection}; //! diff --git a/src/transport/smtp/mod.rs b/src/transport/smtp/mod.rs index 1e84bab..8320df1 100644 --- a/src/transport/smtp/mod.rs +++ b/src/transport/smtp/mod.rs @@ -31,7 +31,7 @@ //! This is the most basic example of usage: //! //! ```rust,no_run -//! # #[cfg(any(feature = "native-tls", feature = "rustls-tls"))] +//! # #[cfg(all(feature = "builder", any(feature = "native-tls", feature = "rustls-tls")))] //! # fn test() -> Result<(), Box> { //! use lettre::{Message, Transport, SmtpTransport}; //! @@ -164,6 +164,7 @@ pub use self::async_transport::{ }; #[cfg(feature = "r2d2")] pub use self::pool::PoolConfig; +#[cfg(feature = "r2d2")] pub(crate) use self::transport::SmtpClient; pub use self::{ error::Error, diff --git a/src/transport/stub/mod.rs b/src/transport/stub/mod.rs index 89aaa0c..008aee9 100644 --- a/src/transport/stub/mod.rs +++ b/src/transport/stub/mod.rs @@ -7,6 +7,8 @@ //! testing purposes. //! //! ```rust +//! # #[cfg(feature = "builder")] +//! # { //! use lettre::{Message, Transport}; //! use lettre::transport::stub::StubTransport; //! @@ -24,6 +26,7 @@ //! assert!(result.is_ok()); //! # Ok(()) //! # } +//! # } //! ``` use crate::address::Envelope; diff --git a/tests/transport_file.rs b/tests/transport_file.rs index 8fd5084..8f33f97 100644 --- a/tests/transport_file.rs +++ b/tests/transport_file.rs @@ -1,5 +1,5 @@ #[cfg(test)] -#[cfg(feature = "file-transport")] +#[cfg(all(feature = "file-transport", feature = "builder"))] mod test { use lettre::{transport::file::FileTransport, Message}; use std::{ diff --git a/tests/transport_sendmail.rs b/tests/transport_sendmail.rs index becc470..99c68d3 100644 --- a/tests/transport_sendmail.rs +++ b/tests/transport_sendmail.rs @@ -1,5 +1,5 @@ #[cfg(test)] -#[cfg(feature = "sendmail-transport")] +#[cfg(all(feature = "sendmail-transport", feature = "builder"))] mod test { use lettre::{transport::sendmail::SendmailTransport, Message}; diff --git a/tests/transport_smtp.rs b/tests/transport_smtp.rs index 3dad588..49620d4 100644 --- a/tests/transport_smtp.rs +++ b/tests/transport_smtp.rs @@ -1,5 +1,5 @@ #[cfg(test)] -#[cfg(feature = "smtp-transport")] +#[cfg(all(feature = "smtp-transport", feature = "builder"))] mod test { use lettre::{Message, SmtpTransport, Transport}; diff --git a/tests/transport_stub.rs b/tests/transport_stub.rs index 6bd7286..01691fa 100644 --- a/tests/transport_stub.rs +++ b/tests/transport_stub.rs @@ -1,61 +1,65 @@ -use lettre::{transport::stub::StubTransport, Message}; +#[cfg(test)] +#[cfg(feature = "builder")] +mod test { + use lettre::{transport::stub::StubTransport, Message}; -#[cfg(feature = "tokio02")] -use tokio02_crate as tokio; + #[cfg(feature = "tokio02")] + use tokio02_crate as tokio; -#[test] -fn stub_transport() { - use lettre::Transport; - let sender_ok = StubTransport::new_ok(); - let sender_ko = StubTransport::new_error(); - let email = Message::builder() - .from("NoBody ".parse().unwrap()) - .reply_to("Yuin ".parse().unwrap()) - .to("Hei ".parse().unwrap()) - .subject("Happy new year") - .body("Be happy!") - .unwrap(); + #[test] + fn stub_transport() { + use lettre::Transport; + let sender_ok = StubTransport::new_ok(); + let sender_ko = StubTransport::new_error(); + let email = Message::builder() + .from("NoBody ".parse().unwrap()) + .reply_to("Yuin ".parse().unwrap()) + .to("Hei ".parse().unwrap()) + .subject("Happy new year") + .body("Be happy!") + .unwrap(); - sender_ok.send(&email).unwrap(); - sender_ko.send(&email).unwrap_err(); -} - -#[cfg(feature = "async-std1")] -#[async_attributes::test] -async fn stub_transport_asyncstd1() { - use lettre::AsyncStd1Transport; - - let sender_ok = StubTransport::new_ok(); - let sender_ko = StubTransport::new_error(); - let email = Message::builder() - .from("NoBody ".parse().unwrap()) - .reply_to("Yuin ".parse().unwrap()) - .to("Hei ".parse().unwrap()) - .subject("Happy new year") - .date("Tue, 15 Nov 1994 08:12:31 GMT".parse().unwrap()) - .body("Be happy!") - .unwrap(); - - sender_ok.send(email.clone()).await.unwrap(); - sender_ko.send(email).await.unwrap_err(); -} - -#[cfg(feature = "tokio02")] -#[tokio::test] -async fn stub_transport_tokio02() { - use lettre::Tokio02Transport; - - let sender_ok = StubTransport::new_ok(); - let sender_ko = StubTransport::new_error(); - let email = Message::builder() - .from("NoBody ".parse().unwrap()) - .reply_to("Yuin ".parse().unwrap()) - .to("Hei ".parse().unwrap()) - .subject("Happy new year") - .date("Tue, 15 Nov 1994 08:12:31 GMT".parse().unwrap()) - .body("Be happy!") - .unwrap(); - - sender_ok.send(email.clone()).await.unwrap(); - sender_ko.send(email).await.unwrap_err(); + sender_ok.send(&email).unwrap(); + sender_ko.send(&email).unwrap_err(); + } + + #[cfg(feature = "async-std1")] + #[async_attributes::test] + async fn stub_transport_asyncstd1() { + use lettre::AsyncStd1Transport; + + let sender_ok = StubTransport::new_ok(); + let sender_ko = StubTransport::new_error(); + let email = Message::builder() + .from("NoBody ".parse().unwrap()) + .reply_to("Yuin ".parse().unwrap()) + .to("Hei ".parse().unwrap()) + .subject("Happy new year") + .date("Tue, 15 Nov 1994 08:12:31 GMT".parse().unwrap()) + .body("Be happy!") + .unwrap(); + + sender_ok.send(email.clone()).await.unwrap(); + sender_ko.send(email).await.unwrap_err(); + } + + #[cfg(feature = "tokio02")] + #[tokio::test] + async fn stub_transport_tokio02() { + use lettre::Tokio02Transport; + + let sender_ok = StubTransport::new_ok(); + let sender_ko = StubTransport::new_error(); + let email = Message::builder() + .from("NoBody ".parse().unwrap()) + .reply_to("Yuin ".parse().unwrap()) + .to("Hei ".parse().unwrap()) + .subject("Happy new year") + .date("Tue, 15 Nov 1994 08:12:31 GMT".parse().unwrap()) + .body("Be happy!") + .unwrap(); + + sender_ok.send(email.clone()).await.unwrap(); + sender_ko.send(email).await.unwrap_err(); + } }