8#include "MantidJson/Json.h"
15#include <boost/python/dict.hpp>
16#include <boost/python/errors.hpp>
17#include <boost/python/extract.hpp>
18#include <boost/python/import.hpp>
19#include <boost/python/list.hpp>
25std::set<std::string>
const jsonAllowedTypes{
"int",
"float",
"str",
"NoneType",
"bool"};
27inline bool isJsonAtomic(bp::object
const &
obj) {
28 std::string
const objname = bp::extract<std::string>(
obj.attr(
"__class__").attr(
"__name__"));
29 return jsonAllowedTypes.count(objname) > 0;
40bp::object recursiveDictDump(bp::object
const &
obj,
unsigned char depth = 0) {
41 static unsigned char constexpr max_depth(10);
44 if (depth >= max_depth) {
48 else if (isJsonAtomic(
obj)) {
52 else if (PyList_Check(
obj.ptr()) || PyTuple_Check(
obj.ptr())) {
54 for (bp::ssize_t i = 0; i < bp::len(
obj); i++) {
55 ls.append(recursiveDictDump(
obj[i], depth + 1));
60 else if (PyDict_Check(
obj.ptr())) {
62 bp::list keyvals = bp::extract<bp::dict>(
obj)().items();
63 for (bp::ssize_t i = 0; i < bp::len(keyvals); i++) {
64 bp::object key = keyvals[i][0];
65 bp::object val = keyvals[i][1];
66 d[key] = recursiveDictDump(val, depth + 1);
71 else if (PyObject_HasAttrString(
obj.ptr(),
"__dict__")) {
72 bp::dict
d = bp::extract<bp::dict>(
obj.attr(
"__dict__"));
73 ret = recursiveDictDump(d, depth);
90 boost::python::object rep;
93 rep = boost::python::str(
"");
96 else if (boost::python::extract<std::string>(
obj).check()) {
102 boost::python::object json = boost::python::import(
"json");
104 rep = json.attr(
"dumps")(
obj);
107 catch (boost::python::error_already_set
const &) {
109 boost::python::object dict = recursiveDictDump(
obj);
111 rep = json.attr(
"dumps")(dict);
112 }
catch (boost::python::error_already_set
const &) {
114 rep = boost::python::str(
"<unrepresentable object>");
118 return boost::python::extract<std::string>(rep);
136#if defined(__APPLE__) || (defined(__linux__) && defined(__clang__))
152using Kernel::PropertyWithValue;
153using Kernel::Exception::NotImplementedError;
168 }
catch (std::invalid_argument
const &except) {
178std::string PythonObjectProperty::setValue(std::string
const &
value) {
182 boost::python::object newVal;
185 boost::python::object json = boost::python::import(
"json");
186 newVal = json.attr(
"loads")(
value);
189 catch (boost::python::error_already_set
const &) {
192 newVal = boost::python::str(
value.c_str());
193 }
catch (boost::python::error_already_set
const &) {
195 return "Failed to interpret string as JSON or string property: " +
value;
202 }
catch (std::invalid_argument
const &except) {
214std::string PythonObjectProperty::setValueFromJson(
const Json::Value &json) {
215 std::string jsonstr = JsonHelpers::jsonToString(json);
216 return setValue(jsonstr);
219std::string PythonObjectProperty::setDataItem(
const std::shared_ptr<Kernel::DataItem> &) {
220 throw NotImplementedError(
"PythonObjectProperty::setDataItem(const std::shared_ptr<Kernel::DataItem> &)");
227bool PythonObjectProperty::isDefault()
const {
return m_value.is_none(); }
const std::string & m_value
double value
The value of the point.
double obj
the value of the quadratic function
Marks code as not implemented yet.
The concrete, templated class for properties.
Defines a structure for acquiring/releasing the Python GIL using the RAII pattern.
#define MANTID_PYTHONINTERFACE_CORE_DLL
std::string toString(const T &value)
Convert values to strings.
boost::python::object PythonObject
MANTID_KERNEL_DLL::Json::Value encodeAsJson(const OptionalBool &)
Encode an OptionalBool as a Json::Value.
std::string toPrettyString(const T &value, size_t maxLength=0, bool collapseLists=true)
Convert values to pretty strings.
bool isNone(const PyObject *ptr)