MoleditPy 1.16.0__py3-none-any.whl → 1.16.0a1__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.
moleditpy/main.py CHANGED
@@ -22,7 +22,10 @@ try:
22
22
  except Exception:
23
23
  # When executed as a standalone script (python main.py) the package-relative
24
24
  # import won't work; fall back to absolute import that works with sys.path
25
- from modules.main_window import MainWindow
25
+ try:
26
+ from .modules.main_window import MainWindow
27
+ except Exception:
28
+ from modules.main_window import MainWindow
26
29
 
27
30
  def main():
28
31
  # --- Windows タスクバーアイコンのための追加処理 ---
@@ -4,7 +4,7 @@ from PyQt6.QtGui import QFont, QColor
4
4
  from rdkit import Chem
5
5
 
6
6
  #Version
7
- VERSION = '1.16.0'
7
+ VERSION = '1.16.0a1'
8
8
 
9
9
  ATOM_RADIUS = 18
10
10
  BOND_OFFSET = 3.5
@@ -109,9 +109,6 @@ class MainWindow(QMainWindow):
109
109
  # create a small proxy (BoundFeature) that will forward call to
110
110
  # the helper class with the MainWindow instance as the first
111
111
  # argument.
112
- # Undo/Redo操作中に状態復元中であることを示すフラグ
113
- # 他のモジュールが呼び出される前に初期化する
114
- self._is_restoring_state = False
115
112
 
116
113
  class BoundFeature:
117
114
  """Bind a feature-class method calls to the MainWindow.
@@ -398,7 +395,7 @@ class MainWindow(QMainWindow):
398
395
 
399
396
  def load_mol_file(self, file_path=None):
400
397
  # --- MOVED TO main_window_molecular_parsers.py ---
401
- return self.main_window_molecular_parsers.load_mol_file(file_path)
398
+ return self.main_window_molecular_parsers.load_mol_file(file_path=None)
402
399
 
403
400
  def load_mol_for_3d_viewing(self):
404
401
  # --- MOVED TO main_window_view_loaders.py ---
@@ -406,9 +403,9 @@ class MainWindow(QMainWindow):
406
403
 
407
404
  def load_xyz_for_3d_viewing(self, file_path=None):
408
405
  # --- MOVED TO main_window_view_loaders.py ---
409
- return self.main_window_view_loaders.load_xyz_for_3d_viewing(file_path)
406
+ return self.main_window_view_loaders.load_xyz_for_3d_viewing(file_path=None)
410
407
 
411
- def load_xyz_file(self, file_path=None):
408
+ def load_xyz_file(self, file_path):
412
409
  # --- MOVED TO main_window_molecular_parsers.py ---
413
410
  return self.main_window_molecular_parsers.load_xyz_file(file_path)
414
411
 
@@ -430,7 +427,7 @@ class MainWindow(QMainWindow):
430
427
 
431
428
  def load_raw_data(self, file_path=None):
432
429
  # --- MOVED TO main_window_project_io.py ---
433
- return self.main_window_project_io.load_raw_data(file_path)
430
+ return self.main_window_project_io.load_raw_data(file_path=None)
434
431
 
435
432
  def save_as_json(self):
436
433
  # --- MOVED TO main_window_project_io.py ---
@@ -442,11 +439,11 @@ class MainWindow(QMainWindow):
442
439
 
443
440
  def load_json_data(self, file_path=None):
444
441
  # --- MOVED TO main_window_project_io.py ---
445
- return self.main_window_project_io.load_json_data(file_path)
442
+ return self.main_window_project_io.load_json_data(file_path=None)
446
443
 
447
444
  def open_project_file(self, file_path=None):
448
445
  # --- MOVED TO main_window_project_io.py ---
449
- return self.main_window_project_io.open_project_file(file_path)
446
+ return self.main_window_project_io.open_project_file(file_path=None)
450
447
 
451
448
  def load_from_json_data(self, json_data):
452
449
  # --- MOVED TO main_window_app_state.py ---
@@ -614,7 +611,7 @@ class MainWindow(QMainWindow):
614
611
 
615
612
  def load_mol_file_for_3d_viewing(self, file_path=None):
616
613
  # --- MOVED TO main_window_view_loaders.py ---
617
- return self.main_window_view_loaders.load_mol_file_for_3d_viewing(file_path)
614
+ return self.main_window_view_loaders.load_mol_file_for_3d_viewing(file_path=None)
618
615
 
619
616
  def load_command_line_file(self, file_path):
620
617
  # --- MOVED TO main_window_main_init.py ---
@@ -80,13 +80,9 @@ except Exception:
80
80
  class MainWindowAppState(object):
81
81
  """ main_window.py から分離された機能クラス """
82
82
 
83
- def __init__(self):
84
- """
85
- クラスの初期化
86
- BoundFeature経由で呼ばれるため、'self' には MainWindow インスタンスが渡されます。
87
- """
88
- self.DEBUG_UNDO = False
89
-
83
+ def __init__(self, main_window):
84
+ """ クラスの初期化 """
85
+ self.mw = main_window
90
86
 
91
87
 
92
88
  def get_current_state(self):
@@ -238,9 +234,6 @@ class MainWindowAppState(object):
238
234
 
239
235
 
240
236
  def push_undo_state(self):
241
- if self._is_restoring_state:
242
- return
243
-
244
237
  current_state_for_comparison = {
245
238
  'atoms': {k: (v['symbol'], v['item'].pos().x(), v['item'].pos().y(), v.get('charge', 0), v.get('radical', 0)) for k, v in self.data.atoms.items()},
246
239
  'bonds': {k: (v['order'], v.get('stereo', 0)) for k, v in self.data.bonds.items()},
@@ -261,15 +254,8 @@ class MainWindowAppState(object):
261
254
  }
262
255
 
263
256
  if not last_state_for_comparison or current_state_for_comparison != last_state_for_comparison:
264
- # Deepcopy state to ensure saved states are immutable and not affected
265
- # by later modifications to objects referenced from the state.
266
- state = copy.deepcopy(self.get_current_state())
257
+ state = self.get_current_state()
267
258
  self.undo_stack.append(state)
268
- if getattr(self, 'DEBUG_UNDO', False):
269
- try:
270
- print(f"DEBUG_UNDO: push_undo_state -> new stack size: {len(self.undo_stack)}")
271
- except Exception:
272
- pass
273
259
  self.redo_stack.clear()
274
260
  # 初期化完了後のみ変更があったことを記録
275
261
  if self.initialization_complete:
@@ -334,11 +320,6 @@ class MainWindowAppState(object):
334
320
  self.undo_stack.clear()
335
321
  self.redo_stack.clear()
336
322
  self.push_undo_state()
337
- if getattr(self, 'DEBUG_UNDO', False):
338
- try:
339
- print(f"DEBUG_UNDO: reset_undo_stack -> undo={len(self.undo_stack)} redo={len(self.redo_stack)}")
340
- except Exception:
341
- pass
342
323
 
343
324
 
344
325
 
@@ -346,12 +327,7 @@ class MainWindowAppState(object):
346
327
  if len(self.undo_stack) > 1:
347
328
  self.redo_stack.append(self.undo_stack.pop())
348
329
  state = self.undo_stack[-1]
349
- self._is_restoring_state = True
350
- try:
351
- self.set_state_from_data(state)
352
- finally:
353
- self._is_restoring_state = False
354
-
330
+ self.set_state_from_data(state)
355
331
 
356
332
  # Undo後に3D構造の状態に基づいてメニューを再評価
357
333
  if self.current_mol and self.current_mol.GetNumAtoms() > 0:
@@ -361,11 +337,6 @@ class MainWindowAppState(object):
361
337
  # 3D構造がない場合は3D編集機能を無効化
362
338
  self._enable_3d_edit_actions(False)
363
339
 
364
- if getattr(self, 'DEBUG_UNDO', False):
365
- try:
366
- print(f"DEBUG_UNDO: undo -> undo_stack size: {len(self.undo_stack)}, redo_stack size: {len(self.redo_stack)}")
367
- except Exception:
368
- pass
369
340
  self.update_undo_redo_actions()
370
341
  self.update_realtime_info()
371
342
  self.view_2d.setFocus()
@@ -376,11 +347,7 @@ class MainWindowAppState(object):
376
347
  if self.redo_stack:
377
348
  state = self.redo_stack.pop()
378
349
  self.undo_stack.append(state)
379
- self._is_restoring_state = True
380
- try:
381
- self.set_state_from_data(state)
382
- finally:
383
- self._is_restoring_state = False
350
+ self.set_state_from_data(state)
384
351
 
385
352
  # Redo後に3D構造の状態に基づいてメニューを再評価
386
353
  if self.current_mol and self.current_mol.GetNumAtoms() > 0:
@@ -390,11 +357,6 @@ class MainWindowAppState(object):
390
357
  # 3D構造がない場合は3D編集機能を無効化
391
358
  self._enable_3d_edit_actions(False)
392
359
 
393
- if getattr(self, 'DEBUG_UNDO', False):
394
- try:
395
- print(f"DEBUG_UNDO: redo -> undo_stack size: {len(self.undo_stack)}, redo_stack size: {len(self.redo_stack)}")
396
- except Exception:
397
- pass
398
360
  self.update_undo_redo_actions()
399
361
  self.update_realtime_info()
400
362
  self.view_2d.setFocus()
@@ -36,65 +36,6 @@ from PyQt6.QtGui import (
36
36
  from PyQt6.QtCore import (
37
37
  Qt, QPointF, QRectF, QLineF, QUrl, QTimer
38
38
  )
39
- import platform
40
- import subprocess
41
- try:
42
- import winreg
43
- except Exception:
44
- winreg = None
45
-
46
-
47
- def detect_system_dark_mode():
48
- """Return True if the OS prefers dark app theme, False if light, or None if unknown.
49
-
50
- This is a best-effort, cross-platform check supporting Windows (registry),
51
- macOS (defaults read), and GNOME/GTK-based Linux (gsettings). Return
52
- None if no reliable information is available.
53
- """
54
- try:
55
- # Windows: read registry AppsUseLightTheme (0 = dark, 1 = light)
56
- if platform.system() == 'Windows' and winreg is not None:
57
- try:
58
- with winreg.OpenKey(winreg.HKEY_CURRENT_USER,
59
- r'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize') as k:
60
- val, _ = winreg.QueryValueEx(k, 'AppsUseLightTheme')
61
- return False if int(val) == 0 else True
62
- except Exception:
63
- pass
64
-
65
- # macOS: 'defaults read -g AppleInterfaceStyle' returns 'Dark' in dark mode
66
- if platform.system() == 'Darwin':
67
- try:
68
- p = subprocess.run(['defaults', 'read', '-g', 'AppleInterfaceStyle'], capture_output=True, text=True)
69
- if p.returncode == 0 and p.stdout.strip().lower() == 'dark':
70
- return True
71
- # Key absence implies light mode
72
- return False
73
- except Exception:
74
- pass
75
-
76
- # Linux / GNOME: try color-scheme gsetting; fallback to gtk-theme detection
77
- if platform.system() == 'Linux':
78
- try:
79
- p = subprocess.run(['gsettings', 'get', 'org.gnome.desktop.interface', 'color-scheme'], capture_output=True, text=True)
80
- if p.returncode == 0:
81
- out = p.stdout.strip().strip("'\n ")
82
- if 'dark' in out.lower():
83
- return True
84
- if 'light' in out.lower():
85
- return False
86
- except Exception:
87
- pass
88
-
89
- try:
90
- p = subprocess.run(['gsettings', 'get', 'org.gnome.desktop.interface', 'gtk-theme'], capture_output=True, text=True)
91
- if p.returncode == 0 and '-dark' in p.stdout.lower():
92
- return True
93
- except Exception:
94
- pass
95
- except Exception:
96
- pass
97
- return None
98
39
 
99
40
 
100
41
  # Use centralized Open Babel availability from package-level __init__
@@ -465,19 +406,10 @@ class MainWindowMainInit(object):
465
406
  toolbar.addSeparator()
466
407
 
467
408
  # --- アイコン前景色を決めるヘルパー(ダーク/ライトモード対応) ---
468
- # Use module-level detector `detect_system_dark_mode()` so tests and other
469
- # modules can reuse the logic.
470
-
471
-
472
409
  def _icon_foreground_color():
473
- """Return a QColor for icon foreground.
474
-
475
- NOTE: this application inverts the usual foreground mapping so icons
476
- will be the *opposite* color to the background (i.e., black on dark
477
- backgrounds, white on light backgrounds). This intentionally reverses
478
- the previous behavior so button icons don't blend into the 3D-view
479
- background. Priority: explicit setting in 'icon_foreground' -> OS
480
- theme preference -> configured 3D background -> application palette.
410
+ """Return a QColor for icon foreground (black on light backgrounds, white on dark backgrounds).
411
+
412
+ Priority: explicit setting 'icon_foreground' in settings -> infer from configured background color -> infer from application palette.
481
413
  """
482
414
  try:
483
415
  fg_hex = self.settings.get('icon_foreground')
@@ -488,25 +420,13 @@ class MainWindowMainInit(object):
488
420
  except Exception:
489
421
  pass
490
422
 
491
- # 1) Prefer the system/OS dark-mode preference if available.
492
- try:
493
- os_pref = detect_system_dark_mode()
494
- # Invert the color so in dark-pref OS we return black, in light we return white
495
- if os_pref is not None:
496
- return QColor('#000000') if os_pref else QColor('#FFFFFF')
497
- except Exception:
498
- pass
499
-
500
423
  try:
501
- # Keep background_color as a fallback: if system preference isn't
502
- # available we'll use the configured 3D view background from settings.
503
424
  bg_hex = self.settings.get('background_color')
504
425
  if bg_hex:
505
426
  bg = QColor(bg_hex)
506
427
  if bg.isValid():
507
428
  lum = 0.2126 * bg.redF() + 0.7152 * bg.greenF() + 0.0722 * bg.blueF()
508
- # Inverted: return black on dark (lum<0.5), white on light
509
- return QColor('#000000') if lum < 0.5 else QColor('#FFFFFF')
429
+ return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
510
430
  except Exception:
511
431
  pass
512
432
 
@@ -515,8 +435,7 @@ class MainWindowMainInit(object):
515
435
  # palette.window() returns a QBrush; call color()
516
436
  window_bg = pal.window().color()
517
437
  lum = 0.2126 * window_bg.redF() + 0.7152 * window_bg.greenF() + 0.0722 * window_bg.blueF()
518
- # Inverted mapping for palette fallback
519
- return QColor('#000000') if lum < 0.5 else QColor('#FFFFFF')
438
+ return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
520
439
  except Exception:
521
440
  return QColor('#000000')
522
441
 
@@ -164,11 +164,6 @@ class MainWindowProjectIo(object):
164
164
  # Replace current file with the newly saved file so subsequent saves go to this path
165
165
  self.current_file_path = file_path
166
166
  self.update_window_title()
167
- # Mark this state as the last saved state for undo tracking
168
- try:
169
- self._saved_state = copy.deepcopy(self.get_current_state())
170
- except Exception:
171
- pass
172
167
 
173
168
  self.statusBar().showMessage(f"Project saved to {file_path}")
174
169
 
@@ -222,10 +217,6 @@ class MainWindowProjectIo(object):
222
217
  # Update current file to the newly saved raw file
223
218
  self.current_file_path = file_path
224
219
  self.update_window_title()
225
- try:
226
- self._saved_state = copy.deepcopy(self.get_current_state())
227
- except Exception:
228
- pass
229
220
 
230
221
  self.statusBar().showMessage(f"Project saved to {file_path}")
231
222
 
@@ -258,12 +249,8 @@ class MainWindowProjectIo(object):
258
249
  self.has_unsaved_changes = False
259
250
  self.current_file_path = file_path
260
251
  self.update_window_title()
261
- try:
262
- self._saved_state= copy.deepcopy(self.et_current_state())
263
- except Exception:
264
- pass
265
-
266
- self.statusBar.showMessage(f"Project loaded from {file_path}")
252
+
253
+ self.statusBar().showMessage(f"Project loaded from {file_path}")
267
254
 
268
255
  QTimer.singleShot(0, self.fit_to_view)
269
256
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy
3
- Version: 1.16.0
3
+ Version: 1.16.0a1
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
  Project-URL: Homepage, https://github.com/HiroYokoyama/python_molecular_editor
@@ -1,6 +1,6 @@
1
1
  moleditpy/__init__.py,sha256=QCzpw3P5V_CwDtN4itK4hT9J99JgsH4gmpTfvuus6p8,46
2
2
  moleditpy/__main__.py,sha256=az0UrbFsuprbQYycF_bSUXxb0F20DuLvYxrZl1-X5EU,831
3
- moleditpy/main.py,sha256=cEZJuCL0HrLPUYvuwPSxgUkaDykVb573A-3qVvjF9RM,1180
3
+ moleditpy/main.py,sha256=Qh4Q12shHTSh3j5DVBJjpXw7orkdA8siikRzf8dMHl0,1270
4
4
  moleditpy/modules/__init__.py,sha256=X2Z0R5XpAoOehXdOv_6VlRm4rjt4zb1KPNSoLYIZsqg,1456
5
5
  moleditpy/modules/about_dialog.py,sha256=ZztVzLIQgH5mfMMOD-eAhYUbecUn8JaBtbCUg8O12t4,3409
6
6
  moleditpy/modules/align_plane_dialog.py,sha256=D6E0_rM75rKirDkvkJ-diRqNkf8IguqBBLQqDvZJHME,11665
@@ -12,22 +12,22 @@ moleditpy/modules/bond_item.py,sha256=zjQHa4vb8xhS9B7cYPRM0nak-f7lr5NQ1uAj_J78ah
12
12
  moleditpy/modules/bond_length_dialog.py,sha256=xlx-bU3tVeLfShdVRw6_Geo5Gl9mztlIfTdT9tJ6WMA,14579
13
13
  moleditpy/modules/calculation_worker.py,sha256=detE48BW08a2tvmKjMgz8zCShgARzsRH-ABmWrPcqZA,42055
14
14
  moleditpy/modules/color_settings_dialog.py,sha256=h4AOKU8dCTenecI8zOM9GfnmKDm7jfe5C4Fa23Budvs,15205
15
- moleditpy/modules/constants.py,sha256=0AL9UcX5RN7iqhUhiWexoCueYbCMvwbioQFD8wjULyg,4434
15
+ moleditpy/modules/constants.py,sha256=-U7onjl-zb2CylbZsQQ3MsvnJoNHiAIwCVfm84NZg6I,4436
16
16
  moleditpy/modules/constrained_optimization_dialog.py,sha256=MlWnPze0JJvnqmHx9n3qZWG_h-2kZymT0PQ6lALbCro,29861
17
17
  moleditpy/modules/custom_interactor_style.py,sha256=K_uGM6FezY0kZ3zPqoR6f0nowG40ytt-L4UCAbPlwGM,38184
18
18
  moleditpy/modules/custom_qt_interactor.py,sha256=6mzaVb3Mhp-4nryG5AraEvPPgBJpotrzVYwrpCAKmVo,2186
19
19
  moleditpy/modules/dialog3_d_picking_mixin.py,sha256=gaF1ATevvvF72aBfAjubRcagT2jnVG5RMpEKos_XdKg,4768
20
20
  moleditpy/modules/dihedral_dialog.py,sha256=H6WFvc7NvPHSd5QCMk0NUPhudOzpModXv-42dYL20KM,17809
21
- moleditpy/modules/main_window.py,sha256=Ii36JTPSkZNaqqEc8CXZ1bq9accIMg5yUs1U7_pHgYM,35791
22
- moleditpy/modules/main_window_app_state.py,sha256=f9f3JVuC46ijlea2DR8ADa0Jn5r2dgedPPdg8OkmNAU,33374
21
+ moleditpy/modules/main_window.py,sha256=CcdsfVOazmLlOwKK5INAVBiHAu-tcRQvsQBqmJmosu0,35618
22
+ moleditpy/modules/main_window_app_state.py,sha256=cbzgNw902fizAX1IHf5Y8eN7iNcLY3ssHFnaokYhRwg,31758
23
23
  moleditpy/modules/main_window_compute.py,sha256=fiIokVvjzXIwwR3FV3Ltet_K4oL_rT0Z27rPMbvlyyc,51346
24
24
  moleditpy/modules/main_window_dialog_manager.py,sha256=5WU6mFABB0aI4XCywP-cLFPkNQSb3bC0OK0I28SQG_w,19845
25
25
  moleditpy/modules/main_window_edit_3d.py,sha256=FStBWVeDVAM2MoO-JCTjPM-G7iT8QZUHxsb0dS4MEAI,19553
26
26
  moleditpy/modules/main_window_edit_actions.py,sha256=8tR0rYfgWYgdKTxBP4snzpxhiD2DExSKyf4jzSWb6sE,64598
27
27
  moleditpy/modules/main_window_export.py,sha256=f_Z4qVYKBTe06lGTFqjd3deluUdkQvHhZYa81h7UpBM,34465
28
- moleditpy/modules/main_window_main_init.py,sha256=ujRy4Rl7A5YefAbdmhzXKEofX5wOitBoAthB75mI0GM,74513
28
+ moleditpy/modules/main_window_main_init.py,sha256=_xWK8rhOHYGwlEMOnB3zpyA8T0c-X8h-emngsGgcEAg,70922
29
29
  moleditpy/modules/main_window_molecular_parsers.py,sha256=8JAIgr1axzmJqX_Ue-Adkl8e_8B2Th9yutQbau8EEWQ,43401
30
- moleditpy/modules/main_window_project_io.py,sha256=2ArkW23L4ahQIiktCCXlNsJphU0awO5YzJGihIJsn1c,17021
30
+ moleditpy/modules/main_window_project_io.py,sha256=ix6PmeCzdLRYDovS2UOPwdetoNgs2tdUUDPteP7c4w8,16511
31
31
  moleditpy/modules/main_window_string_importers.py,sha256=yrZblvPG840qnqVEJf__XVfNnWl_r3vt68Abfs2aYDQ,10674
32
32
  moleditpy/modules/main_window_ui_manager.py,sha256=0jdTZGv5JRtDlDniblPKzLPXdfUBZ3qh12s6pav4ihI,22038
33
33
  moleditpy/modules/main_window_view_3d.py,sha256=aU6fI-ZYUV7qOQmucsF5WuafGYyvb4P2xj0oIgsnDaU,55443
@@ -47,8 +47,8 @@ moleditpy/modules/zoomable_view.py,sha256=ZgAmmWXIKtx7AhMjs6H6PCyvb_kpYuankf8Uxs
47
47
  moleditpy/modules/assets/icon.icns,sha256=wD5R6-Vw7K662tVKhu2E1ImN0oUuyAP4youesEQsn9c,139863
48
48
  moleditpy/modules/assets/icon.ico,sha256=RfgFcx7-dHY_2STdsOQCQziY5SNhDr3gPnjO6jzEDPI,147975
49
49
  moleditpy/modules/assets/icon.png,sha256=kCFN1WacYIdy0GN6SFEbNA00ef39pCczBnFdkkBI8Bs,147110
50
- moleditpy-1.16.0.dist-info/METADATA,sha256=vGoTCn0W_w-vbBAnj2m4--9F-zPukqKqYQ4JlPGGd_4,17420
51
- moleditpy-1.16.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- moleditpy-1.16.0.dist-info/entry_points.txt,sha256=yH1h9JjALhok1foXT3-hYrC4ufoZt8b7oiBcsdnGNNM,54
53
- moleditpy-1.16.0.dist-info/top_level.txt,sha256=ARICrS4ihlPXqywlKl6o-oJa3Qz3gZRWu_VZsQ3_c44,10
54
- moleditpy-1.16.0.dist-info/RECORD,,
50
+ moleditpy-1.16.0a1.dist-info/METADATA,sha256=371b7dT_tKv4iB-sVSWNwUvPIDCEADEgWFAaoktequM,17422
51
+ moleditpy-1.16.0a1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
+ moleditpy-1.16.0a1.dist-info/entry_points.txt,sha256=yH1h9JjALhok1foXT3-hYrC4ufoZt8b7oiBcsdnGNNM,54
53
+ moleditpy-1.16.0a1.dist-info/top_level.txt,sha256=ARICrS4ihlPXqywlKl6o-oJa3Qz3gZRWu_VZsQ3_c44,10
54
+ moleditpy-1.16.0a1.dist-info/RECORD,,