From 25c409fbf7a5d4577d252ab912a4d94b2c014368 Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Tue, 21 Feb 2023 12:06:29 -0600 Subject: [PATCH 1/9] engine plugin example: add back PerformPuts that was removed --- examples/plugins/engine/examplePluginEngine_write.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/plugins/engine/examplePluginEngine_write.cpp b/examples/plugins/engine/examplePluginEngine_write.cpp index 373f84179d..94041efb24 100644 --- a/examples/plugins/engine/examplePluginEngine_write.cpp +++ b/examples/plugins/engine/examplePluginEngine_write.cpp @@ -83,6 +83,7 @@ int main(int argc, char *argv[]) else { writer.Put(var, myFloats.data()); + writer.PerformPuts(); } /** Engine becomes unreachable after this*/ From 29974f2a89cbd705c21623979f16a56154ccdd0b Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Tue, 21 Feb 2023 12:15:48 -0600 Subject: [PATCH 2/9] engine plugin example: return error state for testing --- examples/plugins/engine/examplePluginEngine_read.cpp | 4 +++- examples/plugins/engine/examplePluginEngine_write.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/plugins/engine/examplePluginEngine_read.cpp b/examples/plugins/engine/examplePluginEngine_read.cpp index bfab5a9dd1..9caf5a6de7 100644 --- a/examples/plugins/engine/examplePluginEngine_read.cpp +++ b/examples/plugins/engine/examplePluginEngine_read.cpp @@ -61,6 +61,7 @@ int main(int argc, char *argv[]) std::vector myFloats = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + bool success = false; try { /** ADIOS class factory of IO class objects */ @@ -108,6 +109,7 @@ int main(int argc, char *argv[]) /** Engine becomes unreachable after this*/ reader.Close(); + success = true; } catch (std::invalid_argument &e) { @@ -125,5 +127,5 @@ int main(int argc, char *argv[]) std::cout << e.what() << "\n"; } - return 0; + return success ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/examples/plugins/engine/examplePluginEngine_write.cpp b/examples/plugins/engine/examplePluginEngine_write.cpp index 94041efb24..c9349bc7ee 100644 --- a/examples/plugins/engine/examplePluginEngine_write.cpp +++ b/examples/plugins/engine/examplePluginEngine_write.cpp @@ -52,6 +52,7 @@ int main(int argc, char *argv[]) std::vector myFloats = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const std::size_t Nx = myFloats.size(); + bool success = false; try { /** ADIOS class factory of IO class objects */ @@ -88,6 +89,7 @@ int main(int argc, char *argv[]) /** Engine becomes unreachable after this*/ writer.Close(); + success = true; } catch (std::invalid_argument &e) { @@ -105,5 +107,5 @@ int main(int argc, char *argv[]) std::cout << e.what() << "\n"; } - return 0; + return success ? EXIT_SUCCESS : EXIT_FAILURE; } From 574305feb87f978af37f7dc815ed7f0b3de2600e Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Tue, 21 Feb 2023 13:42:07 -0600 Subject: [PATCH 3/9] engine plugin install test: set ADIOS2_PLUGIN_PATH --- testing/install/EnginePlugin/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/testing/install/EnginePlugin/CMakeLists.txt b/testing/install/EnginePlugin/CMakeLists.txt index 9f03aa09a1..24928aedd9 100644 --- a/testing/install/EnginePlugin/CMakeLists.txt +++ b/testing/install/EnginePlugin/CMakeLists.txt @@ -23,6 +23,9 @@ add_library(PluginEngineRead ) target_link_libraries(PluginEngineRead adios2::cxx11 adios2::core) +file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}" plugin_path) +set(ENV{ADIOS2_PLUGIN_PATH} "${plugin_path}") + # add write test add_executable(adios_plugin_engine_write_test ../../../examples/plugins/engine/examplePluginEngine_write.cpp From bf93faaae68b8cf3420a5d423cd4e6929b7e02b5 Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Tue, 21 Feb 2023 13:46:09 -0600 Subject: [PATCH 4/9] operator plugin example: return error state for testing --- examples/plugins/operator/examplePluginOperator_read.cpp | 4 +++- examples/plugins/operator/examplePluginOperator_write.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/plugins/operator/examplePluginOperator_read.cpp b/examples/plugins/operator/examplePluginOperator_read.cpp index d9e42c52cf..fd6d0a927f 100644 --- a/examples/plugins/operator/examplePluginOperator_read.cpp +++ b/examples/plugins/operator/examplePluginOperator_read.cpp @@ -40,6 +40,7 @@ int main(int argc, char *argv[]) 0.0001, }; + bool success = false; try { /** ADIOS class factory of IO class objects */ @@ -85,6 +86,7 @@ int main(int argc, char *argv[]) /** Engine becomes unreachable after this*/ reader.Close(); + success = true; } catch (std::invalid_argument &e) { @@ -102,5 +104,5 @@ int main(int argc, char *argv[]) std::cout << e.what() << "\n"; } - return 0; + return success ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/examples/plugins/operator/examplePluginOperator_write.cpp b/examples/plugins/operator/examplePluginOperator_write.cpp index 4738261816..e8cc86d3c6 100644 --- a/examples/plugins/operator/examplePluginOperator_write.cpp +++ b/examples/plugins/operator/examplePluginOperator_write.cpp @@ -41,6 +41,7 @@ int main(int argc, char *argv[]) }; const std::size_t Nx = myDoubles.size(); + bool success = false; try { /** ADIOS class factory of IO class objects */ @@ -73,6 +74,7 @@ int main(int argc, char *argv[]) /** Engine becomes unreachable after this*/ writer.Close(); + success = true; } catch (std::invalid_argument &e) { @@ -90,5 +92,5 @@ int main(int argc, char *argv[]) std::cout << e.what() << "\n"; } - return 0; + return success ? EXIT_SUCCESS : EXIT_FAILURE; } From aeed606711ed5444d09c432c8021f15c0e5db598 Mon Sep 17 00:00:00 2001 From: Vicente Adolfo Bolea Sanchez Date: Mon, 27 Feb 2023 19:29:40 -0500 Subject: [PATCH 5/9] engine,plugin: prefixed example plugin location in win --- source/adios2/helper/adiosPluginManager.cpp | 17 +++++++++++++---- testing/install/EnginePlugin/CMakeLists.txt | 14 +++++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/source/adios2/helper/adiosPluginManager.cpp b/source/adios2/helper/adiosPluginManager.cpp index b4ba10c630..77f6d90c7c 100644 --- a/source/adios2/helper/adiosPluginManager.cpp +++ b/source/adios2/helper/adiosPluginManager.cpp @@ -115,8 +115,15 @@ bool PluginManager::LoadPlugin(const std::string &pluginName, { return OpenPlugin(pluginName, pluginLibrary, ""); } - auto pathsSplit = - adios2sys::SystemTools::SplitString(allPluginPaths, ':', false); + +#ifdef _WIN32 + char platform_separator = ';'; +#else + char platform_separator = ':'; +#endif + + auto pathsSplit = adios2sys::SystemTools::SplitString( + allPluginPaths, platform_separator, false); bool loaded = false; auto pathIt = pathsSplit.begin(); @@ -126,9 +133,11 @@ bool PluginManager::LoadPlugin(const std::string &pluginName, { loaded = OpenPlugin(pluginName, pluginLibrary, *pathIt); } - catch (...) + catch (std::exception &e) { - std::cout << "catch block\n"; + helper::Log("Plugins", "PluginManager", "LoadPlugin", + std::string("Exception caught: ") + e.what(), + helper::LogMode::WARNING); loaded = false; } ++pathIt; diff --git a/testing/install/EnginePlugin/CMakeLists.txt b/testing/install/EnginePlugin/CMakeLists.txt index 24928aedd9..8ab493e71d 100644 --- a/testing/install/EnginePlugin/CMakeLists.txt +++ b/testing/install/EnginePlugin/CMakeLists.txt @@ -23,8 +23,11 @@ add_library(PluginEngineRead ) target_link_libraries(PluginEngineRead adios2::cxx11 adios2::core) -file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}" plugin_path) -set(ENV{ADIOS2_PLUGIN_PATH} "${plugin_path}") +if (WIN32) + file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/Debug" plugin_path) +else() + set(plugin_path "${CMAKE_CURRENT_BINARY_DIR}") +endif() # add write test add_executable(adios_plugin_engine_write_test @@ -32,6 +35,9 @@ add_executable(adios_plugin_engine_write_test ) target_link_libraries(adios_plugin_engine_write_test adios2::cxx11) add_test(NAME adios_plugin_engine_write_test COMMAND adios_plugin_engine_write_test) +set_tests_properties(adios_plugin_engine_write_test PROPERTIES + ENVIRONMENT ADIOS2_PLUGIN_PATH=${plugin_path} + ) # add read test add_executable(adios_plugin_engine_read_test @@ -40,5 +46,7 @@ add_executable(adios_plugin_engine_read_test target_link_libraries(adios_plugin_engine_read_test adios2::cxx11) add_test(NAME adios_plugin_engine_read_test COMMAND adios_plugin_engine_read_test) set_tests_properties(adios_plugin_engine_read_test PROPERTIES - DEPENDS adios_plugin_engine_write_test) + ENVIRONMENT ADIOS2_PLUGIN_PATH=${plugin_path} + DEPENDS adios_plugin_engine_write_test +) From a07fb99067c4d37d2446df9912d27c71d99a9f5b Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Tue, 7 Mar 2023 15:05:26 -0600 Subject: [PATCH 6/9] plugin manager: improve logging/error messages --- examples/plugins/engine/examplePluginEngine_read.cpp | 1 + examples/plugins/engine/examplePluginEngine_write.cpp | 1 + source/adios2/engine/plugin/PluginEngine.cpp | 1 + source/adios2/helper/adiosPluginManager.cpp | 9 +++++++-- source/adios2/operator/plugin/PluginOperator.cpp | 1 + 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/plugins/engine/examplePluginEngine_read.cpp b/examples/plugins/engine/examplePluginEngine_read.cpp index 9caf5a6de7..17042868dc 100644 --- a/examples/plugins/engine/examplePluginEngine_read.cpp +++ b/examples/plugins/engine/examplePluginEngine_read.cpp @@ -77,6 +77,7 @@ int main(int argc, char *argv[]) adios2::Params params; params["PluginName"] = "ReadPlugin"; params["PluginLibrary"] = "PluginEngineRead"; + params["verbose"] = "5"; io.SetParameters(params); } adios2::Engine reader = io.Open("TestPlugin", adios2::Mode::Read); diff --git a/examples/plugins/engine/examplePluginEngine_write.cpp b/examples/plugins/engine/examplePluginEngine_write.cpp index c9349bc7ee..d9aad21a32 100644 --- a/examples/plugins/engine/examplePluginEngine_write.cpp +++ b/examples/plugins/engine/examplePluginEngine_write.cpp @@ -73,6 +73,7 @@ int main(int argc, char *argv[]) adios2::Params params; params["PluginName"] = "WritePlugin"; params["PluginLibrary"] = "PluginEngineWrite"; + params["verbose"] = "5"; io.SetParameters(params); } adios2::Engine writer = io.Open("TestPlugin", adios2::Mode::Write); diff --git a/source/adios2/engine/plugin/PluginEngine.cpp b/source/adios2/engine/plugin/PluginEngine.cpp index d5e0e26167..951f566229 100644 --- a/source/adios2/engine/plugin/PluginEngine.cpp +++ b/source/adios2/engine/plugin/PluginEngine.cpp @@ -57,6 +57,7 @@ PluginEngine::PluginEngine(core::IO &io, const std::string &name, } auto &pluginManager = PluginManager::GetInstance(); + pluginManager.SetParameters(m_IO.m_Parameters); pluginManager.LoadPlugin(pluginNameIt->second, pluginLibIt->second); m_Impl->m_HandleCreate = pluginManager.GetEngineCreateFun(pluginNameIt->second); diff --git a/source/adios2/helper/adiosPluginManager.cpp b/source/adios2/helper/adiosPluginManager.cpp index 77f6d90c7c..e48cb63a82 100644 --- a/source/adios2/helper/adiosPluginManager.cpp +++ b/source/adios2/helper/adiosPluginManager.cpp @@ -135,9 +135,11 @@ bool PluginManager::LoadPlugin(const std::string &pluginName, } catch (std::exception &e) { + // this is not necessarily an error, because you could have + // multiple paths in ADIOS2_PLUGIN_PATH variable helper::Log("Plugins", "PluginManager", "LoadPlugin", - std::string("Exception caught: ") + e.what(), - helper::LogMode::WARNING); + std::string("OpenPlugin failed: ") + e.what(), 5, + m_Impl->m_Verbosity, helper::LogMode::INFO); loaded = false; } ++pathIt; @@ -233,6 +235,9 @@ bool PluginManager::OpenPlugin(const std::string &pluginName, m_Impl->m_Verbosity, helper::LogMode::INFO); return true; } + helper::Throw( + "Plugins", "PluginManager", "OpenPlugin", + "Unable to locate Create/Destroy symbols in library " + pluginLibrary); return false; } diff --git a/source/adios2/operator/plugin/PluginOperator.cpp b/source/adios2/operator/plugin/PluginOperator.cpp index b997166727..ec5a0e1732 100644 --- a/source/adios2/operator/plugin/PluginOperator.cpp +++ b/source/adios2/operator/plugin/PluginOperator.cpp @@ -72,6 +72,7 @@ void PluginOperator::PluginInit(const std::string &pluginName, } auto &pluginManager = PluginManager::GetInstance(); + pluginManager.SetParameters(m_Parameters); pluginManager.LoadPlugin(pluginName, pluginLibrary); m_Impl->m_HandleCreate = pluginManager.GetOperatorCreateFun(pluginName); From a33a655fa2c689a91bae4d545fef4f1feaf64d60 Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Tue, 7 Mar 2023 15:40:29 -0600 Subject: [PATCH 7/9] engine plugin test: export create/destroy symbols On Windows, symbols are invisible by default, so always exporting the create/destroy symbols so they can be found in all CI configurations. --- examples/plugins/engine/CMakeLists.txt | 11 +++++++++++ examples/plugins/engine/ExampleReadPlugin.h | 12 +++++++----- examples/plugins/engine/ExampleWritePlugin.h | 12 +++++++----- testing/install/EnginePlugin/CMakeLists.txt | 12 ++++++++++++ 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/examples/plugins/engine/CMakeLists.txt b/examples/plugins/engine/CMakeLists.txt index 4d175b377a..a611c0b8b7 100644 --- a/examples/plugins/engine/CMakeLists.txt +++ b/examples/plugins/engine/CMakeLists.txt @@ -3,15 +3,26 @@ # accompanying file Copyright.txt for details. #------------------------------------------------------------------------------# +include(GenerateExportHeader) add_library(PluginEngineWrite ExampleWritePlugin.cpp ) target_link_libraries(PluginEngineWrite adios2::cxx11 adios2_core) +generate_export_header(PluginEngineWrite BASE_NAME plugin_engine_write) +target_include_directories(PluginEngineWrite PUBLIC + $ + $ +) add_library(PluginEngineRead ExampleReadPlugin.cpp ) target_link_libraries(PluginEngineRead adios2::cxx11 adios2_core) +generate_export_header(PluginEngineRead BASE_NAME plugin_engine_read) +target_include_directories(PluginEngineRead PUBLIC + $ + $ +) add_executable(examplePluginEngine_write examplePluginEngine_write.cpp diff --git a/examples/plugins/engine/ExampleReadPlugin.h b/examples/plugins/engine/ExampleReadPlugin.h index 3a56d0c5c1..9fff0ae316 100644 --- a/examples/plugins/engine/ExampleReadPlugin.h +++ b/examples/plugins/engine/ExampleReadPlugin.h @@ -15,6 +15,8 @@ #ifndef EXAMPLEREADPLUGIN_H_ #define EXAMPLEREADPLUGIN_H_ +#include "plugin_engine_read_export.h" + #include #include @@ -80,11 +82,11 @@ class ExampleReadPlugin : public PluginEngineInterface extern "C" { -adios2::plugin::ExampleReadPlugin *EngineCreate(adios2::core::IO &io, - const std::string &name, - const adios2::Mode mode, - adios2::helper::Comm comm); -void EngineDestroy(adios2::plugin::ExampleReadPlugin *obj); +PLUGIN_ENGINE_READ_EXPORT adios2::plugin::ExampleReadPlugin * +EngineCreate(adios2::core::IO &io, const std::string &name, + const adios2::Mode mode, adios2::helper::Comm comm); +PLUGIN_ENGINE_READ_EXPORT void +EngineDestroy(adios2::plugin::ExampleReadPlugin *obj); } #endif /* EXAMPLEREADPLUGIN_H_ */ diff --git a/examples/plugins/engine/ExampleWritePlugin.h b/examples/plugins/engine/ExampleWritePlugin.h index 6b98cc17da..bfdd3fa338 100644 --- a/examples/plugins/engine/ExampleWritePlugin.h +++ b/examples/plugins/engine/ExampleWritePlugin.h @@ -14,6 +14,8 @@ #ifndef EXAMPLEWRITEPLUGIN_H_ #define EXAMPLEWRITEPLUGIN_H_ +#include "plugin_engine_write_export.h" + #include #include #include @@ -81,11 +83,11 @@ class ExampleWritePlugin : public PluginEngineInterface extern "C" { -adios2::plugin::ExampleWritePlugin *EngineCreate(adios2::core::IO &io, - const std::string &name, - const adios2::Mode mode, - adios2::helper::Comm comm); -void EngineDestroy(adios2::plugin::ExampleWritePlugin *obj); +PLUGIN_ENGINE_WRITE_EXPORT adios2::plugin::ExampleWritePlugin * +EngineCreate(adios2::core::IO &io, const std::string &name, + const adios2::Mode mode, adios2::helper::Comm comm); +PLUGIN_ENGINE_WRITE_EXPORT void +EngineDestroy(adios2::plugin::ExampleWritePlugin *obj); } #endif /* EXAMPLEWRITEPLUGIN_H_ */ diff --git a/testing/install/EnginePlugin/CMakeLists.txt b/testing/install/EnginePlugin/CMakeLists.txt index 8ab493e71d..7a7425f8d6 100644 --- a/testing/install/EnginePlugin/CMakeLists.txt +++ b/testing/install/EnginePlugin/CMakeLists.txt @@ -13,15 +13,27 @@ option(BUILD_SHARED_LIBS "build shared libs" ON) #---------- Engine Plugin Tests +include(GenerateExportHeader) + add_library(PluginEngineWrite ../../../examples/plugins/engine/ExampleWritePlugin.cpp ) target_link_libraries(PluginEngineWrite adios2::cxx11 adios2::core) +generate_export_header(PluginEngineWrite BASE_NAME plugin_engine_write) +target_include_directories(PluginEngineWrite PUBLIC + $ + $ +) add_library(PluginEngineRead ../../../examples/plugins/engine/ExampleReadPlugin.cpp ) target_link_libraries(PluginEngineRead adios2::cxx11 adios2::core) +generate_export_header(PluginEngineRead BASE_NAME plugin_engine_read) +target_include_directories(PluginEngineRead PUBLIC + $ + $ +) if (WIN32) file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/Debug" plugin_path) From c8bf9e296f60309fe3befe062d4cabc6510aa2d8 Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Thu, 9 Mar 2023 14:18:39 -0600 Subject: [PATCH 8/9] update plugin docs --- docs/user_guide/source/advanced/plugins.rst | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/user_guide/source/advanced/plugins.rst b/docs/user_guide/source/advanced/plugins.rst index 10584ffd10..88d5abec04 100644 --- a/docs/user_guide/source/advanced/plugins.rst +++ b/docs/user_guide/source/advanced/plugins.rst @@ -131,6 +131,35 @@ If ``ADIOS2_PLUGIN_PATH`` is not set, and a path is not specified when loading y .. note:: The ``ADIOS2_PLUGIN_PATH`` environment variable can contain multiple paths, which must be separated with a ``:``. + +When building on Windows, you will likely need to explicitly export the Create and Destroy symbols for your plugin, as symbols are invisible by default on Windows. +To do this in a portable way across platforms, you can add something similar to the following lines to your CMakeLists.txt: + +.. code-block:: cmake + + include(GenerateExportHeader) + generate_export_header(PluginEngineWrite BASE_NAME plugin_engine_write) + target_include_directories(PluginEngineWrite PUBLIC + $ + $) + + +Then in your plugin header, you'll need to ``#include "plugin_engine_write_export.h"``. Then edit your function defintions as follows: + +.. code-block:: c++ + + extern "C" { + + PLUGIN_ENGINE_WRITE_EXPORT adios2::plugin::ExampleWritePlugin * + EngineCreate(adios2::core::IO &io, const std::string &name, + const adios2::Mode mode, adios2::helper::Comm comm); + + PLUGIN_ENGINE_WRITE_EXPORT void + EngineDestroy(adios2::plugin::ExampleWritePlugin * obj); + + } + + *********************************** Using Your Plugin in an Application *********************************** From df89048560dc367bf0dbe3a9ef2586ed6decaf8e Mon Sep 17 00:00:00 2001 From: Caitlin Ross Date: Thu, 5 Jan 2023 13:40:04 -0600 Subject: [PATCH 9/9] update docs/README.md for using conda env --- docs/README.md | 22 +++++++++++++++++++++- docs/requirements.txt | 44 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 docs/requirements.txt diff --git a/docs/README.md b/docs/README.md index 81e4ea5019..bb908000fe 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,7 @@ This user guide is hosted in readthedocs: https://adios2.readthedocs.io/en/latest/ -To generate the User Guide under docs/user_guide/build/html format from the Sphinx source files: +To generate the User Guide under docs/user_guide/build/html format from the Sphinx source files, using pip: ```bash $ cd ADIOS2/docs @@ -14,3 +14,23 @@ docs$ pip3 install -r requirements.txt user_guide$ cd user_guide user_guide$ make html ``` + +Or using conda: + +```bash +$ cd ADIOS2/docs +docs$ conda env create -f environment.yml +docs$ conda activate adios2-python-docs +user_guide$ cd user_guide +user_guide$ make html +``` + +# Updating dependencies + +Read the Docs uses only the environment.yml file, so if you make changes to dependencies in requirements.txt, they will not take effect in RTD. +The requirements.txt is provided only for building locally for those who don't have conda installed. +If you make changes to the conda environment, you should update requirements.txt as well, either manually, or by running the following command (with the conda adios2-python-docs environment activated): + +```bash +docs$ pip list --format=freeze > requirements.txt +``` diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000000..0880ee66ed --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,44 @@ +alabaster==0.7.12 +Babel==2.11.0 +blockdiag==3.0.0 +breathe==4.33.0 +brotlipy==0.7.0 +certifi==2022.12.7 +cffi==1.15.1 +charset-normalizer==2.1.1 +colorama==0.4.6 +cryptography==38.0.2 +docutils==0.17 +funcparserlib==1.0.1 +idna==3.4 +imagesize==1.4.1 +importlib-metadata==4.11.4 +Jinja2==3.1.2 +MarkupSafe==2.1.1 +mpi4py==3.1.3 +numpy==1.21.6 +packaging==22.0 +Pillow==9.4.0 +pip==22.3.1 +pycparser==2.21 +Pygments==2.14.0 +pyOpenSSL==23.0.0 +PySocks==1.7.1 +pytz==2022.7 +requests==2.28.1 +setuptools==65.6.3 +snowballstemmer==2.2.0 +Sphinx==4.5.0 +sphinx-rtd-theme==1.0.0 +sphinxcontrib-applehelp==1.0.2 +sphinxcontrib-blockdiag==3.0.0 +sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-htmlhelp==2.0.0 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-serializinghtml==1.1.5 +typing_extensions==4.4.0 +urllib3==1.26.13 +webcolors==1.12 +wheel==0.38.4 +zipp==3.11.0