Add a CustomDatatypeLoader for Galaxy installs, eliminate the use of the tool shed's datatyps_util module.

This commit is contained in:
Greg Von Kuster
2014-07-23 11:26:49 -04:00
parent 65f47df4db
commit adca85401e
7 changed files with 269 additions and 228 deletions
@@ -12,7 +12,6 @@ from galaxy.model.orm import or_
import tool_shed.repository_types.util as rt_util
from tool_shed.util import common_util
from tool_shed.util import datatype_util
from tool_shed.util import encoding_util
from tool_shed.util import hg_util
from tool_shed.util import readme_util
@@ -25,6 +24,7 @@ from tool_shed.util import workflow_util
from tool_shed.galaxy_install import dependency_display
from tool_shed.galaxy_install import install_manager
from tool_shed.galaxy_install.datatypes import custom_datatype_manager
from tool_shed.galaxy_install.grids import admin_toolshed_grids
from tool_shed.galaxy_install.metadata.installed_repository_metadata_manager import InstalledRepositoryMetadataManager
from tool_shed.galaxy_install.repair_repository_manager import RepairRepositoryManager
@@ -256,17 +256,17 @@ class AdminToolshed( AdminGalaxy ):
dmh.remove_from_data_manager( tool_shed_repository )
if tool_shed_repository.includes_datatypes:
# Deactivate proprietary datatypes.
installed_repository_dict = datatype_util.load_installed_datatypes( trans.app,
tool_shed_repository,
repository_install_dir,
deactivate=True )
cdl = custom_datatype_manager.CustomDatatypeLoader( trans.app )
installed_repository_dict = cdl.load_installed_datatypes( tool_shed_repository,
repository_install_dir,
deactivate=True )
if installed_repository_dict:
converter_path = installed_repository_dict.get( 'converter_path' )
if converter_path is not None:
datatype_util.load_installed_datatype_converters( trans.app, installed_repository_dict, deactivate=True )
cdl.load_installed_datatype_converters( installed_repository_dict, deactivate=True )
display_path = installed_repository_dict.get( 'display_path' )
if display_path is not None:
datatype_util.load_installed_display_applications( trans.app, installed_repository_dict, deactivate=True )
cdl.load_installed_display_applications( installed_repository_dict, deactivate=True )
if remove_from_disk_checked:
try:
# Remove the repository from disk.
@@ -0,0 +1,218 @@
import logging
import os
import tempfile
from galaxy.util import asbool
from tool_shed.util import basic_util
from tool_shed.util import hg_util
from tool_shed.util import tool_util
from tool_shed.util import shed_util_common as suc
from tool_shed.util import xml_util
log = logging.getLogger( __name__ )
class CustomDatatypeLoader( object ):
def __init__( self, app ):
self.app = app
def alter_config_and_load_prorietary_datatypes( self, datatypes_config, relative_install_dir,
deactivate=False, override=True ):
"""
Parse a custom datatypes config (a datatypes_conf.xml file included in an installed
tool shed repository) and add information to appropriate element attributes that will
enable custom datatype class modules, datatypes converters and display applications
to be discovered and properly imported by the datatypes registry. The value of override
will be False when a tool shed repository is being installed. Since installation is
occurring after the datatypes registry has been initialized, the registry's contents
cannot be overridden by conflicting data types.
"""
tree, error_message = xml_util.parse_xml( datatypes_config )
if tree is None:
return None, None
datatypes_config_root = tree.getroot()
registration = datatypes_config_root.find( 'registration' )
if registration is None:
# We have valid XML, but not a valid custom datatypes definition.
return None, None
sniffers = datatypes_config_root.find( 'sniffers' )
converter_path, display_path = self.get_converter_and_display_paths( registration,
relative_install_dir )
if converter_path:
# Path to datatype converters
registration.attrib[ 'proprietary_converter_path' ] = converter_path
if display_path:
# Path to datatype display applications
registration.attrib[ 'proprietary_display_path' ] = display_path
relative_path_to_datatype_file_name = None
datatype_files = datatypes_config_root.find( 'datatype_files' )
datatype_class_modules = []
if datatype_files is not None:
# The <datatype_files> tag set contains any number of <datatype_file> tags.
# <datatype_files>
# <datatype_file name="gmap.py"/>
# <datatype_file name="metagenomics.py"/>
# </datatype_files>
# We'll add attributes to the datatype tag sets so that the modules can be properly imported
# by the datatypes registry.
for elem in datatype_files.findall( 'datatype_file' ):
datatype_file_name = elem.get( 'name', None )
if datatype_file_name:
# Find the file in the installed repository.
for root, dirs, files in os.walk( relative_install_dir ):
if root.find( '.hg' ) < 0:
for name in files:
if name == datatype_file_name:
datatype_class_modules.append( os.path.join( root, name ) )
break
break
if datatype_class_modules:
for relative_path_to_datatype_file_name in datatype_class_modules:
datatype_file_name_path, datatype_file_name = os.path.split( relative_path_to_datatype_file_name )
for elem in registration.findall( 'datatype' ):
# Handle 'type' attribute which should be something like one of the following:
# type="gmap:GmapDB"
# type="galaxy.datatypes.gmap:GmapDB"
dtype = elem.get( 'type', None )
if dtype:
fields = dtype.split( ':' )
proprietary_datatype_module = fields[ 0 ]
if proprietary_datatype_module.find( '.' ) >= 0:
# Handle the case where datatype_module is "galaxy.datatypes.gmap".
proprietary_datatype_module = proprietary_datatype_module.split( '.' )[ -1 ]
# The value of proprietary_path must be an absolute path due to job_working_directory.
elem.attrib[ 'proprietary_path' ] = os.path.abspath( datatype_file_name_path )
elem.attrib[ 'proprietary_datatype_module' ] = proprietary_datatype_module
# Temporarily persist the custom datatypes configuration file so it can be loaded into the
# datatypes registry.
fd, proprietary_datatypes_config = tempfile.mkstemp( prefix="tmp-toolshed-acalpd" )
os.write( fd, '<?xml version="1.0"?>\n' )
os.write( fd, '<datatypes>\n' )
os.write( fd, '%s' % xml_util.xml_to_string( registration ) )
if sniffers is not None:
os.write( fd, '%s' % xml_util.xml_to_string( sniffers ) )
os.write( fd, '</datatypes>\n' )
os.close( fd )
os.chmod( proprietary_datatypes_config, 0644 )
# Load custom datatypes
self.app.datatypes_registry.load_datatypes( root_dir=self.app.config.root,
config=proprietary_datatypes_config,
deactivate=deactivate,
override=override )
if deactivate:
# Reload the upload tool to eliminate deactivated datatype extensions from the file_type
# select list.
tool_util.reload_upload_tools( self.app )
else:
self.append_to_datatypes_registry_upload_file_formats( registration )
tool_util.reload_upload_tools( self.app )
if datatype_files is not None:
try:
os.unlink( proprietary_datatypes_config )
except:
pass
return converter_path, display_path
def append_to_datatypes_registry_upload_file_formats( self, elem ):
# See if we have any datatypes that should be displayed in the upload tool's file_type select list.
for datatype_elem in elem.findall( 'datatype' ):
extension = datatype_elem.get( 'extension', None )
display_in_upload = datatype_elem.get( 'display_in_upload', None )
if extension is not None and display_in_upload is not None:
display_in_upload = asbool( str( display_in_upload ) )
if display_in_upload and extension not in self.app.datatypes_registry.upload_file_formats:
self.app.datatypes_registry.upload_file_formats.append( extension )
def create_repository_dict_for_proprietary_datatypes( self, tool_shed, name, owner, installed_changeset_revision,
tool_dicts, converter_path=None, display_path=None ):
return dict( tool_shed=tool_shed,
repository_name=name,
repository_owner=owner,
installed_changeset_revision=installed_changeset_revision,
tool_dicts=tool_dicts,
converter_path=converter_path,
display_path=display_path )
def get_converter_and_display_paths( self, registration_elem, relative_install_dir ):
"""
Find the relative path to data type converters and display applications included
in installed tool shed repositories.
"""
converter_path = None
display_path = None
for elem in registration_elem.findall( 'datatype' ):
if not converter_path:
# If any of the <datatype> tag sets contain <converter> tags, set the converter_path
# if it is not already set. This requires developers to place all converters in the
# same subdirectory within the repository hierarchy.
for converter in elem.findall( 'converter' ):
converter_config = converter.get( 'file', None )
if converter_config:
converter_config_file_name = basic_util.strip_path( converter_config )
for root, dirs, files in os.walk( relative_install_dir ):
if root.find( '.hg' ) < 0:
for name in files:
if name == converter_config_file_name:
# The value of converter_path must be absolute due to job_working_directory.
converter_path = os.path.abspath( root )
break
if converter_path:
break
if not display_path:
# If any of the <datatype> tag sets contain <display> tags, set the display_path
# if it is not already set. This requires developers to place all display acpplications
# in the same subdirectory within the repository hierarchy.
for display_app in elem.findall( 'display' ):
display_config = display_app.get( 'file', None )
if display_config:
display_config_file_name = basic_util.strip_path( display_config )
for root, dirs, files in os.walk( relative_install_dir ):
if root.find( '.hg' ) < 0:
for name in files:
if name == display_config_file_name:
# The value of display_path must be absolute due to job_working_directory.
display_path = os.path.abspath( root )
break
if display_path:
break
if converter_path and display_path:
break
return converter_path, display_path
def load_installed_datatype_converters( self, installed_repository_dict, deactivate=False ):
"""Load or deactivate proprietary datatype converters."""
self.app.datatypes_registry.load_datatype_converters( self.app.toolbox,
installed_repository_dict=installed_repository_dict,
deactivate=deactivate )
def load_installed_datatypes( self, repository, relative_install_dir, deactivate=False ):
"""
Load proprietary datatypes and return information needed for loading custom
datatypes converters and display applications later.
"""
metadata = repository.metadata
repository_dict = None
datatypes_config = hg_util.get_config_from_disk( suc.DATATYPES_CONFIG_FILENAME, relative_install_dir )
if datatypes_config:
converter_path, display_path = \
self.alter_config_and_load_prorietary_datatypes( datatypes_config,
relative_install_dir,
deactivate=deactivate )
if converter_path or display_path:
# Create a dictionary of tool shed repository related information.
repository_dict = \
self.create_repository_dict_for_proprietary_datatypes( tool_shed=repository.tool_shed,
name=repository.name,
owner=repository.owner,
installed_changeset_revision=repository.installed_changeset_revision,
tool_dicts=metadata.get( 'tools', [] ),
converter_path=converter_path,
display_path=display_path )
return repository_dict
def load_installed_display_applications( self, installed_repository_dict, deactivate=False ):
"""Load or deactivate custom datatype display applications."""
self.app.datatypes_registry.load_display_applications( installed_repository_dict=installed_repository_dict,
deactivate=deactivate )
@@ -18,7 +18,6 @@ from galaxy.model.orm import or_
from tool_shed.util import basic_util
from tool_shed.util import common_util
from tool_shed.util import datatype_util
from tool_shed.util import encoding_util
from tool_shed.util import hg_util
from tool_shed.util import shed_util_common as suc
@@ -26,6 +25,7 @@ from tool_shed.util import tool_dependency_util
from tool_shed.util import tool_util
from tool_shed.util import xml_util
from tool_shed.galaxy_install.datatypes import custom_datatype_manager
from tool_shed.galaxy_install.metadata.installed_repository_metadata_manager import InstalledRepositoryMetadataManager
from tool_shed.galaxy_install.repository_dependencies import repository_dependency_manager
from tool_shed.galaxy_install.tool_dependencies.recipe.env_file_builder import EnvFileBuilder
@@ -594,18 +594,19 @@ class InstallRepositoryManager( object ):
files_dir = os.path.join( shed_config_dict[ 'tool_path' ], files_dir )
datatypes_config = hg_util.get_config_from_disk( suc.DATATYPES_CONFIG_FILENAME, files_dir )
# Load data types required by tools.
cdl = custom_datatype_manager.CustomDatatypeLoader( self.app )
converter_path, display_path = \
datatype_util.alter_config_and_load_prorietary_datatypes( self.app, datatypes_config, files_dir, override=False )
cdl.alter_config_and_load_prorietary_datatypes( datatypes_config, files_dir, override=False )
if converter_path or display_path:
# Create a dictionary of tool shed repository related information.
repository_dict = \
datatype_util.create_repository_dict_for_proprietary_datatypes( tool_shed=tool_shed,
name=tool_shed_repository.name,
owner=tool_shed_repository.owner,
installed_changeset_revision=tool_shed_repository.installed_changeset_revision,
tool_dicts=metadata_dict.get( 'tools', [] ),
converter_path=converter_path,
display_path=display_path )
cdl.create_repository_dict_for_proprietary_datatypes( tool_shed=tool_shed,
name=tool_shed_repository.name,
owner=tool_shed_repository.owner,
installed_changeset_revision=tool_shed_repository.installed_changeset_revision,
tool_dicts=metadata_dict.get( 'tools', [] ),
converter_path=converter_path,
display_path=display_path )
if converter_path:
# Load proprietary datatype converters
self.app.datatypes_registry.load_datatype_converters( self.app.toolbox, installed_repository_dict=repository_dict )
@@ -7,12 +7,12 @@ import os
from galaxy import util
from tool_shed.util import common_util
from tool_shed.util import container_util
from tool_shed.util import datatype_util
from tool_shed.util import shed_util_common as suc
from tool_shed.util import tool_dependency_util
from tool_shed.util import xml_util
from galaxy.model.orm import and_
from tool_shed.galaxy_install.datatypes import custom_datatype_manager
from tool_shed.galaxy_install.metadata.installed_repository_metadata_manager import InstalledRepositoryMetadataManager
from tool_shed.galaxy_install.repository_dependencies import repository_dependency_manager
from tool_shed.galaxy_install.tools import data_manager
@@ -114,17 +114,17 @@ class InstalledRepositoryManager( object ):
else:
repository_install_dir = os.path.abspath( relative_install_dir )
# Activate proprietary datatypes.
installed_repository_dict = datatype_util.load_installed_datatypes( self.app,
repository,
repository_install_dir,
deactivate=False )
cdl = custom_datatype_manager.CustomDatatypeLoader( self.app )
installed_repository_dict = cdl.load_installed_datatypes( repository,
repository_install_dir,
deactivate=False )
if installed_repository_dict:
converter_path = installed_repository_dict.get( 'converter_path' )
if converter_path is not None:
datatype_util.load_installed_datatype_converters( self.app, installed_repository_dict, deactivate=False )
cdl.load_installed_datatype_converters( installed_repository_dict, deactivate=False )
display_path = installed_repository_dict.get( 'display_path' )
if display_path is not None:
datatype_util.load_installed_display_applications( self.app, installed_repository_dict, deactivate=False )
cdl.load_installed_display_applications( installed_repository_dict, deactivate=False )
def add_entry_to_installed_repository_dependencies_of_installed_repositories( self, repository ):
"""
@@ -732,22 +732,24 @@ class InstalledRepositoryManager( object ):
self.add_entry_to_installed_runtime_dependent_tool_dependencies_of_installed_tool_dependencies( tool_dependency )
def load_proprietary_datatypes( self ):
cdl = custom_datatype_manager.CustomDatatypeLoader( self.app )
for tool_shed_repository in self.context.query( self.install_model.ToolShedRepository ) \
.filter( and_( self.install_model.ToolShedRepository.table.c.includes_datatypes==True,
self.install_model.ToolShedRepository.table.c.deleted==False ) ) \
.order_by( self.install_model.ToolShedRepository.table.c.id ):
.filter( and_( self.install_model.ToolShedRepository.table.c.includes_datatypes==True,
self.install_model.ToolShedRepository.table.c.deleted==False ) ) \
.order_by( self.install_model.ToolShedRepository.table.c.id ):
relative_install_dir = self.get_repository_install_dir( tool_shed_repository )
if relative_install_dir:
installed_repository_dict = datatype_util.load_installed_datatypes( self.app, tool_shed_repository, relative_install_dir )
installed_repository_dict = cdl.load_installed_datatypes( tool_shed_repository, relative_install_dir )
if installed_repository_dict:
self.installed_repository_dicts.append( installed_repository_dict )
def load_proprietary_converters_and_display_applications( self, deactivate=False ):
cdl = custom_datatype_manager.CustomDatatypeLoader( self.app )
for installed_repository_dict in self.installed_repository_dicts:
if installed_repository_dict[ 'converter_path' ]:
datatype_util.load_installed_datatype_converters( self.app, installed_repository_dict, deactivate=deactivate )
cdl.load_installed_datatype_converters( installed_repository_dict, deactivate=deactivate )
if installed_repository_dict[ 'display_path' ]:
datatype_util.load_installed_display_applications( self.app, installed_repository_dict, deactivate=deactivate )
cdl.load_installed_display_applications( installed_repository_dict, deactivate=deactivate )
def purge_repository( self, repository ):
"""Purge a repository with status New (a white ghost) from the database."""
@@ -14,6 +14,7 @@ from galaxy.tools import ToolSection
from galaxy.util.odict import odict
from tool_shed.galaxy_install import install_manager
from tool_shed.galaxy_install.datatypes import custom_datatype_manager
from tool_shed.galaxy_install.metadata.installed_repository_metadata_manager import InstalledRepositoryMetadataManager
from tool_shed.galaxy_install.tools import tool_panel_manager
@@ -22,7 +23,6 @@ from tool_shed.tools import tool_version_manager
from tool_shed.util import basic_util
from tool_shed.util import common_util
from tool_shed.util import datatype_util
from tool_shed.util import hg_util
from tool_shed.util import shed_util_common as suc
from tool_shed.util import tool_dependency_util
@@ -492,6 +492,7 @@ class ToolMigrationManager( object ):
print '\nThe ToolMigrationManager returned the following error while installing tool dependency ', installed_tool_dependency.name, ':'
print installed_tool_dependency.error_message, '\n\n'
if 'datatypes' in metadata_dict:
cdl = custom_datatype_manager.CustomDatatypeLoader( self.app )
tool_shed_repository.status = self.app.install_model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
if not tool_shed_repository.includes_datatypes:
tool_shed_repository.includes_datatypes = True
@@ -499,21 +500,27 @@ class ToolMigrationManager( object ):
self.app.install_model.context.flush()
work_dir = tempfile.mkdtemp( prefix="tmp-toolshed-hrc" )
datatypes_config = hg_util.get_config_from_disk( suc.DATATYPES_CONFIG_FILENAME, repo_install_dir )
# Load proprietary data types required by tools. The value of override is not important here since the Galaxy server will be started
# after this installation completes.
converter_path, display_path = datatype_util.alter_config_and_load_prorietary_datatypes( self.app, datatypes_config, repo_install_dir, override=False ) #repo_install_dir was relative_install_dir
# Load proprietary data types required by tools. The value of override is not
# important here since the Galaxy server will be started after this installation
#completes.
converter_path, display_path = \
cdl.alter_config_and_load_prorietary_datatypes( datatypes_config,
repo_install_dir,
override=False )
if converter_path or display_path:
# Create a dictionary of tool shed repository related information.
repository_dict = datatype_util.create_repository_dict_for_proprietary_datatypes( tool_shed=self.tool_shed_url,
name=tool_shed_repository.name,
owner=self.repository_owner,
installed_changeset_revision=tool_shed_repository.installed_changeset_revision,
tool_dicts=metadata_dict.get( 'tools', [] ),
converter_path=converter_path,
display_path=display_path )
repository_dict = \
cdl.create_repository_dict_for_proprietary_datatypes( tool_shed=self.tool_shed_url,
name=tool_shed_repository.name,
owner=self.repository_owner,
installed_changeset_revision=tool_shed_repository.installed_changeset_revision,
tool_dicts=metadata_dict.get( 'tools', [] ),
converter_path=converter_path,
display_path=display_path )
if converter_path:
# Load proprietary datatype converters
self.app.datatypes_registry.load_datatype_converters( self.toolbox, installed_repository_dict=repository_dict )
self.app.datatypes_registry.load_datatype_converters( self.toolbox,
installed_repository_dict=repository_dict )
if display_path:
# Load proprietary datatype display applications
self.app.datatypes_registry.load_display_applications( installed_repository_dict=repository_dict )
-187
View File
@@ -1,187 +0,0 @@
import logging
import os
import tempfile
from galaxy import eggs
from galaxy.util import asbool
from tool_shed.util import basic_util
from tool_shed.util import hg_util
from tool_shed.util import tool_util
from tool_shed.util import xml_util
import tool_shed.util.shed_util_common as suc
log = logging.getLogger( __name__ )
def alter_config_and_load_prorietary_datatypes( app, datatypes_config, relative_install_dir, deactivate=False, override=True ):
"""
Parse a proprietary datatypes config (a datatypes_conf.xml file included in an installed tool shed repository) and
add information to appropriate element attributes that will enable proprietary datatype class modules, datatypes converters
and display applications to be discovered and properly imported by the datatypes registry. The value of override will
be False when a tool shed repository is being installed. Since installation is occurring after the datatypes registry
has been initialized, the registry's contents cannot be overridden by conflicting data types.
"""
tree, error_message = xml_util.parse_xml( datatypes_config )
if tree is None:
return None, None
datatypes_config_root = tree.getroot()
registration = datatypes_config_root.find( 'registration' )
if registration is None:
# We have valid XML, but not a valid proprietary datatypes definition.
return None, None
sniffers = datatypes_config_root.find( 'sniffers' )
converter_path, display_path = get_converter_and_display_paths( registration, relative_install_dir )
if converter_path:
# Path to datatype converters
registration.attrib[ 'proprietary_converter_path' ] = converter_path
if display_path:
# Path to datatype display applications
registration.attrib[ 'proprietary_display_path' ] = display_path
relative_path_to_datatype_file_name = None
datatype_files = datatypes_config_root.find( 'datatype_files' )
datatype_class_modules = []
if datatype_files is not None:
# The <datatype_files> tag set contains any number of <datatype_file> tags.
# <datatype_files>
# <datatype_file name="gmap.py"/>
# <datatype_file name="metagenomics.py"/>
# </datatype_files>
# We'll add attributes to the datatype tag sets so that the modules can be properly imported by the datatypes registry.
for elem in datatype_files.findall( 'datatype_file' ):
datatype_file_name = elem.get( 'name', None )
if datatype_file_name:
# Find the file in the installed repository.
for root, dirs, files in os.walk( relative_install_dir ):
if root.find( '.hg' ) < 0:
for name in files:
if name == datatype_file_name:
datatype_class_modules.append( os.path.join( root, name ) )
break
break
if datatype_class_modules:
for relative_path_to_datatype_file_name in datatype_class_modules:
datatype_file_name_path, datatype_file_name = os.path.split( relative_path_to_datatype_file_name )
for elem in registration.findall( 'datatype' ):
# Handle 'type' attribute which should be something like one of the following:
# type="gmap:GmapDB"
# type="galaxy.datatypes.gmap:GmapDB"
dtype = elem.get( 'type', None )
if dtype:
fields = dtype.split( ':' )
proprietary_datatype_module = fields[ 0 ]
if proprietary_datatype_module.find( '.' ) >= 0:
# Handle the case where datatype_module is "galaxy.datatypes.gmap".
proprietary_datatype_module = proprietary_datatype_module.split( '.' )[ -1 ]
# The value of proprietary_path must be an absolute path due to job_working_directory.
elem.attrib[ 'proprietary_path' ] = os.path.abspath( datatype_file_name_path )
elem.attrib[ 'proprietary_datatype_module' ] = proprietary_datatype_module
# Temporarily persist the proprietary datatypes configuration file so it can be loaded into the datatypes registry.
fd, proprietary_datatypes_config = tempfile.mkstemp( prefix="tmp-toolshed-acalpd" )
os.write( fd, '<?xml version="1.0"?>\n' )
os.write( fd, '<datatypes>\n' )
os.write( fd, '%s' % xml_util.xml_to_string( registration ) )
if sniffers is not None:
os.write( fd, '%s' % xml_util.xml_to_string( sniffers ) )
os.write( fd, '</datatypes>\n' )
os.close( fd )
os.chmod( proprietary_datatypes_config, 0644 )
# Load proprietary datatypes
app.datatypes_registry.load_datatypes( root_dir=app.config.root, config=proprietary_datatypes_config, deactivate=deactivate, override=override )
if deactivate:
# Reload the upload tool to eliminate deactivated datatype extensions from the file_type select list.
tool_util.reload_upload_tools( app )
else:
append_to_datatypes_registry_upload_file_formats( app, registration )
tool_util.reload_upload_tools( app )
if datatype_files is not None:
try:
os.unlink( proprietary_datatypes_config )
except:
pass
return converter_path, display_path
def append_to_datatypes_registry_upload_file_formats( app, elem ):
# See if we have any datatypes that should be displayed in the upload tool's file_type select list.
for datatype_elem in elem.findall( 'datatype' ):
extension = datatype_elem.get( 'extension', None )
display_in_upload = datatype_elem.get( 'display_in_upload', None )
if extension is not None and display_in_upload is not None:
display_in_upload = asbool( str( display_in_upload ) )
if display_in_upload and extension not in app.datatypes_registry.upload_file_formats:
app.datatypes_registry.upload_file_formats.append( extension )
def create_repository_dict_for_proprietary_datatypes( tool_shed, name, owner, installed_changeset_revision, tool_dicts, converter_path=None, display_path=None ):
return dict( tool_shed=tool_shed,
repository_name=name,
repository_owner=owner,
installed_changeset_revision=installed_changeset_revision,
tool_dicts=tool_dicts,
converter_path=converter_path,
display_path=display_path )
def get_converter_and_display_paths( registration_elem, relative_install_dir ):
"""Find the relative path to data type converters and display applications included in installed tool shed repositories."""
converter_path = None
display_path = None
for elem in registration_elem.findall( 'datatype' ):
if not converter_path:
# If any of the <datatype> tag sets contain <converter> tags, set the converter_path
# if it is not already set. This requires developers to place all converters in the
# same subdirectory within the repository hierarchy.
for converter in elem.findall( 'converter' ):
converter_config = converter.get( 'file', None )
if converter_config:
converter_config_file_name = basic_util.strip_path( converter_config )
for root, dirs, files in os.walk( relative_install_dir ):
if root.find( '.hg' ) < 0:
for name in files:
if name == converter_config_file_name:
# The value of converter_path must be absolute due to job_working_directory.
converter_path = os.path.abspath( root )
break
if converter_path:
break
if not display_path:
# If any of the <datatype> tag sets contain <display> tags, set the display_path
# if it is not already set. This requires developers to place all display acpplications
# in the same subdirectory within the repository hierarchy.
for display_app in elem.findall( 'display' ):
display_config = display_app.get( 'file', None )
if display_config:
display_config_file_name = basic_util.strip_path( display_config )
for root, dirs, files in os.walk( relative_install_dir ):
if root.find( '.hg' ) < 0:
for name in files:
if name == display_config_file_name:
# The value of display_path must be absolute due to job_working_directory.
display_path = os.path.abspath( root )
break
if display_path:
break
if converter_path and display_path:
break
return converter_path, display_path
def load_installed_datatype_converters( app, installed_repository_dict, deactivate=False ):
# Load or deactivate proprietary datatype converters
app.datatypes_registry.load_datatype_converters( app.toolbox, installed_repository_dict=installed_repository_dict, deactivate=deactivate )
def load_installed_datatypes( app, repository, relative_install_dir, deactivate=False ):
# Load proprietary datatypes and return information needed for loading proprietary datatypes converters and display applications later.
metadata = repository.metadata
repository_dict = None
datatypes_config = hg_util.get_config_from_disk( suc.DATATYPES_CONFIG_FILENAME, relative_install_dir )
if datatypes_config:
converter_path, display_path = alter_config_and_load_prorietary_datatypes( app, datatypes_config, relative_install_dir, deactivate=deactivate )
if converter_path or display_path:
# Create a dictionary of tool shed repository related information.
repository_dict = create_repository_dict_for_proprietary_datatypes( tool_shed=repository.tool_shed,
name=repository.name,
owner=repository.owner,
installed_changeset_revision=repository.installed_changeset_revision,
tool_dicts=metadata.get( 'tools', [] ),
converter_path=converter_path,
display_path=display_path )
return repository_dict
def load_installed_display_applications( app, installed_repository_dict, deactivate=False ):
# Load or deactivate proprietary datatype display applications
app.datatypes_registry.load_display_applications( installed_repository_dict=installed_repository_dict, deactivate=deactivate )