MoleditPy 3.0.0a7__tar.gz → 3.0.0a8__tar.gz
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.
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/PKG-INFO +1 -1
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/pyproject.toml +1 -1
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/MoleditPy.egg-info/PKG-INFO +1 -1
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/plugins/plugin_manager_window.py +56 -17
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/utils/constants.py +1 -1
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/LICENSE +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/README.md +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/setup.cfg +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/MoleditPy.egg-info/SOURCES.txt +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/MoleditPy.egg-info/dependency_links.txt +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/MoleditPy.egg-info/entry_points.txt +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/MoleditPy.egg-info/requires.txt +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/MoleditPy.egg-info/top_level.txt +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/__init__.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/__main__.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/assets/file_icon.ico +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/assets/icon.icns +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/assets/icon.ico +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/assets/icon.png +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/core/__init__.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/core/mol_geometry.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/core/molecular_data.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/main.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/plugins/__init__.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/plugins/plugin_interface.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/plugins/plugin_manager.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/__init__.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/about_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/align_plane_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/alignment_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/analysis_window.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/angle_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/app_state.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/atom_item.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/base_picking_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/bond_item.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/bond_length_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/calculation_worker.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/color_settings_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/compute_logic.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/constrained_optimization_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/custom_interactor_style.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/custom_qt_interactor.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/dialog_3d_picking_mixin.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/dialog_logic.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/dihedral_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/edit_3d_logic.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/edit_actions_logic.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/export_logic.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/geometry_base_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/io_logic.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/main_window.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/main_window_init.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/mirror_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/molecular_scene_handler.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/molecule_scene.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/move_group_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/periodic_table_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/planarize_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/settings_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/settings_tabs/__init__.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/settings_tabs/settings_2d_tab.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/settings_tabs/settings_3d_tabs.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/settings_tabs/settings_other_tab.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/settings_tabs/settings_tab_base.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/sip_isdeleted_safe.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/string_importers.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/template_preview_item.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/template_preview_view.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/translation_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/ui_manager.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/user_template_dialog.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/view_3d_logic.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/zoomable_view.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/utils/__init__.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/utils/default_settings.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/utils/sip_isdeleted_safe.py +0 -0
- {moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/utils/system_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MoleditPy
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.0a8
|
|
4
4
|
Summary: A cross-platform, simple, and intuitive molecular structure editor built in Python. It allows 2D molecular drawing and 3D structure visualization. It supports exporting structure files for input to DFT calculation software.
|
|
5
5
|
Author-email: HiroYokoyama <titech.yoko.hiro@gmail.com>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MoleditPy
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.0a8
|
|
4
4
|
Summary: A cross-platform, simple, and intuitive molecular structure editor built in Python. It allows 2D molecular drawing and 3D structure visualization. It supports exporting structure files for input to DFT calculation software.
|
|
5
5
|
Author-email: HiroYokoyama <titech.yoko.hiro@gmail.com>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -10,8 +10,9 @@ Repo: https://github.com/HiroYokoyama/python_molecular_editor
|
|
|
10
10
|
DOI: 10.5281/zenodo.17268532
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
import os
|
|
14
|
-
import shutil
|
|
13
|
+
import os
|
|
14
|
+
import shutil
|
|
15
|
+
import hashlib
|
|
15
16
|
|
|
16
17
|
from PyQt6.QtCore import Qt, QUrl
|
|
17
18
|
from PyQt6.QtGui import QDesktopServices, QDragEnterEvent, QDropEvent
|
|
@@ -257,9 +258,10 @@ class PluginManagerWindow(QDialog):
|
|
|
257
258
|
is_valid = True
|
|
258
259
|
is_folder = True
|
|
259
260
|
|
|
260
|
-
if is_valid:
|
|
261
|
-
|
|
262
|
-
info
|
|
261
|
+
if is_valid:
|
|
262
|
+
sha256_value = self._compute_sha256(file_path)
|
|
263
|
+
# Extract info and confirm
|
|
264
|
+
info = {
|
|
263
265
|
"name": os.path.basename(file_path),
|
|
264
266
|
"version": "Unknown",
|
|
265
267
|
"author": "Unknown",
|
|
@@ -279,14 +281,15 @@ class PluginManagerWindow(QDialog):
|
|
|
279
281
|
elif file_path.endswith(".py"):
|
|
280
282
|
info = self.plugin_manager.get_plugin_info_safe(file_path)
|
|
281
283
|
|
|
282
|
-
msg = (
|
|
283
|
-
f"Do you want to install this plugin?\n\n"
|
|
284
|
-
f"Name: {info['name']}\n"
|
|
285
|
-
f"Author: {info['author']}\n"
|
|
286
|
-
f"Version: {info['version']}\n"
|
|
287
|
-
f"Description: {info['description']}\n\n"
|
|
288
|
-
f"File: {os.path.basename(file_path)}"
|
|
289
|
-
|
|
284
|
+
msg = (
|
|
285
|
+
f"Do you want to install this plugin?\n\n"
|
|
286
|
+
f"Name: {info['name']}\n"
|
|
287
|
+
f"Author: {info['author']}\n"
|
|
288
|
+
f"Version: {info['version']}\n"
|
|
289
|
+
f"Description: {info['description']}\n\n"
|
|
290
|
+
f"File: {os.path.basename(file_path)}\n"
|
|
291
|
+
f"SHA-256: {sha256_value}"
|
|
292
|
+
)
|
|
290
293
|
|
|
291
294
|
reply = QMessageBox.question(
|
|
292
295
|
self,
|
|
@@ -307,7 +310,43 @@ class PluginManagerWindow(QDialog):
|
|
|
307
310
|
summary = ""
|
|
308
311
|
if files_installed:
|
|
309
312
|
summary += "Installed:\n" + "\n".join(files_installed) + "\n\n"
|
|
310
|
-
if errors:
|
|
311
|
-
summary += "Errors:\n" + "\n".join(errors)
|
|
312
|
-
|
|
313
|
-
QMessageBox.information(self, "Plugin Installation", summary)
|
|
313
|
+
if errors:
|
|
314
|
+
summary += "Errors:\n" + "\n".join(errors)
|
|
315
|
+
|
|
316
|
+
QMessageBox.information(self, "Plugin Installation", summary)
|
|
317
|
+
|
|
318
|
+
def _compute_sha256(self, path):
|
|
319
|
+
if os.path.isfile(path):
|
|
320
|
+
return self._sha256_for_file(path)
|
|
321
|
+
if os.path.isdir(path):
|
|
322
|
+
return self._sha256_for_directory(path)
|
|
323
|
+
return "N/A"
|
|
324
|
+
|
|
325
|
+
def _sha256_for_file(self, path):
|
|
326
|
+
hasher = hashlib.sha256()
|
|
327
|
+
try:
|
|
328
|
+
with open(path, "rb") as f:
|
|
329
|
+
for chunk in iter(lambda: f.read(8192), b""):
|
|
330
|
+
hasher.update(chunk)
|
|
331
|
+
return hasher.hexdigest()
|
|
332
|
+
except (AttributeError, OSError, RuntimeError, ValueError, TypeError):
|
|
333
|
+
return "N/A"
|
|
334
|
+
|
|
335
|
+
def _sha256_for_directory(self, dir_path):
|
|
336
|
+
hasher = hashlib.sha256()
|
|
337
|
+
try:
|
|
338
|
+
root = os.path.abspath(dir_path)
|
|
339
|
+
for current_root, _dirs, files in os.walk(root):
|
|
340
|
+
rel_root = os.path.relpath(current_root, root)
|
|
341
|
+
for filename in sorted(files):
|
|
342
|
+
file_path = os.path.join(current_root, filename)
|
|
343
|
+
rel_path = os.path.normpath(os.path.join(rel_root, filename))
|
|
344
|
+
hasher.update(rel_path.encode("utf-8", errors="replace"))
|
|
345
|
+
hasher.update(b"\0")
|
|
346
|
+
with open(file_path, "rb") as f:
|
|
347
|
+
for chunk in iter(lambda: f.read(8192), b""):
|
|
348
|
+
hasher.update(chunk)
|
|
349
|
+
hasher.update(b"\0")
|
|
350
|
+
return hasher.hexdigest()
|
|
351
|
+
except (AttributeError, OSError, RuntimeError, ValueError, TypeError):
|
|
352
|
+
return "N/A"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{moleditpy-3.0.0a7 → moleditpy-3.0.0a8}/src/moleditpy/ui/settings_tabs/settings_other_tab.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|