Source code for envipyarclib.gptoolbox

"""
GPToolbox is used as a base class to create GPTool wrappers for \
ENVI, IDL, and GSF Analytics.
"""

import os.path
from string import Template
import pkgutil

import envipyarclib.gptool.parameter.builder as param_builder
from envipyarclib.gptool.parameter.builder import ParameterMap
import envipyarclib.gptool.help as help_builder


[docs]class GPToolbox(object): """ GPToolbox is used as a base class to create GPTool wrappers for \ ENVI, IDL, and GSF Analytics. :param tasks: a list of tasks to map to GPTools where each task name is a \ GPTool in the toolbox. :param alias: The alias of the generated toolbox :param imports_template: The template string code for defining imports :param execute_template: The template string code for GPTool execution :param parameter_templates: The python package containing parameter templates. \ Templates must implement the envipyarclib.gptool.parameter.Template class. """ _toolbox_class_template = Template(''' class Toolbox(object): def __init__(self): self.label = "$label" self.alias = "$alias" # List of tool classes associated with this toolbox self.tools = $toolList ''') _tool_template = Template(''' class $taskName(object): def __init__(self): self.label = "$taskDisplayName" self.description = "$taskDescription" self.canRunInBackground = $canRunInBackground def getParameterInfo(self): $parameterInfo def isLicensed(self): return True def updateParameters(self, parameters): $updateParameter return def updateMessages(self, parameters): return def execute(self, parameters, messages): $preExecute $execute $postExecute return ''') def __init__(self, tasks=None, alias=None, imports_template=Template(''), execute_template=Template(''), parameter_templates=None): self.tasks = tasks self.toolbox_file = None self.parameter_map = ParameterMap() self.alias = alias self._imports_template = imports_template self._execute_template = execute_template if parameter_templates: for importer, modname, is_pkg in pkgutil.iter_modules(parameter_templates.__path__): self.parameter_map.register_template('.'.join((parameter_templates.__name__, modname)))
[docs] def create_toolbox(self, filename): """ Creates a new Python toolbox where each task name is a GPTool in the toolbox. :param filename: the filename of the generated toolbox :param service_name: The name of the ESE service containing the tasks. Only tasks from one service may be used. :param tasks: The list of tasks from the service to build as GPTools. """ filename = os.path.splitext(filename)[0] label = os.path.basename(filename) # Get task information first so we can build the tool list tool_list = [] for task in self.tasks: tool_list.append(task.name) file_descriptor = os.open(filename + '.pyt', os.O_WRONLY | os.O_CREAT | os.O_EXCL) with os.fdopen(file_descriptor, 'w') as self.toolbox_file: self.toolbox_file.write(self._imports_template.substitute({})) toolbox_class = self._toolbox_class_template.substitute( {'label': label, 'alias': self.alias, 'toolList': param_builder.convert_list(tool_list) } ) self.toolbox_file.write(toolbox_class) for task in self.tasks: gp_tool = self.create_tool(task) self.toolbox_file.write(gp_tool) toolbox_help_filename = '.'.join((filename, task.name, 'pyt', 'xml')) help_builder.create(toolbox_help_filename, task, self.alias) return filename
[docs] def create_tool(self, task): """ Creates a new GPTool for the toolbox. """ gp_tool = dict(taskName=task.name, taskDisplayName=task.display_name, taskDescription=task.description, canRunInBackground=True, taskUri=task.uri) gp_tool['execute'] = self._execute_template.substitute(gp_tool) gp_tool['parameterInfo'] = param_builder.create_param_info(task.parameters, self.parameter_map) gp_tool['updateParameter'] = param_builder.create_update_parameter(task.parameters, self.parameter_map) gp_tool['preExecute'] = param_builder.create_pre_execute(task.parameters, self.parameter_map) gp_tool['postExecute'] = param_builder.create_post_execute(task.parameters, self.parameter_map) return self._tool_template.substitute(gp_tool)
[docs] def import_script(self, script_name): """Finds the script file and copies it into the toolbox""" filename = os.path.abspath(script_name) with open(filename, 'r') as script_file: self.toolbox_file.write(script_file.read())