Update the session model and the tests

pull/1359/head
Steven Silvester 10 years ago
parent 76d08aca99
commit 6486b2430f

@ -639,12 +639,11 @@ definitions:
id:
type: string
format: uuid
name:
type: string
description: the name of file, notebook, or console
directory:
path:
type: string
description: the directory of the session
description: "The path to the session. For console sessions, the path
contains the cwd of the kernel and the name of the console session,
which may be a uuid"
type:
type: string;
description: session type

@ -41,16 +41,14 @@ class SessionRootHandler(APIHandler):
raise web.HTTPError(400, "No JSON data provided")
try:
name = model['name']
path = model['path']
except KeyError:
raise web.HTTPError(400, "Missing field in JSON data: name")
raise web.HTTPError(400, "Missing field in JSON data: path")
try:
directory = model['directory']
mtype = model['type']
except KeyError:
raise web.HTTPError(400, "Missing field in JSON data: directory")
model_type = model.get('type', 'notebook')
raise web.HTTPError(400, "Missing field in JSON data: type")
kernel = model.get('kernel', {})
kernel_name = kernel.get('name') or None
@ -60,8 +58,6 @@ class SessionRootHandler(APIHandler):
self.log.debug("No kernel specified, using default kernel")
kernel_name = None
# Check to see if session exists
path = os.path.join(directory, name)
exists = yield gen.maybe_future(sm.session_exists(path=path))
if exists:
model = yield gen.maybe_future(sm.get_session(path=path))
@ -70,7 +66,7 @@ class SessionRootHandler(APIHandler):
model = yield gen.maybe_future(
sm.create_session(path=path, kernel_name=kernel_name,
kernel_id=kernel_id,
type=model_type))
type=mtype))
except NoSuchKernel:
msg = ("The '%s' kernel is not available. Please pick another "
"suitable kernel instead, or install that kernel." % kernel_name)
@ -103,7 +99,7 @@ class SessionHandler(APIHandler):
def patch(self, session_id):
"""Patch updates sessions:
- notebook.path updates session to track renamed notebooks
- path updates session to track renamed paths
- kernel.name starts a new kernel with a given kernelspec
"""
sm = self.session_manager
@ -116,8 +112,8 @@ class SessionHandler(APIHandler):
before = yield gen.maybe_future(sm.get_session(session_id=session_id))
changes = {}
if 'name' in model:
changes['name'] = model['name']
if 'path' in model:
changes['path'] = model['path']
if 'type' in model:
changes['type'] = model['type']
if 'kernel' in model:
@ -130,7 +126,8 @@ class SessionHandler(APIHandler):
elif model['kernel'].get('name') is not None:
kernel_name = model['kernel']['name']
kernel_id = yield sm.start_kernel_for_session(
session_id, kernel_name=kernel_name, path=before['notebook']['path'])
session_id, kernel_name=kernel_name, path=before['path'],
type=before['type'])
changes['kernel_id'] = kernel_id
yield gen.maybe_future(sm.update_session(session_id, **changes))

@ -107,7 +107,7 @@ class SessionManager(LoggingConfigurable):
session_id : str
uuid for the session; this method must be given a session_id
path : str
the path for the given notebook
the path for the given session
kernel_id : str
a uuid for the kernel associated with this session
@ -207,8 +207,7 @@ class SessionManager(LoggingConfigurable):
model = {
'id': row['session_id'],
'name': os.path.basename(row['path']),
'directory': os.path.dirname(row['path']),
'path': row['path'],
'type': row['type'],
'kernel': self.kernel_manager.kernel_model(row['kernel_id'])
}

@ -48,6 +48,7 @@ class TestSessionManager(TestCase):
def co_add():
sessions = []
for kwargs in kwarg_list:
kwargs.setdefault('type', 'notebook')
session = yield self.sm.create_session(**kwargs)
sessions.append(session)
raise gen.Return(sessions)
@ -61,7 +62,8 @@ class TestSessionManager(TestCase):
session_id = self.create_session(path='/path/to/test.ipynb', kernel_name='bar')['id']
model = sm.get_session(session_id=session_id)
expected = {'id':session_id,
'notebook':{'path': u'/path/to/test.ipynb'},
'path': u'/path/to/test.ipynb',
'type': 'notebook',
'kernel': {'id':u'A', 'name': 'bar'}}
self.assertEqual(model, expected)
@ -87,23 +89,26 @@ class TestSessionManager(TestCase):
sm = self.sm
sessions = self.create_sessions(
dict(path='/path/to/1/test1.ipynb', kernel_name='python'),
dict(path='/path/to/2/test2.ipynb', kernel_name='python'),
dict(path='/path/to/3/test3.ipynb', kernel_name='python'),
dict(path='/path/to/2/test2.py', type='file', kernel_name='python'),
dict(path='/path/to/3/test123', type='console', kernel_name='python'),
)
sessions = sm.list_sessions()
expected = [
{
'id':sessions[0]['id'],
'notebook':{'path': u'/path/to/1/test1.ipynb'},
'path': u'/path/to/1/test1.ipynb',
'type': 'notebook',
'kernel':{'id':u'A', 'name':'python'}
}, {
'id':sessions[1]['id'],
'notebook': {'path': u'/path/to/2/test2.ipynb'},
'path': u'/path/to/2/test2.py',
'type': 'file',
'kernel':{'id':u'B', 'name':'python'}
}, {
'id':sessions[2]['id'],
'notebook':{'path': u'/path/to/3/test3.ipynb'},
'path': u'/path/to/3/test123',
'type': 'console',
'kernel':{'id':u'C', 'name':'python'}
}
]
@ -121,9 +126,8 @@ class TestSessionManager(TestCase):
expected = [
{
'id': sessions[1]['id'],
'notebook': {
'path': u'/path/to/2/test2.ipynb',
},
'path': u'/path/to/2/test2.ipynb',
'type': 'notebook',
'kernel': {
'id': u'B',
'name':'python',
@ -139,7 +143,8 @@ class TestSessionManager(TestCase):
sm.update_session(session_id, path='/path/to/new_name.ipynb')
model = sm.get_session(session_id=session_id)
expected = {'id':session_id,
'notebook':{'path': u'/path/to/new_name.ipynb'},
'path': u'/path/to/new_name.ipynb',
'type': 'notebook',
'kernel':{'id':u'A', 'name':'julia'}}
self.assertEqual(model, expected)
@ -161,11 +166,13 @@ class TestSessionManager(TestCase):
new_sessions = sm.list_sessions()
expected = [{
'id': sessions[0]['id'],
'notebook': {'path': u'/path/to/1/test1.ipynb'},
'path': u'/path/to/1/test1.ipynb',
'type': 'notebook',
'kernel': {'id':u'A', 'name':'python'}
}, {
'id': sessions[2]['id'],
'notebook': {'path': u'/path/to/3/test3.ipynb'},
'type': 'notebook',
'path': u'/path/to/3/test3.ipynb',
'kernel': {'id':u'C', 'name':'python'}
}
]

@ -39,14 +39,19 @@ class SessionAPI(object):
def get(self, id):
return self._req('GET', id)
def create(self, path, kernel_name='python', kernel_id=None):
body = json.dumps({'notebook': {'path':path},
def create(self, path, type='notebook', kernel_name='python', kernel_id=None):
body = json.dumps({'path': path,
'type': type,
'kernel': {'name': kernel_name,
'id': kernel_id}})
return self._req('POST', '', body)
def modify_path(self, id, path):
body = json.dumps({'notebook': {'path':path}})
body = json.dumps({'path': path})
return self._req('PATCH', id, body)
def modify_type(self, id, type):
body = json.dumps({'type': type})
return self._req('PATCH', id, body)
def modify_kernel_name(self, id, kernel_name):
@ -101,7 +106,8 @@ class SessionAPITest(NotebookTestBase):
self.assertEqual(resp.status_code, 201)
newsession = resp.json()
self.assertIn('id', newsession)
self.assertEqual(newsession['notebook']['path'], 'foo/nb1.ipynb')
self.assertEqual(newsession['path'], 'foo/nb1.ipynb')
self.assertEqual(newsession['type'], 'notebook')
self.assertEqual(resp.headers['Location'], self.url_prefix + 'api/sessions/{0}'.format(newsession['id']))
sessions = self.sess_api.list().json()
@ -112,6 +118,20 @@ class SessionAPITest(NotebookTestBase):
got = self.sess_api.get(sid).json()
self.assertEqual(got, newsession)
def test_create_file_session(self):
resp = self.sess_api.create('foo/nb1.py', type='file')
self.assertEqual(resp.status_code, 201)
newsession = resp.json()
self.assertEqual(newsession['path'], 'foo/nb1.py')
self.assertEqual(newsession['type'], 'file')
def test_create_console_session(self):
resp = self.sess_api.create('foo/abc123', type='console')
self.assertEqual(resp.status_code, 201)
newsession = resp.json()
self.assertEqual(newsession['path'], 'foo/abc123')
self.assertEqual(newsession['type'], 'console')
def test_create_with_kernel_id(self):
# create a new kernel
r = requests.post(url_path_join(self.base_url(), 'api/kernels'))
@ -122,7 +142,7 @@ class SessionAPITest(NotebookTestBase):
self.assertEqual(resp.status_code, 201)
newsession = resp.json()
self.assertIn('id', newsession)
self.assertEqual(newsession['notebook']['path'], 'foo/nb1.ipynb')
self.assertEqual(newsession['path'], 'foo/nb1.ipynb')
self.assertEqual(newsession['kernel']['id'], kernel['id'])
self.assertEqual(resp.headers['Location'], self.url_prefix + 'api/sessions/{0}'.format(newsession['id']))
@ -153,7 +173,15 @@ class SessionAPITest(NotebookTestBase):
changed = self.sess_api.modify_path(sid, 'nb2.ipynb').json()
self.assertEqual(changed['id'], sid)
self.assertEqual(changed['notebook']['path'], 'nb2.ipynb')
self.assertEqual(changed['path'], 'nb2.ipynb')
def test_modify_type(self):
newsession = self.sess_api.create('foo/nb1.ipynb').json()
sid = newsession['id']
changed = self.sess_api.modify_type(sid, 'console').json()
self.assertEqual(changed['id'], sid)
self.assertEqual(changed['type'], 'console')
def test_modify_kernel_name(self):
before = self.sess_api.create('foo/nb1.ipynb').json()
@ -161,7 +189,8 @@ class SessionAPITest(NotebookTestBase):
after = self.sess_api.modify_kernel_name(sid, before['kernel']['name']).json()
self.assertEqual(after['id'], sid)
self.assertEqual(after['notebook'], before['notebook'])
self.assertEqual(after['path'], before['path'])
self.assertEqual(after['type'], before['type'])
self.assertNotEqual(after['kernel']['id'], before['kernel']['id'])
# check kernel list, to be sure previous kernel was cleaned up
@ -182,7 +211,8 @@ class SessionAPITest(NotebookTestBase):
# Attach our session to the existing kernel
after = self.sess_api.modify_kernel_id(sid, kernel['id']).json()
self.assertEqual(after['id'], sid)
self.assertEqual(after['notebook'], before['notebook'])
self.assertEqual(after['path'], before['path'])
self.assertEqual(after['type'], before['type'])
self.assertNotEqual(after['kernel']['id'], before['kernel']['id'])
self.assertEqual(after['kernel']['id'], kernel['id'])

@ -240,11 +240,8 @@ define([
* @returns {Object} - the data model
*/
Session.prototype._get_model = function () {
var path = this.notebook_model.path;
var parts = path.split('/');
return {
name: parts[parts.length -1],
directory: parts.slice(0, parts.length - 1).join('/'),
path: this.notebook_model.path,
type: 'notebook',
kernel: this.kernel_model
};
@ -265,8 +262,7 @@ define([
this.session_url = utils.url_path_join(this.session_service_url, this.id);
}
if (data && data.notebook) {
var path = data.path + '/' + data.name;
this.notebook_model.path = path;
this.notebook_model.path = data.path;
}
if (data && data.kernel) {
this.kernel_model.name = data.kernel.name;

Loading…
Cancel
Save