summaryrefslogtreecommitdiff
path: root/contrib/python
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/python')
-rw-r--r--contrib/python/podman/client.py11
-rw-r--r--contrib/python/podman/libs/__init__.py43
-rw-r--r--contrib/python/requirements.txt3
-rw-r--r--contrib/python/test/test_libs.py19
4 files changed, 28 insertions, 48 deletions
diff --git a/contrib/python/podman/client.py b/contrib/python/podman/client.py
index 8a1acdd9b..c6112aae8 100644
--- a/contrib/python/podman/client.py
+++ b/contrib/python/podman/client.py
@@ -53,9 +53,14 @@ class Client(object):
self._client = functools.partial(_podman, uri, interface)
# Quick validation of connection data provided
- if not System(self._client).ping():
- raise ValueError('Failed varlink connection "{}/{}"'.format(
- uri, interface))
+ try:
+ if not System(self._client).ping():
+ raise ValueError('Failed varlink connection "{}/{}"'.format(
+ uri, interface))
+ except FileNotFoundError:
+ raise ValueError('Failed varlink connection "{}/{}".'
+ ' Is podman service running?'.format(
+ uri, interface))
def __enter__(self):
"""Return `self` upon entering the runtime context."""
diff --git a/contrib/python/podman/libs/__init__.py b/contrib/python/podman/libs/__init__.py
index ab8fb94a8..7285921d7 100644
--- a/contrib/python/podman/libs/__init__.py
+++ b/contrib/python/podman/libs/__init__.py
@@ -1,7 +1,8 @@
"""Support files for podman API implementation."""
import datetime
-import re
import threading
+from dateutil.parser import parse as dateutil_parse
+
__all__ = [
'cached_property',
@@ -44,45 +45,11 @@ class cached_property(object):
def datetime_parse(string):
- """Convert timestamp to datetime.
-
- Because date/time parsing in python is still pedantically stupid,
- we rip the input string apart throwing out the stop characters etc;
- then rebuild a string strptime() can parse. Igit!
-
- - Python >3.7 will address colons in the UTC offset.
- - There is no ETA on microseconds > 6 digits.
- - And giving an offset and timezone name...
-
- # match: 2018-05-08T14:12:53.797795191-07:00
- # match: 2018-05-08T18:24:52.753227-07:00
- # match: 2018-05-08 14:12:53.797795191 -0700 MST
- # match: 2018-05-09T10:45:57.576002 (python isoformat())
+ """Convert timestamps to datetime.
- Some people, when confronted with a problem, think “I know,
- I'll use regular expressions.” Now they have two problems.
- -- Jamie Zawinski
+ tzinfo aware, if provided.
"""
- ts = re.compile(r'^(\d+)-(\d+)-(\d+)'
- r'[ T]?(\d+):(\d+):(\d+).(\d+)'
- r' *([-+][\d:]{4,5})? *')
-
- x = ts.match(string)
- if x is None:
- raise ValueError('Unable to parse {}'.format(string))
-
- # converting everything to int() not worth the readablity hit
- igit_proof = '{}T{}.{}{}'.format(
- '-'.join(x.group(1, 2, 3)),
- ':'.join(x.group(4, 5, 6)),
- x.group(7)[0:6],
- x.group(8).replace(':', '') if x.group(8) else '',
- )
-
- format = '%Y-%m-%dT%H:%M:%S.%f'
- if x.group(8):
- format += '%z'
- return datetime.datetime.strptime(igit_proof, format)
+ return dateutil_parse(string.upper(), fuzzy=True)
def datetime_format(dt):
diff --git a/contrib/python/requirements.txt b/contrib/python/requirements.txt
index f5d264ddb..368a095b2 100644
--- a/contrib/python/requirements.txt
+++ b/contrib/python/requirements.txt
@@ -1,2 +1,3 @@
-varlink==25
+varlink>=25
setuptools
+dateutil
diff --git a/contrib/python/test/test_libs.py b/contrib/python/test/test_libs.py
index e2160fc30..202bed1d8 100644
--- a/contrib/python/test/test_libs.py
+++ b/contrib/python/test/test_libs.py
@@ -18,19 +18,26 @@ class TestLibs(unittest.TestCase):
'2018-05-08T14:12:53.797795191-07:00',
'2018-05-08T14:12:53.797795-07:00',
'2018-05-08T14:12:53.797795-0700',
- '2018-05-08 14:12:53.797795191 -0700 MST'
+ '2018-05-08 14:12:53.797795191 -0700 MST',
]:
actual = podman.datetime_parse(v)
self.assertEqual(actual, expected)
- podman.datetime_parse(datetime.datetime.now().isoformat())
+ expected = datetime.datetime.strptime(
+ '2018-05-08T14:12:53.797795-0000', '%Y-%m-%dT%H:%M:%S.%f%z')
+ for v in [
+ '2018-05-08T14:12:53.797795191Z',
+ '2018-05-08T14:12:53.797795191z',
+ ]:
+ actual = podman.datetime_parse(v)
+ self.assertEqual(actual, expected)
+
+ actual = podman.datetime_parse(datetime.datetime.now().isoformat())
+ self.assertIsNotNone(actual)
def test_parse_fail(self):
- # chronologist humor: '1752-09-05T12:00:00.000000-0000' also not
- # handled correctly by python for my locale.
for v in [
- '1752-9-5',
- '1752-09-05',
+ 'There is no time here.',
]:
with self.assertRaises(ValueError):
podman.datetime_parse(v)