qmenta-sdk-lib 2.1.dev3486__py3-none-any.whl → 2.1.dev3488__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.
@@ -3,7 +3,7 @@
3
3
  import json
4
4
  import os
5
5
  import re
6
- from tkinter import filedialog, CENTER, END, messagebox
6
+ from tkinter import filedialog, CENTER, END, LEFT, RIGHT, X, Y, BOTH, YES, HORIZONTAL, TOP, messagebox
7
7
 
8
8
  import ttkbootstrap as ttk
9
9
  from PIL import Image, ImageTk
@@ -50,7 +50,7 @@ def gui_tkinter():
50
50
  "image_name": image_name_entry.get(),
51
51
  "docker_url": docker_url_entry.get(),
52
52
  "docker_user": docker_user_entry.get(),
53
- "docker_password": tool_version_entry.get(),
53
+ "docker_password": docker_password_entry.get(),
54
54
  }
55
55
  return values
56
56
 
@@ -111,162 +111,138 @@ def gui_tkinter():
111
111
 
112
112
  # window
113
113
  window = ttk.Window(themename="darkly")
114
- window.resizable(False, True)
115
-
114
+ window.resizable(True, True)
116
115
  window.title("Tool Publishing GUI")
116
+ window.geometry("600x800")
117
+
117
118
  write_dir = ttk.StringVar()
118
119
 
119
- # image
120
- logo = Image.open(
121
- os.path.join(
122
- os.path.dirname(__file__), "templates_tool_maker", "qmenta.png"
123
- )
124
- ).resize((500, 110))
125
- img = ImageTk.PhotoImage(logo)
126
- image_label = ttk.Label(master=window, image=img, padding=5, anchor=CENTER)
127
- image_label.config(image=img)
128
- image_label.pack(side="top")
129
-
130
- # title
131
- title_label = ttk.Label(
132
- master=window,
133
- text="QMENTA Platform credentials.",
134
- font="bold",
135
- )
136
- title_label.pack(padx=10, pady=10)
120
+ # --- SCROLLBAR & CANVAS SETUP ---
137
121
 
138
- # title
139
- title_label = ttk.Label(
140
- master=window, text="(*) indicates mandatory field."
141
- )
142
- title_label.pack(padx=10, pady=10)
143
-
144
- user_id_frame = ttk.Frame(master=window)
145
- user_id_label = ttk.Label(master=user_id_frame, text="Username*")
146
- user_id_label.pack(side="left")
147
- user_id_entry = ttk.Entry(master=user_id_frame)
148
- user_id_entry.pack(side="left", padx=10)
149
- user_id_frame.pack(pady=10)
150
-
151
- password_frame = ttk.Frame(master=window)
152
- password_label = ttk.Label(master=password_frame, text="Password*")
153
- password_label.pack(side="left")
154
- password_entry = ttk.Entry(master=password_frame, show="*")
155
- password_entry.pack(side="left", padx=10)
156
- password_frame.pack(pady=10)
157
-
158
- # Create a button to browse for a folder
159
- folder_tool_frame = ttk.Frame(master=window)
160
- folder_tool_label = ttk.Label(
161
- master=folder_tool_frame,
162
- text="Select folder where the tool is stored.*",
163
- )
164
- folder_tool_label.pack(side="left")
165
- folder_tool_button = ttk.Button(
166
- master=folder_tool_frame, text="Browse Folder", command=browse_folder
167
- )
168
- folder_tool_button.pack(side="left", padx=10)
169
- folder_label = ttk.Label(master=folder_tool_frame, textvariable=write_dir)
170
- folder_label.pack(side="bottom", pady=10)
171
- folder_tool_frame.pack(pady=10)
172
-
173
- # input tool ID field
174
- tool_id_frame = ttk.Frame(master=window)
175
- tool_id_label = ttk.Label(
176
- master=tool_id_frame, text="Specify the tool ID.*"
177
- )
178
- tool_id_label.pack(side="left")
179
- tool_id_entry = ttk.Entry(master=tool_id_frame)
180
- tool_id_entry.pack(side="left", padx=10)
181
- tool_id_frame.pack(pady=10)
182
-
183
- # input tool version field
184
- tool_version_frame = ttk.Frame(master=window)
185
- tool_version_label = ttk.Label(
186
- master=tool_version_frame, text="Specify the tool version.*"
187
- )
188
- tool_version_label.pack(side="left")
189
- tool_version_entry = ttk.Entry(master=tool_version_frame)
190
- tool_version_entry.pack(side="left", padx=10)
191
- tool_version_frame.pack(pady=10)
192
-
193
- tool_name_frame = ttk.Frame(master=window)
194
- tool_name_label = ttk.Label(
195
- master=tool_name_frame, text="Specify the tool name.*"
196
- )
197
- tool_name_label.pack(side="left")
198
- tool_name_entry = ttk.Entry(master=tool_name_frame)
199
- tool_name_entry.pack(side="left", padx=10)
200
- tool_name_frame.pack(pady=10)
201
-
202
- num_cores_frame = ttk.Frame(master=window)
203
- num_cores_label = ttk.Label(
204
- master=num_cores_frame,
205
- text="How many cores does the tool require? (integer, "
206
- f"max. {MAX_CORES})",
207
- )
208
- num_cores_label.pack(side="left")
209
- num_cores_entry = ttk.Entry(master=num_cores_frame)
210
- num_cores_entry.insert(0, "1")
211
- num_cores_entry.pack(side="left", padx=10)
212
- num_cores_frame.pack(pady=10)
213
-
214
- memory_frame = ttk.Frame(master=window)
215
- memory_label = ttk.Label(
216
- master=memory_frame,
217
- text=f"How many GB of RAM does the tool require? "
218
- f"(integer, max. {MAX_RAM})",
219
- )
220
- memory_label.pack(side="left")
221
- memory_entry = ttk.Entry(master=memory_frame)
222
- memory_entry.insert(0, "1")
223
- memory_entry.pack(side="left", padx=10)
224
- memory_frame.pack(pady=10)
225
-
226
- image_name_frame = ttk.Frame(master=window)
227
- image_name_label = ttk.Label(
228
- master=image_name_frame, text="Docker image name"
229
- )
230
- image_name_label.pack(side="left")
231
- image_name_entry = ttk.Entry(master=image_name_frame)
232
- image_name_entry.pack(side="left", padx=10)
233
- image_name_frame.pack(pady=10)
234
-
235
- title_label = ttk.Label(
236
- master=window,
237
- text="Docker image registry and credentials. "
238
- "Credentials need to be valid in order to be able to pull the "
239
- "Docker image from the registry.",
240
- )
241
- title_label.pack(padx=10, pady=10)
122
+ # Main container to hold canvas and scrollbar
123
+ main_container = ttk.Frame(window)
124
+ main_container.pack(fill=BOTH, expand=YES)
125
+ # Canvas
126
+ canvas = ttk.Canvas(main_container)
127
+ # Scrollbar linked to canvas
128
+ vbar = ttk.Scrollbar(main_container, orient="vertical", command=canvas.yview)
129
+ canvas.configure(yscrollcommand=vbar.set)
242
130
 
243
- docker_url_frame = ttk.Frame(master=window)
244
- docker_url_label = ttk.Label(
245
- master=docker_url_frame, text="Docker registry URL"
246
- )
247
- docker_url_label.pack(side="left")
248
- docker_url_entry = ttk.Entry(master=docker_url_frame)
249
- docker_url_entry.insert(0, "hub.docker.com")
250
- docker_url_entry.pack(side="left", padx=10)
251
- docker_url_frame.pack(pady=10)
252
-
253
- docker_user_frame = ttk.Frame(master=window)
254
- docker_user_label = ttk.Label(
255
- master=docker_user_frame, text="Docker registry user"
256
- )
257
- docker_user_label.pack(side="left")
258
- docker_user_entry = ttk.Entry(master=docker_user_frame)
259
- docker_user_entry.pack(side="left", padx=10)
260
- docker_user_frame.pack(pady=10)
261
-
262
- docker_password_frame = ttk.Frame(master=window)
263
- docker_password_label = ttk.Label(
264
- master=docker_password_frame, text="Docker registry password*"
265
- )
266
- docker_password_label.pack(side="left")
267
- docker_password_entry = ttk.Entry(master=docker_password_frame, show="*")
268
- docker_password_entry.pack(side="left", padx=10)
269
- docker_password_frame.pack(pady=10)
131
+ vbar.pack(side=RIGHT, fill=Y)
132
+ canvas.pack(side=LEFT, fill=BOTH, expand=YES)
133
+
134
+ # The actual frame that holds the content
135
+ content_frame = ttk.Frame(canvas, padding=20)
136
+ canvas_window_id = canvas.create_window((0, 0), window=content_frame, anchor="nw", tags="inner_frame")
137
+
138
+ # --- RESIZE LOGIC ---
139
+
140
+ # Update scrollregion when content changes size
141
+ def configure_scroll_region(event):
142
+ canvas.configure(scrollregion=canvas.bbox("all"))
143
+
144
+ content_frame.bind("<Configure>", configure_scroll_region)
145
+
146
+ # Force the inner frame to match the canvas width (Horizontal Fill)
147
+ def on_canvas_resize(event):
148
+ canvas.itemconfig(canvas_window_id, width=event.width)
149
+
150
+ canvas.bind("<Configure>", on_canvas_resize)
151
+
152
+ def _on_mousewheel_windows(event):
153
+ # Windows/macOS: event.delta is usually multiples of 120
154
+ # We divide by 120 to get the number of "steps"
155
+ canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")
156
+
157
+ def _on_linux_scroll_up(event):
158
+ # Linux (X11) often sends Button-4 for scroll up
159
+ canvas.yview_scroll(-1, "units")
160
+
161
+ def _on_linux_scroll_down(event):
162
+ # Linux (X11) often sends Button-5 for scroll down
163
+ canvas.yview_scroll(1, "units")
164
+
165
+ # Bind Standard MouseWheel (Windows/macOS)
166
+ window.bind_all("<MouseWheel>", _on_mousewheel_windows)
167
+ # Bind Linux specific buttons (X11)
168
+ window.bind_all("<Button-4>", _on_linux_scroll_up)
169
+ window.bind_all("<Button-5>", _on_linux_scroll_down)
170
+
171
+ # --- WIDGETS ---
172
+
173
+ # Logo Image
174
+ try:
175
+ # Adjusted path logic for safety
176
+ img_path = os.path.join(os.path.dirname(__file__), "templates_tool_maker", "qmenta.png")
177
+ if os.path.exists(img_path):
178
+ logo = Image.open(img_path).resize((500, 110))
179
+ img = ImageTk.PhotoImage(logo)
180
+ image_label = ttk.Label(master=content_frame, image=img, anchor=CENTER)
181
+ image_label.image = img # Keep reference
182
+ image_label.pack(side=TOP, pady=(0, 20))
183
+ except Exception as e:
184
+ print(f"Image load failed: {e}")
185
+
186
+ # Title
187
+ ttk.Label(
188
+ master=content_frame,
189
+ text="QMENTA Platform credentials",
190
+ font="Helvetica 16 bold",
191
+ ).pack(pady=10)
192
+
193
+ ttk.Label(
194
+ master=content_frame,
195
+ text="(*) indicates mandatory field.",
196
+ bootstyle="warning"
197
+ ).pack(pady=(0, 20))
198
+
199
+ # Helper to create rows easily
200
+ def create_row(parent, label_text, is_password=False, default=None):
201
+ frame = ttk.Frame(master=parent)
202
+ frame.pack(fill=X, pady=5)
203
+
204
+ lbl = ttk.Label(master=frame, text=label_text, width=30)
205
+ lbl.pack(side=LEFT)
206
+
207
+ entry = ttk.Entry(master=frame, show="*" if is_password else None)
208
+ if default:
209
+ entry.insert(0, str(default))
210
+ entry.pack(side=LEFT, fill=X, expand=YES, padx=10)
211
+ return entry
212
+
213
+ # User inputs
214
+ user_id_entry = create_row(content_frame, "Username*")
215
+ password_entry = create_row(content_frame, "Password*", is_password=True)
216
+
217
+ # Browse Folder Row
218
+ folder_frame = ttk.Frame(master=content_frame)
219
+ folder_frame.pack(fill=X, pady=10)
220
+ ttk.Label(folder_frame, text="Select tool folder*", width=30).pack(side=LEFT)
221
+ ttk.Button(folder_frame, text="Browse Folder", command=browse_folder).pack(side=LEFT, padx=10)
222
+ ttk.Label(folder_frame, textvariable=write_dir).pack(side=LEFT, padx=10)
223
+
224
+ # Tool info
225
+ tool_id_entry = create_row(content_frame, "Specify the tool ID.*")
226
+ tool_version_entry = create_row(content_frame, "Specify the tool version.*")
227
+ tool_name_entry = create_row(content_frame, "Specify the tool name.*")
228
+ num_cores_entry = create_row(content_frame, f"Cores required (integer, max {MAX_CORES})", default="1")
229
+ memory_entry = create_row(content_frame, f"RAM required GB (integer, max {MAX_RAM})", default="1")
230
+ image_name_entry = create_row(content_frame, "Docker image name")
231
+
232
+ # Separator
233
+ ttk.Separator(content_frame, orient=HORIZONTAL).pack(fill=X, pady=20)
234
+
235
+ # Docker registry
236
+ ttk.Label(
237
+ master=content_frame,
238
+ text="Docker Registry Credentials",
239
+ font="Helvetica 12 bold"
240
+ ).pack(pady=10)
241
+ docker_url_entry = create_row(content_frame, "Docker registry URL", default="hub.docker.com")
242
+ docker_user_entry = create_row(content_frame, "Docker registry user")
243
+ docker_password_entry = create_row(content_frame, "Docker registry password*", is_password=True)
244
+
245
+ # --- ACTIONS ---
270
246
 
271
247
  gui_content = {}
272
248
 
@@ -276,15 +252,14 @@ def gui_tkinter():
276
252
  if gui_content:
277
253
  window.destroy()
278
254
 
279
- action_frame = ttk.Frame(master=window)
280
- button = ttk.Button(
255
+ action_frame = ttk.Frame(master=content_frame)
256
+ action_frame.pack(pady=30)
257
+ ttk.Button(
281
258
  master=action_frame,
282
259
  text="Publish in QMENTA Platform",
283
260
  command=submit_form,
284
261
  bootstyle="primary",
285
- )
286
- button.pack(side="left")
287
- action_frame.pack(pady=10)
262
+ ).pack(side=LEFT, pady=10)
288
263
 
289
264
  def quit_tool_creator():
290
265
  window.destroy()
@@ -296,7 +271,7 @@ def gui_tkinter():
296
271
  text="Quit",
297
272
  command=quit_tool_creator,
298
273
  bootstyle="danger",
299
- ).pack(side="left", padx=10)
274
+ ).pack(side=LEFT, padx=10)
300
275
 
301
276
  # run
302
277
  window.mainloop()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qmenta-sdk-lib
3
- Version: 2.1.dev3486
3
+ Version: 2.1.dev3488
4
4
  Summary: QMENTA SDK for tool development.
5
5
  Author: QMENTA
6
6
  Maintainer: Marc Ramos
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.13
13
13
  Requires-Dist: enum-compat (>=0.0.1)
14
14
  Requires-Dist: future (>=0.18.2)
15
15
  Requires-Dist: humanfriendly (>=1.0)
16
+ Requires-Dist: numpy (<2.0)
16
17
  Requires-Dist: pytest-cov (>=6.1.1,<7.0.0)
17
18
  Requires-Dist: qmenta-client (>=1.0)
18
19
  Requires-Dist: requests (>=1.0)
@@ -20,7 +20,7 @@ qmenta/sdk/tool_maker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
20
20
  qmenta/sdk/tool_maker/context.py,sha256=Lkyof8Ox8ZqXw2XbkNFHrZLWJxScP9u2_-2Qs4zzLis,1100
21
21
  qmenta/sdk/tool_maker/file_filter.py,sha256=4KLT0Lx2gHhX3JvtNtEeBK20X6T_9KygkptDXmqptuY,3001
22
22
  qmenta/sdk/tool_maker/inputs.py,sha256=r5eUA4L4d1He1D3M3ZhQPMy0QNtVD6DsWr-3EvPiTYE,7898
23
- qmenta/sdk/tool_maker/integration_ui.py,sha256=9h9oqm-7wmRUppfMFKd7bs83UHDQkA2St56swSR7hg4,12694
23
+ qmenta/sdk/tool_maker/integration_ui.py,sha256=vxqCzoIeRZOh0MhXUUDZwtMSdYpsfh7zlEW_0vLYOsE,12247
24
24
  qmenta/sdk/tool_maker/integration_workflow_ui.py,sha256=6qaUtK0EepW1mFUyedYhs6jtGCHqc6zi5TtUj-KiGNg,18038
25
25
  qmenta/sdk/tool_maker/launch_gui.py,sha256=Ki7bEaVpyF5edk60Rr8_aNqJSCgba18QCCaAXdPfqNU,4595
26
26
  qmenta/sdk/tool_maker/make_files.py,sha256=-WNx2Q5xgSGhNAYUj0ZT-BSRR3Hy0wmDla6SBO6i2Qc,3256
@@ -33,6 +33,7 @@ qmenta/sdk/tool_maker/templates_tool_maker/qmenta.png,sha256=eLK20DXE32R2CH-T0fU
33
33
  qmenta/sdk/tool_maker/templates_tool_maker/test_tool_schema,sha256=UZdRUz-iLpY1qGFCsKBycTXsdiJSXDXGpngyaz6gV-A,2922
34
34
  qmenta/sdk/tool_maker/templates_tool_maker/tool_schema,sha256=Dp3Ku1Xe-YYa4hBIUxNlWVPe8jJjxHhSgUobyJ3Miuo,9184
35
35
  qmenta/sdk/tool_maker/tool_maker.py,sha256=2PIGArMo8FYneuPBlh6XeNcoXLW2uwzwFR9lvFSYC0U,31983
36
- qmenta_sdk_lib-2.1.dev3486.dist-info/METADATA,sha256=sIYiEQhYp-XAXa9DnlJ8DKRcS7T0D_eQwLmO7JzsaMw,728
37
- qmenta_sdk_lib-2.1.dev3486.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
38
- qmenta_sdk_lib-2.1.dev3486.dist-info/RECORD,,
36
+ qmenta_sdk_lib-2.1.dev3488.dist-info/METADATA,sha256=j2oLJXc_VsyadX7OnLv2A7LCCPKRpQaXx9BGQwCp0PU,756
37
+ qmenta_sdk_lib-2.1.dev3488.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
38
+ qmenta_sdk_lib-2.1.dev3488.dist-info/entry_points.txt,sha256=wTKUgvwRUmbpc4ehB3XRmG1GUXSYRVfID6MuzWNVkZs,195
39
+ qmenta_sdk_lib-2.1.dev3488.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ [console_scripts]
2
+ tool-maker=qmenta.sdk.tool_maker.launch_gui:main
3
+ tool-publisher=qmenta.sdk.tool_maker.integration_ui:main
4
+ workflow-publisher=qmenta.sdk.tool_maker.integration_workflow_ui:main
5
+