torchx-nightly 2025.10.15__py3-none-any.whl → 2025.10.17__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.

Potentially problematic release.


This version of torchx-nightly might be problematic. Click here for more details.

torchx/specs/api.py CHANGED
@@ -15,9 +15,10 @@ import os
15
15
  import pathlib
16
16
  import re
17
17
  import typing
18
+ import warnings
18
19
  from dataclasses import asdict, dataclass, field
19
20
  from datetime import datetime
20
- from enum import Enum
21
+ from enum import Enum, IntEnum
21
22
  from json import JSONDecodeError
22
23
  from string import Template
23
24
  from typing import (
@@ -891,14 +892,42 @@ class runopt:
891
892
  Represents the metadata about the specific run option
892
893
  """
893
894
 
895
+ class AutoAlias(IntEnum):
896
+ snake_case = 0x1
897
+ SNAKE_CASE = 0x2
898
+ camelCase = 0x4
899
+
900
+ @staticmethod
901
+ def convert_to_camel_case(alias: str) -> str:
902
+ words = re.split(r"[_\-\s]+|(?<=[a-z])(?=[A-Z])", alias)
903
+ words = [w for w in words if w] # Remove empty strings
904
+ if not words:
905
+ return ""
906
+ return words[0].lower() + "".join(w.capitalize() for w in words[1:])
907
+
908
+ @staticmethod
909
+ def convert_to_snake_case(alias: str) -> str:
910
+ alias = re.sub(r"[-\s]+", "_", alias)
911
+ alias = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", alias)
912
+ alias = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", alias)
913
+ return alias.lower()
914
+
915
+ @staticmethod
916
+ def convert_to_const_case(alias: str) -> str:
917
+ return runopt.AutoAlias.convert_to_snake_case(alias).upper()
918
+
894
919
  class alias(str):
895
920
  pass
896
921
 
922
+ class deprecated(str):
923
+ pass
924
+
897
925
  default: CfgVal
898
926
  opt_type: Type[CfgVal]
899
927
  is_required: bool
900
928
  help: str
901
- aliases: list[alias] | None = None
929
+ aliases: set[alias] | None = None
930
+ deprecated_aliases: set[deprecated] | None = None
902
931
 
903
932
  @property
904
933
  def is_type_list_of_str(self) -> bool:
@@ -990,7 +1019,7 @@ class runopts:
990
1019
 
991
1020
  def __init__(self) -> None:
992
1021
  self._opts: Dict[str, runopt] = {}
993
- self._alias_to_key: dict[runopt.alias, str] = {}
1022
+ self._alias_to_key: dict[str, str] = {}
994
1023
 
995
1024
  def __iter__(self) -> Iterator[Tuple[str, runopt]]:
996
1025
  return self._opts.items().__iter__()
@@ -1044,12 +1073,24 @@ class runopts:
1044
1073
  val = resolved_cfg.get(cfg_key)
1045
1074
  resolved_name = None
1046
1075
  aliases = runopt.aliases or []
1076
+ deprecated_aliases = runopt.deprecated_aliases or []
1047
1077
  if val is None:
1048
1078
  for alias in aliases:
1049
1079
  val = resolved_cfg.get(alias)
1050
1080
  if alias in cfg or val is not None:
1051
1081
  resolved_name = alias
1052
1082
  break
1083
+ for alias in deprecated_aliases:
1084
+ val = resolved_cfg.get(alias)
1085
+ if val is not None:
1086
+ resolved_name = alias
1087
+ use_instead = self._alias_to_key.get(alias)
1088
+ warnings.warn(
1089
+ f"Run option `{alias}` is deprecated, use `{use_instead}` instead",
1090
+ UserWarning,
1091
+ stacklevel=2,
1092
+ )
1093
+ break
1053
1094
  else:
1054
1095
  resolved_name = cfg_key
1055
1096
  for alias in aliases:
@@ -1172,23 +1213,51 @@ class runopts:
1172
1213
  cfg[key] = val
1173
1214
  return cfg
1174
1215
 
1216
+ def _generate_aliases(
1217
+ self, auto_alias: int, aliases: set[str]
1218
+ ) -> set[runopt.alias]:
1219
+ generated_aliases = set()
1220
+ for alias in aliases:
1221
+ if auto_alias & runopt.AutoAlias.camelCase:
1222
+ generated_aliases.add(runopt.AutoAlias.convert_to_camel_case(alias))
1223
+ if auto_alias & runopt.AutoAlias.snake_case:
1224
+ generated_aliases.add(runopt.AutoAlias.convert_to_snake_case(alias))
1225
+ if auto_alias & runopt.AutoAlias.SNAKE_CASE:
1226
+ generated_aliases.add(runopt.AutoAlias.convert_to_const_case(alias))
1227
+ return generated_aliases
1228
+
1175
1229
  def _get_primary_key_and_aliases(
1176
1230
  self,
1177
- cfg_key: list[str] | str,
1178
- ) -> tuple[str, list[runopt.alias]]:
1231
+ cfg_key: list[str | int] | str,
1232
+ ) -> tuple[str, set[runopt.alias], set[runopt.deprecated]]:
1179
1233
  """
1180
1234
  Returns the primary key and aliases for the given cfg_key.
1181
1235
  """
1182
1236
  if isinstance(cfg_key, str):
1183
- return cfg_key, []
1237
+ return cfg_key, set(), set()
1184
1238
 
1185
1239
  if len(cfg_key) == 0:
1186
1240
  raise ValueError("cfg_key must be a non-empty list")
1241
+
1242
+ if isinstance(cfg_key[0], runopt.alias) or isinstance(
1243
+ cfg_key[0], runopt.deprecated
1244
+ ):
1245
+ warnings.warn(
1246
+ "The main name of the run option should be the head of the list.",
1247
+ UserWarning,
1248
+ stacklevel=2,
1249
+ )
1187
1250
  primary_key = None
1188
- aliases = list[runopt.alias]()
1251
+ auto_alias = 0x0
1252
+ aliases = set[runopt.alias]()
1253
+ deprecated_aliases = set[runopt.deprecated]()
1189
1254
  for name in cfg_key:
1190
1255
  if isinstance(name, runopt.alias):
1191
- aliases.append(name)
1256
+ aliases.add(name)
1257
+ elif isinstance(name, runopt.deprecated):
1258
+ deprecated_aliases.add(name)
1259
+ elif isinstance(name, int):
1260
+ auto_alias = auto_alias | name
1192
1261
  else:
1193
1262
  if primary_key is not None:
1194
1263
  raise ValueError(
@@ -1199,11 +1268,17 @@ class runopts:
1199
1268
  raise ValueError(
1200
1269
  "Missing cfg_key. Please provide one other than the aliases."
1201
1270
  )
1202
- return primary_key, aliases
1271
+ if auto_alias != 0x0:
1272
+ aliases_to_generate_for = aliases | {primary_key}
1273
+ additional_aliases = self._generate_aliases(
1274
+ auto_alias, aliases_to_generate_for
1275
+ )
1276
+ aliases.update(additional_aliases)
1277
+ return primary_key, aliases, deprecated_aliases
1203
1278
 
1204
1279
  def add(
1205
1280
  self,
1206
- cfg_key: str | list[str],
1281
+ cfg_key: str | list[str | int],
1207
1282
  type_: Type[CfgVal],
1208
1283
  help: str,
1209
1284
  default: CfgVal = None,
@@ -1214,7 +1289,9 @@ class runopts:
1214
1289
  value (if any). If the ``default`` is not specified then this option
1215
1290
  is a required option.
1216
1291
  """
1217
- primary_key, aliases = self._get_primary_key_and_aliases(cfg_key)
1292
+ primary_key, aliases, deprecated_aliases = self._get_primary_key_and_aliases(
1293
+ cfg_key
1294
+ )
1218
1295
  if required and default is not None:
1219
1296
  raise ValueError(
1220
1297
  f"Required option: {cfg_key} must not specify default value. Given: {default}"
@@ -1225,9 +1302,11 @@ class runopts:
1225
1302
  f"Option: {cfg_key}, must be of type: {type_}."
1226
1303
  f" Given: {default} ({type(default).__name__})"
1227
1304
  )
1228
- opt = runopt(default, type_, required, help, aliases)
1305
+ opt = runopt(default, type_, required, help, aliases, deprecated_aliases)
1229
1306
  for alias in aliases:
1230
1307
  self._alias_to_key[alias] = primary_key
1308
+ for deprecated_alias in deprecated_aliases:
1309
+ self._alias_to_key[deprecated_alias] = primary_key
1231
1310
  self._opts[primary_key] = opt
1232
1311
 
1233
1312
  def update(self, other: "runopts") -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: torchx-nightly
3
- Version: 2025.10.15
3
+ Version: 2025.10.17
4
4
  Summary: TorchX SDK and Components
5
5
  Home-page: https://github.com/meta-pytorch/torchx
6
6
  Author: TorchX Devs
@@ -47,11 +47,11 @@ Requires-Dist: pytorch-lightning==2.5.0; extra == "dev"
47
47
  Requires-Dist: tensorboard==2.14.0; extra == "dev"
48
48
  Requires-Dist: sagemaker==2.230.0; extra == "dev"
49
49
  Requires-Dist: torch-model-archiver>=0.4.2; extra == "dev"
50
- Requires-Dist: torch>=2.7.0; extra == "dev"
50
+ Requires-Dist: torch; extra == "dev"
51
51
  Requires-Dist: torchmetrics==1.6.3; extra == "dev"
52
52
  Requires-Dist: torchserve>=0.10.0; extra == "dev"
53
- Requires-Dist: torchtext==0.18.0; extra == "dev"
54
- Requires-Dist: torchvision==0.23.0; extra == "dev"
53
+ Requires-Dist: torchtext; extra == "dev"
54
+ Requires-Dist: torchvision; extra == "dev"
55
55
  Requires-Dist: typing-extensions; extra == "dev"
56
56
  Requires-Dist: ts==0.5.1; extra == "dev"
57
57
  Requires-Dist: wheel; extra == "dev"
@@ -70,7 +70,7 @@ torchx/schedulers/lsf_scheduler.py,sha256=YS6Yel8tXJqLPxbcGz95lZG2nCi36AQXdNDyuB
70
70
  torchx/schedulers/slurm_scheduler.py,sha256=vypGaCZe61bkyNkqRlK4Iwmk_NaAUQi-DsspaWd6BZw,31873
71
71
  torchx/schedulers/streams.py,sha256=8_SLezgnWgfv_zXUsJCUM34-h2dtv25NmZuxEwkzmxw,2007
72
72
  torchx/specs/__init__.py,sha256=SXS4r_roOkbbAL-p7EY5fl5ou-AG7S9Ck-zKtRBdHOk,6760
73
- torchx/specs/api.py,sha256=ICKsTWxEats9IwWXUm-D1NJy4jyONMV2zdrWfUrpKNg,47827
73
+ torchx/specs/api.py,sha256=mRX6sqBQOpEVuyR3M-tK3LqSGNNVzqoOSIWM6FolqZQ,51118
74
74
  torchx/specs/builders.py,sha256=Ye3of4MupJ-da8vLaX6_-nzGo_FRw1BFpYsX6dAZCNk,13730
75
75
  torchx/specs/file_linter.py,sha256=z0c4mKJv47BWiPaWCdUM0A8kHwnj4b1s7oTmESuD9Tc,14407
76
76
  torchx/specs/finder.py,sha256=gWQNEFrLYqrZoI0gMMhQ70YAC4sxqS0ZFpoWAmcVi44,17438
@@ -102,9 +102,9 @@ torchx/workspace/__init__.py,sha256=FqN8AN4VhR1C_SBY10MggQvNZmyanbbuPuE-JCjkyUY,
102
102
  torchx/workspace/api.py,sha256=h2SaC-pYPBLuo3XtkXJ0APMoro-C-ry7KucI7r3EUf4,8753
103
103
  torchx/workspace/dir_workspace.py,sha256=npNW_IjUZm_yS5r-8hrRkH46ndDd9a_eApT64m1S1T4,2268
104
104
  torchx/workspace/docker_workspace.py,sha256=PFu2KQNVC-0p2aKJ-W_BKA9ZOmXdCY2ABEkCExp3udQ,10269
105
- torchx_nightly-2025.10.15.dist-info/LICENSE,sha256=WVHfXhFC0Ia8LTKt_nJVYobdqTJVg_4J3Crrfm2A8KQ,1721
106
- torchx_nightly-2025.10.15.dist-info/METADATA,sha256=TzPu_BGlpYuU43FKQXVFz1N6AAHidhAmgRSrcCMKCuA,5069
107
- torchx_nightly-2025.10.15.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
108
- torchx_nightly-2025.10.15.dist-info/entry_points.txt,sha256=T328AMXeKI3JZnnxfkEew2ZcMN1oQDtkXjMz7lkV-P4,169
109
- torchx_nightly-2025.10.15.dist-info/top_level.txt,sha256=pxew3bc2gsiViS0zADs0jb6kC5v8o_Yy_85fhHj_J1A,7
110
- torchx_nightly-2025.10.15.dist-info/RECORD,,
105
+ torchx_nightly-2025.10.17.dist-info/LICENSE,sha256=WVHfXhFC0Ia8LTKt_nJVYobdqTJVg_4J3Crrfm2A8KQ,1721
106
+ torchx_nightly-2025.10.17.dist-info/METADATA,sha256=qg3D7hiG2TX50v4beQLMAQ8dRszPGKUVYke16hnu87Q,5046
107
+ torchx_nightly-2025.10.17.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
108
+ torchx_nightly-2025.10.17.dist-info/entry_points.txt,sha256=T328AMXeKI3JZnnxfkEew2ZcMN1oQDtkXjMz7lkV-P4,169
109
+ torchx_nightly-2025.10.17.dist-info/top_level.txt,sha256=pxew3bc2gsiViS0zADs0jb6kC5v8o_Yy_85fhHj_J1A,7
110
+ torchx_nightly-2025.10.17.dist-info/RECORD,,