Skip to content

Commit b00d24d

Browse files
Undeprecate "struct_dict" functions
This mostly undoes 3b852be and c50b558. Iterating over the struct remains deprecated as it's the least intuitive struct-like behaviour.
1 parent 295ed12 commit b00d24d

File tree

14 files changed

+224
-973
lines changed

14 files changed

+224
-973
lines changed

CHANGELOG.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ Changes in v0.18.0:
3838
9/ BasicIo.read (& readOrThrow) now extract count from the buffer size.
3939
10/ Invalidate data iterators if data is deleted. (Requires swig >= 4.4)
4040
11/ Add __members__ attribute to exiv2 "data" structure types.
41-
12/ Deprecated keys(), values(), and items() methods and iterator of exiv2
42-
"data" structure types.
41+
12/ Deprecated iteration of exiv2 "data" structure types.
4342
13/ API CHANGE: exiv2.LogMsg.pythonHandler is replaced by exiv2.pythonHandler
4443

4544
Changes in v0.17.5:

src/interface/shared/struct_dict.i

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ static PyObject* items_struct(struct_info& info, PyObject* obj) {
121121
%feature("python:slot", "tp_iter", functype="getiterfunc")
122122
struct_type::__iter__;
123123
// These functions don't throw exceptions
124-
%noexception struct_type::__members__;
125124
%noexception struct_type::__iter__;
126125
%noexception struct_type::keys;
127126
%noexception struct_type::values;
@@ -131,70 +130,47 @@ static PyObject* items_struct(struct_info& info, PyObject* obj) {
131130
// Document functions
132131
%feature("docstring") struct_type::items "Get structure members.
133132
:rtype: tuple of (str, value) tuple
134-
:return: structure member (name, value) pairs (with any trailing
135-
underscores removed from names)."
133+
:return: structure member (name, value) pairs."
136134
%feature("docstring") struct_type::keys "Get structure member names.
137-
:rtype: tuple of str
138-
:return: structure member names (with any trailing underscores
139-
removed)."
140-
%feature("docstring") struct_type::values "Get structure member values.
141-
:rtype: tuple of value
142-
:return: structure member values."
143-
%feature("docstring") struct_type::__members__ "Structure member names.
144-
145-
:type: tuple of str
146135
147-
List of names used to access members as attributes (``object.name``) or
148-
with dict-like indexing (``object['name']``). Attribute access is
136+
Return the names used to access members as attributes (``object.name``)
137+
or with dict-like indexing (``object['name']``). Attribute access is
149138
preferred as it is more efficient."
150139
#if #strip_underscore == "true"
151140
"
152141
153-
Although the actual structure member names end with underscores, the
154-
Python interface uses names without underscores, as listed in
155-
``__members__``."
142+
Although the exiv2 C++ structure member names end with underscores, the
143+
Python interface uses names without underscores."
156144
#endif
157-
// Getter function for __members__
158-
%fragment("members_get"{struct_type}, "header",
159-
fragment="struct_info"{struct_type}, fragment="keys_struct") {
160-
static PyObject* %mangle(struct_type)___members___get(struct_type*) {
161-
init_info_%mangle(struct_type)();
162-
return keys_struct(info_%mangle(struct_type));
163-
};
164-
}
145+
"
146+
:rtype: tuple of str
147+
:return: structure member names.
148+
"
149+
%feature("docstring") struct_type::values "Get structure member values.
150+
:rtype: tuple of value
151+
:return: structure member values."
165152
// Add functions
166153
%extend struct_type {
167154
%fragment("struct_info"{struct_type});
168-
%fragment("members_get"{struct_type});
155+
%fragment("keys_struct");
169156
%fragment("values_struct");
170157
%fragment("items_struct");
171-
PyObject* __members__ const;
172158
PyObject* keys() {
173-
// Deprecated since 2025-09-11
174-
PyErr_WarnEx(PyExc_DeprecationWarning,
175-
"Please use __members__ to get the struct member names", 1);
176-
return %mangle(struct_type)___members___get(self);
159+
init_info_%mangle(struct_type)();
160+
return keys_struct(info_%mangle(struct_type));
177161
}
178162
PyObject* values(PyObject* py_self) {
179-
// Deprecated since 2025-09-11
180-
PyErr_WarnEx(PyExc_DeprecationWarning,
181-
"Please use __members__ to get the struct member names"
182-
" and getattr to get values from names", 1);
183163
init_info_%mangle(struct_type)();
184164
return values_struct(info_%mangle(struct_type), py_self);
185165
}
186166
PyObject* items(PyObject* py_self) {
187-
// Deprecated since 2025-09-11
188-
PyErr_WarnEx(PyExc_DeprecationWarning,
189-
"Please use __members__ to get the struct member names"
190-
" and getattr to get values from names", 1);
191167
init_info_%mangle(struct_type)();
192168
return items_struct(info_%mangle(struct_type), py_self);
193169
}
194170
static PyObject* __iter__() {
195171
// Deprecated since 2025-09-11
196172
PyErr_WarnEx(PyExc_DeprecationWarning,
197-
"Please iterate over the __members__ attribute", 1);
173+
"Please iterate over keys() function output", 1);
198174
init_info_%mangle(struct_type)();
199175
PyObject* seq = keys_struct(info_%mangle(struct_type));
200176
PyObject* result = PySeqIter_New(seq);

src/swig-0_27_7/datasets_wrap.cxx

Lines changed: 13 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -4424,12 +4424,6 @@ static PyObject* keys_struct(struct_info& info) {
44244424
};
44254425

44264426

4427-
static PyObject* Exiv2_DataSet___members___get(Exiv2::DataSet*) {
4428-
init_info_Exiv2_DataSet();
4429-
return keys_struct(info_Exiv2_DataSet);
4430-
};
4431-
4432-
44334427
static PyObject* values_struct(struct_info& info, PyObject* obj) {
44344428
PyObject* result = PyTuple_New(info.members.size());
44354429
for (size_t i = 0; i < info.members.size(); i++)
@@ -4481,31 +4475,21 @@ SWIGINTERNINLINE PyObject*
44814475
}
44824476

44834477
SWIGINTERN PyObject *Exiv2_DataSet_keys(Exiv2::DataSet *self){
4484-
// Deprecated since 2025-09-11
4485-
PyErr_WarnEx(PyExc_DeprecationWarning,
4486-
"Please use __members__ to get the struct member names", 1);
4487-
return Exiv2_DataSet___members___get(self);
4478+
init_info_Exiv2_DataSet();
4479+
return keys_struct(info_Exiv2_DataSet);
44884480
}
44894481
SWIGINTERN PyObject *Exiv2_DataSet_values(Exiv2::DataSet *self,PyObject *py_self){
4490-
// Deprecated since 2025-09-11
4491-
PyErr_WarnEx(PyExc_DeprecationWarning,
4492-
"Please use __members__ to get the struct member names"
4493-
" and getattr to get values from names", 1);
44944482
init_info_Exiv2_DataSet();
44954483
return values_struct(info_Exiv2_DataSet, py_self);
44964484
}
44974485
SWIGINTERN PyObject *Exiv2_DataSet_items(Exiv2::DataSet *self,PyObject *py_self){
4498-
// Deprecated since 2025-09-11
4499-
PyErr_WarnEx(PyExc_DeprecationWarning,
4500-
"Please use __members__ to get the struct member names"
4501-
" and getattr to get values from names", 1);
45024486
init_info_Exiv2_DataSet();
45034487
return items_struct(info_Exiv2_DataSet, py_self);
45044488
}
45054489
SWIGINTERN PyObject *Exiv2_DataSet___iter__(){
45064490
// Deprecated since 2025-09-11
45074491
PyErr_WarnEx(PyExc_DeprecationWarning,
4508-
"Please iterate over the __members__ attribute", 1);
4492+
"Please iterate over keys() function output", 1);
45094493
init_info_Exiv2_DataSet();
45104494
PyObject* seq = keys_struct(info_Exiv2_DataSet);
45114495
PyObject* result = PySeqIter_New(seq);
@@ -5048,27 +5032,6 @@ SWIGINTERN PyObject *_wrap_DataSet_photoshop__get(PyObject *self, PyObject *args
50485032
}
50495033

50505034

5051-
SWIGINTERN PyObject *_wrap_DataSet___members___get(PyObject *self, PyObject *args) {
5052-
PyObject *resultobj = 0;
5053-
Exiv2::DataSet *arg1 = (Exiv2::DataSet *) 0 ;
5054-
void *argp1 = 0 ;
5055-
int res1 = 0 ;
5056-
PyObject *result = 0 ;
5057-
5058-
if (!SWIG_Python_UnpackTuple(args, "DataSet___members___get", 0, 0, 0)) SWIG_fail;
5059-
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Exiv2__DataSet, 0 | 0 );
5060-
if (!SWIG_IsOK(res1)) {
5061-
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DataSet___members___get" "', argument " "1"" of type '" "Exiv2::DataSet *""'");
5062-
}
5063-
arg1 = reinterpret_cast< Exiv2::DataSet * >(argp1);
5064-
result = (PyObject *)Exiv2_DataSet___members___get(arg1);
5065-
resultobj = result;
5066-
return resultobj;
5067-
fail:
5068-
return NULL;
5069-
}
5070-
5071-
50725035
SWIGINTERN PyObject *_wrap_DataSet_keys(PyObject *self, PyObject *args) {
50735036
PyObject *resultobj = 0;
50745037
Exiv2::DataSet *arg1 = (Exiv2::DataSet *) 0 ;
@@ -5852,7 +5815,6 @@ static SwigPyGetSet DataSet_title__getset = { _wrap_DataSet_title__get, 0 };
58525815
static SwigPyGetSet DataSet_photoshop__getset = { _wrap_DataSet_photoshop__get, 0 };
58535816
static SwigPyGetSet DataSet_desc__getset = { _wrap_DataSet_desc__get, 0 };
58545817
static SwigPyGetSet DataSet_repeatable__getset = { _wrap_DataSet_repeatable__get, 0 };
5855-
static SwigPyGetSet DataSet___members___getset = { _wrap_DataSet___members___get, 0 };
58565818
static SwigPyGetSet DataSet_number__getset = { _wrap_DataSet_number__get, 0 };
58575819
static SwigPyGetSet DataSet_maxbytes__getset = { _wrap_DataSet_maxbytes__get, 0 };
58585820
static SwigPyGetSet DataSet___dict___getset = { SwigPyObject_get___dict__, 0 };
@@ -5866,19 +5828,6 @@ SWIGINTERN PyGetSetDef SwigPyBuiltin__Exiv2__DataSet_getset[] = {
58665828
{ (char *)"photoshop_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Photoshop string", &DataSet_photoshop__getset },
58675829
{ (char *)"desc_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Dataset description", &DataSet_desc__getset },
58685830
{ (char *)"repeatable_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"True if dataset is repeatable", &DataSet_repeatable__getset },
5869-
{ (char *)"__members__", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"\n"
5870-
"Structure member names.\n"
5871-
"\n"
5872-
":type: tuple of str\n"
5873-
"\n"
5874-
"List of names used to access members as attributes (``object.name``) or\n"
5875-
"with dict-like indexing (``object['name']``). Attribute access is\n"
5876-
"preferred as it is more efficient.\n"
5877-
"\n"
5878-
"Although the actual structure member names end with underscores, the\n"
5879-
"Python interface uses names without underscores, as listed in\n"
5880-
"``__members__``.\n"
5881-
"", &DataSet___members___getset },
58825831
{ (char *)"number_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Dataset number", &DataSet_number__getset },
58835832
{ (char *)"maxbytes_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Maximum number of bytes", &DataSet_maxbytes__getset },
58845833
{ (char *)"__dict__", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Dataset number", &DataSet___dict___getset },
@@ -5907,9 +5856,16 @@ SwigPyBuiltin__Exiv2__DataSet_richcompare(PyObject *self, PyObject *other, int o
59075856
SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__DataSet_methods[] = {
59085857
{ "keys", _wrap_DataSet_keys, METH_NOARGS, "\n"
59095858
"Get structure member names.\n"
5859+
"\n"
5860+
"Return the names used to access members as attributes (``object.name``)\n"
5861+
"or with dict-like indexing (``object['name']``). Attribute access is\n"
5862+
"preferred as it is more efficient.\n"
5863+
"\n"
5864+
"Although the exiv2 C++ structure member names end with underscores, the\n"
5865+
"Python interface uses names without underscores.\n"
59105866
":rtype: tuple of str\n"
5911-
":return: structure member names (with any trailing underscores\n"
5912-
" removed).\n"
5867+
":return: structure member names.\n"
5868+
"\n"
59135869
"" },
59145870
{ "values", _wrap_DataSet_values, METH_NOARGS, "\n"
59155871
"Get structure member values.\n"
@@ -5919,8 +5875,7 @@ SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__DataSet_methods[] = {
59195875
{ "items", _wrap_DataSet_items, METH_NOARGS, "\n"
59205876
"Get structure members.\n"
59215877
":rtype: tuple of (str, value) tuple\n"
5922-
":return: structure member (name, value) pairs (with any trailing\n"
5923-
" underscores removed from names).\n"
5878+
":return: structure member (name, value) pairs.\n"
59245879
"" },
59255880
{ "__iter__", (PyCFunction)(void(*)(void))_wrap_DataSet___iter__, METH_STATIC|METH_NOARGS, "" },
59265881
{ NULL, NULL, 0, NULL } /* Sentinel */

src/swig-0_27_7/preview_wrap.cxx

Lines changed: 13 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5517,12 +5517,6 @@ static PyObject* keys_struct(struct_info& info) {
55175517
};
55185518

55195519

5520-
static PyObject* Exiv2_PreviewProperties___members___get(Exiv2::PreviewProperties*) {
5521-
init_info_Exiv2_PreviewProperties();
5522-
return keys_struct(info_Exiv2_PreviewProperties);
5523-
};
5524-
5525-
55265520
static PyObject* values_struct(struct_info& info, PyObject* obj) {
55275521
PyObject* result = PyTuple_New(info.members.size());
55285522
for (size_t i = 0; i < info.members.size(); i++)
@@ -5563,31 +5557,21 @@ SWIGINTERNINLINE PyObject*
55635557
}
55645558

55655559
SWIGINTERN PyObject *Exiv2_PreviewProperties_keys(Exiv2::PreviewProperties *self){
5566-
// Deprecated since 2025-09-11
5567-
PyErr_WarnEx(PyExc_DeprecationWarning,
5568-
"Please use __members__ to get the struct member names", 1);
5569-
return Exiv2_PreviewProperties___members___get(self);
5560+
init_info_Exiv2_PreviewProperties();
5561+
return keys_struct(info_Exiv2_PreviewProperties);
55705562
}
55715563
SWIGINTERN PyObject *Exiv2_PreviewProperties_values(Exiv2::PreviewProperties *self,PyObject *py_self){
5572-
// Deprecated since 2025-09-11
5573-
PyErr_WarnEx(PyExc_DeprecationWarning,
5574-
"Please use __members__ to get the struct member names"
5575-
" and getattr to get values from names", 1);
55765564
init_info_Exiv2_PreviewProperties();
55775565
return values_struct(info_Exiv2_PreviewProperties, py_self);
55785566
}
55795567
SWIGINTERN PyObject *Exiv2_PreviewProperties_items(Exiv2::PreviewProperties *self,PyObject *py_self){
5580-
// Deprecated since 2025-09-11
5581-
PyErr_WarnEx(PyExc_DeprecationWarning,
5582-
"Please use __members__ to get the struct member names"
5583-
" and getattr to get values from names", 1);
55845568
init_info_Exiv2_PreviewProperties();
55855569
return items_struct(info_Exiv2_PreviewProperties, py_self);
55865570
}
55875571
SWIGINTERN PyObject *Exiv2_PreviewProperties___iter__(){
55885572
// Deprecated since 2025-09-11
55895573
PyErr_WarnEx(PyExc_DeprecationWarning,
5590-
"Please iterate over the __members__ attribute", 1);
5574+
"Please iterate over keys() function output", 1);
55915575
init_info_Exiv2_PreviewProperties();
55925576
PyObject* seq = keys_struct(info_Exiv2_PreviewProperties);
55935577
PyObject* result = PySeqIter_New(seq);
@@ -6075,27 +6059,6 @@ SWIGINTERN PyObject *_wrap_PreviewProperties_id__get(PyObject *self, PyObject *a
60756059
}
60766060

60776061

6078-
SWIGINTERN PyObject *_wrap_PreviewProperties___members___get(PyObject *self, PyObject *args) {
6079-
PyObject *resultobj = 0;
6080-
Exiv2::PreviewProperties *arg1 = (Exiv2::PreviewProperties *) 0 ;
6081-
void *argp1 = 0 ;
6082-
int res1 = 0 ;
6083-
PyObject *result = 0 ;
6084-
6085-
if (!SWIG_Python_UnpackTuple(args, "PreviewProperties___members___get", 0, 0, 0)) SWIG_fail;
6086-
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Exiv2__PreviewProperties, 0 | 0 );
6087-
if (!SWIG_IsOK(res1)) {
6088-
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PreviewProperties___members___get" "', argument " "1"" of type '" "Exiv2::PreviewProperties *""'");
6089-
}
6090-
arg1 = reinterpret_cast< Exiv2::PreviewProperties * >(argp1);
6091-
result = (PyObject *)Exiv2_PreviewProperties___members___get(arg1);
6092-
resultobj = result;
6093-
return resultobj;
6094-
fail:
6095-
return NULL;
6096-
}
6097-
6098-
60996062
SWIGINTERN PyObject *_wrap_PreviewProperties_keys(PyObject *self, PyObject *args) {
61006063
PyObject *resultobj = 0;
61016064
Exiv2::PreviewProperties *arg1 = (Exiv2::PreviewProperties *) 0 ;
@@ -6729,7 +6692,6 @@ static PyMethodDef SwigMethods[] = {
67296692

67306693
static SwigPyGetSet PreviewProperties_height__getset = { _wrap_PreviewProperties_height__get, 0 };
67316694
static SwigPyGetSet PreviewProperties_id__getset = { _wrap_PreviewProperties_id__get, 0 };
6732-
static SwigPyGetSet PreviewProperties___members___getset = { _wrap_PreviewProperties___members___get, 0 };
67336695
static SwigPyGetSet PreviewProperties_mimeType__getset = { _wrap_PreviewProperties_mimeType__get, 0 };
67346696
static SwigPyGetSet PreviewProperties_size__getset = { _wrap_PreviewProperties_size__get, 0 };
67356697
static SwigPyGetSet PreviewProperties_width__getset = { _wrap_PreviewProperties_width__get, 0 };
@@ -6738,19 +6700,6 @@ static SwigPyGetSet PreviewProperties_extension__getset = { _wrap_PreviewPropert
67386700
SWIGINTERN PyGetSetDef SwigPyBuiltin__Exiv2__PreviewProperties_getset[] = {
67396701
{ (char *)"height_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image height in pixels or 0 for unknown height.", &PreviewProperties_height__getset },
67406702
{ (char *)"id_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Identifies type of preview image.", &PreviewProperties_id__getset },
6741-
{ (char *)"__members__", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"\n"
6742-
"Structure member names.\n"
6743-
"\n"
6744-
":type: tuple of str\n"
6745-
"\n"
6746-
"List of names used to access members as attributes (``object.name``) or\n"
6747-
"with dict-like indexing (``object['name']``). Attribute access is\n"
6748-
"preferred as it is more efficient.\n"
6749-
"\n"
6750-
"Although the actual structure member names end with underscores, the\n"
6751-
"Python interface uses names without underscores, as listed in\n"
6752-
"``__members__``.\n"
6753-
"", &PreviewProperties___members___getset },
67546703
{ (char *)"mimeType_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image mime type.", &PreviewProperties_mimeType__getset },
67556704
{ (char *)"size_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image size in bytes.", &PreviewProperties_size__getset },
67566705
{ (char *)"width_", SwigPyBuiltin_FunpackGetterClosure, 0, (char *)"Preview image width in pixels or 0 for unknown width.", &PreviewProperties_width__getset },
@@ -6776,9 +6725,16 @@ SwigPyBuiltin__Exiv2__PreviewProperties_richcompare(PyObject *self, PyObject *ot
67766725
SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__PreviewProperties_methods[] = {
67776726
{ "keys", _wrap_PreviewProperties_keys, METH_NOARGS, "\n"
67786727
"Get structure member names.\n"
6728+
"\n"
6729+
"Return the names used to access members as attributes (``object.name``)\n"
6730+
"or with dict-like indexing (``object['name']``). Attribute access is\n"
6731+
"preferred as it is more efficient.\n"
6732+
"\n"
6733+
"Although the exiv2 C++ structure member names end with underscores, the\n"
6734+
"Python interface uses names without underscores.\n"
67796735
":rtype: tuple of str\n"
6780-
":return: structure member names (with any trailing underscores\n"
6781-
" removed).\n"
6736+
":return: structure member names.\n"
6737+
"\n"
67826738
"" },
67836739
{ "values", _wrap_PreviewProperties_values, METH_NOARGS, "\n"
67846740
"Get structure member values.\n"
@@ -6788,8 +6744,7 @@ SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__PreviewProperties_methods[] = {
67886744
{ "items", _wrap_PreviewProperties_items, METH_NOARGS, "\n"
67896745
"Get structure members.\n"
67906746
":rtype: tuple of (str, value) tuple\n"
6791-
":return: structure member (name, value) pairs (with any trailing\n"
6792-
" underscores removed from names).\n"
6747+
":return: structure member (name, value) pairs.\n"
67936748
"" },
67946749
{ "__iter__", (PyCFunction)(void(*)(void))_wrap_PreviewProperties___iter__, METH_STATIC|METH_NOARGS, "" },
67956750
{ NULL, NULL, 0, NULL } /* Sentinel */

0 commit comments

Comments
 (0)