hydraflow 0.18.3__tar.gz → 0.19.0__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.
Files changed (109) hide show
  1. {hydraflow-0.18.3 → hydraflow-0.19.0}/PKG-INFO +1 -1
  2. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part3-analysis/run-class.md +19 -20
  3. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part3-analysis/run-collection.md +4 -4
  4. {hydraflow-0.18.3 → hydraflow-0.19.0}/pyproject.toml +2 -2
  5. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/run.py +5 -5
  6. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/run_collection.py +5 -16
  7. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/test_run.py +4 -8
  8. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/run/test_run_collection.py +1 -7
  9. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/test_group_by.py +1 -1
  10. {hydraflow-0.18.3 → hydraflow-0.19.0}/.devcontainer/devcontainer.json +0 -0
  11. {hydraflow-0.18.3 → hydraflow-0.19.0}/.devcontainer/postCreate.sh +0 -0
  12. {hydraflow-0.18.3 → hydraflow-0.19.0}/.devcontainer/starship.toml +0 -0
  13. {hydraflow-0.18.3 → hydraflow-0.19.0}/.gitattributes +0 -0
  14. {hydraflow-0.18.3 → hydraflow-0.19.0}/.github/workflows/ci.yaml +0 -0
  15. {hydraflow-0.18.3 → hydraflow-0.19.0}/.github/workflows/docs.yaml +0 -0
  16. {hydraflow-0.18.3 → hydraflow-0.19.0}/.github/workflows/publish.yaml +0 -0
  17. {hydraflow-0.18.3 → hydraflow-0.19.0}/.gitignore +0 -0
  18. {hydraflow-0.18.3 → hydraflow-0.19.0}/LICENSE +0 -0
  19. {hydraflow-0.18.3 → hydraflow-0.19.0}/README.md +0 -0
  20. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/getting-started/concepts.md +0 -0
  21. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/getting-started/index.md +0 -0
  22. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/getting-started/installation.md +0 -0
  23. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/index.md +0 -0
  24. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part1-applications/configuration.md +0 -0
  25. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part1-applications/execution.md +0 -0
  26. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part1-applications/index.md +0 -0
  27. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part1-applications/main-decorator.md +0 -0
  28. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part2-advanced/index.md +0 -0
  29. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part2-advanced/job-configuration.md +0 -0
  30. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part2-advanced/sweep-syntax.md +0 -0
  31. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part3-analysis/index.md +0 -0
  32. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/part3-analysis/updating-runs.md +0 -0
  33. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/practical-tutorials/advanced.md +0 -0
  34. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/practical-tutorials/analysis.md +0 -0
  35. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/practical-tutorials/applications.md +0 -0
  36. {hydraflow-0.18.3 → hydraflow-0.19.0}/docs/practical-tutorials/index.md +0 -0
  37. {hydraflow-0.18.3 → hydraflow-0.19.0}/examples/example.py +0 -0
  38. {hydraflow-0.18.3 → hydraflow-0.19.0}/examples/hydraflow.yaml +0 -0
  39. {hydraflow-0.18.3 → hydraflow-0.19.0}/examples/submit.py +0 -0
  40. {hydraflow-0.18.3 → hydraflow-0.19.0}/mkdocs.yaml +0 -0
  41. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/__init__.py +0 -0
  42. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/cli.py +0 -0
  43. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/__init__.py +0 -0
  44. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/collection.py +0 -0
  45. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/context.py +0 -0
  46. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/group_by.py +0 -0
  47. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/io.py +0 -0
  48. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/main.py +0 -0
  49. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/core/run_info.py +0 -0
  50. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/executor/__init__.py +0 -0
  51. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/executor/aio.py +0 -0
  52. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/executor/conf.py +0 -0
  53. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/executor/io.py +0 -0
  54. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/executor/job.py +0 -0
  55. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/executor/parser.py +0 -0
  56. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/py.typed +0 -0
  57. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/utils/__init__.py +0 -0
  58. {hydraflow-0.18.3 → hydraflow-0.19.0}/src/hydraflow/utils/progress.py +0 -0
  59. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/__init__.py +0 -0
  60. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/__init__.py +0 -0
  61. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/app.py +0 -0
  62. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/conftest.py +0 -0
  63. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/hydraflow.yaml +0 -0
  64. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/submit.py +0 -0
  65. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/test_setup.py +0 -0
  66. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/test_show.py +0 -0
  67. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/cli/test_version.py +0 -0
  68. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/conftest.py +0 -0
  69. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/__init__.py +0 -0
  70. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/context/__init__.py +0 -0
  71. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/context/chdir.py +0 -0
  72. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/context/log_run.py +0 -0
  73. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/context/start_run.py +0 -0
  74. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/context/test_chdir.py +0 -0
  75. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/context/test_log_run.py +0 -0
  76. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/context/test_start_run.py +0 -0
  77. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/__init__.py +0 -0
  78. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/default.py +0 -0
  79. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/force_new_run.py +0 -0
  80. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/match_overrides.py +0 -0
  81. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/rerun_finished.py +0 -0
  82. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/skip_finished.py +0 -0
  83. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_default.py +0 -0
  84. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_dry_run.py +0 -0
  85. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_force_new_run.py +0 -0
  86. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_main.py +0 -0
  87. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_match_overrides.py +0 -0
  88. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_rerun_finished.py +0 -0
  89. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_skip_finished.py +0 -0
  90. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/test_update.py +0 -0
  91. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/main/update.py +0 -0
  92. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/run/__init__.py +0 -0
  93. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/run/run.py +0 -0
  94. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/run/test_run.py +0 -0
  95. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/run/test_run_info.py +0 -0
  96. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/test_collection.py +0 -0
  97. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/core/test_io.py +0 -0
  98. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/__init__.py +0 -0
  99. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/conftest.py +0 -0
  100. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/echo.py +0 -0
  101. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/read.py +0 -0
  102. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/test_aio.py +0 -0
  103. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/test_args.py +0 -0
  104. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/test_conf.py +0 -0
  105. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/test_io.py +0 -0
  106. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/test_job.py +0 -0
  107. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/executor/test_parser.py +0 -0
  108. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/utils/__init__.py +0 -0
  109. {hydraflow-0.18.3 → hydraflow-0.19.0}/tests/utils/test_progress.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hydraflow
3
- Version: 0.18.3
3
+ Version: 0.19.0
4
4
  Summary: HydraFlow seamlessly integrates Hydra and MLflow to streamline ML experiment management, combining Hydra's configuration management with MLflow's tracking capabilities.
5
5
  Project-URL: Documentation, https://daizutabi.github.io/hydraflow/
6
6
  Project-URL: Source, https://github.com/daizutabi/hydraflow
@@ -191,22 +191,6 @@ run = Run[Config, AdvancedModelLoader](run_dir, AdvancedModelLoader)
191
191
  model = run.impl.load_model() # Uses configuration information
192
192
  ```
193
193
 
194
- ## Loading Multiple Runs
195
-
196
- The `load` class method can load both individual runs and collections of runs:
197
-
198
- ```python
199
- # Load a single run
200
- run = Run.load("mlruns/exp_id/run_id")
201
-
202
- # Load multiple runs to create a RunCollection
203
- run_dirs = ["mlruns/exp_id/run_id1", "mlruns/exp_id/run_id2"]
204
- runs = Run.load(run_dirs)
205
-
206
- # Load runs with parallel processing
207
- runs = Run.load(run_dirs, n_jobs=4) # Use 4 parallel jobs for loading
208
- runs = Run.load(run_dirs, n_jobs=-1) # Use all available CPU cores
209
- ```
210
194
  ## Converting to DataFrame
211
195
 
212
196
  To convert a Run instance to a Polars DataFrame, use the
@@ -231,12 +215,27 @@ df = run.to_frame(
231
215
 
232
216
  The `to_frame` method accepts the following parameters:
233
217
 
234
- - `func`: A function that takes a Run instance and returns a DataFrame
218
+ - `function`: A function that takes a Run instance and returns a DataFrame
235
219
  - `*keys`: Keys for the Run's information to add. Accepts the following formats:
236
- - String: A simple key (e.g., "run_id")
237
- - Tuple: A tuple of (key, default value or function returning default value)
220
+ - String: A simple key (e.g., "run_id")
221
+ - Tuple: A tuple of (key, default value or function returning default value)
238
222
 
223
+ ## Loading Multiple Runs
224
+
225
+ The `load` class method can load both individual runs and collections of runs:
226
+
227
+ ```python
228
+ # Load a single run
229
+ run = Run.load("mlruns/exp_id/run_id")
239
230
 
231
+ # Load multiple runs to create a RunCollection
232
+ run_dirs = ["mlruns/exp_id/run_id1", "mlruns/exp_id/run_id2"]
233
+ runs = Run.load(run_dirs)
234
+
235
+ # Load runs with parallel processing
236
+ runs = Run.load(run_dirs, n_jobs=4) # Use 4 parallel jobs for loading
237
+ runs = Run.load(run_dirs, n_jobs=-1) # Use all available CPU cores
238
+ ```
240
239
 
241
240
  ### Finding Runs with `iter_run_dirs`
242
241
 
@@ -294,4 +293,4 @@ based on experiment names or custom filtering criteria.
294
293
  The [`Run`][hydraflow.core.run.Run] class provides a powerful interface for
295
294
  working with experiment runs in HydraFlow. Its type-safe configuration access,
296
295
  custom implementation support, and convenient loading mechanisms make it easy
297
- to analyze and compare experiment results effectively.
296
+ to analyze and compare experiment results effectively.
@@ -327,10 +327,10 @@ df = run_collection.concat(
327
327
 
328
328
  The `concat` method accepts the following parameters:
329
329
 
330
- - `func`: A function that takes each Run instance and returns a DataFrame
330
+ - `function`: A function that takes each Run instance and returns a DataFrame
331
331
  - `*keys`: Keys for the Run's information to add. Accepts the following formats:
332
- - String: A simple key (e.g., "run_id")
333
- - Tuple: A tuple of (key, default value or function returning default value)
332
+ - String: A simple key (e.g., "run_id")
333
+ - Tuple: A tuple of (key, default value or function returning default value)
334
334
 
335
335
  ## Grouping Runs
336
336
 
@@ -468,4 +468,4 @@ filtering, grouping, and data extraction capabilities enable efficient extractio
468
468
  of insights from large sets of experiments, helping you identify optimal
469
469
  configurations and understand performance trends.
470
470
 
471
- [hydraflow.core.collection.Collection]: ../../api/hydraflow/core/collection.html#hydraflow.core.collection.Collection
471
+ [hydraflow.core.collection.Collection]: ../../api/hydraflow/core/collection.html#hydraflow.core.collection.Collection
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "hydraflow"
7
- version = "0.18.3"
7
+ version = "0.19.0"
8
8
  description = "HydraFlow seamlessly integrates Hydra and MLflow to streamline ML experiment management, combining Hydra's configuration management with MLflow's tracking capabilities."
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -62,7 +62,7 @@ dev = [
62
62
  "pytest-xdist",
63
63
  "ruff>=0.11",
64
64
  ]
65
- docs = ["markdown-exec[ansi]", "mkapi", "mkdocs-material"]
65
+ docs = ["markdown-exec[ansi]", "mkapi>=4.4", "mkdocs-material"]
66
66
 
67
67
  [tool.pytest.ini_options]
68
68
  addopts = [
@@ -140,7 +140,7 @@ class Run[C, I = None]:
140
140
  impl_factory: Callable[[Path], I] | Callable[[Path, C], I] | None = None,
141
141
  *,
142
142
  n_jobs: int = 0,
143
- ) -> RunCollection[Self, I]: ...
143
+ ) -> RunCollection[Self]: ...
144
144
 
145
145
  @classmethod
146
146
  def load(
@@ -149,7 +149,7 @@ class Run[C, I = None]:
149
149
  impl_factory: Callable[[Path], I] | Callable[[Path, C], I] | None = None,
150
150
  *,
151
151
  n_jobs: int = 0,
152
- ) -> Self | RunCollection[Self, I]:
152
+ ) -> Self | RunCollection[Self]:
153
153
  """Load a Run from a run directory.
154
154
 
155
155
  Args:
@@ -343,13 +343,13 @@ class Run[C, I = None]:
343
343
 
344
344
  def to_frame(
345
345
  self,
346
- func: Callable[[Self], DataFrame],
346
+ function: Callable[[Self], DataFrame],
347
347
  *keys: str | tuple[str, Any | Callable[[Self], Any]],
348
348
  ) -> DataFrame:
349
349
  """Convert the Run to a DataFrame.
350
350
 
351
351
  Args:
352
- func (Callable[[Run], DataFrame]): A function that takes a Run
352
+ function (Callable[[Run], DataFrame]): A function that takes a Run
353
353
  instance and returns a DataFrame.
354
354
  keys (str | tuple[str, Any | Callable[[Run], Any]]): The keys to
355
355
  add to the DataFrame.
@@ -358,7 +358,7 @@ class Run[C, I = None]:
358
358
  DataFrame: A DataFrame representation of the Run.
359
359
 
360
360
  """
361
- return func(self).with_columns(
361
+ return function(self).with_columns(
362
362
  self.lit(k) if isinstance(k, str) else self.lit(k[0], k[1]) for k in keys
363
363
  )
364
364
 
@@ -40,7 +40,6 @@ Note:
40
40
 
41
41
  from __future__ import annotations
42
42
 
43
- from functools import cached_property
44
43
  from typing import TYPE_CHECKING, overload
45
44
 
46
45
  import polars as pl
@@ -56,7 +55,7 @@ if TYPE_CHECKING:
56
55
  from polars import DataFrame
57
56
 
58
57
 
59
- class RunCollection[R: Run[Any, Any], I = None](Collection[R]):
58
+ class RunCollection[R: Run[Any, Any]](Collection[R]):
60
59
  """A collection of Run instances that implements the Sequence protocol.
61
60
 
62
61
  RunCollection provides methods for filtering, sorting, grouping, and analyzing
@@ -174,7 +173,7 @@ class RunCollection[R: Run[Any, Any], I = None](Collection[R]):
174
173
 
175
174
  def concat(
176
175
  self,
177
- func: Callable[[R], DataFrame],
176
+ function: Callable[[R], DataFrame],
178
177
  *keys: str | tuple[str, Any | Callable[[R], Any]],
179
178
  ) -> DataFrame:
180
179
  """Concatenate the results of a function applied to all runs in the collection.
@@ -183,26 +182,16 @@ class RunCollection[R: Run[Any, Any], I = None](Collection[R]):
183
182
  and concatenates the resulting DataFrames along the specified keys.
184
183
 
185
184
  Args:
186
- func (Callable[[R], DataFrame]): A function that takes a Run
185
+ function (Callable[[R], DataFrame]): A function that takes a Run
187
186
  instance and returns a DataFrame.
188
187
  keys (str | tuple[str, Any | Callable[[R], Any]]): The keys to
189
188
  add to the DataFrame.
190
189
 
191
190
  Returns:
192
- DataFrame: A DataFrame representation of the Run.
191
+ DataFrame: A DataFrame representation of the Run collection.
193
192
 
194
193
  """
195
- return pl.concat(run.to_frame(func, *keys) for run in self)
196
-
197
- @cached_property
198
- def impls(self) -> Collection[I]:
199
- """Get the implementation objects for all runs in the collection.
200
-
201
- Returns:
202
- Collection[I]: A collection of implementation objects for all runs.
203
-
204
- """
205
- return Collection(run.impl for run in self)
194
+ return pl.concat(run.to_frame(function, *keys) for run in self)
206
195
 
207
196
  def iterdir(self, relative_dir: str = "") -> Iterator[Path]:
208
197
  """Iterate over the artifact directories for all runs in the collection.
@@ -97,19 +97,15 @@ def test_run_echo():
97
97
  assert result.exit_code == 0
98
98
  out = result.stdout
99
99
  lines = out.splitlines()
100
- assert len(lines) == 5
101
- assert "['a', 'b', 'c', '--multirun', 'name=a', 'count=1,2,3'" in lines[1]
102
- assert "['a', 'b', 'c', '--multirun', 'name=b', 'count=1,2,3'" in lines[2]
103
- assert "['a', 'b', 'c', '--multirun', 'name=c', 'count=4,5,6'" in lines[3]
104
- assert "['a', 'b', 'c', '--multirun', 'name=d', 'count=4,5,6'" in lines[4]
100
+ assert "['a', 'b', 'c', '--multirun', 'name=a', 'count=1,2,3'" in lines[-4]
101
+ assert "['a', 'b', 'c', '--multirun', 'name=b', 'count=1,2,3'" in lines[-3]
102
+ assert "['a', 'b', 'c', '--multirun', 'name=c', 'count=4,5,6'" in lines[-2]
103
+ assert "['a', 'b', 'c', '--multirun', 'name=d', 'count=4,5,6'" in lines[-1]
105
104
 
106
105
 
107
106
  def test_submit():
108
107
  result = runner.invoke(app, ["run", "submit"])
109
108
  assert result.exit_code == 0
110
- out = result.stdout
111
- lines = out.splitlines()
112
- assert len(lines) == 1
113
109
  run_dirs = list(iter_run_dirs("mlruns", "submit"))
114
110
  assert len(run_dirs) == 4
115
111
 
@@ -53,7 +53,7 @@ def rc(run_factory):
53
53
  return RunCollection(runs, Run.get)
54
54
 
55
55
 
56
- type Rc = RunCollection[Run[Config, Impl], Impl]
56
+ type Rc = RunCollection[Run[Config, Impl]]
57
57
 
58
58
 
59
59
  def test_repr(rc: Rc):
@@ -289,9 +289,3 @@ def test_concat(rc: Rc):
289
289
  assert df["size.width"].to_list()[-6:] == [10, 10, 20, 20, 30, 30]
290
290
  assert df["z"].to_list()[:6] == [20, 20, 20, 20, 20, 20]
291
291
  assert df["z"].to_list()[-6:] == [40, 40, 40, 40, 40, 40]
292
-
293
-
294
- def test_impls(rc: Rc):
295
- impls = rc.impls
296
- assert len(impls) == 12
297
- assert len(impls.filter(lambda i: i.y[0] == "1")) == 6
@@ -52,7 +52,7 @@ def rc(run_factory):
52
52
  return RunCollection(runs, Run.get)
53
53
 
54
54
 
55
- type Rc = RunCollection[Run[Config, Impl], Impl]
55
+ type Rc = RunCollection[Run[Config, Impl]]
56
56
 
57
57
 
58
58
  def test_getitem_key(rc: Rc):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes