summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-01-23 15:59:01 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-01-23 15:59:01 -0400
commitfc8dd144673675d959a3a8c7c2049f6bf12dd814 (patch)
treef07b2b76e68e89cf3e526b9ad1200b3802bf395c /python
parent7aa42aa8b3947a43e128d1fe9123aef9c9c1b844 (diff)
downloadfork-ledger-fc8dd144673675d959a3a8c7c2049f6bf12dd814.tar.gz
fork-ledger-fc8dd144673675d959a3a8c7c2049f6bf12dd814.tar.bz2
fork-ledger-fc8dd144673675d959a3a8c7c2049f6bf12dd814.zip
Create a py_value module, for translating value_t objects to/from Python.
Diffstat (limited to 'python')
-rw-r--r--python/py_value.cc83
-rw-r--r--python/pyinterp.cc24
2 files changed, 92 insertions, 15 deletions
diff --git a/python/py_value.cc b/python/py_value.cc
new file mode 100644
index 00000000..419d635d
--- /dev/null
+++ b/python/py_value.cc
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2003-2009, John Wiegley. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of New Artisans LLC nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "pyinterp.h"
+#include "pyutils.h"
+#include "value.h"
+
+#include <boost/python/exception_translator.hpp>
+#include <boost/python/implicit.hpp>
+#include <boost/python/args.hpp>
+
+namespace ledger {
+
+using namespace boost::python;
+
+#define EXC_TRANSLATOR(type) \
+ void exc_translate_ ## type(const type& err) { \
+ PyErr_SetString(PyExc_ArithmeticError, err.what()); \
+ }
+
+EXC_TRANSLATOR(value_error)
+
+void export_value()
+{
+#if 0
+ if (PyBool_Check(func.ptr()))
+ return extract<bool>(func)();
+ else if (PyInt_Check(func.ptr()))
+ return long(extract<int>(func)());
+ else if (PyString_Check(func.ptr()))
+ return string_value(extract<string>(func)());
+
+ extract<date_t> d(func);
+ if (d.check())
+ return value_t(d());
+ extract<datetime_t> dt(func);
+ if (dt.check())
+ return value_t(dt());
+#endif
+
+ register_optional_to_python<value_t>();
+
+#ifdef HAVE_GDTOA
+ implicitly_convertible<double, value_t>();
+#endif
+ implicitly_convertible<long, value_t>();
+ implicitly_convertible<string, value_t>();
+
+#define EXC_TRANSLATE(type) \
+ register_exception_translator<type>(&exc_translate_ ## type);
+
+ EXC_TRANSLATE(value_error);
+}
+
+} // namespace ledger
diff --git a/python/pyinterp.cc b/python/pyinterp.cc
index 582b8e78..6af17170 100644
--- a/python/pyinterp.cc
+++ b/python/pyinterp.cc
@@ -43,7 +43,9 @@ void export_amount();
void export_commodity();
#if 0
void export_balance();
+#endif
void export_value();
+#if 0
void export_journal();
void export_parser();
void export_option();
@@ -61,7 +63,9 @@ void initialize_for_python()
export_commodity();
#if 0
export_balance();
+#endif
export_value();
+#if 0
export_journal();
export_parser();
export_option();
@@ -223,21 +227,11 @@ value_t python_interpreter_t::functor_t::operator()(call_scope_t& args)
{
try {
if (! PyCallable_Check(func.ptr())) {
- if (PyBool_Check(func.ptr()))
- return extract<bool>(func)();
- else if (PyInt_Check(func.ptr()))
- return long(extract<int>(func)());
- else if (PyString_Check(func.ptr()))
- return string_value(extract<string>(func)());
-
- extract<date_t> d(func);
- if (d.check())
- return value_t(d());
- extract<datetime_t> dt(func);
- if (dt.check())
- return value_t(dt());
-
- return extract<value_t>(func);
+ extract<value_t> val(func);
+ if (val.check())
+ return val();
+ throw_(calc_error,
+ "Could not evaluate Python variable '" << name << "'");
} else {
if (args.size() > 0) {
list arglist;