verifiers 0.2.2.dev49__py3-none-any.whl → 0.2.2.dev50__py3-none-any.whl

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.
@@ -5,7 +5,7 @@ from collections.abc import Sequence
5
5
  from pathlib import Path
6
6
  from typing import Any
7
7
 
8
- from pydantic import BaseModel, SerializeAsAny, model_validator
8
+ from pydantic import BaseModel, SerializeAsAny
9
9
 
10
10
  from verifiers.v1.clients import BaseClientConfig
11
11
  from verifiers.v1.types import ID, SamplingConfig
@@ -20,15 +20,8 @@ class JudgeConfig(BaseClientConfig):
20
20
  weight: float = 1.0
21
21
  model: str = "openai/gpt-5.4-nano"
22
22
  sampling: SamplingConfig = SamplingConfig()
23
- prompt: str | None = None
24
- prompt_file: Path | None = None
25
- """Prompt file override, mutually exclusive with `prompt`."""
26
-
27
- @model_validator(mode="after")
28
- def check_prompt_source(self) -> "JudgeConfig":
29
- if self.prompt is not None and self.prompt_file is not None:
30
- raise ValueError("set `prompt` or `prompt_file`, not both")
31
- return self
23
+ prompt: Path | None = None
24
+ """File whose text overrides the judge's default prompt template."""
32
25
 
33
26
 
34
27
  Judges = list[SerializeAsAny[JudgeConfig]]
@@ -1,5 +1,7 @@
1
1
  """The taskset plugin's config: which rows load, under `--env.taskset.*`."""
2
2
 
3
+ from pathlib import Path
4
+
3
5
  from pydantic import SerializeAsAny
4
6
  from pydantic_config import BaseConfig
5
7
 
@@ -14,6 +16,9 @@ class TasksetConfig(BaseConfig):
14
16
  positional `eval <taskset-id>`)."""
15
17
  task: SerializeAsAny[TaskConfig] = TaskConfig()
16
18
  """Config passed to each task, under `--env.taskset.task.*`."""
19
+ system_prompt: Path | None = None
20
+ """File whose text overrides each task's `TaskData.system_prompt` in
21
+ `Taskset.select` (e.g. a GEPA `best_system_prompt.txt`)."""
17
22
 
18
23
  @property
19
24
  def name(self) -> str:
@@ -180,41 +180,31 @@ class JudgeTask(vf.Task):
180
180
  class JudgeTaskConfig(vf.BaseConfig):
181
181
  """The judge's minted task: the grading policy and what lands in its box."""
182
182
 
183
- prompt: Path | str | None = None
184
- """Grading-policy override: inline text, or a policy file (a value ending in
185
- `.md`/`.txt` is read from disk). Replaces only the policy body — the verdict
186
- contract and workspace note are always appended, so a custom policy cannot
187
- break verdict scraping. May reference `{prompt}` (the solver task's prompt);
188
- if it doesn't, the task statement is appended after the policy."""
189
- hint: Path | str | None = None
190
- """Optional hints injected as their own section (inline text or a `.md`/
191
- `.txt` file): task-family pointers into the trace or box — e.g. for math,
192
- where the reference answer lives in the record; for SWE, to diff the repo
193
- or read `info.patch`."""
183
+ prompt: Path | None = None
184
+ """Grading-policy file. Replaces only the policy body — the verdict contract
185
+ and workspace note are always appended. May reference `{prompt}` (the solver
186
+ task's prompt); if it doesn't, the task statement is appended after."""
187
+ hint: Path | None = None
188
+ """Optional hints file injected as their own section: task-family pointers
189
+ into the trace or box — e.g. for math, where the reference answer lives in
190
+ the record; for SWE, to diff the repo or read `info.patch`."""
194
191
  rubric: Path | None = None
195
192
  """Criteria the judge grades against: a `.toml`/`.json` file with a
196
193
  `criteria` list — the plugged rubric judge's format, so the same rubric
197
194
  files work for both. None grades the single built-in `solved` criterion."""
198
195
 
199
- @staticmethod
200
- def _resolve(value: Path | str) -> str:
201
- path = Path(value)
202
- if isinstance(value, Path) or path.suffix in (".md", ".txt"):
203
- return path.read_text(encoding="utf-8")
204
- return str(value)
205
-
206
196
  def build_prompt(self) -> str:
207
197
  if self.prompt is None:
208
198
  return GRADE_PROMPT + "\n\n" + TASK_SECTION
209
- return self._resolve(self.prompt)
199
+ return self.prompt.read_text()
210
200
 
211
201
  def build_hint(self) -> str | None:
212
- return self._resolve(self.hint) if self.hint is not None else None
202
+ return self.hint.read_text() if self.hint is not None else None
213
203
 
214
204
  def criteria(self) -> list[Criterion]:
215
205
  if self.rubric is None:
216
206
  return [SOLVED]
217
- text = self.rubric.read_text(encoding="utf-8")
207
+ text = self.rubric.read_text()
218
208
  data = (
219
209
  tomllib.loads(text)
220
210
  if self.rubric.suffix.lower() == ".toml"
@@ -68,14 +68,10 @@ class GEPAAdapter:
68
68
  )
69
69
 
70
70
  async def _run_batch(self, batch: list[int], system_prompt: str) -> list[Episode]:
71
- # Inject the candidate by rebuilding each Task around a data row with the new
72
- # system_prompt (TaskData is frozen; behavior/config carry over unchanged).
73
- tasks = [
74
- type(t)(
75
- t.data.model_copy(update={"system_prompt": system_prompt}), t.config
76
- )
77
- for t in (self.tasks[idx] for idx in batch)
78
- ]
71
+ # Inject the candidate as a copy of each base task with its system_prompt overridden
72
+ # (`with_system_prompt` copies rather than reconstructs, so subclass state survives and
73
+ # the shared base task in `self.tasks` is left untouched for the next candidate).
74
+ tasks = [self.tasks[idx].with_system_prompt(system_prompt) for idx in batch]
79
75
  slots = [slot for task in tasks for slot in self.env.slots(task)]
80
76
  results = await asyncio.gather(
81
77
  *(
@@ -105,7 +105,20 @@ def run_gepa(env: Env, config: GEPAConfig) -> GEPAResult:
105
105
  "skip_perfect_score": False,
106
106
  "logger": _GEPALog(),
107
107
  }
108
- return optimize(**optimize_kwargs)
108
+ result = optimize(**optimize_kwargs)
109
+ if run_dir is not None:
110
+ # Persist the winning prompt as a plain file so it can be handed straight to
111
+ # eval/train via `--env.taskset.system-prompt` (see TasksetConfig).
112
+ candidate = result.best_candidate
113
+ best = (
114
+ candidate.get("system_prompt", "")
115
+ if isinstance(candidate, dict)
116
+ else str(candidate)
117
+ )
118
+ best_path = run_dir / "best_system_prompt.txt"
119
+ best_path.write_text(best, encoding="utf-8")
120
+ logger.info("best system prompt: %s", best_path)
121
+ return result
109
122
  finally:
110
123
  loop.run_until_complete(serving.__aexit__(None, None, None))
111
124
  finally:
verifiers/v1/judge.py CHANGED
@@ -116,13 +116,13 @@ def judge_config_cls(cls: type) -> type[JudgeConfig]:
116
116
 
117
117
  class Judge(Generic[ParsedT, ConfigT]):
118
118
  prompt: str | None = None
119
- """Default prompt template, overridden by config."""
119
+ """Default prompt template, overridden by a config `prompt` file."""
120
120
  schema: type[BaseModel] | None = None
121
121
 
122
122
  def __init__(self, config: ConfigT | None = None) -> None:
123
123
  self.config = cast(ConfigT, config or judge_config_cls(type(self))())
124
- if self.config.prompt_file is not None:
125
- self.prompt = self.config.prompt_file.read_text(encoding="utf-8")
124
+ if self.config.prompt is not None:
125
+ self.prompt = self.config.prompt.read_text()
126
126
 
127
127
  @property
128
128
  def reward_name(self) -> str:
@@ -132,7 +132,7 @@ class Judge(Generic[ParsedT, ConfigT]):
132
132
  return judge_key(self.config) or fallback or "judge"
133
133
 
134
134
  def build_messages(self, **fields: Any) -> str | Messages:
135
- template = self.config.prompt or self.prompt
135
+ template = self.prompt
136
136
  if template is None:
137
137
  raise ValueError(
138
138
  f"{type(self).__name__} has no `prompt`; set it or override build_messages"
verifiers/v1/task.py CHANGED
@@ -24,10 +24,11 @@ wraps it in the declared `Task` — one task type per taskset.
24
24
 
25
25
  from __future__ import annotations
26
26
 
27
+ import copy
27
28
  import inspect
28
29
  import logging
29
30
  from collections.abc import Mapping
30
- from typing import TYPE_CHECKING, ClassVar, Generic
31
+ from typing import TYPE_CHECKING, ClassVar, Generic, Self
31
32
 
32
33
  from pydantic import ConfigDict, Field
33
34
  from pydantic_config import BaseConfig
@@ -197,6 +198,15 @@ class Task(Generic[DataT, StateT, ConfigT]):
197
198
  self.data = data
198
199
  self.config = config if config is not None else task_config_cls(type(self))()
199
200
 
201
+ def with_system_prompt(self, system_prompt: str) -> Self:
202
+ """A shallow copy of this task with `data.system_prompt` overridden. Copies the
203
+ instance instead of reconstructing via `type(self)(...)`, so a subclass with a
204
+ non-`(data, config)` constructor or extra load-time state keeps it. Used to apply the
205
+ config-layer / GEPA system prompt (see `TasksetConfig` and `verifiers.v1.gepa`)."""
206
+ clone = copy.copy(self)
207
+ clone.data = self.data.model_copy(update={"system_prompt": system_prompt})
208
+ return clone
209
+
200
210
  def plugged_judges(self) -> list[Judge]:
201
211
  from verifiers.v1.loaders import load_judge
202
212
 
verifiers/v1/taskset.py CHANGED
@@ -79,10 +79,15 @@ class Taskset(Generic[TaskT, TasksetConfigT]):
79
79
  "taking the first %d generated tasks",
80
80
  num_tasks,
81
81
  )
82
- return list(itertools.islice(self.load(), num_tasks))
82
+ shuffle = False # can't materialize the whole taskset to sample from
83
83
  if shuffle:
84
- return sample(self.load(), shuffle=True, limit=num_tasks)
85
- return list(itertools.islice(self.load(), num_tasks))
84
+ tasks = sample(self.load(), shuffle=True, limit=num_tasks)
85
+ else:
86
+ tasks = list(itertools.islice(self.load(), num_tasks))
87
+ if self.config.system_prompt is not None:
88
+ override = self.config.system_prompt.read_text()
89
+ tasks = [t.with_system_prompt(override) for t in tasks]
90
+ return tasks
86
91
 
87
92
  def server_config(self, server_cls: type) -> BaseConfig:
88
93
  """The config a `tools` entry is built with, resolved off `self.config` (the
@@ -61,7 +61,6 @@ class LeanTaskConfig(TaskConfig):
61
61
  class LeanConfig(TasksetConfig):
62
62
  dataset: LeanDatasetConfig
63
63
  docker_image: str = DEFAULT_DOCKER_IMAGE
64
- system_prompt: str = DEFAULT_SYSTEM_PROMPT
65
64
  task: LeanTaskConfig = LeanTaskConfig()
66
65
 
67
66
 
@@ -187,7 +186,7 @@ class LeanTaskset(Taskset[LeanTask, LeanConfig]):
187
186
  idx=index,
188
187
  name=str(name) if name else f"task_{index:05d}",
189
188
  prompt=self._build_prompt(formal_statement, header),
190
- system_prompt=config.system_prompt,
189
+ system_prompt=DEFAULT_SYSTEM_PROMPT,
191
190
  image=config.docker_image,
192
191
  workdir=config.task.lean_project_path,
193
192
  resources=resources,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev49
3
+ Version: 0.2.2.dev50
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -175,7 +175,7 @@ verifiers/v1/episode.py,sha256=KWyM9ovTphEIo2260BYu2HvtnOOTxjLRDPrF_jTCiuA,2497
175
175
  verifiers/v1/errors.py,sha256=slZnrtqMo_BgXQV46wJJhV6vvAAnVsuCbVGp2vBVWfs,6888
176
176
  verifiers/v1/graph.py,sha256=-j8MNdIv1r5ifajv5ggnGPsfBNB74IO3WKLcrpYh9hg,29102
177
177
  verifiers/v1/harness.py,sha256=cDiDuhp29aqL4CxiqSZz-IT0QlOcVlye_vTTHZblWo8,10948
178
- verifiers/v1/judge.py,sha256=VnTi9iSfCJMCccYWc1qCTcT7iD3AcomS2cXfHwh1HVw,9423
178
+ verifiers/v1/judge.py,sha256=UmBcEmyY30Zod-Nnvj8UTSyvee5NAjBJE9ufPrwTiTw,9391
179
179
  verifiers/v1/legacy.py,sha256=nkbdhFJZN1QzsjE42AB_A_c1zrk3_Y8zR07srZJS2ck,22584
180
180
  verifiers/v1/loaders.py,sha256=TnNKY2msVo3p7m-5wjw376PYH-zTu3TLixXRst0VOiM,9985
181
181
  verifiers/v1/push.py,sha256=MWZmvyj0iyzNIO0xRhlkCXtFF1plq6EJi8rWlvrFtvI,11363
@@ -184,8 +184,8 @@ verifiers/v1/rollout.py,sha256=GJzHgJFlw8O1vDtWM__2JhSiG2GqbfjtH2ri1MRfw3g,20495
184
184
  verifiers/v1/scoring.py,sha256=-R5Cog14r_tJ6Q_oOfGr5VPAm2CCUhofYZB6B9lm4wM,5787
185
185
  verifiers/v1/session.py,sha256=J6ZPuvsg6vMTJAs9dMUMtfdjCuvp6Hom877DVdKFKlY,6912
186
186
  verifiers/v1/state.py,sha256=R8tyQv8nsFV2pztrquDqCOa1Mk1fAp3w2GjqUugZwE0,689
187
- verifiers/v1/task.py,sha256=ad2YgS7ZeeBdezyWpuexLeGsCyIk5uuUJ061LXrYJ88,11074
188
- verifiers/v1/taskset.py,sha256=PX1-skAVhSpGF07qjxcG0Ctmq1LiMftMxxok-uc8qRY,3939
187
+ verifiers/v1/task.py,sha256=tmsxn1YLsgIIRrCqueBXvoupXhFks61_GNiMVTs495k,11652
188
+ verifiers/v1/taskset.py,sha256=gkDqK_1SEU-oyDaqcv1fykyTZc9Hlub_Npe6bajhmPY,4175
189
189
  verifiers/v1/trace.py,sha256=9KqBeGaRUtWh6Gpdf6G1c7UZso0DB9Mjmtkzl6I_oYE,19458
190
190
  verifiers/v1/types.py,sha256=5tZyG4r4bLJ9a14oybHy7bSCpt5X5A17eRwmIszuRo8,9118
191
191
  verifiers/v1/acp/__init__.py,sha256=9dwH6fLopNndRmcpRSYC8ghzzMquaLfgh645QM-Dwic,2189
@@ -217,12 +217,12 @@ verifiers/v1/configs/__init__.py,sha256=X7u6X7B3ieD1HZl79Tv1kg-yPHbT0QLvAebaGqxV
217
217
  verifiers/v1/configs/agent.py,sha256=N2Lm0iZXFxfsSIiXUQ7f3RDZcoin3M7pJj6HVdCE5eo,3537
218
218
  verifiers/v1/configs/env.py,sha256=4aUap3BJX3WCA2_fZ-jGPxF3khiVpORqmz_3eBT4j9w,7824
219
219
  verifiers/v1/configs/harness.py,sha256=CG8hGbHl3rr6yawH3YYMAFl01M7Piiwf4w5oiw2Vagg,1564
220
- verifiers/v1/configs/judge.py,sha256=ZJlmWogHY8oDjvWvtNuVKvkzuheWalIjl1njJ4dE0Mk,2511
220
+ verifiers/v1/configs/judge.py,sha256=eEVtBGjAOmm1sSRd_UHVBpJEfUxMHxHDBFnvchmxs-w,2217
221
221
  verifiers/v1/configs/legacy.py,sha256=YOJM6L5u6-jYpZ1CLpPInufKdmz1lEsMNKIRdT2JaaY,1080
222
222
  verifiers/v1/configs/retries.py,sha256=-nPlgmz7J_NZ4GOYG6oCc3thXo4La2SufBmvQGvvPGo,821
223
223
  verifiers/v1/configs/serve.py,sha256=cHHnFGQtqEwvaovdeoVMpCebTHgPXKUuIivN5IhxZR0,2596
224
224
  verifiers/v1/configs/task.py,sha256=1ozZjfpahin7I_TqzC7f3xr7CHSthAdydegFPXW4d9k,1101
225
- verifiers/v1/configs/taskset.py,sha256=IdZwsarn0_WvYdR_Kr4QYYdqbaoGYkbYyO5VA-RPYPc,657
225
+ verifiers/v1/configs/taskset.py,sha256=-WfRRRDvLwV4v4QoBtHegYNAHExM1nCR7TZjJyNv_aA,858
226
226
  verifiers/v1/configs/cli/__init__.py,sha256=3wBAONw5XkBPqbMjpHk5XBHlBVybR8JQ2JCPWijYBMU,444
227
227
  verifiers/v1/configs/cli/debug.py,sha256=3lkKqmQFLJBcUZECChBHCrod5pbCKSmT47EhjILrxjI,2843
228
228
  verifiers/v1/configs/cli/env.py,sha256=XgjRXYpPjga0ZYIHEESY7VuVvtE6pWfAzf6JBLeuTIc,2695
@@ -238,7 +238,7 @@ verifiers/v1/dialects/chat.py,sha256=R_otqi5N0snB1QVKIYloNeLHR9kc7OmI06HYg1ir_Lw
238
238
  verifiers/v1/dialects/responses.py,sha256=ismnxUikPcPUIm80FUTPBbj-Cn1e0yGAsISMEseAWRc,13679
239
239
  verifiers/v1/envs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
240
  verifiers/v1/envs/agentic_judge/__init__.py,sha256=X7vQbbbfmJ_j-mJEfBkuB4a8QUPkUYkpG7yp0xYOEmg,279
241
- verifiers/v1/envs/agentic_judge/env.py,sha256=3XhGiMdKJBhpSyUdlfYYKPIR42Ll34WUvEFqbCtKdX8,15342
241
+ verifiers/v1/envs/agentic_judge/env.py,sha256=2g9yz3QfYUc_OZBkxzWOEKsGiT51siYMKB7PwvbCY2E,14878
242
242
  verifiers/v1/envs/best_of_n/__init__.py,sha256=mubASiwXMNIhnQFDccNAc7yZ0OFsOVK8hH8WIx9b2A4,119
243
243
  verifiers/v1/envs/best_of_n/env.py,sha256=KEUJBCVqblnXP_lEwm3mjGdaikBMkecz8UjOFPBhxc0,1987
244
244
  verifiers/v1/envs/single_agent/__init__.py,sha256=r0edAc_6gtHBhPzeBGVcdHZZqSdCPZnLMje6eVgyz5U,138
@@ -246,11 +246,11 @@ verifiers/v1/envs/single_agent/env.py,sha256=lPs_a6VA7KoH1xqA3T8S32Jzb_d4zrx0_54
246
246
  verifiers/v1/envs/user_sim/__init__.py,sha256=nnT695HdqjAEouYL5wtVu6MhIp2wf5yuK-EYgxOVx0s,118
247
247
  verifiers/v1/envs/user_sim/env.py,sha256=9L_KXjzfkTnDeQpn4ftQagZyPkJ3yjcQeZqZaq7kxjE,4567
248
248
  verifiers/v1/gepa/__init__.py,sha256=6nmdRE0-34AKioPHBjTxUg5Jo_2z7tMX-OU3zMNpAJI,197
249
- verifiers/v1/gepa/adapter.py,sha256=my7hM6GSzOw__F7Ot1E-XA_OhZyovhgbJ7fOQkW66l8,6149
249
+ verifiers/v1/gepa/adapter.py,sha256=YNvHMR2L5Utl-vtPfjZxmDCd2tTcoAPWG6aVGnV1icM,6139
250
250
  verifiers/v1/gepa/config.py,sha256=gFn8Re4GoeHJs2PZ-iw4jCEZ72AiM1lNgwaA0uvJlYw,4626
251
251
  verifiers/v1/gepa/dataset.py,sha256=N2QYqUljHVuAdCbUuydEIlarvAWa6LFdGKu9qsOvjro,2186
252
252
  verifiers/v1/gepa/reflection.py,sha256=ptHhx0lcDLcWhWhXuslh9T8gPVNpnX5XLPtXoneW1yA,1054
253
- verifiers/v1/gepa/runner.py,sha256=o7Am2Ram-Ejbr_tVpN70zb0uQ5a1NIpXvlMhwWL22Xs,5406
253
+ verifiers/v1/gepa/runner.py,sha256=6iJj2HFiC-NZbontq7P9lzzyeq6B0sRBz6trhxrkIW0,6075
254
254
  verifiers/v1/harnesses/__init__.py,sha256=3fgfAMzFrNgu7RIO_evZPxipPdiskiHun5EKsdS4y6k,1301
255
255
  verifiers/v1/harnesses/bash/__init__.py,sha256=IAV4eMMqDHSl-9ANb0Q3kxmBZ22SeHZFBM448X4gQio,140
256
256
  verifiers/v1/harnesses/bash/harness.py,sha256=ZtjhsANuK3vXkf9mRCi8-sBMyPebJMBNHa58vTd2Fm8,5284
@@ -311,7 +311,7 @@ verifiers/v1/tasksets/harbor/__init__.py,sha256=wwVGA8N7E2Q2qA5WGHuLRrn4DgG5oaRH
311
311
  verifiers/v1/tasksets/harbor/taskset.py,sha256=2Iw1ZaPRhRjdbfClRLd0iqKWABjM7M525zFN4wuaeCk,13867
312
312
  verifiers/v1/tasksets/lean/__init__.py,sha256=oyv-GbJQBvCyGwo7Ysxm2NjZW-aX4j1uDoHU0f-E7xQ,767
313
313
  verifiers/v1/tasksets/lean/scoring.py,sha256=sfzsT6MUK0zdMgAQ57_P_0CBaPHy3M7go71QMr5hDrs,10599
314
- verifiers/v1/tasksets/lean/taskset.py,sha256=0KujQgx2fTL_DyWSQidebKoD94U8oJp82PXoco6-3B4,9065
314
+ verifiers/v1/tasksets/lean/taskset.py,sha256=Fcn4UgTcdjMYnJ4CThaFZ28Rz_QDx0e21vJdW_vp12g,9019
315
315
  verifiers/v1/tasksets/openenv/__init__.py,sha256=G726meYYDplC3QE3AyjdSShq7FUcb4NkVqowuwPPuJk,303
316
316
  verifiers/v1/tasksets/openenv/taskset.py,sha256=1Wc9-5eN2HMKAwL34yTNex3zYOvXNXibF5wCROoMbFI,6075
317
317
  verifiers/v1/tasksets/textarena/__init__.py,sha256=Os2OlBY_pSH0B1DP32RitumgSLpq2LtcI7VDUHYPzRE,329
@@ -329,8 +329,8 @@ verifiers/v1/utils/logging.py,sha256=OcMHA6NsYux3oIzjPuI95rDWmFBHNcHDjZeNIhXTX-Y
329
329
  verifiers/v1/utils/memory.py,sha256=ZkIvGk6uITAH5sKon65LifKPbvZr8mJ__PVc23FZpOQ,1835
330
330
  verifiers/v1/utils/sampling.py,sha256=JczGzBn6s3wsIrSY2Hy3hE8m6NreNgsNzhSjDikQqX0,1037
331
331
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
332
- verifiers-0.2.2.dev49.dist-info/METADATA,sha256=58Q74xtCzA2vwqY2VjgOgFdSvyqzrV2vAyCCkgjOrCo,4545
333
- verifiers-0.2.2.dev49.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
334
- verifiers-0.2.2.dev49.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
335
- verifiers-0.2.2.dev49.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
336
- verifiers-0.2.2.dev49.dist-info/RECORD,,
332
+ verifiers-0.2.2.dev50.dist-info/METADATA,sha256=CmQlOqkHtzYaf_70Po3zu37d6_rPDPvoKZUZXjLBsfs,4545
333
+ verifiers-0.2.2.dev50.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
334
+ verifiers-0.2.2.dev50.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
335
+ verifiers-0.2.2.dev50.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
336
+ verifiers-0.2.2.dev50.dist-info/RECORD,,