def test_get_gist_raises_exception(self, mock_requests_get, mock_get_api_key): with fake_creds('.jovian', 'credentials.json'): with self.assertRaises(Exception) as context: get_gist('fake_gist_too_large') assert context.exception.args[0] == 'Failed to retrieve metadata for notebook "fake_gist_too_large":' + \ ' (HTTP 500) Internal Server Error'
def test_get_gist_raises_exception(mock_requests_get, mock_get_api_key): with fake_creds(): with pytest.raises(Exception) as context: get_gist("fake_gist_too_large") assert ( str(context.value) == 'Failed to retrieve metadata for notebook "fake_gist_too_large":' + " (HTTP 500) Internal Server Error")
def _parse_project(project, filename, new_project): """Perform the required checks and get the final project name""" current_slug = get_cached_slug() # Check for existing project in-memory or in .jovianrc if not new_project and project is None: # From in-memory variable if current_slug is not None: project = current_slug # From .jovianrc file else: project = get_notebook_slug(filename) # Skip if project is not provided & can't be read if project is None: return None, None # Get project metadata for UUID & username/title if is_uuid(project): project_title = None metadata = api.get_gist(project) elif '/' in project: project_title = project.split('/')[1] username = api.get_current_user()['username'] metadata = api.get_gist(project) # Attach username to the title else: project_title = project username = api.get_current_user()['username'] metadata = api.get_gist(username + '/' + project) # Skip if metadata could not be found if not metadata: log('Creating a new project "' + username + '/' + project_title + '"') return project_title, None # Extract information from metadata username = metadata['owner']['username'] project_title = metadata['title'] project_id = metadata['slug'] # Check if the current user can commit to this project permissions = api.get_gist_access(project_id) if not permissions['write']: return project_title, None # Log whether this is an update or creation if project_id is None: log('Creating a new notebook on ' + read_webapp_url()) else: log('Updating notebook "' + username + "/" + project_title + '" on ' + read_webapp_url()) return project_title, project_id
def test_get_gist(mock_requests_get, mock_request_get_api_key): with fake_creds(): get_gist("rohit/demo-notebook") mock_requests_get.assert_called_with( "https://api-staging.jovian.ai/user/rohit/gist/demo-notebook", headers={ "Authorization": "Bearer fake_api_key", "x-jovian-source": "library", "x-jovian-library-version": __version__, "x-jovian-guest": "b6538d4dfde04fcf993463a828a9cec6", "x-jovian-org": "staging", }, params=None, ) get_gist("rohit/demo-notebook", version=3) mock_requests_get.assert_called_with( "https://api-staging.jovian.ai/user/rohit/gist/demo-notebook?gist_version=3", headers={ "Authorization": "Bearer fake_api_key", "x-jovian-source": "library", "x-jovian-library-version": __version__, "x-jovian-guest": "b6538d4dfde04fcf993463a828a9cec6", "x-jovian-org": "staging", }, params=None, ) get_gist("f67108fc906341d8b15209ce88ebc3d2") mock_requests_get.assert_called_with( "https://api-staging.jovian.ai/gist/f67108fc906341d8b15209ce88ebc3d2", headers={ "Authorization": "Bearer fake_api_key", "x-jovian-source": "library", "x-jovian-library-version": __version__, "x-jovian-guest": "b6538d4dfde04fcf993463a828a9cec6", "x-jovian-org": "staging", }, params=None, )
def test_get_gist(self, mock_requests_get, mock_request_get_api_key): with fake_creds('.jovian', 'credentials.json'): get_gist('rohit/demo-notebook') mock_requests_get.assert_called_with( 'https://api-staging.jovian.ai/user/rohit/gist/demo-notebook', headers={ "Authorization": "Bearer fake_api_key", "x-jovian-source": "library", "x-jovian-library-version": __version__, "x-jovian-guest": "b6538d4dfde04fcf993463a828a9cec6", "x-jovian-org": "staging" }, params=None) get_gist('rohit/demo-notebook', version=3) mock_requests_get.assert_called_with( 'https://api-staging.jovian.ai/user/rohit/gist/demo-notebook?gist_version=3', headers={ "Authorization": "Bearer fake_api_key", "x-jovian-source": "library", "x-jovian-library-version": __version__, "x-jovian-guest": "b6538d4dfde04fcf993463a828a9cec6", "x-jovian-org": "staging" }, params=None) get_gist('f67108fc906341d8b15209ce88ebc3d2') mock_requests_get.assert_called_with( 'https://api-staging.jovian.ai/gist/f67108fc906341d8b15209ce88ebc3d2', headers={ "Authorization": "Bearer fake_api_key", "x-jovian-source": "library", "x-jovian-library-version": __version__, "x-jovian-guest": "b6538d4dfde04fcf993463a828a9cec6", "x-jovian-org": "staging" }, params=None)
def test_get_gist_not_found(self, mock_requests_get, mock_get_api_key): with fake_creds('.jovian', 'credentials.json'): assert get_gist('fake_nonexistent_gist') == False
def test_get_gist_not_found(mock_requests_get, mock_get_api_key): with fake_creds(): assert get_gist("fake_nonexistent_gist") == False
def commit(secret=False, nb_filename=None, files=[], capture_env=True, env_type='conda', notebook_id=None, create_new=None): """Save the notebook, capture environment and upload to the cloud for sharing. In most cases, commit works well with the default arguments. It attempts to 1. Save the Jupyter notebook 2. Upload the notebook (and additional scripts, CSVs etc.) to https://jvn.io 3. Capture the python environment (using Anaconda or pip) 4. Upload the python environment to cloud Capturing the python environment ensures that the notebook can be reproduced and executed easily using the `jovian` command line tool. For more details, see https://jvn.io/getting-started . Issues and bugs can be reported here: https://github.com/swiftace-ai/jovian-py Arguments: secret (bool, optional): Create a secret notebook on https://jvn.io , which is only accessible via the link, and is not visible on the owner's public profile. By default, commited notebooks are public and visible on the owner's profile. nb_filename (string, optional): The filename of the jupyter notebook (including the .ipynb extension). This is detected automatically in most cases, but in certain environments like Jupyter Lab, the detection may fail and the filename needs to be provided using this argument. files (array, optional): Any additional scripts (.py files), CSVs that are required to run the notebook. These will be available in the files tab on https://jvn.io . capture_env (bool, optional): If `True`, the Python environment (python version, libraries etc.) are captured and uploaded along with the notebook. env_type (string, optional): The type of environment to be captured. Allowed options are 'conda' and 'pip'. notebook_id (string, optional): If you wish to update an existing notebook owned by you, you can use this argument to provide the base64 ID (present in the URL) of an notebook hosted on https://jvn.io . In most cases, this argument is not required, and the library can automatically infer whether you are looking to update an existing notebook or create a new one. create_new (bool, optional): If set to True, doesn't update the existing notebook on https://jvn.io (if one is detected). Instead, it creates a new notebook when commit is called. """ global _current_slug # Check if we're in a Jupyter environment if not in_notebook(): log('Failed to detect Juptyer notebook. Skipping..', error=True) return # Save the notebook (uses Javascript, doesn't work everywhere) log('Saving notebook..') save_notebook() sleep(1) # Get the filename of the notebook (if not provided) if nb_filename is None: nb_filename = get_notebook_name() # Exit with help message if filename wasn't detected (or provided) if nb_filename is None: log(FILENAME_MSG) return # Check whether to create a new gist, or update an old one if not create_new and notebook_id is None: # First preference to the in-memory slug variable if _current_slug is not None: notebook_id = _current_slug else: notebook_id = get_notebook_slug(nb_filename) # Check if the current user can push to this slug if notebook_id is not None: gist_meta = get_gist(notebook_id) if not gist_meta['isOwner']: notebook_id = None # Log whether this is an update or creation if notebook_id is None: log('Creating a new notebook on https://jvn.io') else: log('Updating notebook "' + notebook_id + '" on https://jvn.io') # Upload the notebook & create/update the gist res = create_gist_simple(nb_filename, notebook_id, secret) if res is None: return # Extract slug and owner from created gist slug, owner = res['slug'], res['owner'] # Set/update the slug information _current_slug = slug set_notebook_slug(nb_filename, slug) # Save & upload environment if capture_env: log('Capturing environment..') if env_type == 'conda': # Capture conda environment try: upload_conda_env(slug) except CondaError as e: log(str(e), error=True) elif env_type == 'pip': # Capture pip environment try: upload_pip_env(slug) except Exception as e: log(str(e), error=True) # Upload additional files if files and len(files) > 0: log('Uploading additional files..') # Upload each file for fname in files: if os.path.exists(fname) and not os.path.isdir(fname): try: upload_file(slug, fname) except Exception as e: log(str(e), error=True) elif os.path.isdir(fname): log('Ignoring directory "' + fname + '"', error=True) else: log('Ignoring "' + fname + '" (not found)', error=True) # Print commit URL log('Committed successfully! ' + WEBAPP_URL + "/" + owner['username'] + "/" + slug)