1
0
mirror of https://github.com/bspeice/dtparse synced 2025-07-03 06:45:01 -04:00

5 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
4d7c5dd995 Now with 100% more WASM!
Version bump and README update
2018-08-14 22:49:24 -04:00
afb7747cdf Fix target name 2018-08-14 22:38:05 -04:00
22e0300275 Test adding WASM support 2018-08-14 21:53:35 -04:00
11 changed files with 67 additions and 16 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ Cargo.lock
.vscode
*.pyc
.idea/
*.swp

View File

@ -5,6 +5,8 @@ dist: trusty
language: rust
services: docker
sudo: required
addons:
chrome: stable
env:
global:
@ -90,6 +92,10 @@ matrix:
- env: TARGET=x86_64-unknown-linux-gnu
rust: 1.27.0
# WASM support
- env: TARGET=asmjs-unknown-emscripten USE_CARGO_WEB=true
rust: nightly
before_install:
- set -e

View File

@ -1,3 +1,19 @@
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)
==========================
Misc
----
- Add tests for WASM
Version 1.0.1 (2018-08-11)
==========================

View File

@ -1,6 +1,6 @@
[package]
name = "dtparse"
version = "1.0.1"
version = "1.0.3"
authors = ["Bradlee Speice <bradlee@speice.io>"]
description = "A dateutil-compatible timestamp parser for Rust"
repository = "https://github.com/bspeice/dtparse.git"
@ -20,4 +20,4 @@ name = "dtparse"
chrono = "0.4"
lazy_static = "1.1"
num-traits = "0.2"
rust_decimal = "0.10"
rust_decimal = "^0.10.1"

View File

@ -68,7 +68,7 @@ Further examples can be found in the [examples](examples) directory on internati
# Usage
`dtparse` requires a minimum Rust version of 1.21 to build, but is tested on Windows, OSX,
BSD, and Linux. The build is also compiled against the iOS and Android SDK's, but is not
BSD, Linux, and WASM. The build is also compiled against the iOS and Android SDK's, but is not
tested against them.
[dateutil]: https://github.com/dateutil/dateutil

5
build_pycompat.py Normal file → Executable file
View File

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

View File

@ -14,7 +14,27 @@ main() {
cross test --target $TARGET --release
}
main_web() {
CARGO_WEB_RELEASE="$(curl -L -s -H 'Accept: application/json' https://github.com/koute/cargo-web/releases/latest)"
CARGO_WEB_VERSION="$(echo $CARGO_WEB_RELEASE | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')"
CARGO_WEB_URL="https://github.com/koute/cargo-web/releases/download/$CARGO_WEB_VERSION/cargo-web-x86_64-unknown-linux-gnu.gz"
echo "Downloading cargo-web from: $CARGO_WEB_URL"
curl -L "$CARGO_WEB_URL" | gzip -d > cargo-web
chmod +x cargo-web
mkdir -p ~/.cargo/bin
mv cargo-web ~/.cargo/bin
cargo web build --target $TARGET
cargo web test --target $TARGET --release
}
# we don't run the "test phase" when doing deploys
if [ -z $TRAVIS_TAG ]; then
if [ -z "$USE_CARGO_WEB" ]; then
main
else
main_web
fi
fi

View File

@ -61,6 +61,12 @@
//!
//! Further examples can be found in the `examples` directory on international usage.
//!
//! # Usage
//!
//! `dtparse` requires a minimum Rust version of 1.21 to build, but is tested on Windows, OSX,
//! BSD, Linux, and WASM. The build is also compiled against the iOS and Android SDK's, but is not
//! tested against them.
//!
//! [dateutil]: https://github.com/dateutil/dateutil
#[macro_use]
@ -102,6 +108,7 @@ lazy_static! {
static ref ONE: Decimal = Decimal::new(1, 0);
static ref TWENTY_FOUR: Decimal = Decimal::new(24, 0);
static ref SIXTY: Decimal = Decimal::new(60, 0);
static ref DEFAULT_PARSER: Parser = Parser::default();
}
impl From<DecimalError> for ParseError {
@ -664,7 +671,7 @@ impl Parser {
/// order to be resolved.
#[cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))] // Need to release a 2.0 for changing public API
pub fn parse(
&mut self,
&self,
timestr: &str,
dayfirst: Option<bool>,
yearfirst: Option<bool>,
@ -693,7 +700,7 @@ impl Parser {
#[cfg_attr(feature = "cargo-clippy", allow(cyclomatic_complexity))] // Imitating Python API is priority
fn parse_with_tokens(
&mut self,
&self,
timestr: &str,
dayfirst: Option<bool>,
yearfirst: Option<bool>,
@ -947,7 +954,6 @@ impl Parser {
) -> ParseResult<Option<FixedOffset>> {
// TODO: Actual timezone support
if let Some(offset) = res.tzoffset {
println!("offset={}", offset);
Ok(Some(FixedOffset::east(offset)))
} else if res.tzoffset == None
&& (res.tzname == Some(" ".to_owned()) || res.tzname == Some(".".to_owned())
@ -1277,7 +1283,7 @@ fn ljust(s: &str, chars: usize, replace: char) -> String {
/// The default implementation assumes English values for names of months,
/// days of the week, etc. It is equivalent to Python's `dateutil.parser.parse()`
pub fn parse(timestr: &str) -> ParseResult<(NaiveDateTime, Option<FixedOffset>)> {
let res = Parser::default().parse(
let res = DEFAULT_PARSER.parse(
timestr,
None,
None,

View File

@ -16,7 +16,7 @@ fn test_fuzz() {
// OverflowError: Python int too large to convert to C long
// assert_eq!(parse("8888884444444888444444444881"), Err(ParseError::AmPmWithoutHour));
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();
assert_eq!(res.0, default);

View File

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