Skip to content

FigURLCuration() populate issue #1504

@denissemorales

Description

@denissemorales

Describe the bug
I pulled the latest version of spyglass, and I get an error populating the FigURLCuration table (due to non-hashable objects (recording, sorting) being returned in the make_fetch function?)

My spyglass version: '0.5.5a2.dev38+ge345a020a.d20251229'
My datajoint version: 0.14.6

To Reproduce

figurl_curation_id = '9ad44512-f2ac-46d9-8ae2-0b52d7e2a19c'
sgs.FigURLCuration.populate({'figurl_curation_id': figurl_curation_id})
Error Stack
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[13], line 1
----> 1 sgs.FigURLCuration.populate({'figurl_curation_id': figurl_curation_id})

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/spyglass/utils/mixins/populate.py:98, in PopulateMixin.populate(self, *restrictions, **kwargs)
     96 if use_transact:  # Pass single-process populate to super
     97     kwargs["processes"] = processes
---> 98     return super().populate(*restrictions, **kwargs)
     99 else:  # No transaction protection, use bare make
    100     for key in keys:

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/datajoint/autopopulate.py:319, in AutoPopulate.populate(self, keys, suppress_errors, return_exception_objects, reserve_jobs, order, limit, max_calls, display_progress, processes, make_kwargs, *restrictions)
    313 if processes == 1:
    314     for key in (
    315         tqdm(keys, desc=self.__class__.__name__)
    316         if display_progress
    317         else keys
    318     ):
--> 319         status = self._populate1(key, jobs, **populate_kwargs)
    320         if status is True:
    321             success_list.append(1)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/datajoint/autopopulate.py:402, in AutoPopulate._populate1(self, key, jobs, suppress_errors, return_exception_objects, make_kwargs)
    400 gen = make(dict(key), **(make_kwargs or {}))
    401 fetched_data = next(gen)
--> 402 fetch_hash = deepdiff.DeepHash(
    403     fetched_data, ignore_iterable_order=False
    404 )[fetched_data]
    405 computed_result = next(gen)  # perform the computation
    406 # fetch and insert inside a transaction

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:270, in DeepHash.__init__(self, obj, apply_hash, custom_operators, default_timezone, encodings, exclude_obj_callback, exclude_paths, exclude_regex_paths, exclude_types, hasher, hashes, ignore_encoding_errors, ignore_iterable_order, ignore_numeric_type_changes, ignore_private_variables, ignore_repetition, ignore_string_case, ignore_string_type_changes, ignore_type_in_groups, ignore_type_subclasses, ignore_uuid_types, include_paths, number_format_notation, number_to_string_func, parent, significant_digits, truncate_datetime, use_enum_value, **kwargs)
    267 self.ignore_iterable_order = ignore_iterable_order
    268 self.custom_operators = custom_operators
--> 270 self._hash(obj, parent=parent, parents_ids=frozenset({get_id(obj)}))
    272 if self.hashes[UNPROCESSED_KEY]:
    273     logger.warning("Can not hash the following items: {}.".format(self.hashes[UNPROCESSED_KEY]))

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:639, in DeepHash._hash(self, obj, parent, parents_ids)
    636     result, counts = self._prep_iterable(obj=gen(), parent=parent, parents_ids=parents_ids)
    638 elif isinstance(obj, Iterable):
--> 639     result, counts = self._prep_iterable(obj=obj, parent=parent, parents_ids=parents_ids)
    641 elif obj == BoolObj.TRUE or obj == BoolObj.FALSE:
    642     result = 'bool:true' if obj is BoolObj.TRUE else 'bool:false'

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:498, in DeepHash._prep_iterable(self, obj, parent, parents_ids)
    495     continue
    497 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 498 hashed, count = self._hash(item, parent=new_parent, parents_ids=parents_ids_added)
    499 # counting repetitions
    500 result[hashed] += 1

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:646, in DeepHash._hash(self, obj, parent, parents_ids)
    644     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids, is_pydantic_object=True)
    645 else:
--> 646     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids)
    648 if result is not_hashed:  # pragma: no cover
    649     self.hashes[UNPROCESSED_KEY].append(obj)  # type: ignore

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:419, in DeepHash._prep_obj(self, obj, parent, parents_ids, is_namedtuple, is_pydantic_object)
    416     return (unprocessed, 0)
    417 obj = d
--> 419 result, counts = self._prep_dict(obj, parent=parent, parents_ids=parents_ids,
    420                                  print_as_attribute=True, original_type=original_type)
    421 result = "nt{}".format(result) if is_namedtuple else "obj{}".format(result)
    422 return result, counts

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:465, in DeepHash._prep_dict(self, obj, parent, parents_ids, print_as_attribute, original_type)
    463     continue
    464 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 465 hashed, count = self._hash(item, parent=key_in_report, parents_ids=parents_ids_added)
    466 hashed = KEY_TO_VAL_STR.format(key_hash, hashed)
    467 result.append(hashed)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:646, in DeepHash._hash(self, obj, parent, parents_ids)
    644     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids, is_pydantic_object=True)
    645 else:
--> 646     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids)
    648 if result is not_hashed:  # pragma: no cover
    649     self.hashes[UNPROCESSED_KEY].append(obj)  # type: ignore

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:419, in DeepHash._prep_obj(self, obj, parent, parents_ids, is_namedtuple, is_pydantic_object)
    416     return (unprocessed, 0)
    417 obj = d
--> 419 result, counts = self._prep_dict(obj, parent=parent, parents_ids=parents_ids,
    420                                  print_as_attribute=True, original_type=original_type)
    421 result = "nt{}".format(result) if is_namedtuple else "obj{}".format(result)
    422 return result, counts

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:465, in DeepHash._prep_dict(self, obj, parent, parents_ids, print_as_attribute, original_type)
    463     continue
    464 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 465 hashed, count = self._hash(item, parent=key_in_report, parents_ids=parents_ids_added)
    466 hashed = KEY_TO_VAL_STR.format(key_hash, hashed)
    467 result.append(hashed)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:639, in DeepHash._hash(self, obj, parent, parents_ids)
    636     result, counts = self._prep_iterable(obj=gen(), parent=parent, parents_ids=parents_ids)
    638 elif isinstance(obj, Iterable):
--> 639     result, counts = self._prep_iterable(obj=obj, parent=parent, parents_ids=parents_ids)
    641 elif obj == BoolObj.TRUE or obj == BoolObj.FALSE:
    642     result = 'bool:true' if obj is BoolObj.TRUE else 'bool:false'

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:498, in DeepHash._prep_iterable(self, obj, parent, parents_ids)
    495     continue
    497 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 498 hashed, count = self._hash(item, parent=new_parent, parents_ids=parents_ids_added)
    499 # counting repetitions
    500 result[hashed] += 1

    [... skipping similar frames: DeepHash._hash at line 646 (1 times), DeepHash._prep_dict at line 465 (1 times), DeepHash._prep_obj at line 419 (1 times)]

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:639, in DeepHash._hash(self, obj, parent, parents_ids)
    636     result, counts = self._prep_iterable(obj=gen(), parent=parent, parents_ids=parents_ids)
    638 elif isinstance(obj, Iterable):
--> 639     result, counts = self._prep_iterable(obj=obj, parent=parent, parents_ids=parents_ids)
    641 elif obj == BoolObj.TRUE or obj == BoolObj.FALSE:
    642     result = 'bool:true' if obj is BoolObj.TRUE else 'bool:false'

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:498, in DeepHash._prep_iterable(self, obj, parent, parents_ids)
    495     continue
    497 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 498 hashed, count = self._hash(item, parent=new_parent, parents_ids=parents_ids_added)
    499 # counting repetitions
    500 result[hashed] += 1

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:646, in DeepHash._hash(self, obj, parent, parents_ids)
    644     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids, is_pydantic_object=True)
    645 else:
--> 646     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids)
    648 if result is not_hashed:  # pragma: no cover
    649     self.hashes[UNPROCESSED_KEY].append(obj)  # type: ignore

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:419, in DeepHash._prep_obj(self, obj, parent, parents_ids, is_namedtuple, is_pydantic_object)
    416     return (unprocessed, 0)
    417 obj = d
--> 419 result, counts = self._prep_dict(obj, parent=parent, parents_ids=parents_ids,
    420                                  print_as_attribute=True, original_type=original_type)
    421 result = "nt{}".format(result) if is_namedtuple else "obj{}".format(result)
    422 return result, counts

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:465, in DeepHash._prep_dict(self, obj, parent, parents_ids, print_as_attribute, original_type)
    463     continue
    464 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 465 hashed, count = self._hash(item, parent=key_in_report, parents_ids=parents_ids_added)
    466 hashed = KEY_TO_VAL_STR.format(key_hash, hashed)
    467 result.append(hashed)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:620, in DeepHash._hash(self, obj, parent, parents_ids)
    617     result = str(obj.int)
    619 elif isinstance(obj, MutableMapping):
--> 620     result, counts = self._prep_dict(obj=obj, parent=parent, parents_ids=parents_ids)
    622 elif isinstance(obj, tuple):
    623     result, counts = self._prep_tuple(obj=obj, parent=parent, parents_ids=parents_ids)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:465, in DeepHash._prep_dict(self, obj, parent, parents_ids, print_as_attribute, original_type)
    463     continue
    464 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 465 hashed, count = self._hash(item, parent=key_in_report, parents_ids=parents_ids_added)
    466 hashed = KEY_TO_VAL_STR.format(key_hash, hashed)
    467 result.append(hashed)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:646, in DeepHash._hash(self, obj, parent, parents_ids)
    644     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids, is_pydantic_object=True)
    645 else:
--> 646     result, counts = self._prep_obj(obj=obj, parent=parent, parents_ids=parents_ids)
    648 if result is not_hashed:  # pragma: no cover
    649     self.hashes[UNPROCESSED_KEY].append(obj)  # type: ignore

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:419, in DeepHash._prep_obj(self, obj, parent, parents_ids, is_namedtuple, is_pydantic_object)
    416     return (unprocessed, 0)
    417 obj = d
--> 419 result, counts = self._prep_dict(obj, parent=parent, parents_ids=parents_ids,
    420                                  print_as_attribute=True, original_type=original_type)
    421 result = "nt{}".format(result) if is_namedtuple else "obj{}".format(result)
    422 return result, counts

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:465, in DeepHash._prep_dict(self, obj, parent, parents_ids, print_as_attribute, original_type)
    463     continue
    464 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 465 hashed, count = self._hash(item, parent=key_in_report, parents_ids=parents_ids_added)
    466 hashed = KEY_TO_VAL_STR.format(key_hash, hashed)
    467 result.append(hashed)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:639, in DeepHash._hash(self, obj, parent, parents_ids)
    636     result, counts = self._prep_iterable(obj=gen(), parent=parent, parents_ids=parents_ids)
    638 elif isinstance(obj, Iterable):
--> 639     result, counts = self._prep_iterable(obj=obj, parent=parent, parents_ids=parents_ids)
    641 elif obj == BoolObj.TRUE or obj == BoolObj.FALSE:
    642     result = 'bool:true' if obj is BoolObj.TRUE else 'bool:false'

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:498, in DeepHash._prep_iterable(self, obj, parent, parents_ids)
    495     continue
    497 parents_ids_added = add_to_frozen_set(parents_ids, item_id)
--> 498 hashed, count = self._hash(item, parent=new_parent, parents_ids=parents_ids_added)
    499 # counting repetitions
    500 result[hashed] += 1

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/deepdiff/deephash.py:641, in DeepHash._hash(self, obj, parent, parents_ids)
    638 elif isinstance(obj, Iterable):
    639     result, counts = self._prep_iterable(obj=obj, parent=parent, parents_ids=parents_ids)
--> 641 elif obj == BoolObj.TRUE or obj == BoolObj.FALSE:
    642     result = 'bool:true' if obj is BoolObj.TRUE else 'bool:false'
    643 elif isinstance(obj, PydanticBaseModel):

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/hdmf/utils.py:591, in docval.<locals>.dec.<locals>.func_call(*args, **kwargs)
    590 def func_call(*args, **kwargs):
--> 591     pargs = _check_args(args, kwargs)
    592     return func(args[0], **pargs)

File ~/miniforge3/envs/spyglass_1/lib/python3.10/site-packages/hdmf/utils.py:584, in docval.<locals>.dec.<locals>._check_args(args, kwargs)
    582     if parse_err:
    583         msg = '%s: %s' % (func.__qualname__, ', '.join(parse_err))
--> 584         raise ExceptionType(msg)
    586 return parsed['args']

TypeError: ElementIdentifiers.__eq__: incorrect type for 'other' (got 'BoolObj', expected 'Data, ndarray, list, tuple or int')

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions