ruyi 0.45.0__py3-none-any.whl → 0.45.0a20251230__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.
Files changed (53) hide show
  1. ruyi/__main__.py +4 -16
  2. ruyi/cli/cmd.py +5 -6
  3. ruyi/cli/config_cli.py +11 -14
  4. ruyi/cli/main.py +4 -14
  5. ruyi/cli/oobe.py +3 -7
  6. ruyi/cli/self_cli.py +34 -48
  7. ruyi/cli/user_input.py +12 -42
  8. ruyi/cli/version_cli.py +5 -11
  9. ruyi/config/__init__.py +2 -26
  10. ruyi/config/errors.py +7 -19
  11. ruyi/device/provision.py +55 -116
  12. ruyi/device/provision_cli.py +3 -6
  13. ruyi/log/__init__.py +5 -6
  14. ruyi/mux/runtime.py +6 -19
  15. ruyi/mux/venv/maker.py +35 -93
  16. ruyi/mux/venv/venv_cli.py +10 -13
  17. ruyi/pluginhost/plugin_cli.py +3 -4
  18. ruyi/resource_bundle/__init__.py +8 -22
  19. ruyi/resource_bundle/__main__.py +5 -6
  20. ruyi/resource_bundle/data.py +9 -13
  21. ruyi/ruyipkg/admin_checksum.py +1 -4
  22. ruyi/ruyipkg/admin_cli.py +6 -9
  23. ruyi/ruyipkg/augmented_pkg.py +14 -15
  24. ruyi/ruyipkg/checksum.py +2 -8
  25. ruyi/ruyipkg/distfile.py +9 -33
  26. ruyi/ruyipkg/entity.py +2 -12
  27. ruyi/ruyipkg/entity_cli.py +12 -20
  28. ruyi/ruyipkg/entity_provider.py +2 -11
  29. ruyi/ruyipkg/fetcher.py +9 -38
  30. ruyi/ruyipkg/install.py +42 -143
  31. ruyi/ruyipkg/install_cli.py +15 -18
  32. ruyi/ruyipkg/list.py +20 -27
  33. ruyi/ruyipkg/list_cli.py +7 -12
  34. ruyi/ruyipkg/news.py +11 -23
  35. ruyi/ruyipkg/news_cli.py +7 -10
  36. ruyi/ruyipkg/profile_cli.py +2 -8
  37. ruyi/ruyipkg/repo.py +8 -22
  38. ruyi/ruyipkg/unpack.py +8 -42
  39. ruyi/ruyipkg/unpack_method.py +1 -5
  40. ruyi/ruyipkg/update_cli.py +3 -8
  41. ruyi/telemetry/provider.py +29 -74
  42. ruyi/telemetry/telemetry_cli.py +8 -9
  43. ruyi/utils/git.py +11 -18
  44. ruyi/utils/prereqs.py +5 -10
  45. ruyi/utils/ssl_patch.py +1 -2
  46. ruyi/version.py +3 -9
  47. {ruyi-0.45.0.dist-info → ruyi-0.45.0a20251230.dist-info}/METADATA +1 -2
  48. ruyi-0.45.0a20251230.dist-info/RECORD +102 -0
  49. {ruyi-0.45.0.dist-info → ruyi-0.45.0a20251230.dist-info}/WHEEL +1 -1
  50. ruyi/i18n/__init__.py +0 -129
  51. ruyi-0.45.0.dist-info/RECORD +0 -103
  52. {ruyi-0.45.0.dist-info → ruyi-0.45.0a20251230.dist-info}/entry_points.txt +0 -0
  53. {ruyi-0.45.0.dist-info → ruyi-0.45.0a20251230.dist-info}/licenses/LICENSE-Apache.txt +0 -0
ruyi/i18n/__init__.py DELETED
@@ -1,129 +0,0 @@
1
- from io import BytesIO
2
- import gettext
3
- import os
4
- import sys
5
- from typing import Final, Mapping, NewType
6
-
7
- if sys.version_info >= (3, 11):
8
- from typing import LiteralString
9
- else:
10
- # It may happen that Python and typing_extensions are both too old, which
11
- # is unfortunately the case with Ubuntu 22.04 LTS system packages, meaning
12
- # typing_extensions cannot guarantee us LiteralString either.
13
- #
14
- # We don't expect development work within such an environment, so just
15
- # alias to str to avoid importing typing_extensions altogether. This also
16
- # helps CLI startup performance.
17
- #
18
- # Unfortunately, simply assigning str to LiteralString would not work either,
19
- # due to mypy/pyright not wanting us to re-assign types; we have to
20
- # resort to providing different function signatures for Python 3.10, which
21
- # is done below.
22
- #
23
- # LiteralString = str # type: ignore[misc]
24
- pass
25
-
26
- from ..resource_bundle import get_resource_blob
27
-
28
-
29
- def _probe_lang(environ: Mapping[str, str]) -> list[str]:
30
- """Probe the environment variables the gettext way, to determine the list
31
- of preferred languages."""
32
- languages: list[str] = []
33
- # check the variables in this order
34
- for envar in ("LANGUAGE", "LC_ALL", "LC_MESSAGES", "LANG"):
35
- if val := environ.get(envar):
36
- languages = val.split(":")
37
- break
38
- if "C" not in languages:
39
- languages.append("C")
40
-
41
- for i, lang in enumerate(languages):
42
- # normalize things like en_US.UTF-8 to en_US
43
- if "." in lang:
44
- languages[i] = lang.split(".", 1)[0]
45
-
46
- return languages
47
-
48
-
49
- _DOMAINS = (
50
- "argparse",
51
- "ruyi",
52
- )
53
- """gettext domains we supply and use ourselves"""
54
-
55
-
56
- class I18nAdapter:
57
- """Adapter for gettext translation functions."""
58
-
59
- def __init__(self) -> None:
60
- self._t = gettext.NullTranslations()
61
-
62
- def hook(self) -> None:
63
- # monkey-patch the global gettext functions
64
- # the type ignore comments are necessary because mypy doesn't see
65
- # the bounded methods as compatible with the unbound functions
66
- # (it doesn't remove self from the unbound method signature)
67
- gettext.gettext = self.gettext # type: ignore[assignment]
68
- gettext.ngettext = self.ngettext # type: ignore[assignment]
69
-
70
- def init_from_env(self, environ: Mapping[str, str] | None = None) -> None:
71
- if environ is None:
72
- environ = os.environ
73
-
74
- langs = _probe_lang(environ)
75
- for domain in _DOMAINS:
76
- for lang in langs:
77
- if self.set_locale(domain, lang):
78
- break
79
-
80
- def _get_mo(self, domain: str, locale: str) -> BytesIO | None:
81
- # this is always forward-slash-separated, because this is not a concrete
82
- # filesystem path, rather a resource bundle key
83
- path = f"locale/{locale}/LC_MESSAGES/{domain}.mo"
84
- blob = get_resource_blob(path)
85
- if blob:
86
- return BytesIO(blob)
87
- return None
88
-
89
- def set_locale(self, domain: str, locale: str | None = None) -> bool:
90
- if locale is not None:
91
- if mo_file := self._get_mo(domain, locale):
92
- self._t.add_fallback(gettext.GNUTranslations(mo_file))
93
- return True
94
- return False
95
-
96
- def gettext(self, x: str) -> str:
97
- return self._t.gettext(x)
98
-
99
- def ngettext(self, singular: str, plural: str, n: int) -> str:
100
- return self._t.ngettext(singular, plural, n)
101
-
102
-
103
- ADAPTER: Final = I18nAdapter()
104
-
105
-
106
- DeferredI18nString = NewType("DeferredI18nString", str)
107
-
108
-
109
- if sys.version_info >= (3, 11):
110
-
111
- def _(x: LiteralString | DeferredI18nString) -> str:
112
- """``gettext`` alias that ensures its input is string literal via type
113
- signature."""
114
- return ADAPTER.gettext(x)
115
-
116
- def d_(x: LiteralString) -> DeferredI18nString:
117
- """Mark a string literal for deferred translation: call ``_`` at use sites."""
118
- return DeferredI18nString(x)
119
-
120
- else:
121
-
122
- def _(x: str | DeferredI18nString) -> str:
123
- """``gettext`` alias that ensures its input is string literal via type
124
- signature."""
125
- return ADAPTER.gettext(x)
126
-
127
- def d_(x: str) -> DeferredI18nString:
128
- """Mark a string literal for deferred translation: call ``_`` at use sites."""
129
- return DeferredI18nString(x)
@@ -1,103 +0,0 @@
1
- ruyi/__init__.py,sha256=_8k6Lm01mK35fGY7N9yQLF2SpmVPU70F2plkS6yG1YU,464
2
- ruyi/__main__.py,sha256=oj13tC5ie1nYguDgzWu1WJVQvkpUYtj1O9CD9kEG2Hc,3631
3
- ruyi/cli/__init__.py,sha256=MCdAZ00CLb9atln-pJrdQBmcrZmvPx4SOL5LVDbRc_Q,116
4
- ruyi/cli/builtin_commands.py,sha256=cYyPSF00DSBH1WMv6mHcMygbFRBGXObMWhbXHs5K1Mc,639
5
- ruyi/cli/cmd.py,sha256=uPbtCgvvJoGjwPSNyRo4JCu0fta3NJ43avH3DvdfqCk,6761
6
- ruyi/cli/completer.py,sha256=cnOkU7veDe-jP8ROXZL2uBop2HgWfaAZl6dromnPLx8,1426
7
- ruyi/cli/completion.py,sha256=ffLs3Dv7pY_uinwH98wkBPohRvAjpUOGqy01OTA_Bgo,841
8
- ruyi/cli/config_cli.py,sha256=QOQ1AZGaPF7JyeOAFGsYHz4TOBCB_tJqUGqAAf4afjA,4152
9
- ruyi/cli/main.py,sha256=L-3wK_Sklp9Sc1k1I3G9XS2DkuC5xWaIJQUqYejpQyU,4905
10
- ruyi/cli/oobe.py,sha256=Fjb2-7mFFz85Q-xxuxUG2FSjY9_7ADUDHeqWGidolmY,2572
11
- ruyi/cli/self_cli.py,sha256=djH51igQ2Ljrh3L2uFx3f31HGhd9iT8UQxp2x6dvXBs,9137
12
- ruyi/cli/user_input.py,sha256=t-AYWGHSl7VqyLg82l5cjgkOwj0wyeD_S9h5ZyN3yYg,4513
13
- ruyi/cli/version_cli.py,sha256=teCysKc7hQ7ewuV-wAPwO6DQerJQDJoyWVFAEhoxtWE,1394
14
- ruyi/config/__init__.py,sha256=QK8dXWp4Tpr8H_4IKLg3fc3-y5wsvnbFUIiLXd3CXOU,17559
15
- ruyi/config/editor.py,sha256=piAJ-a68iX6IFWXy1g9OXoSs_3DardZwoaSPdStKKL0,4243
16
- ruyi/config/errors.py,sha256=VH1bhEkddmqkEqbFDgR-Sqp4_OIz6pB4QUTeLRGuQmk,2888
17
- ruyi/config/news.py,sha256=83LjQjJHsqOPdRrytG7VBFubG6pyDwJ-Mg37gpBRU20,1061
18
- ruyi/config/schema.py,sha256=u0TdpoUV6I7ZGZKlHAAGnqZbfaoTiA45UsM5c82M99M,7405
19
- ruyi/device/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- ruyi/device/provision.py,sha256=aUtD4nc_A7kNpUSQDbZaVi39V2aHKc82UYW03OszlnQ,22534
21
- ruyi/device/provision_cli.py,sha256=n6qgDsOeZ9Ta0DNX-awTwvcTwp6KsH5vZ7DXcQn8udk,1091
22
- ruyi/i18n/__init__.py,sha256=5Qmcwk8cP8kYUACw8dJcYvXJOWo6EhLWVg4m60qv64g,4312
23
- ruyi/log/__init__.py,sha256=VTVstSCUIeyPGyuLnwUGa5JGknqyOMdJyZJBbkHqK5Y,6663
24
- ruyi/mux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ruyi/mux/runtime.py,sha256=7dK55D57c1O8hVRy6fEo4VWa4SbjDHoNYPqFd6YxmgA,7469
26
- ruyi/mux/venv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- ruyi/mux/venv/emulator_cfg.py,sha256=vGw-pBtNii2fTllQqloN_o1FAFOOHgF7zDqLMVdIlzk,1125
28
- ruyi/mux/venv/maker.py,sha256=NEt8L8lV4PwDWsFek__dWhxaIfOThprcCojuwDxLlBw,30640
29
- ruyi/mux/venv/venv_cli.py,sha256=LL2nmRsqzeFVe8KoXiJl82uTBkemr2X1yX3oooI5RBk,3076
30
- ruyi/mux/venv_cfg.py,sha256=m75JCVLFWE1gE8OzcNDOHqwUc2c6ikJhZ-GhjsXv94U,6840
31
- ruyi/pluginhost/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- ruyi/pluginhost/api.py,sha256=Zh69xJfR7PEbM6fjoFZRNqeqTneWAmC71NjA76HodSY,5711
33
- ruyi/pluginhost/ctx.py,sha256=MsP1L7nchnbSrauId3GaQzv0YJLnWE0u_H3ZFEmjUX8,6590
34
- ruyi/pluginhost/paths.py,sha256=3EVY3_i3LLff4Lk9py-E317C7_ysiRatfCiuxvCsVWw,4227
35
- ruyi/pluginhost/plugin_cli.py,sha256=Mdw3JYfdDuKLgxnE7Ca7PA-iCdXupqAl8E58nLL9wbk,998
36
- ruyi/pluginhost/unsandboxed.py,sha256=A9T-6JFfDNiCAxq47_EhLo_rRmZ3Iyrod3teMWv3-XM,7122
37
- ruyi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- ruyi/resource_bundle/__init__.py,sha256=AQonNhDlWGWSFSgcuw74Z296umGe5ojc2gkDYvw3Rqw,900
39
- ruyi/resource_bundle/__main__.py,sha256=F3M-c9nzeI9Yimnn-qCbLKITAzjPYI8mtR-SvjNayrs,1659
40
- ruyi/resource_bundle/data.py,sha256=QkFTjlplftVC2sJ7iaDy7_1OLVxa8qn8KbJ9n8g4GQ0,34704
41
- ruyi/ruyipkg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- ruyi/ruyipkg/admin_checksum.py,sha256=l-YFbSHUBFM-_Gzv0PnSfk9Xv4Srpb0Vd38SrrpA1y0,2331
43
- ruyi/ruyipkg/admin_cli.py,sha256=ynlkybso9BH6-HLUjgapBI8Gv_y1pXOn7B4ecaUGWq0,2512
44
- ruyi/ruyipkg/atom.py,sha256=S0mWmtI0HgfOnbkAK6BlHmCrAiHcJ-QVnub3iCiCJjU,5440
45
- ruyi/ruyipkg/augmented_pkg.py,sha256=O3q9l5zIygvphi-7BK0oCqkuyYrfDYujHNmAC63pf-k,6987
46
- ruyi/ruyipkg/canonical_dump.py,sha256=Qu25YXwJpjWUBte0C3bmmaJxe7zyqfN-2-__u2_dJDM,9363
47
- ruyi/ruyipkg/checksum.py,sha256=O3IsmO_LYgmL7RWbN9F3dqe-56qj6JMAutRALXXkCw4,1451
48
- ruyi/ruyipkg/cli_completion.py,sha256=kJf7vN5rXi5zAwTI3dr4J8HdUzR3-ZXnsdaNQV6kqzo,1151
49
- ruyi/ruyipkg/distfile.py,sha256=bsUpJm1zopolOIgMCtZDyDgfLXQW7RpcA1BPPLA8Hug,7624
50
- ruyi/ruyipkg/entity.py,sha256=Ixs_d8Xw6j_NghafOkp0L9MQIYmKj6upue1GGUJe6uQ,14760
51
- ruyi/ruyipkg/entity_cli.py,sha256=rxY1EMYzfQ-KCnDjyDjyoSEvNNN0tqOHWidJzLN0COc,4029
52
- ruyi/ruyipkg/entity_provider.py,sha256=agYmFOWz36RpVIggo8BW6kfRWfYTIcyqsD3IVq065io,9018
53
- ruyi/ruyipkg/fetcher.py,sha256=SWInsI_aQ2Wv1O_9YJEF1BcAxbb24m4UJwwt5maPl2s,9803
54
- ruyi/ruyipkg/host.py,sha256=pmqgggi7koDCWgzFexwHpycv4SZ07VF6xUbi4s8FSKA,1399
55
- ruyi/ruyipkg/install.py,sha256=oLMZgW2Lh3b4Odcx-dNE0BEds9oJzlktm83sr8RHbOw,20345
56
- ruyi/ruyipkg/install_cli.py,sha256=jUoM6mGGDJKSfjv7GhhE5C1rO-IVvMP2nUESZdWiscM,5363
57
- ruyi/ruyipkg/list.py,sha256=qxzJIe02rqnA9ngYsfNeqUbYgWba9rzprqk4ScF-YwI,4535
58
- ruyi/ruyipkg/list_cli.py,sha256=tXpsMEZt0ntOSpuybv534VR4ZDIbbV0PS_A01Z5Lj-4,2345
59
- ruyi/ruyipkg/list_filter.py,sha256=F64_UhwUEiaUR73EkLu91qoUBA-Yz9mEVWj8XY46MXQ,5467
60
- ruyi/ruyipkg/msg.py,sha256=d9uF1rBmdT8iVvpTU53XXtNTJzvNhIK68rO-4W4h5wc,3180
61
- ruyi/ruyipkg/news.py,sha256=kqU8Ci9D9fcUMTd-yGGBwP9kJ3NCznw76Sc24V7xn6g,4223
62
- ruyi/ruyipkg/news_cli.py,sha256=Z4rS30RRG1fnEGKFTYJcxeKNMvIjei4vyPeYNdkuRn8,2434
63
- ruyi/ruyipkg/news_store.py,sha256=ocTO4YDpL_HrKaIRFvJ_Gxvpmr7V7-R8b1B8f5Eue9c,5276
64
- ruyi/ruyipkg/pkg_manifest.py,sha256=FmksKjQyBnU4zA3MFXiHdB2EjNmhs-J9km9vE-zBQlk,18836
65
- ruyi/ruyipkg/profile.py,sha256=6xwL24crALShqD8bazGOIAFTYCpM_91mD8d6YMxM2FU,10762
66
- ruyi/ruyipkg/profile_cli.py,sha256=GR-f0PKFRz0BzHvPq-Vii4qGGQ31RqYdUbs7pkvWOAc,1038
67
- ruyi/ruyipkg/protocols.py,sha256=lPKRaAcK3DY3wmkyO2tKpFvPQ_4QA4aSNNsNLvi78O8,1833
68
- ruyi/ruyipkg/repo.py,sha256=OqDH0GDGPXxFFyP18dO-ZfFQVAuHKwTdmT9joEwIXzM,25634
69
- ruyi/ruyipkg/state.py,sha256=Ie4vrt79Wp9P0L36tMj36tOtDlFnIb6uwVGDQCQyg8s,11544
70
- ruyi/ruyipkg/unpack.py,sha256=XS1pB2ahGXjSRE0ViOQKfjStrgDISf6WGlMzR-USD9U,11991
71
- ruyi/ruyipkg/unpack_method.py,sha256=qJdZXB7OhLLuXhgejZDpiqK2BqMvxxcLJaMWCkc0G0Y,2179
72
- ruyi/ruyipkg/update_cli.py,sha256=llq8oHctSQ9ahY0JYvGaoUOYzbMx8Y2VVTuj4GdLUDY,1531
73
- ruyi/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- ruyi/telemetry/aggregate.py,sha256=MhehVOtU7KLICHgOz3sZE5z3OgFa4OmlRIPqXOW_tBU,2334
75
- ruyi/telemetry/event.py,sha256=GZnFj6E59Q7mjp-2VRApAZH3rT_bu4_cWb5QMCPm-Zc,982
76
- ruyi/telemetry/provider.py,sha256=1SRqs6Yq2RnKVsthvdcwleWIMbRoi9P0CiikC4YzJPU,23593
77
- ruyi/telemetry/scope.py,sha256=e45VPAvRAqSxrL0ESorN9SCnR_I6Bwi2CMPJDDshJEE,1133
78
- ruyi/telemetry/store.py,sha256=IbikQ9dmcuf85SIxlWpXY1aydovM1EzXA9Q6hAo_mXE,10072
79
- ruyi/telemetry/telemetry_cli.py,sha256=JCgYAH4mJK8e5LPYs6HtoN9WaudDb-jJ33gZkcNgbVo,4072
80
- ruyi/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- ruyi/utils/ar.py,sha256=w9wiYYdbInLewr5IRTcP0TiOw2ibVDQEmnV0hHm9WlA,2271
82
- ruyi/utils/ci.py,sha256=66DBm4ooA7yozDtXCJFd1n2jJXTsEnxPSpkNzLfE28M,2970
83
- ruyi/utils/frontmatter.py,sha256=4EOohEYCZ_q6ncpDv7ktJYf9PN4WEdgFfdE9hZBV3Zg,1052
84
- ruyi/utils/git.py,sha256=9AumrbBfXBtZwvYvrezDKJJW3TA6HA4gch69eqfGRuo,6232
85
- ruyi/utils/global_mode.py,sha256=9GES5RyisSXAo14_bP896Jat6BFru_N-DC1V_7bofWY,5684
86
- ruyi/utils/l10n.py,sha256=l003oQ5M8fWIKQHbYTVSc6oHzFFGU2sbKac7Hh6FNFU,2530
87
- ruyi/utils/markdown.py,sha256=Mpq--ClM4j9lm_-5zO53ptYePUTLI4rg0V1YshOwsf8,2654
88
- ruyi/utils/mounts.py,sha256=31BGsVOpD2bO7PYpm8I1ogDHzP3MvrMWznKonS3Ajos,1210
89
- ruyi/utils/node_info.py,sha256=8-4dtrr2Ww_Cb9iKH_WpTMOWx7wknJKRwMUUZJYo9dQ,6603
90
- ruyi/utils/nuitka.py,sha256=7mdbmtKnUsGkIp1zxXgGWYrwZcCut3ipd0AP0DrbfZk,1112
91
- ruyi/utils/porcelain.py,sha256=pF6ieSE2xlnC0HBADFY0m-uuwVNNME3wlbHo2jWdLFA,1403
92
- ruyi/utils/prereqs.py,sha256=R24UQyHm3pGt2QmZ-5g89AJsxr2eO5SlPrhIoRtz9lM,2181
93
- ruyi/utils/ssl_patch.py,sha256=HZsJ_nMEzPLjxSl1b8jkYkKU-O6koYK1rdFckic-bi0,5685
94
- ruyi/utils/templating.py,sha256=94xBJTkIfDqmUBTc9hnLO54zQoC7hwGWONGF3YbaqHk,966
95
- ruyi/utils/toml.py,sha256=aniIF3SGfR69_s3GWWwlnoKxW4B5IDVY2CM0eUI55_c,3501
96
- ruyi/utils/url.py,sha256=Wyct6syS4GmZC6mY7SK-YgBWxKl3cOOBXtp9UtvGkto,186
97
- ruyi/utils/xdg_basedir.py,sha256=RwVH199jPcLVsg5ngR62RaNS5hqnMpkdt31LqkCfa1g,2751
98
- ruyi/version.py,sha256=qFJ1dp12sOzWy23xY5eKU0c7X8ZaKJy-W4OvavRb1w4,637
99
- ruyi-0.45.0.dist-info/METADATA,sha256=Pm_WaW_bndLfRLYW1EocJtSuJjp5DYxkOUL-bDyCaEM,24481
100
- ruyi-0.45.0.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
101
- ruyi-0.45.0.dist-info/entry_points.txt,sha256=GXSNSy7OgFrnlU5xm5dE3l3PGO92Qf6VDIUCdvQNm8E,49
102
- ruyi-0.45.0.dist-info/licenses/LICENSE-Apache.txt,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
103
- ruyi-0.45.0.dist-info/RECORD,,