From be73ab97496ebd200fcbf3aee1e082416ebe2282 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Date: Fri, 15 Dec 2017 19:42:25 -0300 Subject: [PATCH] Enable keyword arguments in Python wrappers generated by SIP For example: >>> GC.metrics("Pace", filter="isRun<>0") is equivalent to: >>> GC.metrics("Pace", False, "isRun<>0") as expected by Python users --- src/Python/SIP/goldencheetah.sip | 2 +- src/Python/SIP/sipAPIgoldencheetah.h | 40 ++++++---- src/Python/SIP/sipgoldencheetahBindings.cpp | 88 ++++++++++++++------- src/Python/SIP/sipgoldencheetahcmodule.cpp | 6 ++ 4 files changed, 93 insertions(+), 43 deletions(-) diff --git a/src/Python/SIP/goldencheetah.sip b/src/Python/SIP/goldencheetah.sip index fa3bdcb24..a5ab7e6f9 100644 --- a/src/Python/SIP/goldencheetah.sip +++ b/src/Python/SIP/goldencheetah.sip @@ -16,7 +16,7 @@ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -%Module goldencheetah +%Module(name=goldencheetah, keyword_arguments="All") // diff --git a/src/Python/SIP/sipAPIgoldencheetah.h b/src/Python/SIP/sipAPIgoldencheetah.h index 6b77a221c..dbc241e80 100644 --- a/src/Python/SIP/sipAPIgoldencheetah.h +++ b/src/Python/SIP/sipAPIgoldencheetah.h @@ -37,20 +37,32 @@ #define sipName_webpage &sipStrings_goldencheetah[127] #define sipNameNr_metrics 135 #define sipName_metrics &sipStrings_goldencheetah[135] -#define sipNameNr_version 143 -#define sipName_version &sipStrings_goldencheetah[143] -#define sipNameNr_athlete 151 -#define sipName_athlete &sipStrings_goldencheetah[151] -#define sipNameNr___len__ 159 -#define sipName___len__ &sipStrings_goldencheetah[159] -#define sipNameNr___str__ 167 -#define sipName___str__ &sipStrings_goldencheetah[167] -#define sipNameNr_QString 175 -#define sipName_QString &sipStrings_goldencheetah[175] -#define sipNameNr_series 183 -#define sipName_series &sipStrings_goldencheetah[183] -#define sipNameNr_build 190 -#define sipName_build &sipStrings_goldencheetah[190] +#define sipNameNr_compare 143 +#define sipName_compare &sipStrings_goldencheetah[143] +#define sipNameNr_version 151 +#define sipName_version &sipStrings_goldencheetah[151] +#define sipNameNr_athlete 159 +#define sipName_athlete &sipStrings_goldencheetah[159] +#define sipNameNr___len__ 167 +#define sipName___len__ &sipStrings_goldencheetah[167] +#define sipNameNr___str__ 175 +#define sipName___str__ &sipStrings_goldencheetah[175] +#define sipNameNr_QString 183 +#define sipName_QString &sipStrings_goldencheetah[183] +#define sipNameNr_metric 191 +#define sipName_metric &sipStrings_goldencheetah[191] +#define sipNameNr_filter 198 +#define sipName_filter &sipStrings_goldencheetah[198] +#define sipNameNr_series 205 +#define sipName_series &sipStrings_goldencheetah[205] +#define sipNameNr_build 212 +#define sipName_build &sipStrings_goldencheetah[212] +#define sipNameNr_type 218 +#define sipName_type &sipStrings_goldencheetah[218] +#define sipNameNr_url 223 +#define sipName_url &sipStrings_goldencheetah[223] +#define sipNameNr_all 227 +#define sipName_all &sipStrings_goldencheetah[227] #define sipMalloc sipAPI_goldencheetah->api_malloc #define sipFree sipAPI_goldencheetah->api_free diff --git a/src/Python/SIP/sipgoldencheetahBindings.cpp b/src/Python/SIP/sipgoldencheetahBindings.cpp index 5cc6b0a6b..aad704025 100644 --- a/src/Python/SIP/sipgoldencheetahBindings.cpp +++ b/src/Python/SIP/sipgoldencheetahBindings.cpp @@ -118,8 +118,8 @@ static PyObject *meth_Bindings_version(PyObject *sipSelf, PyObject *sipArgs) } -extern "C" {static PyObject *meth_Bindings_seriesPresent(PyObject *, PyObject *);} -static PyObject *meth_Bindings_seriesPresent(PyObject *sipSelf, PyObject *sipArgs) +extern "C" {static PyObject *meth_Bindings_seriesPresent(PyObject *, PyObject *, PyObject *);} +static PyObject *meth_Bindings_seriesPresent(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; @@ -127,7 +127,11 @@ static PyObject *meth_Bindings_seriesPresent(PyObject *sipSelf, PyObject *sipArg int a0 = 10; const ::Bindings *sipCpp; - if (sipParseArgs(&sipParseErr, sipArgs, "B|i", &sipSelf, sipType_Bindings, &sipCpp, &a0)) + static const char *sipKwdList[] = { + sipName_type, + }; + + if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|i", &sipSelf, sipType_Bindings, &sipCpp, &a0)) { bool sipRes; @@ -144,8 +148,8 @@ static PyObject *meth_Bindings_seriesPresent(PyObject *sipSelf, PyObject *sipArg } -extern "C" {static PyObject *meth_Bindings_seriesName(PyObject *, PyObject *);} -static PyObject *meth_Bindings_seriesName(PyObject *sipSelf, PyObject *sipArgs) +extern "C" {static PyObject *meth_Bindings_seriesName(PyObject *, PyObject *, PyObject *);} +static PyObject *meth_Bindings_seriesName(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; @@ -153,7 +157,11 @@ static PyObject *meth_Bindings_seriesName(PyObject *sipSelf, PyObject *sipArgs) int a0 = 10; const ::Bindings *sipCpp; - if (sipParseArgs(&sipParseErr, sipArgs, "B|i", &sipSelf, sipType_Bindings, &sipCpp, &a0)) + static const char *sipKwdList[] = { + sipName_type, + }; + + if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|i", &sipSelf, sipType_Bindings, &sipCpp, &a0)) { ::QString*sipRes; @@ -195,8 +203,8 @@ static PyObject *meth_Bindings_seriesLast(PyObject *sipSelf, PyObject *sipArgs) } -extern "C" {static PyObject *meth_Bindings_series(PyObject *, PyObject *);} -static PyObject *meth_Bindings_series(PyObject *sipSelf, PyObject *sipArgs) +extern "C" {static PyObject *meth_Bindings_series(PyObject *, PyObject *, PyObject *);} +static PyObject *meth_Bindings_series(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; @@ -204,7 +212,11 @@ static PyObject *meth_Bindings_series(PyObject *sipSelf, PyObject *sipArgs) int a0 = 10; ::Bindings *sipCpp; - if (sipParseArgs(&sipParseErr, sipArgs, "B|i", &sipSelf, sipType_Bindings, &sipCpp, &a0)) + static const char *sipKwdList[] = { + sipName_type, + }; + + if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|i", &sipSelf, sipType_Bindings, &sipCpp, &a0)) { ::PythonDataSeries*sipRes; @@ -221,8 +233,8 @@ static PyObject *meth_Bindings_series(PyObject *sipSelf, PyObject *sipArgs) } -extern "C" {static PyObject *meth_Bindings_activityMetrics(PyObject *, PyObject *);} -static PyObject *meth_Bindings_activityMetrics(PyObject *sipSelf, PyObject *sipArgs) +extern "C" {static PyObject *meth_Bindings_activityMetrics(PyObject *, PyObject *, PyObject *);} +static PyObject *meth_Bindings_activityMetrics(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; @@ -230,7 +242,11 @@ static PyObject *meth_Bindings_activityMetrics(PyObject *sipSelf, PyObject *sipA bool a0 = 0; ::Bindings *sipCpp; - if (sipParseArgs(&sipParseErr, sipArgs, "B|b", &sipSelf, sipType_Bindings, &sipCpp, &a0)) + static const char *sipKwdList[] = { + sipName_compare, + }; + + if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|b", &sipSelf, sipType_Bindings, &sipCpp, &a0)) { PyObject * sipRes; @@ -247,8 +263,8 @@ static PyObject *meth_Bindings_activityMetrics(PyObject *sipSelf, PyObject *sipA } -extern "C" {static PyObject *meth_Bindings_seasonMetrics(PyObject *, PyObject *);} -static PyObject *meth_Bindings_seasonMetrics(PyObject *sipSelf, PyObject *sipArgs) +extern "C" {static PyObject *meth_Bindings_seasonMetrics(PyObject *, PyObject *, PyObject *);} +static PyObject *meth_Bindings_seasonMetrics(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; @@ -260,7 +276,13 @@ static PyObject *meth_Bindings_seasonMetrics(PyObject *sipSelf, PyObject *sipArg bool a2 = 0; ::Bindings *sipCpp; - if (sipParseArgs(&sipParseErr, sipArgs, "B|bJ1b", &sipSelf, sipType_Bindings, &sipCpp, &a0, sipType_QString,&a1, &a1State, &a2)) + static const char *sipKwdList[] = { + sipName_all, + sipName_filter, + sipName_compare, + }; + + if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|bJ1b", &sipSelf, sipType_Bindings, &sipCpp, &a0, sipType_QString,&a1, &a1State, &a2)) { PyObject * sipRes; @@ -278,8 +300,8 @@ static PyObject *meth_Bindings_seasonMetrics(PyObject *sipSelf, PyObject *sipArg } -extern "C" {static PyObject *meth_Bindings_metrics(PyObject *, PyObject *);} -static PyObject *meth_Bindings_metrics(PyObject *sipSelf, PyObject *sipArgs) +extern "C" {static PyObject *meth_Bindings_metrics(PyObject *, PyObject *, PyObject *);} +static PyObject *meth_Bindings_metrics(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; @@ -292,7 +314,13 @@ static PyObject *meth_Bindings_metrics(PyObject *sipSelf, PyObject *sipArgs) int a2State = 0; ::Bindings *sipCpp; - if (sipParseArgs(&sipParseErr, sipArgs, "BJ1|bJ1", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, &a1, sipType_QString,&a2, &a2State)) + static const char *sipKwdList[] = { + sipName_metric, + sipName_all, + sipName_filter, + }; + + if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "BJ1|bJ1", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, &a1, sipType_QString,&a2, &a2State)) { ::PythonDataSeries*sipRes; @@ -311,8 +339,8 @@ static PyObject *meth_Bindings_metrics(PyObject *sipSelf, PyObject *sipArgs) } -extern "C" {static PyObject *meth_Bindings_webpage(PyObject *, PyObject *);} -static PyObject *meth_Bindings_webpage(PyObject *sipSelf, PyObject *sipArgs) +extern "C" {static PyObject *meth_Bindings_webpage(PyObject *, PyObject *, PyObject *);} +static PyObject *meth_Bindings_webpage(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; @@ -321,7 +349,11 @@ static PyObject *meth_Bindings_webpage(PyObject *sipSelf, PyObject *sipArgs) int a0State = 0; const ::Bindings *sipCpp; - if (sipParseArgs(&sipParseErr, sipArgs, "BJ1", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State)) + static const char *sipKwdList[] = { + sipName_url, + }; + + if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "BJ1", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State)) { int sipRes; @@ -408,18 +440,18 @@ static void *init_type_Bindings(sipSimpleWrapper *, PyObject *sipArgs, PyObject static PyMethodDef methods_Bindings[] = { - {SIP_MLNAME_CAST(sipName_activityMetrics), meth_Bindings_activityMetrics, METH_VARARGS, NULL}, + {SIP_MLNAME_CAST(sipName_activityMetrics), (PyCFunction)meth_Bindings_activityMetrics, METH_VARARGS|METH_KEYWORDS, NULL}, {SIP_MLNAME_CAST(sipName_athlete), meth_Bindings_athlete, METH_VARARGS, NULL}, {SIP_MLNAME_CAST(sipName_build), meth_Bindings_build, METH_VARARGS, NULL}, - {SIP_MLNAME_CAST(sipName_metrics), meth_Bindings_metrics, METH_VARARGS, NULL}, - {SIP_MLNAME_CAST(sipName_seasonMetrics), meth_Bindings_seasonMetrics, METH_VARARGS, NULL}, - {SIP_MLNAME_CAST(sipName_series), meth_Bindings_series, METH_VARARGS, NULL}, + {SIP_MLNAME_CAST(sipName_metrics), (PyCFunction)meth_Bindings_metrics, METH_VARARGS|METH_KEYWORDS, NULL}, + {SIP_MLNAME_CAST(sipName_seasonMetrics), (PyCFunction)meth_Bindings_seasonMetrics, METH_VARARGS|METH_KEYWORDS, NULL}, + {SIP_MLNAME_CAST(sipName_series), (PyCFunction)meth_Bindings_series, METH_VARARGS|METH_KEYWORDS, NULL}, {SIP_MLNAME_CAST(sipName_seriesLast), meth_Bindings_seriesLast, METH_VARARGS, NULL}, - {SIP_MLNAME_CAST(sipName_seriesName), meth_Bindings_seriesName, METH_VARARGS, NULL}, - {SIP_MLNAME_CAST(sipName_seriesPresent), meth_Bindings_seriesPresent, METH_VARARGS, NULL}, + {SIP_MLNAME_CAST(sipName_seriesName), (PyCFunction)meth_Bindings_seriesName, METH_VARARGS|METH_KEYWORDS, NULL}, + {SIP_MLNAME_CAST(sipName_seriesPresent), (PyCFunction)meth_Bindings_seriesPresent, METH_VARARGS|METH_KEYWORDS, NULL}, {SIP_MLNAME_CAST(sipName_threadid), meth_Bindings_threadid, METH_VARARGS, NULL}, {SIP_MLNAME_CAST(sipName_version), meth_Bindings_version, METH_VARARGS, NULL}, - {SIP_MLNAME_CAST(sipName_webpage), meth_Bindings_webpage, METH_VARARGS, NULL} + {SIP_MLNAME_CAST(sipName_webpage), (PyCFunction)meth_Bindings_webpage, METH_VARARGS|METH_KEYWORDS, NULL} }; diff --git a/src/Python/SIP/sipgoldencheetahcmodule.cpp b/src/Python/SIP/sipgoldencheetahcmodule.cpp index 48107740b..c613e745f 100644 --- a/src/Python/SIP/sipgoldencheetahcmodule.cpp +++ b/src/Python/SIP/sipgoldencheetahcmodule.cpp @@ -27,13 +27,19 @@ const char sipStrings_goldencheetah[] = { 'B', 'i', 'n', 'd', 'i', 'n', 'g', 's', 0, 'w', 'e', 'b', 'p', 'a', 'g', 'e', 0, 'm', 'e', 't', 'r', 'i', 'c', 's', 0, + 'c', 'o', 'm', 'p', 'a', 'r', 'e', 0, 'v', 'e', 'r', 's', 'i', 'o', 'n', 0, 'a', 't', 'h', 'l', 'e', 't', 'e', 0, '_', '_', 'l', 'e', 'n', '_', '_', 0, '_', '_', 's', 't', 'r', '_', '_', 0, 'Q', 'S', 't', 'r', 'i', 'n', 'g', 0, + 'm', 'e', 't', 'r', 'i', 'c', 0, + 'f', 'i', 'l', 't', 'e', 'r', 0, 's', 'e', 'r', 'i', 'e', 's', 0, 'b', 'u', 'i', 'l', 'd', 0, + 't', 'y', 'p', 'e', 0, + 'u', 'r', 'l', 0, + 'a', 'l', 'l', 0, };