Example #1
0
 def post(self):
     # Creates a new session
     # (unless a session already exists for the named nb)
     sm = self.session_manager
     nbm = self.notebook_manager
     km = self.kernel_manager
     model = self.get_json_body()
     if model is None:
         raise web.HTTPError(400, "No JSON data provided")
     try:
         name = model["notebook"]["name"]
     except KeyError:
         raise web.HTTPError(400, "Missing field in JSON data: name")
     try:
         path = model["notebook"]["path"]
     except KeyError:
         raise web.HTTPError(400, "Missing field in JSON data: path")
     # Check to see if session exists
     if sm.session_exists(name=name, path=path):
         model = sm.get_session(name=name, path=path)
     else:
         # allow nbm to specify kernels cwd
         kernel_path = nbm.get_kernel_path(name=name, path=path)
         kernel_id = km.start_kernel(path=kernel_path)
         model = sm.create_session(name=name, path=path, kernel_id=kernel_id)
     location = url_path_join(self.base_url, "api", "sessions", model["id"])
     self.set_header("Location", url_escape(location))
     self.set_status(201)
     self.finish(json.dumps(model, default=date_default))
Example #2
0
    def post(self):
        # Creates a new session
        #(unless a session already exists for the named nb)
        sm = self.session_manager

        model = self.get_json_body()
        if model is None:
            raise web.HTTPError(400, "No JSON data provided")
        try:
            name = model['notebook']['name']
        except KeyError:
            raise web.HTTPError(400,
                                "Missing field in JSON data: notebook.name")
        try:
            path = model['notebook']['path']
        except KeyError:
            raise web.HTTPError(400,
                                "Missing field in JSON data: notebook.path")
        try:
            kernel_name = model['kernel']['name']
        except KeyError:
            raise web.HTTPError(400, "Missing field in JSON data: kernel.name")

        # Check to see if session exists
        if sm.session_exists(name=name, path=path):
            model = sm.get_session(name=name, path=path)
        else:
            model = sm.create_session(name=name,
                                      path=path,
                                      kernel_name=kernel_name)
        location = url_path_join(self.base_url, 'api', 'sessions', model['id'])
        self.set_header('Location', url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model, default=date_default))
Example #3
0
    def post(self):
        # Creates a new session
        #(unless a session already exists for the named nb)
        sm = self.session_manager
        cm = self.contents_manager
        km = self.kernel_manager

        model = self.get_json_body()
        if model is None:
            raise web.HTTPError(400, "No JSON data provided")
        try:
            name = model['notebook']['name']
        except KeyError:
            raise web.HTTPError(400, "Missing field in JSON data: notebook.name")
        try:
            path = model['notebook']['path']
        except KeyError:
            raise web.HTTPError(400, "Missing field in JSON data: notebook.path")
        try:
            kernel_name = model['kernel']['name']
        except KeyError:
            self.log.debug("No kernel name specified, using default kernel")
            kernel_name = None

        # Check to see if session exists
        if sm.session_exists(name=name, path=path):
            model = sm.get_session(name=name, path=path)
        else:
            model = sm.create_session(name=name, path=path, kernel_name=kernel_name)
        location = url_path_join(self.base_url, 'api', 'sessions', model['id'])
        self.set_header('Location', url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model, default=date_default))
Example #4
0
    def get(self, path=''):
        cm = self.contents_manager
        if cm.path_exists(path):
            # it's a *directory*, redirect to /tree
            url = url_path_join(self.base_url, 'tree', path)
        else:
            orig_path = path
            # otherwise, redirect to /files
            parts = path.split('/')
            path = '/'.join(parts[:-1])
            name = parts[-1]

            if not cm.file_exists(name=name, path=path) and 'files' in parts:
                # redirect without files/ iff it would 404
                # this preserves pre-2.0-style 'files/' links
                self.log.warn("Deprecated files/ URL: %s", orig_path)
                parts.remove('files')
                path = '/'.join(parts[:-1])

            if not cm.file_exists(name=name, path=path):
                raise web.HTTPError(404)

            url = url_path_join(self.base_url, 'files', path, name)
        url = url_escape(url)
        self.log.debug("Redirecting %s to %s", self.request.path, url)
        self.redirect(url)
Example #5
0
    def redirect_to_files(self, path):
        """make redirect logic a reusable static method
        
        so it can be called from other handlers.
        """
        cm = self.contents_manager
        if cm.dir_exists(path):
            # it's a *directory*, redirect to /tree
            url = url_path_join(self.base_url, 'tree', path)
        else:
            orig_path = path
            # otherwise, redirect to /files
            parts = path.split('/')

            if not cm.file_exists(path=path) and 'files' in parts:
                # redirect without files/ iff it would 404
                # this preserves pre-2.0-style 'files/' links
                self.log.warn("Deprecated files/ URL: %s", orig_path)
                parts.remove('files')
                path = '/'.join(parts)

            if not cm.file_exists(path=path):
                raise web.HTTPError(404)

            url = url_path_join(self.base_url, 'files', path)
        url = url_escape(url)
        self.log.debug("Redirecting %s to %s", self.request.path, url)
        self.redirect(url)
Example #6
0
 def post(self):
     # Creates a new session 
     #(unless a session already exists for the named nb)
     sm = self.session_manager
     nbm = self.notebook_manager
     km = self.kernel_manager
     model = self.get_json_body()
     if model is None:
         raise web.HTTPError(400, "No JSON data provided")
     try:
         name = model['notebook']['name']
     except KeyError:
         raise web.HTTPError(400, "Missing field in JSON data: name")
     try:
         path = model['notebook']['path']
     except KeyError:
         raise web.HTTPError(400, "Missing field in JSON data: path")
     # Check to see if session exists
     if sm.session_exists(name=name, path=path):
         model = sm.get_session(name=name, path=path)
     else:
         kernel_id = km.start_kernel(cwd=nbm.get_os_path(path))
         model = sm.create_session(name=name, path=path, kernel_id=kernel_id, ws_url=self.ws_url)
     location = url_path_join(self.base_url, 'api', 'sessions', model['id'])
     self.set_header('Location', url_escape(location))
     self.set_status(201)
     self.finish(json.dumps(model, default=date_default))
Example #7
0
def test_url_escape():

    # changes path or notebook name with special characters to url encoding
    # these tests specifically encode paths with spaces
    path = url_escape('/this is a test/for spaces/')
    nt.assert_equal(path, '/this%20is%20a%20test/for%20spaces/')

    path = url_escape('notebook with space.ipynb')
    nt.assert_equal(path, 'notebook%20with%20space.ipynb')

    path = url_escape('/path with a/notebook and space.ipynb')
    nt.assert_equal(path, '/path%20with%20a/notebook%20and%20space.ipynb')
    
    path = url_escape('/ !@$#%^&* / test %^ notebook @#$ name.ipynb')
    nt.assert_equal(path,
        '/%20%21%40%24%23%25%5E%26%2A%20/%20test%20%25%5E%20notebook%20%40%23%24%20name.ipynb')
Example #8
0
    def redirect_to_files(self, path):
        """make redirect logic a reusable static method
        
        so it can be called from other handlers.
        """
        cm = self.contents_manager
        if cm.dir_exists(path):
            # it's a *directory*, redirect to /tree
            url = url_path_join(self.base_url, 'tree', path)
        else:
            orig_path = path
            # otherwise, redirect to /files
            parts = path.split('/')

            if not cm.file_exists(path=path) and 'files' in parts:
                # redirect without files/ iff it would 404
                # this preserves pre-2.0-style 'files/' links
                self.log.warn("Deprecated files/ URL: %s", orig_path)
                parts.remove('files')
                path = '/'.join(parts)

            if not cm.file_exists(path=path):
                raise web.HTTPError(404)

            url = url_path_join(self.base_url, 'files', path)
        url = url_escape(url)
        self.log.debug("Redirecting %s to %s", self.request.path, url)
        self.redirect(url)
Example #9
0
    def get(self, path=''):
        cm = self.contents_manager
        if cm.path_exists(path):
            # it's a *directory*, redirect to /tree
            url = url_path_join(self.base_url, 'tree', path)
        else:
            orig_path = path
            # otherwise, redirect to /files
            parts = path.split('/')
            path = '/'.join(parts[:-1])
            name = parts[-1]

            if not cm.file_exists(name=name, path=path) and 'files' in parts:
                # redirect without files/ iff it would 404
                # this preserves pre-2.0-style 'files/' links
                self.log.warn("Deprecated files/ URL: %s", orig_path)
                parts.remove('files')
                path = '/'.join(parts[:-1])

            if not cm.file_exists(name=name, path=path):
                raise web.HTTPError(404)

            url = url_path_join(self.base_url, 'files', path, name)
        url = url_escape(url)
        self.log.debug("Redirecting %s to %s", self.request.path, url)
        self.redirect(url)
Example #10
0
 def post(self):
     km = self.kernel_manager
     kernel_id = km.start_kernel()
     model = km.kernel_model(kernel_id, self.ws_url)
     location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
     self.set_header('Location', url_escape(location))
     self.set_status(201)
     self.finish(jsonapi.dumps(model))
Example #11
0
 def post(self):
     km = self.kernel_manager
     kernel_id = km.start_kernel()
     model = km.kernel_model(kernel_id)
     location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
     self.set_header('Location', url_escape(location))
     self.set_status(201)
     self.finish(jsonapi.dumps(model))
Example #12
0
 def post(self, path="", name=None):
     """post creates a new checkpoint"""
     cm = self.contents_manager
     checkpoint = cm.create_checkpoint(name, path)
     data = json.dumps(checkpoint, default=date_default)
     location = url_path_join(self.base_url, "api/contents", path, name, "checkpoints", checkpoint["id"])
     self.set_header("Location", url_escape(location))
     self.set_status(201)
     self.finish(data)
Example #13
0
def test_url_escape():

    # changes path or notebook name with special characters to url encoding
    # these tests specifically encode paths with spaces
    path = url_escape('/this is a test/for spaces/')
    nt.assert_equal(path, '/this%20is%20a%20test/for%20spaces/')

    path = url_escape('notebook with space.ipynb')
    nt.assert_equal(path, 'notebook%20with%20space.ipynb')

    path = url_escape('/path with a/notebook and space.ipynb')
    nt.assert_equal(path, '/path%20with%20a/notebook%20and%20space.ipynb')

    path = url_escape('/ !@$#%^&* / test %^ notebook @#$ name.ipynb')
    nt.assert_equal(
        path,
        '/%20%21%40%24%23%25%5E%26%2A%20/%20test%20%25%5E%20notebook%20%40%23%24%20name.ipynb'
    )
Example #14
0
    def location_url(self, path):
        """Return the full URL location of a file.

        Parameters
        ----------
        path : unicode
            The API path of the file, such as "foo/bar.txt".
        """
        return url_escape(url_path_join(self.base_url, "api", "contents", path))
Example #15
0
 def post(self, path='', name=None):
     """post creates a new checkpoint"""
     nbm = self.notebook_manager
     checkpoint = nbm.create_checkpoint(name, path)
     data = json.dumps(checkpoint, default=date_default)
     location = url_path_join(self.base_project_url, 'api/notebooks', path,
                              name, 'checkpoints', checkpoint['id'])
     self.set_header('Location', url_escape(location))
     self.set_status(201)
     self.finish(data)
Example #16
0
    def location_url(self, path):
        """Return the full URL location of a file.

        Parameters
        ----------
        path : unicode
            The API path of the file, such as "foo/bar.txt".
        """
        return url_escape(url_path_join(self.base_url, 'api', 'contents',
                                        path))
Example #17
0
 def _check_created(self, resp, path, type='notebook'):
     self.assertEqual(resp.status_code, 201)
     location_header = py3compat.str_to_unicode(resp.headers['Location'])
     self.assertEqual(location_header, url_escape(url_path_join(u'/api/contents', path)))
     rjson = resp.json()
     self.assertEqual(rjson['name'], path.rsplit('/', 1)[-1])
     self.assertEqual(rjson['path'], path)
     self.assertEqual(rjson['type'], type)
     isright = self.isdir if type == 'directory' else self.isfile
     assert isright(path)
Example #18
0
 def _check_created(self, resp, path, type="notebook"):
     self.assertEqual(resp.status_code, 201)
     location_header = py3compat.str_to_unicode(resp.headers["Location"])
     self.assertEqual(location_header, url_escape(url_path_join(u"/api/contents", path)))
     rjson = resp.json()
     self.assertEqual(rjson["name"], path.rsplit("/", 1)[-1])
     self.assertEqual(rjson["path"], path)
     self.assertEqual(rjson["type"], type)
     isright = os.path.isdir if type == "directory" else os.path.isfile
     assert isright(pjoin(self.notebook_dir.name, path.replace("/", os.sep)))
Example #19
0
 def _check_created(self, resp, path, type='notebook'):
     self.assertEqual(resp.status_code, 201)
     location_header = py3compat.str_to_unicode(resp.headers['Location'])
     self.assertEqual(location_header, url_escape(url_path_join(u'/api/contents', path)))
     rjson = resp.json()
     self.assertEqual(rjson['name'], path.rsplit('/', 1)[-1])
     self.assertEqual(rjson['path'], path)
     self.assertEqual(rjson['type'], type)
     isright = self.isdir if type == 'directory' else self.isfile
     assert isright(path)
Example #20
0
 def post(self, path='', name=None):
     """post creates a new checkpoint"""
     nbm = self.notebook_manager
     checkpoint = nbm.create_checkpoint(name, path)
     data = json.dumps(checkpoint, default=date_default)
     location = url_path_join(self.base_project_url, 'api/notebooks',
         path, name, 'checkpoints', checkpoint['id'])
     self.set_header('Location', url_escape(location))
     self.set_status(201)
     self.finish(data)
Example #21
0
 def post(self, path=''):
     """post creates a new checkpoint"""
     cm = self.contents_manager
     checkpoint = yield gen.maybe_future(cm.create_checkpoint(path))
     data = json.dumps(checkpoint, default=date_default)
     location = url_path_join(self.base_url, 'api/contents',
         path, 'checkpoints', checkpoint['id'])
     self.set_header('Location', url_escape(location))
     self.set_status(201)
     self.finish(data)
 def _check_nb_created(self, resp, name, path):
     self.assertEqual(resp.status_code, 201)
     location_header = py3compat.str_to_unicode(resp.headers['Location'])
     self.assertEqual(location_header, url_escape(url_path_join(u'/api/notebooks', path, name)))
     self.assertEqual(resp.json()['name'], name)
     assert os.path.isfile(pjoin(
         self.notebook_dir.name,
         path.replace('/', os.sep),
         name,
     ))
Example #23
0
 def _check_nb_created(self, resp, name, path):
     self.assertEqual(resp.status_code, 201)
     location_header = py3compat.str_to_unicode(resp.headers['Location'])
     self.assertEqual(location_header, url_escape(url_path_join(u'/api/notebooks', path, name)))
     self.assertEqual(resp.json()['name'], name)
     assert os.path.isfile(pjoin(
         self.notebook_dir.name,
         path.replace('/', os.sep),
         name,
     ))
Example #24
0
    def location_url(self, name, path):
        """Return the full URL location of a file.

        Parameters
        ----------
        name : unicode
            The base name of the file, such as "foo.ipynb".
        path : unicode
            The API path of the file, such as "foo/bar".
        """
        return url_escape(url_path_join(self.base_url, "api", "contents", path, name))
Example #25
0
 def notebook_location(self, name, path=''):
     """Return the full URL location of a notebook based.
     
     Parameters
     ----------
     name : unicode
         The base name of the notebook, such as "foo.ipynb".
     path : unicode
         The URL path of the notebook.
     """
     return url_escape(
         url_path_join(self.base_url, 'api', 'notebooks', path, name))
Example #26
0
    def location_url(self, name, path):
        """Return the full URL location of a file.

        Parameters
        ----------
        name : unicode
            The base name of the file, such as "foo.ipynb".
        path : unicode
            The API path of the file, such as "foo/bar".
        """
        return url_escape(
            url_path_join(self.base_url, 'api', 'contents', path, name))
Example #27
0
 def notebook_location(self, name, path=''):
     """Return the full URL location of a notebook based.
     
     Parameters
     ----------
     name : unicode
         The base name of the notebook, such as "foo.ipynb".
     path : unicode
         The URL path of the notebook.
     """
     return url_escape(url_path_join(
         self.base_project_url, 'api', 'notebooks', path, name
     ))
Example #28
0
    def post(self):
        km = self.kernel_manager
        model = self.get_json_body()
        if model is None:
            model = {"name": km.default_kernel_name}
        else:
            model.setdefault("name", km.default_kernel_name)

        kernel_id = km.start_kernel(kernel_name=model["name"])
        model = km.kernel_model(kernel_id)
        location = url_path_join(self.base_url, "api", "kernels", kernel_id)
        self.set_header("Location", url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model))
Example #29
0
 def _check_created(self, resp, name, path, type='notebook'):
     self.assertEqual(resp.status_code, 201)
     location_header = py3compat.str_to_unicode(resp.headers['Location'])
     self.assertEqual(location_header, url_escape(url_path_join(u'/api/contents', path, name)))
     rjson = resp.json()
     self.assertEqual(rjson['name'], name)
     self.assertEqual(rjson['path'], path)
     self.assertEqual(rjson['type'], type)
     isright = os.path.isdir if type == 'directory' else os.path.isfile
     assert isright(pjoin(
         self.notebook_dir.name,
         path.replace('/', os.sep),
         name,
     ))
Example #30
0
    def post(self):
        km = self.kernel_manager
        model = self.get_json_body()
        if model is None:
            model = {'name': km.default_kernel_name}
        else:
            model.setdefault('name', km.default_kernel_name)

        kernel_id = km.start_kernel(kernel_name=model['name'])
        model = km.kernel_model(kernel_id)
        location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
        self.set_header('Location', url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model))
Example #31
0
    def post(self):
        model = self.get_json_body()
        if model is None:
            raise web.HTTPError(400, "No JSON data provided")
        try:
            name = model['name']
        except KeyError:
            raise web.HTTPError(400, "Missing field in JSON data: name")

        km = self.kernel_manager
        kernel_id = km.start_kernel(kernel_name=name)
        model = km.kernel_model(kernel_id)
        location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
        self.set_header('Location', url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model))
Example #32
0
    def post(self):
        km = self.kernel_manager
        model = self.get_json_body()
        if model is None:
            model = {
                'name': km.default_kernel_name
            }
        else:
            model.setdefault('name', km.default_kernel_name)

        kernel_id = km.start_kernel(kernel_name=model['name'])
        model = km.kernel_model(kernel_id)
        location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
        self.set_header('Location', url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model))
Example #33
0
    def post(self):
        model = self.get_json_body()
        if model is None:
            raise web.HTTPError(400, "No JSON data provided")
        try:
            name = model['name']
        except KeyError:
            raise web.HTTPError(400, "Missing field in JSON data: name")

        km = self.kernel_manager
        kernel_id = km.start_kernel(kernel_name=name)
        model = km.kernel_model(kernel_id)
        location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
        self.set_header('Location', url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model))
Example #34
0
 def _check_created(self, resp, name, path, type='notebook'):
     self.assertEqual(resp.status_code, 201)
     location_header = py3compat.str_to_unicode(resp.headers['Location'])
     self.assertEqual(
         location_header,
         url_escape(url_path_join(u'/api/contents', path, name)))
     rjson = resp.json()
     self.assertEqual(rjson['name'], name)
     self.assertEqual(rjson['path'], path)
     self.assertEqual(rjson['type'], type)
     isright = os.path.isdir if type == 'directory' else os.path.isfile
     assert isright(
         pjoin(
             self.notebook_dir.name,
             path.replace('/', os.sep),
             name,
         ))
Example #35
0
    def post(self):
        # Creates a new session
        #(unless a session already exists for the named nb)
        sm = self.session_manager
        cm = self.contents_manager
        km = self.kernel_manager

        model = self.get_json_body()
        if model is None:
            raise web.HTTPError(400, "No JSON data provided")
        try:
            name = model['notebook']['name']
        except KeyError:
            raise web.HTTPError(400, "Missing field in JSON data: notebook.name")
        try:
            path = model['notebook']['path']
        except KeyError:
            raise web.HTTPError(400, "Missing field in JSON data: notebook.path")
        try:
            kernel_name = model['kernel']['name']
        except KeyError:
            self.log.debug("No kernel name specified, using default kernel")
            kernel_name = None

        # Check to see if session exists
        if sm.session_exists(name=name, path=path):
            model = sm.get_session(name=name, path=path)
        else:
            try:
                model = sm.create_session(name=name, path=path, kernel_name=kernel_name)
            except NoSuchKernel:
                msg = ("The '%s' kernel is not available. Please pick another "
                       "suitable kernel instead, or install that kernel." % kernel_name)
                status_msg = '%s not found' % kernel_name
                self.log.warn('Kernel not found: %s' % kernel_name)
                self.set_status(501)
                self.finish(json.dumps(dict(message=msg, short_message=status_msg)))
                return

        location = url_path_join(self.base_url, 'api', 'sessions', model['id'])
        self.set_header('Location', url_escape(location))
        self.set_status(201)
        self.finish(json.dumps(model, default=date_default))