# HG changeset patch # User iuc # Date 1548758056 18000 # Node ID 1cfc579079a63f75853f2a584701bee251c898b9 # Parent fa30df9b79c2a567e5dad300fa6542aa23f30a80 planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse commit b6f9a87b6091cc881a49e0b6acfadc5e7786967f diff -r fa30df9b79c2 -r 1cfc579079a6 jbrowse-fromdir.xml --- a/jbrowse-fromdir.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/jbrowse-fromdir.xml Tue Jan 29 05:34:16 2019 -0500 @@ -4,8 +4,7 @@ macros.xml - - %s', self.outdir, ' '.join(cmd), gff3_unrebased.name) subprocess.check_call(cmd, cwd=self.outdir, stdout=gff3_unrebased) gff3_unrebased.close() @@ -453,27 +481,23 @@ shutil.copy(gff3_rebased.name, gff3) os.unlink(gff3_rebased.name) - config = { - 'glyph': 'JBrowse/View/FeatureGlyph/Segments', - "category": trackData['category'], - } + dest = os.path.join(self.outdir, 'data', 'raw', trackData['label'] + '.gff') - clientConfig = trackData['style'] + self._sort_gff(gff3, dest) - cmd = ['perl', self._jbrowse_bin('flatfile-to-json.pl'), - '--gff', gff3, - '--trackLabel', trackData['label'], - '--key', trackData['key'], - '--clientConfig', json.dumps(clientConfig), - '--config', json.dumps(config), - '--trackType', 'BlastView/View/Track/CanvasFeatures' - ] + url = os.path.join('raw', trackData['label'] + '.gff.gz') + trackData.update({ + "urlTemplate": url, + "storeClass": "JBrowse/Store/SeqFeature/GFF3Tabix", + }) - # className in --clientConfig is ignored, it needs to be set with --className - if 'className' in trackData['style']: - cmd += ['--className', trackData['style']['className']] + trackData['glyph'] = 'JBrowse/View/FeatureGlyph/Segments' - self.subprocess_check_call(cmd) + trackData['trackType'] = 'BlastView/View/Track/CanvasFeatures' + trackData['type'] = 'BlastView/View/Track/CanvasFeatures' + + self._add_track_json(trackData) + os.unlink(gff3) if blastOpts.get('index', 'false') == 'true': @@ -504,6 +528,37 @@ self._add_track_json(trackData) + def add_bigwig_multiple(self, data, trackData, wiggleOpts, **kwargs): + + urls = [] + for idx, bw in enumerate(data): + dest = os.path.join('data', 'raw', trackData['label'] + '_' + str(idx) + '.bw') + cmd = ['ln', '-s', bw[1], dest] + self.subprocess_check_call(cmd) + + urls.append({"url": os.path.join('raw', trackData['label'] + '_' + str(idx) + '.bw'), "name": str(idx + 1) + ' - ' + bw[0]}) + + trackData.update({ + "urlTemplates": urls, + "showTooltips": "true", + "storeClass": "MultiBigWig/Store/SeqFeature/MultiBigWig", + "type": "MultiBigWig/View/Track/MultiWiggle/MultiDensity", + }) + if 'XYPlot' in wiggleOpts['type']: + trackData['type'] = "MultiBigWig/View/Track/MultiWiggle/MultiXYPlot" + + trackData['variance_band'] = True if wiggleOpts['variance_band'] == 'true' else False + + if 'min' in wiggleOpts and 'max' in wiggleOpts: + trackData['min_score'] = wiggleOpts['min'] + trackData['max_score'] = wiggleOpts['max'] + else: + trackData['autoscale'] = wiggleOpts.get('autoscale', 'local') + + trackData['scale'] = wiggleOpts['scale'] + + self._add_track_json(trackData) + def add_bam(self, data, trackData, bamOpts, bam_index=None, **kwargs): dest = os.path.join('data', 'raw', trackData['label'] + '.bam') cmd = ['ln', '-s', os.path.realpath(data), dest] @@ -517,6 +572,7 @@ "urlTemplate": url, "type": "JBrowse/View/Track/Alignments2", "storeClass": "JBrowse/Store/SeqFeature/BAM", + "chunkSizeLimit": bamOpts.get('chunkSizeLimit', '5000000') }) # Apollo will only switch to the (prettier) 'bam-read' className if it's not set explicitly in the track config @@ -532,6 +588,7 @@ "type": "JBrowse/View/Track/SNPCoverage", "key": trackData['key'] + " - SNPs/Coverage", "label": trackData['label'] + "_autosnp", + "chunkSizeLimit": bamOpts.get('chunkSizeLimit', '5000000') }) self._add_track_json(trackData2) @@ -545,7 +602,7 @@ cmd = ['tabix', '-p', 'vcf', dest + '.gz'] self.subprocess_check_call(cmd) - url = os.path.join('raw', trackData['label'] + '.vcf') + url = os.path.join('raw', trackData['label'] + '.vcf.gz') trackData.update({ "urlTemplate": url, "type": "JBrowse/View/Track/HTMLVariants", @@ -553,56 +610,50 @@ }) self._add_track_json(trackData) - def add_features(self, data, format, trackData, gffOpts, metadata=None, **kwargs): - cmd = [ - 'perl', self._jbrowse_bin('flatfile-to-json.pl'), - self.TN_TABLE.get(format, 'gff'), - data, - '--trackLabel', trackData['label'], - '--key', trackData['key'] - ] + def _sort_gff(self, data, dest): + + if not os.path.exists(dest): + # Only index if not already done + cmd = "grep ^\"#\" '%s' > '%s'" % (data, dest) + self.subprocess_popen(cmd) + + cmd = "grep -v ^\"#\" '%s' | grep -v \"^$\" | grep \"\t\" | sort -k1,1 -k4,4n >> '%s'" % (data, dest) + self.subprocess_popen(cmd) - # className in --clientConfig is ignored, it needs to be set with --className - if 'className' in trackData['style']: - cmd += ['--className', trackData['style']['className']] + cmd = ['bgzip', '-f', dest] + self.subprocess_popen(' '.join(cmd)) + cmd = ['tabix', '-f', '-p', 'gff', dest + '.gz'] + self.subprocess_popen(' '.join(cmd)) + + def add_features(self, data, format, trackData, gffOpts, **kwargs): - config = copy.copy(trackData) - clientConfig = trackData['style'] - del config['style'] + dest = os.path.join(self.outdir, 'data', 'raw', trackData['label'] + '.gff') + + self._sort_gff(data, dest) + + url = os.path.join('raw', trackData['label'] + '.gff.gz') + trackData.update({ + "urlTemplate": url, + "storeClass": "JBrowse/Store/SeqFeature/GFF3Tabix", + }) if 'match' in gffOpts: - config['glyph'] = 'JBrowse/View/FeatureGlyph/Segments' - if bool(gffOpts['match']): - # Can be empty for CanvasFeatures = will take all by default - cmd += ['--type', gffOpts['match']] - - cmd += ['--clientConfig', json.dumps(clientConfig), - ] + trackData['glyph'] = 'JBrowse/View/FeatureGlyph/Segments' trackType = 'JBrowse/View/Track/CanvasFeatures' if 'trackType' in gffOpts: trackType = gffOpts['trackType'] + trackData['trackType'] = trackType if trackType == 'JBrowse/View/Track/CanvasFeatures': if 'transcriptType' in gffOpts and gffOpts['transcriptType']: - config['transcriptType'] = gffOpts['transcriptType'] + trackData['transcriptType'] = gffOpts['transcriptType'] if 'subParts' in gffOpts and gffOpts['subParts']: - config['subParts'] = gffOpts['subParts'] + trackData['subParts'] = gffOpts['subParts'] if 'impliedUTRs' in gffOpts and gffOpts['impliedUTRs']: - config['impliedUTRs'] = gffOpts['impliedUTRs'] - elif trackType == 'JBrowse/View/Track/HTMLFeatures': - if 'transcriptType' in gffOpts and gffOpts['transcriptType']: - cmd += ['--type', gffOpts['transcriptType']] + trackData['impliedUTRs'] = gffOpts['impliedUTRs'] - cmd += [ - '--trackType', gffOpts['trackType'] - ] - - if metadata: - config.update({'metadata': metadata}) - cmd.extend(['--config', json.dumps(config)]) - - self.subprocess_check_call(cmd) + self._add_track_json(trackData) if gffOpts.get('index', 'false') == 'true': self.tracksToIndex.append("%s" % trackData['label']) @@ -614,10 +665,19 @@ "category": trackData['category'], "type": "JBrowse/View/Track/HTMLFeatures", "storeClass": "JBrowse/Store/SeqFeature/REST", - "baseUrl": url, - "query": { - "organism": "tyrannosaurus" - } + "baseUrl": url + } + self._add_track_json(data) + + def add_sparql(self, url, query, trackData): + data = { + "label": trackData['label'], + "key": trackData['key'], + "category": trackData['category'], + "type": "JBrowse/View/Track/CanvasFeatures", + "storeClass": "JBrowse/Store/SeqFeature/SPARQL", + "urlTemplate": url, + "queryTemplate": query } self._add_track_json(data) @@ -645,7 +705,8 @@ '{': '__oc__', '}': '__cc__', '@': '__at__', - '#': '__pd__' + '#': '__pd__', + "": '__cn__' } for i, (dataset_path, dataset_ext, track_human_label, extra_metadata) in enumerate(track['trackfiles']): @@ -656,18 +717,19 @@ log.info('Processing %s / %s', category, track_human_label) outputTrackConfig['key'] = track_human_label # We add extra data to hash for the case of REST + SPARQL. - try: + if 'conf' in track and 'options' in track['conf'] and 'url' in track['conf']['options']: rest_url = track['conf']['options']['url'] - except KeyError: + else: rest_url = '' # I chose to use track['category'] instead of 'category' here. This # is intentional. This way re-running the tool on a different date # will not generate different hashes and make comparison of outputs # much simpler. - hashData = [dataset_path, track_human_label, track['category'], rest_url] + hashData = [str(dataset_path), track_human_label, track['category'], rest_url] hashData = '|'.join(hashData).encode('utf-8') outputTrackConfig['label'] = hashlib.md5(hashData).hexdigest() + '_%s' % i + outputTrackConfig['metadata'] = extra_metadata # Colour parsing is complex due to different track types having # different colour options. @@ -688,10 +750,13 @@ # import sys; sys.exit() if dataset_ext in ('gff', 'gff3', 'bed'): self.add_features(dataset_path, dataset_ext, outputTrackConfig, - track['conf']['options']['gff'], metadata=extra_metadata) + track['conf']['options']['gff']) elif dataset_ext == 'bigwig': self.add_bigwig(dataset_path, outputTrackConfig, - track['conf']['options']['wiggle'], metadata=extra_metadata) + track['conf']['options']['wiggle']) + elif dataset_ext == 'bigwig_multiple': + self.add_bigwig_multiple(dataset_path, outputTrackConfig, + track['conf']['options']['wiggle']) elif dataset_ext == 'bam': real_indexes = track['conf']['options']['pileup']['bam_indices']['bam_index'] if not isinstance(real_indexes, list): @@ -706,13 +771,18 @@ self.add_bam(dataset_path, outputTrackConfig, track['conf']['options']['pileup'], - bam_index=real_indexes[i], metadata=extra_metadata) + bam_index=real_indexes[i]) elif dataset_ext == 'blastxml': - self.add_blastxml(dataset_path, outputTrackConfig, track['conf']['options']['blast'], metadata=extra_metadata) + self.add_blastxml(dataset_path, outputTrackConfig, track['conf']['options']['blast']) elif dataset_ext == 'vcf': - self.add_vcf(dataset_path, outputTrackConfig, metadata=extra_metadata) + self.add_vcf(dataset_path, outputTrackConfig) elif dataset_ext == 'rest': - self.add_rest(track['conf']['options']['url'], outputTrackConfig, metadata=extra_metadata) + self.add_rest(track['conf']['options']['rest']['url'], outputTrackConfig) + elif dataset_ext == 'sparql': + sparql_query = track['conf']['options']['sparql']['query'] + for key, value in mapped_chars.items(): + sparql_query = sparql_query.replace(value, key) + self.add_sparql(track['conf']['options']['sparql']['url'], sparql_query, outputTrackConfig) else: log.warn('Do not know how to handle %s', dataset_ext) @@ -750,11 +820,43 @@ if 'GCContent' in data['plugins_python']: self._add_track_json({ - "storeClass": "JBrowse/Store/SeqFeature/SequenceChunks", + "storeClass": "JBrowse/Store/SeqFeature/IndexedFasta", "type": "GCContent/View/Track/GCContentXY", - "label": "GCContentXY", - "urlTemplate": "seq/{refseq_dirpath}/{refseq}-", - "bicolor_pivot": 0.5 + "label": "GC Content", + "key": "GCContentXY", + "urlTemplate": "seq/genome.fasta", + "bicolor_pivot": 0.5, + "category": "GC Content", + "metadata": { + "tool_tool": 'elsiklab/gccontent', + "tool_tool_version": "5c8b0582ecebf9edf684c76af8075fb3d30ec3fa", + "dataset_edam_format": "", + "dataset_size": "", + "history_display_name": "", + "history_user_email": "", + "metadata_dbkey": "", + } + # TODO: Expose params for everyone. + }) + self._add_track_json({ + "storeClass": "JBrowse/Store/SeqFeature/IndexedFasta", + "type": "GCContent/View/Track/GCContentXY", + "label": "GC skew", + "key": "GCSkew", + "urlTemplate": "seq/genome.fasta", + "gcMode": "skew", + "min_score": -1, + "bicolor_pivot": 0, + "category": "GC Content", + "metadata": { + "tool_tool": 'elsiklab/gccontent', + "tool_tool_version": "5c8b0582ecebf9edf684c76af8075fb3d30ec3fa", + "dataset_edam_format": "", + "dataset_size": "", + "history_display_name": "", + "history_user_email": "", + "metadata_dbkey": "", + } # TODO: Expose params for everyone. }) @@ -785,6 +887,7 @@ ], "type": "Faceted", "title": ["Galaxy Metadata"], + "icon": "https://galaxyproject.org/images/logos/galaxy-icon-square.png", "escapeHTMLInData": False }, "trackMetadata": { @@ -833,12 +936,20 @@ parser.add_argument('--jbrowse', help='Folder containing a jbrowse release') parser.add_argument('--outdir', help='Output directory', default='out') parser.add_argument('--standalone', help='Standalone mode includes a copy of JBrowse', action='store_true') - parser.add_argument('--version', '-V', action='version', version="%(prog)s 0.7.0") + parser.add_argument('--version', '-V', action='version', version="%(prog)s 0.8.0") args = parser.parse_args() tree = ET.parse(args.xml.name) root = tree.getroot() + # This should be done ASAP + GALAXY_INFRASTRUCTURE_URL = root.find('metadata/galaxyUrl').text + # Sometimes this comes as `localhost` without a protocol + if not GALAXY_INFRASTRUCTURE_URL.startswith('http'): + # so we'll prepend `http://` and hope for the best. Requests *should* + # be GET and not POST so it should redirect OK + GALAXY_INFRASTRUCTURE_URL = 'http://' + GALAXY_INFRASTRUCTURE_URL + jc = JbrowseConnector( jbrowse=args.jbrowse, outdir=args.outdir, @@ -871,11 +982,8 @@ 'show_menu': root.find('metadata/general/show_menu').text, 'hideGenomeOptions': root.find('metadata/general/hideGenomeOptions').text, }, - 'plugins': [{ - 'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/blastview@97572a21b7f011c2b4d9a0b5af40e292d694cbef/', - 'name': 'BlastView' - }], - 'plugins_python': ['BlastView'], + 'plugins': [], + 'plugins_python': [], } plugins = root.find('plugins').attrib @@ -886,19 +994,22 @@ 'name': 'GCContent' }) - if plugins['Bookmarks'] == 'True': - extra_data['plugins'].append({ - 'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/bookmarks-jbrowse@5242694120274c86e1ccd5cb0e5e943e78f82393/', - 'name': 'Bookmarks' - }) + # Not needed in 1.16.1: it's built in the conda package now, and this plugin doesn't need to be enabled anywhere + # if plugins['Bookmarks'] == 'True': + # extra_data['plugins'].append({ + # 'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/bookmarks-jbrowse@5242694120274c86e1ccd5cb0e5e943e78f82393/', + # 'name': 'Bookmarks' + # }) + # Not needed in 1.16.1: it's built in the conda package now, and this plugin doesn't need to be enabled anywhere if plugins['ComboTrackSelector'] == 'True': extra_data['plugins_python'].append('ComboTrackSelector') - extra_data['plugins'].append({ - 'location': 'https://cdn.jsdelivr.net/gh/Arabidopsis-Information-Portal/ComboTrackSelector@52403928d5ccbe2e3a86b0fa5eb8e61c0f2e2f57', - 'icon': 'https://galaxyproject.org/images/logos/galaxy-icon-square.png', - 'name': 'ComboTrackSelector' - }) + # Not needed in 1.16.1: it's built in the conda package now, and this plugin doesn't need to be enabled anywhere + # extra_data['plugins'].append({ + # 'location': 'https://cdn.jsdelivr.net/gh/Arabidopsis-Information-Portal/ComboTrackSelector@52403928d5ccbe2e3a86b0fa5eb8e61c0f2e2f57/', + # 'icon': 'https://galaxyproject.org/images/logos/galaxy-icon-square.png', + # 'name': 'ComboTrackSelector' + # }) if plugins['theme'] == 'Minimalist': extra_data['plugins'].append({ @@ -911,25 +1022,57 @@ 'name': 'DarkTheme' }) - GALAXY_INFRASTRUCTURE_URL = root.find('metadata/galaxyUrl').text - # Sometimes this comes as `localhost` without a protocol - if not GALAXY_INFRASTRUCTURE_URL.startswith('http'): - # so we'll prepend `http://` and hope for the best. Requests *should* - # be GET and not POST so it should redirect OK - GALAXY_INFRASTRUCTURE_URL = 'http://' + GALAXY_INFRASTRUCTURE_URL + if plugins['BlastView'] == 'True': + extra_data['plugins_python'].append('BlastView') + extra_data['plugins'].append({ + 'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/blastview@97572a21b7f011c2b4d9a0b5af40e292d694cbef/', + 'name': 'BlastView' + }) for track in root.findall('tracks/track'): track_conf = {} track_conf['trackfiles'] = [] - for x in track.findall('files/trackFile'): + is_multi_bigwig = False + try: + if track.find('options/wiggle/multibigwig') and (track.find('options/wiggle/multibigwig').text == 'True'): + is_multi_bigwig = True + multi_bigwig_paths = [] + except KeyError: + pass + + trackfiles = track.findall('files/trackFile') + if trackfiles: + for x in track.findall('files/trackFile'): + if is_multi_bigwig: + multi_bigwig_paths.append((x.attrib['label'], os.path.realpath(x.attrib['path']))) + else: + if trackfiles: + metadata = metadata_from_node(x.find('metadata')) + + track_conf['trackfiles'].append(( + os.path.realpath(x.attrib['path']), + x.attrib['ext'], + x.attrib['label'], + metadata + )) + else: + # For tracks without files (rest, sparql) + track_conf['trackfiles'].append(( + '', # N/A, no path for rest or sparql + track.attrib['format'], + track.find('options/label').text, + {} + )) + + if is_multi_bigwig: metadata = metadata_from_node(x.find('metadata')) track_conf['trackfiles'].append(( - os.path.realpath(x.attrib['path']), - x.attrib['ext'], - x.attrib['label'], - metadata + multi_bigwig_paths, # Passing an array of paths to represent as one track + 'bigwig_multiple', + 'MultiBigWig', # Giving an hardcoded name for now + {} # No metadata for multiple bigwig )) track_conf['category'] = track.attrib['cat'] @@ -937,7 +1080,7 @@ try: # Only pertains to gff3 + blastxml. TODO? track_conf['style'] = {t.tag: t.text for t in track.find('options/style')} - except TypeError as te: + except TypeError: track_conf['style'] = {} pass track_conf['conf'] = etree_to_dict(track.find('options')) diff -r fa30df9b79c2 -r 1cfc579079a6 jbrowse.xml --- a/jbrowse.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/jbrowse.xml Tue Jan 29 05:34:16 2019 -0500 @@ -4,9 +4,8 @@ macros.xml - python '${__tool_directory__}/jbrowse.py' --version - s #else - #for $genome in $reference_genome.genomes: - - - - - - - - - #end for + + + + + + + + #end if @@ -117,12 +114,8 @@ #for $tg in $track_groups: #for $track in $tg.data_tracks: - #if $track.data_format.data_format_select == "rest": - ${track.data_format.url} - - #else: - + #if $track.data_format.data_format_select != "rest" and $track.data_format.data_format_select != "sparql": #for $dataset in $track.data_format.annotation: @@ -150,9 +143,10 @@ #end for + #end if - #if str($track.data_format.data_format_select) == "gene_calls" or str($track.data_format.data_format_select) == "blast": + #if str($track.data_format.data_format_select) == "gene_calls" or str($track.data_format.data_format_select) == "blast" or str($track.data_format.data_format_select) == "rest" or str($track.data_format.data_format_select) == "sparql": + + ignore + + __auto__ + + + + + + + + http://example.org.external/rest_api/ + + + + + + + + + ignore + + __auto__ + + + + + + + + http://example.org.external/sparql/ + DEFINE sql:select-option 'order' prefix rdf: __lt__http://www.w3.org/1999/02/22-rdf-syntax-ns#__gt__ select ?start, ?end, IF( ?faldo_type = faldo:ForwardStrandPosition, 1, IF( ?faldo_type = faldo:ReverseStrandPosition, -1, 0 ) ) as ?strand, str(?obj_type_name) as ?type, str(?label) as ?name, str(?obj_name) as ?description, ?obj as ?uniqueID, ?parent as ?parentUniqueID where { values ?faldo_type { faldo:ForwardStrandPosition faldo:ReverseStrandPosition faldo:BothStrandsPosition } } + + + + + + diff -r fa30df9b79c2 -r 1cfc579079a6 test-data/gencode/test-1.xml --- a/test-data/gencode/test-1.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/test-data/gencode/test-1.xml Tue Jan 29 05:34:16 2019 -0500 @@ -3,27 +3,27 @@ 1 - - - - - - - - + + + + + + + + @@ -37,7 +37,7 @@ true false - http://localhost:8080 + http://localhost @@ -45,6 +45,7 @@ ComboTrackSelector="" Bookmarks="" GCContent="" + BlastView="True" theme="" /> diff -r fa30df9b79c2 -r 1cfc579079a6 test-data/gencode/test-data_table.xml --- a/test-data/gencode/test-data_table.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/test-data/gencode/test-data_table.xml Tue Jan 29 05:34:16 2019 -0500 @@ -27,6 +27,7 @@ ComboTrackSelector="" Bookmarks="" GCContent="" + BlastView="True" theme="" /> diff -r fa30df9b79c2 -r 1cfc579079a6 test-data/gencode/test.xml --- a/test-data/gencode/test.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/test-data/gencode/test.xml Tue Jan 29 05:34:16 2019 -0500 @@ -3,27 +3,27 @@ 11 - - - - - - - - + + + + + + + + @@ -37,7 +37,7 @@ true false - http://localhost:8080 + http://localhost diff -r fa30df9b79c2 -r 1cfc579079a6 test-data/gff3/test.xml --- a/test-data/gff3/test.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/test-data/gff3/test.xml Tue Jan 29 05:34:16 2019 -0500 @@ -3,27 +3,27 @@ 11 - - - - - - - - + + + + + + + + @@ -37,12 +37,12 @@ true false - http://localhost:8080 + http://localhost - + - + - + - + @@ -171,7 +171,7 @@ - + @@ -225,7 +225,7 @@ - + @@ -285,7 +285,7 @@ - + @@ -345,7 +345,7 @@ - + @@ -407,7 +407,7 @@ - + @@ -469,7 +469,7 @@ - + @@ -523,7 +523,7 @@ - + @@ -581,6 +581,7 @@ ComboTrackSelector="" Bookmarks="" GCContent="" + BlastView="True" theme="" /> diff -r fa30df9b79c2 -r 1cfc579079a6 test-data/menus/test.xml --- a/test-data/menus/test.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/test-data/menus/test.xml Tue Jan 29 05:34:16 2019 -0500 @@ -3,27 +3,27 @@ 11 - - - - - - - - + + + + + + + + @@ -37,12 +37,12 @@ true false - http://localhost:8080 + http://localhost - + @@ -110,7 +110,7 @@ - + @@ -169,4 +169,4 @@ GCContent="" theme="" /> - + \ No newline at end of file diff -r fa30df9b79c2 -r 1cfc579079a6 test-data/track_config/test.xml --- a/test-data/track_config/test.xml Wed Jan 16 03:28:29 2019 -0500 +++ b/test-data/track_config/test.xml Tue Jan 29 05:34:16 2019 -0500 @@ -3,27 +3,27 @@ 11 - - - - - - - - + + + + + + + + @@ -37,12 +37,12 @@ true false - http://localhost:8080 + http://localhost - + @@ -101,4 +101,4 @@ GCContent="" theme="" /> - + \ No newline at end of file