Source code for argopy.tutorial

"""

Useful for documentation, to play with and to test argopy

Data files are hosted on companion repository: http://www.github.com/euroargodev/argopy-data

```
import argopy
ftproot, flist = argopy.tutorial.open_dataset('gdac')
ftproot, flist = argopy.tutorial.open_dataset('weekly_index_prof')
ftproot, flist = argopy.tutorial.open_dataset('global_index_prof')

# To force a new download of the data repo:
argopy.tutorial.repodata().download(overwrite=True)
```
"""

import os
from zipfile import ZipFile
from urllib.request import urlretrieve
import shutil


_DEFAULT_CACHE_DIR = os.path.expanduser(os.path.sep.join(["~", ".argopy_tutorial_data"]))


[docs] def open_dataset(name: str) -> tuple: """ Open a dataset from the argopy online data repository (requires internet). If a local copy is found then always use that to avoid network traffic. Refresh dataset with: ``` argopy.tutorial.repodata().download(overwrite=True) ``` Parameters ---------- name: str Name of the dataset to load or get information for. It can be one of the following: - ``gdac``: A small subset of the GDAC ftp. - ``weekly_index_prof``: The weekly profile index file - ``global_index_prof``: The global profile index file Returns ------- path: str Root path to files files: list(str) or str List of files with the requested dataset """ if name == 'gdac': gdacftp = sample_ftp() gdacftp.download(overwrite=False) return gdacftp.rootpath, gdacftp.ls() elif name == 'weekly_index_prof': gdacftp = sample_ftp() gdacftp.download(overwrite=False) flist = gdacftp.ls() ifile = [f for f in flist if 'ar_index_this_week_prof.txt' in f][0] return gdacftp.rootpath, ifile elif name == 'global_index_prof': gdacftp = sample_ftp() gdacftp.download(overwrite=False) flist = gdacftp.ls() ifile = [f for f in flist if 'ar_index_global_prof.txt' in f][0] return gdacftp.rootpath, ifile else: raise ValueError("Unknown tutorial dataset ('%s')" % name)
class repodata(): """ Helper class for the local copy of the repository data """ def __init__(self, path: str = _DEFAULT_CACHE_DIR): self.localpath = os.path.expanduser(path) self.downloaded = os.path.isdir(self.localpath) pass @property def rootpath(self): if self.downloaded: return self.localpath else: raise FileNotFoundError("Local repository data not found at '%s'.\n " "Try a: 'argopy.tutorial.repodata().download()' first." % self.localpath) def download(self, repo: str = 'argopy-data', branch: str = 'master', overwrite: bool = True): """ Download an euroargodev repository Override the destination folder ! """ if self.downloaded: if overwrite: shutil.rmtree(self.localpath) else: # warnings.warn("Data already downloaded !") return self.rootpath # else: # warnings.warn("Downloading repo data ...") zipurl = "https://github.com/euroargodev/%s/archive/%s.zip" % (repo, branch) localzipfile = self.localpath + ".zip" # Download zip file: urlretrieve(zipurl, localzipfile) # nosec B310 because protocol cannot be modified # Expand zip file to a temporary location: _tempo_dir = self.localpath + "_master" with ZipFile(localzipfile, 'r') as zipObj: zipObj.extractall(path=_tempo_dir) # Extract all the contents of zip file # Move the repo dir to final destination: shutil.move(os.path.join(_tempo_dir, "%s-%s" % (repo, branch)), self.localpath) # Delete temporary location and zip file: os.rmdir(_tempo_dir) os.remove(localzipfile) return self.rootpath class sample_ftp(repodata): """ Helper class for the local GDAC ftp folder """ @property def rootpath(self): if os.path.isdir(self.localpath): return os.path.join(self.localpath, 'ftp') else: raise FileNotFoundError("Local repository data not found at '%s'.\n " "Try a: 'argopy.tutorial.repodata().download()' first." % self.localpath) def ls(self): """ Return the list of files in the local_work local GDAC ftp sample """ listOfFiles = list() for (dirpath, dirnames, filenames) in os.walk(self.rootpath): listOfFiles += [os.path.join(dirpath, file) for file in filenames] return listOfFiles