fmu-manipulation-toolbox 0.0.dev3__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.
Files changed (220) hide show
  1. fmu_manipulation_toolbox-0.0.dev3/.git_archival.txt +3 -0
  2. fmu_manipulation_toolbox-0.0.dev3/.gitattributes +1 -0
  3. fmu_manipulation_toolbox-0.0.dev3/.gitignore +31 -0
  4. fmu_manipulation_toolbox-0.0.dev3/CHANGELOG.md +347 -0
  5. fmu_manipulation_toolbox-0.0.dev3/CLAUDE.md +3 -0
  6. fmu_manipulation_toolbox-0.0.dev3/CONTRIBUTING.md +104 -0
  7. fmu_manipulation_toolbox-0.0.dev3/LICENSE.txt +22 -0
  8. fmu_manipulation_toolbox-0.0.dev3/MANIFEST.in +15 -0
  9. fmu_manipulation_toolbox-0.0.dev3/PKG-INFO +369 -0
  10. fmu_manipulation_toolbox-0.0.dev3/README.md +318 -0
  11. fmu_manipulation_toolbox-0.0.dev3/container/CMakeLists.txt +260 -0
  12. fmu_manipulation_toolbox-0.0.dev3/container/build.bat +16 -0
  13. fmu_manipulation_toolbox-0.0.dev3/container/cmake/gen_version.cmake +19 -0
  14. fmu_manipulation_toolbox-0.0.dev3/container/config.c +66 -0
  15. fmu_manipulation_toolbox-0.0.dev3/container/config.h +47 -0
  16. fmu_manipulation_toolbox-0.0.dev3/container/container.c +1991 -0
  17. fmu_manipulation_toolbox-0.0.dev3/container/container.h +212 -0
  18. fmu_manipulation_toolbox-0.0.dev3/container/convert.c +460 -0
  19. fmu_manipulation_toolbox-0.0.dev3/container/convert.h +53 -0
  20. fmu_manipulation_toolbox-0.0.dev3/container/datalog.c +257 -0
  21. fmu_manipulation_toolbox-0.0.dev3/container/datalog.h +53 -0
  22. fmu_manipulation_toolbox-0.0.dev3/container/fmi2.c +587 -0
  23. fmu_manipulation_toolbox-0.0.dev3/container/fmi3.c +1037 -0
  24. fmu_manipulation_toolbox-0.0.dev3/container/fmu.c +1521 -0
  25. fmu_manipulation_toolbox-0.0.dev3/container/fmu.h +530 -0
  26. fmu_manipulation_toolbox-0.0.dev3/container/hash.c +163 -0
  27. fmu_manipulation_toolbox-0.0.dev3/container/hash.h +54 -0
  28. fmu_manipulation_toolbox-0.0.dev3/container/library.c +206 -0
  29. fmu_manipulation_toolbox-0.0.dev3/container/library.h +34 -0
  30. fmu_manipulation_toolbox-0.0.dev3/container/logger.c +117 -0
  31. fmu_manipulation_toolbox-0.0.dev3/container/logger.h +44 -0
  32. fmu_manipulation_toolbox-0.0.dev3/container/profile.c +69 -0
  33. fmu_manipulation_toolbox-0.0.dev3/container/profile.h +37 -0
  34. fmu_manipulation_toolbox-0.0.dev3/container/solver.c +511 -0
  35. fmu_manipulation_toolbox-0.0.dev3/container/solver.h +96 -0
  36. fmu_manipulation_toolbox-0.0.dev3/container/test_fmi.c +52 -0
  37. fmu_manipulation_toolbox-0.0.dev3/container/thread.c +96 -0
  38. fmu_manipulation_toolbox-0.0.dev3/container/thread.h +61 -0
  39. fmu_manipulation_toolbox-0.0.dev3/container/version.h.in +6 -0
  40. fmu_manipulation_toolbox-0.0.dev3/fmi/fmi2FunctionTypes.h +271 -0
  41. fmu_manipulation_toolbox-0.0.dev3/fmi/fmi2Functions.h +327 -0
  42. fmu_manipulation_toolbox-0.0.dev3/fmi/fmi2TypesPlatform.h +108 -0
  43. fmu_manipulation_toolbox-0.0.dev3/fmi/fmi3FunctionTypes.h +638 -0
  44. fmu_manipulation_toolbox-0.0.dev3/fmi/fmi3Functions.h +343 -0
  45. fmu_manipulation_toolbox-0.0.dev3/fmi/fmi3PlatformTypes.h +94 -0
  46. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/__init__.py +0 -0
  47. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/__main__.py +25 -0
  48. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/_version.py +24 -0
  49. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assembly.py +1033 -0
  50. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/__init__.py +37 -0
  51. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/auth.py +115 -0
  52. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/bridge.py +112 -0
  53. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/fmutools.py +274 -0
  54. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/headless.py +379 -0
  55. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/knowledge.py +285 -0
  56. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/models.py +211 -0
  57. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/paths.py +142 -0
  58. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/assistant/server.py +791 -0
  59. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/checker.py +378 -0
  60. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/cli/__init__.py +0 -0
  61. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/cli/datalog2pcap.py +173 -0
  62. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/cli/fmucontainer.py +115 -0
  63. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/cli/fmusplit.py +50 -0
  64. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/cli/fmutool.py +153 -0
  65. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/cli/fmutool_mcp.py +170 -0
  66. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/cli/utils.py +70 -0
  67. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/container.py +2367 -0
  68. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/__init__.py +0 -0
  69. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/__main__.py +195 -0
  70. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/__init__.py +2 -0
  71. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/__main__.py +339 -0
  72. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/assembly_io.py +631 -0
  73. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/details/__init__.py +19 -0
  74. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/details/container_detail.py +112 -0
  75. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/details/fmu_detail.py +384 -0
  76. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/details/stack.py +88 -0
  77. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/details/wire_detail.py +901 -0
  78. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/__init__.py +41 -0
  79. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/constants.py +42 -0
  80. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/node.py +643 -0
  81. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/node_info_dialog.py +93 -0
  82. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/scene.py +225 -0
  83. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/view.py +295 -0
  84. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/widget.py +49 -0
  85. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/graph/wire.py +499 -0
  86. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/mcp_bridge.py +693 -0
  87. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/tree/__init__.py +19 -0
  88. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/tree/model.py +78 -0
  89. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/tree/panel.py +207 -0
  90. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/tree/sync.py +44 -0
  91. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmucontainer/tree/widget.py +515 -0
  92. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmueditor/__init__.py +0 -0
  93. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmueditor/__main__.py +625 -0
  94. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmutool/__init__.py +0 -0
  95. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/fmutool/__main__.py +313 -0
  96. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/helper.py +581 -0
  97. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/gui/style.py +311 -0
  98. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/help.py +109 -0
  99. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/ls.py +35 -0
  100. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/model_description.py +488 -0
  101. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/operations.py +1060 -0
  102. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/remoting.py +168 -0
  103. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/checkbox-checked-disabled.png +0 -0
  104. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/checkbox-checked-hover.png +0 -0
  105. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/checkbox-checked.png +0 -0
  106. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/checkbox-unchecked-disabled.png +0 -0
  107. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/checkbox-unchecked-hover.png +0 -0
  108. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/checkbox-unchecked.png +0 -0
  109. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/container.png +0 -0
  110. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/drop_fmu.png +0 -0
  111. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Annotation.xsd +58 -0
  112. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-2.0/fmi2AttributeGroups.xsd +78 -0
  113. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-2.0/fmi2ModelDescription.xsd +345 -0
  114. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-2.0/fmi2ScalarVariable.xsd +218 -0
  115. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Type.xsd +89 -0
  116. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Unit.xsd +116 -0
  117. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-2.0/fmi2VariableDependency.xsd +92 -0
  118. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Annotation.xsd +51 -0
  119. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3AttributeGroups.xsd +119 -0
  120. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3BuildDescription.xsd +117 -0
  121. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3InterfaceType.xsd +80 -0
  122. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3LayeredStandardManifest.xsd +93 -0
  123. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3ModelDescription.xsd +131 -0
  124. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Terminal.xsd +87 -0
  125. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3TerminalsAndIcons.xsd +84 -0
  126. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Type.xsd +207 -0
  127. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Unit.xsd +69 -0
  128. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Variable.xsd +413 -0
  129. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmi-3.0/fmi3VariableDependency.xsd +64 -0
  130. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmu.png +0 -0
  131. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmu_manipulation_toolbox.png +0 -0
  132. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmucontainer.png +0 -0
  133. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmueditor.png +0 -0
  134. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/fmutool.png +0 -0
  135. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/help.png +0 -0
  136. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/icon-round.png +0 -0
  137. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/icon.png +0 -0
  138. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/icon_fmu.png +0 -0
  139. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/license.txt +34 -0
  140. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/mask.png +0 -0
  141. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/radio-checked-disabled.png +0 -0
  142. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/radio-checked-hover.png +0 -0
  143. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/radio-checked.png +0 -0
  144. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/radio-unchecked-disabled.png +0 -0
  145. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/radio-unchecked-hover.png +0 -0
  146. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/resources/radio-unchecked.png +0 -0
  147. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/split.py +708 -0
  148. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/terminals.py +156 -0
  149. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/textfiles.py +41 -0
  150. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox/version.py +15 -0
  151. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/PKG-INFO +369 -0
  152. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/SOURCES.txt +218 -0
  153. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/dependency_links.txt +1 -0
  154. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/entry_points.txt +12 -0
  155. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/requires.txt +27 -0
  156. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/scm_file_list.json +972 -0
  157. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/scm_version.json +8 -0
  158. fmu_manipulation_toolbox-0.0.dev3/fmu_manipulation_toolbox.egg-info/top_level.txt +1 -0
  159. fmu_manipulation_toolbox-0.0.dev3/mkdocs.yml +179 -0
  160. fmu_manipulation_toolbox-0.0.dev3/package.py +17 -0
  161. fmu_manipulation_toolbox-0.0.dev3/pyproject.toml +125 -0
  162. fmu_manipulation_toolbox-0.0.dev3/remoting/CMakeLists.txt +134 -0
  163. fmu_manipulation_toolbox-0.0.dev3/remoting/build.bat +26 -0
  164. fmu_manipulation_toolbox-0.0.dev3/remoting/client.c +863 -0
  165. fmu_manipulation_toolbox-0.0.dev3/remoting/client.h +23 -0
  166. fmu_manipulation_toolbox-0.0.dev3/remoting/cmake/gen_version.cmake +19 -0
  167. fmu_manipulation_toolbox-0.0.dev3/remoting/communication.c +475 -0
  168. fmu_manipulation_toolbox-0.0.dev3/remoting/communication.h +134 -0
  169. fmu_manipulation_toolbox-0.0.dev3/remoting/config.h.in +25 -0
  170. fmu_manipulation_toolbox-0.0.dev3/remoting/process.c +108 -0
  171. fmu_manipulation_toolbox-0.0.dev3/remoting/process.h +30 -0
  172. fmu_manipulation_toolbox-0.0.dev3/remoting/server.c +552 -0
  173. fmu_manipulation_toolbox-0.0.dev3/remoting/server.h +88 -0
  174. fmu_manipulation_toolbox-0.0.dev3/remoting/version.h.in +6 -0
  175. fmu_manipulation_toolbox-0.0.dev3/requirements.txt +11 -0
  176. fmu_manipulation_toolbox-0.0.dev3/setup.cfg +4 -0
  177. fmu_manipulation_toolbox-0.0.dev3/tests/.coveragerc +5 -0
  178. fmu_manipulation_toolbox-0.0.dev3/tests/_helpers/__init__.py +5 -0
  179. fmu_manipulation_toolbox-0.0.dev3/tests/_helpers/assertions.py +135 -0
  180. fmu_manipulation_toolbox-0.0.dev3/tests/_helpers/simulation.py +74 -0
  181. fmu_manipulation_toolbox-0.0.dev3/tests/benchmarks/bench_manipulation.py +131 -0
  182. fmu_manipulation_toolbox-0.0.dev3/tests/conftest.py +176 -0
  183. fmu_manipulation_toolbox-0.0.dev3/tests/gui/test_assistant_qt_bridge.py +306 -0
  184. fmu_manipulation_toolbox-0.0.dev3/tests/gui/test_gui.py +99 -0
  185. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_array.py +71 -0
  186. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_assistant_stdio_server.py +153 -0
  187. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_cli.py +57 -0
  188. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_cli_errors.py +207 -0
  189. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_container.py +188 -0
  190. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_container_xml.py +106 -0
  191. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_datalog.py +49 -0
  192. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_lsbus.py +34 -0
  193. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_me.py +42 -0
  194. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_operations_characterization.py +238 -0
  195. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_remoting.py +30 -0
  196. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_split.py +52 -0
  197. fmu_manipulation_toolbox-0.0.dev3/tests/integration/test_ssp.py +55 -0
  198. fmu_manipulation_toolbox-0.0.dev3/tests/pytest.ini +31 -0
  199. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_assembly_errors.py +58 -0
  200. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_assembly_parsing.py +150 -0
  201. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_assistant_auth.py +140 -0
  202. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_assistant_fmutools.py +208 -0
  203. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_assistant_headless.py +310 -0
  204. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_assistant_server.py +1150 -0
  205. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_checker.py +17 -0
  206. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_checker_semantic.py +164 -0
  207. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_fmu_descriptor_cache.py +112 -0
  208. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_fmu_lifecycle.py +141 -0
  209. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_model_description.py +358 -0
  210. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_model_exchange_sizes.py +127 -0
  211. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_operations.py +50 -0
  212. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_operations_conformity.py +165 -0
  213. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_operations_dependencies.py +130 -0
  214. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_operations_errors.py +126 -0
  215. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_split_parsing.py +108 -0
  216. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_terminals.py +131 -0
  217. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_textfiles.py +76 -0
  218. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_xml_assertions.py +66 -0
  219. fmu_manipulation_toolbox-0.0.dev3/tests/unit/test_xml_roundtrip.py +148 -0
  220. fmu_manipulation_toolbox-0.0.dev3/tools/dist_inventory.py +166 -0
@@ -0,0 +1,3 @@
1
+ node: $Format:%H$
2
+ node-date: $Format:%cI$
3
+ describe-name: $Format:%(describe:tags=true,match=*[0-9]*)$
@@ -0,0 +1 @@
1
+ .git_archival.txt export-subst
@@ -0,0 +1,31 @@
1
+ # Python
2
+ __pycache__
3
+ *.pyc
4
+ .idea
5
+ .vs
6
+ .vscode
7
+ # OS
8
+ .DS_Store
9
+ # Compiled binaries (not committed except the pre-built resources)
10
+ *.dll
11
+ *.exe
12
+ # Build outputs
13
+ dist
14
+ site
15
+ remoting/out
16
+ remoting/build
17
+ container/build
18
+ container/build-win64
19
+ container/out
20
+ container/.vscode
21
+ # Locally built darwin binaries (shipped via CI artifacts, not committed)
22
+ fmu_manipulation_toolbox/resources/darwin64/client_sm.dylib
23
+ fmu_manipulation_toolbox/resources/darwin64/container.dylib
24
+ fmu_manipulation_toolbox/resources/darwin64/server_sm
25
+ tests/tmp/
26
+ tests/.coverage
27
+ tests/.pytest_cache/
28
+ tests/coverage.svg
29
+
30
+ # Version file generated by setuptools-scm
31
+ fmu_manipulation_toolbox/_version.py
@@ -0,0 +1,347 @@
1
+ # FMU Manipulation Toolbox changelog
2
+ This package was formerly known as `fmutool`.
3
+
4
+ # Upstream
5
+ * FIXED: text files are written and read in UTF-8 on every platform: assembly descriptions (CSV, JSON),
6
+ the port names CSV (`-dump-csv`, `-rename-from-csv`), `container.txt` and `datalog.txt`, and the log
7
+ saved by `fmutool-gui`. They used the platform encoding, cp1252 on most Windows installations, so
8
+ a non-ASCII name written on one platform was misread on another. A UTF-8 byte order mark (added
9
+ by Excel) is accepted, and a file that is not UTF-8 is still read with the platform encoding,
10
+ with a warning.
11
+ * FIXED: reading an SSP archive: the elements of `SystemStructure.ssd` are recognized by their namespace
12
+ (SSP 1.0) instead of the literal `ssd:` prefix. A valid SSD using another prefix or a default
13
+ namespace failed with `AttributeError`. An invalid SSD (other namespace, not well-formed,
14
+ reference to an unknown element) now raises `AssemblyError` with a clear message.
15
+ * REMOVED: `ModelStructureCounter`. The Model Exchange sizes are computed from the descriptor tree by
16
+ `ModelDescription.model_exchange_sizes()`. `OperationSummary.structure` is replaced by
17
+ `OperationSummary.number_of_continuous_states` and `number_of_event_indicators`, which
18
+ `EmbeddedFMU` already provided.
19
+ * CHANGED (**breaking**): `fmutool`, `fmucontainer` and `fmusplit` exit with positive codes, shared by
20
+ the three tools: 2 invalid command line, 3 input missing or unreadable, 4 invalid input,
21
+ 5 operation or build refused or failed, 6 output cannot be written, 7 `-check` found the FMU
22
+ non-compliant (see the CLI guide). They used negative codes (`-1` to `-6`), with a different
23
+ meaning for each tool. Scripts that test the exact value must be updated.
24
+ * ADDED: `fmutool -check` exits with status 7 when a checker reports an error, so that it can be used
25
+ in CI. The XSD checker reports every violation instead of the first one only.
26
+ * ADDED: `OperationSemanticCheck`, a built-in checker for the rules of FMI 2.0 and 3.0 that the XSD
27
+ cannot express: unique names and value references, allowed `causality`/`variability`/`initial`
28
+ combinations, `start` values, references between variables and in `<ModelStructure>`.
29
+ * CHANGED: an `FMU` parses its `modelDescription.xml` once for all the operations applied to it, and
30
+ operations declared `read_only` (summary, CSV dump, checkers) no longer rewrite it: the
31
+ descriptor stays exactly as in the archive.
32
+ * FIXED: `get_checkers()` added the checkers registered through entry points again at each call.
33
+ * FIXED: `fmusplit` failed with `KeyError` on an FMI-3 variable without `causality` attribute.
34
+ * FIXED: `fmucontainer`: the `modelDescription.xml` of the container is now built with ElementTree.
35
+ Names and descriptions coming from the embedded FMUs are escaped (a `&`, `<` or `"` made
36
+ the descriptor invalid), and the file is written in UTF-8 as required by FMI 2.0 and 3.0
37
+ (it declared ISO-8859-1 but was written with the encoding of the locale).
38
+ * FIXED: `fmucontainer`: in FMI-2 containers with profiling, `ts_multiplier` or a Model Exchange
39
+ solver, `<ModelStructure>` listed local variables instead of the outputs.
40
+ * CHANGED: `FMU` can be used as a context manager (`with FMU(...) as fmu:`), and has a `close()`
41
+ method. Its temporary directory is now also removed at interpreter exit, and when opening
42
+ fails.
43
+ * FIXED: opening a file that is not a ZIP archive, or a directory, raised a raw exception instead
44
+ of `FMUError`. `fmutool` now reports these errors, and an unreadable `modelDescription.xml`,
45
+ with a clear message instead of a traceback.
46
+ * CHANGED: `fmutool` operations: `modelDescription.xml` is now modified in place with ElementTree
47
+ instead of being re-generated, so that everything an operation does not touch is kept as
48
+ is. Fixes text and attribute values written unescaped or unescaped twice (which produced
49
+ invalid XML, and made the second of two chained operations fail), and the loss of
50
+ `<Annotations>` of FMI-2 variables, FMI-3 `<Alias>`, all but the first `<Start>` of FMI-3
51
+ `String` arrays, empty FMI-3 `<Start value="">`, FMI-3 `<Dimension start="1">` (the
52
+ array became a scalar), comments and the XML declaration (required by FMI 2.0 and 3.0).
53
+ The descriptor is always written in UTF-8.
54
+ * FIXED: removing ports from an FMI-2 FMU did not renumber the `derivative` attribute, which
55
+ then pointed to the wrong variable.
56
+ * CHANGED: an operation is now refused with `OperationError`, leaving the FMU unchanged, if its
57
+ result would break the FMI standard: removing every variable, removing a variable still
58
+ referenced by a kept one (`derivative`, `previous`, `clocks`, `<Dimension
59
+ valueReference>`), or giving the same name to several variables (or FMI-3 aliases).
60
+ * FIXED: `-remove-sources` also removes the `<SourceFiles>` elements of the descriptor, and now
61
+ works on Model Exchange-only FMUs.
62
+ * CHANGED: `FMUPort` is now a view on the descriptor tree. Building a detached `FMUPort()` and
63
+ `push_attrs()` are deprecated. Operations can reach the whole tree through their new
64
+ `model_description` attribute. Namespaced attributes are still given to the callbacks as
65
+ `prefix:name`, but the `xmlns:*` declarations are no longer listed (`-summary` no
66
+ longer prints them).
67
+ * FIXED: MCP server: invalid arguments are reported with a short, actionable message (unknown option or
68
+ argument with the list of the allowed ones, missing argument, value outside its constraint)
69
+ instead of the raw Pydantic text and its documentation link.
70
+ * ADDED: MCP server: **single-FMU tools** beyond container assembly — `summarize_fmu`,
71
+ `check_fmu` (FMI schema conformity), `dump_ports_csv`, `rename_ports_from_csv` and
72
+ `apply_operation` (prefix stripping/merging, trimming, regexp filtering). The tools that
73
+ rewrite an FMU always produce a new file and leave the source untouched.
74
+ * ADDED: MCP server: assembly edition is now reversible and batchable — `remove_link`,
75
+ `unset_start_value` and `add_links` (bulk wiring, reporting per-link failures).
76
+ * ADDED: MCP server: optional **bearer-token authentication** for the HTTP transport
77
+ (`--token generate`, or `FMUCONTAINER_MCP_TOKEN`). The loopback interface keeps remote
78
+ machines out, but not the other processes of the same machine, which can otherwise read
79
+ and write files through the server.
80
+ * FIXED: `Checker`: XSD validation errors were lost instead of being reported — the error was
81
+ logged with a malformed `logger.error(reason, msg)` call, which raised at formatting time.
82
+ * ADDED: `fmutool-mcp`: a **standalone MCP server**, launched by the MCP client over the
83
+ **stdio** transport (Claude Desktop, VS Code, Cline, ...) and requiring neither a display
84
+ nor a running GUI. It serves exactly the same tools as the GUI assistant, on top of the
85
+ public `Assembly` API. `--root DIR` (or `FMUCONTAINER_MCP_ROOT`) confines the agent to a
86
+ directory tree; `--transport http` is also available for clients that attach to an
87
+ already-running server. The server advertises itself to clients as `fmutool`.
88
+ Requires Python >= 3.10 and the `mcp` extra.
89
+ * ADDED: `fmucontainer-gui`: **AI Assistant** — the Container Builder can expose its assembly
90
+ capabilities to an AI agent (e.g. GitHub Copilot in *Agent* mode) through a
91
+ [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server. Toggle it from the
92
+ **Configuration** menu (*AI Assistant On/Off*); the agent drives the live canvas (add FMUs,
93
+ wire ports, expose inputs/outputs, set start values and options, build the container FMU),
94
+ with every action marked as an unsaved change and written to the log panel. Port
95
+ introspection reports every variable with its causality, variability, type, unit, start
96
+ value and description, and is filterable (by causality or name pattern) and paginated so
97
+ that industrial FMUs do not saturate the agent context. The server also ships its own
98
+ know-how, so that any MCP client benefits from it: three prompts (`build_container`,
99
+ `diagnose_assembly`, `inspect_fmu`) describing complete procedures, and reference
100
+ resources (`guide://usage`, `fmi://conventions`, `container://options`,
101
+ `assembly://current`, `fmu://{name}/ports`). Building a container reports its progress
102
+ to the client instead of running silently, and the time the tools wait for the GUI is
103
+ configurable with `FMUCONTAINER_MCP_TIMEOUT` (60 s by default, ten times that for
104
+ builds). The server uses
105
+ the Streamable HTTP transport bound to `127.0.0.1:8765/mcp` (port overridable with the
106
+ `FMUCONTAINER_MCP_PORT` environment variable). This feature requires Python >= 3.10 and the
107
+ new `mcp` extra: `pip install "fmu-manipulation-toolbox[gui,mcp]"`. See
108
+ [AI Assistant (MCP server)](docs/user-guide/fmucontainer/ai-assistant.md).
109
+ * ADDED: Model-Exchange FMUs: the number of continuous states (`nx`) and of event indicators (`nz`)
110
+ are now computed from `<ModelStructure>` (FMI-2 `<Derivatives>` / FMI-3 `<ContinuousStateDerivative>`
111
+ and `<EventIndicator>`, array variables counted per element).
112
+ * ADDED: `fmucontainer`: embedded fixed-step solver for Model-Exchange FMUs. All ME FMUs are advanced in a
113
+ single container-wide loop so their state derivatives, state events and time events stay consistent
114
+ across the coupled set. A forward-Euler integrator is used by default, with an RK4 integrator also
115
+ available. An FMU providing both Co-Simulation and Model-Exchange is now embedded in Co-Simulation mode.
116
+ Assemblies mixing Co-Simulation and Model-Exchange FMUs are supported.
117
+ * CHANGE:`PySide6` (the GUI toolkit) is no longer installed by default. `pip install fmu-manipulation-toolbox`
118
+ now only installs the **CLI** (`fmutool`, `fmucontainer`, `fmusplit`, `datalog2pcap`) and the
119
+ **Python API**, neither of which import `PySide6`. To use the **Graphical User Interfaces**
120
+ (`fmutoolbox`, `fmutool-gui`, `fmueditor`, `fmucontainer-gui`), install the new `gui` extra:
121
+ `pip install "fmu-manipulation-toolbox[gui]"`. A convenience `all` extra (`gui` + `test`) is also
122
+ available. See the [Installation Guide](docs/installation.md).
123
+ * CHANGE: CI improved.
124
+ * CHANGE: Test plan improved.
125
+
126
+ # Version 1.9.4.2
127
+ * ADDED: Container thread synchronization on macOS now uses a semaphore instead of a barrier
128
+ (macOS does not implement POSIX `pthread_barrier`).
129
+ * ADDED: GUI: `fmucontainer` FMU detail panel now offers a right-click **Select all** / **Select none**
130
+ context menu on the *Input Ports* and *Output Ports* tables to expose ports in one click.
131
+ * FIXED: Container datalog: samples are now logged during event handling so the recorded outputs
132
+ reflect the freshly updated discrete state.
133
+ * FIXED: Container now decodes the `fmuResourceLocation` URI following RFC 3986 (percent-encoded
134
+ octets such as `%20` are decoded, drive letter handled), fixing resource paths that
135
+ contain spaces or special characters.
136
+ * FIXED: FMI-3 model icon support: `fmutool`, `fmueditor` and `fmucontainer` builder now read the
137
+ icon from `terminalsAndIcons/icon.png`, and generated FMI-3 containers store their icon there.
138
+ * FIXED: GUI: `fmucontainer` right-click on a node now first selects the pointed node; "Replace FMU" (Info)
139
+ also refreshes the tree view.
140
+ * FIXED: Container Event Mode: each FMU is now driven `Set inputs -> fmi3UpdateDiscreteStates -> Get outputs`
141
+ within the same Gauss-Seidel sweep, so read-back outputs reflect the freshly updated discrete state.
142
+
143
+ # Version 1.9.4.1
144
+ * FIXED: Minor regression on GUI-only virtual `configuration`
145
+
146
+ # Version 1.9.4
147
+ * INFO : Linux builds are made on Ubuntu 2024.04
148
+ * ADDED: Change the way the threads are synchronized for container.
149
+ * ADDED: force locale LC_NUMERIC="C" during container runtime to avoid (rare) issue during configuration.
150
+ * ADDED: GUI: `fmucontainer` builder now displays each FMU's icon (`model.png`) inside its node.
151
+ * ADDED: GUI: the progress dialog shown during **Load**, **Import**, **Export**, and **Save**
152
+ operations now has a **Save Logs...** button to export the displayed execution logs
153
+ to a `.txt` file.
154
+ * ADDED: GUI: `ts_multiplier` on a sub-container now materializes a GUI-only virtual `configuration`
155
+ node on the canvas, exposing one input port per checked sub-container
156
+ (`<container>.ts_multiplier`), wireable from any FMU. This node is purely a visual aid and
157
+ is never exported to the assembly (JSON/FMU). Unchecking `ts_multiplier` keeps the wire but
158
+ turns it (and the port) red until re-checked; the node is removed automatically once all
159
+ its ports are inactive and no wire (including red ones) references it anymore. Checking
160
+ `ts_multiplier` on the root container has no effect.
161
+ * ADDED: GUI: a wire is now drawn in **red** on the canvas as soon as one of its port mappings is
162
+ invalid (broken port after "Replace FMU", or inactive `ts_multiplier` port on the
163
+ `configuration` node) — matching the red text already shown for invalid ports in the
164
+ *Wire Details* panel.
165
+ * ADDED: `Assembly.write_json()`: FMU paths referenced in the `fmu`, `link`, `input`, `output`,
166
+ `start` and `drop` blocks are now made relative to the directory of the produced JSON
167
+ file, so exported assemblies stay portable (e.g. GUI **Export as JSON**). A new
168
+ `basenames_only` option references embedded FMUs by their bare filename instead
169
+ (used for the documentation copy embedded inside built FMU containers).
170
+ * ADDED: GUI: new **Input Ports** tab in the FMU detail panel, symmetric to the existing
171
+ **Output Ports** tab. Each input port can be explicitly marked as *exposed*, causing
172
+ the generated assembly to declare it explicitly as a container input (via `add_input`)
173
+ instead of relying solely on `auto_input`. Exposed inputs on FMUs nested inside
174
+ sub-containers are automatically propagated up through parent containers.
175
+ * FIXED: `fmusplit`: correct handling of FMI-3 array port connections (arrays are now properly
176
+ detected and linked in the generated assembly).
177
+ * ADDED: GUI: when a wire is selected, a yellow direction indicator is drawn on the wire to
178
+ reflect the currently active tab of the *Wire Details* panel (A→B / B→A arrowhead at
179
+ the corresponding extremity, or a divergent ◀▶ marker at the middle for *Terminals*).
180
+ * ADDED: `fmusplit`: detect terminal-to-terminal connections. Groups of port-to-port links whose
181
+ endpoints belong to two compatible terminals (same `terminalKind` / `matchingRule`) are
182
+ collapsed into a single terminal-level link in the produced JSON assembly. This lifts the
183
+ previous "LS-BUS clocks connection are not supported in GUI" limitation for FMU containers
184
+ where the peer FMU does not emit clocks (typical LS-BUS bus/node setups).
185
+ * FIXED: `fmusplit`: correct parsing of clocked inputs/outputs in container.txt file format 4
186
+ (indexing bug that produced spurious cross-links between FMUs sharing a bus).
187
+ * ADDED: GUI: on import, links between terminals declared in an assembly JSON are correctly
188
+ detected and routed to the wire's terminal mappings (visible in the `WireDetail` panel).
189
+ * ADDED: `fmucontainer`: extended type conversions between all numeric types and booleans.
190
+ Lossy conversions (narrowing, sign change, real↔integer, numeric→boolean) are applied with a warning.
191
+ * ADDED: `fmucontainer`: support links between FMI-2 array-like ports (notation `name[k]`) and
192
+ FMI-3 array ports. FMI-2 element ports sharing a common `basename[]` are automatically
193
+ aggregated into a virtual array port named `basename` (dimension = number of elements),
194
+ which can be linked to an FMI-3 array port of the same dimension.
195
+ Multi-dimensional arrays are also supported using the Modelica-style comma notation
196
+ `name[i,j,...]` (conforming to FMI-2.0); elements are flattened in row-major order to
197
+ match the FMI-3 array layout.
198
+
199
+ # Version 1.9.3.1
200
+ * FIXED: `fmucontainer`: correct `fmi3SetString` for array variables (dimension > 1) and `fmi2GetBooleanStatus`
201
+ * FIXED: `fmucontainer`: memory leaks and crashes under memory pressure; state machine improvements
202
+ * FIXED: `fmucontainer`: `auto_parameter` works even if `auto_input` is not set.
203
+ * FIXED: `fmucontainer`: Clocks and Clocked variables management is made in Event Mode only
204
+ * ADDED: GUI: Ability to replace a FMU in a Container
205
+ * FIXED: `fmuplit` is able to parse conversion table
206
+ * ADDED: FMI-3: support next event time
207
+ * FIXED: GUI: Remove annoying Qt Runtime error message appearing during shutdown
208
+ * ADDED: GUI: Terminals are supported in link definitions
209
+ * ADDED: GUI: Contextual menu of FMUs to launch fmueditor, fmutool or FMPy (if installed)
210
+ * ADDED: GUI: Highlight FMUs nested in the selected container
211
+ * ADDED: GUI: Display tooltips for container parameters
212
+ * ADDED: GUI: Easier link creation when FMU contains many variables (parameters displayed in italic)
213
+ * ADDED: GUI: Import process now able to load SSP files
214
+ * ADDED: GUI: Import/Export link definitions as CSV files (4-column format: FMU From, Port From, FMU To, Port To)
215
+ * FIXED: FMU extraction of a container when using relative paths
216
+ * FIXED: GUI: Import of containers with multiple levels of nesting (FMU inside FMU)
217
+
218
+ # Version 1.9.3
219
+ * ADDED: Graphical User Interfaces for quick FMU variable edition and build FMU Container
220
+ * ADDED: Support of array variables
221
+ * CHANGE: refactor the documentation
222
+ * FIXED: `remoting` (rare) race condition when multiple instances share the same unzip directory
223
+ * ADDED: `OperationSummary` display defined Terminals (if any)
224
+
225
+ # Version 1.9.2.1
226
+ * FIXED: `fmucontainer` embed the _original_ modelDescription.xml of the nested FMU instead.
227
+
228
+ # Version 1.9.2
229
+ * ADDED: `fmucontainer` support of Terminals
230
+ * ADDED: support of Clock and Binary types
231
+ * ADDED: `fmucontainer` support of Event-Mode
232
+ * ADDED: `fmucontainer` support of LS-BUS. See [ls-bus.md](docs/user-guide/fmucontainer/ls-bus.md)
233
+ * ADDED: `fmucontainer` support of `-datalog` option to log values at each step. See [datalog.md](docs/user-guide/fmucontainer/datalog.md)
234
+ * ADDED: `datalog2pcap` command to convert datalog (csv file) into PCAP (binary file) to enable network analysis tools.
235
+ This tool is experimental.
236
+ * FIXED: `fmucontainer` log correctly for FMU3 embedded inside FMU2 container
237
+ * FIXED: `fmucontainer` correctly set start values
238
+ * FIXED: `fmucontainer` correctly handle tolerance. See [issue 35](https://github.com/grouperenault/fmu_manipulation_toolbox/issues/35)
239
+ * FIXED: `remoting` fix for very long path on windows
240
+
241
+ # Version 1.9.1.3
242
+ * FIXED: `remoting` code should allow multiple FMUs to be instanciated (in less than 1 second).
243
+ There was a race condition in SHM name computation.
244
+ See [issue 38](https://github.com/grouperenault/fmu_manipulation_toolbox/issues/38)
245
+ * FIXED: `fmucontainer` dynamic change of time_step: fix number of doStep() calls
246
+
247
+ # Version 1.9.1.2
248
+ * FIXED: Avoid usage of NULL pointer for category in logs. Despite this is legal,
249
+ some FMI importers don't support it.
250
+
251
+ # Version 1.9.1.1
252
+ * FIXED: command line interface for `fmucontainer`, `fmutool and `fmusplit`
253
+
254
+ # Version 1.9.1
255
+ * FIXED: `fmucontainer` handle correctly start/stop in <DefaultExperiment>
256
+ * ADDED: `fmucontainer` ability to dynamically change time_step. See [container-vr.md](docs/user-guide/fmucontainer/container-vr.md)
257
+
258
+ # Version 1.9
259
+ * CHANGE: `remoting` code rewrite to (drastically) improve performance
260
+ * ADDED: `fmusplit` command to split container into FMU's and provide a json file
261
+ * ADDED: `fmucontainer` support of `-sequential` mode
262
+ * ADDED: FMI-3.0 early support. Use `-fmi 3` option for `fmucontainer`
263
+ * FIXED: `fmucontainer` MT mode on Linux and Darwin
264
+ * FIXED: `fmutool` command line for various operations
265
+ * FIXED: `fmutool` handle correctly <ModelStructure>: remove empty tags
266
+ * CHANGE: (API) `fmu_operations` and `fmu_container` packages are renamed `operations` and `container`
267
+ * CHANGE: (API) Introduction of `FMUPort` and `port_attrs` method to replace `scalar_attrs` and `scalar_type`
268
+ * CHANGE: (API) `FMUException` and `OperationException` classes are renamed `FMUError` and `OperationError`
269
+ * CHANGE: (CI/CT) Add some simulation steps
270
+
271
+ # Version 1.8.4.2
272
+ * FIXED: `fmucontainer` re-set start values for causality=input after fmi2EnterInitialization as workaround for some FMUs.
273
+
274
+ # Version 1.8.4.1
275
+ * FIXED: `fmucontainer` store embedded FMUs into shorter named directories to avoid windows-long-path-issue
276
+ * FIXED: `fmucontainer` can refer to FMU located in subdirectory
277
+ * FIXED: `fmucontainer` profiling reported incorrect values
278
+
279
+ # Version 1.8.4
280
+ * CHANGE: `fmucontainer` option `-dump` saves explicitly auto-wiring data. Auto-wiring is off for SSP format.
281
+
282
+ # Version 1.8.3
283
+ * FIXED: `fmucontainer` supports correctly auto-link for 1-to-n links
284
+
285
+ # Version 1.8.2.2
286
+ * ADDED: `fmucontainer` support fmi2Strings
287
+ * FIXED: `fmucontainer` freeInstance correctly frees memory
288
+
289
+ ## Version 1.8.2.1
290
+ * FIXED: `fmucontainer` exposed parameters name (using fmu name instead of fmu's model identifier)
291
+ * FIXED: `fmucontainer` support for long path (on Windows)
292
+
293
+ ## Version 1.8.2
294
+ * FIXED: `fmucontainer` identifier (for coSimulation) does not contain ".fmu" anymore
295
+ * ADDED: `fmucontainer` log more information when embedded FMU cannot be loaded
296
+ * ADDED: `fmucontainer` startTime and stopTime are deduced from the 1st embedded FMU
297
+ * ADDED: `fmucontainer` support `-auto-local` option to expose local variables of the embedded FMU
298
+ * ADDED: `fmucontainer` support new option `-auto-parameter` (parameters are not exposed by default)
299
+ * FIXED: `fmutool` support "apply on" filter correctly
300
+ * DEV: preliminary version of GUI for `fmucontainer`
301
+
302
+ ## Version 1.8.1
303
+ * FIXED: `fmucontainer` read links from `.json` input files
304
+ * CHANGE: switch to PyQT6 and add minor GUI improvements
305
+
306
+ ## Version 1.8
307
+ * CHANGE: Python Package in now known as `fmu-manipulation-toolbox`
308
+ * ADDED: `fmucontainer` support `canHandleVariableCommunicationStepSize`
309
+ * ADDED: `fmucontainer` support `.ssp` or `.json` as input files
310
+ * ADDED: `fmucontainer` new `-dump` option to save container description
311
+
312
+ ## Version 1.7.4
313
+ * ADDED: `fmucontainer` Linux support
314
+ * ADDED: `-fmu-directory` option defaults to "." if not set
315
+ * FIXED: `fmucontainer` ensures that FMUs are compliant with version 2.0 of FMU Standard
316
+ * FIXED: `fmucontainer` handles the lack of DefaultExperiment section in modelDescription.xml
317
+
318
+
319
+ ## Version 1.7.3
320
+ * ADDED: `fmucontainer` supports `-profile` option to expose RT ratio of embedded FMUs during simulation
321
+ * ADDED: Ability to expose local variables of embedded FMUs at container level
322
+ * FIXED: `fmucontainer` handles missing causality and handle better variability
323
+
324
+ ## Version 1.7.2
325
+ * FIXED: handle `<ModelStructure>` section for `fmucontainer`
326
+ * FIXED: brought back `-h` option to get help for `fmucontainer`
327
+ * CHANGED: make compatibility with python >= 3.9
328
+
329
+ ## Version 1.7.1
330
+ * FIXED: add missing *.xsd file that prevented checker to work
331
+ * CHANGED: Checker use API instead of environment variable to declare custom checkers.
332
+
333
+ ## Version 1.7
334
+ * ADDED: FMUContainer tool
335
+
336
+ ## Version 1.6.2
337
+ * ADDED: Ability to add your own FMU Checker.
338
+ * ADDED: SaveNamesToCSV will dump scalar types and start values.
339
+ * CHANGED: Default (Generic) Checker checks the `modelDescription.xml` conformity against the XSD specification file.
340
+
341
+ ## Version 1.6.1
342
+ * FIXED: publication workflow is fully automated.
343
+ * FIXED: `fmutool` script is now part of the distribution.
344
+ * CHANGED: minor enhancement in the README file
345
+
346
+ ## Version 1.6
347
+ * First public release
@@ -0,0 +1,3 @@
1
+ - Use english language for documentation, comment and plan description.
2
+ - plans should be stored in docs/local folder.
3
+ - include the update of the user documentation at last step of plans.
@@ -0,0 +1,104 @@
1
+
2
+ You’re welcome to share your ideas or join us in contributing to the project.
3
+ By getting involved, you help enhance the project and make it accessible to a wider community.
4
+
5
+ # How to Contribute
6
+ We value all types of contributions. Whether you discover bugs, improve the documentation,
7
+ or develop new features, there are many ways to get involved.
8
+
9
+ ## Reporting Issues
10
+
11
+ If you encounter a bug or unexpected behavior, please follow these steps:
12
+
13
+ 1. Check the existing issues to see if the problem has already been reported.
14
+ 2. If not, open a new issue and include:
15
+ - A clear and concise description of the problem.
16
+ - Steps to reproduce the issue, if applicable.
17
+ - Details about your environment (e.g., operating system, Python version).
18
+ - Any relevant error messages or logs.
19
+
20
+ ## Suggestions for Improvements
21
+
22
+ We’re always happy to hear new ideas for features or enhancements! If you’d like to suggest one:
23
+
24
+ 1. Check whether someone has already proposed it.
25
+ 2. If not, open a new issue describing the improvement and include:
26
+ - A clear explanation of the feature and its use cases.
27
+ - Why it would add value to the project.
28
+ - Examples of how the feature could work, if applicable.
29
+
30
+
31
+ ## Submitting Code
32
+
33
+ For legal reasons, we are unable to accept pull requests. If you have ideas for improvements,
34
+ please create an issue or get in touch with the development team.
35
+
36
+ ## Running tests
37
+
38
+ The test suite lives under `tests/` and uses [pytest](https://docs.pytest.org/). It is organised
39
+ by test type:
40
+
41
+ | Directory | Contents |
42
+ |-----------|----------|
43
+ | `tests/unit/` | fast, pure-Python tests (operations, checker) — no FMI simulation |
44
+ | `tests/integration/` | container / split / CLI tests, file I/O, optional FMI simulation (`fmpy`) |
45
+ | `tests/gui/` | PySide6 GUI tests (require `pytest-qt`) |
46
+ | `tests/data/<area>/` | read-only reference data (FMUs, JSON, CSV, …) per functional area |
47
+
48
+ ### Install the test dependencies
49
+
50
+ ```bash
51
+ pip install -e ".[test]" # pytest, pytest-qt, pytest-cov, fmpy, numpy, PySide6
52
+ # or, for a full dev setup:
53
+ pip install -r requirements.txt
54
+ ```
55
+
56
+ ### Run the suite
57
+
58
+ Tests are run from the `tests/` directory (the `pytest.ini` there sets the import paths):
59
+
60
+ ```bash
61
+ cd tests
62
+ pytest # run everything
63
+ pytest --cov=fmu_manipulation_toolbox # with coverage
64
+ pytest -v integration/test_container.py # a single module
65
+ ```
66
+
67
+ ### Selecting a subset with markers
68
+
69
+ Markers are declared in `tests/pytest.ini`. Select (or exclude) with `-m`:
70
+
71
+ ```bash
72
+ pytest -m unit # fast unit tests only
73
+ pytest -m "not gui" # skip the GUI tests
74
+ pytest -m "integration and fmi3"
75
+ pytest -m lsbus # LS-BUS tests
76
+ ```
77
+
78
+ | Marker | Meaning |
79
+ |--------|---------|
80
+ | `unit` / `integration` / `gui` | test type |
81
+ | `slow` | end-to-end test running an FMI simulation |
82
+ | `needs_fmpy` | requires the `fmpy` package |
83
+ | `needs_container` / `needs_remoting` | requires the compiled container / remoting binaries |
84
+ | `windows_only` | only runs on win32 (auto-skipped elsewhere) |
85
+ | `fmi2` / `fmi3` | exercises a specific FMI version |
86
+ | `lsbus` | exercises the LS-BUS feature |
87
+ | `area(name)` | selects the `tests/data/<name>` directory copied into `tests/tmp/<test>` |
88
+
89
+ Platform- or binary-dependent tests are skipped automatically (with an explicit reason) when their
90
+ prerequisites are missing — they never fail silently.
91
+
92
+ ### Adding a test
93
+
94
+ 1. Put reference data under `tests/data/<area>/` (inputs and `REF-*` files only — never commit
95
+ generated outputs).
96
+ 2. Add the test to the matching module in `tests/unit/`, `tests/integration/` or `tests/gui/`.
97
+ 3. Decorate it with the relevant markers, e.g. `@pytest.mark.area("<area>")`. The `area_dir`
98
+ fixture copies that data directory into `tests/tmp/<test>/` and `chdir`s into it, so your test
99
+ can refer to files by their bare names and write outputs without polluting the source tree.
100
+ The `tests/tmp/` tree is wiped at the start of every session and kept afterwards, so the
101
+ generated artefacts are easy to inspect when debugging a failure.
102
+ 4. Reuse the shared helpers in `tests/_helpers/` (`assertions.py`, `simulation.py`).
103
+
104
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2024-2026 Renault SAS
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
@@ -0,0 +1,15 @@
1
+ # Content of the sdist (docs/local/packaging.md, decision D3).
2
+ # With setuptools-scm, every file tracked by git goes into the sdist by default. Keep the Python package and the C
3
+ # sources of the native binaries (container/, remoting/, fmi/); leave out the test data, the documentation, the CI
4
+ # configuration and the prebuilt binaries.
5
+ #
6
+ # The wheel needs the prebuilt binaries: build it from the source tree, not from the sdist
7
+ # (`python -m build --sdist --wheel`).
8
+ prune tests/data
9
+ prune docs
10
+ prune .github
11
+ recursive-exclude fmu_manipulation_toolbox/resources/win32 *
12
+ recursive-exclude fmu_manipulation_toolbox/resources/win64 *
13
+ recursive-exclude fmu_manipulation_toolbox/resources/linux32 *
14
+ recursive-exclude fmu_manipulation_toolbox/resources/linux64 *
15
+ recursive-exclude fmu_manipulation_toolbox/resources/darwin64 *