Skip to content

Commit 3b852be

Browse files
Added a __members__ attribute to exiv2 struct data
1 parent 66b7311 commit 3b852be

File tree

12 files changed

+886
-425
lines changed

12 files changed

+886
-425
lines changed

src/interface/shared/struct_dict.i

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ static PyObject* items_struct(struct_info& info, PyObject* obj) {
124124
// Type slots
125125
%feature("python:slot", "tp_iter", functype="getiterfunc")
126126
struct_type::__iter__;
127+
// These functions don't throw exceptions
128+
%noexception struct_type::__members__;
129+
%noexception struct_type::__iter__;
130+
%noexception struct_type::keys;
131+
%noexception struct_type::values;
132+
%noexception struct_type::items;
127133
// Typemaps for slot functions
128134
%typemap(default) PyObject* value {$1 = NULL;}
129135
// Document functions
@@ -138,15 +144,37 @@ static PyObject* items_struct(struct_info& info, PyObject* obj) {
138144
%feature("docstring") struct_type::values "Get structure member values.
139145
:rtype: tuple of value
140146
:return: structure member values."
147+
%feature("docstring") struct_type::__members__ "Structure member names.
148+
149+
:type: tuple of str
150+
151+
List of names used to access members as attributes (``object.name``) or
152+
with dict-like indexing (``object['name']``). Attribute access is
153+
preferred as it is more efficient."
154+
#if #strip_underscore == "true"
155+
"
156+
157+
Although the actual structure member names end with underscores, the
158+
Python interface uses names without underscores, as listed in
159+
``__members__``."
160+
#endif
161+
// Getter function for __members__
162+
%fragment("members_get"{struct_type}, "header",
163+
fragment="struct_info"{struct_type}, fragment="keys_struct") {
164+
static PyObject* %mangle(struct_type)___members___get(struct_type*) {
165+
init_info_%mangle(struct_type)();
166+
return keys_struct(info_%mangle(struct_type));
167+
};
168+
}
141169
// Add functions
142170
%extend struct_type {
143171
%fragment("struct_info"{struct_type});
144-
%fragment("keys_struct");
172+
%fragment("members_get"{struct_type});
145173
%fragment("values_struct");
146174
%fragment("items_struct");
147-
static PyObject* keys() {
148-
init_info_%mangle(struct_type)();
149-
return keys_struct(info_%mangle(struct_type));
175+
PyObject* __members__ const;
176+
PyObject* keys() {
177+
return %mangle(struct_type)___members___get(self);
150178
}
151179
PyObject* values(PyObject* py_self) {
152180
init_info_%mangle(struct_type)();

src/swig-0_27_7/datasets_wrap.cxx

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4423,6 +4423,12 @@ static PyObject* keys_struct(struct_info& info) {
44234423
};
44244424

44254425

4426+
static PyObject* Exiv2_DataSet___members___get(Exiv2::DataSet*) {
4427+
init_info_Exiv2_DataSet();
4428+
return keys_struct(info_Exiv2_DataSet);
4429+
};
4430+
4431+
44264432
static PyObject* values_struct(struct_info& info, PyObject* obj) {
44274433
PyObject* result = PyTuple_New(info.members.size());
44284434
for (size_t i = 0; i < info.members.size(); i++)
@@ -4473,9 +4479,8 @@ SWIGINTERNINLINE PyObject*
44734479
return PyInt_FromSize_t((size_t) value);
44744480
}
44754481

4476-
SWIGINTERN PyObject *Exiv2_DataSet_keys(){
4477-
init_info_Exiv2_DataSet();
4478-
return keys_struct(info_Exiv2_DataSet);
4482+
SWIGINTERN PyObject *Exiv2_DataSet_keys(Exiv2::DataSet *self){
4483+
return Exiv2_DataSet___members___get(self);
44794484
}
44804485
SWIGINTERN PyObject *Exiv2_DataSet_values(Exiv2::DataSet *self,PyObject *py_self){
44814486
init_info_Exiv2_DataSet();
@@ -5029,12 +5034,41 @@ SWIGINTERN PyObject *_wrap_DataSet_photoshop__get(PyObject *self, PyObject *args
50295034
}
50305035

50315036

5037+
SWIGINTERN PyObject *_wrap_DataSet___members___get(PyObject *self, PyObject *args) {
5038+
PyObject *resultobj = 0;
5039+
Exiv2::DataSet *arg1 = (Exiv2::DataSet *) 0 ;
5040+
void *argp1 = 0 ;
5041+
int res1 = 0 ;
5042+
PyObject *result = 0 ;
5043+
5044+
if (!SWIG_Python_UnpackTuple(args, "DataSet___members___get", 0, 0, 0)) SWIG_fail;
5045+
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Exiv2__DataSet, 0 | 0 );
5046+
if (!SWIG_IsOK(res1)) {
5047+
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DataSet___members___get" "', argument " "1"" of type '" "Exiv2::DataSet *""'");
5048+
}
5049+
arg1 = reinterpret_cast< Exiv2::DataSet * >(argp1);
5050+
result = (PyObject *)Exiv2_DataSet___members___get(arg1);
5051+
resultobj = result;
5052+
return resultobj;
5053+
fail:
5054+
return NULL;
5055+
}
5056+
5057+
50325058
SWIGINTERN PyObject *_wrap_DataSet_keys(PyObject *self, PyObject *args) {
50335059
PyObject *resultobj = 0;
5060+
Exiv2::DataSet *arg1 = (Exiv2::DataSet *) 0 ;
5061+
void *argp1 = 0 ;
5062+
int res1 = 0 ;
50345063
PyObject *result = 0 ;
50355064

50365065
if (!SWIG_Python_UnpackTuple(args, "DataSet_keys", 0, 0, 0)) SWIG_fail;
5037-
result = (PyObject *)Exiv2_DataSet_keys();
5066+
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Exiv2__DataSet, 0 | 0 );
5067+
if (!SWIG_IsOK(res1)) {
5068+
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DataSet_keys" "', argument " "1"" of type '" "Exiv2::DataSet *""'");
5069+
}
5070+
arg1 = reinterpret_cast< Exiv2::DataSet * >(argp1);
5071+
result = (PyObject *)Exiv2_DataSet_keys(arg1);
50385072
resultobj = result;
50395073
return resultobj;
50405074
fail:
@@ -5810,6 +5844,7 @@ static SwigPyGetSet DataSet_title__getset = { _wrap_DataSet_title__get, 0 };
58105844
static SwigPyGetSet DataSet_photoshop__getset = { _wrap_DataSet_photoshop__get, 0 };
58115845
static SwigPyGetSet DataSet_desc__getset = { _wrap_DataSet_desc__get, 0 };
58125846
static SwigPyGetSet DataSet_repeatable__getset = { _wrap_DataSet_repeatable__get, 0 };
5847+
static SwigPyGetSet DataSet___members___getset = { _wrap_DataSet___members___get, 0 };
58135848
static SwigPyGetSet DataSet_number__getset = { _wrap_DataSet_number__get, 0 };
58145849
static SwigPyGetSet DataSet_maxbytes__getset = { _wrap_DataSet_maxbytes__get, 0 };
58155850
static SwigPyGetSet DataSet___dict___getset = { SwigPyObject_get___dict__, 0 };
@@ -5823,6 +5858,19 @@ SWIGINTERN PyGetSetDef SwigPyBuiltin__Exiv2__DataSet_getset[] = {
58235858
{ (char *)"photoshop_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Photoshop string", &DataSet_photoshop__getset },
58245859
{ (char *)"desc_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Dataset description", &DataSet_desc__getset },
58255860
{ (char *)"repeatable_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"True if dataset is repeatable", &DataSet_repeatable__getset },
5861+
{ (char *)"__members__", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"\n"
5862+
"Structure member names.\n"
5863+
"\n"
5864+
":type: tuple of str\n"
5865+
"\n"
5866+
"List of names used to access members as attributes (``object.name``) or\n"
5867+
"with dict-like indexing (``object['name']``). Attribute access is\n"
5868+
"preferred as it is more efficient.\n"
5869+
"\n"
5870+
"Although the actual structure member names end with underscores, the\n"
5871+
"Python interface uses names without underscores, as listed in\n"
5872+
"``__members__``.\n"
5873+
"", &DataSet___members___getset },
58265874
{ (char *)"number_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Dataset number", &DataSet_number__getset },
58275875
{ (char *)"maxbytes_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Maximum number of bytes", &DataSet_maxbytes__getset },
58285876
{ (char *)"__dict__", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Dataset number", &DataSet___dict___getset },
@@ -5849,7 +5897,7 @@ SwigPyBuiltin__Exiv2__DataSet_richcompare(PyObject *self, PyObject *other, int o
58495897
}
58505898

58515899
SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__DataSet_methods[] = {
5852-
{ "keys", (PyCFunction)(void(*)(void))_wrap_DataSet_keys, METH_STATIC|METH_NOARGS, "\n"
5900+
{ "keys", _wrap_DataSet_keys, METH_NOARGS, "\n"
58535901
"Get structure member names.\n"
58545902
":rtype: tuple of str\n"
58555903
":return: structure member names (with any trailing underscores\n"

src/swig-0_27_7/preview_wrap.cxx

Lines changed: 55 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5502,6 +5502,12 @@ static PyObject* keys_struct(struct_info& info) {
55025502
};
55035503

55045504

5505+
static PyObject* Exiv2_PreviewProperties___members___get(Exiv2::PreviewProperties*) {
5506+
init_info_Exiv2_PreviewProperties();
5507+
return keys_struct(info_Exiv2_PreviewProperties);
5508+
};
5509+
5510+
55055511
static PyObject* values_struct(struct_info& info, PyObject* obj) {
55065512
PyObject* result = PyTuple_New(info.members.size());
55075513
for (size_t i = 0; i < info.members.size(); i++)
@@ -5541,9 +5547,8 @@ SWIGINTERNINLINE PyObject*
55415547
return PyInt_FromLong((long) value);
55425548
}
55435549

5544-
SWIGINTERN PyObject *Exiv2_PreviewProperties_keys(){
5545-
init_info_Exiv2_PreviewProperties();
5546-
return keys_struct(info_Exiv2_PreviewProperties);
5550+
SWIGINTERN PyObject *Exiv2_PreviewProperties_keys(Exiv2::PreviewProperties *self){
5551+
return Exiv2_PreviewProperties___members___get(self);
55475552
}
55485553
SWIGINTERN PyObject *Exiv2_PreviewProperties_values(Exiv2::PreviewProperties *self,PyObject *py_self){
55495554
init_info_Exiv2_PreviewProperties();
@@ -6093,20 +6098,41 @@ SWIGINTERN PyObject *_wrap_PreviewProperties_id__get(PyObject *self, PyObject *a
60936098
}
60946099

60956100

6101+
SWIGINTERN PyObject *_wrap_PreviewProperties___members___get(PyObject *self, PyObject *args) {
6102+
PyObject *resultobj = 0;
6103+
Exiv2::PreviewProperties *arg1 = (Exiv2::PreviewProperties *) 0 ;
6104+
void *argp1 = 0 ;
6105+
int res1 = 0 ;
6106+
PyObject *result = 0 ;
6107+
6108+
if (!SWIG_Python_UnpackTuple(args, "PreviewProperties___members___get", 0, 0, 0)) SWIG_fail;
6109+
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Exiv2__PreviewProperties, 0 | 0 );
6110+
if (!SWIG_IsOK(res1)) {
6111+
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PreviewProperties___members___get" "', argument " "1"" of type '" "Exiv2::PreviewProperties *""'");
6112+
}
6113+
arg1 = reinterpret_cast< Exiv2::PreviewProperties * >(argp1);
6114+
result = (PyObject *)Exiv2_PreviewProperties___members___get(arg1);
6115+
resultobj = result;
6116+
return resultobj;
6117+
fail:
6118+
return NULL;
6119+
}
6120+
6121+
60966122
SWIGINTERN PyObject *_wrap_PreviewProperties_keys(PyObject *self, PyObject *args) {
60976123
PyObject *resultobj = 0;
6124+
Exiv2::PreviewProperties *arg1 = (Exiv2::PreviewProperties *) 0 ;
6125+
void *argp1 = 0 ;
6126+
int res1 = 0 ;
60986127
PyObject *result = 0 ;
60996128

61006129
if (!SWIG_Python_UnpackTuple(args, "PreviewProperties_keys", 0, 0, 0)) SWIG_fail;
6101-
{
6102-
try {
6103-
result = (PyObject *)Exiv2_PreviewProperties_keys();
6104-
}
6105-
catch(std::exception const& e) {
6106-
_set_python_exception();
6107-
SWIG_fail;
6108-
}
6130+
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Exiv2__PreviewProperties, 0 | 0 );
6131+
if (!SWIG_IsOK(res1)) {
6132+
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PreviewProperties_keys" "', argument " "1"" of type '" "Exiv2::PreviewProperties *""'");
61096133
}
6134+
arg1 = reinterpret_cast< Exiv2::PreviewProperties * >(argp1);
6135+
result = (PyObject *)Exiv2_PreviewProperties_keys(arg1);
61106136
resultobj = result;
61116137
return resultobj;
61126138
fail:
@@ -6131,15 +6157,7 @@ SWIGINTERN PyObject *_wrap_PreviewProperties_values(PyObject *self, PyObject *ar
61316157
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PreviewProperties_values" "', argument " "1"" of type '" "Exiv2::PreviewProperties *""'");
61326158
}
61336159
arg1 = reinterpret_cast< Exiv2::PreviewProperties * >(argp1);
6134-
{
6135-
try {
6136-
result = (PyObject *)Exiv2_PreviewProperties_values(arg1,arg2);
6137-
}
6138-
catch(std::exception const& e) {
6139-
_set_python_exception();
6140-
SWIG_fail;
6141-
}
6142-
}
6160+
result = (PyObject *)Exiv2_PreviewProperties_values(arg1,arg2);
61436161
resultobj = result;
61446162
return resultobj;
61456163
fail:
@@ -6164,15 +6182,7 @@ SWIGINTERN PyObject *_wrap_PreviewProperties_items(PyObject *self, PyObject *arg
61646182
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PreviewProperties_items" "', argument " "1"" of type '" "Exiv2::PreviewProperties *""'");
61656183
}
61666184
arg1 = reinterpret_cast< Exiv2::PreviewProperties * >(argp1);
6167-
{
6168-
try {
6169-
result = (PyObject *)Exiv2_PreviewProperties_items(arg1,arg2);
6170-
}
6171-
catch(std::exception const& e) {
6172-
_set_python_exception();
6173-
SWIG_fail;
6174-
}
6175-
}
6185+
result = (PyObject *)Exiv2_PreviewProperties_items(arg1,arg2);
61766186
resultobj = result;
61776187
return resultobj;
61786188
fail:
@@ -6185,15 +6195,7 @@ SWIGINTERN PyObject *_wrap_PreviewProperties___iter__(PyObject *self, PyObject *
61856195
PyObject *result = 0 ;
61866196

61876197
if (!SWIG_Python_UnpackTuple(args, "PreviewProperties___iter__", 0, 0, 0)) SWIG_fail;
6188-
{
6189-
try {
6190-
result = (PyObject *)Exiv2_PreviewProperties___iter__();
6191-
}
6192-
catch(std::exception const& e) {
6193-
_set_python_exception();
6194-
SWIG_fail;
6195-
}
6196-
}
6198+
result = (PyObject *)Exiv2_PreviewProperties___iter__();
61976199
resultobj = result;
61986200
return resultobj;
61996201
fail:
@@ -6773,6 +6775,7 @@ static PyMethodDef SwigMethods[] = {
67736775

67746776
static SwigPyGetSet PreviewProperties_height__getset = { _wrap_PreviewProperties_height__get, 0 };
67756777
static SwigPyGetSet PreviewProperties_id__getset = { _wrap_PreviewProperties_id__get, 0 };
6778+
static SwigPyGetSet PreviewProperties___members___getset = { _wrap_PreviewProperties___members___get, 0 };
67766779
static SwigPyGetSet PreviewProperties_mimeType__getset = { _wrap_PreviewProperties_mimeType__get, 0 };
67776780
static SwigPyGetSet PreviewProperties_size__getset = { _wrap_PreviewProperties_size__get, 0 };
67786781
static SwigPyGetSet PreviewProperties_width__getset = { _wrap_PreviewProperties_width__get, 0 };
@@ -6781,6 +6784,19 @@ static SwigPyGetSet PreviewProperties_extension__getset = { _wrap_PreviewPropert
67816784
SWIGINTERN PyGetSetDef SwigPyBuiltin__Exiv2__PreviewProperties_getset[] = {
67826785
{ (char *)"height_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image height in pixels or 0 for unknown height.", &PreviewProperties_height__getset },
67836786
{ (char *)"id_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Identifies type of preview image.", &PreviewProperties_id__getset },
6787+
{ (char *)"__members__", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"\n"
6788+
"Structure member names.\n"
6789+
"\n"
6790+
":type: tuple of str\n"
6791+
"\n"
6792+
"List of names used to access members as attributes (``object.name``) or\n"
6793+
"with dict-like indexing (``object['name']``). Attribute access is\n"
6794+
"preferred as it is more efficient.\n"
6795+
"\n"
6796+
"Although the actual structure member names end with underscores, the\n"
6797+
"Python interface uses names without underscores, as listed in\n"
6798+
"``__members__``.\n"
6799+
"", &PreviewProperties___members___getset },
67846800
{ (char *)"mimeType_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image mime type.", &PreviewProperties_mimeType__getset },
67856801
{ (char *)"size_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image size in bytes.", &PreviewProperties_size__getset },
67866802
{ (char *)"width_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image width in pixels or 0 for unknown width.", &PreviewProperties_width__getset },
@@ -6804,7 +6820,7 @@ SwigPyBuiltin__Exiv2__PreviewProperties_richcompare(PyObject *self, PyObject *ot
68046820
}
68056821

68066822
SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__PreviewProperties_methods[] = {
6807-
{ "keys", (PyCFunction)(void(*)(void))_wrap_PreviewProperties_keys, METH_STATIC|METH_NOARGS, "\n"
6823+
{ "keys", _wrap_PreviewProperties_keys, METH_NOARGS, "\n"
68086824
"Get structure member names.\n"
68096825
":rtype: tuple of str\n"
68106826
":return: structure member names (with any trailing underscores\n"

0 commit comments

Comments
 (0)