hcs-core 0.1.290__py3-none-any.whl → 0.1.292__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.
hcs_core/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.290"
1
+ __version__ = "0.1.292"
hcs_core/ctxp/_init.py CHANGED
@@ -19,7 +19,7 @@ from pathlib import Path
19
19
 
20
20
  import click
21
21
 
22
- from . import cli_processor, config, profile, state
22
+ from . import cli_processor, config, profile, state, telemetry
23
23
 
24
24
 
25
25
  def _get_store_path():
@@ -79,8 +79,11 @@ def app_name():
79
79
 
80
80
  def init_cli(main_cli: click.Group, commands_dir: str = "./cmds"):
81
81
  try:
82
- return cli_processor.init(main_cli, commands_dir)
83
- except Exception as e:
82
+ ret = cli_processor.init(main_cli, commands_dir)
83
+ telemetry.end()
84
+ return ret
85
+ except BaseException as e:
86
+ telemetry.end(error=e)
84
87
  if _need_stack_trace(e):
85
88
  raise e
86
89
  else:
@@ -89,9 +89,7 @@ def get(name: str):
89
89
  if name:
90
90
  data = profile.get(name)
91
91
  if data is None:
92
- panic(
93
- "Profile not found. Use 'hcs profile list' to show available profiles, or 'hcs profile init' to create one."
94
- )
92
+ panic("Profile not found. Use 'hcs profile list' to show available profiles, or 'hcs profile init' to create one.")
95
93
  else:
96
94
  data = profile.current()
97
95
  if data is None:
@@ -74,9 +74,7 @@ sort = click.option(
74
74
  help="Ascending/Descending. Format is property,{asc|desc} and default is ascending",
75
75
  )
76
76
 
77
- limit = click.option(
78
- "--limit", "-l", type=int, required=False, default=100, help="Optionally, specify the number of records to fetch."
79
- )
77
+ limit = click.option("--limit", "-l", type=int, required=False, default=100, help="Optionally, specify the number of records to fetch.")
80
78
 
81
79
  ids = click.option(
82
80
  "--ids",
@@ -101,9 +99,7 @@ first = click.option(
101
99
 
102
100
  force = click.option("--force/--grace", type=bool, default=True, help="Specify deletion mode: forceful, or graceful.")
103
101
 
104
- confirm = click.option(
105
- "--confirm/--prompt", "-y", type=bool, default=False, help="Confirm the operation without prompt."
106
- )
102
+ confirm = click.option("--confirm/--prompt", "-y", type=bool, default=False, help="Confirm the operation without prompt.")
107
103
 
108
104
 
109
105
  def formatter(custom_fn):
@@ -24,7 +24,6 @@ from pathlib import Path
24
24
  import click
25
25
  from click.core import Group
26
26
 
27
- from .extension import ensure_extension
28
27
  from .util import avoid_trace_for_ctrl_c, print_error, print_output, validate_error_return
29
28
 
30
29
  _eager_loading = os.environ.get("_CTXP_EAGER_LOAD")
@@ -61,6 +60,8 @@ class LazyGroup(click.Group):
61
60
 
62
61
  def _ensure_extension(self):
63
62
  if self._extension:
63
+ from .extension import ensure_extension
64
+
64
65
  ensure_extension(self._extension)
65
66
 
66
67
 
@@ -186,6 +187,11 @@ def _default_io(cmd: click.Command):
186
187
  "first": kwargs.pop("first"),
187
188
  "exclude_field": kwargs.pop("exclude_field"),
188
189
  }
190
+ ctx = click.get_current_context()
191
+ from .telemetry import start as telemetry_start
192
+
193
+ telemetry_start(ctx.command_path, ctx.params)
194
+
189
195
  if io_args["output"] == "table":
190
196
 
191
197
  def _format(data):
@@ -100,9 +100,7 @@ def strict_dict_to_class(data: dict, class_type):
100
100
  value = strict_dict_to_class(value, field_type)
101
101
  setattr(inst, field_name, value)
102
102
  continue
103
- raise ValueError(
104
- f"Field '{class_type.__name__}.{field_name}' has an incorrect type. Declared: {field_type}, actual: {type(value)}"
105
- )
103
+ raise ValueError(f"Field '{class_type.__name__}.{field_name}' has an incorrect type. Declared: {field_type}, actual: {type(value)}")
106
104
  return inst
107
105
 
108
106
 
@@ -341,9 +339,7 @@ def resolve_expression(expr, fn_get_value, referencing_attr_path) -> Tuple[Any,
341
339
  f"Invalid variable value for expression. Expect list, actual {type(target_value).__name__}. attr_path={referencing_attr_path}, src_var_name={src_var_name}"
342
340
  )
343
341
  if not mapped_value.startswith(tmp_var_name + "."):
344
- raise CtxpException(
345
- f"Unsupported expression. attr_path={referencing_attr_path}, src_var_name={src_var_name}"
346
- )
342
+ raise CtxpException(f"Unsupported expression. attr_path={referencing_attr_path}, src_var_name={src_var_name}")
347
343
  new_attr_path = mapped_value[len(tmp_var_name) + 1 :]
348
344
  ret = []
349
345
  for i in target_value:
hcs_core/ctxp/duration.py CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  import re
4
4
 
5
- PATTERN = (
6
- "([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?"
7
- )
5
+ PATTERN = "([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?"
8
6
 
9
7
  # Examples
10
8
 
hcs_core/ctxp/logger.py CHANGED
@@ -21,7 +21,9 @@ from logging.handlers import RotatingFileHandler
21
21
  import coloredlogs
22
22
 
23
23
  LOG_FORMAT_SIMPLE = "%(levelname).4s %(asctime)s %(name)-16s %(message)s"
24
- LOG_FORMAT_LONG = "%(color_on)s%(asctime)s.%(msecs)03d [%(process)-5d:%(threadName)-12s] %(levelname)-7s [%(name)-16s] %(message)s%(color_off)s"
24
+ LOG_FORMAT_LONG = (
25
+ "%(color_on)s%(asctime)s.%(msecs)03d [%(process)-5d:%(threadName)-12s] %(levelname)-7s [%(name)-16s] %(message)s%(color_off)s"
26
+ )
25
27
  DATE_FORMAT_SIMPLE = "%H:%M:%S"
26
28
 
27
29
 
@@ -133,9 +135,7 @@ def setup(
133
135
  )
134
136
 
135
137
 
136
- def setup_console_output(
137
- logger, console_log_output, console_log_level, console_log_color, console_log_mask, log_line_template, date_fmt
138
- ):
138
+ def setup_console_output(logger, console_log_output, console_log_level, console_log_color, console_log_mask, log_line_template, date_fmt):
139
139
  if not date_fmt:
140
140
  date_fmt = coloredlogs.DEFAULT_DATE_FORMAT
141
141
  coloredlogs.install(
hcs_core/ctxp/profile.py CHANGED
@@ -82,9 +82,7 @@ def current(reload: bool = False, exit_on_failure: bool = True, exclude_secret:
82
82
  data = get(profile_name, reload)
83
83
 
84
84
  if data is None and exit_on_failure:
85
- panic(
86
- "Profile not set. Use 'hcs profile use [profile-name]' to choose one, or use 'hcs profile init' to create default profiles."
87
- )
85
+ panic("Profile not set. Use 'hcs profile use [profile-name]' to choose one, or use 'hcs profile init' to create default profiles.")
88
86
 
89
87
  if exclude_secret:
90
88
  data = dotdict(dict(data))
hcs_core/ctxp/recent.py CHANGED
@@ -31,7 +31,7 @@ def all():
31
31
  return _recent
32
32
 
33
33
 
34
- def require(provided, k: str):
34
+ def require(k: str, provided):
35
35
  if not k:
36
36
  raise Exception("Missing 'key' in recent.require(current, key).")
37
37
 
@@ -0,0 +1,102 @@
1
+ import json
2
+ import logging
3
+ import sys
4
+ import time
5
+ from datetime import datetime, timezone
6
+
7
+ import click
8
+ import httpx
9
+ from yumako import env
10
+
11
+ log = logging.getLogger(__name__)
12
+
13
+ _record = None
14
+ _enabled = None
15
+ _version = None
16
+
17
+
18
+ def disable():
19
+ global _enabled
20
+ _enabled = False
21
+
22
+
23
+ def _is_disabled():
24
+ global _enabled
25
+ if _enabled is None:
26
+ _enabled = env.bool("HCS_CLI_TELEMETRY", True)
27
+ return not _enabled
28
+
29
+
30
+ def _get_version():
31
+ global _version
32
+ if _version is None:
33
+ try:
34
+ from importlib.metadata import version
35
+
36
+ _version = version("hcs-cli")
37
+ except Exception as e:
38
+ log.debug(f"Failed to get hcs-cli version: {e}")
39
+ _version = "unknown"
40
+ return _version
41
+
42
+
43
+ def start(cmd_path: str, params: dict):
44
+ if _is_disabled():
45
+ return
46
+
47
+ global _record
48
+ _record = {
49
+ "@timestamp": datetime.now(timezone.utc).isoformat(timespec="milliseconds"),
50
+ "command": cmd_path,
51
+ "options": [k.replace("_", "-") for k, v in params.items() if v],
52
+ "return": -1,
53
+ "error": None,
54
+ "time_ms": -1,
55
+ "version": _get_version(),
56
+ "env": {
57
+ "python_version": sys.version,
58
+ "platform": sys.platform,
59
+ "executable": sys.executable,
60
+ },
61
+ }
62
+
63
+
64
+ def end(return_code: int = 0, error: Exception = None):
65
+ if _is_disabled():
66
+ return
67
+
68
+ if _record is None:
69
+ return
70
+
71
+ if error:
72
+ if isinstance(error, click.exceptions.Exit):
73
+ return_code = error.exit_code
74
+ elif isinstance(error, SystemExit):
75
+ return_code = error.code
76
+ else:
77
+ _record["error"] = str(error)
78
+ if return_code == 0:
79
+ return_code = 1
80
+ _record["return"] = return_code
81
+ _record["time_ms"] = int((time.time() - datetime.fromisoformat(_record["@timestamp"]).timestamp()) * 1000)
82
+
83
+ # print('TELEMETRY end', json.dumps(_record, indent=4), flush=True)
84
+
85
+ _injest(_record)
86
+ return _record
87
+
88
+
89
+ def _injest(doc):
90
+ try:
91
+ response = httpx.post(
92
+ f"https://collie.omnissa.com/es/hcs-cli/_doc",
93
+ auth=("append_user", "public"),
94
+ headers={"Content-Type": "application/json"},
95
+ content=json.dumps(doc),
96
+ timeout=4,
97
+ verify=False,
98
+ )
99
+ response.raise_for_status()
100
+ except Exception as e:
101
+ log.debug(f"Telemetry ingestion failed: {e}", exc_info=True)
102
+ return
hcs_core/ctxp/util.py CHANGED
@@ -125,7 +125,7 @@ def print_output(data: Any, args: dict, file=sys.stdout):
125
125
 
126
126
 
127
127
  def print_error(error):
128
- critical_errors = [KeyError, TypeError]
128
+ critical_errors = [KeyError, TypeError, AttributeError, ValueError]
129
129
  for ex in critical_errors:
130
130
  if isinstance(error, ex):
131
131
  traceback.print_exception(type(error), error, error.__traceback__, file=sys.stderr)
@@ -189,6 +189,10 @@ def _exclude_fields(obj: Any, fields_exclude: str):
189
189
 
190
190
 
191
191
  def panic(reason: Any = None, code: int = 1):
192
+ if isinstance(reason, SystemExit):
193
+ os._exit(reason.code)
194
+ if isinstance(reason, click.exceptions.Exit):
195
+ os._exit(reason.exit_code)
192
196
  if isinstance(reason, Exception):
193
197
  text = error_details(reason)
194
198
  else:
hcs_core/plan/core.py CHANGED
@@ -41,19 +41,13 @@ def _prepare_data(data: dict, additional_context: dict, target_resource_name: st
41
41
  data.update(additional_context)
42
42
  blueprint, pending = process_template(data)
43
43
 
44
- if (
45
- target_resource_name
46
- and target_resource_name not in blueprint["resource"]
47
- and target_resource_name not in blueprint["runtime"]
48
- ):
44
+ if target_resource_name and target_resource_name not in blueprint["resource"] and target_resource_name not in blueprint["runtime"]:
49
45
  raise PlanException("Target resource or runtime not found: " + target_resource_name)
50
46
 
51
47
  for k, v in pending.items():
52
48
  if v.startswith("default.") or v.startswith("var."):
53
49
  if not k.find(".conditions."):
54
- raise PlanException(
55
- f"Invalid blueprint. Unresolved static references. Variable not found: {v}. Required by {k}"
56
- )
50
+ raise PlanException(f"Invalid blueprint. Unresolved static references. Variable not found: {v}. Required by {k}")
57
51
  deployment_id = blueprint["deploymentId"]
58
52
  state_file = deployment_id + ".state.yml"
59
53
  prev = data_util.load_data_file(state_file, default={})
@@ -291,9 +285,7 @@ def _deploy_res(name, res, state):
291
285
  else:
292
286
  new_state = handler.update(res_data, res_state)
293
287
  else:
294
- raise PlanException(
295
- f"Unknown action. This is a problem of the concrete plugin.decide function. Plugin={name}, action={action}"
296
- )
288
+ raise PlanException(f"Unknown action. This is a problem of the concrete plugin.decide function. Plugin={name}, action={action}")
297
289
 
298
290
  if new_state:
299
291
  fn_set_state(new_state)
hcs_core/sglib/auth.py CHANGED
@@ -38,9 +38,9 @@ def _is_auth_valid(auth_data):
38
38
  _login_lock = threading.Lock()
39
39
 
40
40
 
41
- def login(force_refresh: bool = False):
41
+ def login(force_refresh: bool = False, verbose: bool = False):
42
42
  """Ensure login state, using credentials from the current profile. Return oauth token."""
43
- return _populate_token_with_cache(profile.current().csp, force_refresh)
43
+ return _populate_token_with_cache(profile.current().csp, force_refresh, verbose)
44
44
 
45
45
 
46
46
  def refresh_oauth_token(old_oauth_token: dict, csp_url: str):
@@ -98,17 +98,22 @@ def save_auth_cache(auth_config: dict, token: dict):
98
98
  profile.auth.set(cache)
99
99
 
100
100
 
101
- def _populate_token_with_cache(auth_config: dict, force_refresh: bool = False):
102
-
101
+ def _populate_token_with_cache(auth_config: dict, force_refresh: bool = False, verbose: bool = False):
102
+ if verbose:
103
+ print("_populate_token_with_cache")
103
104
  with _login_lock:
104
105
  cache, hash, token = _get_auth_cache(auth_config)
105
106
  if token and not force_refresh:
107
+ if verbose:
108
+ print("Using cached auth token.")
106
109
  return token
107
110
 
108
111
  # invalid token. Refresh or recreate it.
109
112
  if token:
110
113
  # try using refresh token if possible
111
114
  if auth_config.get("provider", "vmwarecsp") == "vmwarecsp":
115
+ if verbose:
116
+ print("Provider: vmwarecsp.")
112
117
  try:
113
118
  token = refresh_oauth_token(token, auth_config.url)
114
119
  except Exception as e:
@@ -116,11 +121,17 @@ def _populate_token_with_cache(auth_config: dict, force_refresh: bool = False):
116
121
  token = None
117
122
  else:
118
123
  # hcs auth-service. Does not support refresh token.
124
+ if verbose:
125
+ print("Provider: hcs auth-service.")
119
126
  token = None
120
127
 
121
128
  if not token:
122
129
  if _has_credential(auth_config):
130
+ if verbose:
131
+ print("Config:", auth_config)
123
132
  token = CspClient.create(**auth_config).oauth_token()
133
+ if verbose:
134
+ print("Token:", json.dumps(token, indent=4))
124
135
  else:
125
136
  if auth_config.get("browser"):
126
137
  from .login_support import login_via_browser
@@ -129,9 +140,7 @@ def _populate_token_with_cache(auth_config: dict, force_refresh: bool = False):
129
140
  if not token:
130
141
  raise CtxpException("Browser auth failed.")
131
142
  else:
132
- raise CtxpException(
133
- "Browser auth was never attempted and no client credentials or API token provided."
134
- )
143
+ raise CtxpException("Browser auth was never attempted and no client credentials or API token provided.")
135
144
 
136
145
  if not token.get("expires_at"):
137
146
  token["expires_at"] = int(time.time() + token["expires_in"])
@@ -32,19 +32,31 @@ _caches = {}
32
32
  _client_instance_lock = threading.RLock()
33
33
 
34
34
 
35
- def _lazy_init(
36
- service_name: str, hdc: str = None, region: str = None
37
- ): # make it deferred so no need to initialize profile
38
- if region and hdc:
39
- raise Exception("region and hdc cannot be specified at the same time.")
40
-
41
- # check per-service override in profile
35
+ def _get_service_override(service_name: str):
42
36
  profile_data = profile.current()
43
37
  override = profile_data.get("override", {})
44
38
  service_override = {}
45
39
  for k, v in override.items():
46
40
  if service_name == k.lower():
47
41
  service_override = v
42
+
43
+ if not service_override:
44
+ if service_name == "org-service":
45
+ service_override = override.get("org", {})
46
+ elif service_name.find("-") >= 0:
47
+ camel_name = "".join(word.capitalize() for word in service_name.split("-"))
48
+ camel_name = camel_name[0].lower() + camel_name[1:]
49
+ service_override = override.get(camel_name, {})
50
+ return service_override
51
+
52
+
53
+ def _lazy_init(service_name: str, hdc: str = None, region: str = None): # make it deferred so no need to initialize profile
54
+ if region and hdc:
55
+ raise Exception("region and hdc cannot be specified at the same time.")
56
+
57
+ profile_data = profile.current()
58
+
59
+ service_override = _get_service_override(service_name)
48
60
  service_override_url = service_override.get("url")
49
61
  if service_override_url:
50
62
  log.debug(f"Using per-service override for {service_name}: {service_override_url}")
@@ -83,7 +95,7 @@ def _lazy_init(
83
95
  if provider == "vmwarecsp":
84
96
  token_url = profile_data.csp.url
85
97
  elif provider == "auth-service":
86
- token_url = profile_data.auth.tokenUrl
98
+ token_url = profile_data.auth["tokenUrl"]
87
99
  else:
88
100
  raise CtxpException(f"Unknown provider: {provider}. Supported providers: vmwarecsp, auth-service.")
89
101
 
@@ -164,9 +176,13 @@ def regional_service_client(service_name: str, region: str = None):
164
176
  return instance
165
177
 
166
178
 
167
- def service_client(service_name: str, region: str = None, hdc: str = None):
179
+ def is_regional_service(service_name: str):
168
180
  regional_services = ["vmhub", "connection-service"]
169
- if service_name in regional_services:
181
+ return service_name in regional_services
182
+
183
+
184
+ def service_client(service_name: str, region: str = None, hdc: str = None):
185
+ if is_regional_service(service_name):
170
186
  return regional_service_client(service_name, region)
171
187
  else:
172
188
  return hdc_service_client(service_name, hdc)
@@ -358,9 +374,7 @@ def wait_for_res_status(
358
374
  if is_ready(status):
359
375
  return t
360
376
  if not is_transition(status):
361
- raise CtxpException(
362
- prefix + f"Unexpected status: {status}. If this is a transition, add it to status_map['transition']."
363
- )
377
+ raise CtxpException(prefix + f"Unexpected status: {status}. If this is a transition, add it to status_map['transition'].")
364
378
 
365
379
  now = time.time()
366
380
  remaining_seconds = timeout_seconds - (now - start)
hcs_core/sglib/csp.py CHANGED
@@ -112,9 +112,7 @@ class CspClient:
112
112
  "Accept": "application/json",
113
113
  }
114
114
  # <no org id for this API>
115
- resp = self._client.post(
116
- "/csp/gateway/am/api/auth/api-tokens/authorize", headers=headers, data=f"api_token={api_token}"
117
- )
115
+ resp = self._client.post("/csp/gateway/am/api/auth/api-tokens/authorize", headers=headers, data=f"api_token={api_token}")
118
116
  self._oauth_token = resp.json()
119
117
  return self._oauth_token
120
118
 
@@ -64,7 +64,7 @@ _auth_success_html = """
64
64
  <h3>You have successfully logged into VMware Horizon Cloud Service.</h3>
65
65
  <p>You can close this window, and return to the terminal.</p>
66
66
  <br/>
67
- <p><a href="https://github.com/euc-eng/hcs-cli">HCS CLI</a> is in beta phase. <a href="https://github.com/euc-eng/hcs-cli/blob/main/doc/hcs-cli-cheatsheet.md">Cheatsheet</a>:</p>
67
+ <p><a href="https://github.com/euc-eng/hcs-cli/blob/dev/README.md">HCS CLI</a> is in beta. <a href="https://github.com/euc-eng/hcs-cli/blob/main/doc/hcs-cli-cheatsheet.md">Cheatsheet</a>:</p>
68
68
  <code>
69
69
  # To get the login details: <br/>
70
70
  hcs login -d <br/><br/>
hcs_core/util/job_view.py CHANGED
@@ -153,9 +153,7 @@ class JobView:
153
153
  _MyPlainBarColumn(),
154
154
  # TextColumn("[white][progress.percentage][white]{task.percentage:>3.0f}%"),
155
155
  # TaskProgressColumn(show_speed=True),
156
- TimeRemainingColumn(
157
- compact=True, elapsed_when_finished=True, table_column=Column(style="white", min_width=5)
158
- ),
156
+ TimeRemainingColumn(compact=True, elapsed_when_finished=True, table_column=Column(style="white", min_width=5)),
159
157
  TextColumn("{task.fields[details]}", table_column=Column(max_width=msg_width, no_wrap=True)),
160
158
  get_time=monotonic,
161
159
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hcs-core
3
- Version: 0.1.290
3
+ Version: 0.1.292
4
4
  Summary: Horizon Cloud Service CLI module.
5
5
  Project-URL: Homepage, https://github.com/euc-eng/hcs-cli
6
6
  Project-URL: Bug Tracker, https://github.com/euc-eng/hcs-cli/issues
@@ -14,29 +14,29 @@ Classifier: License :: OSI Approved :: MIT License
14
14
  Classifier: Operating System :: OS Independent
15
15
  Classifier: Programming Language :: Python :: 3
16
16
  Requires-Python: >=3.9
17
- Requires-Dist: authlib>=1.2.1
18
- Requires-Dist: click>=8.1.7
17
+ Requires-Dist: authlib>=1.6.0
18
+ Requires-Dist: click>=8.2.1
19
19
  Requires-Dist: coloredlogs>=15.0.1
20
- Requires-Dist: cryptography>=42.0.7
21
- Requires-Dist: graphviz>=0.20.3
22
- Requires-Dist: httpx>=0.27.0
23
- Requires-Dist: packaging>=24.0
24
- Requires-Dist: portalocker>=2.8.2
25
- Requires-Dist: psutil>=5.9.4
26
- Requires-Dist: pydantic>=2.0.0
27
- Requires-Dist: pyjwt>=2.8.0
28
- Requires-Dist: pyopenssl>=24.1.0
29
- Requires-Dist: python-dotenv>=1.1.0
20
+ Requires-Dist: cryptography>=45.0.5
21
+ Requires-Dist: graphviz>=0.21
22
+ Requires-Dist: httpx>=0.28.0
23
+ Requires-Dist: packaging>=25.0
24
+ Requires-Dist: portalocker>=3.0.0
25
+ Requires-Dist: psutil>=7.0.0
26
+ Requires-Dist: pydantic>=2.11.7
27
+ Requires-Dist: pyjwt>=2.10.1
28
+ Requires-Dist: pyopenssl>=25.1.0
29
+ Requires-Dist: python-dotenv>=1.1.1
30
30
  Requires-Dist: pyyaml>=6.0.1
31
31
  Requires-Dist: questionary>=2.0.1
32
- Requires-Dist: rel>=0.4.7
32
+ Requires-Dist: rel>=0.4.9.20
33
33
  Requires-Dist: retry>=0.9.2
34
- Requires-Dist: rich>=13.7.1
34
+ Requires-Dist: rich>=14.0.0
35
35
  Requires-Dist: schedule>=1.1.0
36
36
  Requires-Dist: setuptools>=70.0.0
37
37
  Requires-Dist: tabulate>=0.9.0
38
38
  Requires-Dist: websocket-client>=1.2.3
39
- Requires-Dist: yumako>=0.1.24
39
+ Requires-Dist: yumako>=0.1.27
40
40
  Provides-Extra: dev
41
41
  Requires-Dist: bandit; extra == 'dev'
42
42
  Requires-Dist: black; extra == 'dev'
@@ -1,37 +1,38 @@
1
- hcs_core/__init__.py,sha256=bwKnrwO9ZdAegnigTknEQxy0oRqb3ET-uKciKxJ5eh0,24
1
+ hcs_core/__init__.py,sha256=rlrcis_5gp71WIO25TttG61HHOEXX3DQr5w9DNXq-Fo,24
2
2
  hcs_core/ctxp/__init__.py,sha256=bHVHhJP10Luz1a3Kk3zFx14dAO4SY6Q20Lrv8rNWWGc,1075
3
- hcs_core/ctxp/_init.py,sha256=yq46VOty4zs_WcLt1SrtePxbW8S4RIz4YUCP3xIBvCA,2797
4
- hcs_core/ctxp/cli_options.py,sha256=j4LUukG1k6etJFATb8mGXvqB7DiEC-VOP23w7KVO9sY,2751
5
- hcs_core/ctxp/cli_processor.py,sha256=L4ai8ZAKBkhII_6dwehxNGPrrvFOrq0CFaMHav0F2Y0,7485
3
+ hcs_core/ctxp/_init.py,sha256=QCIAHCue6KZQ-gq-dcxHsGW5QQQmhuGgBUm_E9x_Beg,2885
4
+ hcs_core/ctxp/cli_options.py,sha256=cwlUgYXzIie9eRcu8fkBo_iFvC8LhflKGblWYtM2Hto,2739
5
+ hcs_core/ctxp/cli_processor.py,sha256=pVfMLAJne34YY2EYz_Tz-8yUxUry60gooGm6EFPIieM,7652
6
6
  hcs_core/ctxp/cmd_util.py,sha256=_-VwQSmkfi52qWC3uHQI06mSiIPfsZroDruTDYHXiMA,3119
7
7
  hcs_core/ctxp/config.py,sha256=vRdzPxi3Yrt04cnR6b5mJwEOtYBh21qvmlSSsgyGoI4,931
8
8
  hcs_core/ctxp/context.py,sha256=y0ouOzXyYTg9MOuWjzjls9WfOKYaO31_MGJJ2S-Y9p4,3375
9
- hcs_core/ctxp/data_util.py,sha256=ODVts-Hy8zB76dGv0KaPYVoVqqh214H3l_Ux7B1HOKA,14985
9
+ hcs_core/ctxp/data_util.py,sha256=PECaLaAQoqTyuYILXm1Deg5iL96tBxgiBhggp-f-qVE,14933
10
10
  hcs_core/ctxp/dispatcher.py,sha256=GAK-jGXDpyX0C88oRDtDi4yeM0qlvID96k98z_vqJkg,2261
11
- hcs_core/ctxp/duration.py,sha256=xmAw-nKnul3VeSXzvbGZ-W2ByBwyK23KxLLm3_aFW_M,2117
11
+ hcs_core/ctxp/duration.py,sha256=_0mt8Ng5mzNzEdSXkOqExPOzQcw8HkQDUH_hwt5CMLM,2109
12
12
  hcs_core/ctxp/extension.py,sha256=UqlDCXJMRKXcoceVak8hVGI_7HggjUWYSgKOFbGVetU,1636
13
13
  hcs_core/ctxp/fn_util.py,sha256=bEYmj5WgUkRE5S4oQjT_zutuViXWYU9q5MR-MlTA_bY,1573
14
14
  hcs_core/ctxp/fstore.py,sha256=lU6et0-w_QPYpQNjdA0QGEdnn7lsmBVuw9XbDvLjwso,8977
15
15
  hcs_core/ctxp/jsondot.py,sha256=U2_ToR8j3-hex75X3OSqTgADiw5cqjRDVO38-IbvapM,11369
16
- hcs_core/ctxp/logger.py,sha256=6Sh1WXUrjrQNU7K6zUlBzE34fIS6o6oMU3eqSknUOEo,6321
17
- hcs_core/ctxp/profile.py,sha256=JgDhRQD00p4jIsiTEjDzpRfKyicA-TgAheXxMBiNCvw,7766
16
+ hcs_core/ctxp/logger.py,sha256=xujPlxw7JGimI_u_sMXnqTOhOTCtrXzpc7501k3Dgm4,6323
17
+ hcs_core/ctxp/profile.py,sha256=X9ZT3mV-0PwRaieQp58dfmL6-KTj0exthppnhipp6uk,7744
18
18
  hcs_core/ctxp/profile_store.py,sha256=v4RvKSaKSJhAt5rEGbC6v-NfaI3N67YffPm-qlrQWdg,1566
19
- hcs_core/ctxp/recent.py,sha256=uKSEdU4L2szbyl-5nYLa3bigZSvSPW8G24Tuk_wYMck,1797
19
+ hcs_core/ctxp/recent.py,sha256=ER1HASPRm1k_3MIO-WVbj2vGipY565ZpBlmo-_V3vjo,1797
20
20
  hcs_core/ctxp/state.py,sha256=gjcMRVONKBq7WiFQo-xca1726ngZe90mnPrF3vbXDrU,1634
21
21
  hcs_core/ctxp/task_schd.py,sha256=mvZMeKDSSo2p7VidSoZY1XZj433TQn_YF9SGJEzl9lg,4586
22
+ hcs_core/ctxp/telemetry.py,sha256=IpJF-BGqU_2nlZm2nfKzpSPwTQQPX_BESMIzR3nH3EM,2483
22
23
  hcs_core/ctxp/template_util.py,sha256=XslvIuRBlTVsUW0Y9M_D8gUPc1jWq6X2p4At2VAe1KU,731
23
24
  hcs_core/ctxp/timeutil.py,sha256=RyRrIRdFHbIghdB8wbC8VdABvc7hki2v51b1x2JvHgo,445
24
- hcs_core/ctxp/util.py,sha256=5RrAjSAM3GRu23a6mnKAnJ6X-WyW9NptngPEEDzm5QM,11434
25
+ hcs_core/ctxp/util.py,sha256=4vnaItrdkxCqMTdBf5bKDJ9dSSX9sraSP9XjGRq6xpU,11616
25
26
  hcs_core/ctxp/var_template.py,sha256=cTjj1UJ58ac6s5z4Oh5hSDQwKixq-rdbCF1D8akjAo0,3219
26
27
  hcs_core/ctxp/built_in_cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
28
  hcs_core/ctxp/built_in_cmds/_ut.py,sha256=e50XBmPim2qRe0RYk_XAuRz1HWYyLJuMu-6dVxWR_fQ,3356
28
29
  hcs_core/ctxp/built_in_cmds/context.py,sha256=bU-BG60DyA8rpv1sw3LpHnPQb1wQiZQCoIMYLW_g5_c,2389
29
- hcs_core/ctxp/built_in_cmds/profile.py,sha256=XjFEIPBAgLJjOQpAPqL-HtTmycWZEps2_S6yY-0wT-k,4401
30
+ hcs_core/ctxp/built_in_cmds/profile.py,sha256=xTIHziDniMd-BXH2XymtP1HB4K9fkkU8STtLVqDuY1Y,4371
30
31
  hcs_core/plan/__init__.py,sha256=5klVuXXLQLn2Hj6Gz2Hc-1XSyDXKE9o-BjQ82oXekiI,465
31
32
  hcs_core/plan/actions.py,sha256=UvCynzApJUxi39HUoPIQ_uownlbvFbJ4aAs6pmulrLY,125
32
33
  hcs_core/plan/base_provider.py,sha256=CSJFN8lopWTUblw8CW78Epnef9BbJVLhPLk9bPfZceM,1299
33
34
  hcs_core/plan/context.py,sha256=5NI5Otk0jGKtBGvO8Sc1xdOHUCu_lXQYNrSctT3Hyq8,116
34
- hcs_core/plan/core.py,sha256=1hZ9Y8ltEFGAT1MbbxpxLSwMU3TwEEEcbRJeO_KrZ-Y,21722
35
+ hcs_core/plan/core.py,sha256=HI9uhZBzxngMTvum2GwzgLpx8bEe6M3JgAxl5CiJywU,21622
35
36
  hcs_core/plan/dag.py,sha256=pyyoMSmbhCsS8BMZI6hW6YDkHqBgjmJOwys9CUDrIts,12926
36
37
  hcs_core/plan/helper.py,sha256=__b8tlzLBT1Rm3vgiS-pWnZImaoZbsmKSRJtt_1gj8E,7763
37
38
  hcs_core/plan/kop.py,sha256=iDnRbYHFCtS3Rs95UVvRgZdSzs-NMwdyr8SztIQQqyg,5774
@@ -41,14 +42,14 @@ hcs_core/plan/provider/dev/_prepare.py,sha256=PvVnheEQwpj8sWYz2lDONQVTs4pHPYuo2c
41
42
  hcs_core/plan/provider/dev/dummy.py,sha256=zKEr9J4WHhlN5gFdmrFyEfCF0xlQlCJg0CC1dG9VaLA,1958
42
43
  hcs_core/plan/provider/dev/fibonacci.py,sha256=8WhDr5c9harNAlVPZomQJEqbWe0hUqbppO6ZkwEUcJ0,1104
43
44
  hcs_core/sglib/__init__.py,sha256=oT0etW7vsEbHlXiGL5x23ZXyyFqeLi81RxQQ5lfKSV0,654
44
- hcs_core/sglib/auth.py,sha256=axgzgTRsXPHEo9VvZ6FLF2uitvFf8vVgHXc3ITTtgkM,6297
45
+ hcs_core/sglib/auth.py,sha256=x2LjNCOTf_OJYsNggTG2rVagnVartyDCOlK4lSpXfso,6773
45
46
  hcs_core/sglib/cli_options.py,sha256=NvdiHpX_o6IYPEM8cQYLb_R7T4aiXVvYLqn6Vk4Q2-Y,1761
46
- hcs_core/sglib/client_util.py,sha256=JvULJXwZzg0NBVEEfqbmiHA123KwGbWJevOO9X-0oj4,13551
47
- hcs_core/sglib/csp.py,sha256=o10XdRO1-vVzzgYcn8kvUJ6EMRsv6ruDh6Q_cqy4pvs,11013
47
+ hcs_core/sglib/client_util.py,sha256=t7zCldRRWt5f0l4TTRhmX-ZIaEm6MzNs_3B2RlwtXfk,14119
48
+ hcs_core/sglib/csp.py,sha256=UcO68YtLOPDQWiTjPVIPwQ2Z-Mywc-154aoIkLdyzwE,10991
48
49
  hcs_core/sglib/ez_client.py,sha256=_u9HvPXW5H8zDjaBr3bsTZqzveOlehq4EWDMeF_cwFY,8135
49
50
  hcs_core/sglib/hcs_client.py,sha256=pjrAVQDEy2tiQMypMpOzODFntT6aNHXjje8or_mkL2U,804
50
51
  hcs_core/sglib/init.py,sha256=w_0ZU70Q1TGbSZsqSi7ewKQqpExFlepOT7mIqH0wnho,310
51
- hcs_core/sglib/login_support.py,sha256=tSkfmThubbWDUFLfx0hzdHp_QW0TR3gYISzvw6FKpjs,7561
52
+ hcs_core/sglib/login_support.py,sha256=rHKZDAZXlo62IsjETyXxCSPxg1L4nV6ffZM_tulfe0A,7574
52
53
  hcs_core/sglib/payload_util.py,sha256=Hnj7rjzrQ1j5gpbrwZX34biN8MIZjy6dOJZ63ulmzdw,685
53
54
  hcs_core/sglib/requtil.py,sha256=O37DrD4VVBmmRkkHJLbDtPfFq8l6fLZwYZggt2FTEFc,920
54
55
  hcs_core/sglib/utils.py,sha256=FLgB8M5EiS3WhCzX5xUA9aFzB5jKQI8pqxtrmE4SsjQ,3164
@@ -57,12 +58,12 @@ hcs_core/util/check_license.py,sha256=-ZBMVoVcEUwICZ0QRK-e2uMMla7gFbjP9upun93lPE
57
58
  hcs_core/util/duration.py,sha256=e7Nw22aYXJK-pLM59QDel5atLZxShKBiVILFgrtLJks,4194
58
59
  hcs_core/util/exit.py,sha256=UStMZKlfCFN7GBouc1y3pPFGPFQ66qfcRZ_fYQXFD0E,838
59
60
  hcs_core/util/hcs_constants.py,sha256=Ic1Tx_UNJiQchfsdnRDzgiOaCjKHnsWXx997nElppm4,1755
60
- hcs_core/util/job_view.py,sha256=SsACAqHTXSCmKFDD0DDDNK2eKykGgjo_DlLw8CJbRxM,8408
61
+ hcs_core/util/job_view.py,sha256=-cSqZpVecfcUskG9RYqIXcgg7pj0W6dKDAy2Lt1CPik,8378
61
62
  hcs_core/util/pki_util.py,sha256=Lt3-IzIoGcaQKNE7KUszxR7JSZkpXduVZJ262TszsIs,6685
62
63
  hcs_core/util/query_util.py,sha256=5bh3bUVIQuY9qerndfuyfyzkTExYJ8zD0_e3PSN7y-4,3142
63
64
  hcs_core/util/scheduler.py,sha256=bPpCmGUL1UctJMfLPAg-h4Hl2YZr96FiI78-G_Usn08,2958
64
65
  hcs_core/util/ssl_util.py,sha256=MvU102fGwWWh9hhSmLnn1qQIWuD6TjZnN0iH0MXUtW0,1239
65
66
  hcs_core/util/versions.py,sha256=urMtShfoBx_Eqq0D-450LP0i-rW447k9yX8q8j5H_qA,1721
66
- hcs_core-0.1.290.dist-info/METADATA,sha256=JsjF5lDDx6OWqmoe_8T2qZF5yRNEsPpNZ-N53y1r-po,1911
67
- hcs_core-0.1.290.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
68
- hcs_core-0.1.290.dist-info/RECORD,,
67
+ hcs_core-0.1.292.dist-info/METADATA,sha256=6vW-ZkE7bCyQBtm53Y1-faUcW_wvuaXiFcvWwjlIm0E,1914
68
+ hcs_core-0.1.292.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
69
+ hcs_core-0.1.292.dist-info/RECORD,,