1
0
mirror of https://github.com/bspeice/dtparse synced 2025-07-03 14:54:57 -04:00

2 Commits

Author SHA1 Message Date
ef3ea38834 Release version 1.0.3 2018-09-18 23:04:07 -04:00
741afa3451 Remove a last println and use a static default parser
Heap profilers are fun
2018-09-17 23:14:50 -04:00
7 changed files with 20 additions and 10 deletions

View File

@ -1,3 +1,11 @@
Version 1.0.3 (2018-09-18)
==========================
Misc
----
- Changed the default `parse` function to use a static parser
Version 1.0.2 (2018-08-14) Version 1.0.2 (2018-08-14)
========================== ==========================

View File

@ -1,6 +1,6 @@
[package] [package]
name = "dtparse" name = "dtparse"
version = "1.0.2" version = "1.0.3"
authors = ["Bradlee Speice <bradlee@speice.io>"] authors = ["Bradlee Speice <bradlee@speice.io>"]
description = "A dateutil-compatible timestamp parser for Rust" description = "A dateutil-compatible timestamp parser for Rust"
repository = "https://github.com/bspeice/dtparse.git" repository = "https://github.com/bspeice/dtparse.git"

5
build_pycompat.py Normal file → Executable file
View File

@ -1,3 +1,4 @@
#!/usr/bin/python3
from dateutil.parser import parse from dateutil.parser import parse
from dateutil.tz import tzutc from dateutil.tz import tzutc
from datetime import datetime from datetime import datetime
@ -232,7 +233,7 @@ fn parse_and_assert(
tzinfos: &HashMap<String, i32>, tzinfos: &HashMap<String, i32>,
) { ) {
let mut parser = Parser::new(info); let parser = Parser::new(info);
let rs_parsed = parser.parse( let rs_parsed = parser.parse(
s, s,
dayfirst, dayfirst,
@ -282,7 +283,7 @@ fn parse_fuzzy_and_assert(
tzinfos: &HashMap<String, i32>, tzinfos: &HashMap<String, i32>,
) { ) {
let mut parser = Parser::new(info); let parser = Parser::new(info);
let rs_parsed = parser.parse( let rs_parsed = parser.parse(
s, s,
dayfirst, dayfirst,

1
build_pycompat_tokenizer.py Normal file → Executable file
View File

@ -1,3 +1,4 @@
#!/usr/bin/python3
from dateutil.parser import _timelex from dateutil.parser import _timelex
from build_pycompat import tests from build_pycompat import tests

View File

@ -108,6 +108,7 @@ lazy_static! {
static ref ONE: Decimal = Decimal::new(1, 0); static ref ONE: Decimal = Decimal::new(1, 0);
static ref TWENTY_FOUR: Decimal = Decimal::new(24, 0); static ref TWENTY_FOUR: Decimal = Decimal::new(24, 0);
static ref SIXTY: Decimal = Decimal::new(60, 0); static ref SIXTY: Decimal = Decimal::new(60, 0);
static ref DEFAULT_PARSER: Parser = Parser::default();
} }
impl From<DecimalError> for ParseError { impl From<DecimalError> for ParseError {
@ -670,7 +671,7 @@ impl Parser {
/// order to be resolved. /// order to be resolved.
#[cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))] // Need to release a 2.0 for changing public API #[cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))] // Need to release a 2.0 for changing public API
pub fn parse( pub fn parse(
&mut self, &self,
timestr: &str, timestr: &str,
dayfirst: Option<bool>, dayfirst: Option<bool>,
yearfirst: Option<bool>, yearfirst: Option<bool>,
@ -699,7 +700,7 @@ impl Parser {
#[cfg_attr(feature = "cargo-clippy", allow(cyclomatic_complexity))] // Imitating Python API is priority #[cfg_attr(feature = "cargo-clippy", allow(cyclomatic_complexity))] // Imitating Python API is priority
fn parse_with_tokens( fn parse_with_tokens(
&mut self, &self,
timestr: &str, timestr: &str,
dayfirst: Option<bool>, dayfirst: Option<bool>,
yearfirst: Option<bool>, yearfirst: Option<bool>,
@ -953,7 +954,6 @@ impl Parser {
) -> ParseResult<Option<FixedOffset>> { ) -> ParseResult<Option<FixedOffset>> {
// TODO: Actual timezone support // TODO: Actual timezone support
if let Some(offset) = res.tzoffset { if let Some(offset) = res.tzoffset {
println!("offset={}", offset);
Ok(Some(FixedOffset::east(offset))) Ok(Some(FixedOffset::east(offset)))
} else if res.tzoffset == None } else if res.tzoffset == None
&& (res.tzname == Some(" ".to_owned()) || res.tzname == Some(".".to_owned()) && (res.tzname == Some(" ".to_owned()) || res.tzname == Some(".".to_owned())
@ -1283,7 +1283,7 @@ fn ljust(s: &str, chars: usize, replace: char) -> String {
/// The default implementation assumes English values for names of months, /// The default implementation assumes English values for names of months,
/// days of the week, etc. It is equivalent to Python's `dateutil.parser.parse()` /// days of the week, etc. It is equivalent to Python's `dateutil.parser.parse()`
pub fn parse(timestr: &str) -> ParseResult<(NaiveDateTime, Option<FixedOffset>)> { pub fn parse(timestr: &str) -> ParseResult<(NaiveDateTime, Option<FixedOffset>)> {
let res = Parser::default().parse( let res = DEFAULT_PARSER.parse(
timestr, timestr,
None, None,
None, None,

View File

@ -16,7 +16,7 @@ fn test_fuzz() {
// OverflowError: Python int too large to convert to C long // OverflowError: Python int too large to convert to C long
// assert_eq!(parse("8888884444444888444444444881"), Err(ParseError::AmPmWithoutHour)); // assert_eq!(parse("8888884444444888444444444881"), Err(ParseError::AmPmWithoutHour));
let default = NaiveDate::from_ymd(2016, 6, 29).and_hms(0, 0, 0); let default = NaiveDate::from_ymd(2016, 6, 29).and_hms(0, 0, 0);
let mut p = Parser::default(); let p = Parser::default();
let res = p.parse("\x0D\x31", None, None, false, false, Some(&default), false, &HashMap::new()).unwrap(); let res = p.parse("\x0D\x31", None, None, false, false, Some(&default), false, &HashMap::new()).unwrap();
assert_eq!(res.0, default); assert_eq!(res.0, default);

View File

@ -39,7 +39,7 @@ fn parse_and_assert(
tzinfos: &HashMap<String, i32>, tzinfos: &HashMap<String, i32>,
) { ) {
let mut parser = Parser::new(info); let parser = Parser::new(info);
let rs_parsed = parser.parse( let rs_parsed = parser.parse(
s, s,
dayfirst, dayfirst,
@ -89,7 +89,7 @@ fn parse_fuzzy_and_assert(
tzinfos: &HashMap<String, i32>, tzinfos: &HashMap<String, i32>,
) { ) {
let mut parser = Parser::new(info); let parser = Parser::new(info);
let rs_parsed = parser.parse( let rs_parsed = parser.parse(
s, s,
dayfirst, dayfirst,