Skip to content

Commit

Permalink
Merge pull request #5 from thombashi/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
thombashi committed Feb 25, 2016
2 parents b0fa9e6 + 5e6c26b commit 60a87a5
Show file tree
Hide file tree
Showing 4 changed files with 252 additions and 16 deletions.
50 changes: 42 additions & 8 deletions README.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
**DateTimeRange**

.. image:: https://img.shields.io/pypi/pyversions/DateTimeRange.svg
:target: https://pypi.python.org/pypi/DateTimeRange
.. image:: https://travis-ci.org/thombashi/DateTimeRange.svg?branch=master
:target: https://travis-ci.org/thombashi/DateTimeRange
.. image:: https://ci.appveyor.com/api/projects/status/jhy67bw2y3c8s016/branch/master?svg=true
Expand All @@ -16,7 +18,7 @@ Summary

DateTimeRange is a python library to handle the routine work associated
with the time range, such as test whether a time is within the time
range, get time intersection, truncating time etc.
range, get time range intersection, truncating time range etc.

Installation
============
Expand All @@ -31,17 +33,49 @@ Usage
datetime.datetime instance can be used as an argument value as well as
time-string in the below examples.

Create
------
Create and convert to string
----------------------------

.. code:: python
from datetimerange import DateTimeRange
time_range = DateTimeRange("2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")
time_range
str(time_range)
::

'2015-03-22T10:00:00+0900 - 2015-03-22T10:10:00+0900'

Compare time range
------------------

.. code:: python
from datetimerange import DateTimeRange
lhs = DateTimeRange("2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")
rhs = DateTimeRange("2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")
print "lhs == rhs: ", lhs == rhs
print "lhs != rhs: ", lhs != rhs
::

lhs == rhs: True
lhs != rhs: False

Move the time range
-------------------

.. code:: python
import datetime
from datetimerange import DateTimeRange
value = DateTimeRange("2015-03-22T10:10:00+0900", "2015-03-22T10:20:00+0900")
print value + datetime.timedelta(seconds=10 * 60)
print value - datetime.timedelta(seconds=10 * 60)
::

2015-03-22T10:20:00+0900 - 2015-03-22T10:30:00+0900
2015-03-22T10:00:00+0900 - 2015-03-22T10:10:00+0900

Change string conversion format
Expand Down Expand Up @@ -337,14 +371,14 @@ Truncate time range
from datetimerange import DateTimeRange
time_range = DateTimeRange("2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")
time_range.is_output_elapse = True
print time_range
print "before truncate: ", time_range
time_range.truncate(10)
print time_range
print "after truncate: ", time_range
::

2015-03-22T10:00:00+0900 - 2015-03-22T10:10:00+0900 (0:10:00)
2015-03-22T10:00:30+0900 - 2015-03-22T10:09:30+0900 (0:09:00)
before truncate: 2015-03-22T10:00:00+0900 - 2015-03-22T10:10:00+0900 (0:10:00)
after truncate: 2015-03-22T10:00:30+0900 - 2015-03-22T10:09:30+0900 (0:09:00)

Documentation
=============
Expand Down
26 changes: 26 additions & 0 deletions datetimerange/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,32 @@ def __eq__(self, other):
self.end_datetime == other.end_datetime,
])

def __ne__(self, other):
return any([
self.start_datetime != other.start_datetime,
self.end_datetime != other.end_datetime,
])

def __add__(self, other):
return DateTimeRange(
self.start_datetime + other, self.end_datetime + other)

def __iadd__(self, other):
self.set_start_datetime(self.start_datetime + other)
self.set_end_datetime(self.end_datetime + other)

return self

def __sub__(self, other):
return DateTimeRange(
self.start_datetime - other, self.end_datetime - other)

def __isub__(self, other):
self.set_start_datetime(self.start_datetime - other)
self.set_end_datetime(self.end_datetime - other)

return self

def __contains__(self, x):
"""
:param datetime.datetime/str x:
Expand Down
10 changes: 7 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from __future__ import with_statement
import sys
import setuptools


Expand All @@ -14,11 +13,16 @@

setuptools.setup(
name="DateTimeRange",
version="0.1.1",
version="0.1.2",
author="Tsuyoshi Hombashi",
author_email="gogogo.vm@gmail.com",
url="https://github.com/thombashi/DateTimeRange",
description="Python library for time of range.",
description="""
Python library to handle the routine work associated with the time range,
such as test whether a time is within the time range,
get time intersection, truncating time etc.
""",
keywords="date time range",
long_description=long_description,
license="MIT License",
include_package_data=True,
Expand Down
182 changes: 177 additions & 5 deletions test/test_datetimerange.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,14 +170,186 @@ def test_exception(

class Test_DateTimeRange_eq:

def test_normal(self, datetimerange_normal):
assert datetimerange_normal == datetimerange_normal
@pytest.mark.parametrize(["lhs", "rhs", "expected"], [
[
DateTimeRange(None, None),
DateTimeRange(None, None),
True,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
True,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:20:00+0900"),
False,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T10:02:00+0900", "2015-03-22T10:10:00+0900"),
False,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T11:00:00+0900", "2015-03-22T12:10:00+0900"),
False,
],
])
def test_normal(self, lhs, rhs, expected):
assert (lhs == rhs) == expected


class Test_DateTimeRange_neq:

@pytest.mark.parametrize(["lhs", "rhs", "expected"], [
[
DateTimeRange(None, None),
DateTimeRange(None, None),
False,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
False,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:20:00+0900"),
True,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T10:02:00+0900", "2015-03-22T10:10:00+0900"),
True,
],
[
DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900"),
DateTimeRange(
"2015-03-22T11:00:00+0900", "2015-03-22T12:10:00+0900"),
True,
],
])
def test_normal(self, lhs, rhs, expected):
assert (lhs != rhs) == expected


class Test_DateTimeRange_add:

def test_normal(self):
value = DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")
expected = DateTimeRange(
"2015-03-22T10:10:00+0900", "2015-03-22T10:20:00+0900")

new_datetimerange = value + datetime.timedelta(
seconds=10 * 60)
assert new_datetimerange == expected

@pytest.mark.parametrize(["value", "expected"], [
["2015-03-22T10:10:00+0900", TypeError],
[1, TypeError],
[None, TypeError],
])
def test_exception(self, datetimerange_normal, value, expected):
with pytest.raises(TypeError):
datetimerange_normal + value

def test_null(self, datetimerange_null):
assert datetimerange_null == datetimerange_null
with pytest.raises(TypeError):
datetimerange_null + datetime.timedelta(seconds=10 * 60)


class Test_DateTimeRange_iadd:

def test_normal(self):
value = DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")
expected = DateTimeRange(
"2015-03-22T10:10:00+0900", "2015-03-22T10:20:00+0900")

value += datetime.timedelta(seconds=10 * 60)
assert value == expected

@pytest.mark.parametrize(["value", "expected"], [
["2015-03-22T10:10:00+0900", TypeError],
[1, TypeError],
[None, TypeError],
])
def test_exception(self, datetimerange_normal, value, expected):
with pytest.raises(TypeError):
datetimerange_normal += value

def test_neq(self, datetimerange_normal, datetimerange_null):
assert datetimerange_normal != datetimerange_null
def test_null(self, datetimerange_null):
with pytest.raises(TypeError):
datetimerange_null += datetime.timedelta(seconds=10 * 60)


class Test_DateTimeRange_sub:

def test_normal(self):
value = DateTimeRange(
"2015-03-22T10:10:00+0900", "2015-03-22T10:20:00+0900")
expected = DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")

new_datetimerange = value - datetime.timedelta(
seconds=10 * 60)
assert new_datetimerange == expected

@pytest.mark.parametrize(["value", "expected"], [
["2015-03-22T10:10:00+0900", TypeError],
[1, TypeError],
[None, TypeError],
])
def test_exception(self, datetimerange_normal, value, expected):
with pytest.raises(TypeError):
datetimerange_normal - value

def test_null(self, datetimerange_null):
with pytest.raises(TypeError):
datetimerange_null - datetime.timedelta(seconds=10 * 60)


class Test_DateTimeRange_isub:

def test_normal(self):
value = DateTimeRange(
"2015-03-22T10:10:00+0900", "2015-03-22T10:20:00+0900")
expected = DateTimeRange(
"2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")

value -= datetime.timedelta(seconds=10 * 60)
assert value == expected

@pytest.mark.parametrize(["value", "expected"], [
["2015-03-22T10:10:00+0900", TypeError],
[1, TypeError],
[None, TypeError],
])
def test_exception(self, datetimerange_normal, value, expected):
with pytest.raises(TypeError):
datetimerange_normal -= value

def test_null(self, datetimerange_null):
with pytest.raises(TypeError):
datetimerange_null -= datetime.timedelta(seconds=10 * 60)


class Test_DateTimeRange_contains:
Expand Down

0 comments on commit 60a87a5

Please sign in to comment.