Quick Start#

Note

You can also execute this tutorial in Quick-start Jupyter notebook on Binder

Let’s get started by demonstrating how you can use zenopy in a few brief sections. For more details, check out our User Guide.

Access your Zenodo Account#

The first step to start using zenopy is to import it

>>> import zenopy

In order to interact with Zenodo servers, we need to create a zenopy client object

>>> cli = zenopy.Zenodo()
WARNING: The config file (~/.zenodorc) is found.

Upon successful construction of the client object, zenopy issues a warning stating that zenopy assumes you have a config file (called .zenodorc) in your home directory. This config file should store the token you generated from your Zenodo account and looks like the following

[ZENODO]
my_token = <token-generated-from-Zenodo-account>

If you do not know how to create a token from your Zenodo account, see here.

Working with the Existing Depositions#

Once zenopy’s client instance is initialized with your token, it allows you to inspect the existing records corresponding to your Zenodo account. In order to access the existing depositions on your account, first call client’s member funtion init_deposition()

>>> depo = cli.init_deposition()

This command generates a Deposition class instance that allows you to perform operations that are pertinent to the Zenodo Deposition Entities.

Listing Depositions#

The Deposition class instance enables you to interact with your personal or organization depositions. For instance, you can list all existing depositions corresponding to your Zenodo account by calling the list_depositions() on the depo instance object

>>> rec = depo.list_depositions()
>>> rec
[<zenopy.record.Record at 0x7fa129db0310>]

As the function name indicates, the result is a list of zenopy’s Record object(s). In this case, the list consists of one record which mirrors the same construction the corresponding Zenodo accont. In order to access each record’s contents, simply call its .data attribute

>>> rec[0].data
Output exceeds the size limit. Open the full output data in a text editor
{'conceptdoi': '10.5281/zenodo.5120242',
 'conceptrecid': '5120242',
 'created': '2021-07-21T18:10:05.154930',
 'doi': '10.5281/zenodo.5120243',
 'doi_url': 'https://doi.org/10.5281/zenodo.5120243',
 'files': [{'checksum': 'b528606728a7dd0f38df17550c2773e2',
   'filename': 'gpu_programming_beginner-gh-pages.zip',
   'filesize': 3208145,
   'id': 'b65d5454-44bf-486d-ba44-46be2ca72fc2',
   'links': {'download': 'https://zenodo.org/api/files/fcacb59c-ec78-4f39-95bf-e364069fb5fb/gpu_programming_beginner-gh-pages.zip',
    'self': 'https://zenodo.org/api/deposit/depositions/5120243/files/b65d5454-44bf-486d-ba44-46be2ca72fc2'}}],
 'id': 5120243,
 'links': {'badge': 'https://zenodo.org/badge/doi/10.5281/zenodo.5120243.svg',
  'bucket': 'https://zenodo.org/api/files/0a60bd71-a171-4196-b639-44cf5cde22dd',
  'conceptbadge': 'https://zenodo.org/badge/doi/10.5281/zenodo.5120242.svg',
  'conceptdoi': 'https://doi.org/10.5281/zenodo.5120242',
  'discard': 'https://zenodo.org/api/deposit/depositions/5120243/actions/discard',
  'doi': 'https://doi.org/10.5281/zenodo.5120243',
  'edit': 'https://zenodo.org/api/deposit/depositions/5120243/actions/edit',
  'files': 'https://zenodo.org/api/deposit/depositions/5120243/files',
  'html': 'https://zenodo.org/deposit/5120243',
  'latest': 'https://zenodo.org/api/records/5120243',
  'latest_html': 'https://zenodo.org/record/5120243',
  'publish': 'https://zenodo.org/api/deposit/depositions/5120243/actions/publish',
  'record': 'https://zenodo.org/api/records/5120243',
...
 'owner': 243844,
 'record_id': 5120243,
 'state': 'done',
 'submitted': True,
 'title': 'Fundamentals of Heterogeneous Parallel Programming with CUDA C/C++'}

Tip

You can also represent your record data by passing the record object to a print() function.

Creating Depositions#

You can create a new deposition draft on your Zenodo account by calling the create_deposition() on the Deposition class instance

>>> draft_depo = depo.create_deposition()
>>> draft_depo
<zenopy.record.Record at 0x7fbcc46bafb0>

which returns a new zenopy Record object allowing you to inspect its contents

>>> draft_depo.data
{'conceptrecid': '1104407',
 'created': '2022-09-14T13:38:57.183068+00:00',
 'files': [],
 'id': 1104408,
 'links': {'bucket': 'https://sandbox.zenodo.org/api/files/ab481ab2-45eb-44dc-96e8-65d06fed9d1b',
  'discard': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/discard',
  'edit': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/edit',
  'files': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/files',
  'html': 'https://sandbox.zenodo.org/deposit/1104408',
  'latest_draft': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408',
  'latest_draft_html': 'https://sandbox.zenodo.org/deposit/1104408',
  'publish': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/publish',
  'self': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408'},
 'metadata': {'prereserve_doi': {'doi': '10.5072/zenodo.1104408',
   'recid': 1104408}},
 'modified': '2022-09-14T13:38:57.183080+00:00',
 'owner': 123811,
 'record_id': 1104408,
 'state': 'unsubmitted',
 'submitted': False,
 'title': ''}

As you can see, there are multiple deposition fields such as doi that Zenodo server has already minted for you. Other (meta)data fields such as title and files are for you to populate. Looking at the Upload tab in your Zenodo account, you should be able to verify that the deposition draft container is created for you

Creating a deposition draft container figure

Creating a deposition draft container#

You can think of the Record objects as dictionaries or JSON objects with each element being a key : value pair. Let’s edit the title field as an example

>>> draft_depo.data["title"] = "Using zenopy is super easy!"
>>> draft_depo.data
{'conceptrecid': '1104407',
 'created': '2022-09-14T13:38:57.183068+00:00',
 'files': [],
 'id': 1104408,
 'links': {'bucket': 'https://sandbox.zenodo.org/api/files/ab481ab2-45eb-44dc-96e8-65d06fed9d1b',
  'discard': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/discard',
  'edit': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/edit',
  'files': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/files',
  'html': 'https://sandbox.zenodo.org/deposit/1104408',
  'latest_draft': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408',
  'latest_draft_html': 'https://sandbox.zenodo.org/deposit/1104408',
  'publish': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/publish',
  'self': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408'},
 'metadata': {'prereserve_doi': {'doi': '10.5072/zenodo.1104408',
   'recid': 1104408}},
 'modified': '2022-09-14T13:38:57.183080+00:00',
 'owner': 123811,
 'record_id': 1104408,
 'state': 'unsubmitted',
 'submitted': False,
 'title': 'Using zenopy is super easy!'}

Note

Updating fields in the Record draft object(s) does not change the actual deposition(s) records on the Zenodo servers within your account. This is reflected in the state: unsubmitted and submitted: False fields in your record data. If you have ever worked with Git system, you can use the analogy of the local changes which do not affect your remote repository’s contents until you commit and push the local changes to the remote server.

Updating Depositions#

In order to update your Zenodo deposition (commit your local changes to your record draft on the Zenodo server), you can simply pass the minimum required information as arguments to the Deposition class instance’s update_deposition(). First, let’s inspect its docstring by applying the ? operator to the function name

>>> ?depo.update_deposition

which returns the following response

Signature:
depo.update_deposition(
    id_: int = None,
    url: str = None,
    upload_type: str = None,
    publication_type: str = None,
    image_type: str = None,
    publication_date: str = None,
    title: str = None,
    creators: list[dict] = None,
    description: str = None,
    access_right: str = None,
    license: str = None,
    embargo_date: str = None,
    access_conditions: str = None,
) -> zenopy.record.Record
Docstring: Update an existing deposition resource (deposition metadata)
File:      ~/Packages/anaconda3/envs/.../zenopy/depositions.py
Type:      method

To get a complete list of required and optional fields for your deposition metadata refer to Zenodo Documentation.

Let’s go ahead and update (commit) a few changes in the data field values in our deposition container form on Zenodo

>>>  draft_depo = depo.update_deposition(
     id_=1104408,
     upload_type="publication",
     publication_type="technicalnote",
     creators=[{"name":"Mostafanejad, Sina"}],
     access_right="open",
     license="cc-by",
     title="Using zenopy is super easy!",
     description="zenopy is a user-friendly tool for productivity."
     )

Tip

Instead of passing the record id directly, we could extract it from the record object via draft_depo._id attribute.

Now, let’s check the contents of the updated deposition object

>>> draft_depo.data
Output exceeds the size limit. Open the full output data in a text editor
{'conceptrecid': '1104407',
 'created': '2022-09-14T13:38:57.183068+00:00',
 'doi': '',
 'doi_url': 'https://doi.org/',
 'files': [],
 'id': 1104408,
 'links': {'bucket': 'https://sandbox.zenodo.org/api/files/ab481ab2-45eb-44dc-96e8-65d06fed9d1b',
  'discard': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/discard',
  'edit': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/edit',
  'files': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/files',
  'html': 'https://sandbox.zenodo.org/deposit/1104408',
  'latest_draft': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408',
  'latest_draft_html': 'https://sandbox.zenodo.org/deposit/1104408',
  'newversion': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/newversion',
  'publish': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/publish',
  'registerconceptdoi': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/registerconceptdoi',
  'self': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408'},
 'metadata': {'access_right': 'open',
  'creators': [{'name': 'Mostafanejad, Sina'}],
  'description': 'zenopy is a user-friendly tool for productivity.',
  'doi': '',
  'license': 'CC-BY-4.0',
  'prereserve_doi': {'doi': '10.5072/zenodo.1104408', 'recid': 1104408},
  'publication_date': '2022-09-14',
  'publication_type': 'technicalnote',
...
 'owner': 123811,
 'record_id': 1104408,
 'state': 'unsubmitted',
 'submitted': False,
 'title': 'Using zenopy is super easy!'}

The changes are now reflected on the target deposition in our Zenodo account records as well

Updating a deposition draft container figure

Updating a deposition draft container#

Attention

Although we have committed our changes to the Zenodo servers by updating the deposition object, we have not yet published our draft. The status of our record is stored in the state: unsubmitted and submitted: False fields. The status implies two things: (i) We can further modify our record without the need to create a new version of our record, and (ii) the draft is not yet published and thus, not available/accessible to the public.

Retrieving Depositions#

In order to retrieve a deposition, simply pass its id to retrieve_deposition()

>>> fetched_depo = depo.retrieve_deposition(id_=1104408)
>>> print(fetched_depo)
Output exceeds the size limit. Open the full output data in a text editor
{'conceptrecid': '1104407',
 'created': '2022-09-14T13:38:57.183068+00:00',
 'doi': '',
 'doi_url': 'https://doi.org/',
 'files': [],
 'id': 1104408,
 'links': {'bucket': 'https://sandbox.zenodo.org/api/files/ab481ab2-45eb-44dc-96e8-65d06fed9d1b',
           'discard': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/discard',
           'edit': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/edit',
           'files': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/files',
           'html': 'https://sandbox.zenodo.org/deposit/1104408',
           'latest_draft': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408',
           'latest_draft_html': 'https://sandbox.zenodo.org/deposit/1104408',
           'newversion': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/newversion',
           'publish': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/publish',
           'registerconceptdoi': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408/actions/registerconceptdoi',
           'self': 'https://sandbox.zenodo.org/api/deposit/depositions/1104408'},
 'metadata': {'access_right': 'open',
              'creators': [{'name': 'Mostafanejad, Sina'}],
              'description': 'zenopy is a user-friendly tool for productivity.',
              'doi': '',
              'license': 'CC-BY-4.0',
              'prereserve_doi': {'doi': '10.5072/zenodo.1104408',
                                 'recid': 1104408},
              'publication_date': '2022-09-14',
...
 'record_id': 1104408,
 'state': 'unsubmitted',
 'submitted': False,
 'title': 'Using zenopy is super easy!'}

Deleting Depositions#

You can easily delete a deposition draft from your Zenodo account using

>>> depo.delete_deposition(id_=1104408)
An unpublished deposition has been deleted at the following address:
        https://sandbox.zenodo.org/api/deposit/depositions/

Upon successful completion of this command, zenopy notifies you that the deposition has been deleted from your account. You can verify it by checking your Zenodo account from the web browser.