jvcli 2.0.23__py3-none-any.whl → 2.0.25__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.
jvcli/__init__.py CHANGED
@@ -4,5 +4,5 @@ jvcli package initialization.
4
4
  This package provides the CLI tool for Jivas Package Repository.
5
5
  """
6
6
 
7
- __version__ = "2.0.23"
7
+ __version__ = "2.0.25"
8
8
  __supported__jivas__versions__ = ["2.0.0"]
jvcli/client/app.py CHANGED
@@ -146,6 +146,13 @@ def main() -> None:
146
146
  ):
147
147
  st.session_state.actions_data = actions_data
148
148
 
149
+ # Sort actions_data alphabetically by the action's title
150
+ actions_data.sort(
151
+ key=lambda action: action.get("_package", {})
152
+ .get("meta", {})
153
+ .get("title", "")
154
+ )
155
+
149
156
  for action in actions_data:
150
157
  package = action.get("_package", {})
151
158
 
@@ -63,80 +63,99 @@ def snake_to_title(snake_str: str) -> str:
63
63
  return snake_str.replace("_", " ").title()
64
64
 
65
65
 
66
- def app_controls(agent_id: str, action_id: str) -> None:
66
+ def app_controls(
67
+ agent_id: str,
68
+ action_id: str,
69
+ hidden: Optional[list] = None,
70
+ masked: Optional[list] = None,
71
+ ) -> None:
67
72
  """Render the app controls for a given agent and action."""
73
+ if hidden is None:
74
+ hidden = []
75
+ if masked is None:
76
+ masked = []
77
+
68
78
  # Generate a dynamic key for the session state using the action_id
69
79
  model_key = f"model_{agent_id}_{action_id}"
70
80
 
81
+ # Combine default masked keys with additional keys specified in 'masked'
82
+ default_masked_keys = [
83
+ "password",
84
+ "token",
85
+ "api_key",
86
+ "key",
87
+ "secret",
88
+ "secret_key",
89
+ ]
90
+ all_masked_keys = set(default_masked_keys + masked)
91
+
71
92
  # Recursive function to handle nested dictionaries
72
93
  def render_fields(item_key: str, value: Any, parent_key: str = "") -> None:
73
94
  """Render fields based on their type."""
74
95
 
96
+ # Skip rendering if the field is in the hidden list
97
+ if item_key in hidden:
98
+ return
99
+
75
100
  field_type = type(value)
76
101
  label = snake_to_title(item_key) # Convert item_key to Title Case
77
102
 
78
- if item_key not in st.session_state.get("model_key", {}).keys():
79
- # Special case for 'api_key' to render as a password field
80
- if any(
81
- keyword in item_key.lower() or item_key.lower() in keyword
82
- for keyword in ["password", "token", "api_key", "key", "secret"]
83
- ):
84
- st.session_state[model_key][item_key] = st.text_input(
85
- label, value=value, type="password", key=item_key
86
- )
87
-
88
- elif field_type == int:
89
- st.session_state[model_key][item_key] = st.number_input(
90
- label, value=value, step=1, key=item_key
91
- )
92
-
93
- elif field_type == float:
94
- st.session_state[model_key][item_key] = st.number_input(
95
- label, value=value, step=0.01, key=item_key
103
+ # Special case for masked fields to render as a password field
104
+ if item_key.lower() in all_masked_keys:
105
+ st.session_state[model_key][item_key] = st.text_input(
106
+ label, value=value, type="password", key=item_key
107
+ )
108
+
109
+ elif field_type == int:
110
+ st.session_state[model_key][item_key] = st.number_input(
111
+ label, value=value, step=1, key=item_key
112
+ )
113
+
114
+ elif field_type == float:
115
+ st.session_state[model_key][item_key] = st.number_input(
116
+ label, value=value, step=0.01, key=item_key
117
+ )
118
+
119
+ elif field_type == bool:
120
+ st.session_state[model_key][item_key] = st.checkbox(
121
+ label, value=value, key=item_key
122
+ )
123
+
124
+ elif field_type == list:
125
+ yaml_str = st.text_area(
126
+ label + " (YAML format)", value=yaml.dump(value), key=item_key
127
+ )
128
+ try:
129
+ # Update the list with the user-defined YAML
130
+ loaded_value = yaml.safe_load(yaml_str)
131
+ if not isinstance(loaded_value, list):
132
+ raise ValueError("The provided YAML does not produce a list.")
133
+ st.session_state[model_key][item_key] = loaded_value
134
+ except (yaml.YAMLError, ValueError) as e:
135
+ st.error(f"Error parsing YAML for {item_key}: {e}")
136
+
137
+ elif field_type == str:
138
+ if len(value) > 100:
139
+ st.session_state[model_key][item_key] = st.text_area(
140
+ label, value=value, key=item_key
96
141
  )
97
-
98
- elif field_type == bool:
99
- st.session_state[model_key][item_key] = st.checkbox(
142
+ else:
143
+ st.session_state[model_key][item_key] = st.text_input(
100
144
  label, value=value, key=item_key
101
145
  )
102
146
 
103
- elif field_type == list:
104
- yaml_str = st.text_area(
105
- label + " (YAML format)", value=yaml.dump(value), key=item_key
106
- )
107
- try:
108
- # Update the list with the user-defined YAML
109
- loaded_value = yaml.safe_load(yaml_str)
110
- if not isinstance(loaded_value, list):
111
- raise ValueError("The provided YAML does not produce a list.")
112
- st.session_state[model_key][item_key] = loaded_value
113
- except (yaml.YAMLError, ValueError) as e:
114
- st.error(f"Error parsing YAML for {item_key}: {e}")
115
-
116
- elif field_type == str:
117
- if len(value) > 100:
118
- st.session_state[model_key][item_key] = st.text_area(
119
- label, value=value, key=item_key
120
- )
121
- else:
122
- st.session_state[model_key][item_key] = st.text_input(
123
- label, value=value, key=item_key
124
- )
125
-
126
- elif field_type == dict:
127
- yaml_str = st.text_area(
128
- label + " (YAML format)", value=yaml.dump(value), key=item_key
129
- )
130
- try:
131
- # Update the dictionary with the user-defined YAML
132
- st.session_state[model_key][item_key] = (
133
- yaml.safe_load(yaml_str) or {}
134
- )
135
- except yaml.YAMLError as e:
136
- st.error(f"Error parsing YAML for {item_key}: {e}")
147
+ elif field_type == dict:
148
+ yaml_str = st.text_area(
149
+ label + " (YAML format)", value=yaml.dump(value), key=item_key
150
+ )
151
+ try:
152
+ # Update the dictionary with the user-defined YAML
153
+ st.session_state[model_key][item_key] = yaml.safe_load(yaml_str) or {}
154
+ except yaml.YAMLError as e:
155
+ st.error(f"Error parsing YAML for {item_key}: {e}")
137
156
 
138
- else:
139
- st.write(f"Unsupported type for {item_key}: {field_type}")
157
+ else:
158
+ st.write(f"Unsupported type for {item_key}: {field_type}")
140
159
 
141
160
  # Iterate over keys of context except specific keys
142
161
  keys_to_iterate = [
jvcli/commands/publish.py CHANGED
@@ -157,7 +157,7 @@ def _publish_common(
157
157
  return
158
158
 
159
159
  try:
160
- validate_dependencies(info_data["package"].get("dependencies", {}))
160
+ validate_dependencies(info_data["package"].get("dependencies", {}), token)
161
161
  click.secho("Dependencies validated successfully.", fg="yellow")
162
162
  except ValueError as e:
163
163
  click.secho(f"Error validating dependencies: {e}", fg="red")
jvcli/utils.py CHANGED
@@ -3,6 +3,7 @@
3
3
  import os
4
4
  import re
5
5
  import tarfile
6
+ from typing import Optional
6
7
 
7
8
  import click
8
9
  import nodesemver
@@ -124,9 +125,11 @@ def is_version_compatible(
124
125
  return False
125
126
 
126
127
 
127
- def validate_dependencies(dependencies: dict) -> None:
128
+ def validate_dependencies(dependencies: dict, token: Optional[str] = None) -> None:
128
129
  """Ensure all dependencies exist in the registry."""
130
+
129
131
  missing_dependencies = []
132
+
130
133
  for dep, specifier in dependencies.items():
131
134
  if dep == "jivas":
132
135
  # Check if the version is in list of supported versions
@@ -141,8 +144,9 @@ def validate_dependencies(dependencies: dict) -> None:
141
144
  elif dep == "actions":
142
145
  # Check if action exists in the registry
143
146
  for name, spec in specifier.items():
147
+
144
148
  package = RegistryAPI.download_package(
145
- name=name, version=spec, suppress_error=True
149
+ name=name, version=spec, token=token, suppress_error=True
146
150
  )
147
151
 
148
152
  if not package:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jvcli
3
- Version: 2.0.23
3
+ Version: 2.0.25
4
4
  Summary: CLI tool for Jivas Package Repository
5
5
  Home-page: https://github.com/TrueSelph/jvcli
6
6
  Author: TrueSelph Inc.
@@ -1,14 +1,14 @@
1
- jvcli/__init__.py,sha256=VCQXylrCEDTW6Rz0VeY_DYFEzxZFpcUrQk9D4XpnHOk,171
1
+ jvcli/__init__.py,sha256=hmGcEp26_eWo8qciTCKvifjl2lmSurK62rLfkvs089M,171
2
2
  jvcli/api.py,sha256=gd-EP1e75e7HijyrP-EF6i_jjCo6YUeSbm1l5daKLfQ,10352
3
3
  jvcli/auth.py,sha256=mHP425hvXhNxzeX--cApkrP7SdDPmfG6V0Li5TLHmIg,1953
4
4
  jvcli/cli.py,sha256=ntTkriNGtfxFAdJw5ikdq2wD43pIqDpb7lfXsCMXOWQ,1191
5
- jvcli/utils.py,sha256=ZTwvGcEE94aORLDbevfkPNICFqNU8PpqH7d424xuYlg,7242
5
+ jvcli/utils.py,sha256=s58BfXPRspUsyb5UQK_qKHHRXfIN0UtACDQMtQdNQZQ,7315
6
6
  jvcli/client/__init__.py,sha256=WGP05OBzZHReqENYs1qYqMnYvgAaNVW6KvGQvyB3NGs,85
7
- jvcli/client/app.py,sha256=bjdGY9J43qymdmODt0BgzN66Aolyo1653ZuCj_gNdKA,6184
7
+ jvcli/client/app.py,sha256=wQhJNfeF7NOx_MzzgnVy8Nfy9OW5fX0si6A34U1Woek,6452
8
8
  jvcli/client/lib/__init__.py,sha256=_Wv8CNIxeIle_x0U9T6w9s5mPuOY9-0u69BvTEPXLUw,38
9
9
  jvcli/client/lib/page.py,sha256=QF53ffO4A2P9QTdPFfi0baCpKyEMmfkLyhJNxm7pTb0,2225
10
10
  jvcli/client/lib/utils.py,sha256=Z1YJfeu8PnS-Ko2VcvDNu7mP6JrfUP3yJsFdKDf-psg,9692
11
- jvcli/client/lib/widgets.py,sha256=lXPldIM8bCxrF2zP2hxLrdlnLzi4rzcce183_bt8O2s,10060
11
+ jvcli/client/lib/widgets.py,sha256=nWVW6yBh2x75GLkMj7Ck9dVaL2URS97TXgvF5dJsqhM,10166
12
12
  jvcli/client/pages/__init__.py,sha256=sXsBV8cGItWhXtYg8PkfCd1Vi5ibd-rv5LABnPC_St4,51
13
13
  jvcli/client/pages/action_dashboard_page.py,sha256=LvDFUt2-hNSmHTHyN1tDSPaE1sV-m_uyId1sGWuoMsw,5029
14
14
  jvcli/client/pages/analytics_page.py,sha256=TehUi9w6t-m2sW0Q24IfOqsc1WriIoD4_0GqRaYD4kk,8308
@@ -21,7 +21,7 @@ jvcli/commands/client.py,sha256=yIp0wCmoxgxImJrpl0dH9qURGMcVKTxonVd1d-BdsxI,1432
21
21
  jvcli/commands/create.py,sha256=koPSQcQX4yFtZsmODJmPCevkov3m36JpkDHhLmMgzwg,13390
22
22
  jvcli/commands/download.py,sha256=GiLX_43CQOW9d5vF04fAszOWh3AB-7Mgote4tJ9RVng,3416
23
23
  jvcli/commands/info.py,sha256=NyIDpR_AGMMSFPE0tFZv4dIuv_gwqrfd589zQAA_Q3s,2685
24
- jvcli/commands/publish.py,sha256=q1ihoL42GmEsU5ggHN3bcg8QD26kjRUZGfQpRzI2GMo,6630
24
+ jvcli/commands/publish.py,sha256=TntkWRK6P4m0aTWRmFQtT5jYeEJqgxWJKvpUiHlrTQA,6637
25
25
  jvcli/commands/server.py,sha256=UX0h8ssmDMZBfAP58vzC6gpqkiNefPPOGmsJANAcZ38,8150
26
26
  jvcli/commands/startproject.py,sha256=5qis2Dhed-HhKqZ8e37Xpy__Rmqga8cTwAOmfGVPzmU,3375
27
27
  jvcli/commands/studio.py,sha256=avD5M3Ss7R6AtUMN3Mk6AmTyPJ7LnXcmwQ0mbRzivrQ,8192
@@ -53,9 +53,9 @@ jvcli/templates/2.0.0/project/main.jac,sha256=r37jsaGq-85YvDbHP3bQvBXk0u8w0rtRTZ
53
53
  jvcli/templates/2.0.0/project/actions/README.md,sha256=TU1t-rOBH5WQP_HUWaEBLq5BbPv4jejtjIrwTW4hZwM,1742
54
54
  jvcli/templates/2.0.0/project/daf/README.md,sha256=fO-dcc3j-1E6sFagIvvJsISAth11N-2d64G0yHi7JrY,1682
55
55
  jvcli/templates/2.0.0/project/tests/README.md,sha256=-1ZXkxuUKa6tMw_jlF3rpCvUFq8ijW2L-nSuAkbCANo,917
56
- jvcli-2.0.23.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
57
- jvcli-2.0.23.dist-info/METADATA,sha256=Y-geVO2ZGScotSDmFAsdInQ0fYCzWtMJ0T-cMvLD7XE,21667
58
- jvcli-2.0.23.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
59
- jvcli-2.0.23.dist-info/entry_points.txt,sha256=XunGcL0LWmIMIytaUckUA27czEf8M2Y4aTOfYIpOgrQ,42
60
- jvcli-2.0.23.dist-info/top_level.txt,sha256=akZnN9Zy1dFT93N0ms-C8ZXUn-xlhq37nO3jSRp0Y6o,6
61
- jvcli-2.0.23.dist-info/RECORD,,
56
+ jvcli-2.0.25.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
57
+ jvcli-2.0.25.dist-info/METADATA,sha256=SHhrZGcp7r3HHj13q9qQwIVfjx8LLtVuN8UJNM8nZ_g,21667
58
+ jvcli-2.0.25.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
59
+ jvcli-2.0.25.dist-info/entry_points.txt,sha256=XunGcL0LWmIMIytaUckUA27czEf8M2Y4aTOfYIpOgrQ,42
60
+ jvcli-2.0.25.dist-info/top_level.txt,sha256=akZnN9Zy1dFT93N0ms-C8ZXUn-xlhq37nO3jSRp0Y6o,6
61
+ jvcli-2.0.25.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.1.0)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5