Skip to content

Commit 6beac86

Browse files
committed
Fix extraction of date argument when creating a CreationDateClause
1 parent e6d28c5 commit 6beac86

File tree

2 files changed

+46
-28
lines changed

2 files changed

+46
-28
lines changed

src/py/term/clause.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,18 +1904,27 @@ impl PyObjectProtocol for CreatedByClause {
19041904
/// CreationDateClause(date)
19051905
/// --
19061906
///
1907-
/// A clause declaring the date and time a term was created.
1907+
/// A clause declaring the date (and optionally time) a term was created.
19081908
///
19091909
/// Arguments:
1910-
/// date (~datetime.datetime or datetime.date): the date, or date and
1911-
/// time, when this term was created.
1910+
/// date (`datetime.date`): The date this term was created. If a
1911+
/// `datetime.datime` object is given, then the serialized value
1912+
/// will also include the serialized time.
19121913
///
19131914
/// Warning:
19141915
/// The timezone of the `datetime` will only be extracted down to the
19151916
/// minutes, seconds and smaller durations will be ignored. It is advised
19161917
/// to use `datetime.timezone.utc` whenever possible to preserve the
19171918
/// date and time properly.
19181919
///
1920+
/// Example:
1921+
/// >>> d1 = datetime.date(2021, 1, 23)
1922+
/// >>> print(fastobo.term.CreationDateClause(d1))
1923+
/// creation_date: 2021-01-23
1924+
/// >>> d2 = datetime.datetime(2021, 1, 23, tzinfo=datetime.timezone.utc)
1925+
/// >>> print(fastobo.term.CreationDateClause(d2))
1926+
/// creation_date: 2021-01-23T00:00:00Z
1927+
///
19191928
#[pyclass(extends=BaseTermClause, module="fastobo.term")]
19201929
#[derive(Clone, ClonePy, Debug, FinalClass)]
19211930
#[base(BaseTermClause)]
@@ -1950,18 +1959,18 @@ impl IntoPy<fastobo::ast::TermClause> for CreationDateClause {
19501959
#[pymethods]
19511960
impl CreationDateClause {
19521961
#[new]
1953-
fn __init__(date: &PyDateTime) -> PyResult<PyClassInitializer<Self>> {
1962+
fn __init__(date: &PyAny) -> PyResult<PyClassInitializer<Self>> {
19541963
let py = date.py();
1955-
if let Ok(d) = date.cast_as::<PyDate>() {
1956-
let date = date_to_isodate(py, d).map(From::from)?;
1964+
if let Ok(dt) = date.cast_as::<PyDateTime>() {
1965+
let date = datetime_to_isodatetime(py, dt).map(From::from)?;
19571966
Ok(CreationDateClause::new(date).into())
19581967
} else {
1959-
match date.cast_as::<PyDateTime>() {
1968+
match date.cast_as::<PyDate>() {
19601969
Err(e) => {
19611970
raise!(py, PyTypeError("expected datetime.date or datetime.datetime") from PyErr::from(e))
19621971
}
1963-
Ok(dt) => {
1964-
let date = datetime_to_isodatetime(py, dt).map(From::from)?;
1972+
Ok(d) => {
1973+
let date = date_to_isodate(py, d).map(From::from)?;
19651974
Ok(CreationDateClause::new(date).into())
19661975
}
19671976
}
@@ -1981,15 +1990,15 @@ impl CreationDateClause {
19811990
#[setter]
19821991
fn set_date(&mut self, datetime: &PyAny) -> PyResult<()> {
19831992
let py = datetime.py();
1984-
if let Ok(d) = datetime.cast_as::<PyDate>() {
1985-
self.date = From::from(date_to_isodate(py, d)?);
1993+
if let Ok(dt) = datetime.cast_as::<PyDateTime>() {
1994+
self.date = From::from(datetime_to_isodatetime(py, dt)?);
19861995
} else {
1987-
match datetime.cast_as::<PyDateTime>() {
1996+
match datetime.cast_as::<PyDate>() {
19881997
Err(e) => {
19891998
raise!(py, PyTypeError("expected datetime.date or datetime.datetime") from PyErr::from(e))
19901999
}
1991-
Ok(dt) => {
1992-
self.date = From::from(datetime_to_isodatetime(py, dt)?);
2000+
Ok(d) => {
2001+
self.date = From::from(date_to_isodate(py, d)?);
19932002
}
19942003
}
19952004
}

src/py/typedef/clause.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3054,18 +3054,27 @@ impl PyObjectProtocol for CreatedByClause {
30543054
/// CreationDateClause(date)
30553055
/// --
30563056
///
3057-
/// A clause declaring the date and time a typedef was created.
3057+
/// A clause declaring the date (and optionally time) a typedef was created.
30583058
///
30593059
/// Arguments:
3060-
/// date (~datetime.datetime or datetime.date): the date, or date and
3061-
/// time, when this typedef was created.
3060+
/// date (`datetime.date`): The date this typedef was created. If a
3061+
/// `datetime.datime` object is given, then the serialized value
3062+
/// will also include the serialized time.
30623063
///
30633064
/// Warning:
30643065
/// The timezone of the `datetime` will only be extracted down to the
30653066
/// minutes, seconds and smaller durations will be ignored. It is advised
30663067
/// to use `datetime.timezone.utc` whenever possible to preserve the
30673068
/// date and time properly.
30683069
///
3070+
/// Example:
3071+
/// >>> d1 = datetime.date(2021, 1, 23)
3072+
/// >>> print(fastobo.typedef.CreationDateClause(d1))
3073+
/// creation_date: 2021-01-23
3074+
/// >>> d2 = datetime.datetime(2021, 1, 23, tzinfo=datetime.timezone.utc)
3075+
/// >>> print(fastobo.typedef.CreationDateClause(d2))
3076+
/// creation_date: 2021-01-23T00:00:00Z
3077+
///
30693078
#[pyclass(extends=BaseTypedefClause, module="fastobo.typedef")]
30703079
#[derive(Clone, ClonePy, Debug, FinalClass)]
30713080
#[base(BaseTypedefClause)]
@@ -3102,16 +3111,16 @@ impl CreationDateClause {
31023111
#[new]
31033112
fn __init__(datetime: &PyAny) -> PyResult<PyClassInitializer<Self>> {
31043113
let py = datetime.py();
3105-
if let Ok(d) = datetime.cast_as::<PyDate>() {
3106-
let date = date_to_isodate(py, d).map(From::from)?;
3114+
if let Ok(dt) = datetime.cast_as::<PyDateTime>() {
3115+
let date = datetime_to_isodatetime(py, dt).map(From::from)?;
31073116
Ok(CreationDateClause::new(date).into())
31083117
} else {
3109-
match datetime.cast_as::<PyDateTime>() {
3118+
match datetime.cast_as::<PyDate>() {
31103119
Err(e) => {
31113120
raise!(py, PyTypeError("expected datetime.date or datetime.datetime") from PyErr::from(e))
31123121
}
3113-
Ok(dt) => {
3114-
let date = datetime_to_isodatetime(py, dt).map(From::from)?;
3122+
Ok(d) => {
3123+
let date = date_to_isodate(py, d).map(From::from)?;
31153124
Ok(CreationDateClause::new(date).into())
31163125
}
31173126
}
@@ -3129,17 +3138,17 @@ impl CreationDateClause {
31293138
}
31303139

31313140
#[setter]
3132-
fn set_date(&mut self, datetime: &PyDateTime) -> PyResult<()> {
3141+
fn set_date(&mut self, datetime: &PyAny) -> PyResult<()> {
31333142
let py = datetime.py();
3134-
if let Ok(d) = datetime.cast_as::<PyDate>() {
3135-
self.date = From::from(date_to_isodate(py, d)?);
3143+
if let Ok(dt) = datetime.cast_as::<PyDateTime>() {
3144+
self.date = From::from(datetime_to_isodatetime(py, dt)?);
31363145
} else {
3137-
match datetime.cast_as::<PyDateTime>() {
3146+
match datetime.cast_as::<PyDate>() {
31383147
Err(e) => {
31393148
raise!(py, PyTypeError("expected datetime.date or datetime.datetime") from PyErr::from(e))
31403149
}
3141-
Ok(dt) => {
3142-
self.date = From::from(datetime_to_isodatetime(py, dt)?);
3150+
Ok(d) => {
3151+
self.date = From::from(date_to_isodate(py, d)?);
31433152
}
31443153
}
31453154
}

0 commit comments

Comments
 (0)