Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-scp for openSUSE:Factory checked in at 2021-09-12 20:09:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-scp (Old) and /work/SRC/openSUSE:Factory/.python-scp.new.1899 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-scp" Sun Sep 12 20:09:42 2021 rev:8 rq:918512 version:0.14.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-scp/python-scp.changes 2021-09-07 21:22:11.949359366 +0200 +++ /work/SRC/openSUSE:Factory/.python-scp.new.1899/python-scp.changes 2021-09-12 20:09:50.688104444 +0200 @@ -1,0 +2,16 @@ +Sat Sep 11 22:23:23 UTC 2021 - Martin Hauke <[email protected]> + +- Run unittests +- Get tarball from github.com instead pythonhosted.org + +------------------------------------------------------------------- +Sat Sep 11 12:35:33 UTC 2021 - Martin Hauke <[email protected]> + +- Update to 0.14.1 + * Don't fail if 'pathlib' doesn't import (Python 2) + * Accept 'unicode' objects as paths (Python 2) +- Update to 0.14.0 + * Accept iterables other than list and tuple in get() and put() + * Accept pathlib.Path objects + +------------------------------------------------------------------- Old: ---- scp-0.13.6.tar.gz New: ---- scp-0.14.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-scp.spec ++++++ --- /var/tmp/diff_new_pack.fngzrP/_old 2021-09-12 20:09:51.156104975 +0200 +++ /var/tmp/diff_new_pack.fngzrP/_new 2021-09-12 20:09:51.160104979 +0200 @@ -19,16 +19,18 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-scp -Version: 0.13.6 +Version: 0.14.1 Release: 0 Summary: SSH scp module for paramiko License: LGPL-2.1-or-later Group: Development/Languages/Python URL: https://github.com/jbardin/scp.py -Source: https://files.pythonhosted.org/packages/source/s/scp/scp-%{version}.tar.gz +Source: https://github.com/jbardin/scp.py/archive/refs/tags/v%{version}.tar.gz#/scp-%{version}.tar.gz BuildRequires: %{python_module paramiko} BuildRequires: %{python_module setuptools} BuildRequires: fdupes +BuildRequires: openssh-clients +BuildRequires: openssh-server BuildRequires: python-rpm-macros Requires: python-paramiko BuildArch: noarch @@ -40,7 +42,7 @@ and has only been tested with this implementation. %prep -%setup -q -n scp-%{version} +%setup -q -n scp.py-%{version} %build %python_build @@ -50,8 +52,9 @@ %python_expand %fdupes %{buildroot}%{$python_sitelib} %check -# tests require running ssh server -#%%python_exec -m unittest discover +export SCPPY_PORT=10022 +./.ci/setup_ssh.sh +%pyunittest -v %files %{python_files} %license LICENSE.txt ++++++ scp-0.13.6.tar.gz -> scp-0.14.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/.ci/setup_ssh.sh new/scp.py-0.14.1/.ci/setup_ssh.sh --- old/scp-0.13.6/.ci/setup_ssh.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/scp.py-0.14.1/.ci/setup_ssh.sh 2021-09-10 19:13:50.000000000 +0200 @@ -0,0 +1,57 @@ +#!/bin/sh + +set -e + +# Sets up an SSH server +rm -Rf /tmp/ssh_server +mkdir /tmp/ssh_server +cd /tmp/ssh_server + +# Server config file +cat >config <<'EOF' +Port 10022 +ListenAddress 127.0.0.1 + +Protocol 2 +HostKey /tmp/ssh_server/key_rsa +HostKey /tmp/ssh_server/key_dsa +UsePrivilegeSeparation no + +# Authentication +LoginGraceTime 10 +PermitRootLogin no +StrictModes no +UsePAM no + +RSAAuthentication yes +PubkeyAuthentication yes +AuthorizedKeysFile /tmp/ssh_server/client/id_rsa.pub + +PrintMotd yes +EOF + +# Server keys +ssh-keygen -f key_rsa -N '' -t rsa +ssh-keygen -f key_dsa -N '' -t dsa + +# Client keys +umask 077 +mkdir client || true +ssh-keygen -f client/id_rsa -N '' -t rsa +umask 022 + +# Starts the server +/usr/sbin/sshd -f config -h key_rsa -h key_dsa -p 10022 + +# Sets up the client +umask 077 +mkdir ~/.ssh || true +cp client/id_rsa ~/.ssh/id_rsa +umask 022 +rm -f ~/.ssh/known_hosts +# ssh-keyscan is bugged, don't use it +# ssh-keyscan -v -p 10022 -t rsa 127.0.0.1 >> ~/.ssh/known_hosts +ssh -o StrictHostKeyChecking=no \ + -o PasswordAuthentication=no \ + -p 10022 127.0.0.1 exit +cat ~/.ssh/known_hosts diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/.github/workflows/test.yml new/scp.py-0.14.1/.github/workflows/test.yml --- old/scp-0.13.6/.github/workflows/test.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/scp.py-0.14.1/.github/workflows/test.yml 2021-09-10 19:13:50.000000000 +0200 @@ -0,0 +1,33 @@ +name: Test + +on: + - push + - pull_request + +jobs: + build: + strategy: + matrix: + python-version: + - "2.7" + - "3.5" + - "3.7" + - "3.8" + - "3.9" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - run: pip install readme_renderer + - name: Set up SSH + run: .ci/setup_ssh.sh + - name: Install SSH + run: | + sudo apt-get update -qq + sudo apt-get install -qq openssh-client openssh-server + - run: pip install -e . + - run: SCPPY_PORT=10022 python test.py + - run: python setup.py check -r -s + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/CHANGELOG.md new/scp.py-0.14.1/CHANGELOG.md --- old/scp-0.13.6/CHANGELOG.md 2021-07-09 18:00:30.000000000 +0200 +++ new/scp.py-0.14.1/CHANGELOG.md 2021-09-10 19:13:50.000000000 +0200 @@ -1,5 +1,15 @@ # Changelog +## 0.14.1 (2021-09-10) + +- Don't fail if 'pathlib' doesn't import (Python 2) +- Accept 'unicode' objects as paths (Python 2) + +## 0.14.0 (2021-09-07) + +- Accept iterables other than list and tuple in `get()` and `put()` +- Accept `pathlib.Path` objects + ## 0.13.6 (2021-07-09) - Fix put when the source directory has a trailing slash. It will now work similarly to rsync, copying the contents of the directory. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/PKG-INFO new/scp.py-0.14.1/PKG-INFO --- old/scp-0.13.6/PKG-INFO 2021-07-09 18:01:56.993384600 +0200 +++ new/scp.py-0.14.1/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 @@ -1,151 +0,0 @@ -Metadata-Version: 1.1 -Name: scp -Version: 0.13.6 -Summary: scp module for paramiko -Home-page: https://github.com/jbardin/scp.py -Author: James Bardin -Author-email: [email protected] -License: LGPL-2.1-or-later -Description: Pure python scp module - ====================== - - The scp.py module uses a paramiko transport to send and recieve files via the - scp1 protocol. This is the protocol as referenced from the openssh scp program, - and has only been tested with this implementation. - - - Example - ------- - - .. code-block:: python - - from paramiko import SSHClient - from scp import SCPClient - - ssh = SSHClient() - ssh.load_system_host_keys() - ssh.connect('example.com') - - # SCPCLient takes a paramiko transport as an argument - scp = SCPClient(ssh.get_transport()) - - scp.put('test.txt', 'test2.txt') - scp.get('test2.txt') - - # Uploading the 'test' directory with its content in the - # '/home/user/dump' remote directory - scp.put('test', recursive=True, remote_path='/home/user/dump') - - scp.close() - - - .. code-block:: - - $ md5sum test.txt test2.txt - fc264c65fb17b7db5237cf7ce1780769 test.txt - fc264c65fb17b7db5237cf7ce1780769 test2.txt - - Using 'with' keyword - -------------------- - - .. code-block:: python - - from paramiko import SSHClient - from scp import SCPClient - - with SSHClient() as ssh: - ssh.load_system_host_keys() - ssh.connect('example.com') - - with SCPClient(ssh.get_transport()) as scp: - scp.put('test.txt', 'test2.txt') - scp.get('test2.txt') - - - .. code-block:: - - $ md5sum test.txt test2.txt - fc264c65fb17b7db5237cf7ce1780769 test.txt - fc264c65fb17b7db5237cf7ce1780769 test2.txt - - - Uploading file-like objects - --------------------------- - - The ``putfo`` method can be used to upload file-like objects: - - .. code-block:: python - - import io - from paramiko import SSHClient - from scp import SCPClient - - ssh = SSHClient() - ssh.load_system_host_keys() - ssh.connect('example.com') - - # SCPCLient takes a paramiko transport as an argument - scp = SCPClient(ssh.get_transport()) - - # generate in-memory file-like object - fl = io.BytesIO() - fl.write(b'test') - fl.seek(0) - # upload it directly from memory - scp.putfo(fl, '/tmp/test.txt') - # close connection - scp.close() - # close file handler - fl.close() - - - Tracking progress of your file uploads/downloads - ------------------------------------------------ - - A ``progress`` function can be given as a callback to the SCPClient to handle - how the current SCP operation handles the progress of the transfers. In the - example below we print the percentage complete of the file transfer. - - .. code-block:: python - - from paramiko import SSHClient - from scp import SCPClient - import sys - - ssh = SSHClient() - ssh.load_system_host_keys() - ssh.connect('example.com') - - # Define progress callback that prints the current percentage completed for the file - def progress(filename, size, sent): - sys.stdout.write("%s's progress: %.2f%% \r" % (filename, float(sent)/float(size)*100) ) - - # SCPCLient takes a paramiko transport and progress callback as its arguments. - scp = SCPClient(ssh.get_transport(), progress=progress) - - # you can also use progress4, which adds a 4th parameter to track IP and port - # useful with multiple threads to track source - def progress4(filename, size, sent, peername): - sys.stdout.write("(%s:%s) %s's progress: %.2f%% \r" % (peername[0], peername[1], filename, float(sent)/float(size)*100) ) - scp = SCPClient(ssh.get_transport(), progress4=progress4) - - scp.put('test.txt', '~/test.txt') - # Should now be printing the current progress of your put function. - - scp.close() - -Keywords: paramiko,ssh,scp,transfer -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Topic :: Internet diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/scp.egg-info/PKG-INFO new/scp.py-0.14.1/scp.egg-info/PKG-INFO --- old/scp-0.13.6/scp.egg-info/PKG-INFO 2021-07-09 18:01:56.000000000 +0200 +++ new/scp.py-0.14.1/scp.egg-info/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 @@ -1,151 +0,0 @@ -Metadata-Version: 1.1 -Name: scp -Version: 0.13.6 -Summary: scp module for paramiko -Home-page: https://github.com/jbardin/scp.py -Author: James Bardin -Author-email: [email protected] -License: LGPL-2.1-or-later -Description: Pure python scp module - ====================== - - The scp.py module uses a paramiko transport to send and recieve files via the - scp1 protocol. This is the protocol as referenced from the openssh scp program, - and has only been tested with this implementation. - - - Example - ------- - - .. code-block:: python - - from paramiko import SSHClient - from scp import SCPClient - - ssh = SSHClient() - ssh.load_system_host_keys() - ssh.connect('example.com') - - # SCPCLient takes a paramiko transport as an argument - scp = SCPClient(ssh.get_transport()) - - scp.put('test.txt', 'test2.txt') - scp.get('test2.txt') - - # Uploading the 'test' directory with its content in the - # '/home/user/dump' remote directory - scp.put('test', recursive=True, remote_path='/home/user/dump') - - scp.close() - - - .. code-block:: - - $ md5sum test.txt test2.txt - fc264c65fb17b7db5237cf7ce1780769 test.txt - fc264c65fb17b7db5237cf7ce1780769 test2.txt - - Using 'with' keyword - -------------------- - - .. code-block:: python - - from paramiko import SSHClient - from scp import SCPClient - - with SSHClient() as ssh: - ssh.load_system_host_keys() - ssh.connect('example.com') - - with SCPClient(ssh.get_transport()) as scp: - scp.put('test.txt', 'test2.txt') - scp.get('test2.txt') - - - .. code-block:: - - $ md5sum test.txt test2.txt - fc264c65fb17b7db5237cf7ce1780769 test.txt - fc264c65fb17b7db5237cf7ce1780769 test2.txt - - - Uploading file-like objects - --------------------------- - - The ``putfo`` method can be used to upload file-like objects: - - .. code-block:: python - - import io - from paramiko import SSHClient - from scp import SCPClient - - ssh = SSHClient() - ssh.load_system_host_keys() - ssh.connect('example.com') - - # SCPCLient takes a paramiko transport as an argument - scp = SCPClient(ssh.get_transport()) - - # generate in-memory file-like object - fl = io.BytesIO() - fl.write(b'test') - fl.seek(0) - # upload it directly from memory - scp.putfo(fl, '/tmp/test.txt') - # close connection - scp.close() - # close file handler - fl.close() - - - Tracking progress of your file uploads/downloads - ------------------------------------------------ - - A ``progress`` function can be given as a callback to the SCPClient to handle - how the current SCP operation handles the progress of the transfers. In the - example below we print the percentage complete of the file transfer. - - .. code-block:: python - - from paramiko import SSHClient - from scp import SCPClient - import sys - - ssh = SSHClient() - ssh.load_system_host_keys() - ssh.connect('example.com') - - # Define progress callback that prints the current percentage completed for the file - def progress(filename, size, sent): - sys.stdout.write("%s's progress: %.2f%% \r" % (filename, float(sent)/float(size)*100) ) - - # SCPCLient takes a paramiko transport and progress callback as its arguments. - scp = SCPClient(ssh.get_transport(), progress=progress) - - # you can also use progress4, which adds a 4th parameter to track IP and port - # useful with multiple threads to track source - def progress4(filename, size, sent, peername): - sys.stdout.write("(%s:%s) %s's progress: %.2f%% \r" % (peername[0], peername[1], filename, float(sent)/float(size)*100) ) - scp = SCPClient(ssh.get_transport(), progress4=progress4) - - scp.put('test.txt', '~/test.txt') - # Should now be printing the current progress of your put function. - - scp.close() - -Keywords: paramiko,ssh,scp,transfer -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Topic :: Internet diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/scp.egg-info/SOURCES.txt new/scp.py-0.14.1/scp.egg-info/SOURCES.txt --- old/scp-0.13.6/scp.egg-info/SOURCES.txt 2021-07-09 18:01:56.000000000 +0200 +++ new/scp.py-0.14.1/scp.egg-info/SOURCES.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,13 +0,0 @@ -CHANGELOG.md -LICENSE.txt -MANIFEST.in -README.rst -scp.py -setup.cfg -setup.py -test.py -scp.egg-info/PKG-INFO -scp.egg-info/SOURCES.txt -scp.egg-info/dependency_links.txt -scp.egg-info/requires.txt -scp.egg-info/top_level.txt \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/scp.egg-info/dependency_links.txt new/scp.py-0.14.1/scp.egg-info/dependency_links.txt --- old/scp-0.13.6/scp.egg-info/dependency_links.txt 2021-07-09 18:01:56.000000000 +0200 +++ new/scp.py-0.14.1/scp.egg-info/dependency_links.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/scp.egg-info/requires.txt new/scp.py-0.14.1/scp.egg-info/requires.txt --- old/scp-0.13.6/scp.egg-info/requires.txt 2021-07-09 18:01:56.000000000 +0200 +++ new/scp.py-0.14.1/scp.egg-info/requires.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -paramiko diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/scp.egg-info/top_level.txt new/scp.py-0.14.1/scp.egg-info/top_level.txt --- old/scp-0.13.6/scp.egg-info/top_level.txt 2021-07-09 18:01:56.000000000 +0200 +++ new/scp.py-0.14.1/scp.egg-info/top_level.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -scp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/scp.py new/scp.py-0.14.1/scp.py --- old/scp-0.13.6/scp.py 2021-07-09 17:59:29.000000000 +0200 +++ new/scp.py-0.14.1/scp.py 2021-09-10 19:13:50.000000000 +0200 @@ -5,13 +5,12 @@ Utilities for sending files over ssh using the scp1 protocol. """ -__version__ = '0.13.6' +__version__ = '0.14.1' import locale import os import re from socket import timeout as SocketTimeout -import types # this is quote from the shlex module, added in py3.3 @@ -19,6 +18,19 @@ SCP_COMMAND = b'scp' +PATH_TYPES = (str, bytes) + +try: + import pathlib +except ImportError: + pathlib = None +else: + PATH_TYPES += pathlib.PurePath, +try: + PATH_TYPES += unicode, +except NameError: + pass + def _sh_quote(s): """Return a shell-escaped version of the string `s`.""" @@ -41,6 +53,8 @@ """ if isinstance(s, bytes): return s + elif pathlib and isinstance(s, pathlib.Path): + return bytes(s) else: return s.encode('utf-8') @@ -160,8 +174,10 @@ self.sanitize(asbytes(remote_path))) self._recv_confirm() - if not isinstance(files, (list, tuple)): + if isinstance(files, PATH_TYPES): files = [files] + else: + files = list(files) if recursive: self._send_recursive(files) @@ -214,8 +230,10 @@ and directories. @type preserve_times: bool """ - if not isinstance(remote_path, (list, tuple)): + if isinstance(remote_path, PATH_TYPES): remote_path = [remote_path] + else: + remote_path = list(remote_path) remote_path = [self.sanitize(asbytes(r)) for r in remote_path] self._recv_dir = local_path or os.getcwd() self._depth = 0 @@ -320,6 +338,7 @@ def _send_recursive(self, files): for base in files: + base = asbytes(base) if not os.path.isdir(base): # filename mixed into the bunch self._send_files([base]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/setup.cfg new/scp.py-0.14.1/setup.cfg --- old/scp-0.13.6/setup.cfg 2021-07-09 18:01:56.993384600 +0200 +++ new/scp.py-0.14.1/setup.cfg 2021-09-10 19:13:50.000000000 +0200 @@ -1,7 +1,2 @@ [bdist_wheel] universal = 1 - -[egg_info] -tag_build = -tag_date = 0 - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/setup.py new/scp.py-0.14.1/setup.py --- old/scp-0.13.6/setup.py 2021-07-09 17:59:33.000000000 +0200 +++ new/scp.py-0.14.1/setup.py 2021-09-10 19:13:50.000000000 +0200 @@ -10,9 +10,11 @@ description = fp.read() setup( name = 'scp', - version = '0.13.6', + version = '0.14.1', author = 'James Bardin', author_email = '[email protected]', + maintainer="Remi Rampin", + maintainer_email='[email protected]', license = 'LGPL-2.1-or-later', url = 'https://github.com/jbardin/scp.py', description='scp module for paramiko', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/scp-0.13.6/test.py new/scp.py-0.14.1/test.py --- old/scp-0.13.6/test.py 2021-07-09 17:58:54.000000000 +0200 +++ new/scp.py-0.14.1/test.py 2021-09-10 19:13:50.000000000 +0200 @@ -8,11 +8,16 @@ import sys from scp import SCPClient, SCPException, put, get import tempfile +import types try: import unittest2 as unittest sys.modules['unittest'] = unittest except ImportError: import unittest +try: + import pathlib +except ImportError: + pathlib = None ssh_info = { @@ -273,6 +278,12 @@ [b'bien rang\xC3\xA9', b'bien rang\xC3\xA9/test', b'r\xC3\xA9mi']) + g = (n for n in (u'cl\xE9/dossi\xE9/bien rang\xE9', u'cl\xE9/r\xE9mi')) + assert isinstance(g, types.GeneratorType) + self.upload_test(g, True, + [b'bien rang\xC3\xA9', + b'bien rang\xC3\xA9/test', + b'r\xC3\xA9mi']) self.upload_test([u'cl\xE9/dossi\xE9', u'cl\xE9/r\xE9mi'], True, [b'dossi\xC3\xA9', @@ -280,6 +291,13 @@ b'dossi\xC3\xA9/bien rang\xC3\xA9/test', b'r\xC3\xA9mi']) + @unittest.skipUnless(pathlib, "pathlib not available") + def test_pathlib(self): + self.upload_test(pathlib.Path(u'cl\xE9/dossi\xE9'), True, + [b'dossi\xC3\xA9', + b'dossi\xC3\xA9/bien rang\xC3\xA9', + b'dossi\xC3\xA9/bien rang\xC3\xA9/test']) + def test_putfo(self): fl = BytesIO() fl.write(b'r\xC3\xA9mi')
