Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New api, to easily use VisTrails in other applications #24

Merged
merged 45 commits into from
Mar 18, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
5ef5d5e
API stub
remram44 Aug 1, 2014
9e7e9b8
Adds loadPackages configuration option
remram44 Aug 1, 2014
083d8fb
More work on the API
remram44 Aug 1, 2014
09e8190
WIP
remram44 Aug 2, 2014
527da8c
Merge branch 'master' into 'new-api'
remram44 Aug 4, 2014
0fa9286
Fixes
remram44 Aug 4, 2014
fa5ecc7
Changes set_current_pipeline() -> select_version()
remram44 Aug 4, 2014
12e9458
Adds __repr__ to Vistrail and Pipeline
remram44 Aug 5, 2014
f327658
Implements Package and load_package()
remram44 Aug 5, 2014
93efdbd
Enables pkg['namespace|module'] syntax
remram44 Aug 5, 2014
8821447
Begins work on Module
remram44 Aug 5, 2014
15eb54c
Fixes an issue with pkg['ns|mod'] syntax
remram44 Aug 5, 2014
2251dfb
Renames debug's logger VisLog -> vistrails
remram44 Aug 5, 2014
a574529
Merge branch 'logger-propagation' into new-api
remram44 Aug 6, 2014
5ad3f5a
Makes NoSuchVersion inherit KeyError
remram44 Aug 7, 2014
ea9bcbd
Implements getting a module from its description
remram44 Aug 7, 2014
24078b8
Adds Pipeline#inputs and outputs properties
remram44 Aug 8, 2014
7f99bae
Adds inputs and outputs to Pipeline's repr
remram44 Aug 8, 2014
6d55953
Makes load_package() works on loaded packages
remram44 Aug 8, 2014
c2591cd
Implements Pipeline#modules property
remram44 Aug 8, 2014
20b117f
Adds __desc__ and pkg identifier to module repr
remram44 Aug 8, 2014
6ec438e
Factors get_inputoutput_name()
remram44 Aug 8, 2014
3f933e9
Starts work on execute()
remram44 Aug 8, 2014
85d73b3
Implements ExecutionResults and ExecutionErrors
remram44 Aug 8, 2014
4f976c0
Merge branch 'logger-propagation' into 'new-api'
remram44 Aug 27, 2014
18c2090
Merge branch 'master' into 'new-api'
remram44 Sep 29, 2014
2e0af0a
Merge branch 'master' into 'new-api'
remram44 Oct 13, 2014
0dc010b
Fixes building a Vistrail from a pipeline
remram44 Oct 13, 2014
0a3f6b3
Don't associate Module's with Vistrail's anymore
remram44 Oct 13, 2014
2193caa
Fixes Pipeline#execute()
remram44 Oct 13, 2014
8fdb086
Adds (meta)class ModuleClass (wraps a descriptor)
remram44 Oct 15, 2014
1680abb
Fixes warnings in ModuleClass metaclass
remram44 Oct 15, 2014
a815eda
Implements setting inputs (except tuples)
remram44 Oct 15, 2014
44799f0
Fixes Vistrail#select_version() with tag name
remram44 Feb 13, 2015
e7d1056
Adds IPython rich display for image files
remram44 Feb 13, 2015
d093c93
Renders Vistrail as SVG version tree
remram44 Feb 16, 2015
ab0d81c
Renders pipeline as SVG
remram44 Feb 17, 2015
cf97764
Use new HTML nodes for pipeline
remram44 Feb 17, 2015
bc3d8c2
Highlights current version in SVG tree
remram44 Feb 17, 2015
fdb1951
Adds IPythonMode
remram44 Mar 10, 2015
b0c8d6a
Adds MplIPythonMode
remram44 Mar 10, 2015
6dd87af
Merge branch 'master' into 'new-api'
remram44 Mar 11, 2015
197bcee
Adds IPythonHtmlMode for RichTextOutput
remram44 Mar 11, 2015
1c29b86
Adds TableToIPythonMode
remram44 Mar 17, 2015
5a218a3
Adds vtkRendererToIPythonMode
remram44 Mar 18, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions vistrails/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,6 @@
sys.stderr.write("WARNING: Your unittest is missing 2.7 features. Please "
"upgrade Python or\ninstall unittest2, else VisTrails "
"might fail because of missing symbols.\n")


from vistrails.core.api import *
1,400 changes: 863 additions & 537 deletions vistrails/core/api.py

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions vistrails/core/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
jobCheckInterval: How often to check for jobs (in seconds)
jobList: List running workflows
jobInfo: List jobs in running workflow
loadPackages: Whether to load the packages enabled in the configuration file
logDir: Log files directory
maxRecentVistrails: Number of recent vistrails
maximizeWindows: VisTrails windows should be maximized
Expand Down Expand Up @@ -251,6 +252,10 @@

List jobs in running workflow

loadPackages: Boolean

Whether to load the packages enabled in the configuration file

logDir: Path

The path that indicates where log files should be stored.
Expand Down Expand Up @@ -702,6 +707,7 @@ def __init__(self, name, sub_fields):
ConfigField('cacheSize', 20, int, widget_type='thumbnailcache')])],
"Packages":
[ConfigField('enablePackagesSilently', False, bool, ConfigType.ON_OFF),
ConfigField('loadPackages', True, bool, ConfigType.ON_OFF),
ConfigField('installBundles', True, bool, ConfigType.ON_OFF),
ConfigField('installBundlesWithPip', False, bool, ConfigType.ON_OFF,
depends_on="installBundles"),
Expand Down
22 changes: 22 additions & 0 deletions vistrails/core/modules/basic_modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
from abc import ABCMeta
from ast import literal_eval
from itertools import izip
import mimetypes
import os
import pickle
import re
Expand Down Expand Up @@ -332,14 +333,35 @@ def query_compute(value_a, value_b, query_method):

##############################################################################

# Rich display for IPython
try:
from IPython import display
except ImportError:
display = None

class PathObject(object):
def __init__(self, name):
self.name = name
self._ipython_repr = None

def __repr__(self):
return "PathObject(%r)" % self.name
__str__ = __repr__

def __getattr__(self, name):
if name.startswith('_repr_') and name.endswith('_'):
if self._ipython_repr is None:
filetype, encoding = mimetypes.guess_type(self.name)
if not filetype:
self._ipython_repr = False
elif filetype.startswith('image/'):
self._ipython_repr = display.Image(filename=self.name)
else:
self._ipython_repr = False
elif self._ipython_repr is not False:
return getattr(self._ipython_repr, name)
raise AttributeError

class Path(Constant):
_settings = ModuleSettings(constant_widget=("%s:PathChooserWidget" % \
constant_config_path))
Expand Down
37 changes: 36 additions & 1 deletion vistrails/core/modules/output_modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -504,10 +504,45 @@ class ImageFileMode(FileMode):
config_cls = ImageFileModeConfig
mode_type = "imageFile"

class IPythonModeConfig(OutputModeConfig):
mode_type = "ipython"
_fields = []

class IPythonMode(OutputMode):
mode_type = "ipython"
priority = 2
config_cls = IPythonModeConfig

@staticmethod
def can_compute():
try:
import __main__ as main
if hasattr(main, '__file__'):
return False
import IPython.core.display
return True
except ImportError:
return False

def compute_output(self, output_module, configuration=None):
from IPython.core.display import display

value = output_module.get_input('value')
display(value)

class IPythonHtmlMode(IPythonMode):
mode_type = "ipython"

def compute_output(self, output_module, configuration=None):
from IPython.core.display import display, HTML

value = output_module.get_input('value')
display(HTML(filename=value.name))

class RichTextOutput(OutputModule):
_settings = ModuleSettings(configure_widget="vistrails.gui.modules.output_configuration:OutputModuleConfigurationWidget")
_input_ports = [('value', 'File')]
_output_modes = [FileToFileMode]
_output_modes = [FileToFileMode, IPythonHtmlMode]

_modules = [OutputModule, GenericOutput, FileOutput, RichTextOutput]

Expand Down
30 changes: 22 additions & 8 deletions vistrails/core/packagemanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,14 @@
import warnings

from vistrails.core import debug, get_vistrails_application, system
from vistrails.core.configuration import ConfigurationObject
from vistrails.core.configuration import ConfigurationObject, \
get_vistrails_configuration
import vistrails.core.data_structures.graph
import vistrails.core.db.io
from vistrails.core.modules.module_registry import ModuleRegistry, \
MissingPackage, MissingPackageVersion
from vistrails.core.modules.module_registry import MissingPackage, \
MissingPackageVersion
from vistrails.core.modules.package import Package
from vistrails.core.requirements import MissingRequirement
from vistrails.core.utils import VistrailsInternalError, InstanceObject, \
from vistrails.core.utils import VistrailsInternalError, \
versions_increasing, VistrailsDeprecation
import vistrails.packages

Expand Down Expand Up @@ -124,7 +124,6 @@ def import_user_packages_module(self):
if self._userpackages is not None:
return self._userpackages
# Imports user packages directory
conf = self._startup.temp_configuration
old_sys_path = copy.copy(sys.path)
userPackageDir = system.get_vistrails_directory('userPackageDir')
if userPackageDir is not None:
Expand Down Expand Up @@ -183,8 +182,23 @@ def __init__(self, registry, startup):
# Compute the list of available packages, _available_packages
self.build_available_package_names_list()

for pkg in self._startup.enabled_packages.itervalues():
self.add_package(pkg.name, prefix=pkg.prefix)
if get_vistrails_configuration().loadPackages:
for pkg in self._startup.enabled_packages.itervalues():
self.add_package(pkg.name, prefix=pkg.prefix)
else:
try:
basic_pkg = self._startup.enabled_packages['basic_modules']
except KeyError:
pass
else:
self.add_package(basic_pkg.name, prefix=basic_pkg.prefix)

try:
abs_pkg = self._startup.enabled_packages['abstraction']
except KeyError:
pass
else:
self.add_package(abs_pkg.name, prefix=abs_pkg.prefix)

def _import_override(self,
name, globals={}, locals={}, fromlist=[], level=-1):
Expand Down
28 changes: 19 additions & 9 deletions vistrails/core/vistrail/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2605,10 +2605,10 @@ def execute_workflow_list(self, vistrails):
extra_info = {}
extra_info['pathDumpCells'] = create_temp_folder(prefix='vt_thumb')
temp_folder_used = True
#

kwargs = {'locator': locator,
'current_version': version,
'view': view,
'view': view if view is not None else DummyView(),
'logger': self.get_logger(),
'controller': self,
'aliases': aliases,
Expand Down Expand Up @@ -2706,12 +2706,11 @@ def execute_current_workflow(self, custom_aliases=None, custom_params=None,
locator.clean_temporaries()
if self._auto_save:
locator.save_temporary(self.vistrail)
view = DummyView()
try:
return self.execute_workflow_list([(self.locator,
self.current_version,
self.current_pipeline,
view,
None,
custom_aliases,
custom_params,
reason,
Expand Down Expand Up @@ -2790,7 +2789,7 @@ def recompute_terse_graph(self):
self._current_terse_graph = tersedVersionTree
self._current_full_graph = self.vistrail.tree.getVersionTree()

def save_version_graph(self, filename, tersed=True):
def save_version_graph(self, filename, tersed=True, highlight=None):
if tersed:
graph = copy.copy(self._current_terse_graph)
else:
Expand All @@ -2806,7 +2805,13 @@ def save_version_graph(self, filename, tersed=True):
configuration = get_vistrails_configuration()
use_custom_colors = configuration.check('enableCustomVersionColors')

with open(filename, 'wb') as fp:
if isinstance(filename, basestring):
fp = open(filename, 'wb')
cleanup = lambda: fp.close()
else:
fp = filename
cleanup = lambda: None
try:
fp.write('digraph G {\n')
for v in vs:
descr = tm.get(v, None) or self.vistrail.get_description(v)
Expand All @@ -2821,15 +2826,20 @@ def save_version_graph(self, filename, tersed=True):
'%02x' % c
for c in parse_custom_color(color.value))
fp.write(' %s [label=%s, '
'style=filled, fillcolor="%s"];\n' % (
v, dot_escape(descr), color))
'style=filled, fillcolor="%s", color="%s"];\n' % (
v, dot_escape(descr), color,
'red' if v == highlight else 'black'))
else:
fp.write(' %s [label=%s];\n' % (v, dot_escape(descr)))
fp.write(' %s [label=%s, color="%s"];\n' % (
v, dot_escape(descr),
'red' if v == highlight else 'black'))
fp.write('\n')
for s in al:
vfrom, vto, vdata = s
fp.write(' %s -> %s;\n' % (vfrom, vto))
fp.write('}\n')
finally:
cleanup()

def get_latest_version_in_graph(self):
if not self._current_terse_graph:
Expand Down
31 changes: 24 additions & 7 deletions vistrails/packages/matplotlib/bases.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,16 @@

from __future__ import division

import itertools
import matplotlib
from matplotlib.backend_bases import FigureCanvasBase
import pylab
import urllib

from matplotlib.backend_bases import FigureCanvasBase

from vistrails.core.configuration import ConfigField
from vistrails.core.modules.basic_modules import CodeRunnerMixin
from vistrails.core.modules.config import ModuleSettings, IPort
from vistrails.core.modules.output_modules import ImageFileMode, \
ImageFileModeConfig, OutputModule
ImageFileModeConfig, OutputModule, IPythonModeConfig, IPythonMode
from vistrails.core.modules.vistrails_module import Module, NotCacheable

################################################################################
Expand Down Expand Up @@ -146,18 +144,37 @@ def compute_output(self, output_module, configuration=None):
figure.set_size_inches(previous_size[0],previous_size[1])
canvas.draw()

class MplIPythonModeConfig(IPythonModeConfig):
mode_type = "ipython"
_fields = [ConfigField('width', None, int),
ConfigField('height', None, int)]

class MplIPythonMode(IPythonMode):
mode_type = "ipython"
priority = 2
config_cls = MplIPythonModeConfig

def compute_output(self, output_module, configuration=None):
from IPython.display import set_matplotlib_formats
from IPython.core.display import display

set_matplotlib_formats('png')

# TODO: use size from configuration
fig = output_module.get_input('value')
display(fig.figInstance)

class MplFigureOutput(OutputModule):
_settings = ModuleSettings(configure_widget="vistrails.gui.modules.output_configuration:OutputModuleConfigurationWidget")
_input_ports = [('value', 'MplFigure')]
_output_modes = [MplFigureToFile]
_output_modes = [MplFigureToFile, MplIPythonMode]

_modules = [(MplProperties, {'abstract': True}),
(MplPlot, {'abstract': True}),
(MplPlot, {'abstract': True}),
(MplSource, {'configureWidgetType': \
('vistrails.packages.matplotlib.widgets',
'MplSourceConfigurationWidget')}),
MplFigure,
MplContourSet,
MplQuadContourSet,
MplFigureOutput]

22 changes: 17 additions & 5 deletions vistrails/packages/tabledata/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@

from vistrails.core.modules.basic_modules import List, ListType
from vistrails.core.modules.config import ModuleSettings
from vistrails.core.modules.output_modules import OutputModule, FileMode
from vistrails.core.modules.output_modules import OutputModule, FileMode, \
IPythonMode
from vistrails.core.modules.vistrails_module import Module, ModuleError, \
Converter

Expand Down Expand Up @@ -279,9 +280,7 @@ def compute(self):
['converted_list'])) # names


class TableToFileMode(FileMode):
formats = ['html', 'csv']

class HtmlRendererMixin(object):
@staticmethod
def make_html(table):
document = ['<!DOCTYPE html>\n'
Expand Down Expand Up @@ -316,6 +315,10 @@ def make_html(table):

return ''.join(document)


class TableToFileMode(FileMode, HtmlRendererMixin):
formats = ['html', 'csv']

def write_html(self, table, configuration):
filename = self.get_filename(configuration, suffix='.html')
with open(filename, 'wb') as fp:
Expand All @@ -338,10 +341,19 @@ def compute_output(self, output_module, configuration=None):
func(value, configuration)


class TableToIPythonMode(IPythonMode, HtmlRendererMixin):
def compute_output(self, output_module, configuration=None):
from IPython.core.display import display, HTML

table = output_module.get_input('value')
html = self.make_html(table)
display(HTML(data=html))


class TableOutput(OutputModule):
_settings = ModuleSettings(configure_widget="vistrails.gui.modules.output_configuration:OutputModuleConfigurationWidget")
_input_ports = [('value', 'Table')]
_output_modes = [TableToFileMode]
_output_modes = [TableToFileMode, TableToIPythonMode]


_modules = [(Table, {'abstract': True}), ExtractColumn, BuildTable,
Expand Down