Repository 'tripal_feature_sync'
hg clone https://toolshed.g2.bx.psu.edu/repos/gga/tripal_feature_sync

Changeset 0:c01c63c043f0 (2017-09-11)
Next changeset 1:52a9ee230029 (2017-09-19)
Commit message:
planemo upload for repository https://github.com/galaxy-genome-annotation/galaxy-tools/tree/master/tools/tripal commit f745b23c84a615bf434d717c8c0e553a012f0268
added:
feature_sync.xml
macros.xml
test-data/blast.xml
test-data/blast2go.gaf
test-data/citrus_genome.fasta
test-data/interpro.xml
test-data/sample.gff3
tripal.py
b
diff -r 000000000000 -r c01c63c043f0 feature_sync.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/feature_sync.xml Mon Sep 11 05:53:20 2017 -0400
[
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<tool id="feature_sync" profile="16.04" name="Synchronize features" version="@WRAPPER_VERSION@.0">
+    <description>from Chado to Tripal</description>
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <expand macro="requirements"/>
+    <code file="tripal.py"/>
+    <expand macro="stdio"/>
+    <command><![CDATA[
+
+        @AUTH@
+
+        tripaille feature sync
+
+            #for $rep in $repeat_types:
+                --types '${rep.types}'
+            #end for
+
+            #for $rep in $repeat_ids:
+                --ids '${rep.ids}'
+            #end for
+
+            --organism_id '${organism_id}'
+
+        &&
+
+        echo "Data loaded" > $results
+    ]]></command>
+    <inputs>
+        <param argument="--organism_id"
+               type="select"
+               dynamic_options="list_organisms()"
+               label="Organism" />
+
+        <repeat name="repeat_types" title="Feature types">
+            <param name="types"
+                   argument="--types"
+                   type="text"
+                   optional="true"
+                   label="Feature type to synchronize"
+                   help="Type of records to be synced (e.g. 'gene' or 'mRNA')" />
+        </repeat>
+
+        <repeat name="repeat_ids" title="Feature ids">
+            <param name="ids"
+                   argument="--ids"
+                   type="text"
+                   optional="true"
+                   label="Feature to synchronize"
+                   help="Name of a feature to be synced (e.g. 'gene0001')" />
+        </repeat>
+    </inputs>
+    <outputs>
+        <data format="txt" name="results" label="Synchronize features into Tripal" />
+    </outputs>
+    <tests>
+        <test expect_failure="true">
+            <param name="organism" value="Testus testus" />
+            <param name="types" value="gene mRNA" />
+            <param name="types" value="gene0001 gene0002" />
+
+            <expand macro="test_result" />
+        </test>
+    </tests>
+    <help><![CDATA[
+        @HELP_OVERVIEW@
+
+        **Synchronize Features**
+
+        With this tool, you can synchronize some features from the Chado database into the Tripal instance.
+        A corresponding Drupal node will be created for each feature.
+
+        @HELP@
+    ]]></help>
+    <expand macro="citation"/>
+</tool>
b
diff -r 000000000000 -r c01c63c043f0 macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml Mon Sep 11 05:53:20 2017 -0400
[
@@ -0,0 +1,215 @@
+<?xml version="1.0"?>
+<macros>
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="2.0.4">python-tripal</requirement>
+            <yield/>
+        </requirements>
+    </xml>
+
+    <xml name="stdio">
+        <stdio>
+            <regex level="fatal" match="Exception:" source="stderr" />
+            <regex level="fatal" match="error" source="stderr" />
+            <exit_code range="1:" />
+        </stdio>
+    </xml>
+
+    <token name="@WRAPPER_VERSION@">2.0.4</token>
+
+    <xml name="citation">
+        <citations>
+            <citation type="doi">10.1093/database/bat075</citation>
+        </citations>
+    </xml>
+
+    <token name="@HELP_OVERVIEW@"><![CDATA[
+        **Python-tripal Overview**
+
+        Python-tripal provides several tools allowing to load data into a remote Chado-based Tripal database.
+        The tripal_rest_api Tripal module must be installed on the remote server to use these tools.
+    ]]></token>
+
+    <token name="@HELP@"><![CDATA[
+        **Useful Links**
+
+        `Tripal project website <http://tripal.info/>`_
+
+        `Tripal REST API module <http://github.com/abretaud/tripal_rest_api>`_: a Tripal module required to use these galaxy tools
+    ]]></token>
+
+    <token name="@DATA_DIR@">\$GALAXY_TRIPAL_SHARED_DIR</token>
+
+    <token name="@AUTH@"><![CDATA[
+        echo "__default: local" > '.auth.yml' &&
+        echo "local:" >> '.auth.yml' &&
+        echo "    tripal_url: \"\$GALAXY_TRIPAL_URL\"" >> '.auth.yml' &&
+        echo "    username: \"\$GALAXY_TRIPAL_USER\"" >> '.auth.yml' &&
+        echo "    password: \"\$GALAXY_TRIPAL_PASSWORD\"" >> '.auth.yml' &&
+
+        TRIPAILLE_GLOBAL_CONFIG_PATH='.auth.yml'
+    ]]></token>
+
+    <xml name="test_result">
+        <assert_stderr>
+            <has_text text="MissingSchema" />
+        </assert_stderr>
+    </xml>
+
+    <xml name="analysis">
+        <section name="analysis" title="Analysis" expanded="True">
+            <param name="name"
+                   type="text"
+                   label="The analysis name [mandatory]">
+                <expand macro="sanitized"/>
+            </param>
+
+            <param name="program"
+                   type="text"
+                   label="Program name [mandatory]"
+                   help="Name of the program that was used to perform this analysis">
+                <expand macro="sanitized"/>
+            </param>
+            <param name="program_version"
+                   type="text"
+                   label="Program version [mandatory]"
+                   help="Version of the program that was used to perform this analysis"/>
+            <param name="source"
+                   type="text"
+                   label="Source name [mandatory]"
+                   help="Where this analysis comes from">
+                <expand macro="sanitized"/>
+            </param>
+
+            <param name="source_version"
+                   argument="--sourceversion"
+                   type="text"
+                   optional="True"
+                   label="Source version" />
+            <param name="source_uri"
+                   argument="--sourceuri"
+                   type="text"
+                   optional="True"
+                   label="Source URI"
+                   help="URI where source data was retrieved" />
+            <param name="algorithm"
+                   argument="--algorithm"
+                   type="text"
+                   label="Algorithm"
+                   optional="True"
+                   help="Algorithm of the program that was used to perform this analysis" />
+            <param name="description"
+                   argument="--description"
+                   type="text"
+                   optional="True"
+                   label="Analysis description">
+                <expand macro="sanitized"/>
+            </param>
+            <param name="date"
+                   argument="--date_executed"
+                   type="text"
+                   optional="True"
+                   label="Execution date"
+                   help="Format: yyyy-mm-dd  Default: Today">
+                <validator type="regex" message="Date in YYYY-MM-DD format">^[0-9]{4}-[0-9]{2}-[0-9]{2}$</validator>
+            </param>
+        </section>
+    </xml>
+
+    <xml name="feature_rel">
+        <param name="rel_subject_re"
+               argument="--rel-subject-re"
+               type="text"
+               label="Regular expression to extract the unique name of the parent feature"
+               help="this regex will be applied on the fasta definition line to generate the unique name of the parent feature">
+            <expand macro="sanitized"/>
+        </param>
+
+        <param name="rel_subject_type"
+               argument="--rel-subject-type"
+               type="text"
+               label="Sequence type of the parent"
+               help="this should be a Sequence Ontology term" />
+    </xml>
+
+    <xml name="match_type">
+        <param name="match_type"
+               argument="--match-type"
+               type="select"
+               label="Match type for already loaded features">
+            <option value="uniquename" selected="true">Unique name</option>
+            <option value="name">Name</option>
+        </param>
+    </xml>
+
+    <xml name="matching">
+        <section name="matching" title="Feature matching" expanded="True">
+            <param name="query_type"
+                   type="text"
+                   label="The feature type of the blast query"
+                   help="It must be a valid Sequence Ontology term. e.g. 'contig', 'gene', 'mRNA', 'polypeptide'" />
+
+            <param name="query_uniquename"
+                   type="boolean"
+                   checked="false"
+                   truevalue="--query_uniquename"
+                   falsevalue=""
+                   label="Find blast query features using their Unique name"
+                   help="Feature name will be used otherwise" />
+
+            <param name="query_re"
+                   type="text"
+                   optional="true"
+                   label="Regular expression to extract the feature name from the blast query name"
+                   help="leave empty if the first word in query name is sufficient">
+                <expand macro="sanitized"/>
+            </param>
+        </section>
+    </xml>
+
+    <xml name="sanitized">
+        <sanitizer>
+            <valid initial="string.printable">
+                <remove value="&apos;"/>
+            </valid>
+            <mapping initial="none">
+                <add source="&apos;" target="&apos;&quot;&apos;&quot;&apos;"/>
+                <add source="(" target="\("/>
+                <add source=")" target="\)"/>
+            </mapping>
+        </sanitizer>
+    </xml>
+
+    <token name="@MATCHING@"><![CDATA[
+        #if str($matching.query_re):
+            --query_re '${matching.query_re}'
+        #end if
+
+        $matching.query_uniquename
+
+        --query_type '$matching.query_type'
+    ]]></token>
+
+    <token name="@ANALYSIS@"><![CDATA[
+        #if $analysis.algorithm:
+            --algorithm '$analysis.algorithm'
+        #end if
+        #if $analysis.source_version:
+            --sourceversion '$analysis.source_version'
+        #end if
+        #if $analysis.source_uri:
+            --sourceuri '$analysis.source_uri'
+        #end if
+        #if $analysis.description:
+            --description '$analysis.description'
+        #end if
+        #if $analysis.date:
+            --date_executed '$analysis.date'
+        #end if
+
+        '$analysis.name'
+        '$analysis.program'
+        '$analysis.program_version'
+        '$analysis.source'
+    ]]></token>
+</macros>
b
diff -r 000000000000 -r c01c63c043f0 test-data/blast.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blast.xml Mon Sep 11 05:53:20 2017 -0400
[
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">
+<BlastOutput>
+  <BlastOutput_program>blastx</BlastOutput_program>
+  <BlastOutput_version>blastx 2.2.25 [Feb-01-2011]</BlastOutput_version>
+  <BlastOutput_reference>~Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer, ~Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), ~&quot;Gapped BLAST and PSI-BLAST: a new generation of protein database search~programs&quot;,  Nucleic Acids Res. 25:3389-3402.</BlastOutput_reference>
+  <BlastOutput_db>/scratch/mainlab/data/lib/nr</BlastOutput_db>
+  <BlastOutput_query-ID>lcl|1_0</BlastOutput_query-ID>
+  <BlastOutput_query-def>orange1.1g015632m PAC:18136217 (mRNA) Citrus sinensis</BlastOutput_query-def>
+  <BlastOutput_query-len>2075</BlastOutput_query-len>
+  <BlastOutput_param>
+    <Parameters>
+      <Parameters_matrix>BLOSUM62</Parameters_matrix>
+      <Parameters_expect>1e-06</Parameters_expect>
+      <Parameters_gap-open>11</Parameters_gap-open>
+      <Parameters_gap-extend>1</Parameters_gap-extend>
+      <Parameters_filter>F</Parameters_filter>
+    </Parameters>
+  </BlastOutput_param>
+  <BlastOutput_iterations>
+    <Iteration>
+      <Iteration_iter-num>1</Iteration_iter-num>
+      <Iteration_query-ID>lcl|1_0</Iteration_query-ID>
+      <Iteration_query-def>orange1.1g015632m PAC:18136217 (mRNA) Citrus sinensis</Iteration_query-def>
+      <Iteration_query-len>2075</Iteration_query-len>
+      <Iteration_hits>
+        <Hit>
+          <Hit_num>1</Hit_num>
+          <Hit_id>gi|224068663|ref|XP_002302794.1|</Hit_id>
+          <Hit_def>predicted protein [Populus trichocarpa] &gt;gi|222844520|gb|EEE82067.1| predicted protein [Populus trichocarpa]</Hit_def>
+          <Hit_accession>XP_002302794</Hit_accession>
+          <Hit_len>409</Hit_len>
+          <Hit_hsps>
+            <Hsp>
+              <Hsp_num>1</Hsp_num>
+              <Hsp_bit-score>792.727</Hsp_bit-score>
+              <Hsp_score>2046</Hsp_score>
+              <Hsp_evalue>0</Hsp_evalue>
+              <Hsp_query-from>559</Hsp_query-from>
+              <Hsp_query-to>1767</Hsp_query-to>
+              <Hsp_hit-from>1</Hsp_hit-from>
+              <Hsp_hit-to>409</Hsp_hit-to>
+              <Hsp_query-frame>1</Hsp_query-frame>
+              <Hsp_identity>387</Hsp_identity>
+              <Hsp_positive>394</Hsp_positive>
+              <Hsp_gaps>6</Hsp_gaps>
+              <Hsp_align-len>409</Hsp_align-len>
+              <Hsp_qseq>MASVSVVPASG------NTVGVDRLPEEMNDMKIRDDKEMEATVVDGNGTEAGHIIVTTIGGKNGQPKQTISYMAERVVGHGSFGVVFQAKCLETGEAVAIKKVLQDKRYKNRELQTMRLLDHPNVVSLKHCFFSTTEKDELYLNLVLEYVPETVHRVIKHHYKMSQRMPLIYVKLYFYQICRALAYIHNTIGVCHRDIKPQNLLVNPHTHQLKLCDFGSAKVLVKGEPNISYICSRYYRAPELIFGATEYTAAIDIWSAGCVLAELLLGQPLFPGESGVDQLVEIIKVLGTPTREEIKCMNPNYTEFKFPQIKAHPWHKIFQKRMPPEAVDLVSRLLQYSPNLRSTALEALIHPFFDELRDPNTRLPNGRFLPPLFNFKPHELKGVPVDMLVKLIPEHARKQCAFLGL</Hsp_qseq>
+              <Hsp_hseq>MASVSVVPASGLRDTLGNTTGVDKLPEEMNDMKISDDKEMEAAVVDGNGTETGHIIVTTIGGKNGQPKQTISYMAERVVGHGSFGLVFQAKCLETGETVAIKKVLQDKRYKNRELQTMRLLDHPNVVSLKHCFFSTTEKDELYLNLVLEYVPETIHRVIKHYYKMSQRMPLIYVKLYFYQICRALAYIHNSIGVCHRDIKPQNLLVNPHTHQVKLCDFGSAKVLVKGEPNISYICSRYYRAPELIFGATEYTTAIDIWSAGCVLAELLLGQPLFPGESGVDQLVEIIKVLGTPTREEIKCMNPNYTEFKFPQIKAHPWHKIFHKRMPPEAVDLVSRLLQYSPNLRSTALEALIHPFFDELRDPNARLPNGRILPPLFNFKPHELKGVPVEMLVKLIPEHARKQCAFLGL</Hsp_hseq>
+              <Hsp_midline>MASVSVVPASG      NT GVD+LPEEMNDMKI DDKEMEA VVDGNGTE GHIIVTTIGGKNGQPKQTISYMAERVVGHGSFG+VFQAKCLETGE VAIKKVLQDKRYKNRELQTMRLLDHPNVVSLKHCFFSTTEKDELYLNLVLEYVPET+HRVIKH+YKMSQRMPLIYVKLYFYQICRALAYIHN+IGVCHRDIKPQNLLVNPHTHQ+KLCDFGSAKVLVKGEPNISYICSRYYRAPELIFGATEYT AIDIWSAGCVLAELLLGQPLFPGESGVDQLVEIIKVLGTPTREEIKCMNPNYTEFKFPQIKAHPWHKIF KRMPPEAVDLVSRLLQYSPNLRSTALEALIHPFFDELRDPN RLPNGR LPPLFNFKPHELKGVPV+MLVKLIPEHARKQCAFLGL</Hsp_midline>
+            </Hsp>
+          </Hit_hsps>
+        </Hit>
+      </Iteration_hits>
+      <Iteration_stat>
+        <Statistics>
+          <Statistics_db-num>18996442</Statistics_db-num>
+          <Statistics_db-len>6510958228</Statistics_db-len>
+          <Statistics_hsp-len>0</Statistics_hsp-len>
+          <Statistics_eff-space>0</Statistics_eff-space>
+          <Statistics_kappa>0.041</Statistics_kappa>
+          <Statistics_lambda>0.267</Statistics_lambda>
+          <Statistics_entropy>0.14</Statistics_entropy>
+        </Statistics>
+      </Iteration_stat>
+    </Iteration>
+  </BlastOutput_iterations>
+</BlastOutput>
b
diff -r 000000000000 -r c01c63c043f0 test-data/blast2go.gaf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blast2go.gaf Mon Sep 11 05:53:20 2017 -0400
b
@@ -0,0 +1,6 @@
+!gaf-version: 2.1
+ gi|328696447|ref|XP_003240026.1| GO:0016021
+ gi|328696447|ref|XP_003240026.1| GO:0006511
+ gi|328696447|ref|XP_003240026.1| GO:0030145
+ gi|328696447|ref|XP_003240026.1| GO:0004803
+ gi|328696447|ref|XP_003240026.1| GO:0004177
b
diff -r 000000000000 -r c01c63c043f0 test-data/citrus_genome.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/citrus_genome.fasta Mon Sep 11 05:53:20 2017 -0400
b
@@ -0,0 +1,10 @@
+>scaffold00001  length=5927163
+TTTTGTATTCTATGTCCTCTGATCTTTATACTTCTTCATTTTGTCTTTGCAAGAACCGGA
+ATTATGGGTACATCACAAATTCTCTAGGTGTGACTTGTGTTGTGGGGCCTTTTTTTtACA
+TTTCCATATTGCAAGTATTTTTTTGCTACCATTGGTATATTTGTCTGTTAAAATCAATCT
+GCTTTCACTTATGTTCGTGCGTTCTTGTTCCCTCGCCTTGCAATTGCATATCTCAAATTA
+TCTTTCTTACTTTGATTTAGATGGCCAAGGTTTTAAGCTAACTTTTTACAATGCCAATTT
+TTAAATGGTTTTCTAATGCTGTTCAAAGTTGCAGCCTTTACTTCGTATATTTGTCAGGTT
+CTGACGGGTGCGGTCGGCGGCGGGGGCTATAGCATGCGGTCTCGAGAGCCGCAAAGAAAA
+ATGGGTGGTTTTCCCGGTTTCGGCCATAACTCGTGATCGGGGCCTCCGATTCTGGTTCCG
+TTTCGTCCCACGGGACCAGCCGGGCGGGGGCATCGGATTGCAAAAGTCTTTAAATTTGAA
b
diff -r 000000000000 -r c01c63c043f0 test-data/interpro.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/interpro.xml Mon Sep 11 05:53:20 2017 -0400
b
@@ -0,0 +1,12 @@
+<interpro_matches>
+
+   <protein id="orange1.1g022799m_6_ORF4" length="79" crc64="D3F0B609CB0B9D28" >
+ <interpro id="noIPR" name="unintegrated" type="unintegrated">
+   <match id="seg" name="seg" dbname="SEG">
+     <location start="11" end="17" score="NA" status="?" evidence="Seg" />
+     <location start="54" end="78" score="NA" status="?" evidence="Seg" />
+   </match>
+ </interpro>
+   </protein>
+
+</interpro_matches>
b
diff -r 000000000000 -r c01c63c043f0 test-data/sample.gff3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/sample.gff3 Mon Sep 11 05:53:20 2017 -0400
b
@@ -0,0 +1,21 @@
+##gff-version 3
+##sequence-region scaffold00001 4058460 4062210
+scaffold00001 phytozome6 supercontig 1 5927163 . . . Name=scaffold00001;ID=scaffold00001
+scaffold00001 phytozome6 gene 4058460 4062210 . + . ID=orange1.1g015632m.g;Name=orange1.1g015632m.g
+scaffold00001 phytozome6 mRNA 4058460 4062210 . + . ID=PAC:18136217;Name=orange1.1g015632m;PACid=18136217;Parent=orange1.1g015632m.g
+scaffold00001 phytozome6 five_prime_UTR 4058460 4058898 . + . Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 five_prime_UTR 4059019 4059074 . + . Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 five_prime_UTR 4059172 4059234 . + . Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4059235 4059330 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4059422 4059514 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4059600 4059659 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4059790 4060062 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4060285 4060359 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4060480 4060536 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4060625 4060765 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4060857 4060907 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4061250 4061345 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4061417 4061500 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4061617 4061719 . + 0 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 CDS 4061823 4061905 . + 2 Parent=PAC:18136217;PACid=18136217
+scaffold00001 phytozome6 three_prime_UTR 4061906 4062210 . + . Parent=PAC:18136217;PACid=18136217
b
diff -r 000000000000 -r c01c63c043f0 tripal.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tripal.py Mon Sep 11 05:53:20 2017 -0400
[
b'@@ -0,0 +1,503 @@\n+import collections\n+import os\n+import time\n+\n+from abc import abstractmethod\n+\n+import tripal\n+\n+\n+#############################################\n+#      BEGIN IMPORT OF CACHING LIBRARY      #\n+#############################################\n+# This code is licensed under the MIT       #\n+# License and is a copy of code publicly    #\n+# available in rev.                         #\n+# e27332bc82f4e327aedaec17c9b656ae719322ed  #\n+# of https://github.com/tkem/cachetools/    #\n+#############################################\n+class DefaultMapping(collections.MutableMapping):\n+\n+    __slots__ = ()\n+\n+    @abstractmethod\n+    def __contains__(self, key):  # pragma: nocover\n+        return False\n+\n+    @abstractmethod\n+    def __getitem__(self, key):  # pragma: nocover\n+        if hasattr(self.__class__, \'__missing__\'):\n+            return self.__class__.__missing__(self, key)\n+        else:\n+            raise KeyError(key)\n+\n+    def get(self, key, default=None):\n+        if key in self:\n+            return self[key]\n+        else:\n+            return default\n+\n+    __marker = object()\n+\n+    def pop(self, key, default=__marker):\n+        if key in self:\n+            value = self[key]\n+            del self[key]\n+        elif default is self.__marker:\n+            raise KeyError(key)\n+        else:\n+            value = default\n+        return value\n+\n+    def setdefault(self, key, default=None):\n+        if key in self:\n+            value = self[key]\n+        else:\n+            self[key] = value = default\n+        return value\n+\n+\n+DefaultMapping.register(dict)\n+\n+\n+class _DefaultSize(object):\n+    def __getitem__(self, _):\n+        return 1\n+\n+    def __setitem__(self, _, value):\n+        assert value == 1\n+\n+    def pop(self, _):\n+        return 1\n+\n+\n+class Cache(DefaultMapping):\n+    """Mutable mapping to serve as a simple cache or cache base class."""\n+\n+    __size = _DefaultSize()\n+\n+    def __init__(self, maxsize, missing=None, getsizeof=None):\n+        if missing:\n+            self.__missing = missing\n+        if getsizeof:\n+            self.__getsizeof = getsizeof\n+            self.__size = dict()\n+        self.__data = dict()\n+        self.__currsize = 0\n+        self.__maxsize = maxsize\n+\n+    def __repr__(self):\n+        return \'%s(%r, maxsize=%r, currsize=%r)\' % (\n+            self.__class__.__name__,\n+            list(self.__data.items()),\n+            self.__maxsize,\n+            self.__currsize,\n+        )\n+\n+    def __getitem__(self, key):\n+        try:\n+            return self.__data[key]\n+        except KeyError:\n+            return self.__missing__(key)\n+\n+    def __setitem__(self, key, value):\n+        maxsize = self.__maxsize\n+        size = self.getsizeof(value)\n+        if size > maxsize:\n+            raise ValueError(\'value too large\')\n+        if key not in self.__data or self.__size[key] < size:\n+            while self.__currsize + size > maxsize:\n+                self.popitem()\n+        if key in self.__data:\n+            diffsize = size - self.__size[key]\n+        else:\n+            diffsize = size\n+        self.__data[key] = value\n+        self.__size[key] = size\n+        self.__currsize += diffsize\n+\n+    def __delitem__(self, key):\n+        size = self.__size.pop(key)\n+        del self.__data[key]\n+        self.__currsize -= size\n+\n+    def __contains__(self, key):\n+        return key in self.__data\n+\n+    def __missing__(self, key):\n+        value = self.__missing(key)\n+        try:\n+            self.__setitem__(key, value)\n+        except ValueError:\n+            pass  # value too large\n+        return value\n+\n+    def __iter__(self):\n+        return iter(self.__data)\n+\n+    def __len__(self):\n+        return len(self.__data)\n+\n+    @staticmethod\n+    def __getsizeof(value):\n+        return 1\n+\n+    @staticmethod\n+    def __missing(key):\n+        raise KeyError(key)\n+\n+    @property\n+    def maxsize(self):\n+        """The maximum size of the cache."""\n+        return self.__maxsize\n+\n+ '..b'XY_TRIPAL_USER\'],\n+        os.environ[\'GALAXY_TRIPAL_PASSWORD\']\n+    )\n+\n+\n+def list_organisms(*args, **kwargs):\n+\n+    ti = _get_instance()\n+\n+    # Key for cached data\n+    cacheKey = \'orgs\'\n+    # We don\'t want to trust "if key in cache" because between asking and fetch\n+    # it might through key error.\n+    if cacheKey not in cache:\n+        # However if it ISN\'T there, we know we\'re safe to fetch + put in\n+        # there.\n+        data = _list_organisms(ti, *args, **kwargs)\n+        cache[cacheKey] = data\n+        return data\n+    try:\n+        # The cache key may or may not be in the cache at this point, it\n+        # /likely/ is. However we take no chances that it wasn\'t evicted between\n+        # when we checked above and now, so we reference the object from the\n+        # cache in preparation to return.\n+        data = cache[cacheKey]\n+        return data\n+    except KeyError:\n+        # If access fails due to eviction, we will fail over and can ensure that\n+        # data is inserted.\n+        data = _list_organisms(ti, *args, **kwargs)\n+        cache[cacheKey] = data\n+        return data\n+\n+\n+def _list_organisms(ti, *args, **kwargs):\n+    # Fetch the orgs.\n+    orgs_data = []\n+    for org in ti.organism.get_organisms():\n+        clean_name = \'%s %s\' % (org[\'genus\'], org[\'species\'])\n+        if org[\'infraspecific_name\']:\n+            clean_name += \' (%s)\' % (org[\'infraspecific_name\'])\n+        orgs_data.append((clean_name, org[\'organism_id\'], False))\n+    return orgs_data\n+\n+\n+def list_analyses(*args, **kwargs):\n+\n+    ti = _get_instance()\n+\n+    # Key for cached data\n+    cacheKey = \'analyses\'\n+    # We don\'t want to trust "if key in cache" because between asking and fetch\n+    # it might through key error.\n+    if cacheKey not in cache:\n+        # However if it ISN\'T there, we know we\'re safe to fetch + put in\n+        # there.<?xml version="1.0"?>\n+\n+        data = _list_analyses(ti, *args, **kwargs)\n+        cache[cacheKey] = data\n+        return data\n+    try:\n+        # The cache key may or may not be in the cache at this point, it\n+        # /likely/ is. However we take no chances that it wasn\'t evicted between\n+        # when we checked above and now, so we reference the object from the\n+        # cache in preparation to return.\n+        data = cache[cacheKey]\n+        return data\n+    except KeyError:\n+        # If access fails due to eviction, we will fail over and can ensure that\n+        # data is inserted.\n+        data = _list_analyses(ti, *args, **kwargs)\n+        cache[cacheKey] = data\n+        return data\n+\n+\n+def _list_analyses(ti, *args, **kwargs):\n+    ans_data = []\n+    for an in ti.analysis.get_analyses():\n+        ans_data.append((an[\'name\'], an[\'analysis_id\'], False))\n+    return ans_data\n+\n+\n+def list_blastdbs(*args, **kwargs):\n+\n+    ti = _get_instance()\n+\n+    # Key for cached data\n+    cacheKey = \'blastdbs\'\n+    # We don\'t want to trust "if key in cache" because between asking and fetch\n+    # it might through key error.\n+    if cacheKey not in cache:\n+        # However if it ISN\'T there, we know we\'re safe to fetch + put in\n+        # there.\n+        data = _list_blastdbs(ti, *args, **kwargs)\n+        cache[cacheKey] = data\n+        return data\n+    try:\n+        # The cache key may or may not be in the cache at this point, it\n+        # /likely/ is. However we take no chances that it wasn\'t evicted between\n+        # when we checked above and now, so we reference the object from the\n+        # cache in preparation to return.\n+        data = cache[cacheKey]\n+        return data\n+    except KeyError:\n+        # If access fails due to eviction, we will fail over and can ensure that\n+        # data is inserted.\n+        data = _list_blastdbs(ti, *args, **kwargs)\n+        cache[cacheKey] = data\n+        return data\n+\n+\n+def _list_blastdbs(ti, *args, **kwargs):\n+    dbs_data = []\n+    for db in ti.db.get_dbs():\n+        dbs_data.append((db[\'name\'], db[\'db_id\'], False))\n+    return dbs_data\n'