Repository 'get_db_info'
hg clone https://eddie.galaxyproject.org/repos/tduigou/get_db_info

Changeset 6:56a0938d534d (2025-04-18)
Previous changeset 5:a52626182172 (2025-04-18) Next changeset 7:8984fabea52c (2025-04-18)
Commit message:
planemo upload for repository https://github.com/brsynth commit 6ae809b563b40bcdb6be2e74fe2a84ddad5484ae
modified:
get_DB_data.xml
get_db_info.py
added:
output.html
output.json
test-data/output/ACP10001AaCbbBS.gb
test-data/output/CFP10002AaCbbBS.gb
test-data/output/QWE10004AaCbbBS.gb
test-data/output/XYZ10003AaCbbBS.gb
removed:
test-data/output_annotations.txt
b
diff -r a52626182172 -r 56a0938d534d get_DB_data.xml
--- a/get_DB_data.xml Fri Apr 18 09:57:55 2025 +0000
+++ b/get_DB_data.xml Fri Apr 18 12:52:49 2025 +0000
[
@@ -20,7 +20,6 @@
             --table '$table' 
             --fragment_column '$fragment_column'
             --output 'outdir'
-            --output_missing '$output_missing'
     ]]></command>
     <inputs> 
         <param name="input" type="data" format="csv" label="Input CSV file" />
@@ -34,11 +33,9 @@
         <collection name="output_gb" type="list" label="GenBank Files collection" >
             <discover_datasets pattern="(?P&lt;name&gt;.*).gb" format="genbank" directory="outdir" />
         </collection>
-        <data name="output_missing" format="txt" label="DB Missing Fragments (txt)">
-        </data>
     </outputs>
     <tests>
-    <!--python get_db_info.py -input 'test-data/test_input.csv' -sequence_column 'sequence' -annotation_column 'annotation' -db_uri 'postgresql://postgres:RK17@localhost:5432/test_fragments_db' -table 'sample' -fragment_column 'fragment' -output 'test-data/output' -output_missing 'test-data/output.txt'-->
+    <!--python get_db_info.py -input 'test-data/test_input.csv' -sequence_column 'sequence' -annotation_column 'annotation' -db_uri 'postgresql://postgres:RK17@localhost:5432/test_fragments_db' -table 'sample' -fragment_column 'fragment' -output 'test-data/output'-->
         <test> 
             <param name="input" value="test_input.csv" />
             <param name="table" value="sample" />
@@ -69,23 +66,13 @@
                 </element>
             </output_collection>
         </test>
-     <!--python get_db_info.py -input 'test-data/test_missing_input.csv' -sequence_column 'sequence' -annotation_column 'annotation' -db_uri 'postgresql://postgres:RK17@localhost:5432/test_fragments_db' -table 'sample' -fragment_column 'fragment' -output 'test-data/output' -output_missing 'test-data/output.txt'-->
-        <test> 
-            <param name="input" value="test_missing_input.csv" />
-            <param name="table" value="sample" />
-            <param name="sequence_column" value="sequence" />
-            <param name="annotation_columns" value="annotation" />
-            <param name="fragment_column" value="fragment" />
-            <param name="db_uri" value="postgresql://postgres:RK17@localhost:5432/test_fragments_db" />
-            <output name="output_missing" file="output_annotations.txt" ftype="txt" />
-        </test>
     </tests>
     
     <help><![CDATA[
 Pick Data From DB
 ===================
 
-DBget data from SQL DB in docker container.
+generate GanDank files from csv file based on SQL DB.
     ]]></help>
     <citations>
         <citation type="bibtex">
b
diff -r a52626182172 -r 56a0938d534d get_db_info.py
--- a/get_db_info.py Fri Apr 18 09:57:55 2025 +0000
+++ b/get_db_info.py Fri Apr 18 12:52:49 2025 +0000
[
@@ -5,14 +5,12 @@
 import os
 import re
 import pandas as pd
-from Bio import SeqIO
 from Bio.Seq import Seq
 from Bio.SeqRecord import SeqRecord
 from sqlalchemy import create_engine, inspect
 from sqlalchemy.sql import text
 from sqlalchemy.engine.url import make_url
 from sqlalchemy.exc import OperationalError
-from Bio.SeqFeature import SeqFeature, FeatureLocation
 
 def fix_db_uri(uri):
     """Replace __at__ with @ in the URI if needed."""
@@ -83,7 +81,7 @@
             time.sleep(2)
     raise Exception("Database connection failed after timeout.")
 
-def fetch_annotations(csv_file, sequence_column, annotation_columns, db_uri, table_name, fragment_column_name, output, output_missing):
+def fetch_annotations(csv_file, sequence_column, annotation_columns, db_uri, table_name, fragment_column_name, output):
     """Fetch annotations from the database and save the result as GenBank files."""
     db_uri = fix_db_uri(db_uri)
     df = pd.read_csv(csv_file, sep=',')
@@ -101,12 +99,12 @@
             # Fetch all fragments from the table once
             if fragment_column_name not in columns:
                 raise ValueError(f"Fragment column '{fragment_column_name}' not found in table '{table_name}'.")
-            
+
             fragment_column_index = columns.index(fragment_column_name)
             all_rows = connection.execute(text(f"SELECT * FROM {table_name}")).fetchall()
             fragment_map = {row[fragment_column_index]: row for row in all_rows}
-            
-            # Check if all fragments from CSV are present in DB
+
+            # Compare fragments between CSV and DB
             csv_fragments = set()
             for _, row in df.iterrows():
                 for col in df.columns:
@@ -117,15 +115,13 @@
             missing_fragments = sorted(list(csv_fragments - db_fragments))
 
             if missing_fragments:
-                with open(output_missing, "w") as f:
-                    for fragment in missing_fragments:
-                        f.write(f"{fragment}\n")
-                print(f"Missing fragments written to {output_missing}")
-                return output_missing  # Exit early if fragments are missing
-            
+                raise ValueError(
+                    f" Missing fragments in DB: {', '.join(missing_fragments)}"
+                )
+
+            # === CONTINUE WITH GB FILE CREATION ===
             for _, row in df.iterrows():
                 annotated_row = {"Backbone": row["ID"], "Fragments": []}
-
                 for col in df.columns:
                     if col != "ID":
                         fragment = row[col]
@@ -144,7 +140,7 @@
 
     except Exception as e:
         print(f"Error occurred during annotation: {e}")
-        return
+        raise  # Ensures the error exits the script
 
     # GenBank file generation per fragment
     try:
@@ -227,7 +223,6 @@
     parser.add_argument("--table", required=True, help="Table name in the database")
     parser.add_argument("--fragment_column", required=True, help="Fragment column name in the database")
     parser.add_argument("--output", required=True, help="Output dir for gb files")
-    parser.add_argument("--output_missing", required=True, help="Output txt file for missing fragment in the DB")
     args = parser.parse_args()
 
     # Start the Docker container (if not already running)
@@ -239,7 +234,7 @@
     wait_for_db(db_uri)
 
     # Fetch annotations from the database and save as JSON
-    fetch_annotations(args.input, args.sequence_column, args.annotation_columns, db_uri, args.table, args.fragment_column, args.output, args.output_missing)
+    fetch_annotations(args.input, args.sequence_column, args.annotation_columns, db_uri, args.table, args.fragment_column, args.output)
 
 if __name__ == "__main__":
     main()
b
diff -r a52626182172 -r 56a0938d534d output.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/output.html Fri Apr 18 12:52:49 2025 +0000
[
b'@@ -0,0 +1,291 @@\n+<!DOCTYPE html>\n+<html lang="en">\n+  <head>\n+    <meta charset="utf-8">\n+    <meta http-equiv="X-UA-Compatible" content="IE=edge">\n+    <meta name="viewport" content="width=device-width, initial-scale=1">\n+    <title>Test Results (powered by Planemo)</title>\n+\n+    <!-- Bootstrap -->\n+    <style>/*!\n+ * Bootstrap v3.3.1 (http://getbootstrap.com)\n+ * Copyright 2011-2014 Twitter, Inc.\n+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:\'Glyphicons Halflings\';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format(\'embedded-opentype\'),url(../fonts/glyphicons-halflings-regular.woff) format(\'woff\'),url(../fonts/glyphicons-halflings-regular.ttf) format(\'truetype\'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format(\'svg\')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:\'Glyphi'..b'-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/},{}],64:[function(e,r,t){r.exports=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/},{}],65:[function(e,r,t){"use strict";t.Any=e("./properties/Any/regex"),t.Cc=e("./categories/Cc/regex"),t.Cf=e("./categories/Cf/regex"),t.P=e("./categories/P/regex"),t.Z=e("./categories/Z/regex")},{"./categories/Cc/regex":61,"./categories/Cf/regex":62,"./categories/P/regex":63,"./categories/Z/regex":64,"./properties/Any/regex":66}],66:[function(e,r,t){r.exports=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/},{}],67:[function(e,r,t){"use strict";r.exports=e("./lib/")},{"./lib/":9}]},{},[67])(67)}));\n+</script>\n+    <script>\n+        var target = document.getElementById(\'overview-content\');\n+        var md = window.markdownit({\n+          html: true,\n+        });\n+        target.innerHTML = md.render(atob(\'IyMgVGVzdCBTdW1tYXJ5Cgo8ZGl2IGNsYXNzPSJwcm9ncmVzcyI+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzIiBzdHlsZT0id2lkdGg6IDEwMC4wJSIgYXJpYS12YWx1ZW5vdz0iMSIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0iMSIgZGF0YS10b2dnbGU9InRvb2x0aXAiIHRpdGxlPSIxIFBhc3NlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci13YXJuaW5nIiBzdHlsZT0id2lkdGg6IDAuMCUiIGFyaWEtdmFsdWVub3c9IjAiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9IjEiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0iMCBTa2lwcGVkIj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLWRhbmdlciIgc3R5bGU9IndpZHRoOiAwLjAlIiBhcmlhLXZhbHVlbm93PSIwIiBhcmlhLXZhbHVlbWluPSIwIiBhcmlhLXZhbHVlbWF4PSIxIiB0aXRsZT0iMCBGYWlsZWQgb3IgRXJyb3JlZCI+CiAgPC9kaXY+CjwvZGl2PgoKfCBUZXN0IFN0YXRlIHwgQ291bnQgfAp8IC0tLS0tLS0tLS0gfCAtLS0tLSB8CnwgVG90YWwgICAgICB8IDEgfAp8IFBhc3NlZCAgICAgfCAxIHwKfCBFcnJvciAgICAgIHwgMCB8CnwgRmFpbHVyZSAgICB8IDAgfAp8IFNraXBwZWQgICAgfCAwIHwKCgo8ZGV0YWlscyA+PHN1bW1hcnk+UGFzc2VkIFRlc3RzPC9zdW1tYXJ5PgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBnZXRfREJfZGF0YSAoVGVzdCAjIDEpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgbWtkaXIgJ291dGRpcicgJiYgcHl0aG9uICcvaG9tZS9ya2hhbGVkL2dhbGF4eXRvb2xzL3Rvb2xzL2dldF9kYl9kYXRhL2dldF9kYl9pbmZvLnB5JyAtLWlucHV0ICcvdG1wL3RtcDQydzcyeXRvL2ZpbGVzLzMvNi8yL2RhdGFzZXRfMzYyMjY0MmItYWVjOS00NjAyLWJiMjctMTcwY2U1ZGFmZjZkLmRhdCcgLS1zZXF1ZW5jZV9jb2x1bW4gJ3NlcXVlbmNlJyAtLWFubm90YXRpb25fY29sdW1ucyAnYW5ub3RhdGlvbicgLS1kYl91cmkgJ3Bvc3RncmVzcWw6Ly9wb3N0Z3JlczpSSzE3X19hdF9fbG9jYWxob3N0OjU0MzIvdGVzdF9mcmFnbWVudHNfZGInIC0tdGFibGUgJ3NhbXBsZScgLS1mcmFnbWVudF9jb2x1bW4gJ2ZyYWdtZW50JyAtLW91dHB1dCAnb3V0ZGlyJwogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBDb250YWluZXIgJ3Rlc3RfZnJhZ21lbnRzX2RiJyBpcyBhbHJlYWR5IHJ1bm5pbmcuCiAgICAgIENvbm5lY3RlZCB0byBkYXRhYmFzZS4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IHRhYmxlIHwgYCAic2FtcGxlIiBgIHwKICAgICAgIHwgc2VxdWVuY2VcX2NvbHVtbiB8IGAgInNlcXVlbmNlIiBgIHwKICAgICAgIHwgYW5ub3RhdGlvblxfY29sdW1ucyB8IGAgImFubm90YXRpb24iIGAgfAogICAgICAgfCBmcmFnbWVudFxfY29sdW1uIHwgYCAiZnJhZ21lbnQiIGAgfAogICAgICAgfCBkYlxfdXJpIHwgYCAicG9zdGdyZXNxbDovL3Bvc3RncmVzOlJLMTdAbG9jYWxob3N0OjU0MzIvdGVzdF9mcmFnbWVudHNfZGIiIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcDQydzcyeXRvL2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJpbnB1dCIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKPC9kZXRhaWxzPgo=\'));\n+    </script>\n+  </body>\n+</html>\n\\ No newline at end of file\n'
b
diff -r a52626182172 -r 56a0938d534d output.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/output.json Fri Apr 18 12:52:49 2025 +0000
[
@@ -0,0 +1,106 @@
+{
+    "summary": {
+        "num_errors": 0,
+        "num_failures": 0,
+        "num_skips": 0,
+        "num_tests": 1
+    },
+    "tests": [
+        {
+            "data": {
+                "inputs": {
+                    "annotation_columns": "annotation",
+                    "db_uri": "postgresql://postgres:RK17@localhost:5432/test_fragments_db",
+                    "fragment_column": "fragment",
+                    "input": {
+                        "id": "706ba6c84a03098c",
+                        "src": "hda"
+                    },
+                    "sequence_column": "sequence",
+                    "table": "sample"
+                },
+                "job": {
+                    "command_line": "mkdir 'outdir' && python '/home/rkhaled/galaxytools/tools/get_db_data/get_db_info.py' --input '/tmp/tmp42w72yto/files/3/6/2/dataset_3622642b-aec9-4602-bb27-170ce5daff6d.dat' --sequence_column 'sequence' --annotation_columns 'annotation' --db_uri 'postgresql://postgres:RK17__at__localhost:5432/test_fragments_db' --table 'sample' --fragment_column 'fragment' --output 'outdir'",
+                    "command_version": null,
+                    "copied_from_job_id": null,
+                    "create_time": "2025-04-18T12:52:15.493942",
+                    "dependencies": [],
+                    "exit_code": 0,
+                    "external_id": "157761",
+                    "galaxy_version": "24.2",
+                    "handler": null,
+                    "history_id": "706ba6c84a03098c",
+                    "id": "cc02f40f5df38cc6",
+                    "inputs": {
+                        "input": {
+                            "id": "706ba6c84a03098c",
+                            "src": "hda",
+                            "uuid": "3622642b-aec9-4602-bb27-170ce5daff6d"
+                        }
+                    },
+                    "job_messages": [],
+                    "job_metrics": [],
+                    "job_runner_name": null,
+                    "job_stderr": "",
+                    "job_stdout": "",
+                    "model_class": "Job",
+                    "output_collections": {
+                        "output_gb": {
+                            "id": "706ba6c84a03098c",
+                            "src": "hdca"
+                        }
+                    },
+                    "outputs": {
+                        "__new_primary_file_output_gb|ACP10001AaCbbBS__": {
+                            "id": "cc02f40f5df38cc6",
+                            "src": "hda",
+                            "uuid": "808dfb23-fd8a-4bd8-a8b1-c1cb9f569537"
+                        },
+                        "__new_primary_file_output_gb|CFP10002AaCbbBS__": {
+                            "id": "c817ad70fa00c136",
+                            "src": "hda",
+                            "uuid": "33a35584-db32-4cf5-9f97-29e32956b76a"
+                        },
+                        "__new_primary_file_output_gb|QWE10004AaCbbBS__": {
+                            "id": "ecde0ca67d20406e",
+                            "src": "hda",
+                            "uuid": "50ef4259-8c5c-48f3-b6d8-77b478bff207"
+                        },
+                        "__new_primary_file_output_gb|XYZ10003AaCbbBS__": {
+                            "id": "5dd74542a4c0f825",
+                            "src": "hda",
+                            "uuid": "65a4517c-ed95-4894-9846-73d8d8f4b3ec"
+                        }
+                    },
+                    "params": {
+                        "__input_ext": "\"input\"",
+                        "annotation_columns": "\"annotation\"",
+                        "chromInfo": "\"/tmp/tmp42w72yto/galaxy-dev/tool-data/shared/ucsc/chrom/?.len\"",
+                        "db_uri": "\"postgresql://postgres:RK17@localhost:5432/test_fragments_db\"",
+                        "dbkey": "\"?\"",
+                        "fragment_column": "\"fragment\"",
+                        "sequence_column": "\"sequence\"",
+                        "table": "\"sample\""
+                    },
+                    "state": "ok",
+                    "stderr": "",
+                    "stdout": "Container 'test_fragments_db' is already running.\nConnected to database.\n",
+                    "tool_id": "get_DB_data",
+                    "tool_stderr": "",
+                    "tool_stdout": "Container 'test_fragments_db' is already running.\nConnected to database.\n",
+                    "update_time": "2025-04-18T12:52:21.995313",
+                    "user_email": "planemo@galaxyproject.org",
+                    "user_id": "706ba6c84a03098c"
+                },
+                "status": "success",
+                "test_index": 0,
+                "time_seconds": 16.213179349899292,
+                "tool_id": "get_DB_data",
+                "tool_version": "0.1.0+galaxy0"
+            },
+            "has_data": true,
+            "id": "get_DB_data-0"
+        }
+    ],
+    "version": "0.1"
+}
\ No newline at end of file
b
diff -r a52626182172 -r 56a0938d534d test-data/output/ACP10001AaCbbBS.gb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output/ACP10001AaCbbBS.gb Fri Apr 18 12:52:49 2025 +0000
b
@@ -0,0 +1,18 @@
+LOCUS       ACP10001AaCbbBS                150 bp ds-DNA     circular SYN 14-SEP-2017
+DEFINITION  Fragment ACP10001AaCbbBS from Backbone Sample-3
+ACCESSION   ACP10001AaCbbBS
+VERSION     DB
+KEYWORDS    .
+SOURCE      .
+FEATURES             Location/Qualifiers
+     CDS             5..150
+                     /vntifkey="1"
+                     /label=mock_gene_A
+     misc_feature    160..240
+                     /vntifkey="11"
+                     /label=mock_feature_A
+ORIGIN
+1 atggccattg taatgggccg ctgaaagggt gcccggatca ctttcgctgt ttcgacgttg
+61 gcttggtccc agcggcggca ccgagctggg tagcggtcag gagctgcttc gcgtgagcgg
+121 ctgccagggc agctgacgcc gctgcgcgca gctgcgcatg
+//
b
diff -r a52626182172 -r 56a0938d534d test-data/output/CFP10002AaCbbBS.gb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output/CFP10002AaCbbBS.gb Fri Apr 18 12:52:49 2025 +0000
b
@@ -0,0 +1,18 @@
+LOCUS       CFP10002AaCbbBS                130 bp ds-DNA     circular SYN 14-SEP-2017
+DEFINITION  Fragment CFP10002AaCbbBS from Backbone Sample-4
+ACCESSION   CFP10002AaCbbBS
+VERSION     DB
+KEYWORDS    .
+SOURCE      .
+FEATURES             Location/Qualifiers
+     CDS             10..130
+                     /vntifkey="2"
+                     /label=mock_gene_B
+     misc_feature    complement(140..220)
+                     /vntifkey="12"
+                     /label=mock_feature_B
+ORIGIN
+1 ggatccgtaa atcggtttac ggtgcgttat gatctgtgaa acgccagcag cgcgcggtat
+61 ctcgacgtaa agcggttgca cgtgatggtt gccggcatgc ctgtgcgtga atggctgtgg
+121 ccggtacgtt gagcggcgtg
+//
b
diff -r a52626182172 -r 56a0938d534d test-data/output/QWE10004AaCbbBS.gb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output/QWE10004AaCbbBS.gb Fri Apr 18 12:52:49 2025 +0000
b
@@ -0,0 +1,17 @@
+LOCUS       QWE10004AaCbbBS                130 bp ds-DNA     circular SYN 14-SEP-2017
+DEFINITION  Fragment QWE10004AaCbbBS from Backbone Sample-4
+ACCESSION   QWE10004AaCbbBS
+VERSION     DB
+KEYWORDS    .
+SOURCE      .
+FEATURES             Location/Qualifiers
+     CDS             20..130
+                     /vntifkey="4"
+                     /label=mock_gene_D
+     misc_feature    complement(145..225)
+                     /vntifkey="14"
+                     /label=mock_feature_D
+ORIGIN
+1 atgtttgctg gggcgatgct ggggctgctt tgttggcgcc gttttggtgg tgtttggttc
+61 tgctggggcc gggcgtgttt cgcgttggcg cgtgcgcgtt
+//
b
diff -r a52626182172 -r 56a0938d534d test-data/output/XYZ10003AaCbbBS.gb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output/XYZ10003AaCbbBS.gb Fri Apr 18 12:52:49 2025 +0000
b
@@ -0,0 +1,17 @@
+LOCUS       XYZ10003AaCbbBS                120 bp ds-DNA     circular SYN 14-SEP-2017
+DEFINITION  Fragment XYZ10003AaCbbBS from Backbone Sample-4
+ACCESSION   XYZ10003AaCbbBS
+VERSION     DB
+KEYWORDS    .
+SOURCE      .
+FEATURES             Location/Qualifiers
+     CDS             15..115
+                     /vntifkey="3"
+                     /label=mock_gene_C
+     misc_feature    130..210
+                     /vntifkey="13"
+                     /label=mock_feature_C
+ORIGIN
+1 tccgtttggg ccgttggttc cgtccggttg gggttttcgc gctgtggccg gatccggttg
+61 gcttttggcg ggggcgggtt cgtttttttc cggctttggg ccgggccgtt
+//
b
diff -r a52626182172 -r 56a0938d534d test-data/output_annotations.txt
--- a/test-data/output_annotations.txt Fri Apr 18 09:57:55 2025 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,2 +0,0 @@
-ALT30005CcEddLM
-NEW20001BbDccKT