##// END OF EJS Templates
Initial Pybind11 binding experiment working....
jeandet -
r1339:98271eda8c6e
parent child
Show More
@@ -0,0 +1,1
1 Subproject commit 2d0507db43cd5a117f7843e053b17dffca114107
@@ -0,0 +1,164
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the SciQLOP Software
3 -- Copyright (C) 2018, Plasma Physics Laboratory - CNRS
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 2 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------*/
19 /*-- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
21 ----------------------------------------------------------------------------*/
22 #include <string>
23 #include <sstream>
24 #include <memory>
25
26 #include <pybind11/pybind11.h>
27 #include <pybind11/operators.h>
28 #include <pybind11/embed.h>
29
30 #include <SqpApplication.h>
31 #include <Variable/VariableController.h>
32 #include <Time/TimeController.h>
33 #include <Data/SqpRange.h>
34 #include <Data/DataSeriesType.h>
35 #include <Common/DateUtils.h>
36 #include <Variable/Variable.h>
37 #include <Data/ScalarSeries.h>
38
39 #include <AmdaProvider.h>
40 #include <AmdaResultParser.h>
41
42 #include <QDate>
43 #include <QTime>
44 #include <QUuid>
45 #include <QString>
46 #include <QFile>
47
48 namespace py = pybind11;
49
50 std::ostream &operator <<(std::ostream& os, const Unit& u)
51 {
52 os << "=========================" << std::endl
53 << "Unit:" << std::endl
54 << "Name:" << std::endl << u.m_Name.toStdString() << std::endl
55 << "Is_TimeUnit: " << u.m_TimeUnit << std::endl;
56 return os;
57 }
58
59 std::ostream &operator <<(std::ostream& os, const IDataSeries& ds)
60 {
61 os << "=========================" << std::endl
62 << "DataSerie:" << std::endl
63 << "Number of points:" << ds.nbPoints() << std::endl
64 << "X Axis Unit:" << std::endl << ds.xAxisUnit() << std::endl
65 << "Y Axis Unit:" << std::endl << ds.yAxisUnit()<< std::endl
66 << "Values Axis Unit:" << std::endl << ds.valuesUnit()<< std::endl;
67 return os;
68 }
69
70 template <typename T>
71 std::string __repr__(const T& obj)
72 {
73 std::stringstream sstr;
74 sstr << obj;
75 return sstr.str();
76 }
77
78
79 PYBIND11_MODULE(pytestamda, m){
80 m.doc() = "hello";
81
82 py::enum_<DataSeriesType>(m, "DataSeriesType")
83 .value("SCALAR", DataSeriesType::SCALAR)
84 .value("SPECTROGRAM", DataSeriesType::SPECTROGRAM)
85 .value("UNKNOWN", DataSeriesType::UNKNOWN)
86 .export_values();
87
88 py::class_<Unit>(m, "Unit")
89 .def_readwrite("name", &Unit::m_Name)
90 .def_readwrite("time_unit", &Unit::m_TimeUnit)
91 .def(py::self == py::self)
92 .def(py::self != py::self)
93 .def("__repr__",__repr__<Unit>);
94
95 py::class_<IDataSeries, std::shared_ptr<IDataSeries>>(m, "IDataSeries")
96 .def("nbPoints", &IDataSeries::nbPoints)
97 .def_property_readonly("xAxisUnit", &IDataSeries::xAxisUnit)
98 .def_property_readonly("yAxisUnit", &IDataSeries::yAxisUnit)
99 .def_property_readonly("valuesUnit", &IDataSeries::valuesUnit)
100 .def("__repr__",__repr__<IDataSeries>);
101
102
103
104 py::class_<ScalarSeries, std::shared_ptr<ScalarSeries>, IDataSeries>(m, "ScalarSeries")
105 .def("nbPoints", &ScalarSeries::nbPoints);
106
107 py::class_<QString>(m, "QString")
108 .def(py::init([](const std::string& value){return QString::fromStdString(value);}))
109 .def("__repr__", &QString::toStdString);
110
111 py::class_<VariableController>(m, "VariableController");
112
113 py::class_<AmdaProvider>(m, "AmdaProvider");
114
115 py::class_<AmdaResultParser>(m, "AmdaResultParser")
116 .def_static("readTxt", AmdaResultParser::readTxt)
117 .def("readScalarTxt", [](const QString& path){
118 return std::dynamic_pointer_cast<ScalarSeries>(AmdaResultParser::readTxt(path, DataSeriesType::SCALAR));
119 }, py::return_value_policy::copy);
120
121 py::class_<Variable>(m, "Variable")
122 .def(py::init<const QString&>())
123 .def_property("name", &Variable::name, &Variable::setName)
124 .def_property("range", &Variable::range, &Variable::setRange)
125 .def_property("cacheRange", &Variable::cacheRange, &Variable::setCacheRange);
126
127 py::implicitly_convertible<std::string, QString>();
128
129 py::class_<TimeController>(m,"TimeController");
130
131 py::class_<SqpRange>(m,"SqpRange")
132 .def("fromDateTime", &SqpRange::fromDateTime, py::return_value_policy::move)
133 .def(py::init([](double start, double stop){return SqpRange{start, stop};}))
134 .def("__repr__", [](const SqpRange& range){
135 QString repr = QString("SqpRange:\n Start date: %1\n Stop date: %2")
136 .arg(DateUtils::dateTime(range.m_TStart).toString())
137 .arg(DateUtils::dateTime(range.m_TEnd).toString());
138 return repr.toStdString();
139 });
140
141 py::class_<QUuid>(m,"QUuid");
142
143 py::class_<QDate>(m,"QDate")
144 .def(py::init<int,int,int>());
145
146 py::class_<QTime>(m,"QTime")
147 .def(py::init<int,int,int>());
148
149 }
150
151
152 int pytestamda_test(int argc, char** argv, const char* testScriptPath )
153 {
154 SqpApplication::setOrganizationName("LPP");
155 SqpApplication::setOrganizationDomain("lpp.fr");
156 SqpApplication::setApplicationName("SciQLop");
157 SqpApplication app(argc, argv);
158 py::scoped_interpreter guard{};
159
160 py::globals()["__file__"] = py::str(testScriptPath);
161 py::eval_file(testScriptPath);
162 return 0;
163 }
164
@@ -0,0 +1,33
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the SciQLOP Software
3 -- Copyright (C) 2018, Plasma Physics Laboratory - CNRS
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 2 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------*/
19 /*-- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
21 ----------------------------------------------------------------------------*/
22 #include <QString>
23 extern int pytestamda_test(int argc, char** argv, const char* testScriptPath );
24
25 int main(int argc, char** argv)
26 {
27 pytestamda_test(argc, argv, PYTESTAMDA_SCRIPT);
28 return 0;
29 }
30
31
32
33
@@ -0,0 +1,5
1 import pytestamda
2 import os
3 current_script_path = os.path.dirname(os.path.realpath(__file__))
4 path = current_script_path+'/../tests-resources/TestAmdaResultParser/ValidScalar1.txt'
5 c = pytestamda.AmdaResultParser.readScalarTxt(path)
@@ -4,3 +4,6
4 [submodule "external/libcatalogs"]
4 [submodule "external/libcatalogs"]
5 path = external/libcatalogs
5 path = external/libcatalogs
6 url = https://hephaistos.lpp.polytechnique.fr/rhodecode/HG_REPOSITORIES/LPP/SciQLOP_Repos/libcatalogs
6 url = https://hephaistos.lpp.polytechnique.fr/rhodecode/HG_REPOSITORIES/LPP/SciQLOP_Repos/libcatalogs
7 [submodule "external/pybind11"]
8 path = external/pybind11
9 url = https://github.com/pybind/pybind11
@@ -55,6 +55,13 if (NOT CatalogueAPI_FOUND)
55 add_subdirectory(external/libcatalogs)
55 add_subdirectory(external/libcatalogs)
56 endif()
56 endif()
57
57
58 find_package(pybind11 CONFIG QUIET)
59 if (NOT pybind11_FOUND)
60 execute_process(COMMAND git submodule init external/pybind11 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
61 execute_process(COMMAND git submodule update external/pybind11 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
62 add_subdirectory(external/pybind11)
63 endif()
64
58 add_subdirectory(core)
65 add_subdirectory(core)
59 add_subdirectory(gui)
66 add_subdirectory(gui)
60 add_subdirectory(app)
67 add_subdirectory(app)
@@ -12,7 +12,7 set(AMDA_SERVER_TYPE "hybrid;amdatest;localhost" CACHE STRING
12 "List of possible for AMDA server type")
12 "List of possible for AMDA server type")
13
13
14 set_property(CACHE AMDA_server_type PROPERTY STRINGS ${AMDA_SERVER_TYPE})
14 set_property(CACHE AMDA_server_type PROPERTY STRINGS ${AMDA_SERVER_TYPE})
15 add_definitions(-DSCIQLOP_AMDA_SERVER="{AMDA_server_type}")
15 add_definitions(-DSCIQLOP_AMDA_SERVER="${AMDA_server_type}")
16
16
17 add_definitions(-DQT_PLUGIN)
17 add_definitions(-DQT_PLUGIN)
18 add_definitions(-DSCIQLOP_PLUGIN_JSON_FILE_PATH="${CMAKE_CURRENT_SOURCE_DIR}/resources/amda.json")
18 add_definitions(-DSCIQLOP_PLUGIN_JSON_FILE_PATH="${CMAKE_CURRENT_SOURCE_DIR}/resources/amda.json")
@@ -38,3 +38,25 declare_test(TestAmdaParser TestAmdaParser tests/TestAmdaParser.cpp "amdaplugin;
38 declare_test(TestAmdaResultParser TestAmdaResultParser tests/TestAmdaResultParser.cpp "amdaplugin;Qt5::Test")
38 declare_test(TestAmdaResultParser TestAmdaResultParser tests/TestAmdaResultParser.cpp "amdaplugin;Qt5::Test")
39 declare_test(TestAmdaAcquisition TestAmdaAcquisition tests/TestAmdaAcquisition.cpp "amdaplugin;Qt5::Test")
39 declare_test(TestAmdaAcquisition TestAmdaAcquisition tests/TestAmdaAcquisition.cpp "amdaplugin;Qt5::Test")
40 declare_test(TestAmdaFuzzing TestAmdaFuzzing "tests/TestAmdaFuzzing.cpp;tests/FuzzingValidators.cpp;tests/FuzzingUtils.cpp;tests/FuzzingOperations.cpp;tests/FuzzingDefs.cpp" "amdaplugin;Qt5::Test")
40 declare_test(TestAmdaFuzzing TestAmdaFuzzing "tests/TestAmdaFuzzing.cpp;tests/FuzzingValidators.cpp;tests/FuzzingUtils.cpp;tests/FuzzingOperations.cpp;tests/FuzzingDefs.cpp" "amdaplugin;Qt5::Test")
41
42 pybind11_add_module(pytestamda tests/PyTestAmdaWrapper.cpp)
43 target_link_libraries(pytestamda PUBLIC amdaplugin)
44
45 #pybind11_add_module(pytestamdalib SHARED tests/PyTestAmdaWrapper.cpp)
46 add_library(pytestamdalib tests/PyTestAmdaWrapper.cpp)
47 target_link_libraries(pytestamdalib PUBLIC pybind11::module)
48 target_link_libraries(pytestamdalib PUBLIC pybind11::embed)
49 target_link_libraries(pytestamdalib PUBLIC amdaplugin)
50
51 declare_test(TestPytestamda TestPytestamda "tests/PyTestAmdaWrapperExe.cpp" "amdaplugin;pytestamdalib")
52 target_compile_definitions(TestPytestamda PRIVATE -DPYTESTAMDA_SCRIPT="${CMAKE_CURRENT_LIST_DIR}/tests/pyamdatests.py")
53
54 find_package(PythonInterp 3 REQUIRED)
55
56 add_test(NAME pyamdatests
57 COMMAND ${PYTHON_EXECUTABLE}
58 ${CMAKE_CURRENT_LIST_DIR}/tests/pyamdatests.py
59 pyamdatests)
60
61 set_tests_properties(pyamdatests PROPERTIES ENVIRONMENT PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR})
62
General Comments 0
You need to be logged in to leave comments. Login now