Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/planemo/training/topic.py @ 2:6af9afd405e9 draft
"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author | shellac |
---|---|
date | Thu, 14 May 2020 14:56:58 -0400 |
parents | 26e78fe6e8c4 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.7/site-packages/planemo/training/topic.py Thu May 14 14:56:58 2020 -0400 @@ -0,0 +1,218 @@ +"""Module contains code for the Topic class, dealing with the creation of a training topic.""" + +import collections +import os + +from planemo import templates +from .utils import ( + load_yaml, + Requirement, + save_to_yaml +) + + +INDEX_FILE_TEMPLATE = """--- +layout: topic +topic_name: {{ topic }} +--- +""" + +README_FILE_TEMPLATE = """ +{{ topic }} +========== + +Please refer to the [CONTRIBUTING.md](../../CONTRIBUTING.md) before adding or updating any material +""" + + +DOCKER_FILE_TEMPLATE = """ +# Galaxy - {{ topic_title }} +# +# to build the docker image, go to root of training repo and +# docker build -t {{ topic_name }} -f topics/{{ topic_name }}/docker/Dockerfile . +# +# to run image: +# docker run -p "8080:80" -t {{ topic_name }} +# use -d to automatically dowload the datalibraries in the container + +FROM bgruening/galaxy-stable:latest + +MAINTAINER Galaxy Training Material + +ENV GALAXY_CONFIG_BRAND "GTN: {{ topic_title }}" + +# copy the tutorials directory for your topic +ADD topics/{{ topic_name }}/tutorials/ /tutorials/ + +# install everything for tutorials +ADD bin/docker-install-tutorials.sh /setup-tutorials.sh +ADD bin/mergeyaml.py /mergeyaml.py +ADD bin/data_libarary_download.sh /data_libarary_download.sh +RUN /setup-tutorials.sh + +ENTRYPOINT ["/data_libarary_download.sh"] +""" + + +INTRO_SLIDES_FILE_TEMPLATE = """--- +layout: introduction_slides +logo: "GTN" + +title: {{ title }} +type: {{ type }} +contributors: +- contributor +--- + +### How to fill the slide decks? + +Please follow our +[tutorial to learn how to fill the slides]({{ '{{' }} site.baseurl {{ '}}' }}/topics/contributing/tutorials/create-new-tutorial-slides/slides.html) +""" + + +class Topic(object): + """Class to describe a training topic.""" + + def __init__(self, name="new_topic", target="use", title="The new topic", summary="Summary", parent_dir="topics"): + """Init a topic instance.""" + self.name = name + self.type = target + self.title = title + self.summary = summary + self.docker_image = "" + self.maintainers = ["maintainers"] + self.parent_dir = parent_dir + self.set_default_requirement() + self.set_paths() + + def init_from_kwds(self, kwds): + """Init a topic instance from a kwds dictionary.""" + self.name = kwds["topic_name"] + self.type = kwds["topic_target"] + self.title = kwds["topic_title"] + self.summary = kwds["topic_summary"] + self.set_default_requirement() + self.set_paths() + + def init_from_metadata(self): + """Init a topic instance from the metadata file.""" + metadata = load_yaml(self.metadata_fp) + self.name = metadata['name'] + self.type = metadata['type'] + self.title = metadata['title'] + self.summary = metadata['summary'] + self.requirements = [] + if 'requirements' in metadata: + for r in metadata['requirements']: + req = Requirement() + req.init_from_dict(r) + self.requirements.append(req) + if 'docker_image' in metadata: + self.docker_image = metadata['docker_image'] + self.maintainers = metadata['maintainers'] + self.set_paths() + + # GETTERS + def get_requirements(self): + """Get the requirements as a list of ordered dictionaries.""" + reqs = [] + for req in self.requirements: + reqs.append(req.export_to_ordered_dict()) + return reqs + + def export_metadata_to_ordered_dict(self): + """Export the topic metadata into an ordered dictionary.""" + metadata = collections.OrderedDict() + metadata['name'] = self.name + metadata['type'] = self.type + metadata['title'] = self.title + metadata['summary'] = self.summary + metadata['requirements'] = self.get_requirements() + metadata['docker_image'] = self.docker_image + metadata['maintainers'] = self.maintainers + return metadata + + # SETTERS + def set_default_requirement(self): + """Set default requirement: Galaxy introduction.""" + self.requirements = [] + if self.type == 'use': + self.requirements.append(Requirement()) + + def set_paths(self): + """Set the paths to folder and files.""" + self.dir = os.path.join(self.parent_dir, self.name) + self.img_folder = os.path.join(self.dir, "images") + self.tuto_folder = os.path.join(self.dir, "tutorials") + self.index_fp = os.path.join(self.dir, "index.md") + self.readme_fp = os.path.join(self.dir, "README.md") + self.metadata_fp = os.path.join(self.dir, "metadata.yaml") + self.docker_folder = os.path.join(self.dir, "docker") + self.dockerfile_fp = os.path.join(self.docker_folder, "Dockerfile") + self.slides_folder = os.path.join(self.dir, "slides") + + # TESTS + def exists(self): + """Test if the topic exists.""" + return os.path.isdir(self.dir) + + # OTHER METHODS + def create_topic_structure(self): + """Create the skeleton of a new topic. + + 1. create the folder and its structure + 2. update the index.md to match your topic's name + 3. fill the metadata + 4. add a symbolic link to the metadata.yaml from the metadata folder + """ + # create the folder and its structure + os.makedirs(self.dir) + self.img_folder = os.path.join(self.dir, "images") + os.makedirs(self.img_folder) + self.tuto_folder = os.path.join(self.dir, "tutorials") + os.makedirs(self.tuto_folder) + + # create the index.md and add the topic name + self.index_fp = os.path.join(self.dir, "index.md") + with open(self.index_fp, 'w') as index_f: + index_f.write( + templates.render(INDEX_FILE_TEMPLATE, **{'topic': self.name})) + + # create the README file + self.readme_fp = os.path.join(self.dir, "README.md") + with open(self.readme_fp, 'w') as readme_f: + readme_f.write( + templates.render(README_FILE_TEMPLATE, **{'topic': self.title})) + + # create the metadata file + self.metadata_fp = os.path.join(self.dir, "metadata.yaml") + save_to_yaml(self.export_metadata_to_ordered_dict(), self.metadata_fp) + + # create Dockerfile + self.docker_folder = os.path.join(self.dir, "docker") + os.makedirs(self.docker_folder) + self.dockerfile_fp = os.path.join(self.docker_folder, "Dockerfile") + with open(self.dockerfile_fp, 'w') as dockerfile: + dockerfile.write( + templates.render( + DOCKER_FILE_TEMPLATE, + **{'topic_name': self.name, 'topic_title': self.title})) + + # create empty introduction slides + self.slides_folder = os.path.join(self.dir, "slides") + os.makedirs(self.slides_folder) + self.intro_slide_fp = os.path.join(self.slides_folder, "introduction.html") + with open(self.intro_slide_fp, 'w') as intro_slide_f: + intro_slide_f.write( + templates.render( + INTRO_SLIDES_FILE_TEMPLATE, + **{'title': "Introduction to %s" % self.title, 'type': "introduction"})) + + # add a symbolic link to the metadata.yaml + metadata_dir = "metadata" + if not os.path.isdir(metadata_dir): + os.makedirs(metadata_dir) + os.chdir(metadata_dir) + os.symlink(os.path.join("..", self.metadata_fp), "%s.yaml" % self.name) + os.chdir("..")