ruyi 0.44.0a20251118__py3-none-any.whl → 0.45.0__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 (55) hide show
  1. ruyi/__main__.py +16 -4
  2. ruyi/cli/cmd.py +6 -5
  3. ruyi/cli/config_cli.py +14 -11
  4. ruyi/cli/main.py +34 -17
  5. ruyi/cli/oobe.py +10 -10
  6. ruyi/cli/self_cli.py +49 -36
  7. ruyi/cli/user_input.py +42 -12
  8. ruyi/cli/version_cli.py +11 -5
  9. ruyi/config/__init__.py +30 -10
  10. ruyi/config/errors.py +19 -7
  11. ruyi/device/provision.py +116 -55
  12. ruyi/device/provision_cli.py +6 -3
  13. ruyi/i18n/__init__.py +129 -0
  14. ruyi/log/__init__.py +6 -5
  15. ruyi/mux/runtime.py +19 -6
  16. ruyi/mux/venv/maker.py +93 -35
  17. ruyi/mux/venv/venv_cli.py +13 -10
  18. ruyi/pluginhost/plugin_cli.py +4 -3
  19. ruyi/resource_bundle/__init__.py +22 -8
  20. ruyi/resource_bundle/__main__.py +6 -5
  21. ruyi/resource_bundle/data.py +13 -9
  22. ruyi/ruyipkg/admin_checksum.py +4 -1
  23. ruyi/ruyipkg/admin_cli.py +9 -6
  24. ruyi/ruyipkg/augmented_pkg.py +15 -14
  25. ruyi/ruyipkg/checksum.py +8 -2
  26. ruyi/ruyipkg/distfile.py +33 -9
  27. ruyi/ruyipkg/entity.py +12 -2
  28. ruyi/ruyipkg/entity_cli.py +20 -12
  29. ruyi/ruyipkg/entity_provider.py +11 -2
  30. ruyi/ruyipkg/fetcher.py +38 -9
  31. ruyi/ruyipkg/install.py +163 -64
  32. ruyi/ruyipkg/install_cli.py +18 -15
  33. ruyi/ruyipkg/list.py +27 -20
  34. ruyi/ruyipkg/list_cli.py +12 -7
  35. ruyi/ruyipkg/news.py +23 -11
  36. ruyi/ruyipkg/news_cli.py +10 -7
  37. ruyi/ruyipkg/profile_cli.py +8 -2
  38. ruyi/ruyipkg/repo.py +22 -8
  39. ruyi/ruyipkg/unpack.py +42 -8
  40. ruyi/ruyipkg/unpack_method.py +5 -1
  41. ruyi/ruyipkg/update_cli.py +8 -3
  42. ruyi/telemetry/aggregate.py +5 -0
  43. ruyi/telemetry/provider.py +292 -105
  44. ruyi/telemetry/store.py +68 -15
  45. ruyi/telemetry/telemetry_cli.py +32 -13
  46. ruyi/utils/git.py +18 -11
  47. ruyi/utils/prereqs.py +10 -5
  48. ruyi/utils/ssl_patch.py +2 -1
  49. ruyi/version.py +9 -3
  50. {ruyi-0.44.0a20251118.dist-info → ruyi-0.45.0.dist-info}/METADATA +4 -2
  51. ruyi-0.45.0.dist-info/RECORD +103 -0
  52. {ruyi-0.44.0a20251118.dist-info → ruyi-0.45.0.dist-info}/WHEEL +1 -1
  53. ruyi-0.44.0a20251118.dist-info/RECORD +0 -102
  54. {ruyi-0.44.0a20251118.dist-info → ruyi-0.45.0.dist-info}/entry_points.txt +0 -0
  55. {ruyi-0.44.0a20251118.dist-info → ruyi-0.45.0.dist-info}/licenses/LICENSE-Apache.txt +0 -0
ruyi/telemetry/store.py CHANGED
@@ -85,6 +85,11 @@ class TelemetryStore:
85
85
  def record_upload_timestamp(self, time_now: float | None = None) -> None:
86
86
  if time_now is None:
87
87
  time_now = time.time()
88
+
89
+ # We may not have store_root existing yet if we're in minimal telemetry
90
+ # mode
91
+ self.store_root.mkdir(parents=True, exist_ok=True)
92
+
88
93
  f = self.last_upload_marker_file
89
94
  f.touch()
90
95
  os.utime(f, (time_now, time_now))
@@ -122,10 +127,6 @@ class TelemetryStore:
122
127
  f"scope {self.scope}: persisted {len(self._events)} telemetry event(s)"
123
128
  )
124
129
 
125
- def upload(self, installation_data: NodeInfo | None = None) -> None:
126
- self.prepare_data_for_upload(installation_data)
127
- self.upload_staged_payloads()
128
-
129
130
  def read_back_raw_events(self) -> Iterable[TelemetryEvent]:
130
131
  try:
131
132
  for f in self.raw_events_dir.glob("run.*.ndjson"):
@@ -177,6 +178,47 @@ class TelemetryStore:
177
178
 
178
179
  self.purge_raw_events()
179
180
 
181
+ def prepare_data_for_minimal_upload(self) -> bytes:
182
+ """Prepare a minimal upload payload with no installation data and no events.
183
+
184
+ Used when user has not consented to telemetry collection but also not
185
+ explicitly opted out, for gaining minimal insight into adoption.
186
+ """
187
+
188
+ # import ruyi.version here because this package is on the CLI startup
189
+ # critical path, and version probing is costly there
190
+ from ..version import RUYI_SEMVER
191
+
192
+ payload_nonce = uuid.uuid4().hex # for server-side dedup purposes
193
+
194
+ # We don't have installation data, and cannot have it initialized
195
+ # in this case because absence of installation data means no user
196
+ # consent. And making up a persistent installation ID is not a
197
+ # choice either, because "installation ID" resembles "advertising
198
+ # ID" a lot, which is considered personally identifiable information
199
+ # (PII) and not allowed to be collected without user consent.
200
+ #
201
+ # So, resort to re-using the completely random nonce as the report
202
+ # UUID, which does not allow for server-side correlation but at least
203
+ # allows for some insight into end-user adoption.
204
+ payload: UploadPayload = {
205
+ "fmt": 1,
206
+ "nonce": payload_nonce,
207
+ "ruyi_version": RUYI_SEMVER,
208
+ "report_uuid": payload_nonce,
209
+ "events": [],
210
+ }
211
+
212
+ return json.dumps(payload).encode("utf-8")
213
+
214
+ def upload_minimal(self) -> None:
215
+ if not self.api_url:
216
+ return
217
+
218
+ p = self.prepare_data_for_minimal_upload()
219
+ self.upload_one_staged_payload(p, self.api_url)
220
+ self.record_upload_timestamp()
221
+
180
222
  def upload_staged_payloads(self) -> None:
181
223
  if not self.api_url:
182
224
  return
@@ -198,7 +240,7 @@ class TelemetryStore:
198
240
 
199
241
  def upload_one_staged_payload(
200
242
  self,
201
- f: pathlib.Path,
243
+ f: pathlib.Path | bytes,
202
244
  endpoint: str,
203
245
  ) -> None:
204
246
  # import ruyi.version here because this package is on the CLI startup
@@ -206,13 +248,23 @@ class TelemetryStore:
206
248
  from ..version import RUYI_USER_AGENT
207
249
 
208
250
  api_path = urljoin_for_sure(endpoint, "upload-v1")
209
- self._logger.D(f"scope {self.scope}: about to upload payload {f} to {api_path}")
251
+
252
+ if isinstance(f, pathlib.Path):
253
+ self._logger.D(
254
+ f"scope {self.scope}: about to upload payload {f} to {api_path}"
255
+ )
256
+ data = f.read_bytes()
257
+ else:
258
+ self._logger.D(
259
+ f"scope {self.scope}: about to upload in-memory payload to {api_path}"
260
+ )
261
+ data = f
210
262
 
211
263
  import requests
212
264
 
213
265
  resp = requests.post(
214
266
  api_path,
215
- data=f.read_bytes(),
267
+ data=data,
216
268
  headers={"User-Agent": RUYI_USER_AGENT},
217
269
  allow_redirects=True,
218
270
  timeout=5,
@@ -228,11 +280,12 @@ class TelemetryStore:
228
280
  f"scope {self.scope}: telemetry upload ok: status code {resp.status_code}"
229
281
  )
230
282
 
231
- # move to completed dir
232
- # TODO: rotation
233
- try:
234
- f.rename(self.uploaded_dir / f.name)
235
- except OSError as e:
236
- self._logger.D(
237
- f"scope {self.scope}: failed to move uploaded payload away: {e}"
238
- )
283
+ if isinstance(f, pathlib.Path):
284
+ # move to completed dir
285
+ # TODO: rotation
286
+ try:
287
+ f.rename(self.uploaded_dir / f.name)
288
+ except OSError as e:
289
+ self._logger.D(
290
+ f"scope {self.scope}: failed to move uploaded payload away: {e}"
291
+ )
@@ -3,6 +3,7 @@ import datetime
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  from ..cli.cmd import RootCommand
6
+ from ..i18n import _
6
7
 
7
8
  if TYPE_CHECKING:
8
9
  from ..cli.completion import ArgumentParser
@@ -13,19 +14,41 @@ if TYPE_CHECKING:
13
14
  class TelemetryCommand(
14
15
  RootCommand,
15
16
  cmd="telemetry",
17
+ has_main=True,
16
18
  has_subcommands=True,
17
- help="Manage your telemetry preferences",
19
+ help=_("Manage your telemetry preferences"),
18
20
  ):
19
21
  @classmethod
20
22
  def configure_args(cls, gc: "GlobalConfig", p: "ArgumentParser") -> None:
21
- pass
23
+ # https://github.com/python/cpython/issues/67037 prevents the registration
24
+ # of undocumented subcommands, so a preferred usage of
25
+ # "ruyi telemetry cron-upload" is not possible right now.
26
+ p.add_argument(
27
+ "--cron-upload",
28
+ action="store_true",
29
+ dest="cron_upload",
30
+ default=False,
31
+ help=argparse.SUPPRESS,
32
+ )
33
+
34
+ @classmethod
35
+ def main(cls, cfg: "GlobalConfig", args: argparse.Namespace) -> int:
36
+ cron_upload: bool = args.cron_upload
37
+ if not cron_upload:
38
+ args._parser.print_help() # pylint: disable=protected-access
39
+ return 0
40
+
41
+ # the rest are implementation of "--cron-upload"
42
+
43
+ cfg.telemetry.flush(cron_mode=True)
44
+ return 0
22
45
 
23
46
 
24
47
  class TelemetryConsentCommand(
25
48
  TelemetryCommand,
26
49
  cmd="consent",
27
50
  aliases=["on"],
28
- help="Give consent to telemetry data uploads",
51
+ help=_("Give consent to telemetry data uploads"),
29
52
  ):
30
53
  @classmethod
31
54
  def configure_args(cls, gc: "GlobalConfig", p: "ArgumentParser") -> None:
@@ -43,7 +66,7 @@ class TelemetryConsentCommand(
43
66
  class TelemetryLocalCommand(
44
67
  TelemetryCommand,
45
68
  cmd="local",
46
- help="Set telemetry mode to local collection only",
69
+ help=_("Set telemetry mode to local collection only"),
47
70
  ):
48
71
  @classmethod
49
72
  def configure_args(cls, gc: "GlobalConfig", p: "ArgumentParser") -> None:
@@ -61,7 +84,7 @@ class TelemetryOptoutCommand(
61
84
  TelemetryCommand,
62
85
  cmd="optout",
63
86
  aliases=["off"],
64
- help="Opt out of telemetry data collection",
87
+ help=_("Opt out of telemetry data collection"),
65
88
  ):
66
89
  @classmethod
67
90
  def configure_args(cls, gc: "GlobalConfig", p: "ArgumentParser") -> None:
@@ -78,7 +101,7 @@ class TelemetryOptoutCommand(
78
101
  class TelemetryStatusCommand(
79
102
  TelemetryCommand,
80
103
  cmd="status",
81
- help="Print the current telemetry mode",
104
+ help=_("Print the current telemetry mode"),
82
105
  ):
83
106
  @classmethod
84
107
  def configure_args(cls, gc: "GlobalConfig", p: "ArgumentParser") -> None:
@@ -86,7 +109,7 @@ class TelemetryStatusCommand(
86
109
  "--verbose",
87
110
  "-v",
88
111
  action="store_true",
89
- help="Enable verbose output",
112
+ help=_("Enable verbose output"),
90
113
  )
91
114
 
92
115
  @classmethod
@@ -98,7 +121,7 @@ class TelemetryStatusCommand(
98
121
 
99
122
  if cfg.telemetry is None:
100
123
  cfg.logger.I(
101
- "telemetry mode is [green]off[/]: no further data will be collected"
124
+ _("telemetry mode is [green]off[/]: no further data will be collected")
102
125
  )
103
126
  return 0
104
127
 
@@ -109,7 +132,7 @@ class TelemetryStatusCommand(
109
132
  class TelemetryUploadCommand(
110
133
  TelemetryCommand,
111
134
  cmd="upload",
112
- help="Upload collected telemetry data now",
135
+ help=_("Upload collected telemetry data now"),
113
136
  ):
114
137
  @classmethod
115
138
  def configure_args(cls, gc: "GlobalConfig", p: "ArgumentParser") -> None:
@@ -117,10 +140,6 @@ class TelemetryUploadCommand(
117
140
 
118
141
  @classmethod
119
142
  def main(cls, cfg: "GlobalConfig", args: argparse.Namespace) -> int:
120
- if cfg.telemetry is None:
121
- cfg.logger.W("telemetry is disabled, nothing to upload")
122
- return 0
123
-
124
143
  cfg.telemetry.flush(upload_now=True)
125
144
  # disable the flush at program exit because we have just done that
126
145
  cfg.telemetry.discard_events()
ruyi/utils/git.py CHANGED
@@ -30,6 +30,7 @@ from rich.text import Text
30
30
  if TYPE_CHECKING:
31
31
  from typing_extensions import Self
32
32
 
33
+ from ..i18n import _
33
34
  from ..log import RuyiLogger
34
35
 
35
36
 
@@ -77,11 +78,11 @@ class RemoteGitProgressIndicator(
77
78
  self._last_stats is None
78
79
  or self._last_stats.received_objects != stats.received_objects
79
80
  ):
80
- task_name = "transferring objects"
81
+ task_name = _("transferring objects")
81
82
  total = stats.total_objects
82
83
  completed = stats.received_objects
83
84
  elif self._last_stats.indexed_deltas != stats.indexed_deltas:
84
- task_name = "processing deltas"
85
+ task_name = _("processing deltas")
85
86
  total = stats.total_deltas
86
87
  completed = stats.indexed_deltas
87
88
  elif self._last_stats.received_bytes != stats.received_bytes:
@@ -113,13 +114,15 @@ def pull_ff_or_die(
113
114
  if remote.url != remote_url:
114
115
  if not allow_auto_management:
115
116
  logger.F(
116
- f"URL of remote '[yellow]{remote_name}[/]' does not match expected URL"
117
+ _(
118
+ "URL of remote '[yellow]{remote}[/]' does not match expected URL"
119
+ ).format(remote=remote_name)
117
120
  )
118
121
  repo_path = human_readable_path_of_repo(repo)
119
- logger.I(f"repository: [yellow]{repo_path}[/]")
120
- logger.I(f"expected remote URL: [yellow]{remote_url}[/]")
121
- logger.I(f"actual remote URL: [yellow]{remote.url}[/]")
122
- logger.I("please [bold red]fix the repo settings manually[/]")
122
+ logger.I(_("repository: [yellow]{path}[/]").format(path=repo_path))
123
+ logger.I(_("expected remote URL: [yellow]{url}[/]").format(url=remote_url))
124
+ logger.I(_("actual remote URL: [yellow]{url}[/]").format(url=remote.url))
125
+ logger.I(_("please [bold red]fix the repo settings manually[/]"))
123
126
  raise SystemExit(1)
124
127
 
125
128
  logger.D(
@@ -134,7 +137,11 @@ def pull_ff_or_die(
134
137
  with RemoteGitProgressIndicator() as pr:
135
138
  remote.fetch(callbacks=pr)
136
139
  except GitError as e:
137
- logger.F(f"failed to fetch from remote URL {remote_url}: {e}")
140
+ logger.F(
141
+ _("failed to fetch from remote URL {url}: {reason}").format(
142
+ url=remote_url, reason=e
143
+ )
144
+ )
138
145
  raise SystemExit(1) from e
139
146
 
140
147
  remote_head_ref = repo.lookup_reference(f"refs/remotes/{remote_name}/{branch_name}")
@@ -145,7 +152,7 @@ def pull_ff_or_die(
145
152
  assert isinstance(remote_head_ref.target, str)
146
153
  remote_head = Oid(hex=remote_head_ref.target)
147
154
 
148
- merge_analysis, _ = repo.merge_analysis(remote_head)
155
+ merge_analysis, _mp = repo.merge_analysis(remote_head)
149
156
 
150
157
  if merge_analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE:
151
158
  # nothing to do
@@ -166,6 +173,6 @@ def pull_ff_or_die(
166
173
  return
167
174
 
168
175
  # cannot handle these cases
169
- logger.F("cannot fast-forward repo to newly fetched state")
170
- logger.I("manual intervention is required to avoid data loss")
176
+ logger.F(_("cannot fast-forward repo to newly fetched state"))
177
+ logger.I(_("manual intervention is required to avoid data loss"))
171
178
  raise SystemExit(1)
ruyi/utils/prereqs.py CHANGED
@@ -3,6 +3,7 @@ import sys
3
3
  from typing import Final, Iterable, NoReturn
4
4
 
5
5
  from ..cli.user_input import pause_before_continuing
6
+ from ..i18n import _
6
7
  from ..log import RuyiLogger, humanize_list
7
8
 
8
9
 
@@ -57,21 +58,25 @@ def ensure_cmds(
57
58
  return None
58
59
 
59
60
  cmds_str = humanize_list(absent_cmds, item_color="yellow")
60
- prompt = f"The command(s) {cmds_str} cannot be found in PATH, which [yellow]ruyi[/] requires"
61
+ prompt = _(
62
+ "The command(s) {cmds} cannot be found in PATH, which [yellow]ruyi[/] requires"
63
+ ).format(cmds=cmds_str)
61
64
  if not interactive_retry:
62
65
  logger.F(prompt)
63
- logger.I("please install and retry")
66
+ logger.I(_("please install and retry"))
64
67
  sys.exit(1)
65
68
 
66
69
  logger.W(prompt)
67
70
  logger.I(
68
- "please install them and press [green]Enter[/] to retry, or [green]Ctrl+C[/] to exit"
71
+ _(
72
+ "please install them and press [green]Enter[/] to retry, or [green]Ctrl+C[/] to exit"
73
+ )
69
74
  )
70
75
  try:
71
76
  pause_before_continuing(logger)
72
77
  except EOFError:
73
- logger.I("exiting due to EOF")
78
+ logger.I(_("exiting due to EOF"))
74
79
  sys.exit(1)
75
80
  except KeyboardInterrupt:
76
- logger.I("exiting due to keyboard interrupt")
81
+ logger.I(_("exiting due to keyboard interrupt"))
77
82
  sys.exit(1)
ruyi/utils/ssl_patch.py CHANGED
@@ -6,6 +6,7 @@ from typing import Final, NamedTuple
6
6
 
7
7
  import certifi
8
8
 
9
+ from ..i18n import _
9
10
  from ..log import RuyiConsoleLogger, RuyiLogger
10
11
  from .global_mode import EnvGlobalModeProvider
11
12
 
@@ -35,7 +36,7 @@ def _get_system_ssl_default_verify_paths(logger: RuyiLogger) -> ssl.DefaultVerif
35
36
  try:
36
37
  parts = _query_linux_system_ssl_default_cert_paths(logger)
37
38
  if parts is None:
38
- logger.W("failed to probe system libcrypto")
39
+ logger.W(_("failed to probe system libcrypto"))
39
40
  else:
40
41
  result = to_ssl_paths(parts)
41
42
  except Exception as e:
ruyi/version.py CHANGED
@@ -1,16 +1,21 @@
1
1
  from typing import Final
2
2
 
3
- RUYI_SEMVER: Final = "0.44.0-alpha.20251118"
3
+ from .i18n import d_
4
+
5
+ RUYI_SEMVER: Final = "0.45.0"
4
6
  RUYI_USER_AGENT: Final = f"ruyi/{RUYI_SEMVER}"
5
7
 
6
- COPYRIGHT_NOTICE: Final = """\
8
+ COPYRIGHT_NOTICE: Final = d_(
9
+ """\
7
10
  Copyright (C) Institute of Software, Chinese Academy of Sciences (ISCAS).
8
11
  All rights reserved.
9
12
  License: Apache-2.0 <https://www.apache.org/licenses/LICENSE-2.0>
10
13
  \
11
14
  """
15
+ )
12
16
 
13
- MPL_REDIST_NOTICE: Final = """\
17
+ MPL_REDIST_NOTICE: Final = d_(
18
+ """\
14
19
  This distribution of ruyi contains code licensed under the Mozilla Public
15
20
  License 2.0 (https://mozilla.org/MPL/2.0/). You can get the respective
16
21
  project's sources from the project's official website:
@@ -18,3 +23,4 @@ project's sources from the project's official website:
18
23
  * certifi: https://github.com/certifi/python-certifi
19
24
  \
20
25
  """
26
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ruyi
3
- Version: 0.44.0a20251118
3
+ Version: 0.45.0
4
4
  Summary: Package manager for RuyiSDK
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -224,6 +224,7 @@ Classifier: Topic :: System :: Software Distribution
224
224
  Classifier: Typing :: Typed
225
225
  Requires-Dist: argcomplete (>=2.0.0)
226
226
  Requires-Dist: arpy
227
+ Requires-Dist: babel (>=2.8.0)
227
228
  Requires-Dist: fastjsonschema (>=2.15.1)
228
229
  Requires-Dist: jinja2 (>=3,<4)
229
230
  Requires-Dist: pygit2 (>=1.6) ; python_version >= "3.11"
@@ -408,7 +409,8 @@ described below.
408
409
  There are 3 telemetry modes available:
409
410
 
410
411
  * `local`: data will be collected but not uploaded without user action.
411
- * `off`: data will not be collected nor uploaded.
412
+ * `off`: data will neither be collected nor uploaded, except for a one-time
413
+ upload of `ruyi`'s version number on first run.
412
414
  * `on`: data will be collected and periodically uploaded.
413
415
 
414
416
  By default the `local` mode is active from `ruyi` 0.42.0 (inclusive) on, which
@@ -0,0 +1,103 @@
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.1
2
+ Generator: poetry-core 2.3.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,102 +0,0 @@
1
- ruyi/__init__.py,sha256=_8k6Lm01mK35fGY7N9yQLF2SpmVPU70F2plkS6yG1YU,464
2
- ruyi/__main__.py,sha256=jgWWxLHU07JJQSRRqWWR3EcZpauqRpaJju9q3DF9yHg,3335
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=kR3aEiDE3AfPoP0Zr7MO-09CKoExbkLLmPvve9oKaUg,6725
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=9kq5W3Ir_lfwImhvrUmQ1KTKy1aRCv_UU1CmL5eGyJs,4038
9
- ruyi/cli/main.py,sha256=qWgCKbWG8sHxM7rInkoQfzZOHKo2k8JwdgJp_AMH388,4455
10
- ruyi/cli/oobe.py,sha256=TqXpoCAslIYt1ODPGial0NsNtf3nL1BLxJ8k_CdkuAU,2708
11
- ruyi/cli/self_cli.py,sha256=UEX3Xjy8RGGn9W2O5cM-5rLCwpsM7uSQ9vYYBYxyjyQ,8837
12
- ruyi/cli/user_input.py,sha256=ZJPyCAD7Aizkt37f_KDtW683aKvGZ2pL85Rg_y1LLfg,3711
13
- ruyi/cli/version_cli.py,sha256=L2pejZ7LIPYLUTb9NIz4t51KB8ai8igPBuE64tyqUuI,1275
14
- ruyi/config/__init__.py,sha256=9w1dtgvNxIW65eWzhRN4gl5-460hv-GipIoRZ_oqfXc,16859
15
- ruyi/config/editor.py,sha256=piAJ-a68iX6IFWXy1g9OXoSs_3DardZwoaSPdStKKL0,4243
16
- ruyi/config/errors.py,sha256=Yrzd3hX5Gb_bCawoVrWjFrLrpO-q_IOtg4ikE0P8ia0,2561
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=9rUbLtybBQ8x9qRXaMwz_yAMf51vb3wmYE0qm54P5Bk,20906
21
- ruyi/device/provision_cli.py,sha256=sc6AF8ohWrXA-kIAYdZcD6sl1HHbj_dH2cCi-pjjOQg,1031
22
- ruyi/log/__init__.py,sha256=ehgUl8iY1oRfP_nJKrln5lnvJFSPPU1J-3g-PK28YWk,6516
23
- ruyi/mux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- ruyi/mux/runtime.py,sha256=_d7p-4w2bA2jgCsgcEZxiV1HPnJqdFp0cy4uMGNBsd8,7116
25
- ruyi/mux/venv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- ruyi/mux/venv/emulator_cfg.py,sha256=vGw-pBtNii2fTllQqloN_o1FAFOOHgF7zDqLMVdIlzk,1125
27
- ruyi/mux/venv/maker.py,sha256=6UabdjLKc77uWTjDRFlZda8Cm1v81inzgBmtQrD48ow,28684
28
- ruyi/mux/venv/venv_cli.py,sha256=rIKNcYKu1j7ahHXNgv_ytYVR7qJOoly-TaHPvb21FGA,2974
29
- ruyi/mux/venv_cfg.py,sha256=m75JCVLFWE1gE8OzcNDOHqwUc2c6ikJhZ-GhjsXv94U,6840
30
- ruyi/pluginhost/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- ruyi/pluginhost/api.py,sha256=Zh69xJfR7PEbM6fjoFZRNqeqTneWAmC71NjA76HodSY,5711
32
- ruyi/pluginhost/ctx.py,sha256=MsP1L7nchnbSrauId3GaQzv0YJLnWE0u_H3ZFEmjUX8,6590
33
- ruyi/pluginhost/paths.py,sha256=3EVY3_i3LLff4Lk9py-E317C7_ysiRatfCiuxvCsVWw,4227
34
- ruyi/pluginhost/plugin_cli.py,sha256=rLdXG4_OJ2nlaSjFBmTaclx_N2f0s_Wi-9qcSeq7h9I,968
35
- ruyi/pluginhost/unsandboxed.py,sha256=A9T-6JFfDNiCAxq47_EhLo_rRmZ3Iyrod3teMWv3-XM,7122
36
- ruyi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- ruyi/resource_bundle/__init__.py,sha256=yC1eQ4-EjD7PTr-m5T-l-YDFcblpy2j7i_WJAkC57tg,470
38
- ruyi/resource_bundle/__main__.py,sha256=moZQB09_OU3BKaFJjtba4jX8TWilqqAOhxsjOlrqqZw,1566
39
- ruyi/resource_bundle/data.py,sha256=I1gutOaCZziukFMnokYjbRFNDk-2TK4KhQS-ZtU7pV4,5839
40
- ruyi/ruyipkg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- ruyi/ruyipkg/admin_checksum.py,sha256=H4JthL4lViKQKEB7A_FTEX2c1G9tHp6N25Y83AUV6vc,2260
42
- ruyi/ruyipkg/admin_cli.py,sha256=pPA88VZ-hjIxsf6Vl6OF72ZyEl5_swdl44aoxszu-AQ,2443
43
- ruyi/ruyipkg/atom.py,sha256=S0mWmtI0HgfOnbkAK6BlHmCrAiHcJ-QVnub3iCiCJjU,5440
44
- ruyi/ruyipkg/augmented_pkg.py,sha256=QbzYNHCRanFx9xwYRosN_dAEzOSxmOBxyBVli8SC9FE,6924
45
- ruyi/ruyipkg/canonical_dump.py,sha256=Qu25YXwJpjWUBte0C3bmmaJxe7zyqfN-2-__u2_dJDM,9363
46
- ruyi/ruyipkg/checksum.py,sha256=ChYFPXl7-Y8p_bDerkXOGroRz4k6ejjWY9ViaVWuEgk,1274
47
- ruyi/ruyipkg/cli_completion.py,sha256=kJf7vN5rXi5zAwTI3dr4J8HdUzR3-ZXnsdaNQV6kqzo,1151
48
- ruyi/ruyipkg/distfile.py,sha256=wkyYVcSM2b3vD462TtoltdLcUZElCwWvcZBiPG3lTZ0,7002
49
- ruyi/ruyipkg/entity.py,sha256=s8h5kNaR2vsP6v_QUFIO6SZiUrt0jrb8GU11bNT6fn4,14498
50
- ruyi/ruyipkg/entity_cli.py,sha256=hF66i3sJX8XVLIWq376GA9vzgegfQy-6s0x0L831Irk,3802
51
- ruyi/ruyipkg/entity_provider.py,sha256=jDfS2Jh01PVHo0kb1XyI5WkZgL4fv21AooXLLwqK-1I,8741
52
- ruyi/ruyipkg/fetcher.py,sha256=_btz2hkTz0uEUCCSAhOK7tlhAuvzCu42ZTUCP-RpU7U,9047
53
- ruyi/ruyipkg/host.py,sha256=pmqgggi7koDCWgzFexwHpycv4SZ07VF6xUbi4s8FSKA,1399
54
- ruyi/ruyipkg/install.py,sha256=RhJwIqGxMveWrGmpP-2uWpZBRnqkA75HwyHwrNTdqow,18176
55
- ruyi/ruyipkg/install_cli.py,sha256=joIV5iY4iblDinoH2pgbHNYkMVWqMxtVNj89T0IpJuk,5267
56
- ruyi/ruyipkg/list.py,sha256=iO7666xFEWKTDNtJqVLaaQKsp0BfLTzgXBwFFHrqCGc,4172
57
- ruyi/ruyipkg/list_cli.py,sha256=9tRWWRcJv3yJqzup6Oc89E3xahGp5jIfybfEvwwd55I,2243
58
- ruyi/ruyipkg/list_filter.py,sha256=F64_UhwUEiaUR73EkLu91qoUBA-Yz9mEVWj8XY46MXQ,5467
59
- ruyi/ruyipkg/msg.py,sha256=d9uF1rBmdT8iVvpTU53XXtNTJzvNhIK68rO-4W4h5wc,3180
60
- ruyi/ruyipkg/news.py,sha256=5uN4UYqvEW5MU_10W9MzwFo3lH25oZCvMMjfAjLed7U,3857
61
- ruyi/ruyipkg/news_cli.py,sha256=s5mirEBmO2lZITfjcpzDakP7rNYPqopdM9odbwmAPpg,2378
62
- ruyi/ruyipkg/news_store.py,sha256=ocTO4YDpL_HrKaIRFvJ_Gxvpmr7V7-R8b1B8f5Eue9c,5276
63
- ruyi/ruyipkg/pkg_manifest.py,sha256=FmksKjQyBnU4zA3MFXiHdB2EjNmhs-J9km9vE-zBQlk,18836
64
- ruyi/ruyipkg/profile.py,sha256=6xwL24crALShqD8bazGOIAFTYCpM_91mD8d6YMxM2FU,10762
65
- ruyi/ruyipkg/profile_cli.py,sha256=ud9MS9JQLOtec_1tFRu669I-imVfi1DHU3AuBJym9mw,848
66
- ruyi/ruyipkg/protocols.py,sha256=lPKRaAcK3DY3wmkyO2tKpFvPQ_4QA4aSNNsNLvi78O8,1833
67
- ruyi/ruyipkg/repo.py,sha256=l5d4XPZS-ofbwlAOk5GZMM7AFGay1n1xDVzge935oA4,25231
68
- ruyi/ruyipkg/state.py,sha256=Ie4vrt79Wp9P0L36tMj36tOtDlFnIb6uwVGDQCQyg8s,11544
69
- ruyi/ruyipkg/unpack.py,sha256=hPd-lOnDXp1lEb4mdbLUEckT4QXblSFxz-dGAdwaAjc,11207
70
- ruyi/ruyipkg/unpack_method.py,sha256=MonFFvcDb7MVsi2w4yitnCeZkmWmS7nRMMY-wSt9AMs,2106
71
- ruyi/ruyipkg/update_cli.py,sha256=ywsAAUPctJ3_2qPDvFL2__ql9m8tGZ6ZfrwbSk30Xh4,1425
72
- ruyi/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- ruyi/telemetry/aggregate.py,sha256=iKFC4re8IA69x8S-wXIGf5doN1C4zyNuyJulSI0xBTs,1988
74
- ruyi/telemetry/event.py,sha256=GZnFj6E59Q7mjp-2VRApAZH3rT_bu4_cWb5QMCPm-Zc,982
75
- ruyi/telemetry/provider.py,sha256=RTuGDddQ7yrD8wOlNOjyGhKydD7hiRe3f96pL3pOvmI,16493
76
- ruyi/telemetry/scope.py,sha256=e45VPAvRAqSxrL0ESorN9SCnR_I6Bwi2CMPJDDshJEE,1133
77
- ruyi/telemetry/store.py,sha256=O9YMlLL1iqDbW8ltq0aZRX4VBCZEexBbc335DqlPtRM,8017
78
- ruyi/telemetry/telemetry_cli.py,sha256=PBVMUSE3P6IBKQVMji_bueVenCdbchbOlowySXy0468,3364
79
- ruyi/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- ruyi/utils/ar.py,sha256=w9wiYYdbInLewr5IRTcP0TiOw2ibVDQEmnV0hHm9WlA,2271
81
- ruyi/utils/ci.py,sha256=66DBm4ooA7yozDtXCJFd1n2jJXTsEnxPSpkNzLfE28M,2970
82
- ruyi/utils/frontmatter.py,sha256=4EOohEYCZ_q6ncpDv7ktJYf9PN4WEdgFfdE9hZBV3Zg,1052
83
- ruyi/utils/git.py,sha256=YspRRkfxLXluCv4LNx6q_mjkPdoX7WSM9aR7EfudqlM,5991
84
- ruyi/utils/global_mode.py,sha256=9GES5RyisSXAo14_bP896Jat6BFru_N-DC1V_7bofWY,5684
85
- ruyi/utils/l10n.py,sha256=l003oQ5M8fWIKQHbYTVSc6oHzFFGU2sbKac7Hh6FNFU,2530
86
- ruyi/utils/markdown.py,sha256=Mpq--ClM4j9lm_-5zO53ptYePUTLI4rg0V1YshOwsf8,2654
87
- ruyi/utils/mounts.py,sha256=31BGsVOpD2bO7PYpm8I1ogDHzP3MvrMWznKonS3Ajos,1210
88
- ruyi/utils/node_info.py,sha256=8-4dtrr2Ww_Cb9iKH_WpTMOWx7wknJKRwMUUZJYo9dQ,6603
89
- ruyi/utils/nuitka.py,sha256=7mdbmtKnUsGkIp1zxXgGWYrwZcCut3ipd0AP0DrbfZk,1112
90
- ruyi/utils/porcelain.py,sha256=pF6ieSE2xlnC0HBADFY0m-uuwVNNME3wlbHo2jWdLFA,1403
91
- ruyi/utils/prereqs.py,sha256=oWAaH-smpTMQxpHt782YBxqHxrTaheataslN988-a78,2076
92
- ruyi/utils/ssl_patch.py,sha256=a5gf4br6nC39wTHsqiFtcJ-mGzqB-YzK6DHSeERLaHQ,5661
93
- ruyi/utils/templating.py,sha256=94xBJTkIfDqmUBTc9hnLO54zQoC7hwGWONGF3YbaqHk,966
94
- ruyi/utils/toml.py,sha256=aniIF3SGfR69_s3GWWwlnoKxW4B5IDVY2CM0eUI55_c,3501
95
- ruyi/utils/url.py,sha256=Wyct6syS4GmZC6mY7SK-YgBWxKl3cOOBXtp9UtvGkto,186
96
- ruyi/utils/xdg_basedir.py,sha256=RwVH199jPcLVsg5ngR62RaNS5hqnMpkdt31LqkCfa1g,2751
97
- ruyi/version.py,sha256=jT9EYtNy62PkDUnqmR1ruxXf6GwVW0MN9QJjtxtw8RU,610
98
- ruyi-0.44.0a20251118.dist-info/METADATA,sha256=w6xXJQhK6X8tSfmFTCNX01eTVwosr6Ez2Kmf-p5czRw,24383
99
- ruyi-0.44.0a20251118.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
100
- ruyi-0.44.0a20251118.dist-info/entry_points.txt,sha256=GXSNSy7OgFrnlU5xm5dE3l3PGO92Qf6VDIUCdvQNm8E,49
101
- ruyi-0.44.0a20251118.dist-info/licenses/LICENSE-Apache.txt,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
102
- ruyi-0.44.0a20251118.dist-info/RECORD,,