diff --git a/.travis.sh b/.travis.sh index 872a5b19a1..f436601225 100755 --- a/.travis.sh +++ b/.travis.sh @@ -37,6 +37,15 @@ build_and_test() { TZ=UTC0 channel test -v --features serde --lib channel build -v --features serde,rustc-serialize TZ=Asia/Katmandu channel test -v --features serde,rustc-serialize + + channel build -v --no-default-features + TZ=ACST-9:30 channel test -v --no-default-features --lib + channel build -v --no-default-features --features rustc-serialize + TZ=EST4 channel test -v --no-default-features --features rustc-serialize --lib + channel build -v --no-default-features --features serde + TZ=UTC0 channel test -v --no-default-features --features serde --lib + channel build -v --no-default-features --features serde,rustc-serialize + TZ=Asia/Katmandu channel test -v --no-default-features --features serde,rustc-serialize --lib } build_only() { @@ -46,6 +55,7 @@ build_only() { channel build -v channel build -v --features rustc-serialize channel build -v --features 'serde bincode' + channel build -v --no-default-features } run_clippy() { diff --git a/Cargo.toml b/Cargo.toml index 731f11bd6b..defabda891 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,8 +19,12 @@ appveyor = { repository = "chronotope/chrono" } [lib] name = "chrono" +[features] +default = ["local"] +local = ["time"] + [dependencies] -time = "^0.1.36" +time = { version = "^0.1.36", optional = true } num-integer = { version = "0.1.36", default-features = false } num-traits = { version = "0.2", default-features = false } rustc-serialize = { version = "0.3", optional = true } diff --git a/src/datetime.rs b/src/datetime.rs index ec5e85aced..0ba3c8d4a6 100644 --- a/src/datetime.rs +++ b/src/datetime.rs @@ -10,7 +10,9 @@ use std::time::{SystemTime, UNIX_EPOCH}; use oldtime::Duration as OldDuration; use {Weekday, Timelike, Datelike}; -use offset::{TimeZone, Offset, Utc, Local, FixedOffset}; +#[cfg(feature="local")] +use offset::Local; +use offset::{TimeZone, Offset, Utc, FixedOffset}; use naive::{NaiveTime, NaiveDateTime, IsoWeek}; use Date; use format::{Item, Numeric, Pad, Fixed}; @@ -532,6 +534,7 @@ impl str::FromStr for DateTime { } } +#[cfg(feature="local")] impl str::FromStr for DateTime { type Err = ParseError; @@ -558,6 +561,7 @@ impl From for DateTime { } } +#[cfg(feature="local")] impl From for DateTime { fn from(t: SystemTime) -> DateTime { DateTime::::from(t).with_timezone(&Local) @@ -594,7 +598,7 @@ fn test_encodable_json(to_string_utc: FUtc, to_string_fixed: FF Some(r#""2014-07-24T12:34:06+01:00:50""#.into())); } -#[cfg(all(test, any(feature = "rustc-serialize", feature = "serde")))] +#[cfg(all(test, feature="local", any(feature = "rustc-serialize", feature = "serde")))] fn test_decodable_json(utc_from_str: FUtc, fixed_from_str: FFixed, local_from_str: FLocal) @@ -631,7 +635,7 @@ fn test_decodable_json(utc_from_str: FUtc, assert!(fixed_from_str(r#""2014-07-32T12:34:06Z""#).is_err()); } -#[cfg(all(test, feature = "rustc-serialize"))] +#[cfg(all(test, feature="local", feature = "rustc-serialize"))] fn test_decodable_json_timestamps(utc_from_str: FUtc, fixed_from_str: FFixed, local_from_str: FLocal) @@ -665,7 +669,9 @@ pub mod rustc_serialize { use std::fmt; use std::ops::Deref; use super::DateTime; - use offset::{TimeZone, LocalResult, Utc, Local, FixedOffset}; + #[cfg(feature="local")] + use offset::Local; + use offset::{TimeZone, LocalResult, Utc, FixedOffset}; use rustc_serialize::{Encodable, Encoder, Decodable, Decoder}; impl Encodable for DateTime { @@ -739,6 +745,7 @@ pub mod rustc_serialize { } } + #[cfg(feature="local")] impl Decodable for DateTime { fn decode(d: &mut D) -> Result, D::Error> { match d.read_str()?.parse::>() { @@ -748,6 +755,7 @@ pub mod rustc_serialize { } } + #[cfg(feature="local")] impl Decodable for TsSeconds { fn decode(d: &mut D) -> Result, D::Error> { from(Utc.timestamp_opt(d.read_i64()?, 0), d) @@ -762,11 +770,13 @@ pub mod rustc_serialize { super::test_encodable_json(json::encode, json::encode); } + #[cfg(feature="local")] #[test] fn test_decodable() { super::test_decodable_json(json::decode, json::decode, json::decode); } + #[cfg(feature="local")] #[test] fn test_decodable_timestamps() { super::test_decodable_json_timestamps(json::decode, json::decode, json::decode); @@ -779,7 +789,9 @@ pub mod rustc_serialize { pub mod serde { use std::fmt; use super::DateTime; - use offset::{TimeZone, Utc, Local, FixedOffset}; + #[cfg(feature="local")] + use offset::Local; + use offset::{TimeZone, Utc, FixedOffset}; use serdelib::{ser, de}; /// Ser/de to/from timestamps in seconds @@ -1015,6 +1027,7 @@ pub mod serde { /// /// See [the `serde` module](./serde/index.html) for alternate /// serialization formats. + #[cfg(feature="local")] impl<'de> de::Deserialize<'de> for DateTime { fn deserialize(deserializer: D) -> Result where D: de::Deserializer<'de> @@ -1031,6 +1044,7 @@ pub mod serde { super::test_encodable_json(self::serde_json::to_string, self::serde_json::to_string); } + #[cfg(feature="local")] #[test] fn test_serde_deserialize() { super::test_decodable_json(|input| self::serde_json::from_str(&input), |input| self::serde_json::from_str(&input), @@ -1054,9 +1068,12 @@ pub mod serde { #[cfg(test)] mod tests { use super::DateTime; + #[cfg(feature="local")] use Datelike; use naive::{NaiveTime, NaiveDate}; - use offset::{TimeZone, Utc, Local, FixedOffset}; + #[cfg(feature="local")] + use offset::Local; + use offset::{TimeZone, Utc, FixedOffset}; use oldtime::Duration; use std::time::{SystemTime, UNIX_EPOCH}; @@ -1130,6 +1147,7 @@ mod tests { } #[test] + #[cfg(feature="local")] fn test_datetime_with_timezone() { let local_now = Local::now(); let utc_now = local_now.with_timezone(&Utc); @@ -1225,6 +1243,7 @@ mod tests { } #[test] + #[cfg(feature="local")] fn test_datetime_format_with_local() { // if we are not around the year boundary, local and UTC date should have the same year let dt = Local::now().with_month(5).unwrap(); @@ -1232,6 +1251,7 @@ mod tests { } #[test] + #[cfg(feature="local")] fn test_datetime_is_copy() { // UTC is known to be `Copy`. let a = Utc::now(); @@ -1240,6 +1260,7 @@ mod tests { } #[test] + #[cfg(feature="local")] fn test_datetime_is_send() { use std::thread; @@ -1280,7 +1301,9 @@ mod tests { UNIX_EPOCH - Duration::new(999_999_999, 999_999_999)); // DateTime -> SystemTime (via `with_timezone`) - assert_eq!(SystemTime::from(epoch.with_timezone(&Local)), UNIX_EPOCH); + #[cfg(feature="local")] { + assert_eq!(SystemTime::from(epoch.with_timezone(&Local)), UNIX_EPOCH); + } assert_eq!(SystemTime::from(epoch.with_timezone(&FixedOffset::east(32400))), UNIX_EPOCH); assert_eq!(SystemTime::from(epoch.with_timezone(&FixedOffset::west(28800))), UNIX_EPOCH); } diff --git a/src/lib.rs b/src/lib.rs index 6aad9ea2af..abfc697d57 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -396,6 +396,7 @@ // field-init-shorthand, which was stabilized in rust 1.17. #![cfg_attr(feature = "cargo-clippy", allow(const_static_lifetime, redundant_field_names))] +#[cfg(feature="local")] extern crate time as oldtime; extern crate num_integer; extern crate num_traits; @@ -407,7 +408,9 @@ extern crate serde as serdelib; // this reexport is to aid the transition and should not be in the prelude! pub use oldtime::Duration; -#[doc(no_inline)] pub use offset::{TimeZone, Offset, LocalResult, Utc, FixedOffset, Local}; +#[cfg(feature="local")] +#[doc(no_inline)] pub use offset::Local; +#[doc(no_inline)] pub use offset::{TimeZone, Offset, LocalResult, Utc, FixedOffset}; #[doc(no_inline)] pub use naive::{NaiveDate, IsoWeek, NaiveTime, NaiveDateTime}; pub use date::{Date, MIN_DATE, MAX_DATE}; pub use datetime::{DateTime, SecondsFormat}; @@ -419,7 +422,9 @@ pub use round::SubsecRound; pub mod prelude { #[doc(no_inline)] pub use {Datelike, Timelike, Weekday}; #[doc(no_inline)] pub use {TimeZone, Offset}; - #[doc(no_inline)] pub use {Utc, FixedOffset, Local}; + #[cfg(feature="local")] + #[doc(no_inline)] pub use Local; + #[doc(no_inline)] pub use {Utc, FixedOffset}; #[doc(no_inline)] pub use {NaiveDate, NaiveTime, NaiveDateTime}; #[doc(no_inline)] pub use Date; #[doc(no_inline)] pub use {DateTime, SecondsFormat}; @@ -432,6 +437,8 @@ macro_rules! try_opt { } mod div; +#[cfg(not(feature="local"))] +mod oldtime; pub mod offset; pub mod naive { //! Date and time types which do not concern about the timezones. diff --git a/src/offset/mod.rs b/src/offset/mod.rs index f49a688f2a..27d04ed297 100644 --- a/src/offset/mod.rs +++ b/src/offset/mod.rs @@ -371,9 +371,10 @@ pub trait TimeZone: Sized + Clone { mod utc; mod fixed; +#[cfg(feature="local")] mod local; pub use self::utc::Utc; pub use self::fixed::FixedOffset; +#[cfg(feature="local")] pub use self::local::Local; - diff --git a/src/offset/utc.rs b/src/offset/utc.rs index ffdd53e42b..f9f1007151 100644 --- a/src/offset/utc.rs +++ b/src/offset/utc.rs @@ -4,9 +4,11 @@ //! The UTC (Coordinated Universal Time) time zone. use std::fmt; +#[cfg(feature="local")] use oldtime; use naive::{NaiveDate, NaiveDateTime}; +#[cfg(feature="local")] use {Date, DateTime}; use super::{TimeZone, Offset, LocalResult, FixedOffset}; @@ -30,6 +32,7 @@ use super::{TimeZone, Offset, LocalResult, FixedOffset}; #[derive(Copy, Clone, PartialEq, Eq)] pub struct Utc; +#[cfg(feature="local")] impl Utc { /// Returns a `Date` which corresponds to the current date. pub fn today() -> Date { Utc::now().date() }