rbx.cp 0.14.0__py3-none-any.whl → 0.16.1__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/__version__.py +1 -0
- rbx/box/git_utils.py +29 -1
- rbx/box/presets/__init__.py +79 -14
- rbx/box/presets/fetch.py +10 -2
- rbx/box/presets/schema.py +16 -1
- rbx/resources/presets/default/contest/statement/info.rbx.tex +5 -13
- rbx/resources/presets/default/preset.rbx.yml +1 -0
- rbx/resources/presets/default/shared/icpc.sty +2 -2
- rbx/utils.py +45 -0
- {rbx_cp-0.14.0.dist-info → rbx_cp-0.16.1.dist-info}/METADATA +2 -1
- {rbx_cp-0.14.0.dist-info → rbx_cp-0.16.1.dist-info}/RECORD +14 -13
- {rbx_cp-0.14.0.dist-info → rbx_cp-0.16.1.dist-info}/WHEEL +1 -1
- {rbx_cp-0.14.0.dist-info → rbx_cp-0.16.1.dist-info}/LICENSE +0 -0
- {rbx_cp-0.14.0.dist-info → rbx_cp-0.16.1.dist-info}/entry_points.txt +0 -0
rbx/__version__.py
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = '0.16.1'
|
rbx/box/git_utils.py
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
import pathlib
|
2
|
-
|
2
|
+
import subprocess
|
3
|
+
from typing import List, Optional
|
3
4
|
|
4
5
|
import git
|
6
|
+
import semver
|
5
7
|
|
6
8
|
|
7
9
|
def get_repo_or_nil(
|
@@ -26,3 +28,29 @@ def get_any_remote(repo: git.Repo) -> Optional[git.Remote]:
|
|
26
28
|
if remote.exists():
|
27
29
|
return remote
|
28
30
|
return None
|
31
|
+
|
32
|
+
|
33
|
+
def _parse_tag_from_ref(ref: str) -> str:
|
34
|
+
return ref.split('/')[-1].split('^{}')[0]
|
35
|
+
|
36
|
+
|
37
|
+
def ls_remote_tags(uri: str) -> List[str]:
|
38
|
+
completed_process = subprocess.run(
|
39
|
+
['git', 'ls-remote', '--tags', uri],
|
40
|
+
check=True,
|
41
|
+
capture_output=True,
|
42
|
+
text=True,
|
43
|
+
)
|
44
|
+
return [
|
45
|
+
_parse_tag_from_ref(line.split('\t')[1])
|
46
|
+
for line in completed_process.stdout.split('\n')
|
47
|
+
if line
|
48
|
+
]
|
49
|
+
|
50
|
+
|
51
|
+
def latest_remote_tag(uri: str) -> str:
|
52
|
+
tags = ls_remote_tags(uri)
|
53
|
+
valid_tags = [tag for tag in tags if semver.Version.is_valid(tag)]
|
54
|
+
if not valid_tags:
|
55
|
+
raise ValueError(f'No valid tags found for {uri}')
|
56
|
+
return sorted(valid_tags, key=semver.VersionInfo.parse)[-1]
|
rbx/box/presets/__init__.py
CHANGED
@@ -1,15 +1,23 @@
|
|
1
|
+
import functools
|
1
2
|
import os
|
2
3
|
import pathlib
|
3
4
|
import shutil
|
4
5
|
import tempfile
|
5
6
|
from typing import Annotated, Iterable, List, Optional, Sequence, Set, Tuple, Union
|
6
7
|
|
8
|
+
import questionary
|
7
9
|
import ruyaml
|
10
|
+
import semver
|
8
11
|
import typer
|
9
12
|
|
10
13
|
from rbx import console, utils
|
11
14
|
from rbx.box import cd
|
12
|
-
from rbx.box.
|
15
|
+
from rbx.box.git_utils import latest_remote_tag
|
16
|
+
from rbx.box.presets.fetch import (
|
17
|
+
PresetFetchInfo,
|
18
|
+
get_preset_fetch_info,
|
19
|
+
get_remote_uri_from_tool_preset,
|
20
|
+
)
|
13
21
|
from rbx.box.presets.lock_schema import LockedAsset, PresetLock, SymlinkInfo
|
14
22
|
from rbx.box.presets.schema import Preset, TrackedAsset
|
15
23
|
from rbx.config import get_default_app_path
|
@@ -17,7 +25,7 @@ from rbx.grading.judge.digester import digest_cooperatively
|
|
17
25
|
|
18
26
|
app = typer.Typer(no_args_is_help=True)
|
19
27
|
|
20
|
-
|
28
|
+
_FALLBACK_PRESET_NAME = 'default'
|
21
29
|
|
22
30
|
|
23
31
|
def find_preset_yaml(root: pathlib.Path = pathlib.Path()) -> Optional[pathlib.Path]:
|
@@ -27,6 +35,30 @@ def find_preset_yaml(root: pathlib.Path = pathlib.Path()) -> Optional[pathlib.Pa
|
|
27
35
|
return None
|
28
36
|
|
29
37
|
|
38
|
+
@functools.cache
|
39
|
+
def _check_preset_compatibility(preset_name: str, preset_version: str) -> None:
|
40
|
+
compatibility = utils.check_version_compatibility(preset_version)
|
41
|
+
if compatibility == utils.SemVerCompatibility.OUTDATED:
|
42
|
+
console.console.print(
|
43
|
+
f'[error]Preset [item]{preset_name}[/item] requires rbx at version [item]{preset_version}[/item], but the current version is [item]{utils.get_version()}[/item].[/error]'
|
44
|
+
)
|
45
|
+
console.console.print(
|
46
|
+
f'[error]Please update rbx.cp to the latest compatible version using [item]{utils.get_upgrade_command(preset_version)}[/item].[/error]'
|
47
|
+
)
|
48
|
+
raise typer.Exit(1)
|
49
|
+
if compatibility == utils.SemVerCompatibility.BREAKING_CHANGE:
|
50
|
+
console.console.print(
|
51
|
+
f'[error]Preset [item]{preset_name}[/item] requires rbx at version [item]{preset_version}[/item], but the current version is [item]{utils.get_version()}[/item].[/error]'
|
52
|
+
)
|
53
|
+
console.console.print(
|
54
|
+
'[error]rbx version is newer, but is in a later major version, which might have introduced breaking changes.[/error]'
|
55
|
+
)
|
56
|
+
console.console.print(
|
57
|
+
'[error]If you are sure that the preset is compatible with the current rbx version, you can change the [item]min_version[/item] field in the preset file ([item].local.rbx/preset.rbx.yml)[/item] to the current version.[/error]'
|
58
|
+
)
|
59
|
+
raise typer.Exit(1)
|
60
|
+
|
61
|
+
|
30
62
|
def get_preset_yaml(root: pathlib.Path = pathlib.Path()) -> Preset:
|
31
63
|
found = find_preset_yaml(root)
|
32
64
|
if not found:
|
@@ -34,7 +66,9 @@ def get_preset_yaml(root: pathlib.Path = pathlib.Path()) -> Preset:
|
|
34
66
|
f'[error][item]preset.rbx.yml[/item] not found in [item]{root.absolute()}[/item][/error]'
|
35
67
|
)
|
36
68
|
raise typer.Exit(1)
|
37
|
-
|
69
|
+
preset = utils.model_from_yaml(Preset, found.read_text())
|
70
|
+
_check_preset_compatibility(preset.name, preset.min_version)
|
71
|
+
return preset
|
38
72
|
|
39
73
|
|
40
74
|
def _find_preset_lock(root: pathlib.Path = pathlib.Path()) -> Optional[pathlib.Path]:
|
@@ -478,7 +512,7 @@ def get_preset_fetch_info_with_fallback(
|
|
478
512
|
# Use active preset if any, otherwise use the default preset.
|
479
513
|
if get_active_preset_or_null() is not None:
|
480
514
|
return None
|
481
|
-
default_preset = get_preset_fetch_info(
|
515
|
+
default_preset = get_preset_fetch_info(_FALLBACK_PRESET_NAME)
|
482
516
|
if default_preset is None:
|
483
517
|
console.console.print(
|
484
518
|
'[error]Internal error: could not find [item]default[/item] preset.[/error]'
|
@@ -527,6 +561,15 @@ def install_preset_from_dir(
|
|
527
561
|
f'[error]Preset [item]{preset.name}[/item] does not have a problem package definition.[/error]'
|
528
562
|
)
|
529
563
|
raise typer.Exit(1)
|
564
|
+
|
565
|
+
try:
|
566
|
+
_check_preset_compatibility(preset.name, preset.min_version)
|
567
|
+
except Exception:
|
568
|
+
console.console.print(
|
569
|
+
f'[error]Error updating preset [item]{preset.name}[/item] to its latest version.[/error]'
|
570
|
+
)
|
571
|
+
raise
|
572
|
+
|
530
573
|
dest.parent.mkdir(parents=True, exist_ok=True)
|
531
574
|
copy_tree_normalizing_gitdir(src, dest, update=update)
|
532
575
|
|
@@ -614,6 +657,29 @@ def _install_preset_from_resources(
|
|
614
657
|
yaml_path = rsrc_preset_path / 'preset.rbx.yml'
|
615
658
|
if not yaml_path.is_file():
|
616
659
|
return False
|
660
|
+
preset_uri = get_remote_uri_from_tool_preset(fetch_info.name)
|
661
|
+
remote_fetch_info = get_preset_fetch_info(preset_uri)
|
662
|
+
if remote_fetch_info is None or remote_fetch_info.fetch_uri is None:
|
663
|
+
console.console.print(
|
664
|
+
f'[error]Preset [item]{fetch_info.name}[/item] not found.[/error]'
|
665
|
+
)
|
666
|
+
raise typer.Exit(1)
|
667
|
+
|
668
|
+
# Check if the latest release has breaking changes.
|
669
|
+
latest_tag = latest_remote_tag(remote_fetch_info.fetch_uri)
|
670
|
+
latest_version = semver.VersionInfo.parse(latest_tag)
|
671
|
+
if latest_version.major > utils.get_semver().major:
|
672
|
+
console.console.print(
|
673
|
+
f'[error]You are not in rbx.cp latest major version ({latest_version.major}), but are installing a built-in preset from rbx.cp.[/error]'
|
674
|
+
)
|
675
|
+
console.console.print(
|
676
|
+
f'[error]To allow for a better experience for users that clone your repository, please update rbx.cp to the latest major version using [item]{utils.get_upgrade_command(latest_version)}[/item].[/error]'
|
677
|
+
)
|
678
|
+
if not questionary.confirm(
|
679
|
+
'If you want to proceed anyway, press [y]', default=False
|
680
|
+
).ask():
|
681
|
+
raise typer.Exit(1)
|
682
|
+
|
617
683
|
console.console.print(
|
618
684
|
f'Installing preset [item]{fetch_info.name}[/item] from resources...'
|
619
685
|
)
|
@@ -622,7 +688,7 @@ def _install_preset_from_resources(
|
|
622
688
|
dest,
|
623
689
|
ensure_contest,
|
624
690
|
ensure_problem,
|
625
|
-
override_uri=
|
691
|
+
override_uri=preset_uri,
|
626
692
|
update=update,
|
627
693
|
)
|
628
694
|
return True
|
@@ -653,15 +719,14 @@ def _install_preset_from_fetch_info(
|
|
653
719
|
update=update,
|
654
720
|
)
|
655
721
|
return
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
# return
|
722
|
+
if _install_preset_from_resources(
|
723
|
+
fetch_info,
|
724
|
+
dest,
|
725
|
+
ensure_contest=ensure_contest,
|
726
|
+
ensure_problem=ensure_problem,
|
727
|
+
update=update,
|
728
|
+
):
|
729
|
+
return
|
665
730
|
console.console.print(
|
666
731
|
f'[error]Preset [item]{fetch_info.name}[/item] not found.[/error]'
|
667
732
|
)
|
rbx/box/presets/fetch.py
CHANGED
@@ -25,6 +25,14 @@ class PresetFetchInfo(BaseModel):
|
|
25
25
|
return bool(self.inner_dir) and not self.is_remote()
|
26
26
|
|
27
27
|
|
28
|
+
def get_inner_dir_from_tool_preset(tool_preset: str) -> str:
|
29
|
+
return f'rbx/resources/presets/{tool_preset}'
|
30
|
+
|
31
|
+
|
32
|
+
def get_remote_uri_from_tool_preset(tool_preset: str) -> str:
|
33
|
+
return f'rsalesc/rbx/{get_inner_dir_from_tool_preset(tool_preset)}'
|
34
|
+
|
35
|
+
|
28
36
|
def get_preset_fetch_info(uri: Optional[str]) -> Optional[PresetFetchInfo]:
|
29
37
|
if uri is None:
|
30
38
|
return None
|
@@ -64,7 +72,7 @@ def get_preset_fetch_info(uri: Optional[str]) -> Optional[PresetFetchInfo]:
|
|
64
72
|
return None
|
65
73
|
return PresetFetchInfo(name=path.name, inner_dir=str(path))
|
66
74
|
|
67
|
-
def
|
75
|
+
def get_tool_fetch_info(s: str) -> Optional[PresetFetchInfo]:
|
68
76
|
pattern = r'[\w\-]+'
|
69
77
|
compiled = re.compile(pattern)
|
70
78
|
match = compiled.match(s)
|
@@ -76,7 +84,7 @@ def get_preset_fetch_info(uri: Optional[str]) -> Optional[PresetFetchInfo]:
|
|
76
84
|
get_github_fetch_info,
|
77
85
|
get_short_github_fetch_info,
|
78
86
|
get_local_dir_fetch_info,
|
79
|
-
|
87
|
+
get_tool_fetch_info,
|
80
88
|
]
|
81
89
|
|
82
90
|
for extract in extractors:
|
rbx/box/presets/schema.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
import pathlib
|
2
2
|
from typing import List, Optional
|
3
3
|
|
4
|
+
import semver
|
4
5
|
import typer
|
5
|
-
from pydantic import BaseModel, Field
|
6
|
+
from pydantic import BaseModel, Field, field_validator
|
6
7
|
|
7
8
|
from rbx import console
|
8
9
|
from rbx.box.presets.fetch import PresetFetchInfo, get_preset_fetch_info
|
@@ -42,6 +43,9 @@ class Preset(BaseModel):
|
|
42
43
|
# Should usually be a GitHub repository.
|
43
44
|
uri: str
|
44
45
|
|
46
|
+
# Minimum version of rbx.cp required to use this preset.
|
47
|
+
min_version: str = '0.14.0'
|
48
|
+
|
45
49
|
# Path to the environment file that will be installed with this preset.
|
46
50
|
# When copied to the box environment, the environment will be named `name`.
|
47
51
|
env: Optional[pathlib.Path] = None
|
@@ -57,6 +61,17 @@ class Preset(BaseModel):
|
|
57
61
|
# package changes in the preset, or when a latex template is changed.
|
58
62
|
tracking: Tracking = Field(default_factory=Tracking)
|
59
63
|
|
64
|
+
@field_validator('min_version')
|
65
|
+
@classmethod
|
66
|
+
def validate_min_version(cls, value: str) -> str:
|
67
|
+
try:
|
68
|
+
semver.Version.parse(value)
|
69
|
+
except ValueError as err:
|
70
|
+
raise ValueError(
|
71
|
+
"min_version must be a valid SemVer string (e.g., '1.2.3' or '1.2.3-rc.1')"
|
72
|
+
) from err
|
73
|
+
return value
|
74
|
+
|
60
75
|
@property
|
61
76
|
def fetch_info(self) -> PresetFetchInfo:
|
62
77
|
res = get_preset_fetch_info(self.uri)
|
@@ -1,14 +1,6 @@
|
|
1
|
-
\documentclass{article}
|
2
|
-
|
3
|
-
\
|
4
|
-
\usepackage{multicol}
|
5
|
-
\usepackage{graphicx}
|
6
|
-
\usepackage{amsfonts}
|
7
|
-
\usepackage[brazil]{babel}
|
8
|
-
\usepackage[utf8]{inputenc}
|
9
|
-
\usepackage[T1]{fontenc}
|
10
|
-
|
11
|
-
\usepackage[utf8]{inputenc}
|
1
|
+
\documentclass[a4paper, 11pt]{article}
|
2
|
+
|
3
|
+
\def\lang{\VAR{lang}}
|
12
4
|
\usepackage{icpc}
|
13
5
|
|
14
6
|
%\pagestyle{myheadings}
|
@@ -35,7 +27,7 @@
|
|
35
27
|
|
36
28
|
\begin{center}
|
37
29
|
\begin{tabular}{c|ccc|c}
|
38
|
-
& \multicolumn{3}{c|}{\strTimeLimit (ms)} & \multirow{2}{*}{\strMemoryLimit (MiB)} \\
|
30
|
+
& \multicolumn{3}{c|}{{\strTimeLimit} (ms)} & \multirow{2}{*}{{\strMemoryLimit} (MiB)} \\
|
39
31
|
%\cline{2-4}
|
40
32
|
{\sf \strProblem} & {\sf C/C++} &{\sf Java} & {\sf Python3} & \\
|
41
33
|
\hline
|
@@ -51,4 +43,4 @@
|
|
51
43
|
\end{center}
|
52
44
|
\vspace*{\fill}
|
53
45
|
\end{titlepage}
|
54
|
-
\end{document}
|
46
|
+
\end{document}
|
@@ -308,7 +308,7 @@
|
|
308
308
|
\newcommand{\InsertTitlePage}
|
309
309
|
{
|
310
310
|
\pagestyle{myheadings}
|
311
|
-
\markright{\Title -- \Year}
|
311
|
+
\markright{{\Title} -- \Year}
|
312
312
|
|
313
313
|
%%% Title Page
|
314
314
|
\begin{titlepage}
|
@@ -347,7 +347,7 @@
|
|
347
347
|
\newcommand{\InsertEditorialTitlePage}
|
348
348
|
{
|
349
349
|
\pagestyle{myheadings}
|
350
|
-
\markright{\Title -- \Year}
|
350
|
+
\markright{{\Title} -- \Year}
|
351
351
|
|
352
352
|
%%% Title Page
|
353
353
|
\begin{titlepage}
|
rbx/utils.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import contextlib
|
2
|
+
import enum
|
2
3
|
import fcntl
|
3
4
|
import functools
|
4
5
|
import json
|
@@ -17,19 +18,63 @@ import rich.markup
|
|
17
18
|
import rich.prompt
|
18
19
|
import rich.status
|
19
20
|
import ruyaml
|
21
|
+
import semver
|
20
22
|
import typer
|
21
23
|
import yaml
|
22
24
|
from pydantic import BaseModel
|
23
25
|
from rich import text
|
24
26
|
from rich.highlighter import JSONHighlighter
|
25
27
|
|
28
|
+
from rbx import __version__
|
26
29
|
from rbx.console import console
|
27
30
|
|
28
31
|
T = TypeVar('T', bound=BaseModel)
|
29
32
|
APP_NAME = 'rbx'
|
33
|
+
PIP_NAME = 'rbx.cp'
|
30
34
|
PathOrStr = Union[pathlib.Path, str]
|
31
35
|
|
32
36
|
|
37
|
+
class SemVerCompatibility(enum.Enum):
|
38
|
+
COMPATIBLE = 'compatible'
|
39
|
+
OUTDATED = 'outdated'
|
40
|
+
BREAKING_CHANGE = 'breaking_change'
|
41
|
+
|
42
|
+
|
43
|
+
def get_version() -> str:
|
44
|
+
return __version__.__version__
|
45
|
+
|
46
|
+
|
47
|
+
def get_semver() -> semver.VersionInfo:
|
48
|
+
return semver.VersionInfo.parse(get_version())
|
49
|
+
|
50
|
+
|
51
|
+
def get_upgrade_command(
|
52
|
+
version: Optional[Union[str, semver.VersionInfo]] = None,
|
53
|
+
) -> str:
|
54
|
+
parsed_version = (
|
55
|
+
semver.VersionInfo.parse(version) if isinstance(version, str) else version
|
56
|
+
) or get_semver()
|
57
|
+
return f'pipx install --upgrade {PIP_NAME}@{parsed_version.major}'
|
58
|
+
|
59
|
+
|
60
|
+
def check_version_compatibility_between(
|
61
|
+
installed: str,
|
62
|
+
required: str,
|
63
|
+
) -> SemVerCompatibility:
|
64
|
+
installed_version = semver.VersionInfo.parse(installed)
|
65
|
+
required_version = semver.VersionInfo.parse(required)
|
66
|
+
if installed_version < required_version:
|
67
|
+
return SemVerCompatibility.OUTDATED
|
68
|
+
if installed_version.major > required_version.major:
|
69
|
+
return SemVerCompatibility.BREAKING_CHANGE
|
70
|
+
return SemVerCompatibility.COMPATIBLE
|
71
|
+
|
72
|
+
|
73
|
+
def check_version_compatibility(required: str) -> SemVerCompatibility:
|
74
|
+
installed = get_version()
|
75
|
+
return check_version_compatibility_between(installed, required)
|
76
|
+
|
77
|
+
|
33
78
|
def create_and_write(path: pathlib.Path, *args, **kwargs):
|
34
79
|
path.parent.mkdir(parents=True, exist_ok=True)
|
35
80
|
path.write_text(*args, **kwargs)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: rbx.cp
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.16.1
|
4
4
|
Summary:
|
5
5
|
Author: Roberto Sales
|
6
6
|
Requires-Python: >=3.9.1,<4.0.0
|
@@ -40,6 +40,7 @@ Requires-Dist: requests (>=2.32.3,<3.0.0)
|
|
40
40
|
Requires-Dist: rich (>=13.9.4,<14.0.0)
|
41
41
|
Requires-Dist: ruamel-yaml (>=0.18.14,<0.19.0)
|
42
42
|
Requires-Dist: ruyaml (>=0.91.0,<0.92.0)
|
43
|
+
Requires-Dist: semver (>=3.0.4,<4.0.0)
|
43
44
|
Requires-Dist: sqlitedict (>=2.1.0,<3.0.0)
|
44
45
|
Requires-Dist: syncer (>=2.0.3,<3.0.0)
|
45
46
|
Requires-Dist: textual (>=3.1.1,<4.0.0)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
rbx/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
rbx/__version__.py,sha256=_5Udfe3jX_Ju2NuNb0dUgUDu7GADMpIFGMOs0TQl5TI,23
|
2
3
|
rbx/annotations.py,sha256=_TkLhgZWiUyon3bonHwUo03ls1jY8LwgcR4bVgtgnc0,3519
|
3
4
|
rbx/autoenum.py,sha256=cusv8ClXRlDVvhZ8eDrtYcL_2peXlHugAey_ht8roXk,12025
|
4
5
|
rbx/box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -24,7 +25,7 @@ rbx/box/extensions.py,sha256=Von8kIeXvNFTkGlMRMTvL2HIHPwlkuiMswr-ydbGV1w,519
|
|
24
25
|
rbx/box/fields.py,sha256=Gsox7Q1M7I8I2FtKvwiAfYUC6USpwghk8fel2Q9Eyhg,2291
|
25
26
|
rbx/box/formatting.py,sha256=i3vXHpo_L_VpVPxOe4wHlai1WhlDJlfxUexS9DC0Szg,1249
|
26
27
|
rbx/box/generators.py,sha256=trI4i3BFAzIK4wA0hdCjU1rf8QLwSXKWzSFtCZX17SA,17739
|
27
|
-
rbx/box/git_utils.py,sha256=
|
28
|
+
rbx/box/git_utils.py,sha256=WTK8lfmkrBtJpSBuFSwjlSXpkdHnKcVYJgGWTr5V1lY,1513
|
28
29
|
rbx/box/global_package.py,sha256=YfFGw2vxFspF2v3phBEeBCrLe1sfbANrctGqii3I2X4,2106
|
29
30
|
rbx/box/header.py,sha256=OZJD2J0fdIiYyiEAwQ3x3M8TwM1v1J9nhIjnPVz4Zy8,3029
|
30
31
|
rbx/box/lang.py,sha256=CSD-yxFUC3LWdGpv4IVFOLdgONc_JbsI45BEN3bjaFw,888
|
@@ -52,10 +53,10 @@ rbx/box/packaging/polygon/polygon_api.py,sha256=mPKEqiwANJ1nr-JhOgzGMaDhnbljsAgz
|
|
52
53
|
rbx/box/packaging/polygon/test.py,sha256=bgEju5PwudgyfwxXJagm8fM6CJVlWM6l_-2q1V-oKaQ,3069
|
53
54
|
rbx/box/packaging/polygon/upload.py,sha256=w7F0ejfEwhXrAyKADkA2FGuOfTCq96nMNi1YJNRyrtU,13801
|
54
55
|
rbx/box/packaging/polygon/xml_schema.py,sha256=TSl4BWwMWv7V07BKJ56mcLXNr_3zlRgNmqN2q-wnk4M,3128
|
55
|
-
rbx/box/presets/__init__.py,sha256=
|
56
|
-
rbx/box/presets/fetch.py,sha256=
|
56
|
+
rbx/box/presets/__init__.py,sha256=6CJpyIpx7wdUqPvRB5hQY5mIPDo6m1NTOSAYrfF3t5Q,36382
|
57
|
+
rbx/box/presets/fetch.py,sha256=d37Pze32iQK2uWDr5I55cFeKwobZ6aczRNwpBoUJqoM,2755
|
57
58
|
rbx/box/presets/lock_schema.py,sha256=8PKL7UMX4dkdVpCPLwYtaNIIrZpAfHGvTfnF8bRFedM,1708
|
58
|
-
rbx/box/presets/schema.py,sha256=
|
59
|
+
rbx/box/presets/schema.py,sha256=5Nw72QrSsA39cUCCLlVfSYMImK_-TfJEGu5TSIDv3W8,2918
|
59
60
|
rbx/box/remote.py,sha256=hCdiZSmh6Y1vnSEwLZ_gtAMYV-WLVlU3iVnvcObRpRc,5274
|
60
61
|
rbx/box/retries.py,sha256=BZsi4sYBjm3VK5zb_pBQSYQuKo3ZntmtEFoVPZHg4QI,4982
|
61
62
|
rbx/box/sanitizers/issue_stack.py,sha256=N4RVVHnswNPsZZaPcVAkNIhRH32AUo8fxfoka4lgRrQ,3420
|
@@ -196,11 +197,11 @@ rbx/resources/packagers/moj/scripts/py3/run.sh,sha256=LrMi7Tap9no8gh64QNGUXbWauP
|
|
196
197
|
rbx/resources/presets/default/contest/.gitignore,sha256=CMwGD717vKcbQrXjha2D4LMwjDfQcev8rjFPg0AIi4A,131
|
197
198
|
rbx/resources/presets/default/contest/contest.rbx.yml,sha256=qa-FJEUP2o4mTfkfw8vb3TcSYRMC_N3yVoe7ZhjpP3U,1236
|
198
199
|
rbx/resources/presets/default/contest/statement/contest.rbx.tex,sha256=Jx6op_WdVpQOMekvOAZnBzDxxvBzg1_9ZFWtbzGasLo,793
|
199
|
-
rbx/resources/presets/default/contest/statement/info.rbx.tex,sha256=
|
200
|
+
rbx/resources/presets/default/contest/statement/info.rbx.tex,sha256=Wz8Tbmi2lPWMgDbJsJolUi1xaQMwSnHmpZ3JwAy_Tb0,998
|
200
201
|
rbx/resources/presets/default/contest/statement/instructions.tex,sha256=JG_eR13ukZgEahrrmrbg40H8cUzpoUE8QLocihN-fZ8,2414
|
201
202
|
rbx/resources/presets/default/contest/statement/logo.png,sha256=RLNYmZoc-BR6AZKkmr4UEg3h01YeFzvy604jMAQC7aA,414485
|
202
203
|
rbx/resources/presets/default/env.rbx.yml,sha256=quSPG5Xs9KroYLATNLPNtORLGRWtrLLt2Fx81T1enAM,1692
|
203
|
-
rbx/resources/presets/default/preset.rbx.yml,sha256=
|
204
|
+
rbx/resources/presets/default/preset.rbx.yml,sha256=w6SUps46mrKPAoXCqxFPd8HyNqpHQDOyWIdswpsC6KA,520
|
204
205
|
rbx/resources/presets/default/problem/.gitignore,sha256=1rt95y9Q7ZHIQn28JyZQUdD5zkpRosjAl9ZqoQmX2cE,149
|
205
206
|
rbx/resources/presets/default/problem/gens/gen.cpp,sha256=rn6sGRjZ1sFE1Rq02r6488iquY9xTrutcvLv4d1sohA,178
|
206
207
|
rbx/resources/presets/default/problem/manual_tests/samples/000.in,sha256=w66OEtCJGqjUNj8cJrqgImgGVm8W_OlIUtF255ds-ow,4
|
@@ -216,14 +217,14 @@ rbx/resources/presets/default/problem/testplan/random.txt,sha256=XDrow4p79owKnjq
|
|
216
217
|
rbx/resources/presets/default/problem/validator.cpp,sha256=Dqd3y4v8W4A3sYXHEqxsS4rZnMqQpUrNQfwVetxPdlo,381
|
217
218
|
rbx/resources/presets/default/problem/wcmp.cpp,sha256=gbjJe3Vf9-YzHCEqBUq30aI3jMZXhqBDn3jjecYOn-w,902
|
218
219
|
rbx/resources/presets/default/shared/contest_template.rbx.tex,sha256=9leq7cJFP1sB-gLSBdXAjTDuZTD89S4y18_nvifUTjE,1589
|
219
|
-
rbx/resources/presets/default/shared/icpc.sty,sha256=
|
220
|
+
rbx/resources/presets/default/shared/icpc.sty,sha256=QUWdYOvQDue-bn27Lu8LsBh4FBmCDQqeFnB7ENZ-aV8,8831
|
220
221
|
rbx/resources/presets/default/shared/problem_template.rbx.tex,sha256=KDibf4LtUio9hNFgIfd1VarQxfp9XLrxhyk_nWEQGa4,1706
|
221
222
|
rbx/resources/templates/rbx.h,sha256=0AZds9R0PmuPgnlTENb33Y81LW0LlnmOJFaoN8oG3Yo,3638
|
222
223
|
rbx/resources/templates/template.cpp,sha256=xXWpWo7fa7HfmPNqkmHcmv3i46Wm0ZL-gPmkRfGvLn4,317
|
223
224
|
rbx/testing_utils.py,sha256=vNNdaytowJfuopszVHeFzVtHWlPfipPW4zpqCOvdZKU,2908
|
224
|
-
rbx/utils.py,sha256=
|
225
|
-
rbx_cp-0.
|
226
|
-
rbx_cp-0.
|
227
|
-
rbx_cp-0.
|
228
|
-
rbx_cp-0.
|
229
|
-
rbx_cp-0.
|
225
|
+
rbx/utils.py,sha256=AUIknhhED-ZIp6w-VcfPkaG1cYjQkovlX5WCvbVLNHg,9930
|
226
|
+
rbx_cp-0.16.1.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
227
|
+
rbx_cp-0.16.1.dist-info/METADATA,sha256=CvJPfF8h2IvR_MshkNWC-5TT9m55i3NFYc-P7M5PNHE,4799
|
228
|
+
rbx_cp-0.16.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
229
|
+
rbx_cp-0.16.1.dist-info/entry_points.txt,sha256=Gw2_BZ5Jon61biaH_ETbAQGXy8fR5On9gw2U4A1erpo,40
|
230
|
+
rbx_cp-0.16.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|