Skip to content

Commit

Permalink
BUGFIX: Extracts automatic outputs detection from compositor sources …
Browse files Browse the repository at this point in the history
…into a mixin. Including this by default causes deadlock or infinite recursior in most compositors that use cached properties.
  • Loading branch information
jmilloy committed Apr 10, 2020
1 parent c173880 commit e0d3e56
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 27 deletions.
1 change: 1 addition & 0 deletions doc/source/api.rst
Expand Up @@ -180,6 +180,7 @@ Stitch multiple data sources together
podpac.compositor.OrderedCompositor
podpac.compositor.UniformTileCompositor
podpac.compositor.UniformTileMixin
podpac.compositor.AutoOutputsMixin


Datalib
Expand Down
1 change: 1 addition & 0 deletions podpac/compositor.py
Expand Up @@ -4,5 +4,6 @@

# REMINDER: update api docs (doc/source/user/api.rst) to reflect changes to this file

from podpac.core.compositor.compositor import AutoOutputsMixin
from podpac.core.compositor.ordered_compositor import OrderedCompositor
from podpac.core.compositor.tile_compositor import UniformTileCompositor, UniformTileMixin
50 changes: 27 additions & 23 deletions podpac/core/compositor/compositor.py
Expand Up @@ -85,29 +85,6 @@ def _validate_source_coordinates(self, d):

return d["value"]

@tl.default("outputs")
def _default_outputs(self):
if all(source.outputs is None for source in self.sources):
outputs = None

elif all(source.outputs is not None and source.output is None for source in self.sources):
outputs = []
for source in self.sources:
for output in source.outputs:
if output not in outputs:
outputs.append(output)

if len(outputs) == 0:
outputs = None

else:
raise RuntimeError(
"Compositor sources were not validated correctly. "
"Cannot composite standard sources with multi-output sources."
)

return outputs

def select_sources(self, coordinates):
"""Select and prepare sources based on requested coordinates.
Expand Down Expand Up @@ -254,3 +231,30 @@ def _repr_keys(self):
if self.trait_is_defined("sources"):
keys.append("sources")
return keys


class AutoOutputsMixin(tl.HasTraits):
""" Automatically compute multiple outputs from Compositor sources. """

@tl.default("outputs")
def _default_outputs(self):
if all(source.outputs is None for source in self.sources):
outputs = None

elif all(source.outputs is not None and source.output is None for source in self.sources):
outputs = []
for source in self.sources:
for output in source.outputs:
if output not in outputs:
outputs.append(output)

if len(outputs) == 0:
outputs = None

else:
raise RuntimeError(
"Compositor sources were not validated correctly. "
"Cannot composite standard sources with multi-output sources."
)

return outputs
1 change: 0 additions & 1 deletion podpac/datalib/cosmos_stations.py
Expand Up @@ -135,7 +135,6 @@ def site_properties(self):
class COSMOSStations(podpac.compositor.OrderedCompositor):
url = tl.Unicode("http://cosmos.hwr.arizona.edu/Probes/")
stations_url = tl.Unicode("sitesNoLegend.js")
outputs = None

## PROPERTIES
@cached_property(use_cache_ctrl=True)
Expand Down
3 changes: 0 additions & 3 deletions podpac/datalib/smap.py
Expand Up @@ -634,7 +634,6 @@ class SMAPDateFolder(SMAPSessionMixin, DiskCacheMixin, SMAPCompositor):
folder_date = tl.Unicode("").tag(attr=True)
layer_key = tl.Unicode().tag(attr=True)
latlon_delta = tl.Float(default_value=1.5).tag(attr=True)
outputs = None # this is necessary because of the source caching backup

file_url_re = re.compile(r".*_[0-9]{8}T[0-9]{6}_.*\.h5")
file_url_re2 = re.compile(r".*_[0-9]{8}_.*\.h5")
Expand Down Expand Up @@ -836,8 +835,6 @@ class SMAP(SMAPSessionMixin, DiskCacheMixin, SMAPCompositor):
product = tl.Enum(SMAP_PRODUCT_MAP.coords["product"].data.tolist(), default_value="SPL4SMAU").tag(attr=True)
version = tl.Int(allow_none=True).tag(attr=True)
layer_key = tl.Unicode().tag(attr=True)
outputs = None # this is necessary because of the source caching backup
output = None # might as well

date_url_re = re.compile(r"[0-9]{4}\.[0-9]{2}\.[0-9]{2}")

Expand Down

0 comments on commit e0d3e56

Please sign in to comment.