diff --git a/notebook/services/contents/tz.py b/notebook/services/contents/tz.py index b315d532d..1df39e51d 100644 --- a/notebook/services/contents/tz.py +++ b/notebook/services/contents/tz.py @@ -5,22 +5,11 @@ Timezone utilities Just UTC-awareness right now """ -#----------------------------------------------------------------------------- -# Copyright (C) 2013 The IPython Development Team -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. from datetime import tzinfo, timedelta, datetime -#----------------------------------------------------------------------------- -# Code -#----------------------------------------------------------------------------- # constant for zero offset ZERO = timedelta(0) @@ -44,3 +33,10 @@ def utc_aware(unaware): utcfromtimestamp = utc_aware(datetime.utcfromtimestamp) utcnow = utc_aware(datetime.utcnow) + +def isoformat(dt): + """Return iso-formatted timestamp + + Like .isoformat(), but uses Z for UTC instead of +00:00 + """ + return dt.isoformat().replace('+00:00', 'Z') diff --git a/notebook/services/kernels/kernelmanager.py b/notebook/services/kernels/kernelmanager.py index 87656e2af..e561d3983 100644 --- a/notebook/services/kernels/kernelmanager.py +++ b/notebook/services/kernels/kernelmanager.py @@ -17,7 +17,7 @@ from jupyter_client.multikernelmanager import MultiKernelManager from traitlets import Dict, List, Unicode, TraitError, default, validate from notebook.utils import to_os_path -from notebook.services.contents.tz import utcnow +from notebook.services.contents.tz import utcnow, isoformat from ipython_genutils.py3compat import getcwd @@ -177,7 +177,7 @@ class MappingKernelManager(MultiKernelManager): model = { "id":kernel_id, "name": kernel.kernel_name, - "last_activity": kernel.last_activity, + "last_activity": isoformat(kernel.last_activity), "execution_state": kernel.execution_state, "connections": self._kernel_connections[kernel_id], } diff --git a/notebook/services/sessions/tests/test_sessionmanager.py b/notebook/services/sessions/tests/test_sessionmanager.py index 1e0202615..d8c8a28e3 100644 --- a/notebook/services/sessions/tests/test_sessionmanager.py +++ b/notebook/services/sessions/tests/test_sessionmanager.py @@ -9,14 +9,14 @@ from tornado.ioloop import IOLoop from ..sessionmanager import SessionManager from notebook.services.kernels.kernelmanager import MappingKernelManager from notebook.services.contents.manager import ContentsManager -from notebook.services.contents.tz import utcnow +from notebook.services.contents.tz import utcnow, isoformat class DummyKernel(object): def __init__(self, kernel_name='python'): self.kernel_name = kernel_name dummy_date = utcnow() -dummy_date_s = dummy_date.isoformat() +dummy_date_s = isoformat(dummy_date) class DummyMKM(MappingKernelManager): """MappingKernelManager interface that doesn't start kernels, for testing""" @@ -74,7 +74,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'A', 'name': 'bar', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', }} self.assertEqual(model, expected) @@ -116,7 +116,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'A', 'name':'python', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', } }, { @@ -127,7 +127,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'B', 'name':'python', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', } }, { @@ -138,7 +138,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'C', 'name':'python', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', } } @@ -164,7 +164,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'B', 'name':'python', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', } } @@ -185,7 +185,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'A', 'name':'julia', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', } } @@ -216,7 +216,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'A', 'name':'python', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', } }, { @@ -227,7 +227,7 @@ class TestSessionManager(TestCase): 'kernel': { 'id': 'C', 'name':'python', - 'last_activity': dummy_date, + 'last_activity': dummy_date_s, 'execution_state': 'idle', } } diff --git a/notebook/services/sessions/tests/test_sessions_api.py b/notebook/services/sessions/tests/test_sessions_api.py index dba1417d6..a947316df 100644 --- a/notebook/services/sessions/tests/test_sessions_api.py +++ b/notebook/services/sessions/tests/test_sessions_api.py @@ -225,6 +225,8 @@ class SessionAPITest(NotebookTestBase): r = self.request('GET', 'api/kernels') r.raise_for_status() kernel_list = r.json() + after['kernel'].pop('last_activity') + [ k.pop('last_activity') for k in kernel_list ] self.assertEqual(kernel_list, [after['kernel']]) def test_modify_kernel_id(self): @@ -248,4 +250,7 @@ class SessionAPITest(NotebookTestBase): r = self.request('GET', 'api/kernels') r.raise_for_status() kernel_list = r.json() + + kernel.pop('last_activity') + [ k.pop('last_activity') for k in kernel_list ] self.assertEqual(kernel_list, [kernel])