diff options
author | Justus Winter <[email protected]> | 2016-06-08 15:56:33 +0000 |
---|---|---|
committer | Justus Winter <[email protected]> | 2016-06-16 12:19:17 +0000 |
commit | 616929b6edf00b4a774b727385d39b785a112b90 (patch) | |
tree | c39e618d99d3257888ac68d2fed08b70fab81435 /lang/python/tests/t-idiomatic.py | |
parent | python: Add properties to wrapped object. (diff) | |
download | gpgme-616929b6edf00b4a774b727385d39b785a112b90.tar.gz gpgme-616929b6edf00b4a774b727385d39b785a112b90.zip |
python: Wrap objects implementing the buffer protocol.
* lang/python/Makefile.am: Add the toplevel source directory to CFLAGS
when compiling the bindings so that we can use private header files.
* lang/python/gpgme.i (gpgme_data_t): Rework the object wrapping. Do
not create a Python wrapper object, merely a gpgme_data_t object, and
keep references to buffer objects, if any. If necessary, update the
buffer after the function call.
(pygpgme_wrap_gpgme_data_t): New function.
* lang/python/helpers.c (object_to_gpgme_data_t): Rework object
wrapping. Also wrap objects implementing the buffer protocol.
* lang/python/helpers.h (object_to_gpgme_data_t): Update prototype.
(pygpgme_wrap_gpgme_data_t): New prototype.
* lang/python/tests/t-idiomatic.py: Demonstrate this.
Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'lang/python/tests/t-idiomatic.py')
-rwxr-xr-x | lang/python/tests/t-idiomatic.py | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/lang/python/tests/t-idiomatic.py b/lang/python/tests/t-idiomatic.py index 37cfb64a..b2526902 100755 --- a/lang/python/tests/t-idiomatic.py +++ b/lang/python/tests/t-idiomatic.py @@ -17,6 +17,7 @@ # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, see <http://www.gnu.org/licenses/>. +import io import os import tempfile from pyme import core, constants, errors @@ -33,14 +34,7 @@ with core.Context() as c, core.Data() as d: assert leak_c.wrapped == None assert leak_d.wrapped == None -# Demonstrate automatic wrapping of file-like objects with 'fileno' -# method. -with tempfile.TemporaryFile() as source, \ - tempfile.TemporaryFile() as signed, \ - tempfile.TemporaryFile() as sink: - source.write(b"Hallo Leute\n") - source.seek(0, os.SEEK_SET) - +def sign_and_verify(source, signed, sink): with core.Context() as c: c.op_sign(source, signed, constants.SIG_MODE_NORMAL) signed.seek(0, os.SEEK_SET) @@ -54,3 +48,28 @@ with tempfile.TemporaryFile() as source, \ sink.seek(0, os.SEEK_SET) assert sink.read() == b"Hallo Leute\n" + +# Demonstrate automatic wrapping of file-like objects with 'fileno' +# method. +with tempfile.TemporaryFile() as source, \ + tempfile.TemporaryFile() as signed, \ + tempfile.TemporaryFile() as sink: + source.write(b"Hallo Leute\n") + source.seek(0, os.SEEK_SET) + + sign_and_verify(source, signed, sink) + +# XXX: Python's io.BytesIo.truncate does not work as advertised. +# http://bugs.python.org/issue27261 +bio = io.BytesIO() +bio.truncate(1) +if len(bio.getvalue()) != 1: + # This version of Python is affected, preallocate buffer. + preallocate = 128*b'\x00' +else: + preallocate = b'' + +# Demonstrate automatic wrapping of objects implementing the buffer +# interface, and the use of data objects with the 'with' statement. +with io.BytesIO(preallocate) as signed, core.Data() as sink: + sign_and_verify(b"Hallo Leute\n", signed, sink) |