Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optionally remove time crate dependency #137

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions .travis.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,20 @@ build_and_test() {
TZ=ACST-9:30 channel test -v --lib
channel build -v --features rustc-serialize
TZ=EST4 channel test -v --features rustc-serialize --lib
channel build -v --features 'serde bincode'
TZ=UTC0 channel test -v --features 'serde bincode'
channel build -v --features serde
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

# without default "clock" feature
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() {
Expand All @@ -44,6 +56,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() {
Expand Down
6 changes: 5 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@ appveyor = { repository = "chronotope/chrono" }
[lib]
name = "chrono"

[features]
default = ["clock"]
clock = ["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 }
Expand Down
37 changes: 30 additions & 7 deletions src/datetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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="clock")]
use offset::Local;
use offset::{TimeZone, Offset, Utc, FixedOffset};
use naive::{NaiveTime, NaiveDateTime, IsoWeek};
use Date;
use format::{Item, Numeric, Pad, Fixed};
Expand Down Expand Up @@ -532,6 +534,7 @@ impl str::FromStr for DateTime<Utc> {
}
}

#[cfg(feature="clock")]
impl str::FromStr for DateTime<Local> {
type Err = ParseError;

Expand All @@ -558,6 +561,7 @@ impl From<SystemTime> for DateTime<Utc> {
}
}

#[cfg(feature="clock")]
impl From<SystemTime> for DateTime<Local> {
fn from(t: SystemTime) -> DateTime<Local> {
DateTime::<Utc>::from(t).with_timezone(&Local)
Expand Down Expand Up @@ -594,7 +598,7 @@ fn test_encodable_json<FUtc, FFixed, E>(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="clock", any(feature = "rustc-serialize", feature = "serde")))]
fn test_decodable_json<FUtc, FFixed, FLocal, E>(utc_from_str: FUtc,
fixed_from_str: FFixed,
local_from_str: FLocal)
Expand Down Expand Up @@ -631,7 +635,7 @@ fn test_decodable_json<FUtc, FFixed, FLocal, E>(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="clock", feature = "rustc-serialize"))]
fn test_decodable_json_timestamps<FUtc, FFixed, FLocal, E>(utc_from_str: FUtc,
fixed_from_str: FFixed,
local_from_str: FLocal)
Expand Down Expand Up @@ -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="clock")]
use offset::Local;
use offset::{TimeZone, LocalResult, Utc, FixedOffset};
use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};

impl<Tz: TimeZone> Encodable for DateTime<Tz> {
Expand Down Expand Up @@ -739,6 +745,7 @@ pub mod rustc_serialize {
}
}

#[cfg(feature="clock")]
impl Decodable for DateTime<Local> {
fn decode<D: Decoder>(d: &mut D) -> Result<DateTime<Local>, D::Error> {
match d.read_str()?.parse::<DateTime<FixedOffset>>() {
Expand All @@ -748,6 +755,7 @@ pub mod rustc_serialize {
}
}

#[cfg(feature="clock")]
impl Decodable for TsSeconds<Local> {
fn decode<D: Decoder>(d: &mut D) -> Result<TsSeconds<Local>, D::Error> {
from(Utc.timestamp_opt(d.read_i64()?, 0), d)
Expand All @@ -762,11 +770,13 @@ pub mod rustc_serialize {
super::test_encodable_json(json::encode, json::encode);
}

#[cfg(feature="clock")]
#[test]
fn test_decodable() {
super::test_decodable_json(json::decode, json::decode, json::decode);
}

#[cfg(feature="clock")]
#[test]
fn test_decodable_timestamps() {
super::test_decodable_json_timestamps(json::decode, json::decode, json::decode);
Expand All @@ -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="clock")]
use offset::Local;
use offset::{TimeZone, Utc, FixedOffset};
use serdelib::{ser, de};

/// Ser/de to/from timestamps in seconds
Expand Down Expand Up @@ -1015,6 +1027,7 @@ pub mod serde {
///
/// See [the `serde` module](./serde/index.html) for alternate
/// serialization formats.
#[cfg(feature="clock")]
impl<'de> de::Deserialize<'de> for DateTime<Local> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: de::Deserializer<'de>
Expand All @@ -1031,6 +1044,7 @@ pub mod serde {
super::test_encodable_json(self::serde_json::to_string, self::serde_json::to_string);
}

#[cfg(feature="clock")]
#[test]
fn test_serde_deserialize() {
super::test_decodable_json(|input| self::serde_json::from_str(&input), |input| self::serde_json::from_str(&input),
Expand All @@ -1054,9 +1068,12 @@ pub mod serde {
#[cfg(test)]
mod tests {
use super::DateTime;
#[cfg(feature="clock")]
use Datelike;
use naive::{NaiveTime, NaiveDate};
use offset::{TimeZone, Utc, Local, FixedOffset};
#[cfg(feature="clock")]
use offset::Local;
use offset::{TimeZone, Utc, FixedOffset};
use oldtime::Duration;
use std::time::{SystemTime, UNIX_EPOCH};

Expand Down Expand Up @@ -1130,6 +1147,7 @@ mod tests {
}

#[test]
#[cfg(feature="clock")]
fn test_datetime_with_timezone() {
let local_now = Local::now();
let utc_now = local_now.with_timezone(&Utc);
Expand Down Expand Up @@ -1225,13 +1243,15 @@ mod tests {
}

#[test]
#[cfg(feature="clock")]
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();
assert_eq!(dt.format("%Y").to_string(), dt.with_timezone(&Utc).format("%Y").to_string());
}

#[test]
#[cfg(feature="clock")]
fn test_datetime_is_copy() {
// UTC is known to be `Copy`.
let a = Utc::now();
Expand All @@ -1240,6 +1260,7 @@ mod tests {
}

#[test]
#[cfg(feature="clock")]
fn test_datetime_is_send() {
use std::thread;

Expand Down Expand Up @@ -1280,7 +1301,9 @@ mod tests {
UNIX_EPOCH - Duration::new(999_999_999, 999_999_999));

// DateTime<any tz> -> SystemTime (via `with_timezone`)
assert_eq!(SystemTime::from(epoch.with_timezone(&Local)), UNIX_EPOCH);
#[cfg(feature="clock")] {
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);
}
Expand Down
11 changes: 9 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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="clock")]
extern crate time as oldtime;
extern crate num_integer;
extern crate num_traits;
Expand All @@ -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="clock")]
#[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};
Expand All @@ -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="clock")]
#[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};
Expand All @@ -432,6 +437,8 @@ macro_rules! try_opt {
}

mod div;
#[cfg(not(feature="clock"))]
mod oldtime;
pub mod offset;
pub mod naive {
//! Date and time types which do not concern about the timezones.
Expand Down
3 changes: 2 additions & 1 deletion src/offset/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -371,9 +371,10 @@ pub trait TimeZone: Sized + Clone {

mod utc;
mod fixed;
#[cfg(feature="clock")]
mod local;

pub use self::utc::Utc;
pub use self::fixed::FixedOffset;
#[cfg(feature="clock")]
pub use self::local::Local;

3 changes: 3 additions & 0 deletions src/offset/utc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
//! The UTC (Coordinated Universal Time) time zone.

use std::fmt;
#[cfg(feature="clock")]
use oldtime;

use naive::{NaiveDate, NaiveDateTime};
#[cfg(feature="clock")]
use {Date, DateTime};
use super::{TimeZone, Offset, LocalResult, FixedOffset};

Expand All @@ -30,6 +32,7 @@ use super::{TimeZone, Offset, LocalResult, FixedOffset};
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct Utc;

#[cfg(feature="clock")]
impl Utc {
/// Returns a `Date` which corresponds to the current date.
pub fn today() -> Date<Utc> { Utc::now().date() }
Expand Down
Loading