PySimultan 0.5.2.5__tar.gz → 0.5.4__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/PKG-INFO +1 -1
  2. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/CHANGELOG.md +3 -0
  3. pysimultan-0.5.4/src/PySimultan2/__about__.py +1 -0
  4. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/data_model.py +55 -8
  5. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/files.py +196 -8
  6. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/object_mapper.py +0 -1
  7. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/type_setter_lookup.py +3 -2
  8. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/utils.py +63 -7
  9. pysimultan-0.5.4/tests/test_directory_and_files.py +63 -0
  10. pysimultan-0.5.4/tests/test_empty_file.txt +0 -0
  11. pysimultan-0.5.2.5/src/PySimultan2/__about__.py +0 -1
  12. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/.gitignore +0 -0
  13. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/LICENSE.txt +0 -0
  14. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/README.md +0 -0
  15. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/pyproject.toml +0 -0
  16. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/__init__.py +0 -0
  17. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/default_types.py +0 -0
  18. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/geometry/__init__.py +0 -0
  19. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/geometry/geometry_base.py +0 -0
  20. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/geometry/utils.py +0 -0
  21. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/multi_values.py +0 -0
  22. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/AssimpNet.dll +0 -0
  23. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/AvalonDock.dll +0 -0
  24. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/BruTile.dll +0 -0
  25. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/ClosedXML.dll +0 -0
  26. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/ComponentBuilder.dll +0 -0
  27. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/ComponentBuilder.dll.config +0 -0
  28. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/ComponentBuilder.runtimeconfig.json +0 -0
  29. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/ComponentBuilder.xml +0 -0
  30. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/ControlzEx.dll +0 -0
  31. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Cyotek.Drawing.BitmapFont.dll +0 -0
  32. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/DocumentFormat.OpenXml.dll +0 -0
  33. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/DotSpatial.Projections.dll +0 -0
  34. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/ExcelNumberFormat.dll +0 -0
  35. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Fluent.dll +0 -0
  36. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/HelixToolkit.Core.Wpf.dll +0 -0
  37. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/HelixToolkit.SharpDX.Core.Wpf.dll +0 -0
  38. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/HelixToolkit.SharpDX.Core.dll +0 -0
  39. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/HelixToolkit.dll +0 -0
  40. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/MathNet.Numerics.dll +0 -0
  41. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.AspNetCore.Authorization.dll +0 -0
  42. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.AspNetCore.Metadata.dll +0 -0
  43. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.Extensions.DependencyInjection.Abstractions.dll +0 -0
  44. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.Extensions.Logging.Abstractions.dll +0 -0
  45. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.Extensions.Options.dll +0 -0
  46. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.Extensions.Primitives.dll +0 -0
  47. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.WindowsAPICodePack.Shell.dll +0 -0
  48. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.WindowsAPICodePack.dll +0 -0
  49. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Microsoft.Xaml.Behaviors.dll +0 -0
  50. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Newtonsoft.Json.Bson.dll +0 -0
  51. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Newtonsoft.Json.dll +0 -0
  52. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.AutoUpdate.Client.dll +0 -0
  53. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.AutoUpdate.Client.dll.config +0 -0
  54. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.AutoUpdate.DataTransferLibrary.dll +0 -0
  55. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.AutoUpdate.DataTransferLibrary.dll.config +0 -0
  56. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.Lang.dll +0 -0
  57. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.Lang.xml +0 -0
  58. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.Plugins.dll +0 -0
  59. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.Plugins.xml +0 -0
  60. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.UI.dll +0 -0
  61. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.UI.xml +0 -0
  62. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.dll +0 -0
  63. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SIMULTAN.xml +0 -0
  64. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SharpDX.D3DCompiler.dll +0 -0
  65. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SharpDX.DXGI.dll +0 -0
  66. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SharpDX.Direct2D1.dll +0 -0
  67. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SharpDX.Direct3D11.dll +0 -0
  68. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SharpDX.Direct3D9.dll +0 -0
  69. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SharpDX.Mathematics.dll +0 -0
  70. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/SharpDX.dll +0 -0
  71. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Sprache.Calc.dll +0 -0
  72. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/Sprache.dll +0 -0
  73. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/System.Collections.Immutable.dll +0 -0
  74. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/System.Data.OleDb.dll +0 -0
  75. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/System.Net.Http.Formatting.dll +0 -0
  76. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/System.Reflection.Metadata.dll +0 -0
  77. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/System.Reflection.MetadataLoadContext.dll +0 -0
  78. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/XAMLMarkupExtensions.dll +0 -0
  79. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/__init__.py +0 -0
  80. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/assimp.dll +0 -0
  81. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/componentmanager.user +0 -0
  82. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/defaultsettings.xml +0 -0
  83. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/resources/setup.bat +0 -0
  84. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/simultan_object.py +0 -0
  85. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/src/PySimultan2/taxonomy_maps.py +0 -0
  86. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/__init__.py +0 -0
  87. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/__init__.py +0 -0
  88. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/create_component.py +0 -0
  89. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/create_component_with_taxonomy_slot.py +0 -0
  90. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/create_referenced_component.py +0 -0
  91. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/create_taxonomies.py +0 -0
  92. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/__init__.py +0 -0
  93. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/change_references_example.simultan +0 -0
  94. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/empty_project.simultan +0 -0
  95. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/empty_test_excel.xlsx +0 -0
  96. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/example1.simultan +0 -0
  97. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/example2.simultan +0 -0
  98. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/example3.simultan +0 -0
  99. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/example4_reference_list.simultan +0 -0
  100. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/example_extend_1.simultan +0 -0
  101. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/list_test.simultan +0 -0
  102. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/template_example3.yml +0 -0
  103. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/template_example4.yml +0 -0
  104. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/template_example_create_typed_component.yml +0 -0
  105. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/template_example_create_typed_component_with_slots.yml +0 -0
  106. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/template_example_extend.yml +0 -0
  107. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/template_example_update_references.yml +0 -0
  108. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/readme_examples/resources/template_reference_list.yml +0 -0
  109. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/U5.simultan +0 -0
  110. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/U5_1.simultan +0 -0
  111. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/U5_orig.simultan +0 -0
  112. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/__init__.py +0 -0
  113. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/new_geometry_test.simultan +0 -0
  114. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/new_test_file.txt +0 -0
  115. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/new_test_file2.txt +0 -0
  116. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/test_file.yml +0 -0
  117. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/test_file_load.simultan +0 -0
  118. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/test_file_project.simultan +0 -0
  119. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/test_multi_value_big_table_load.simultan +0 -0
  120. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/test_parameter_reference_project.simultan +0 -0
  121. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/resources/test_set_dictionary.simultan +0 -0
  122. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_calc_static_zone_temperature.py +0 -0
  123. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_calculate_steady_state_temperature.py +0 -0
  124. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_circular_references.py +0 -0
  125. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_create_geometry.py +0 -0
  126. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_files.py +0 -0
  127. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_files_load.py +0 -0
  128. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_load_geometry.py +0 -0
  129. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_load_multi_values.py +0 -0
  130. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_new_dll.py +0 -0
  131. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_new_project_creation.py +0 -0
  132. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_numeric_map.py +0 -0
  133. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_parameter_reference.py +0 -0
  134. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_pythonnet.py +0 -0
  135. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_register_class.py +0 -0
  136. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_register_decorator.py +0 -0
  137. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_set_attr_property.py +0 -0
  138. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_set_dictionary.py +0 -0
  139. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_set_properties.py +0 -0
  140. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_taxonomie_maps.py +0 -0
  141. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_taxonomies.py +0 -0
  142. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/test_ui.py +0 -0
  143. {pysimultan-0.5.2.5 → pysimultan-0.5.4}/tests/ui_minimal_example.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: PySimultan
3
- Version: 0.5.2.5
3
+ Version: 0.5.4
4
4
  Project-URL: Documentation, https://github.com/Bühler Maximilian/PySimultan2#readme
5
5
  Project-URL: Issues, https://github.com/Bühler Maximilian/PySimultan2/issues
6
6
  Project-URL: Source, https://github.com/Bühler Maximilian/PySimultan2
@@ -1,3 +1,6 @@
1
+ Version 0.5.3 (01.12.2024)
2
+ - Added support for directories (Assets and FileInfo)
3
+
1
4
  Version 0.5.1 (25.11.2024)
2
5
 
3
6
  - setting re-register default in Mapper to True
@@ -0,0 +1 @@
1
+ version = '0.5.4'
@@ -23,7 +23,7 @@ from SIMULTAN.Serializer.SimGeo import *
23
23
  from SIMULTAN.Serializer.Projects import *
24
24
  from SIMULTAN.Data.Components import SimComponent, SimComponentCollection
25
25
  from SIMULTAN.Data.MultiValues import SimMultiValueBigTable, SimMultiValueField3D
26
- from SIMULTAN.Data.Assets import ResourceEntry
26
+ from SIMULTAN.Data.Assets import ResourceEntry, ResourceDirectoryEntry, ResourceFileEntry, ContainedResourceFileEntry
27
27
  from SIMULTAN.Data.Geometry import OffsetAlgorithm
28
28
  # from GeometryViewer.Service import *
29
29
  # from SIMULTAN.UI.Services import *
@@ -37,12 +37,13 @@ from SIMULTAN.Data.Geometry import Layer, Vertex, Edge, PEdge, Face, Volume, Edg
37
37
  from System.Security import SecureString
38
38
  from SIMULTAN.Data import SimId
39
39
  from System import Guid
40
+ from System.IO import DirectoryInfo
40
41
  from System.IO import *
41
42
  from System.Security import *
42
43
  from System.Security.Cryptography import *
43
44
  from System.Text import *
44
45
 
45
- from .files import add_tag_to_resource, FileInfo as PythonFileInfo
46
+ from .files import add_tag_to_resource, FileInfo as PythonFileInfo, DirectoryInfo as PythonDirectoryInfo
46
47
 
47
48
 
48
49
  if TYPE_CHECKING:
@@ -164,6 +165,11 @@ class DataModel:
164
165
  def assets(self):
165
166
  return self.project_data_manager.AssetManager.Resources
166
167
 
168
+ @property
169
+ def file_directories(self):
170
+ return [PythonDirectoryInfo(resource_entry=x,
171
+ data_model=self) for x in self.project_data_manager.AssetManager.Resources if isinstance(x, ResourceDirectoryEntry)]
172
+
167
173
  @property
168
174
  def models(self) -> dict[int, 'GeometryModel']:
169
175
  """
@@ -500,19 +506,35 @@ class DataModel:
500
506
  self.get_file_infos.cache_clear()
501
507
  return new_resource
502
508
 
503
- def add_empty_resource(self, filename: str):
509
+ def add_empty_resource(self,
510
+ filename: str,
511
+ target_dir: Union[ResourceDirectoryEntry, FileInfo, str] = None) -> ResourceEntry:
504
512
  """
505
513
  Add an empty resource to the project
506
- :param file_name: name of the new resource
514
+ :param filename: name of the new resource
515
+ :param target_dir: directory to add the resource
507
516
  :return:
508
517
  """
509
518
  # return self.project.AddResourceFile(FileInfo(str(filename)))
510
519
 
511
520
  self.get_file_infos.cache_clear()
512
- return self.project.AddEmptyResource(FileInfo(str(filename)))
521
+ if target_dir is None:
522
+ return self.project.AddEmptyResource(FileInfo(str(filename)))
523
+ else:
524
+
525
+ if isinstance(target_dir, ResourceDirectoryEntry):
526
+ target_dir = target_dir.CurrentFullPath
527
+ if isinstance(target_dir, FileInfo):
528
+ target_dir = target_dir.FullPath
529
+
530
+ return self.project.AddEmptyResource(FileInfo(
531
+ os.path.join(target_dir, str(filename))
532
+ )
533
+ )
513
534
 
514
535
  def add_resource(self,
515
536
  filename: Union[str, FileInfo],
537
+ target_dir: Optional[Union[DirectoryInfo, ResourceDirectoryEntry, str]] = None,
516
538
  tag: Union[SimTaxonomyEntry, SimTaxonomyEntryReference] = None) -> ResourceEntry:
517
539
  """
518
540
  Add a new resource to the project. The resource will be copied to the project folder and added to the project
@@ -545,9 +567,21 @@ class DataModel:
545
567
  if isinstance(filename, (str, PosixPath, WindowsPath)):
546
568
  filename = FileInfo(str(filename))
547
569
 
548
- resource = self.project.CopyResourceAsContainedFileEntry(filename,
549
- self.project.ProjectUnpackFolder,
550
- '1')
570
+ if target_dir is None:
571
+ resource = self.project.CopyResourceAsContainedFileEntry(filename,
572
+ self.project.ProjectUnpackFolder,
573
+ '1')
574
+ else:
575
+ if isinstance(target_dir, str):
576
+ target_dir = DirectoryInfo(target_dir)
577
+ elif isinstance(target_dir, ResourceDirectoryEntry):
578
+ target_dir = DirectoryInfo(target_dir.CurrentFullPath)
579
+ elif isinstance(target_dir, FileInfo):
580
+ pass
581
+
582
+ resource = self.project.CopyResourceAsContainedFileEntry(filename,
583
+ target_dir,
584
+ '1')
551
585
 
552
586
  if del_copy:
553
587
  os.remove(str(filename))
@@ -583,6 +617,19 @@ class DataModel:
583
617
  self.get_file_infos.cache_clear()
584
618
  return success
585
619
 
620
+ def create_resource_directory(self,
621
+ name: str,
622
+ parent_directory: DirectoryInfo=None,
623
+ collision_name_format: str = '{0} ({1})') -> ResourceEntry:
624
+
625
+ if parent_directory is None:
626
+ new_directory = self.project.CreateResourceDirIn(name, None, collision_name_format)
627
+ else:
628
+ new_directory = self.project.CreateResourceDirIn(name, parent_directory, collision_name_format)
629
+
630
+ return new_directory
631
+
632
+
586
633
  def add_table(self, table: SimMultiValueBigTable):
587
634
  self.project_data_manager.ValueManager.Add(table)
588
635
 
@@ -14,10 +14,12 @@ import shutil
14
14
  import zipfile
15
15
  # from System.IO import FileInfo # public FileInfo (string fileName);
16
16
 
17
- from SIMULTAN.Data.Assets import ResourceEntry, ResourceFileEntry, ContainedResourceFileEntry, Asset
17
+ from SIMULTAN.Data.Assets import ResourceEntry, ResourceFileEntry, ContainedResourceFileEntry, Asset, ResourceDirectoryEntry
18
18
  from SIMULTAN.Data.Taxonomy import SimTaxonomyEntry, SimTaxonomyEntryReference, SimTaxonomy
19
19
  from SIMULTAN.Data.Components import SimComponent, ComponentMapping
20
20
 
21
+ from System.IO import DirectoryInfo
22
+
21
23
  # from .config import default_data_model
22
24
 
23
25
  from . import config, logger
@@ -50,7 +52,7 @@ def tempdir():
50
52
  yield dir_path
51
53
 
52
54
 
53
- def add_tag_to_resource(resource: Union[ResourceFileEntry, ContainedResourceFileEntry],
55
+ def add_tag_to_resource(resource: Union[ResourceFileEntry, ContainedResourceFileEntry, ResourceDirectoryEntry],
54
56
  tag: Union[SimTaxonomyEntry, SimTaxonomyEntryReference]):
55
57
  """
56
58
  Add a tag to an asset.
@@ -67,7 +69,7 @@ def add_tag_to_resource(resource: Union[ResourceFileEntry, ContainedResourceFile
67
69
 
68
70
 
69
71
  def add_asset_to_component(comp: [SimComponent, SimultanObject],
70
- asset: Union[ResourceFileEntry, ContainedResourceFileEntry],
72
+ asset: Union[ResourceFileEntry, ContainedResourceFileEntry, ResourceDirectoryEntry],
71
73
  content_id: str = '',
72
74
  tag: SimTaxonomyEntry = None) -> Asset:
73
75
  """
@@ -109,12 +111,14 @@ def remove_asset_from_component(comp: Union[SimComponent, SimultanObject],
109
111
  def create_asset_from_string(filename: str,
110
112
  content: str,
111
113
  data_model: DataModel,
114
+ target_dir: Optional[Union[DirectoryInfo, ResourceDirectoryEntry, str]] = None,
112
115
  tag: Optional[Union[SimTaxonomyEntry, SimTaxonomyEntryReference]] = None) -> ResourceFileEntry:
113
116
  """
114
117
  Create a new asset from a string. The asset is added to the data model.
115
118
  :param filename: Name of the file to be created. E.g. 'new_file.txt'
116
119
  :param content: Content of the file. E.g. 'This is the content of the file.'
117
120
  :param data_model: Data model to add the asset to.
121
+ :param target_dir: Target directory to add the asset to.
118
122
  :param tag: Tag to be added to the asset.
119
123
  :return: ResourceFileEntry
120
124
  """
@@ -123,10 +127,18 @@ def create_asset_from_string(filename: str,
123
127
  with open(filepath, 'w') as f:
124
128
  f.write(content)
125
129
 
126
- resource = data_model.add_resource(filepath)
130
+ if target_dir is not None:
131
+ if isinstance(target_dir, DirectoryInfo):
132
+ target_dir = target_dir.current_full_path
133
+
134
+ resource = data_model.add_resource(filepath,
135
+ target_dir=target_dir)
136
+ else:
137
+ resource = data_model.add_resource(filepath)
127
138
 
128
139
  if tag is not None:
129
- add_tag_to_resource(resource, tag)
140
+ add_tag_to_resource(resource,
141
+ tag)
130
142
 
131
143
  return resource
132
144
 
@@ -134,12 +146,14 @@ def create_asset_from_string(filename: str,
134
146
  def create_asset_from_str_io(filename: str,
135
147
  content: io.StringIO,
136
148
  data_model: DataModel,
149
+ target_dir: Optional[Union[DirectoryInfo, ResourceDirectoryEntry, str]] = None,
137
150
  tag: Union[SimTaxonomyEntry, SimTaxonomyEntryReference] = None) -> ResourceFileEntry:
138
151
  """
139
152
  Create a new asset from a string io. The asset is added to the data model.
140
153
  :param filename: Name of the file to be created. E.g. 'new_file.txt'
141
154
  :param content: Content of the file. E.g. 'This is the content of the file.'
142
155
  :param data_model: Data model to add the asset to.
156
+ :param target_dir: Target directory to add the asset to.
143
157
  :param tag: Tag to be added to the asset.
144
158
  :return: ResourceFileEntry
145
159
  """
@@ -148,7 +162,8 @@ def create_asset_from_str_io(filename: str,
148
162
  with open(filepath, 'w') as f:
149
163
  f.write(content.getvalue())
150
164
 
151
- resource = data_model.add_resource(filepath)
165
+ resource = data_model.add_resource(filepath,
166
+ target_dir=target_dir)
152
167
 
153
168
  if tag is not None:
154
169
  add_tag_to_resource(resource, tag)
@@ -175,6 +190,32 @@ def create_asset_from_file(file_info: FileInfo,
175
190
  return resource
176
191
 
177
192
 
193
+ def add_directory(data_model: DataModel,
194
+ directory: str,
195
+ parent_directory: Optional[Union[DirectoryInfo, ResourceDirectoryEntry, str]] = None,
196
+ tag: Union[SimTaxonomyEntry, SimTaxonomyEntryReference] = None) -> ResourceDirectoryEntry:
197
+
198
+ """
199
+ Add a directory to the data model.
200
+ :param data_model:
201
+ :param target_dir:
202
+ :param tag:
203
+ :return:
204
+ """
205
+
206
+ # create the directory
207
+ resource_directory_entry = data_model.create_resource_directory(parent_directory=parent_directory)
208
+
209
+ for filename in os.listdir(directory):
210
+ file_path = os.path.join(directory, filename)
211
+ resource = data_model.add_resource(file_path)
212
+ if tag is not None:
213
+ add_tag_to_resource(resource, tag)
214
+
215
+
216
+
217
+
218
+
178
219
  class MetaMock(type):
179
220
  def __call__(cls, *args, **kwargs):
180
221
  resource_entry = kwargs.get('resource_entry', None)
@@ -190,6 +231,22 @@ class MetaMock(type):
190
231
  return obj
191
232
 
192
233
 
234
+ class DirectoryInfoMetaMock(type):
235
+
236
+ def __call__(cls, *args, **kwargs):
237
+ resource_entry: Optional[ResourceDirectoryEntry] = kwargs.get('resource_entry', None)
238
+ if resource_entry is not None and hasattr(resource_entry, 'Key'):
239
+ obj = cls._cls_instances.get(resource_entry.Key, None)
240
+ if obj is not None:
241
+ return obj
242
+
243
+ obj = cls.__new__(cls)
244
+ obj.__init__(*args, **kwargs)
245
+ if obj.resource_entry is not None:
246
+ cls._cls_instances[obj.resource_entry.Key] = obj
247
+ return obj
248
+
249
+
193
250
  class FileInfo(object, metaclass=MetaMock):
194
251
 
195
252
  _cls_instances = {}
@@ -197,18 +254,27 @@ class FileInfo(object, metaclass=MetaMock):
197
254
  @classmethod
198
255
  def from_string(cls,
199
256
  filename: str,
200
- content: str, *args, **kwargs) -> FileInfo:
257
+ content: str,
258
+ target_dir: Optional[Union[DirectoryInfo, ResourceDirectoryEntry, str]] = None,
259
+ *args,
260
+ **kwargs,
261
+ ) -> FileInfo:
201
262
  """
202
263
  Create a file info object from a string.
203
264
  :param filename: Name of the file to be created. E.g. 'new_file.txt'
204
265
  :param content: Content of the file. E.g. 'This is the content of the file.'
266
+ :param target_dir: Target directory to add the asset to.
205
267
  :param args:
206
268
  :param kwargs:
207
269
  :return: FileInfo
208
270
  """
209
271
 
210
272
  data_model = kwargs.get('data_model', config.get_default_data_model())
211
- resource = create_asset_from_string(filename, content, *args, **kwargs)
273
+ resource = create_asset_from_string(filename,
274
+ content,
275
+ target_dir=target_dir,
276
+ *args,
277
+ **kwargs)
212
278
 
213
279
  file_info = cls(resource_entry=resource,
214
280
  data_model=data_model)
@@ -247,6 +313,10 @@ class FileInfo(object, metaclass=MetaMock):
247
313
  self.args = args
248
314
  self.kwargs = kwargs
249
315
 
316
+ @property
317
+ def parent(self):
318
+ return self.resource_entry.Parent
319
+
250
320
  @property
251
321
  def key(self) -> int:
252
322
  try:
@@ -423,3 +493,121 @@ class FileInfo(object, metaclass=MetaMock):
423
493
  "$key": str(self.key)
424
494
  }
425
495
  }
496
+
497
+
498
+ class DirectoryInfo(object, metaclass=DirectoryInfoMetaMock):
499
+
500
+ _cls_instances = {}
501
+
502
+ @classmethod
503
+ def get_by_key(cls, key: int) -> Optional[DirectoryInfo]:
504
+ return cls._cls_instances.get(key, None)
505
+
506
+ def __init__(self,
507
+ path: Optional[str] = None,
508
+ *args,
509
+ **kwargs):
510
+
511
+ self._resource_entry: Optional[ResourceDirectoryEntry] = None
512
+ self.data_model: Optional[DataModel] = kwargs.get('data_model', None)
513
+ self.path: str = path
514
+
515
+ self.resource_entry = kwargs.get('resource_entry', None)
516
+
517
+ @property
518
+ def tags(self) -> List[SimTaxonomyEntry]:
519
+ return list(self.resource_entry.Tags)
520
+
521
+ @property
522
+ def full_path(self) -> str:
523
+ return self.resource_entry.CurrentFullPath
524
+
525
+ @property
526
+ def relative_path(self) -> str:
527
+ return self.resource_entry.CurrentRelativePath
528
+
529
+ @property
530
+ def resource_entry(self) -> Optional[ResourceDirectoryEntry]:
531
+ if self._resource_entry is None:
532
+ if self.data_model is None:
533
+ logger.warning(
534
+ f'No data model provided. Using default data model: {config.get_default_data_model().id}.')
535
+ self.data_model = config.get_default_data_model()
536
+ if self.data_model is not None:
537
+ self.resource_entry = self.data_model.create_resource_directory(self.path)
538
+ self._cls_instances[self.resource_entry.Key] = self
539
+ self.path = self.resource_entry.CurrentFullPath
540
+ return self._resource_entry
541
+
542
+ @resource_entry.setter
543
+ def resource_entry(self, value):
544
+
545
+ orig_value = self._resource_entry
546
+ self._resource_entry = value
547
+
548
+ if self._resource_entry is None:
549
+ if orig_value is not None:
550
+ del self._cls_instances[orig_value.Key]
551
+ return
552
+
553
+ if self.key is not None:
554
+ if value is not None:
555
+ self._cls_instances[value.Key] = self
556
+ else:
557
+ del self._cls_instances[self._resource_entry.Key]
558
+ self._resource_entry = value
559
+
560
+ @property
561
+ def parent(self) -> Optional[ResourceDirectoryEntry]:
562
+ if self.resource_entry.Parent is not None:
563
+ if self.resource_entry.Parent.Key in self._cls_instances:
564
+ return self.get_by_key(self.resource_entry.Parent.Key)
565
+ return DirectoryInfo(resource_entry=self.resource_entry.Parent)
566
+ else:
567
+ return self.resource_entry.Parent
568
+
569
+ @property
570
+ def sub_directories(self) -> List[DirectoryInfo]:
571
+ return [DirectoryInfo(resource_entry=entry,
572
+ data_model=self.data_model) for entry in self.resource_entry.Children if isinstance(entry, ResourceDirectoryEntry)]
573
+
574
+ @property
575
+ def files(self) -> List[FileInfo]:
576
+ return [FileInfo(resource_entry=entry,
577
+ data_model=self.data_model) for entry in self.resource_entry.Children if isinstance(entry,
578
+ (
579
+ ResourceFileEntry,
580
+ ContainedResourceFileEntry)
581
+ )
582
+ ]
583
+
584
+ @property
585
+ def key(self) -> Optional[int]:
586
+ if self.resource_entry is not None:
587
+ return self.resource_entry.Key
588
+ else:
589
+ return None
590
+
591
+ def add_sub_directory(self, name: str) -> DirectoryInfo:
592
+ return DirectoryInfo(path=os.path.join(self.resource_entry.current_relative_path, name),
593
+ data_model=self.data_model)
594
+
595
+ def add_file(self,
596
+ filename: str,
597
+ content: Optional[str] = None) -> FileInfo:
598
+
599
+ if content is not None:
600
+ return FileInfo.from_string(filename=filename,
601
+ content=content,
602
+ target_dir=self.resource_entry,
603
+ data_model=self.data_model)
604
+ else:
605
+ new_resource = self.data_model.add_empty_resource(filename=os.path.join(self.full_path, filename))
606
+ return FileInfo(resource_entry=new_resource,
607
+ data_model=self.data_model)
608
+
609
+ def add_tag(self, tag: SimTaxonomyEntry) -> None:
610
+ add_tag_to_resource(self.resource_entry, tag)
611
+
612
+ def __repr__(self):
613
+ return f'DirectoryInfo(key:{self.key}, hash: {hash(self)}; {self.full_path};)'
@@ -140,7 +140,6 @@ class PythonMapper(object):
140
140
  mapper.registered_classes)
141
141
  )[0]
142
142
  mapper.registered_classes[key] = cls
143
- print(f'Updated {cls} in {mapper.module} with {taxonomy}')
144
143
 
145
144
  def update_from_submodules(self):
146
145
  for submodule in self.submodules.values():
@@ -5,9 +5,9 @@ import inspect
5
5
  import enum
6
6
 
7
7
  from .utils import (SimComponent, SimDoubleParameter, SimIntegerParameter, SimStringParameter,
8
- SimBoolParameter, SimEnumParameter, SimMultiValueField3D, SimMultiValueBigTable, FileInfo,
8
+ SimBoolParameter, SimEnumParameter, SimMultiValueField3D, SimMultiValueBigTable, FileInfo, DirectoryInfo,
9
9
  set_property_to_sim_component, set_property_to_parameter, set_property_to_value_field,
10
- set_property_to_file_info, set_property_to_list, set_property_to_dict)
10
+ set_property_to_file_info, set_property_to_list, set_property_to_dict, set_property_to_directory_info)
11
11
 
12
12
  from .simultan_object import SimultanObject, MetaMock
13
13
 
@@ -36,6 +36,7 @@ class TypeSetterFcnLookupDict(object):
36
36
  str: set_property_to_parameter,
37
37
  bool: set_property_to_parameter,
38
38
  FileInfo: set_property_to_file_info,
39
+ DirectoryInfo: set_property_to_directory_info,
39
40
  list: set_property_to_list,
40
41
  tuple: set_property_to_list,
41
42
  set: set_property_to_list,
@@ -20,12 +20,13 @@ from SIMULTAN.Data.Components import SimDefaultSlotKeys
20
20
  from SIMULTAN.Data.MultiValues import (SimMultiValueField3D, SimMultiValueField3DParameterSource, SimMultiValueBigTable,
21
21
  SimMultiValueBigTableHeader, SimMultiValueBigTableParameterSource)
22
22
 
23
- from SIMULTAN.Data.Assets import ResourceEntry, ResourceFileEntry, ContainedResourceFileEntry, Asset, LinkedResourceFileEntry
23
+ from SIMULTAN.Data.Assets import (ResourceEntry, ResourceFileEntry, ContainedResourceFileEntry, Asset,
24
+ LinkedResourceFileEntry, ResourceDirectoryEntry)
24
25
  from SIMULTAN.Data.Geometry import Face, Edge, Vertex, Volume
25
26
 
26
27
  from .multi_values import (simultan_multi_value_field_3d_to_numpy, set_parameter_to_value_field,
27
28
  create_field_parameter, simultan_multi_value_big_table_to_pandas)
28
- from .files import FileInfo, remove_asset_from_component, add_asset_to_component
29
+ from .files import FileInfo, remove_asset_from_component, add_asset_to_component, DirectoryInfo
29
30
 
30
31
  if TYPE_CHECKING:
31
32
  from .default_types import ComponentList, ComponentDictionary
@@ -373,18 +374,27 @@ def create_parameter(value: Union[int, float, str, SimTaxonomyEntry] = 0,
373
374
  raise ValueError(f'Parameter type {type(value)} not supported.')
374
375
 
375
376
  if parameter_type == float:
377
+ if isinstance(value, (str, int)):
378
+ value = float(value)
379
+
376
380
  return create_sim_double_parameter(name=name,
377
381
  value=value,
378
382
  slot=taxonomy_entry,
379
383
  unit=kwargs.pop('unit', ''),
380
384
  **kwargs)
381
385
  elif parameter_type == int:
386
+ if isinstance(value, (str, float)):
387
+ value = int(value)
388
+
382
389
  return create_sim_integer_parameter(name=name,
383
390
  value=value,
384
391
  slot=taxonomy_entry,
385
392
  unit=kwargs.pop('unit', ''),
386
393
  **kwargs)
387
394
  elif parameter_type == str:
395
+ if isinstance(value, (int, float)):
396
+ value = str(value)
397
+
388
398
  return create_sim_string_parameter(name=name,
389
399
  value=value,
390
400
  slot=taxonomy_entry,
@@ -758,10 +768,15 @@ def get_sim_double_parameter_value(obj: SimDoubleParameter,
758
768
 
759
769
  def get_resource_entry_value(obj: ResourceEntry,
760
770
  data_model: DataModel = None,
761
- object_mapper: PythonMapper = None) -> FileInfo:
762
- return FileInfo(file_path=obj.File.FullPath,
763
- resource_entry=obj,
764
- data_model=data_model)
771
+ object_mapper: PythonMapper = None) -> Union[FileInfo, DirectoryInfo]:
772
+ if isinstance(obj, (ResourceFileEntry, ContainedResourceFileEntry, LinkedResourceFileEntry)):
773
+ return FileInfo(file_path=obj.File.FullPath,
774
+ resource_entry=obj,
775
+ data_model=data_model)
776
+ elif isinstance(obj, ResourceDirectoryEntry):
777
+ return DirectoryInfo(file_path=obj.CurrentFullPath,
778
+ resource_entry=obj,
779
+ data_model=data_model)
765
780
 
766
781
 
767
782
  type_convert_dict = {SimComponent: get_sim_component_value,
@@ -771,13 +786,16 @@ type_convert_dict = {SimComponent: get_sim_component_value,
771
786
  SimBoolParameter: get_parameter_value,
772
787
  SimEnumParameter: get_parameter_value,
773
788
  ResourceEntry: get_resource_entry_value,
789
+ ResourceFileEntry: get_resource_entry_value,
790
+ ResourceDirectoryEntry: get_resource_entry_value,
774
791
  ContainedResourceFileEntry: get_resource_entry_value,
775
792
  LinkedResourceFileEntry: get_resource_entry_value
776
793
  }
777
794
 
778
795
 
779
796
  def get_obj_value(obj: Union[SimComponent, SimDoubleParameter, SimIntegerParameter, SimStringParameter,
780
- SimBoolParameter, SimEnumParameter, ResourceEntry, ContainedResourceFileEntry, None],
797
+ SimBoolParameter, SimEnumParameter, ResourceEntry, ResourceFileEntry, ContainedResourceFileEntry,
798
+ ResourceDirectoryEntry, None],
781
799
  data_model: DataModel,
782
800
  object_mapper: PythonMapper) -> Union[SimultanObject, int, float, str, FileInfo, None, pd.DataFrame,
783
801
  np.ndarray]:
@@ -1152,6 +1170,44 @@ def set_property_to_file_info(value: FileInfo,
1152
1170
  tag=taxonomy_entry)
1153
1171
 
1154
1172
 
1173
+ def set_property_to_directory_info(value: DirectoryInfo,
1174
+ component: SimultanObject,
1175
+ prop_name: str,
1176
+ taxonomy_entry: SimTaxonomyEntry,
1177
+ slot_extension: Union[str, int, float],
1178
+ component_idx: int = None,
1179
+ ref_component_idx: int = None,
1180
+ parameter_idx: int = None,
1181
+ ref_asset_idx: int = None,
1182
+ content: Content = None) -> None:
1183
+
1184
+ remove_prop_from_sim_component(component=component,
1185
+ component_idx=component_idx,
1186
+ ref_component_idx=ref_component_idx,
1187
+ parameter_idx=parameter_idx,
1188
+ ref_asset_idx=ref_asset_idx,
1189
+ keep=['ref_asset_idx'])
1190
+
1191
+ value.data_model = component._data_model
1192
+
1193
+ if ref_asset_idx is not None:
1194
+ asset = component._wrapped_obj.ReferencedAssets.Items[ref_asset_idx]
1195
+
1196
+ if hasattr(value, 'resource_entry'):
1197
+ if asset.Resource.Key == value.resource_entry.Key:
1198
+ return
1199
+ elif asset.Resource.CurrentFullPath == str(value.file_path):
1200
+ return
1201
+
1202
+ remove_asset_from_component(component._wrapped_obj, asset)
1203
+ ref_asset_idx = None
1204
+
1205
+ add_asset_to_component(component._wrapped_obj,
1206
+ value.resource_entry,
1207
+ '0',
1208
+ tag=taxonomy_entry)
1209
+
1210
+
1155
1211
  def set_property_to_parameter(value: Union[int, float, str, Enum, bool],
1156
1212
  component: SimultanObject,
1157
1213
  prop_name: str,
@@ -0,0 +1,63 @@
1
+ import os
2
+ from PySimultan2.src.PySimultan2 import DataModel
3
+ from PySimultan2.src.PySimultan2.files import FileInfo, DirectoryInfo
4
+
5
+
6
+ project_dir = os.environ.get('PROJECT_DIR', '/simultan_projects')
7
+ if not os.path.exists(project_dir):
8
+ os.makedirs(project_dir)
9
+
10
+ new_data_model = DataModel.create_new_project(project_path=os.path.join(project_dir, 'test_dir_files.simultan'),
11
+ user_name='admin',
12
+ password='admin')
13
+
14
+ print(new_data_model.file_directories)
15
+
16
+
17
+ new_directory_info = DirectoryInfo(path='directory_info_dir',
18
+ data_model=new_data_model)
19
+
20
+ print(new_data_model.file_directories)
21
+
22
+ print(new_directory_info.resource_entry)
23
+ print(new_directory_info.parent)
24
+
25
+ new_file1 = new_directory_info.add_file('test_add_file.txt', 'This is a test file')
26
+ new_file2 = new_directory_info.add_file('test_add_file2.txt')
27
+
28
+ sub_directory_info = new_directory_info.add_sub_directory('sub_dir')
29
+ print(sub_directory_info.parent)
30
+
31
+ print(new_directory_info.sub_directories)
32
+
33
+
34
+ new_directory = new_data_model.create_resource_directory('test_dir')
35
+ new_directory2 = new_data_model.create_resource_directory('test_dir2')
36
+ new_directory4 = new_data_model.create_resource_directory('test_dir3')
37
+
38
+ new_data_model.add_empty_resource(filename=os.path.join(new_directory.CurrentFullPath, 'test_empty_file.txt'))
39
+
40
+ new_data_model.add_empty_resource(filename='test_empty_file2.txt',
41
+ target_dir=new_directory)
42
+
43
+ new_file_info0 = FileInfo.from_string(filename='test_file.txt',
44
+ content='This is a test file',
45
+ data_model=new_data_model)
46
+
47
+ new_file_info = FileInfo.from_string(filename='test_file.txt',
48
+ content='This is a test file',
49
+ target_dir=new_directory,
50
+ data_model=new_data_model)
51
+
52
+ new_file_info2 = FileInfo.from_string(filename='test_file2.txt',
53
+ content='This is a test file 2',
54
+ target_dir=new_directory2.current_full_path,
55
+ data_model=new_data_model)
56
+
57
+ # create just a file in the directory
58
+ with open(os.path.join(new_directory2.current_full_path, 'not_contained_test_file3.txt'), 'w') as f:
59
+ f.write('This is a test file 3')
60
+
61
+
62
+ new_data_model.save()
63
+ new_data_model.cleanup()
File without changes
@@ -1 +0,0 @@
1
- version = '0.5.2.5'
File without changes
File without changes
File without changes
File without changes