diff --git a/cpp/src/bindings.cpp b/cpp/src/bindings.cpp index 0e5d74285c..1af06d995c 100644 --- a/cpp/src/bindings.cpp +++ b/cpp/src/bindings.cpp @@ -326,10 +326,13 @@ PYBIND11_MODULE(_pypowsybl, m) { m.def("load_network_from_binary_buffers", &pypowsybl::loadNetworkFromBinaryBuffers, "Load a network from a list of binary buffer", py::call_guard(), py::arg("buffers"), py::arg("parameters"), py::arg("reporter")); - m.def("dump_network", &pypowsybl::dumpNetwork, "Dump network to a file in a given format", py::call_guard(), + m.def("save_network", &pypowsybl::saveNetwork, "Save network to a file in a given format", py::call_guard(), py::arg("network"), py::arg("file"),py::arg("format"), py::arg("parameters"), py::arg("reporter")); - m.def("dump_network_to_string", &pypowsybl::dumpNetworkToString, "Dump network in a given format", py::call_guard(), + m.def("save_network_to_string", &pypowsybl::saveNetworkToString, "Save network in a given format to a string", py::call_guard(), + py::arg("network"), py::arg("format"), py::arg("parameters"), py::arg("reporter")); + + m.def("save_network_to_binary_buffer", &pypowsybl::saveNetworkToBinaryBuffer, "Save network in a given format to a binary byffer", py::call_guard(), py::arg("network"), py::arg("format"), py::arg("parameters"), py::arg("reporter")); m.def("reduce_network", &pypowsybl::reduceNetwork, "Reduce network", py::call_guard(), diff --git a/cpp/src/pypowsybl.cpp b/cpp/src/pypowsybl.cpp index 41dc409d35..5906933178 100644 --- a/cpp/src/pypowsybl.cpp +++ b/cpp/src/pypowsybl.cpp @@ -664,7 +664,7 @@ JavaHandle loadNetworkFromBinaryBuffers(std::vector byteBuffers, con return networkHandle; } -void dumpNetwork(const JavaHandle& network, const std::string& file, const std::string& format, const std::map& parameters, JavaHandle* reporter) { +void saveNetwork(const JavaHandle& network, const std::string& file, const std::string& format, const std::map& parameters, JavaHandle* reporter) { std::vector parameterNames; std::vector parameterValues; parameterNames.reserve(parameters.size()); @@ -675,11 +675,11 @@ void dumpNetwork(const JavaHandle& network, const std::string& file, const std:: } ToCharPtrPtr parameterNamesPtr(parameterNames); ToCharPtrPtr parameterValuesPtr(parameterValues); - callJava(::dumpNetwork, network, (char*) file.data(), (char*) format.data(), parameterNamesPtr.get(), parameterNames.size(), + callJava(::saveNetwork, network, (char*) file.data(), (char*) format.data(), parameterNamesPtr.get(), parameterNames.size(), parameterValuesPtr.get(), parameterValues.size(), (reporter == nullptr) ? nullptr : *reporter); } -std::string dumpNetworkToString(const JavaHandle& network, const std::string& format, const std::map& parameters, JavaHandle* reporter) { +std::string saveNetworkToString(const JavaHandle& network, const std::string& format, const std::map& parameters, JavaHandle* reporter) { std::vector parameterNames; std::vector parameterValues; parameterNames.reserve(parameters.size()); @@ -690,10 +690,28 @@ std::string dumpNetworkToString(const JavaHandle& network, const std::string& fo } ToCharPtrPtr parameterNamesPtr(parameterNames); ToCharPtrPtr parameterValuesPtr(parameterValues); - return toString(callJava(::dumpNetworkToString, network, (char*) format.data(), parameterNamesPtr.get(), parameterNames.size(), + return toString(callJava(::saveNetworkToString, network, (char*) format.data(), parameterNamesPtr.get(), parameterNames.size(), parameterValuesPtr.get(), parameterValues.size(), (reporter == nullptr) ? nullptr : *reporter)); } +py::bytes saveNetworkToBinaryBuffer(const JavaHandle& network, const std::string& format, const std::map& parameters, JavaHandle* reporter) { + std::vector parameterNames; + std::vector parameterValues; + parameterNames.reserve(parameters.size()); + parameterValues.reserve(parameters.size()); + for (std::pair p : parameters) { + parameterNames.push_back(p.first); + parameterValues.push_back(p.second); + } + ToCharPtrPtr parameterNamesPtr(parameterNames); + ToCharPtrPtr parameterValuesPtr(parameterValues); + array* byteArray = callJava(::saveNetworkToBinaryBuffer, network, (char*) format.data(), parameterNamesPtr.get(), parameterNames.size(), + parameterValuesPtr.get(), parameterValues.size(), reporter == nullptr ? nullptr : *reporter); + py::bytes bytes((char*) byteArray->ptr, byteArray->length); + callJava<>(::freeNetworkBinaryBuffer, byteArray); + return bytes; +} + void reduceNetwork(const JavaHandle& network, double v_min, double v_max, const std::vector& ids, const std::vector& vls, const std::vector& depths, bool withDangLingLines) { ToCharPtrPtr elementIdPtr(ids); diff --git a/cpp/src/pypowsybl.h b/cpp/src/pypowsybl.h index 96afb26a41..f2a7c56387 100644 --- a/cpp/src/pypowsybl.h +++ b/cpp/src/pypowsybl.h @@ -346,7 +346,7 @@ JavaHandle loadNetworkFromString(const std::string& fileName, const std::string& JavaHandle loadNetworkFromBinaryBuffers(std::vector byteBuffer, const std::map& parameters, JavaHandle* reporter); -void dumpNetwork(const JavaHandle& network, const std::string& file, const std::string& format, const std::map& parameters, JavaHandle* reporter); +void saveNetwork(const JavaHandle& network, const std::string& file, const std::string& format, const std::map& parameters, JavaHandle* reporter); LoadFlowParameters* createLoadFlowParameters(); @@ -364,7 +364,9 @@ SensitivityAnalysisParameters* createSensitivityAnalysisParameters(); std::vector getSensitivityAnalysisProviderParametersNames(const std::string& sensitivityAnalysisProvider); -std::string dumpNetworkToString(const JavaHandle& network, const std::string& format, const std::map& parameters, JavaHandle* reporter); +std::string saveNetworkToString(const JavaHandle& network, const std::string& format, const std::map& parameters, JavaHandle* reporter); + +py::bytes saveNetworkToBinaryBuffer(const JavaHandle& network, const std::string& format, const std::map& parameters, JavaHandle* reporter); void reduceNetwork(const JavaHandle& network, const double v_min, const double v_max, const std::vector& ids, const std::vector& vls, const std::vector& depths, bool withDangLingLines); diff --git a/docs/user_guide/network.rst b/docs/user_guide/network.rst index d78b62523a..ae54346d41 100644 --- a/docs/user_guide/network.rst +++ b/docs/user_guide/network.rst @@ -68,13 +68,19 @@ Networks can be written to the filesystem, using one of the available export for .. code-block:: python - network.dump('network.xiidm', format='XIIDM') + network.save('network.xiidm', format='XIIDM') You can also serialize networks to a string: .. code-block:: python - xiidm_str = network.dump_to_string('XIIDM') + xiidm_str = network.save_to_string('XIIDM') + +And also to a zip file as a (io.BytesIO) binary buffer. + +.. code-block:: python + + zipped_xiidm = network.save_to_binary_buffer('XIIDM') The supported formats are: diff --git a/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java b/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java index 9a2a8572cb..eb67e1f6b9 100644 --- a/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java +++ b/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java @@ -38,6 +38,10 @@ public static CCharPointer toCharPtr(String str) { } // pybind11 convert std::string and char* to python utf-8 string byte[] bytes = str.getBytes(StandardCharsets.UTF_8); + return toCharPtr(bytes); + } + + public static CCharPointer toCharPtr(byte[] bytes) { CCharPointer charPtr = UnmanagedMemory.calloc((bytes.length + 1) * SizeOf.get(CCharPointer.class)); for (int i = 0; i < bytes.length; ++i) { charPtr.write(i, bytes[i]); diff --git a/java/src/main/java/com/powsybl/python/commons/Util.java b/java/src/main/java/com/powsybl/python/commons/Util.java index 9e73a6222e..f171a0b2b9 100644 --- a/java/src/main/java/com/powsybl/python/commons/Util.java +++ b/java/src/main/java/com/powsybl/python/commons/Util.java @@ -21,6 +21,7 @@ import com.powsybl.python.dataframe.CDataframeHandler; import org.graalvm.nativeimage.UnmanagedMemory; import org.graalvm.nativeimage.c.struct.SizeOf; +import org.graalvm.nativeimage.c.type.CCharPointer; import org.graalvm.nativeimage.c.type.CCharPointerPointer; import org.graalvm.nativeimage.c.type.CDoublePointer; import org.graalvm.nativeimage.c.type.CIntPointer; @@ -156,6 +157,10 @@ public static ArrayPointer createIntegerArray(List integer return allocArrayPointer(intListPtr, integerList.size()); } + public static ArrayPointer createByteArray(byte[] bytes) { + return allocArrayPointer(CTypeUtil.toCharPtr(bytes), bytes.length); + } + public static int convert(SeriesDataType type) { return switch (type) { case STRING -> CDataframeHandler.STRING_SERIES_TYPE; diff --git a/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java b/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java index 232a989bd8..052bd53c9a 100644 --- a/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java +++ b/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java @@ -60,6 +60,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.*; +import java.util.zip.ZipOutputStream; import static com.powsybl.python.commons.CTypeUtil.toStringList; import static com.powsybl.python.commons.PyPowsyblApiHeader.*; @@ -210,8 +211,8 @@ public static ObjectHandle loadNetworkFromBinaryBuffers(IsolateThread thread, CC }); } - @CEntryPoint(name = "dumpNetwork") - public static void dumpNetwork(IsolateThread thread, ObjectHandle networkHandle, CCharPointer file, CCharPointer format, + @CEntryPoint(name = "saveNetwork") + public static void saveNetwork(IsolateThread thread, ObjectHandle networkHandle, CCharPointer file, CCharPointer format, CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reporterHandle, ExceptionHandlerPointer exceptionHandlerPtr) { @@ -228,8 +229,8 @@ public static void dumpNetwork(IsolateThread thread, ObjectHandle networkHandle, }); } - @CEntryPoint(name = "dumpNetworkToString") - public static CCharPointer dumpNetworkToString(IsolateThread thread, ObjectHandle networkHandle, CCharPointer format, + @CEntryPoint(name = "saveNetworkToString") + public static CCharPointer saveNetworkToString(IsolateThread thread, ObjectHandle networkHandle, CCharPointer format, CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reporterHandle, ExceptionHandlerPointer exceptionHandlerPtr) { @@ -260,6 +261,40 @@ public static CCharPointer dumpNetworkToString(IsolateThread thread, ObjectHandl }); } + @CEntryPoint(name = "saveNetworkToBinaryBuffer") + public static ArrayPointer saveNetworkToBinaryBuffer(IsolateThread thread, ObjectHandle networkHandle, CCharPointer format, + CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, + CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, + ObjectHandle reporterHandle, ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, () -> { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String formatStr = CTypeUtil.toString(format); + Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); + var exporter = Exporter.find(formatStr); + if (exporter == null) { + throw new PowsyblException("No exporter found for '" + formatStr + "' to export as a string"); + } + Reporter reporter = ReportCUtils.getReporter(reporterHandle); + // to support all kind of export: simple file or multiple to an archive, + // best is to write to a zip file + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try (ZipOutputStream zos = new ZipOutputStream(bos)) { + DataSource dataSource = new ZipMemDataSource("file", zos); + exporter.export(network, parameters, dataSource, reporter); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + byte[] bytes = bos.toByteArray(); + return Util.createByteArray(bytes); + }); + } + + @CEntryPoint(name = "freeNetworkBinaryBuffer") + public static void freeNetworkBinaryBuffer(IsolateThread thread, PyPowsyblApiHeader.ArrayPointer byteArrayPtr, + PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + doCatch(exceptionHandlerPtr, () -> freeArrayPointer(byteArrayPtr)); + } + @CEntryPoint(name = "reduceNetwork") public static void reduceNetwork(IsolateThread thread, ObjectHandle networkHandle, double vMin, double vMax, diff --git a/java/src/main/java/com/powsybl/python/network/ZipMemDataSource.java b/java/src/main/java/com/powsybl/python/network/ZipMemDataSource.java new file mode 100644 index 0000000000..0533b2f025 --- /dev/null +++ b/java/src/main/java/com/powsybl/python/network/ZipMemDataSource.java @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2023, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.python.network; + +import com.powsybl.commons.datasource.DataSource; +import com.powsybl.commons.datasource.DataSourceUtil; +import com.powsybl.commons.io.ForwardingOutputStream; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Objects; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author Geoffroy Jamgotchian {@literal } + */ +public class ZipMemDataSource implements DataSource { + + private final String baseName; + + private final ZipOutputStream zos; + + public ZipMemDataSource(String baseName, ZipOutputStream zos) { + this.baseName = Objects.requireNonNull(baseName); + this.zos = Objects.requireNonNull(zos); + } + + @Override + public OutputStream newOutputStream(String fileName, boolean append) throws IOException { + Objects.requireNonNull(fileName); + if (append) { + throw new UnsupportedOperationException("append not supported in zip file data source"); + } + zos.putNextEntry(new ZipEntry(fileName)); + return new ForwardingOutputStream(zos) { + @Override + public void close() throws IOException { + zos.closeEntry(); + } + }; + } + + @Override + public OutputStream newOutputStream(String suffix, String ext, boolean append) throws IOException { + return newOutputStream(DataSourceUtil.getFileName(baseName, suffix, ext), append); + } + + @Override + public String getBaseName() { + return baseName; + } + + @Override + public boolean exists(String suffix, String ext) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean exists(String fileName) { + throw new UnsupportedOperationException(); + } + + @Override + public InputStream newInputStream(String suffix, String ext) { + throw new UnsupportedOperationException(); + } + + @Override + public InputStream newInputStream(String fileName) { + throw new UnsupportedOperationException(); + } + + @Override + public Set listNames(String regex) { + throw new UnsupportedOperationException(); + } +} diff --git a/pypowsybl/_pypowsybl.pyi b/pypowsybl/_pypowsybl.pyi index 466171af49..18da22f3bc 100644 --- a/pypowsybl/_pypowsybl.pyi +++ b/pypowsybl/_pypowsybl.pyi @@ -553,8 +553,9 @@ def get_extensions_names() -> List[str]: ... def get_extensions_information() -> SeriesArray: ... def create_security_analysis() -> JavaHandle: ... def create_sensitivity_analysis() -> JavaHandle: ... -def dump_network(network: JavaHandle, file: str, format: str, parameters: Dict[str,str], report: Optional[JavaHandle]) -> None: ... -def dump_network_to_string(network: JavaHandle, format: str, parameters: Dict[str,str], report: Optional[JavaHandle]) -> str: ... +def save_network(network: JavaHandle, file: str, format: str, parameters: Dict[str,str], report: Optional[JavaHandle]) -> None: ... +def save_network_to_string(network: JavaHandle, format: str, parameters: Dict[str,str], report: Optional[JavaHandle]) -> str: ... +def save_network_to_binary_buffer(network: JavaHandle, format: str, parameters: Dict[str,str], report: Optional[JavaHandle]) -> bytes: ... def get_branch_flows_sensitivity_matrix(sensitivity_analysis_result_context: JavaHandle, matrix_id: str, contingency_id: str) -> Matrix: ... def get_branch_results(result: JavaHandle) -> SeriesArray: ... def get_bus_breaker_view_buses(network: JavaHandle, voltage_level: str) -> SeriesArray: ... diff --git a/pypowsybl/network/impl/network.py b/pypowsybl/network/impl/network.py index 182c893e0b..c254b86e3f 100644 --- a/pypowsybl/network/impl/network.py +++ b/pypowsybl/network/impl/network.py @@ -7,6 +7,7 @@ # from __future__ import annotations # Necessary for type alias like _DataFrame to work with sphinx +import io import sys import datetime @@ -93,7 +94,7 @@ def __repr__(self) -> str: return str(self) def __getstate__(self) -> Dict[str, str]: - return {'xml': self.dump_to_string()} + return {'xml': self.save_to_string()} def __setstate__(self, state: Dict[str, str]) -> None: xml = state['xml'] @@ -123,6 +124,13 @@ def disconnect(self, id: str) -> bool: def dump(self, file: PathOrStr, format: str = 'XIIDM', parameters: ParamsDict = None, reporter: Reporter = None) -> None: """ + Deprecated, use :meth:`save` instead. + """ + self.save(file, format, parameters, reporter) + + def save(self, file: PathOrStr, format: str = 'XIIDM', parameters: ParamsDict = None, + reporter: Reporter = None) -> None: + """ Save a network to a file using the specified format. Basic compression formats are also supported: @@ -139,17 +147,23 @@ def dump(self, file: PathOrStr, format: str = 'XIIDM', parameters: ParamsDict = .. code-block:: python - network.dump('network.xiidm') - network.dump('network.xiidm.gz') # produces a gzipped file - network.dump('/path/to/network.uct', format='UCTE') + network.save('network.xiidm') + network.save('network.xiidm.gz') # produces a gzipped file + network.save('/path/to/network.uct', format='UCTE') """ file = path_to_str(file) if parameters is None: parameters = {} - _pp.dump_network(self._handle, file, format, parameters, + _pp.save_network(self._handle, file, format, parameters, None if reporter is None else reporter._reporter_model) # pylint: disable=protected-access def dump_to_string(self, format: str = 'XIIDM', parameters: ParamsDict = None, reporter: Reporter = None) -> str: + """ + Deprecated, use :meth:`save_to_string` instead. + """ + return self.save_to_string(format, parameters, reporter) + + def save_to_string(self, format: str = 'XIIDM', parameters: ParamsDict = None, reporter: Reporter = None) -> str: """ Save a network to a string using a specified format. @@ -163,9 +177,29 @@ def dump_to_string(self, format: str = 'XIIDM', parameters: ParamsDict = None, r """ if parameters is None: parameters = {} - return _pp.dump_network_to_string(self._handle, format, parameters, + return _pp.save_network_to_string(self._handle, format, parameters, None if reporter is None else reporter._reporter_model) # pylint: disable=protected-access + def save_to_binary_buffer(self, format: str = 'XIIDM', parameters: ParamsDict = None, reporter: Reporter = None) -> io.BytesIO: + """ + Save a network to a binary buffer using a specified format. + In the current implementation, whatever the specified format is (so a format creating a single file or a format + creating multiple files), the created binary buffer is a zip file. + + Args: + format: format to export, only support mono file type, defaults to 'XIIDM' + parameters: a dictionary of export parameters + reporter: the reporter to be used to create an execution report, default is None (no report) + + Returns: + A BytesIO data buffer representing this network + """ + if parameters is None: + parameters = {} + return io.BytesIO(_pp.save_network_to_binary_buffer(self._handle, format, parameters, + None if reporter is None else reporter._reporter_model)) # pylint: disable=protected-access + + def reduce(self, v_min: float = 0, v_max: float = sys.float_info.max, ids: List[str] = None, vl_depths: tuple = (), with_dangling_lines: bool = False) -> None: if ids is None: diff --git a/tests/test_network.py b/tests/test_network.py index 9db04985df..9445ec84b9 100644 --- a/tests/test_network.py +++ b/tests/test_network.py @@ -12,6 +12,7 @@ import tempfile import unittest import io +import zipfile from os.path import exists import matplotlib.pyplot as plt @@ -60,25 +61,32 @@ def test_load_cgmes_two_zip(): assert 3 == len(n.get_substations()) +def test_save_cgmes_zip(): + n = pp.network.create_eurostag_tutorial_example1_network() + buffer = n.save_to_binary_buffer(format='CGMES') + with zipfile.ZipFile(buffer, 'r') as zip_file: + assert ['file_EQ.xml', 'file_TP.xml', 'file_SSH.xml', 'file_SV.xml'] == zip_file.namelist() + + def test_load_zipped_xiidm(): with open(DATA_DIR.joinpath('battery_xiidm.zip'), "rb") as fh: n = pp.network.load_from_binary_buffer(io.BytesIO(fh.read())) assert 2 == len(n.get_substations()) -def test_dump_to_string(): +def test_save_to_string(): bat_path = TEST_DIR.joinpath('battery.xiidm') xml = bat_path.read_text() n = pp.network.load(str(bat_path)) - assert xml == n.dump_to_string() + assert xml == n.save_to_string() -def test_dump_ampl(): +def test_save_ampl(): n = pp.network.create_eurostag_tutorial_example1_network() with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_dir_path = pathlib.Path(tmp_dir_name) ampl_base_file = tmp_dir_path.joinpath('ampl') - n.dump(ampl_base_file, format='AMPL') + n.save(ampl_base_file, format='AMPL') file_names = os.listdir(tmp_dir_path) file_names_expected = ['ampl_network_vsc_converter_stations.txt', 'ampl_network_branches.txt', 'ampl_network_rtc.txt', 'ampl_network_generators.txt', @@ -91,41 +99,41 @@ def test_dump_ampl(): assert file_name in file_names_expected -def test_dump_import_iidm(): +def test_save_import_iidm(): n = pp.network.create_eurostag_tutorial_example1_network() with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_dir_path = pathlib.Path(tmp_dir_name) iidm_file = tmp_dir_path.joinpath('test.xiidm') - n.dump(iidm_file, format='XIIDM') + n.save(iidm_file, format='XIIDM') file_names = os.listdir(tmp_dir_path) assert len(file_names) == 1 assert 'test.xiidm' in file_names n2 = pp.network.load(iidm_file) - assert n2.dump_to_string() == n.dump_to_string() + assert n2.save_to_string() == n.save_to_string() assert isinstance(n2, pp.network.Network) -def test_dump_matpower(): +def test_save_matpower(): n = pp.network.create_eurostag_tutorial_example1_network() with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_dir_path = pathlib.Path(tmp_dir_name) mat_file = tmp_dir_path.joinpath('test.mat') - n.dump(mat_file, format='MATPOWER') + n.save(mat_file, format='MATPOWER') file_names = os.listdir(tmp_dir_path) assert len(file_names) == 1 assert 'test.mat' in file_names n2 = pp.network.load(mat_file) assert isinstance(n2, pp.network.Network) - # assert n2.dump_to_string() == n.dump_to_string() # problem import/export matpower + # assert n2.save_to_string() == n.save_to_string() # problem import/export matpower -def test_dump_ucte(): +def test_save_ucte(): ucte_local_path = TEST_DIR.joinpath('test.uct') n = pp.network.load(str(ucte_local_path)) with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_dir_path = pathlib.Path(tmp_dir_name) ucte_temporary_path = tmp_dir_path.joinpath('test.uct') - n.dump(ucte_temporary_path, format='UCTE') + n.save(ucte_temporary_path, format='UCTE') file_names = os.listdir(tmp_dir_path) assert len(file_names) == 1 assert 'test.uct' in file_names @@ -1708,15 +1716,15 @@ def test_properties(): assert 'dataframe can not contain NaN values' in str(exc) -def test_pathlib_load_dump(tmpdir): +def test_pathlib_load_save(tmpdir): bat_path = TEST_DIR.joinpath('battery.xiidm') n_path = pp.network.load(bat_path) n_str = pp.network.load(str(bat_path)) - assert n_path.dump_to_string() == n_str.dump_to_string() + assert n_path.save_to_string() == n_str.save_to_string() data = tmpdir.mkdir('data') - n_path.dump(data.join('test.xiidm')) + n_path.save(data.join('test.xiidm')) n_path = pp.network.load(data.join('test.xiidm')) - assert n_path.dump_to_string() == n_str.dump_to_string() + assert n_path.save_to_string() == n_str.save_to_string() def test_write_svg_file(tmpdir): @@ -1771,7 +1779,7 @@ def test_load_network_from_string_with_report(): assert len(report2) > len(report1) -def test_dump_to_string_with_report(): +def test_save_to_string_with_report(): bat_path = TEST_DIR.joinpath('battery.xiidm') reporter = rp.Reporter() report1 = str(reporter)