eegdash 0.3.5.dev183002612__tar.gz → 0.3.6.dev182011805__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of eegdash might be problematic. Click here for more details.

Files changed (57) hide show
  1. {eegdash-0.3.5.dev183002612/eegdash.egg-info → eegdash-0.3.6.dev182011805}/PKG-INFO +1 -1
  2. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/__init__.py +1 -1
  3. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/api.py +137 -31
  4. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/dataset.py +3 -1
  5. eegdash-0.3.6.dev182011805/eegdash/dataset_summary.csv +256 -0
  6. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805/eegdash.egg-info}/PKG-INFO +1 -1
  7. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash.egg-info/SOURCES.txt +1 -0
  8. eegdash-0.3.6.dev182011805/tests/test_challenge_kwargs.py +52 -0
  9. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_init.py +1 -1
  10. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_minirelease.py +3 -1
  11. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_query.py +58 -0
  12. eegdash-0.3.5.dev183002612/eegdash/dataset_summary.csv +0 -255
  13. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/LICENSE +0 -0
  14. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/MANIFEST.in +0 -0
  15. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/README.md +0 -0
  16. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/Makefile +0 -0
  17. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/source/conf.py +0 -0
  18. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/source/dataset_summary.rst +0 -0
  19. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/source/index.rst +0 -0
  20. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/source/install/install.rst +0 -0
  21. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/source/install/install_pip.rst +0 -0
  22. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/source/install/install_source.rst +0 -0
  23. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/docs/source/overview.rst +0 -0
  24. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/data_config.py +0 -0
  25. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/data_utils.py +0 -0
  26. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/__init__.py +0 -0
  27. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/datasets.py +0 -0
  28. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/decorators.py +0 -0
  29. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/extractors.py +0 -0
  30. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/__init__.py +0 -0
  31. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/complexity.py +0 -0
  32. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/connectivity.py +0 -0
  33. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/csp.py +0 -0
  34. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/dimensionality.py +0 -0
  35. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/signal.py +0 -0
  36. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/spectral.py +0 -0
  37. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/feature_bank/utils.py +0 -0
  38. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/inspect.py +0 -0
  39. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/serialization.py +0 -0
  40. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/features/utils.py +0 -0
  41. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/mongodb.py +0 -0
  42. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/preprocessing.py +0 -0
  43. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/registry.py +0 -0
  44. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash/utils.py +0 -0
  45. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash.egg-info/dependency_links.txt +0 -0
  46. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash.egg-info/requires.txt +0 -0
  47. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/eegdash.egg-info/top_level.txt +0 -0
  48. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/pyproject.toml +0 -0
  49. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/setup.cfg +0 -0
  50. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_api.py +0 -0
  51. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_correctness.py +0 -0
  52. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_dataset.py +0 -0
  53. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_dataset_registration.py +0 -0
  54. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_eegdash.py +0 -0
  55. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_functional.py +0 -0
  56. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_mongo_connection.py +0 -0
  57. {eegdash-0.3.5.dev183002612 → eegdash-0.3.6.dev182011805}/tests/test_offline.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eegdash
3
- Version: 0.3.5.dev183002612
3
+ Version: 0.3.6.dev182011805
4
4
  Summary: EEG data for machine learning
5
5
  Author-email: Young Truong <dt.young112@gmail.com>, Arnaud Delorme <adelorme@gmail.com>, Aviv Dotan <avivd220@gmail.com>, Oren Shriki <oren70@gmail.com>, Bruno Aristimunha <b.aristimunha@gmail.com>
6
6
  License-Expression: GPL-3.0-only
@@ -7,4 +7,4 @@ __init__mongo_client()
7
7
 
8
8
  __all__ = ["EEGDash", "EEGDashDataset", "EEGChallengeDataset"]
9
9
 
10
- __version__ = "0.3.5.dev183002612"
10
+ __version__ = "0.3.6.dev182011805"
@@ -90,12 +90,16 @@ class EEGDash:
90
90
  ) -> list[Mapping[str, Any]]:
91
91
  """Find records in the MongoDB collection.
92
92
 
93
- This method can be called in two ways:
93
+ This method supports four usage patterns:
94
94
  1. With a pre-built MongoDB query dictionary (positional argument):
95
95
  >>> eegdash.find({"dataset": "ds002718", "subject": {"$in": ["012", "013"]}})
96
96
  2. With user-friendly keyword arguments for simple and multi-value queries:
97
97
  >>> eegdash.find(dataset="ds002718", subject="012")
98
98
  >>> eegdash.find(dataset="ds002718", subject=["012", "013"])
99
+ 3. With an explicit empty query to return all documents:
100
+ >>> eegdash.find({}) # fetches all records (use with care)
101
+ 4. By combining a raw query with kwargs (merged via logical AND):
102
+ >>> eegdash.find({"dataset": "ds002718"}, subject=["012", "013"]) # yields {"$and":[{"dataset":"ds002718"}, {"subject":{"$in":["012","013"]}}]}
99
103
 
100
104
  Parameters
101
105
  ----------
@@ -110,26 +114,34 @@ class EEGDash:
110
114
  list:
111
115
  A list of DB records (string-keyed dictionaries) that match the query.
112
116
 
113
- Raises
114
- ------
115
- ValueError
116
- If both a `query` dictionary and keyword arguments are provided.
117
-
118
117
  """
119
- if query is not None and kwargs:
120
- raise ValueError(
121
- "Provide either a positional 'query' dictionary or keyword arguments, not both."
122
- )
123
-
124
- final_query = {}
125
- if query is not None:
126
- final_query = query
127
- elif kwargs:
128
- final_query = self._build_query_from_kwargs(**kwargs)
118
+ final_query: dict[str, Any] | None = None
119
+
120
+ # Accept explicit empty dict {} to mean "match all"
121
+ raw_query = query if isinstance(query, dict) else None
122
+ kwargs_query = self._build_query_from_kwargs(**kwargs) if kwargs else None
123
+
124
+ # Determine presence, treating {} as a valid raw query
125
+ has_raw = isinstance(raw_query, dict)
126
+ has_kwargs = kwargs_query is not None
127
+
128
+ if has_raw and has_kwargs:
129
+ # Detect conflicting constraints on the same field (e.g., task specified
130
+ # differently in both places) and raise a clear error instead of silently
131
+ # producing an empty result.
132
+ self._raise_if_conflicting_constraints(raw_query, kwargs_query)
133
+ # Merge with logical AND so both constraints apply
134
+ if raw_query: # non-empty dict adds constraints
135
+ final_query = {"$and": [raw_query, kwargs_query]}
136
+ else: # {} adds nothing; use kwargs_query only
137
+ final_query = kwargs_query
138
+ elif has_raw:
139
+ # May be {} meaning match-all, or a non-empty dict
140
+ final_query = raw_query
141
+ elif has_kwargs:
142
+ final_query = kwargs_query
129
143
  else:
130
- # By default, an empty query {} returns all documents.
131
- # This can be dangerous, so we can either allow it or raise an error.
132
- # Let's require an explicit query for safety.
144
+ # Avoid accidental full scans
133
145
  raise ValueError(
134
146
  "find() requires a query dictionary or at least one keyword argument. "
135
147
  "To find all documents, use find({})."
@@ -224,9 +236,12 @@ class EEGDash:
224
236
  return record
225
237
 
226
238
  def _build_query_from_kwargs(self, **kwargs) -> dict[str, Any]:
227
- """Builds and validates a MongoDB query from user-friendly keyword arguments.
239
+ """Build and validate a MongoDB query from user-friendly keyword arguments.
228
240
 
229
- Translates list values into MongoDB's `$in` operator.
241
+ Improvements:
242
+ - Reject None values and empty/whitespace-only strings
243
+ - For list/tuple/set values: strip strings, drop None/empties, deduplicate, and use `$in`
244
+ - Preserve scalars as exact matches
230
245
  """
231
246
  # 1. Validate that all provided keys are allowed for querying
232
247
  unknown_fields = set(kwargs.keys()) - self._ALLOWED_QUERY_FIELDS
@@ -239,19 +254,108 @@ class EEGDash:
239
254
  # 2. Construct the query dictionary
240
255
  query = {}
241
256
  for key, value in kwargs.items():
242
- if isinstance(value, (list, tuple)):
243
- if not value:
257
+ # None is not a valid constraint
258
+ if value is None:
259
+ raise ValueError(
260
+ f"Received None for query parameter '{key}'. Provide a concrete value."
261
+ )
262
+
263
+ # Handle list-like values as multi-constraints
264
+ if isinstance(value, (list, tuple, set)):
265
+ cleaned: list[Any] = []
266
+ for item in value:
267
+ if item is None:
268
+ continue
269
+ if isinstance(item, str):
270
+ item = item.strip()
271
+ if not item:
272
+ continue
273
+ cleaned.append(item)
274
+ # Deduplicate while preserving order
275
+ cleaned = list(dict.fromkeys(cleaned))
276
+ if not cleaned:
244
277
  raise ValueError(
245
278
  f"Received an empty list for query parameter '{key}'. This is not supported."
246
279
  )
247
- # If the value is a list, use the `$in` operator for multi-search
248
- query[key] = {"$in": value}
280
+ query[key] = {"$in": cleaned}
249
281
  else:
250
- # Otherwise, it's a direct match
282
+ # Scalars: trim strings and validate
283
+ if isinstance(value, str):
284
+ value = value.strip()
285
+ if not value:
286
+ raise ValueError(
287
+ f"Received an empty string for query parameter '{key}'."
288
+ )
251
289
  query[key] = value
252
290
 
253
291
  return query
254
292
 
293
+ # --- Query merging and conflict detection helpers ---
294
+ def _extract_simple_constraint(self, query: dict[str, Any], key: str):
295
+ """Extract a simple constraint for a given key from a query dict.
296
+
297
+ Supports only top-level equality (key: value) and $in (key: {"$in": [...]})
298
+ constraints. Returns a tuple (kind, value) where kind is "eq" or "in". If the
299
+ key is not present or uses other operators, returns None.
300
+ """
301
+ if not isinstance(query, dict) or key not in query:
302
+ return None
303
+ val = query[key]
304
+ if isinstance(val, dict):
305
+ if "$in" in val and isinstance(val["$in"], (list, tuple)):
306
+ return ("in", list(val["$in"]))
307
+ return None # unsupported operator shape for conflict checking
308
+ else:
309
+ return ("eq", val)
310
+
311
+ def _raise_if_conflicting_constraints(
312
+ self, raw_query: dict[str, Any], kwargs_query: dict[str, Any]
313
+ ) -> None:
314
+ """Raise ValueError if both query sources define incompatible constraints.
315
+
316
+ We conservatively check only top-level fields with simple equality or $in
317
+ constraints. If a field appears in both queries and constraints are mutually
318
+ exclusive, raise an explicit error to avoid silent empty result sets.
319
+ """
320
+ if not raw_query or not kwargs_query:
321
+ return
322
+
323
+ # Only consider fields we generally allow; skip meta operators like $and
324
+ raw_keys = set(raw_query.keys()) & self._ALLOWED_QUERY_FIELDS
325
+ kw_keys = set(kwargs_query.keys()) & self._ALLOWED_QUERY_FIELDS
326
+ dup_keys = raw_keys & kw_keys
327
+ for key in dup_keys:
328
+ rc = self._extract_simple_constraint(raw_query, key)
329
+ kc = self._extract_simple_constraint(kwargs_query, key)
330
+ if rc is None or kc is None:
331
+ # If either side is non-simple, skip conflict detection for this key
332
+ continue
333
+
334
+ r_kind, r_val = rc
335
+ k_kind, k_val = kc
336
+
337
+ # Normalize to sets when appropriate for simpler checks
338
+ if r_kind == "eq" and k_kind == "eq":
339
+ if r_val != k_val:
340
+ raise ValueError(
341
+ f"Conflicting constraints for '{key}': query={r_val!r} vs kwargs={k_val!r}"
342
+ )
343
+ elif r_kind == "in" and k_kind == "eq":
344
+ if k_val not in r_val:
345
+ raise ValueError(
346
+ f"Conflicting constraints for '{key}': query in {r_val!r} vs kwargs={k_val!r}"
347
+ )
348
+ elif r_kind == "eq" and k_kind == "in":
349
+ if r_val not in k_val:
350
+ raise ValueError(
351
+ f"Conflicting constraints for '{key}': query={r_val!r} vs kwargs in {k_val!r}"
352
+ )
353
+ elif r_kind == "in" and k_kind == "in":
354
+ if len(set(r_val).intersection(k_val)) == 0:
355
+ raise ValueError(
356
+ f"Conflicting constraints for '{key}': disjoint sets {r_val!r} and {k_val!r}"
357
+ )
358
+
255
359
  def load_eeg_data_from_s3(self, s3path: str) -> xr.DataArray:
256
360
  """Load an EEGLAB .set file from an AWS S3 URI and return it as an xarray DataArray.
257
361
 
@@ -676,10 +780,8 @@ class EEGDashDataset(BaseConcatDataset):
676
780
  # If list is provided, let _build_query_from_kwargs turn it into $in later.
677
781
  query_kwargs.setdefault("dataset", dataset)
678
782
 
679
- if query and query_kwargs:
680
- raise ValueError(
681
- "Provide either a 'query' dictionary or keyword arguments for filtering, not both."
682
- )
783
+ # Allow mixing raw DB query with additional keyword filters. Both will be
784
+ # merged by EEGDash.find() (logical AND), so we do not raise here.
683
785
 
684
786
  try:
685
787
  if records is not None:
@@ -723,7 +825,7 @@ class EEGDashDataset(BaseConcatDataset):
723
825
  **base_dataset_kwargs,
724
826
  )
725
827
  )
726
- elif query or query_kwargs:
828
+ elif query is not None or query_kwargs:
727
829
  # This is the DB query path that we are improving
728
830
  datasets = self.find_datasets(
729
831
  query=query,
@@ -786,6 +888,10 @@ class EEGDashDataset(BaseConcatDataset):
786
888
  """
787
889
  datasets: list[EEGDashBaseDataset] = []
788
890
 
891
+ # Build records using either a raw query OR keyword filters, but not both.
892
+ # Note: callers may accidentally pass an empty dict for `query` along with
893
+ # kwargs. In that case, treat it as if no query was provided and rely on kwargs.
894
+ # Always delegate merging of raw query + kwargs to EEGDash.find
789
895
  self.records = self.eeg_dash.find(query, **query_kwargs)
790
896
 
791
897
  for record in self.records:
@@ -321,7 +321,9 @@ class EEGChallengeDataset(EEGDashDataset):
321
321
  )
322
322
 
323
323
  if self.mini:
324
- if query and "subject" in query:
324
+ # Disallow mixing subject selection with mini=True since mini already
325
+ # applies a predefined subject subset.
326
+ if (query and "subject" in query) or ("subject" in kwargs):
325
327
  raise ValueError(
326
328
  "Query using the parameters `subject` with the class EEGChallengeDataset and `mini==True` is not possible."
327
329
  "Please don't use the `subject` selection twice."
@@ -0,0 +1,256 @@
1
+ dataset,n_records,n_subjects,n_tasks,nchans_set,sampling_freqs,duration_hours_total,size,size_bytes,s3_item_count
2
+ ds002718,18,18,1,74,250,14.844,4.31 GB,4624315408,0
3
+ ds005505,1342,136,10,129,500,125.366,103.11 GB,110708824369,0
4
+ ds004745,6,6,1,,1000,0.0,242.08 MB,253839725,0
5
+ ds005514,2885,295,10,129,500,213.008,185.03 GB,198677728665,0
6
+ ds005512,2320,257,10,129,500,196.205,157.19 GB,168778507427,0
7
+ ds005510,1227,135,10,129,500,112.464,90.80 GB,97492961757,0
8
+ ds005511,3100,381,10,"6,129",500,285.629,244.83 GB,262883881898,0
9
+ ds005509,3326,330,10,129,500,274.559,224.17 GB,240701124393,0
10
+ ds005508,3342,324,10,129,500,269.281,229.81 GB,246753736933,0
11
+ ds005507,1812,184,10,129,500,168.649,139.37 GB,149646718160,0
12
+ ds005506,1405,150,10,129,500,127.896,111.88 GB,120126449650,0
13
+ test,2,1,1,64,500,20.556,0 B,0,0
14
+ ds004854,1,1,1,64,128,0.535,79.21 MB,83057080,0
15
+ ds004853,1,1,1,64,128,0.535,79.21 MB,83057080,0
16
+ ds004844,68,17,1,64,1024,21.252,22.33 GB,23976121966,0
17
+ ds004843,92,14,1,64,256,29.834,7.66 GB,8229205795,0
18
+ ds004842,102,14,1,64,256,20.102,5.21 GB,5589054270,0
19
+ ds004852,1,1,1,64,128,0.535,79.21 MB,83057106,0
20
+ ds004851,1,1,1,64,128,0.535,56.59 GB,60765064414,0
21
+ ds004850,1,1,1,64,128,0.535,79.21 MB,83057078,0
22
+ ds004855,1,1,1,64,128,0.535,79.21 MB,83057076,0
23
+ ds004849,1,1,1,64,128,0.535,79.21 MB,83057084,0
24
+ ds004841,147,20,1,64,256,29.054,7.31 GB,7846934401,0
25
+ ds004661,17,17,1,64,128,10.137,1.40 GB,1505577392,0
26
+ ds004660,42,21,1,32,"2048,512",23.962,7.25 GB,7782408710,0
27
+ ds004657,119,24,1,64,"1024,8192",27.205,43.06 GB,46237302701,0
28
+ ds004362,1526,109,1,64,"128,160",48.592,11.14 GB,11961862159,0
29
+ ds004010,24,24,1,64,1000,26.457,23.14 GB,24844863976,0
30
+ ds002181,226,226,1,125,500,7.676,150.89 MB,158222084,0
31
+ ds004554,16,16,1,99,1000,0.024,8.79 GB,9432865762,0
32
+ ds005697,50,50,1,"65,69",1000,77.689,66.58 GB,71486411402,0
33
+ ds004350,240,24,5,64,256,41.265,26.83 GB,28810754598,0
34
+ ds004785,17,17,1,32,500,0.019,351.17 MB,368224136,0
35
+ ds004504,88,88,1,19,500,19.608,5.38 GB,5780997160,0
36
+ ds004635,55,55,1,129,1000,20.068,30.56 GB,32817659781,0
37
+ ds005787,448,19,1,"64,66","1000,500",23.733,27.09 GB,29087512003,0
38
+ ds005079,60,1,15,65,500,3.25,1.68 GB,1809231997,0
39
+ ds005342,32,32,1,17,250,33.017,2.03 GB,2181610593,0
40
+ ds005034,100,25,2,129,1000,37.525,61.36 GB,65885315479,0
41
+ ds002680,350,14,1,31,1000,21.244,9.22 GB,9902152149,0
42
+ ds003805,1,1,1,19,500,0.033,16.96 MB,17781347,0
43
+ ds003838,130,65,2,63,1000,136.757,253.29 GB,271965704312,0
44
+ ds002691,20,20,1,32,250,6.721,776.76 MB,814491068,0
45
+ ds003690,375,75,3,"64,66",500,46.771,21.46 GB,23043491552,0
46
+ ds004040,4,2,1,64,512,4.229,11.59 GB,12440304224,0
47
+ ds003061,39,13,1,79,256,8.196,2.26 GB,2421951821,0
48
+ ds005672,3,3,1,"65,69",1000,4.585,4.23 GB,4545641306,0
49
+ ds005410,81,81,1,63,1000,22.976,19.76 GB,21213481224,0
50
+ ds003753,25,25,1,64,500,10.104,4.62 GB,4965253148,0
51
+ ds005565,24,24,1,,500,11.436,2.62 GB,2816607296,0
52
+ ds002893,52,49,1,33,"250,250.0293378038558",36.114,7.70 GB,8263047991,0
53
+ ds002578,2,2,1,256,256,1.455,1.33 GB,1429254677,0
54
+ ds005089,36,36,1,63,1000,68.82,68.01 GB,73021312961,0
55
+ ds003822,25,25,1,64,500,12.877,5.82 GB,6248744522,0
56
+ ds003670,62,25,1,32,2000,72.772,97.53 GB,104721234854,0
57
+ ds005048,35,35,1,,250,5.203,355.91 MB,373200880,0
58
+ ds004574,146,146,1,"63,64,66",500,31.043,13.48 GB,14470034208,0
59
+ ds004519,40,40,1,62,250,0.067,12.56 GB,13486848019,0
60
+ ds004602,546,182,3,128,"250,500",87.11,73.91 GB,79364456958,0
61
+ ds004784,6,1,6,128,512,0.518,10.82 GB,11621460277,0
62
+ ds004771,61,61,1,34,256,0.022,1.36 GB,1462195517,0
63
+ ds003518,137,110,1,64,500,89.888,39.51 GB,42423490194,0
64
+ ds005207,39,20,1,"6,10,12,14,15,16,17,18","128,250",422.881,69.12 GB,74214619739,0
65
+ ds005866,60,60,1,,500,15.976,3.57 GB,3837211623,0
66
+ ds003523,221,91,1,64,500,84.586,37.54 GB,40304852370,0
67
+ ds004347,48,24,1,64,"128,512",6.389,2.69 GB,2890549319,0
68
+ ds004588,42,42,1,24,300,4.957,601.76 MB,630994652,0
69
+ ds005811,448,19,1,62,"1000,500",23.733,24.12 GB,25902600444,0
70
+ ds003987,69,23,1,64,500.0930232558139,52.076,26.41 GB,28362707915,0
71
+ ds004317,50,50,1,60,500,37.767,18.29 GB,19639199743,0
72
+ ds004033,36,18,2,64,500,42.645,19.81 GB,21270391452,0
73
+ ds004315,50,50,1,60,500,21.104,9.81 GB,10532856899,0
74
+ ds003474,122,122,1,64,500,36.61,16.64 GB,17867805967,0
75
+ ds003509,84,56,1,64,500,48.535,22.34 GB,23988721823,0
76
+ ds005868,48,48,1,,500,13.094,2.93 GB,3146417813,0
77
+ ds003516,25,25,1,47,500,22.57,13.46 GB,14451393616,0
78
+ ds004942,62,62,1,65,1000,28.282,25.05 GB,26899933549,0
79
+ ds004348,18,9,2,34,200,35.056,12.30 GB,13210476025,0
80
+ ds004625,543,32,9,120,500,28.397,62.46 GB,67069111978,0
81
+ ds003517,34,17,1,64,500,13.273,6.48 GB,6952992399,0
82
+ ds004368,40,39,1,63,128,0.033,997.14 MB,1045574811,0
83
+ ds004584,149,149,1,"63,64,66",500,6.641,2.87 GB,3078216874,0
84
+ ds003506,84,56,1,64,500,35.381,16.21 GB,17400039992,0
85
+ ds003570,40,40,1,64,2048,26.208,36.12 GB,38783075272,0
86
+ ds003490,75,50,1,64,500,12.76,5.85 GB,6276775630,0
87
+ ds004117,85,23,1,69,"1000,250,500,500.059",15.941,5.80 GB,6230776574,0
88
+ ds004505,25,25,1,120,250,30.398,522.56 GB,561092363916,0
89
+ ds004580,147,147,1,"63,64,66",500,36.514,15.84 GB,17008438640,0
90
+ ds004532,137,110,1,64,500,49.651,22.09 GB,23719572304,0
91
+ ds004902,218,71,2,61,"500,5000",18.118,8.29 GB,8898600609,0
92
+ ds004295,26,26,1,66,"1024,512",34.313,31.51 GB,33831372141,0
93
+ ds003519,54,27,1,64,500,20.504,8.96 GB,9623156762,0
94
+ ds003458,23,23,1,64,500,10.447,4.72 GB,5065250805,0
95
+ ds003004,34,34,1,"134,180,189,196,201,206,207,208,209,211,212,213,214,215,218,219,220,221,222,223,224,226,227,229,231,232,235",256,49.072,35.63 GB,38255333087,0
96
+ ds004200,20,20,1,37,1000,14.123,7.21 GB,7740555648,0
97
+ ds004015,36,36,1,18,500,47.29,6.03 GB,6475870225,0
98
+ ds004595,53,53,1,64,500,17.078,7.89 GB,8470863296,0
99
+ ds004626,52,52,1,68,1000,21.359,19.87 GB,21336341431,0
100
+ ds004475,30,30,1,"113,115,118,119,120,122,123,124,125,126,127,128",512,26.899,112.74 GB,121053900746,0
101
+ ds004515,54,54,1,64,500,20.61,9.48 GB,10177384081,0
102
+ ds004883,516,172,3,128,500,137.855,122.80 GB,131858855599,0
103
+ ds003739,120,30,4,128,256,20.574,10.94 GB,11742611182,0
104
+ ds004389,260,26,4,42,10000,30.932,376.50 GB,404264486093,0
105
+ ds004367,40,40,1,68,1200,24.81,27.98 GB,30039343808,0
106
+ ds004369,41,41,1,4,500,37.333,8.01 GB,8596739356,0
107
+ ds004579,139,139,1,"63,64,66",500,55.703,24.12 GB,25896737812,0
108
+ ds005416,23,23,1,64,1000,24.68,21.30 GB,22869325264,0
109
+ ds001785,54,18,3,63,"1000,1024",14.644,27.86 GB,29915397068,0
110
+ ds001971,273,20,1,108,512,46.183,31.98 GB,34339201543,0
111
+ ds004388,399,40,3,67,10000,43.327,682.54 GB,732876226489,0
112
+ ds003478,243,122,1,64,500,23.57,10.65 GB,11430531312,0
113
+ ds004306,15,12,1,124,1024,18.183,79.11 GB,84945921180,0
114
+ ds005305,165,165,1,64,"2048,512",14.136,6.41 GB,6887595053,0
115
+ ds005114,223,91,1,64,500,125.701,56.47 GB,60630838923,0
116
+ ds003039,16,16,1,64,500,14.82,7.82 GB,8401240820,0
117
+ ds003602,699,118,6,35,1000,159.35,73.21 GB,78609742568,0
118
+ ds003655,156,156,1,19,500,130.923,20.26 GB,21756905870,0
119
+ ds003522,200,96,1,64,500,57.079,25.36 GB,27225424004,0
120
+ ds003801,20,20,1,24,250,13.689,1.15 GB,1233075452,0
121
+ ds005296,62,62,1,,500,37.205,8.53 GB,9154623627,0
122
+ ds004561,23,23,1,62,10000,11.379,97.96 GB,105188606283,0
123
+ ds005131,63,58,2,64,500,52.035,22.35 GB,23996524256,0
124
+ ds005028,66,11,3,,,0.0,1.46 GB,1563795662,0
125
+ ds005170,225,5,1,,,0.0,261.77 GB,281068716313,0
126
+ ds004840,51,9,3,8,"1024,256,512",11.306,1.75 GB,1876219715,0
127
+ ds004718,51,51,1,64,1000,21.836,108.98 GB,117013849037,0
128
+ ds002725,105,21,5,30,1000,0.0,15.32 GB,16447829856,0
129
+ ds004408,380,19,1,128,512,20.026,18.70 GB,20083249915,0
130
+ ds004796,235,79,3,,1000,0.0,240.21 GB,257923739221,0
131
+ ds004511,134,45,3,139,3000,48.922,202.28 GB,217194709208,0
132
+ ds004817,20,20,1,63,1000,0.0,25.34 GB,27207910489,0
133
+ ds003190,280,19,1,0,256,29.891,1.27 GB,1361816737,0
134
+ ds004917,24,24,1,,,0.0,36.47 GB,39162637090,0
135
+ ds004357,16,16,1,63,1000,0.0,69.56 GB,74685825960,0
136
+ ds005397,26,26,1,64,500,27.923,12.10 GB,12993735747,0
137
+ ds003846,60,19,1,64,500,24.574,11.36 GB,12193814091,0
138
+ ds004024,497,13,3,64,20000,55.503,1021.22 GB,1096522006089,0
139
+ ds005815,137,26,4,30,"1000,500",38.618,9.91 GB,10642000219,0
140
+ ds005429,61,15,3,64,"2500,5000",14.474,16.47 GB,17685373747,0
141
+ ds003702,47,47,1,61,500,0.0,60.93 GB,65421860496,0
142
+ ds004577,130,103,1,"19,21,24",200,22.974,652.76 MB,684471843,0
143
+ ds003574,18,18,1,64,500,0.0,14.79 GB,15876358782,0
144
+ ds005779,250,19,16,"64,67,70",5000,16.65,88.67 GB,95206991747,0
145
+ ds005185,356,20,3,8,500,0.0,783.25 GB,841005525524,0
146
+ ds001787,40,24,1,64,256,27.607,5.69 GB,6112379157,0
147
+ ds003505,37,19,2,128,2048,0.0,90.13 GB,96777780296,0
148
+ ds005340,15,15,1,2,10000,35.297,19.14 GB,20556600898,0
149
+ ds005363,43,43,1,64,1000,43.085,17.71 GB,19011101429,0
150
+ ds005121,39,34,1,58,512,41.498,9.04 GB,9711092185,0
151
+ ds004256,53,53,2,64,500,42.337,18.18 GB,19516271706,0
152
+ ds005420,72,37,2,20,500,5.485,372.11 MB,390189484,0
153
+ ds002034,167,14,4,64,512,37.248,10.10 GB,10842685551,0
154
+ ds003825,50,50,1,"63,128",1000,0.0,55.34 GB,59421076202,0
155
+ ds004587,114,103,1,59,10000,25.491,219.34 GB,235517890780,0
156
+ ds004598,20,9,1,,10000,0.0,26.66 GB,28629940214,0
157
+ ds005383,240,30,1,30,200,8.327,17.43 GB,18712238212,0
158
+ ds003195,20,10,2,19,200,4.654,121.08 MB,126957549,0
159
+ ds005403,32,32,1,62,10000,13.383,135.65 GB,145656630881,0
160
+ ds004621,167,42,4,,1000,0.0,77.39 GB,83096459121,0
161
+ ds005863,357,127,4,27,500,0.0,10.59 GB,11371790189,0
162
+ ds005594,16,16,1,64,1000,12.934,10.89 GB,11695589464,0
163
+ ds002336,54,10,6,,5000,0.0,17.98 GB,19300632853,0
164
+ ds004043,20,20,1,63,1000,0.0,30.44 GB,32685724275,0
165
+ ds005106,42,42,1,32,500,0.012,12.62 GB,13547440607,0
166
+ ds004284,18,18,1,129,1000,9.454,16.49 GB,17703523636,0
167
+ ds005620,202,21,3,"64,65",5000,21.811,77.30 GB,83002663223,0
168
+ ds002720,165,18,10,19,1000,0.0,2.39 GB,2566221024,0
169
+ ds005307,73,7,1,"72,104",10000,1.335,18.59 GB,19956343711,0
170
+ ds002094,43,20,3,30,5000,18.593,39.45 GB,42356287674,0
171
+ ds002833,80,20,1,257,1000,11.604,39.77 GB,42698182133,0
172
+ ds002218,18,18,1,0,256,16.52,1.95 GB,2089183870,0
173
+ ds005021,36,36,1,64,1024,0.0,83.20 GB,89337424472,0
174
+ ds004264,21,21,1,31,1000,0.0,3.30 GB,3546307489,0
175
+ ds004446,237,30,1,129,1000,33.486,29.23 GB,31382984441,0
176
+ ds004980,17,17,1,64,"499.9911824,499.9912809,499.991385,499.9914353,499.9914553,499.9915179,499.9917272,499.9917286,499.9917378,499.9919292,499.9919367,499.9923017,499.9923795,500",36.846,15.82 GB,16989514798,0
177
+ ds002722,94,19,5,32,1000,0.0,6.10 GB,6545819602,0
178
+ ds003944,82,82,1,61,"1000,3000.00030000003",6.999,6.15 GB,6606397067,0
179
+ ds004279,60,56,1,64,1000,53.729,25.22 GB,27082275780,0
180
+ ds005876,29,29,1,32,1000,16.017,7.61 GB,8170007441,0
181
+ ds003816,1077,48,8,127,1000,159.313,53.97 GB,57953346429,0
182
+ ds005385,3264,608,2,64,1000,169.62,74.07 GB,79529430923,0
183
+ ds004572,516,52,10,58,1000,52.624,43.56 GB,46777273840,0
184
+ ds005095,48,48,1,63,1000,16.901,14.28 GB,15336165645,0
185
+ ds004460,40,20,1,160,1000,27.494,61.36 GB,65881325046,0
186
+ ds005189,30,30,1,61,1000,0.0,17.03 GB,18283103870,0
187
+ ds005274,22,22,1,6,500,0.0,71.91 MB,75400374,0
188
+ ds004075,116,29,4,,1000,0.0,7.39 GB,7936060172,0
189
+ ds004447,418,22,1,"128,129",1000,23.554,20.73 GB,22253514308,0
190
+ ds004952,245,10,1,128,1000,123.411,696.72 GB,748095804444,0
191
+ ds002724,96,10,4,32,1000,0.0,8.52 GB,9150248444,0
192
+ ds005571,45,24,2,64,5000,0.0,62.77 GB,67394456730,0
193
+ ds004262,21,21,1,31,1000,0.0,3.48 GB,3731654700,0
194
+ ds005273,33,33,1,63,1000,58.055,44.42 GB,47690882240,0
195
+ ds004520,33,33,1,62,250,0.055,10.41 GB,11175908145,0
196
+ ds004444,465,30,1,129,1000,55.687,48.62 GB,52204973958,0
197
+ ds004582,73,73,1,59,10000,34.244,294.22 GB,315915939478,0
198
+ ds002723,44,8,6,32,1000,0.0,2.60 GB,2791985215,0
199
+ ds003751,38,38,1,128,250,19.95,4.71 GB,5057922307,0
200
+ ds003421,80,20,1,257,1000,11.604,76.77 GB,82433418198,0
201
+ ds002158,117,20,1,,,0.0,428.59 GB,460190030981,0
202
+ ds004951,23,11,1,63,1000,29.563,22.00 GB,23627352274,0
203
+ ds004802,38,38,1,65,"2048,512",0.0,29.34 GB,31504070800,0
204
+ ds004816,20,20,1,63,1000,0.0,23.31 GB,25028989553,0
205
+ ds005873,2850,125,1,2,256,11935.09,117.21 GB,125851664268,0
206
+ ds003194,29,15,2,"19,21",200,7.178,189.15 MB,198333904,0
207
+ ds004356,24,22,1,34,10000,0.0,213.08 GB,228796286136,0
208
+ ds004381,437,18,1,"4,5,7,8,10",20000,11.965,12.36 GB,13275540742,0
209
+ ds004196,4,4,1,64,512,1.511,9.33 GB,10022898106,0
210
+ ds005692,59,30,1,24,5000,112.206,92.81 GB,99649237201,0
211
+ ds002338,85,17,4,,5000,0.0,25.89 GB,27802574037,0
212
+ ds004022,21,7,1,"16,18",500,0.0,634.93 MB,665774359,0
213
+ ds004603,37,37,1,64,1024,30.653,39.13 GB,42020115207,0
214
+ ds004752,136,15,1,"0,8,10,19,20,21,23","200,2000,4000,4096",0.302,11.95 GB,12829882725,0
215
+ ds003768,255,33,2,,,0.0,89.24 GB,95819107191,0
216
+ ds003947,61,61,1,61,"1000,3000.00030000003",5.266,12.54 GB,13466591394,0
217
+ ds005530,21,17,1,10,500,154.833,6.47 GB,6949642931,0
218
+ ds005555,256,128,1,"2,8,9,11,12,13",256,2002.592,33.45 GB,35921410419,0
219
+ ds004477,9,9,1,79,2048,13.557,22.34 GB,23990303639,0
220
+ ds005688,89,20,5,4,"10000,20000",2.502,8.42 GB,9036021093,0
221
+ ds003766,124,31,4,129,1000,39.973,152.77 GB,164033759919,0
222
+ ds005540,103,59,1,64,"1200,600",0.0,70.40 GB,75594345013,0
223
+ ds004152,21,21,1,31,1000,0.0,4.77 GB,5118976537,0
224
+ ds003626,30,10,1,,,0.0,24.99 GB,26828585815,0
225
+ ds002814,168,21,1,68,1200,0.0,48.57 GB,52151006842,0
226
+ ds003645,108,18,1,,,0.0,105.89 GB,113698969765,0
227
+ ds005586,23,23,1,60,1000,33.529,28.68 GB,30791089319,0
228
+ ds003810,50,10,1,15,125,0.0,69.31 MB,72674251,0
229
+ ds003969,392,98,4,64,"1024,2048",66.512,54.46 GB,58479195149,0
230
+ ds004000,86,43,2,128,2048,0.0,22.50 GB,24161100810,0
231
+ ds004995,20,20,1,,,0.0,27.60 GB,29637643188,0
232
+ ds003638,57,57,1,64,512,40.597,16.31 GB,17516109722,0
233
+ ds004521,34,34,1,62,250,0.057,10.68 GB,11470006201,0
234
+ ds001849,120,20,1,30,5000,0.0,44.51 GB,47790431085,0
235
+ ds004252,1,1,1,,,0.0,4.31 GB,4630172409,0
236
+ ds004448,280,56,1,129,1000,43.732,38.17 GB,40980948240,0
237
+ ds005795,39,34,2,72,500,0.0,6.43 GB,6902188541,0
238
+ ds004018,32,16,1,63,1000,0.0,10.56 GB,11334174765,0
239
+ ds004324,26,26,1,28,500,19.216,2.46 GB,2637689107,0
240
+ ds003887,24,24,1,128,1000,0.0,80.10 GB,86007307086,0
241
+ ds004860,31,31,1,32,"2048,512",0.0,3.79 GB,4065632222,0
242
+ ds002721,185,31,6,19,1000,0.0,3.35 GB,3598851749,0
243
+ ds003555,30,30,1,,1024,0.0,28.27 GB,30359240949,0
244
+ ds005486,445,159,1,,"25000,5000",0.0,371.04 GB,398401152773,0
245
+ ds005520,69,23,3,67,1000,60.73,275.98 GB,296326427308,0
246
+ ds005262,186,12,1,,,0.0,688.75 MB,722211079,0
247
+ ds002778,46,31,1,40,512,2.518,545.00 MB,571471228,0
248
+ ds003885,24,24,1,128,1000,0.0,82.21 GB,88277188455,0
249
+ ds005406,29,29,1,63,1000,15.452,13.26 GB,14241905076,0
250
+ ds003710,48,13,1,32,5000,9.165,10.18 GB,10934708022,0
251
+ ds003343,59,20,1,16,500,6.551,663.50 MB,695729345,0
252
+ ds005345,26,26,1,64,500,0.0,405.13 GB,435000970369,0
253
+ ds004067,84,80,1,63,2000,0.0,100.79 GB,108218050644,0
254
+ ds001810,263,47,1,64,512,91.205,109.70 GB,117790096766,0
255
+ ds005515,2516,533,8,129,500,198.849,160.55 GB,172385741878,0
256
+ ds005516,3397,430,8,129,500,256.932,219.39 GB,235564761634,0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eegdash
3
- Version: 0.3.5.dev183002612
3
+ Version: 0.3.6.dev182011805
4
4
  Summary: EEG data for machine learning
5
5
  Author-email: Young Truong <dt.young112@gmail.com>, Arnaud Delorme <adelorme@gmail.com>, Aviv Dotan <avivd220@gmail.com>, Oren Shriki <oren70@gmail.com>, Bruno Aristimunha <b.aristimunha@gmail.com>
6
6
  License-Expression: GPL-3.0-only
@@ -41,6 +41,7 @@ eegdash/features/feature_bank/signal.py
41
41
  eegdash/features/feature_bank/spectral.py
42
42
  eegdash/features/feature_bank/utils.py
43
43
  tests/test_api.py
44
+ tests/test_challenge_kwargs.py
44
45
  tests/test_correctness.py
45
46
  tests/test_dataset.py
46
47
  tests/test_dataset_registration.py
@@ -0,0 +1,52 @@
1
+ from eegdash.api import EEGDashDataset
2
+ from eegdash.dataset import EEGChallengeDataset
3
+
4
+
5
+ def test_challenge_dataset_passes_task_and_dataset_filters(tmp_path):
6
+ ds = EEGChallengeDataset(
7
+ release="R5",
8
+ cache_dir=str(tmp_path),
9
+ mini=False,
10
+ task="RestingState",
11
+ )
12
+
13
+ assert len(ds.datasets) == 329
14
+ assert ds.datasets[0].record["dataset"] == "ds005509"
15
+
16
+
17
+ def test_eegdashdataset_ignores_empty_query_when_kwargs_present(tmp_path):
18
+ _ = EEGDashDataset(
19
+ query={},
20
+ cache_dir=str(tmp_path),
21
+ dataset="ds005509",
22
+ task="RestingState",
23
+ )
24
+
25
+
26
+ def test_challenge_dataset_task_list_propagation(tmp_path):
27
+ tasks = ["RestingState", "DespicableMe"]
28
+
29
+ _ = EEGChallengeDataset(
30
+ release="R5",
31
+ cache_dir=str(tmp_path),
32
+ mini=False,
33
+ task=tasks,
34
+ )
35
+
36
+
37
+ def test_eegdashdataset_allows_raw_query_and_kwargs(tmp_path):
38
+ _ = EEGDashDataset(
39
+ query={"subject": {"$in": ["NDARAU708TL8", "NDARAP785CTE"]}},
40
+ cache_dir=str(tmp_path),
41
+ dataset="ds005509",
42
+ task="RestingState",
43
+ )
44
+
45
+
46
+ def test_challenge_dataset_mini_populates_subjects(tmp_path):
47
+ _ = EEGChallengeDataset(
48
+ release="R5",
49
+ cache_dir=str(tmp_path),
50
+ mini=True,
51
+ task="RestingState",
52
+ )
@@ -1,6 +1,6 @@
1
1
  from pathlib import Path
2
2
 
3
- from mne import get_config
3
+ from mne.utils import get_config
4
4
  from torch.utils.data import Dataset
5
5
 
6
6
  from eegdash import EEGDash, EEGDashDataset
@@ -57,7 +57,9 @@ def test_minirelease_subject_raw_equivalence(warmed_mongo):
57
57
  subject = ds_mini_all.description["subject"].iloc[0]
58
58
 
59
59
  ds_mini = EEGChallengeDataset(
60
- release=release, mini=True, cache_dir=EEG_CHALLENGE_CACHE_DIR, subject=subject
60
+ release=release,
61
+ mini=True,
62
+ cache_dir=EEG_CHALLENGE_CACHE_DIR,
61
63
  )
62
64
  ds_full = EEGChallengeDataset(
63
65
  release=release, mini=False, cache_dir=EEG_CHALLENGE_CACHE_DIR, subject=subject
@@ -83,3 +83,61 @@ def test_find_method_with_kwargs(eegdash_instance, mock_mongo_connection):
83
83
  # Assert that the method returned the mocked data
84
84
  assert len(results) == 1
85
85
  assert results[0]["dataset"] == "ds004"
86
+
87
+
88
+ def test_find_method_with_query_and_kwargs_merging(
89
+ eegdash_instance, mock_mongo_connection
90
+ ):
91
+ """When both a raw query and kwargs are provided, they should be merged with $and."""
92
+ mock_mongo_connection.find.return_value = [{"_id": "xyz", "dataset": "ds010"}]
93
+
94
+ raw_query = {"dataset": "ds010", "subject": {"$in": ["sub-01", "sub-02"]}}
95
+ _ = eegdash_instance.find(raw_query, task="RestingState")
96
+
97
+ # Expect the final query to be an $and of raw_query and the built kwargs query
98
+ expected_kwargs_query = {"task": "RestingState"}
99
+ # We can't easily inspect the internal builder here, but we can check the structural call
100
+ called_with = mock_mongo_connection.find.call_args[0][0]
101
+ assert "$and" in called_with
102
+ assert raw_query in called_with["$and"]
103
+ assert expected_kwargs_query in called_with["$and"]
104
+
105
+
106
+ def test_find_conflict_on_duplicate_task_raises(
107
+ eegdash_instance, mock_mongo_connection
108
+ ):
109
+ """If the same field is given in both raw query and kwargs with conflicting values, raise."""
110
+ raw_query = {"task": "RestingState"}
111
+ with pytest.raises(ValueError, match="Conflicting constraints for 'task'"):
112
+ _ = eegdash_instance.find(raw_query, task="DespicableMe")
113
+ mock_mongo_connection.find.assert_not_called()
114
+
115
+
116
+ def test_find_duplicate_task_consistent_ok(eegdash_instance, mock_mongo_connection):
117
+ """No error when duplicate field constraints are compatible (e.g., $in contains scalar)."""
118
+ mock_mongo_connection.find.return_value = []
119
+ raw_query = {"task": {"$in": ["RestingState", "DespicableMe"]}}
120
+ _ = eegdash_instance.find(raw_query, task="RestingState")
121
+ called_with = mock_mongo_connection.find.call_args[0][0]
122
+ assert "$and" in called_with
123
+
124
+
125
+ def test_find_all_documents_with_empty_query(eegdash_instance, mock_mongo_connection):
126
+ mock_mongo_connection.find.return_value = [{"_id": "1"}]
127
+ res = eegdash_instance.find({})
128
+ mock_mongo_connection.find.assert_called_once_with({})
129
+ assert len(res) == 1
130
+
131
+
132
+ def test_build_query_rejects_none_and_empty(eegdash_instance):
133
+ with pytest.raises(ValueError, match="None for query parameter 'task'"):
134
+ eegdash_instance._build_query_from_kwargs(task=None)
135
+ with pytest.raises(ValueError, match="empty string for query parameter 'task'"):
136
+ eegdash_instance._build_query_from_kwargs(task=" ")
137
+
138
+
139
+ def test_build_query_cleans_list_values(eegdash_instance):
140
+ q = eegdash_instance._build_query_from_kwargs(
141
+ task=[" A ", None, "B", "", "A"]
142
+ ) # dedupe + strip
143
+ assert q == {"task": {"$in": ["A", "B"]}}
@@ -1,255 +0,0 @@
1
- dataset,n_records,n_subjects,n_tasks,nchans_set,sampling_freqs,duration_hours_total
2
- ds002718,18,18,1,74,250,14.844
3
- ds005505,1342,136,10,129,500,125.366
4
- ds004745,6,6,1,,1000,0.0
5
- ds005514,2885,295,10,129,500,213.008
6
- ds005512,2320,257,10,129,500,196.205
7
- ds005510,1227,135,10,129,500,112.464
8
- ds005511,3100,381,10,"6,129",500,285.629
9
- ds005509,3326,330,10,129,500,274.559
10
- ds005508,3342,324,10,129,500,269.281
11
- ds005507,1812,184,10,129,500,168.649
12
- ds005506,1405,150,10,129,500,127.896
13
- ds004854,1,1,1,64,128,0.535
14
- ds004853,1,1,1,64,128,0.535
15
- ds004844,68,17,1,64,1024,21.252
16
- ds004843,92,14,1,64,256,29.834
17
- ds004842,102,14,1,64,256,20.102
18
- ds004852,1,1,1,64,128,0.535
19
- ds004851,1,1,1,64,128,0.535
20
- ds004850,1,1,1,64,128,0.535
21
- ds004855,1,1,1,64,128,0.535
22
- ds004849,1,1,1,64,128,0.535
23
- ds004841,147,20,1,64,256,29.054
24
- ds004661,17,17,1,64,128,10.137
25
- ds004660,42,21,1,32,"2048,512",23.962
26
- ds004657,119,24,1,64,"1024,8192",27.205
27
- ds004362,1526,109,1,64,"128,160",48.592
28
- ds004010,24,24,1,64,1000,26.457
29
- ds002181,226,226,1,125,500,7.676
30
- ds004554,16,16,1,99,1000,0.024
31
- ds005697,50,50,1,"65,69",1000,77.689
32
- ds004350,240,24,5,64,256,41.265
33
- ds004785,17,17,1,32,500,0.019
34
- ds004504,88,88,1,19,500,19.608
35
- ds004635,55,55,1,129,1000,20.068
36
- ds005787,448,19,1,"64,66","1000,500",23.733
37
- ds005079,60,1,15,65,500,3.25
38
- ds005342,32,32,1,17,250,33.017
39
- ds005034,100,25,2,129,1000,37.525
40
- ds002680,350,14,1,31,1000,21.244
41
- ds003805,1,1,1,19,500,0.033
42
- ds003838,130,65,2,63,1000,136.757
43
- ds002691,20,20,1,32,250,6.721
44
- ds003690,375,75,3,"64,66",500,46.771
45
- ds004040,4,2,1,64,512,4.229
46
- ds003061,39,13,1,79,256,8.196
47
- ds005672,3,3,1,"65,69",1000,4.585
48
- ds005410,81,81,1,63,1000,22.976
49
- ds003753,25,25,1,64,500,10.104
50
- ds005565,24,24,1,,500,11.436
51
- ds002893,52,49,1,33,"250,250.0293378038558",36.114
52
- ds002578,2,2,1,256,256,1.455
53
- ds005089,36,36,1,63,1000,68.82
54
- ds003822,25,25,1,64,500,12.877
55
- ds003670,62,25,1,32,2000,72.772
56
- ds005048,35,35,1,,250,5.203
57
- ds004574,146,146,1,"63,64,66",500,31.043
58
- ds004519,40,40,1,62,250,0.067
59
- ds004602,546,182,3,128,"250,500",87.11
60
- ds004784,6,1,6,128,512,0.518
61
- ds004771,61,61,1,34,256,0.022
62
- ds003518,137,110,1,64,500,89.888
63
- ds005207,39,20,1,"6,10,12,14,15,16,17,18","128,250",422.881
64
- ds005866,60,60,1,,500,15.976
65
- ds003523,221,91,1,64,500,84.586
66
- ds004347,48,24,1,64,"128,512",6.389
67
- ds004588,42,42,1,24,300,4.957
68
- ds005811,448,19,1,62,"1000,500",23.733
69
- ds003987,69,23,1,64,500.0930232558139,52.076
70
- ds004317,50,50,1,60,500,37.767
71
- ds004033,36,18,2,64,500,42.645
72
- ds004315,50,50,1,60,500,21.104
73
- ds003474,122,122,1,64,500,36.61
74
- ds003509,84,56,1,64,500,48.535
75
- ds005868,48,48,1,,500,13.094
76
- ds003516,25,25,1,47,500,22.57
77
- ds004942,62,62,1,65,1000,28.282
78
- ds004348,18,9,2,34,200,35.056
79
- ds004625,543,32,9,120,500,28.397
80
- ds003517,34,17,1,64,500,13.273
81
- ds004368,40,39,1,63,128,0.033
82
- ds004584,149,149,1,"63,64,66",500,6.641
83
- ds003506,84,56,1,64,500,35.381
84
- ds003570,40,40,1,64,2048,26.208
85
- ds003490,75,50,1,64,500,12.76
86
- ds004117,85,23,1,69,"1000,250,500,500.059",15.941
87
- ds004505,25,25,1,120,250,30.398
88
- ds004580,147,147,1,"63,64,66",500,36.514
89
- ds004532,137,110,1,64,500,49.651
90
- ds004902,218,71,2,61,"500,5000",18.118
91
- ds004295,26,26,1,66,"1024,512",34.313
92
- ds003519,54,27,1,64,500,20.504
93
- ds003458,23,23,1,64,500,10.447
94
- ds003004,34,34,1,"134,180,189,196,201,206,207,208,209,211,212,213,214,215,218,219,220,221,222,223,224,226,227,229,231,232,235",256,49.072
95
- ds004200,20,20,1,37,1000,14.123
96
- ds004015,36,36,1,18,500,47.29
97
- ds004595,53,53,1,64,500,17.078
98
- ds004626,52,52,1,68,1000,21.359
99
- ds004475,30,30,1,"113,115,118,119,120,122,123,124,125,126,127,128",512,26.899
100
- ds004515,54,54,1,64,500,20.61
101
- ds004883,516,172,3,128,500,137.855
102
- ds003739,120,30,4,128,256,20.574
103
- ds004389,260,26,4,42,10000,30.932
104
- ds004367,40,40,1,68,1200,24.81
105
- ds004369,41,41,1,4,500,37.333
106
- ds004579,139,139,1,"63,64,66",500,55.703
107
- ds005416,23,23,1,64,1000,24.68
108
- ds001785,54,18,3,63,"1000,1024",14.644
109
- ds001971,273,20,1,108,512,46.183
110
- ds004388,399,40,3,67,10000,43.327
111
- ds003478,243,122,1,64,500,23.57
112
- ds004306,15,12,1,124,1024,18.183
113
- ds005305,165,165,1,64,"2048,512",14.136
114
- ds005114,223,91,1,64,500,125.701
115
- ds003039,16,16,1,64,500,14.82
116
- ds003602,699,118,6,35,1000,159.35
117
- ds003655,156,156,1,19,500,130.923
118
- ds003522,200,96,1,64,500,57.079
119
- ds003801,20,20,1,24,250,13.689
120
- ds005296,62,62,1,,500,37.205
121
- ds004561,23,23,1,62,10000,11.379
122
- ds005131,63,58,2,64,500,52.035
123
- ds005028,66,11,3,,,0.0
124
- ds005170,225,5,1,,,0.0
125
- ds004840,51,9,3,8,"1024,256,512",11.306
126
- ds004718,51,51,1,64,1000,21.836
127
- ds002725,105,21,5,30,1000,0.0
128
- ds004408,380,19,1,128,512,20.026
129
- ds004796,235,79,3,,1000,0.0
130
- ds004511,134,45,3,139,3000,48.922
131
- ds004817,20,20,1,63,1000,0.0
132
- ds003190,280,19,1,0,256,29.891
133
- ds004917,24,24,1,,,0.0
134
- ds004357,16,16,1,63,1000,0.0
135
- ds005397,26,26,1,64,500,27.923
136
- ds003846,60,19,1,64,500,24.574
137
- ds004024,497,13,3,64,20000,55.503
138
- ds005815,137,26,4,30,"1000,500",38.618
139
- ds005429,61,15,3,64,"2500,5000",14.474
140
- ds003702,47,47,1,61,500,0.0
141
- ds004577,130,103,1,"19,21,24",200,22.974
142
- ds003574,18,18,1,64,500,0.0
143
- ds005779,250,19,16,"64,67,70",5000,16.65
144
- ds005185,356,20,3,8,500,0.0
145
- ds001787,40,24,1,64,256,27.607
146
- ds003505,37,19,2,128,2048,0.0
147
- ds005340,15,15,1,2,10000,35.297
148
- ds005363,43,43,1,64,1000,43.085
149
- ds005121,39,34,1,58,512,41.498
150
- ds004256,53,53,2,64,500,42.337
151
- ds005420,72,37,2,20,500,5.485
152
- ds002034,167,14,4,64,512,37.248
153
- ds003825,50,50,1,"63,128",1000,0.0
154
- ds004587,114,103,1,59,10000,25.491
155
- ds004598,20,9,1,,10000,0.0
156
- ds005383,240,30,1,30,200,8.327
157
- ds003195,20,10,2,19,200,4.654
158
- ds005403,32,32,1,62,10000,13.383
159
- ds004621,167,42,4,,1000,0.0
160
- ds005863,357,127,4,27,500,0.0
161
- ds005594,16,16,1,64,1000,12.934
162
- ds002336,54,10,6,,5000,0.0
163
- ds004043,20,20,1,63,1000,0.0
164
- ds005106,42,42,1,32,500,0.012
165
- ds004284,18,18,1,129,1000,9.454
166
- ds005620,202,21,3,"64,65",5000,21.811
167
- ds002720,165,18,10,19,1000,0.0
168
- ds005307,73,7,1,"72,104",10000,1.335
169
- ds002094,43,20,3,30,5000,18.593
170
- ds002833,80,20,1,257,1000,11.604
171
- ds002218,18,18,1,0,256,16.52
172
- ds005021,36,36,1,64,1024,0.0
173
- ds004264,21,21,1,31,1000,0.0
174
- ds004446,237,30,1,129,1000,33.486
175
- ds004980,17,17,1,64,"499.9911824,499.9912809,499.991385,499.9914353,499.9914553,499.9915179,499.9917272,499.9917286,499.9917378,499.9919292,499.9919367,499.9923017,499.9923795,500",36.846
176
- ds002722,94,19,5,32,1000,0.0
177
- ds003944,82,82,1,61,"1000,3000.00030000003",6.999
178
- ds004279,60,56,1,64,1000,53.729
179
- ds005876,29,29,1,32,1000,16.017
180
- ds003816,1077,48,8,127,1000,159.313
181
- ds005385,3264,608,2,64,1000,169.62
182
- ds004572,516,52,10,58,1000,52.624
183
- ds005095,48,48,1,63,1000,16.901
184
- ds004460,40,20,1,160,1000,27.494
185
- ds005189,30,30,1,61,1000,0.0
186
- ds005274,22,22,1,6,500,0.0
187
- ds004075,116,29,4,,1000,0.0
188
- ds004447,418,22,1,"128,129",1000,23.554
189
- ds004952,245,10,1,128,1000,123.411
190
- ds002724,96,10,4,32,1000,0.0
191
- ds005571,45,24,2,64,5000,0.0
192
- ds004262,21,21,1,31,1000,0.0
193
- ds005273,33,33,1,63,1000,58.055
194
- ds004520,33,33,1,62,250,0.055
195
- ds004444,465,30,1,129,1000,55.687
196
- ds004582,73,73,1,59,10000,34.244
197
- ds002723,44,8,6,32,1000,0.0
198
- ds003751,38,38,1,128,250,19.95
199
- ds003421,80,20,1,257,1000,11.604
200
- ds002158,117,20,1,,,0.0
201
- ds004951,23,11,1,63,1000,29.563
202
- ds004802,38,38,1,65,"2048,512",0.0
203
- ds004816,20,20,1,63,1000,0.0
204
- ds005873,2850,125,1,2,256,11935.09
205
- ds003194,29,15,2,"19,21",200,7.178
206
- ds004356,24,22,1,34,10000,0.0
207
- ds004381,437,18,1,"4,5,7,8,10",20000,11.965
208
- ds004196,4,4,1,64,512,1.511
209
- ds005692,59,30,1,24,5000,112.206
210
- ds002338,85,17,4,,5000,0.0
211
- ds004022,21,7,1,"16,18",500,0.0
212
- ds004603,37,37,1,64,1024,30.653
213
- ds004752,136,15,1,"0,8,10,19,20,21,23","200,2000,4000,4096",0.302
214
- ds003768,255,33,2,,,0.0
215
- ds003947,61,61,1,61,"1000,3000.00030000003",5.266
216
- ds005530,21,17,1,10,500,154.833
217
- ds005555,256,128,1,"2,8,9,11,12,13",256,2002.592
218
- ds004477,9,9,1,79,2048,13.557
219
- ds005688,89,20,5,4,"10000,20000",2.502
220
- ds003766,124,31,4,129,1000,39.973
221
- ds005540,103,59,1,64,"1200,600",0.0
222
- ds004152,21,21,1,31,1000,0.0
223
- ds003626,30,10,1,,,0.0
224
- ds002814,168,21,1,68,1200,0.0
225
- ds003645,108,18,1,,,0.0
226
- ds005586,23,23,1,60,1000,33.529
227
- ds003810,50,10,1,15,125,0.0
228
- ds003969,392,98,4,64,"1024,2048",66.512
229
- ds004000,86,43,2,128,2048,0.0
230
- ds004995,20,20,1,,,0.0
231
- ds003638,57,57,1,64,512,40.597
232
- ds004521,34,34,1,62,250,0.057
233
- ds001849,120,20,1,30,5000,0.0
234
- ds004252,1,1,1,,,0.0
235
- ds004448,280,56,1,129,1000,43.732
236
- ds005795,39,34,2,72,500,0.0
237
- ds004018,32,16,1,63,1000,0.0
238
- ds004324,26,26,1,28,500,19.216
239
- ds003887,24,24,1,128,1000,0.0
240
- ds004860,31,31,1,32,"2048,512",0.0
241
- ds002721,185,31,6,19,1000,0.0
242
- ds003555,30,30,1,,1024,0.0
243
- ds005486,445,159,1,,"25000,5000",0.0
244
- ds005520,69,23,3,67,1000,60.73
245
- ds005262,186,12,1,,,0.0
246
- ds002778,46,31,1,40,512,2.518
247
- ds003885,24,24,1,128,1000,0.0
248
- ds005406,29,29,1,63,1000,15.452
249
- ds003710,48,13,1,32,5000,9.165
250
- ds003343,59,20,1,16,500,6.551
251
- ds005345,26,26,1,64,500,0.0
252
- ds004067,84,80,1,63,2000,0.0
253
- ds001810,263,47,1,64,512,91.205
254
- ds005515,2516,533,8,129,500,198.849
255
- ds005516,3397,430,8,129,500,256.932