rbx.cp 0.5.47__py3-none-any.whl → 0.5.49__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.
rbx/box/environment.py CHANGED
@@ -343,7 +343,7 @@ def get_extension(name: str, _: Type[T]) -> Optional[T]:
343
343
  pkg = get_environment()
344
344
  if pkg.extensions is None:
345
345
  return None
346
- if hasattr(pkg.extensions, name):
346
+ if not hasattr(pkg.extensions, name):
347
347
  return None
348
348
  return getattr(pkg.extensions, name)
349
349
 
rbx/box/naming.py ADDED
@@ -0,0 +1,22 @@
1
+ from typing import Optional
2
+
3
+ from rbx.box import package
4
+ from rbx.box.contest import contest_package
5
+
6
+
7
+ def get_problem_shortname() -> Optional[str]:
8
+ contest = contest_package.find_contest_package()
9
+ if contest is None:
10
+ return None
11
+ problem_path = package.find_problem()
12
+ contest_path = contest_package.find_contest()
13
+
14
+ for problem in contest.problems:
15
+ if problem.path is None:
16
+ continue
17
+ if (problem_path / 'problem.rbx.yml').samefile(
18
+ contest_path / problem.path / 'problem.rbx.yml'
19
+ ):
20
+ return problem.short_name
21
+
22
+ return None
@@ -11,6 +11,7 @@ class BocaExtension(BaseModel):
11
11
  languages: typing.List[BocaLanguage] = list(typing.get_args(BocaLanguage))
12
12
  flags: typing.Dict[BocaLanguage, str] = {}
13
13
  maximumTimeError: float = _MAX_REP_ERROR
14
+ preferContestLetter: bool = False
14
15
 
15
16
  def flags_with_defaults(self) -> typing.Dict[BocaLanguage, str]:
16
17
  res: typing.Dict[BocaLanguage, str] = {
@@ -6,7 +6,7 @@ from typing import List
6
6
  import typer
7
7
 
8
8
  from rbx import console
9
- from rbx.box import package
9
+ from rbx.box import naming, package
10
10
  from rbx.box.environment import get_extension_or_default
11
11
  from rbx.box.packaging.boca.extension import BocaExtension, BocaLanguage
12
12
  from rbx.box.packaging.packager import BasePackager, BuiltStatement
@@ -52,14 +52,20 @@ class BocaPackager(BasePackager):
52
52
  raise typer.Exit(1)
53
53
 
54
54
  def _get_problem_name(self) -> str:
55
- pkg = package.find_problem_package_or_die()
56
55
  # BOCA forces Java class names to be the name of the problem.
57
- return pkg.name.replace('-', '_')
56
+ return self.package_basename().replace('-', '_')
57
+
58
+ def _get_problem_basename(self) -> str:
59
+ extension = get_extension_or_default('boca', BocaExtension)
60
+ shortname = naming.get_problem_shortname()
61
+ if extension.preferContestLetter and shortname is not None:
62
+ return shortname
63
+ return self._get_problem_name()
58
64
 
59
65
  def _get_problem_info(self) -> str:
60
66
  statement = self._get_main_statement()
61
67
  return (
62
- f'basename={self._get_problem_name()}\n'
68
+ f'basename={self._get_problem_basename()}\n'
63
69
  f'fullname={statement.title}\n'
64
70
  f'descfile={self._get_problem_name()}.pdf\n'
65
71
  )
@@ -24,14 +24,6 @@ class MojPackager(BocaPackager):
24
24
  def task_types(cls) -> List[TaskType]:
25
25
  return [TaskType.COMMUNICATION, TaskType.BATCH]
26
26
 
27
- def _get_problem_info(self) -> str:
28
- statement = self._get_main_statement()
29
- return (
30
- f'basename={self._get_problem_name()}\n'
31
- f'fullname={statement.title}\n'
32
- f'descfile={self._get_problem_name()}.pdf\n'
33
- )
34
-
35
27
  def _get_tl(self) -> str:
36
28
  extension = get_extension_or_default('boca', BocaExtension)
37
29
 
@@ -237,8 +229,6 @@ class MojPackager(BocaPackager):
237
229
  (outputs_path / f'{i + 1:03d}').touch()
238
230
 
239
231
  # Zip all.
240
- shutil.make_archive(
241
- str(build_path / self._get_problem_name()), 'zip', into_path
242
- )
232
+ shutil.make_archive(str(build_path / self.package_basename()), 'zip', into_path)
243
233
 
244
- return (build_path / self._get_problem_name()).with_suffix('.zip')
234
+ return (build_path / self.package_basename()).with_suffix('.zip')
@@ -3,7 +3,7 @@ import pathlib
3
3
  from abc import ABC, abstractmethod
4
4
  from typing import List, Tuple
5
5
 
6
- from rbx.box import package
6
+ from rbx.box import naming, package
7
7
  from rbx.box.contest import contest_package
8
8
  from rbx.box.contest.schema import ContestProblem, ContestStatement
9
9
  from rbx.box.generators import get_all_built_testcases
@@ -50,6 +50,13 @@ class BasePackager(ABC):
50
50
  res.add(statement.language)
51
51
  return list(res)
52
52
 
53
+ def package_basename(self):
54
+ pkg = package.find_problem_package_or_die()
55
+ shortname = naming.get_problem_shortname()
56
+ if shortname is not None:
57
+ return f'{shortname}-{pkg.name}'
58
+ return pkg.name
59
+
53
60
  def statement_types(self) -> List[StatementType]:
54
61
  return [StatementType.PDF]
55
62
 
rbx/box/schema.py CHANGED
@@ -356,8 +356,8 @@ class LimitModifiers(BaseModel):
356
356
  class ValidatorTest(BaseModel):
357
357
  model_config = ConfigDict(extra='forbid')
358
358
 
359
- input: pathlib.Path = Field(
360
- description='The input file to be used as unit test input for the validator.'
359
+ glob: str = Field(
360
+ description='A glob pattern for the input files to be used as unit test input for the validator.'
361
361
  )
362
362
  outcome: ValidatorOutcome = Field(
363
363
  default=ValidatorOutcome.VALID,
@@ -373,17 +373,12 @@ class ValidatorTest(BaseModel):
373
373
  class CheckerTest(BaseModel):
374
374
  model_config = ConfigDict(extra='forbid')
375
375
 
376
- input: Optional[pathlib.Path] = Field(
377
- default=None,
378
- description='The input file to be used as unit test input for the checker. If not specified, will pass an empty file.',
379
- )
380
- output: Optional[pathlib.Path] = Field(
381
- default=None,
382
- description='The solution output file to be used as unit test output for the checker. If not specified, will pass an empty file.',
383
- )
384
- answer: Optional[pathlib.Path] = Field(
385
- default=None,
386
- description='The answer file to be used as unit test answer for the checker. If not specified, will pass an empty file.',
376
+ glob: str = Field(
377
+ description="""
378
+ A glob pattern for the files to be used as unit test input for the checker.
379
+ This glob should simultaneously match the input, output, and answer files (.in, .out, .ans).
380
+ If one of them is not present, an empty file will be used instead.
381
+ """,
387
382
  )
388
383
 
389
384
  outcome: ExpectedOutcome = Field(
@@ -7,7 +7,7 @@ import syncer
7
7
  import typer
8
8
 
9
9
  from rbx import annotations, console
10
- from rbx.box import environment, package
10
+ from rbx.box import environment, naming, package
11
11
  from rbx.box.schema import Package
12
12
  from rbx.box.statements.builders import (
13
13
  BUILDER_LIST,
@@ -291,6 +291,7 @@ def build_statement(
291
291
  output_type=output_type,
292
292
  use_samples=use_samples,
293
293
  is_editorial=is_editorial,
294
+ short_name=naming.get_problem_shortname(),
294
295
  )
295
296
  statement_path = (
296
297
  package.get_build_path()
rbx/box/unit.py CHANGED
@@ -1,14 +1,79 @@
1
- from typing import List, Optional
1
+ import pathlib
2
+ from typing import List, Optional, Set
2
3
 
3
4
  import syncer
5
+ from pydantic import BaseModel
4
6
 
5
7
  from rbx import console
6
8
  from rbx.box import checkers, package, validators
7
- from rbx.box.schema import CodeItem, Testcase, ValidatorOutcome, ValidatorTest
9
+ from rbx.box.schema import (
10
+ CheckerTest,
11
+ CodeItem,
12
+ ExpectedOutcome,
13
+ Testcase,
14
+ ValidatorOutcome,
15
+ ValidatorTest,
16
+ )
8
17
  from rbx.utils import StatusProgress
9
18
 
10
19
 
11
- def _get_validator_for_test(test: ValidatorTest) -> Optional[CodeItem]:
20
+ class ValidatorTestEntry(BaseModel):
21
+ input: pathlib.Path
22
+ outcome: ValidatorOutcome
23
+ validator: Optional[CodeItem]
24
+
25
+
26
+ class CheckerTestEntry(BaseModel):
27
+ input: Optional[pathlib.Path] = None
28
+ output: Optional[pathlib.Path] = None
29
+ answer: Optional[pathlib.Path] = None
30
+ outcome: ExpectedOutcome
31
+
32
+
33
+ def _extract_validator_test_entries(
34
+ tests: List[ValidatorTest],
35
+ ) -> List[ValidatorTestEntry]:
36
+ res: List[ValidatorTestEntry] = []
37
+ for test in tests:
38
+ for input in pathlib.Path().glob(str(test.glob)):
39
+ if not input.is_file():
40
+ continue
41
+ res.append(
42
+ ValidatorTestEntry(
43
+ input=input, outcome=test.outcome, validator=test.validator
44
+ )
45
+ )
46
+ return sorted(res, key=lambda x: x.input.name)
47
+
48
+
49
+ def _extract_checker_test_entries(tests: List[CheckerTest]) -> List[CheckerTestEntry]:
50
+ res: List[CheckerTestEntry] = []
51
+ seen: Set[pathlib.Path] = set()
52
+ for test in tests:
53
+ for file in pathlib.Path().glob(str(test.glob)):
54
+ if not file.is_file():
55
+ continue
56
+ if file.suffix not in ['.in', '.out', '.ans']:
57
+ continue
58
+ basefile = file.with_suffix('')
59
+ if basefile in seen:
60
+ continue
61
+ seen.add(basefile)
62
+ input = basefile.with_suffix('.in')
63
+ output = basefile.with_suffix('.out')
64
+ answer = basefile.with_suffix('.ans')
65
+ res.append(
66
+ CheckerTestEntry(
67
+ input=input if input.is_file() else None,
68
+ output=output if output.is_file() else None,
69
+ answer=answer if answer.is_file() else None,
70
+ outcome=test.outcome,
71
+ )
72
+ )
73
+ return res
74
+
75
+
76
+ def _get_validator_for_test(test: ValidatorTestEntry) -> Optional[CodeItem]:
12
77
  pkg = package.find_problem_package_or_die()
13
78
  if test.validator is not None:
14
79
  return test.validator
@@ -18,8 +83,10 @@ def _get_validator_for_test(test: ValidatorTest) -> Optional[CodeItem]:
18
83
  async def run_validator_unit_tests(progress: StatusProgress):
19
84
  pkg = package.find_problem_package_or_die()
20
85
 
86
+ entries = _extract_validator_test_entries(pkg.unitTests.validator)
87
+
21
88
  vals: List[CodeItem] = []
22
- for test in pkg.unitTests.validator:
89
+ for test in entries:
23
90
  val = _get_validator_for_test(test)
24
91
  if val is not None:
25
92
  vals.append(val)
@@ -31,7 +98,7 @@ async def run_validator_unit_tests(progress: StatusProgress):
31
98
 
32
99
  console.console.rule('Validator tests', style='info')
33
100
 
34
- for i, test in enumerate(pkg.unitTests.validator):
101
+ for i, test in enumerate(entries):
35
102
  val = _get_validator_for_test(test)
36
103
  if val is None:
37
104
  console.console.print(
@@ -82,8 +149,9 @@ async def run_checker_unit_tests(progress: StatusProgress):
82
149
  console.console.rule('Checker tests', style='info')
83
150
 
84
151
  empty_file = package.get_empty_sentinel_path()
152
+ entries = _extract_checker_test_entries(pkg.unitTests.checker)
85
153
 
86
- for i, test in enumerate(pkg.unitTests.checker):
154
+ for i, test in enumerate(entries):
87
155
  result = await checkers.check(
88
156
  compiled_digest,
89
157
  run_log=None,
rbx/grading/steps.py CHANGED
@@ -332,7 +332,7 @@ def _expand_part(part: str, sandbox: SandboxBase) -> List[str]:
332
332
 
333
333
  def _split_and_expand(command: str, sandbox: SandboxBase) -> List[str]:
334
334
  res = []
335
- parts = shlex.split(command.format(memory=sandbox.params.address_space))
335
+ parts = shlex.split(command.format(memory=sandbox.params.address_space or 2048))
336
336
  for part in parts:
337
337
  res.extend(_expand_part(part, sandbox))
338
338
  return res
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.5.47
3
+ Version: 0.5.49
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9,<4.0
@@ -19,7 +19,7 @@ rbx/box/contest/statements.py,sha256=Or8gFb6P_oViGdeiVgepXsvd_W84mA7LRaVmiAXWWSg
19
19
  rbx/box/creation.py,sha256=Evz7K6JoarD-4JJQsZsgoxU9FgCF9Z7-LfuroG4Cqls,2444
20
20
  rbx/box/deferred.py,sha256=II3X9e87JCOZtmspnHh-n4PFqh-FsH_oc0XJHZ9ZYVQ,691
21
21
  rbx/box/download.py,sha256=MFP-R26JiYGAP89I0TK-0fYc69Fsd20tsBqgtRCy5AE,2234
22
- rbx/box/environment.py,sha256=47NtyuVC6zSQKAtQaXPEXvqcD-KJiuWRpWF8pYvcG4c,11158
22
+ rbx/box/environment.py,sha256=S-OLvR2_Nac8m923b9AtDhOY3goRJXlPA_I3s7BeDqQ,11162
23
23
  rbx/box/extensions.py,sha256=Von8kIeXvNFTkGlMRMTvL2HIHPwlkuiMswr-ydbGV1w,519
24
24
  rbx/box/formatting.py,sha256=3phFRHzqVXj4Ok1yDhCq6Clbw6KlqwJNpMhs--oTWFI,405
25
25
  rbx/box/generators.py,sha256=5-3K0JSLR9GbV0LmOkvNsWiQaMvhFBrI56ZaV1WgodQ,13472
@@ -27,13 +27,14 @@ rbx/box/generators_test.py,sha256=J7aBfuJhU84MWDWzgReRoOuQw_hVa09B8gTKAvL2XVo,19
27
27
  rbx/box/lazy_importing_main.py,sha256=6Z8As7qVFFT619xHH9Xt8VCH57NjC4aDxfAgkWiUwT8,116
28
28
  rbx/box/lazy_importing_test.py,sha256=B0-b3y_DkxEmtVfu4NfmVsgVdFl6kRCsEL6GLMHJISo,628
29
29
  rbx/box/main.py,sha256=Imwc0ZkheOpa5r8S0Xpb8RLQzJgxb9vyuSR4_wab11g,43
30
+ rbx/box/naming.py,sha256=n3Nvw2MuWtAjywDxYDV5gg22Upf8Ap1lYavo0o46SRA,612
30
31
  rbx/box/package.py,sha256=YuX_FS6yKx6FaFz0NF0cx3v6jzhqwvsLr3Oprx_TTJA,13645
31
- rbx/box/packaging/boca/extension.py,sha256=hQhcbocNfW2ESv5RalS1wf6uvOoOfOnR_gHvbXUbSzY,852
32
- rbx/box/packaging/boca/packager.py,sha256=X21vxdl9gY53s5fJ0YMFHHQrf1Ch6-d59nAsxr1YFR8,12236
32
+ rbx/box/packaging/boca/extension.py,sha256=EQALNEOv4zVDXSKs_dk11n92y7cBZVn8TogIK683lE0,890
33
+ rbx/box/packaging/boca/packager.py,sha256=CUMoQICrkQQBFElmI9SrvXlFFnpwkTiJ9qbOSJOy6AE,12512
33
34
  rbx/box/packaging/contest_main.py,sha256=nMdgPE4OK_tsnUMdRI1cJwLpgxGrwW_mJjox0oOALWw,2757
34
35
  rbx/box/packaging/main.py,sha256=RXGcpVZTwqkdLs4wHwoHSiFTXW62jIUS5fnvSKu3Ymw,2998
35
- rbx/box/packaging/moj/packager.py,sha256=XMv7tqdrL6R7dX6ZZcNGCmqVrKhBYuMf5NW9VuE7U80,8792
36
- rbx/box/packaging/packager.py,sha256=_NqRk1u2Q8SUhad-aRJk0Vox74MjW5msGPdpWZ_LzAk,3386
36
+ rbx/box/packaging/moj/packager.py,sha256=Ro_TO3RVCCRAxNcCio0u42TLfW8FnX9IohMChmGlrvo,8499
37
+ rbx/box/packaging/packager.py,sha256=da2haC1L9cG30myneMrRIAdGubtid0Xmy38BHKPCZZ4,3633
37
38
  rbx/box/packaging/polygon/packager.py,sha256=qTGOUckevdOCt_ES63pN3uhmhDl9JuNcZ1XEnGNq-tU,10833
38
39
  rbx/box/packaging/polygon/test.py,sha256=bgEju5PwudgyfwxXJagm8fM6CJVlWM6l_-2q1V-oKaQ,3069
39
40
  rbx/box/packaging/polygon/xml_schema.py,sha256=-r24bCeRMGLrGGoT9FIgmqr87xHL-JzrFaR6bztbYtw,2703
@@ -43,13 +44,13 @@ rbx/box/presets/lock_schema.py,sha256=6sRPnyePOC8yy-5WcD5JRZdDJHf8loqbvpQ1IPiOU9
43
44
  rbx/box/presets/schema.py,sha256=mZmSPkQsw7eQM0lQN6er1MO_LiW1ObwwAZFDK0F5fxE,1962
44
45
  rbx/box/retries.py,sha256=tRk2K1bXw2xnwkAj2CsktRHTEhw7YKcPxMQTT6mCy-E,4707
45
46
  rbx/box/sanitizers/warning_stack.py,sha256=RI97_GJgdjTKIXY_r0EKp5h0qQQSDSdNDh5K7zINrqs,2861
46
- rbx/box/schema.py,sha256=P1jVaeqe4OcotAJOqu3T5WD8DR-amZyyq3cau5rPiM8,17086
47
+ rbx/box/schema.py,sha256=tOQ1tLHqc_5V-UgrzM44aS8ULAkq-IkeErxjLCFVA8I,16778
47
48
  rbx/box/setter_config.py,sha256=s53talhwM6FTGDCcBhY7IlZ6_6mJ3PMp6V4kTtaSs50,4262
48
49
  rbx/box/solutions.py,sha256=b4P6JN4eSDFiUKjBYvI38jsf8wLxS8Wi-YwBmm25Rcg,42684
49
50
  rbx/box/solutions_test.py,sha256=TCowbxBG3SvDlFO5-qtBj_M_HrAHe0IJaI1XwoQ1d00,1718
50
51
  rbx/box/state.py,sha256=MMf3DvfQji0jKEliCHct2Tpp_0epL1tvP8HbHNArQIc,166
51
52
  rbx/box/statements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- rbx/box/statements/build_statements.py,sha256=uHlC3y3PtKaGUd2ZS_zYxi6-AKco6v_yd-lvm6BfrNA,12091
53
+ rbx/box/statements/build_statements.py,sha256=6przkQWy70ixDbqWMZmBgncaoWg67RY1gPdQ4TPjaTE,12150
53
54
  rbx/box/statements/builders.py,sha256=6lYV-cnC-NXMnJf1wasbq_AMbjdIuPpMirm7QsjZI6s,11825
54
55
  rbx/box/statements/joiners.py,sha256=jItNXkAbTjFQpPMgfDMW86n3vMTbaE8sgo9I8Yf4Txg,2886
55
56
  rbx/box/statements/latex.py,sha256=LkcHwXjMFxbw--Gj9T1VkFKQFsXhY9dN7xZHpZycNW8,1346
@@ -69,7 +70,7 @@ rbx/box/ui/captured_log.py,sha256=ptICDPViVnz-_2NfrcB0SSBXNW5L74zI-vAZNN7kSok,11
69
70
  rbx/box/ui/css/app.tcss,sha256=apd5PkPEvl5jK3kE2qrxPyVED1VnvSsj08QQwzUPwEA,786
70
71
  rbx/box/ui/main.py,sha256=b0rHcBF42W4AOCv7WhtiGf_rUnY0yxpqO5oj3wfR4R4,984
71
72
  rbx/box/ui/run.py,sha256=wMEXrEFdQvMHz2hRKAFIithTnTtaL0kNQZu0jKmb8jI,7060
72
- rbx/box/unit.py,sha256=veyBuz_7AbDFbdWi02jq_zLwXEkmgt0djXgVJU-OYCU,3755
73
+ rbx/box/unit.py,sha256=ziyfgU4gmmNqKucMYYiJksOHkp22pxYpgk7dpX2mSQM,5793
73
74
  rbx/box/validators.py,sha256=oqlNhw7jivbbH5l8g3xwihPRy76AM7MA3G4A8nyI_V0,10416
74
75
  rbx/box/validators_test.py,sha256=WY4Ho-wlsPHc0YNuz0KFVd6KQ9ouuiou3w5_zMOZ4Fs,362
75
76
  rbx/checker.py,sha256=pj1jO3my48ru-qugbER5onccANCjoR0-PaFe3H3VGEY,4118
@@ -94,7 +95,7 @@ rbx/grading/judge/storage.py,sha256=3vv0HvtenbUZBH33CB5ZzX66ppL22G6munBaAA9BgwQ,
94
95
  rbx/grading/judge/test.py,sha256=ll0Iw7zyOpGdKPD_PGH7dvUkb4stQLu-ikbQnqJvuAc,944
95
96
  rbx/grading/judge/testiso.py,sha256=v14DtkWiZFJ9AKMzrb0_vZKPWDt8jz8iIw1Z2O-Advk,1397
96
97
  rbx/grading/processing_context.py,sha256=2fxa610WzXGvICDVWkPCG721w-1tXDVT7w_KtSnD0OM,1213
97
- rbx/grading/steps.py,sha256=nfZpHeoWK8d9Sm-5Zi5pYYpSdYIVvpTf88A6_C3QGyU,25744
98
+ rbx/grading/steps.py,sha256=RpA6HjQ4NaZLMryyFFGBW53QojLoD9VH5yjuZMycWds,25752
98
99
  rbx/grading/steps_with_caching.py,sha256=nez2YwgauGXKRjhk6tQxTDGQ-HEk7KfZOeAPhsxi5iw,3150
99
100
  rbx/grading/steps_with_caching_run_test.py,sha256=mh4DRInrOGhnQFWD1SlcjDm_HvcSDFTDMSpAlG-Q5SI,15570
100
101
  rbx/grading_utils.py,sha256=lL2KtSkOsMElqrRoApQTbFcqVOeHVWUDTMCa3IsLpC4,4484
@@ -187,8 +188,8 @@ rbx/testcase.py,sha256=yKOq3CAJZ1YTmInvnoIs0u1iJnRj_X85XiWbLI-p9d8,1951
187
188
  rbx/testcase_rendering.py,sha256=nfmv6dSEqd4aR3TsaODwkKGK6AXty_DDKtWf_ejiQpI,2084
188
189
  rbx/testing_utils.py,sha256=ZXMysGXpTtvS1lfLL38FuD5iSIyxi3ARjQePDrUmEtc,2067
189
190
  rbx/utils.py,sha256=6e1eXRzNE-52D0UVtqclePxqR4Haiqt8qWCrSVjnGuE,4585
190
- rbx_cp-0.5.47.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
191
- rbx_cp-0.5.47.dist-info/METADATA,sha256=PDafPB7Sz8UPXRwvMQpVZ5GZuDxjyT5Nd-P7wX1lOXY,3261
192
- rbx_cp-0.5.47.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
193
- rbx_cp-0.5.47.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
194
- rbx_cp-0.5.47.dist-info/RECORD,,
191
+ rbx_cp-0.5.49.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
192
+ rbx_cp-0.5.49.dist-info/METADATA,sha256=mNCg5KTbxOIcJGovPqYotTF3kFQXqxcJ-8TRjAK47Pg,3261
193
+ rbx_cp-0.5.49.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
194
+ rbx_cp-0.5.49.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
195
+ rbx_cp-0.5.49.dist-info/RECORD,,