pyfemtet 0.8.1__py3-none-any.whl → 0.8.2__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.

Potentially problematic release.


This version of pyfemtet might be problematic. Click here for more details.

pyfemtet/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.8.1"
1
+ __version__ = "0.8.2"
pyfemtet/_imports.py ADDED
@@ -0,0 +1,107 @@
1
+ import types
2
+ import importlib
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+
6
+ __all__ = [
7
+ 'isinstance_wrapper',
8
+ '_LazyImport',
9
+ '_lazy_class_factory',
10
+ ]
11
+
12
+
13
+ class _MetaClass(type):
14
+ __original_cls__: type
15
+
16
+ def __repr__(self):
17
+ if hasattr(self, '__original_cls__'):
18
+ return f'<LazyClass of {self.__original_cls__()}>'
19
+ else:
20
+ return f'<LazyClass of <unloaded class>>'
21
+
22
+
23
+ def _lazy_class_factory(module, cls_name):
24
+ class LazyClass(object, metaclass=_MetaClass):
25
+ # 継承を正しくコピーできていないので
26
+ # issubclass を使う際は注意
27
+ def __new__(cls, *args, **kwargs):
28
+ OriginalClass = cls.__original_cls__()
29
+ self = OriginalClass(*args, **kwargs)
30
+ return self
31
+
32
+ @staticmethod
33
+ def __original_cls__():
34
+ return getattr(module, cls_name)
35
+
36
+ return LazyClass
37
+
38
+
39
+ class _LazyImport(types.ModuleType):
40
+ """Module wrapper for lazy import.
41
+
42
+ Note:
43
+ This module is totally derived from `optuna._imports._LazyImport`.
44
+ The following author has the copyright of this code.
45
+
46
+ *******************************************
47
+ Copyright (c) 2018 Preferred Networks, Inc.
48
+ *******************************************
49
+
50
+ This class wraps the specified modules and lazily imports them only when accessed.
51
+ Otherwise, `import optuna` is slowed down by importing all submodules and
52
+ dependencies even if not required.
53
+ Within this project's usage, importlib override this module's attribute on the first
54
+ access and the imported submodule is directly accessed from the second access.
55
+
56
+ Args:
57
+ name: Name of module to apply lazy import.
58
+ """
59
+
60
+ def __init__(self, name: str) -> None:
61
+ super().__init__(name)
62
+ self._name = name
63
+
64
+ def _load(self) -> types.ModuleType:
65
+ module = importlib.import_module(self._name)
66
+ self.__dict__.update(module.__dict__)
67
+ return module
68
+
69
+ def __getattr__(self, item: str) -> Any:
70
+ return getattr(self._load(), item)
71
+
72
+
73
+ def isinstance_wrapper(obj: object, cls: type) -> bool:
74
+ if isinstance(cls, _MetaClass):
75
+ try:
76
+ cls_ = cls.__original_cls__()
77
+ except ModuleNotFoundError:
78
+ return False
79
+ return isinstance(obj, cls_)
80
+ else:
81
+ return isinstance(obj, cls)
82
+
83
+
84
+ if __name__ == '__main__':
85
+ if TYPE_CHECKING:
86
+ # for type check only
87
+ import numpy
88
+ NDArray = numpy.ndarray
89
+ import no_module
90
+ else:
91
+ # runtime
92
+ numpy = _LazyImport('numpy')
93
+ NDArray = _lazy_class_factory(numpy, 'ndarray')
94
+ NDArray2 = _lazy_class_factory(numpy, 'ndarray')
95
+ no_module = _LazyImport('no_module')
96
+ NoClass = _lazy_class_factory(no_module, 'NoClass')
97
+
98
+ print('numpy is loaded:', numpy.__doc__ is not None)
99
+ a = NDArray(shape=[1])
100
+ print('numpy is loaded:', numpy.__doc__ is not None)
101
+
102
+ print(f"{isinstance(None, NoClass)=}")
103
+ print(f"{isinstance_wrapper(None, NoClass)=}")
104
+ print(f"{isinstance(a, NDArray)=}")
105
+ print(f"{isinstance_wrapper(a, NDArray)=}")
106
+ print(f"{isinstance_wrapper(a, NoClass)=}")
107
+ print(f"{isinstance_wrapper(a, NDArray2)=}")
pyfemtet/opt/_femopt.py CHANGED
@@ -31,6 +31,7 @@ from pyfemtet.opt._femopt_core import (
31
31
  from pyfemtet._message import Msg, encoding
32
32
  from pyfemtet.opt.optimizer.parameter import Parameter, Expression
33
33
  from pyfemtet._warning import experimental_feature
34
+ from pyfemtet._imports import *
34
35
 
35
36
  from dask import config as cfg
36
37
  cfg.set({'distributed.scheduler.worker-ttl': None})
@@ -366,8 +367,8 @@ class FEMOpt:
366
367
 
367
368
  # 引数の処理
368
369
  if fun is None:
369
- from pyfemtet.opt.interface._surrogate._base import SurrogateModelInterfaceBase
370
- if not isinstance(self.fem, SurrogateModelInterfaceBase):
370
+ from pyfemtet.opt.interface import SurrogateModelInterfaceBase
371
+ if not isinstance_wrapper(self.fem, SurrogateModelInterfaceBase):
371
372
  raise ValueError('`fun` argument is not specified.')
372
373
  if args is None:
373
374
  args = tuple()
@@ -510,13 +511,13 @@ class FEMOpt:
510
511
  name = candidate
511
512
  if using_fem is None:
512
513
  # 自動推定機能は Femtet 特有の処理とする
513
- if isinstance(self.fem, FemtetInterface):
514
+ if isinstance_wrapper(self.fem, FemtetInterface):
514
515
  using_fem = _is_access_femtet(fun)
515
516
  else:
516
517
  using_fem = False
517
518
 
518
519
  # strict constraint の場合、solve 前に評価したいので Gogh へのアクセスを禁ずる
519
- if strict and isinstance(self.fem, FemtetInterface):
520
+ if strict and isinstance_wrapper(self.fem, FemtetInterface):
520
521
  if _is_access_gogh(fun):
521
522
  message = Msg.ERR_CONTAIN_GOGH_ACCESS_IN_STRICT_CONSTRAINT
522
523
  raise Exception(message)
@@ -680,7 +681,7 @@ class FEMOpt:
680
681
 
681
682
  # Femtet 特有の処理
682
683
  metadata = None
683
- if isinstance(self.fem, FemtetInterface):
684
+ if isinstance_wrapper(self.fem, FemtetInterface):
684
685
 
685
686
  # 結果 csv に記載する femprj に関する情報の作成
686
687
  metadata = json.dumps(
@@ -1,5 +1,5 @@
1
1
  # typing
2
- from typing import List
2
+ from typing import List, TYPE_CHECKING
3
3
 
4
4
  # built-in
5
5
  import os
@@ -9,6 +9,7 @@ import ast
9
9
  import csv
10
10
  import ctypes
11
11
  from packaging import version
12
+ import platform
12
13
 
13
14
  # 3rd-party
14
15
  import numpy as np
@@ -25,11 +26,17 @@ else:
25
26
  from dask.distributed import Lock, get_client, Client
26
27
 
27
28
  # win32com
28
- from win32com.client import constants, Constants
29
+ if (platform.system() == 'Windows') or TYPE_CHECKING:
30
+ from win32com.client import constants, Constants
31
+ else:
32
+ class Constants:
33
+ pass
34
+ constants = None
29
35
 
30
36
  # pyfemtet relative
31
37
  from pyfemtet.opt.interface import FEMInterface, FemtetInterface
32
38
  from pyfemtet._message import encoding, Msg
39
+ from pyfemtet._imports import *
33
40
 
34
41
  # logger
35
42
  from pyfemtet.logger import get_module_logger
@@ -317,7 +324,7 @@ class Function:
317
324
 
318
325
  args = self.args
319
326
  # Femtet 特有の処理
320
- if isinstance(fem, FemtetInterface):
327
+ if isinstance_wrapper(fem, FemtetInterface):
321
328
  args = (fem.Femtet, *args)
322
329
  return float(self.fun(*args, **self.kwargs))
323
330
 
@@ -1,9 +1,23 @@
1
+ from typing import TYPE_CHECKING
2
+ from pyfemtet._imports import _LazyImport, _lazy_class_factory
3
+
1
4
  from pyfemtet.opt.interface._base import FEMInterface
2
5
  from pyfemtet.opt.interface._base import NoFEM
3
- from pyfemtet.opt.interface._femtet import FemtetInterface
4
- from pyfemtet.opt.interface._femtet_with_sldworks import FemtetWithSolidworksInterface
5
- from pyfemtet.opt.interface._femtet_with_nx import FemtetWithNXInterface
6
- from pyfemtet.opt.interface._surrogate import PoFBoTorchInterface
6
+
7
+ if TYPE_CHECKING:
8
+ from pyfemtet.opt.interface._femtet import FemtetInterface
9
+ from pyfemtet.opt.interface._femtet_with_sldworks import FemtetWithSolidworksInterface
10
+ from pyfemtet.opt.interface._femtet_with_nx import FemtetWithNXInterface
11
+ from pyfemtet.opt.interface._surrogate import PoFBoTorchInterface
12
+ from pyfemtet.opt.interface._excel_interface import ExcelInterface
13
+
14
+ else:
15
+ FemtetInterface = _lazy_class_factory(_LazyImport('pyfemtet.opt.interface._femtet'), 'FemtetInterface')
16
+ FemtetWithSolidworksInterface = _lazy_class_factory(_LazyImport('pyfemtet.opt.interface._femtet_with_sldworks'), 'FemtetWithSolidworksInterface')
17
+ FemtetWithNXInterface = _lazy_class_factory(_LazyImport('pyfemtet.opt.interface._femtet_with_nx'), 'FemtetWithNXInterface')
18
+ PoFBoTorchInterface = _lazy_class_factory(_LazyImport('pyfemtet.opt.interface._surrogate'), 'PoFBoTorchInterface')
19
+ ExcelInterface = _lazy_class_factory(_LazyImport('pyfemtet.opt.interface._excel_interface'), 'ExcelInterface')
20
+
7
21
 
8
22
 
9
23
  __all__ = [
@@ -17,22 +17,25 @@ from pythoncom import CoInitialize, CoUninitialize
17
17
  # noinspection PyUnresolvedReferences
18
18
  from pywintypes import com_error
19
19
 
20
- from pyfemtet.opt import FEMInterface
20
+ # pyfemtet.core
21
21
  from pyfemtet.core import SolveError
22
- from pyfemtet.opt.optimizer.parameter import Parameter, Expression
23
-
24
- from pyfemtet.dispatch_extensions import _get_pid, dispatch_specific_femtet
25
22
 
23
+ # pyfemtet._util
26
24
  from pyfemtet._femtet_config_util.exit import _exit_or_force_terminate
27
-
28
25
  from pyfemtet._util.excel_macro_util import watch_excel_macro_error
29
26
  from pyfemtet._util.dask_util import lock_or_no_lock
30
27
  from pyfemtet._util.excel_parse_util import *
31
-
32
28
  from pyfemtet._warning import show_experimental_warning
33
29
  from pyfemtet._message.messages import Message as Msg
34
30
 
35
- from pyfemtet.opt.interface._base import logger
31
+ # dispatch extension
32
+ from pyfemtet.dispatch_extensions import _get_pid, dispatch_specific_femtet
33
+
34
+ # interface
35
+ from pyfemtet.opt.interface._base import FEMInterface, logger
36
+
37
+ # expression
38
+ from pyfemtet.opt.optimizer.parameter import Parameter, Expression
36
39
 
37
40
 
38
41
  class ExcelInterface(FEMInterface):
@@ -33,7 +33,7 @@ from pyfemtet.dispatch_extensions import (
33
33
  _get_pids,
34
34
  DispatchExtensionException,
35
35
  )
36
- from pyfemtet.opt.interface import FEMInterface
36
+ from pyfemtet.opt.interface._base import FEMInterface
37
37
  from pyfemtet._message import Msg
38
38
  from pyfemtet._femtet_config_util.autosave import _get_autosave_enabled, _set_autosave_enabled
39
39
  from pyfemtet._femtet_config_util.exit import _exit_or_force_terminate
@@ -6,7 +6,7 @@ import pandas as pd
6
6
  from dask.distributed import get_worker
7
7
 
8
8
  from pyfemtet.core import ModelError
9
- from pyfemtet.opt.interface import FemtetInterface
9
+ from pyfemtet.opt.interface._femtet import FemtetInterface
10
10
  from pyfemtet._message import Msg
11
11
 
12
12
 
@@ -10,7 +10,7 @@ from win32com.client import DispatchEx
10
10
  from pythoncom import CoInitialize, CoUninitialize, com_error
11
11
 
12
12
  from pyfemtet.core import ModelError
13
- from pyfemtet.opt.interface import FemtetInterface
13
+ from pyfemtet.opt.interface._femtet import FemtetInterface
14
14
  from pyfemtet._message import Msg
15
15
 
16
16
 
@@ -1,8 +1,7 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyfemtet
3
- Version: 0.8.1
3
+ Version: 0.8.2
4
4
  Summary: Design parameter optimization using Femtet.
5
- Home-page: https://github.com/pyfemtet/pyfemtet
6
5
  License: BSD-3-Clause
7
6
  Author: kazuma.naito
8
7
  Author-email: kazuma.naito@murata.com
@@ -21,7 +20,7 @@ Requires-Dist: dash (>=2.17.0,<3.0.0)
21
20
  Requires-Dist: dash-bootstrap-components (>=1.5.0,<2.0.0)
22
21
  Requires-Dist: dask (>=2023.12.1,<2024.0.0)
23
22
  Requires-Dist: distributed (>=2023.12.1,<2024.0.0)
24
- Requires-Dist: femtetutils (>=1.0.0,<2.0.0)
23
+ Requires-Dist: femtetutils (>=1.0.0,<2.0.0) ; sys_platform == "win32"
25
24
  Requires-Dist: fire (>=0.6.0,<0.7.0)
26
25
  Requires-Dist: numpy (>=2.0.0,<3.0.0)
27
26
  Requires-Dist: openpyxl (>=3.1.2,<4.0.0)
@@ -30,9 +29,10 @@ Requires-Dist: optuna-integration (>=3.6.0,<5.0.0)
30
29
  Requires-Dist: pandas (>=2.2.3,<3.0.0)
31
30
  Requires-Dist: plotly (>=5.22.0,<6.0.0)
32
31
  Requires-Dist: psutil (>=5.9.6,<6.0.0)
33
- Requires-Dist: pywin32 (>=306,<307)
32
+ Requires-Dist: pywin32 (>=306,<307) ; sys_platform == "win32"
34
33
  Requires-Dist: scipy (>=1.11.4,<2.0.0)
35
- Requires-Dist: torch (>=2.5.1,<2.6.0)
34
+ Requires-Dist: torch (>=2.5.1,<2.6.0) ; sys_platform != "linux"
35
+ Requires-Dist: torch (>=2.5.1,<2.6.0) ; sys_platform == "linux"
36
36
  Requires-Dist: tqdm (>=4.66.1,<5.0.0)
37
37
  Project-URL: Repository, https://github.com/pyfemtet/pyfemtet
38
38
  Description-Content-Type: text/markdown
@@ -1,7 +1,8 @@
1
- pyfemtet/__init__.py,sha256=9SJ00tY4YILqfP8235Ozvn3QTMNjqfaSLUvcAIBL9pU,21
1
+ pyfemtet/__init__.py,sha256=w9PQY1TBU1sxareCp_IL13B4hvoWkY5B-U0ml6p1Im4,21
2
2
  pyfemtet/_femtet_config_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  pyfemtet/_femtet_config_util/autosave.py,sha256=dNirA9XGuFehas8_Jkj2BW9GOzMbPyhnt1WHcH_ObSU,2070
4
4
  pyfemtet/_femtet_config_util/exit.py,sha256=0BWID-tjOkmZwmgPFkcJMkWW39voccz5ARIBWvZbHaw,1877
5
+ pyfemtet/_imports.py,sha256=SdsAe8x63alMsxAvYr0a3LLeTaUjAaZxG_QoXbppqfM,3241
5
6
  pyfemtet/_message/1. make_pot.bat,sha256=wrTA0YaL7nUfNB0cS8zljOmwq2qgyG6RMwHQbrwjvY4,476
6
7
  pyfemtet/_message/2. make_mo.bat,sha256=6shJ3Yn4BXjDc0hhv_kiGUtVTq4oSRz8-iS4vW29rNE,155
7
8
  pyfemtet/_message/__init__.py,sha256=gE1-XX_PzHj9BbhqPaK5VcIHuv6_Tec5qlPMC3IRiBg,100
@@ -24,8 +25,8 @@ pyfemtet/dispatch_extensions/_impl.py,sha256=yH_yeAnQ-Xi9GfjX-FQt9u3yHnrLYIteRb6
24
25
  pyfemtet/logger/__init__.py,sha256=UOJ9n_U2xwdTrp0Xgg-N6geySxNzKqTBQlXsaH0kW_w,420
25
26
  pyfemtet/logger/_impl.py,sha256=rsAd0HpmveOaLS39ucp3U2OcDhQMWjC5fnVGhbJtWVw,6375
26
27
  pyfemtet/opt/__init__.py,sha256=wRR8LbEhb5I6MUgmnCgjB6-tqHlOVxDIo7yPkq0QbBs,758
27
- pyfemtet/opt/_femopt.py,sha256=badpzYulDFZ6FmHPmc8uXidvnQrCNjHnalBaVp54Wcg,39234
28
- pyfemtet/opt/_femopt_core.py,sha256=8_A8aGRd1EwiNfI9qGPY9oGAvLjlY681IePfnhmzclM,37933
28
+ pyfemtet/opt/_femopt.py,sha256=0HOKlHDkqNimf10v2oUGEHfgVEM4-4RuyLOUHkJi3ec,39281
29
+ pyfemtet/opt/_femopt_core.py,sha256=wd4KijbJuSSuH2n3FY6eAmK_oOJC1R7VzWYKDoJD2KM,38123
29
30
  pyfemtet/opt/_test_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
31
  pyfemtet/opt/_test_utils/control_femtet.py,sha256=8oAl9y5V2n8Nnsgx_ebcZVzwFt1eI3swkdiKg6pg3-M,1085
31
32
  pyfemtet/opt/_test_utils/hyper_sphere.py,sha256=nQhw8EIY0DwvcTqrbKhkxiITLZifr4-nG77E-_6ggmA,700
@@ -39,15 +40,15 @@ pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_create_training_data_jp.p
39
40
  pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate.py,sha256=s0b31wuN3iXjb78dt0ro0ZjxHa8uLIH94jRfEuj1EVY,3090
40
41
  pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate_jp.py,sha256=OAOpHKyMMo1StSqNMqx4saYDn4hiGOKDypyK6uhTILQ,3215
41
42
  pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_parametric.femprj,sha256=iIHH1X-wWBqEYj4cFJXco73LCJXSrYBsSKOD0HxYu60,87599
42
- pyfemtet/opt/interface/__init__.py,sha256=18qTySe5Tue0lDgNZbFZ8rBsBt_Edm7ukm6OAUPwruw,551
43
+ pyfemtet/opt/interface/__init__.py,sha256=POOSj5AN42h7jm8ULjiKDAqPO_l0NY1FpBBUBRVGH-g,1382
43
44
  pyfemtet/opt/interface/_base.py,sha256=y0uQ5jdsWbgt5odyqPin7NXcK_IbUwPDcrrkV_JhpRw,2722
44
- pyfemtet/opt/interface/_excel_interface.py,sha256=gqLKOTNxdayX3jKE4GhqHMg8IzCuFhjY7gNgoFrcrp0,40301
45
- pyfemtet/opt/interface/_femtet.py,sha256=zIsOcqdPc5AK0XsCay60uoQvwzIMklc-1gUK9EPewjM,34628
45
+ pyfemtet/opt/interface/_excel_interface.py,sha256=s103vePTPXXYiPwGdAEUFgtpvGXtu1nSljDtP4HsmcY,40355
46
+ pyfemtet/opt/interface/_femtet.py,sha256=teALmp66aJ_rrmtEOjCGDG1jGLTZr2AmvMFmuuXRQkw,34634
46
47
  pyfemtet/opt/interface/_femtet_parametric.py,sha256=0pAEhHflp0wIxWBVMXI8nCC02oAyRKLinH3Y6O8bq3M,2224
47
48
  pyfemtet/opt/interface/_femtet_with_nx/__init__.py,sha256=-6W2g2FDEcKzGHmI5KAKQe-4U5jDpMj0CXuma-GZca0,83
48
- pyfemtet/opt/interface/_femtet_with_nx/_interface.py,sha256=oefISc6c6RPPyhPnWuzCb60tgsrzGiqoIWk1DsiKzTk,5986
49
+ pyfemtet/opt/interface/_femtet_with_nx/_interface.py,sha256=LkaODUSpBLq05uz5Jf-JKuH6Evq8ElZoItXxFZopWeM,5994
49
50
  pyfemtet/opt/interface/_femtet_with_nx/update_model.py,sha256=P7VH0i_o-X9OUe6AGaLF1fACPeHNrMjcrOBCA3MMrI4,3092
50
- pyfemtet/opt/interface/_femtet_with_sldworks.py,sha256=qqo2P4qZN0d89uNQyohKxq-Yhdql5vC0QHg4bpy7Ky8,11011
51
+ pyfemtet/opt/interface/_femtet_with_sldworks.py,sha256=rjEgebuP1w1eAFVWw4eRJUq3lsyBcmXlkMjZKIpD0kw,11019
51
52
  pyfemtet/opt/interface/_surrogate/__init__.py,sha256=2UT5NuBylyWQJNjg1zsBRCV-MzNCUswTUt6ZuSrYFUM,120
52
53
  pyfemtet/opt/interface/_surrogate/_base.py,sha256=-k02jRywxaSKMDzGitPE_qBj5nUxC7OL6guF4y6F1Zw,2923
53
54
  pyfemtet/opt/interface/_surrogate/_chaospy.py,sha256=gL72bCgs1AY_EZdJtcifSC-apwsZzp4zsWYxcpVKvtw,1969
@@ -137,8 +138,8 @@ pyfemtet/opt/visualization/result_viewer/.gitignore,sha256=ryvb4aqbbsHireHWlPQfx
137
138
  pyfemtet/opt/visualization/result_viewer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
139
  pyfemtet/opt/visualization/result_viewer/application.py,sha256=WcHBx_J5eNLKSaprpk9BGifwhO04oN8FiNGYTWorrXA,1691
139
140
  pyfemtet/opt/visualization/result_viewer/pages.py,sha256=zcsRmVpVK7xbmOpnKkSypNPsRyHcV3ingfNmuqln6nw,32171
140
- pyfemtet-0.8.1.dist-info/LICENSE,sha256=sVQBhyoglGJUu65-BP3iR6ujORI6YgEU2Qm-V4fGlOA,1485
141
- pyfemtet-0.8.1.dist-info/METADATA,sha256=nSEcQqjKNbZya0ZmycsjEC4jnhHwNFMbVRq_mIuTuz4,3415
142
- pyfemtet-0.8.1.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
143
- pyfemtet-0.8.1.dist-info/entry_points.txt,sha256=ZfYqRaoiPtuWqFi2_msccyrVF0LurMn-IHlYamAegZo,104
144
- pyfemtet-0.8.1.dist-info/RECORD,,
141
+ pyfemtet-0.8.2.dist-info/LICENSE,sha256=sVQBhyoglGJUu65-BP3iR6ujORI6YgEU2Qm-V4fGlOA,1485
142
+ pyfemtet-0.8.2.dist-info/METADATA,sha256=DaSB-_XkLYHL6s4R0OibyIl8JiU_Kr4p56CkdKZGZfk,3509
143
+ pyfemtet-0.8.2.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
144
+ pyfemtet-0.8.2.dist-info/entry_points.txt,sha256=ZfYqRaoiPtuWqFi2_msccyrVF0LurMn-IHlYamAegZo,104
145
+ pyfemtet-0.8.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.0.0
2
+ Generator: poetry-core 2.0.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any