Skip to content

Commit 9a70577

Browse files
committed
Merge pull request #541 from KeepSafe/drop_py3.3
Drop python 3.3 support
2 parents 03b0ff4 + 4fbf2bc commit 9a70577

14 files changed

+75
-152
lines changed

.travis.yml

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ sudo: no
22

33
language: python
44
python:
5-
- 3.3
65
- 3.4
76
- 3.5
87

aiohttp/client.py

+12-15
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
__all__ = ('ClientSession', 'request', 'get', 'options', 'head',
2323
'delete', 'post', 'put', 'patch')
2424

25-
PY_341 = sys.version_info >= (3, 4, 1)
2625
PY_35 = sys.version_info >= (3, 5)
2726

2827

@@ -77,18 +76,17 @@ def __init__(self, *, connector=None, loop=None, cookies=None,
7776
self._response_class = response_class
7877
self._ws_response_class = ws_response_class
7978

80-
if PY_341:
81-
def __del__(self, _warnings=warnings):
82-
if not self.closed:
83-
self.close()
79+
def __del__(self, _warnings=warnings):
80+
if not self.closed:
81+
self.close()
8482

85-
_warnings.warn("Unclosed client session {!r}".format(self),
86-
ResourceWarning)
87-
context = {'client_session': self,
88-
'message': 'Unclosed client session'}
89-
if self._source_traceback is not None:
90-
context['source_traceback'] = self._source_traceback
91-
self._loop.call_exception_handler(context)
83+
_warnings.warn("Unclosed client session {!r}".format(self),
84+
ResourceWarning)
85+
context = {'client_session': self,
86+
'message': 'Unclosed client session'}
87+
if self._source_traceback is not None:
88+
context['source_traceback'] = self._source_traceback
89+
self._loop.call_exception_handler(context)
9290

9391
def request(self, method, url, *,
9492
params=None,
@@ -480,9 +478,8 @@ def __init__(self, coro, session):
480478
super().__init__(coro)
481479
self._session = session
482480

483-
if PY_341:
484-
def __del__(self):
485-
self._session.detach()
481+
def __del__(self):
482+
self._session.detach()
486483

487484

488485
def request(method, url, *,

aiohttp/client_reqrep.py

+12-14
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from .multipart import MultipartWriter
2424
from .protocol import HttpMessage
2525

26-
PY_341 = sys.version_info >= (3, 4, 1)
2726
PY_35 = sys.version_info >= (3, 5)
2827

2928
HTTP_PORT = 80
@@ -551,19 +550,18 @@ def _post_init(self, loop):
551550
if loop.get_debug():
552551
self._source_traceback = traceback.extract_stack(sys._getframe(1))
553552

554-
if PY_341:
555-
def __del__(self, _warnings=warnings):
556-
if self._closed:
557-
return
558-
self.close()
559-
560-
_warnings.warn("Unclosed response {!r}".format(self),
561-
ResourceWarning)
562-
context = {'client_response': self,
563-
'message': 'Unclosed response'}
564-
if self._source_traceback:
565-
context['source_traceback'] = self._source_traceback
566-
self._loop.call_exception_handler(context)
553+
def __del__(self, _warnings=warnings):
554+
if self._closed:
555+
return
556+
self.close()
557+
558+
_warnings.warn("Unclosed response {!r}".format(self),
559+
ResourceWarning)
560+
context = {'client_response': self,
561+
'message': 'Unclosed response'}
562+
if self._source_traceback:
563+
context['source_traceback'] = self._source_traceback
564+
self._loop.call_exception_handler(context)
567565

568566
def __repr__(self):
569567
out = io.StringIO()

aiohttp/connector.py

+32-47
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525

2626
__all__ = ('BaseConnector', 'TCPConnector', 'ProxyConnector', 'UnixConnector')
2727

28-
PY_341 = sys.version_info >= (3, 4, 1)
2928
PY_343 = sys.version_info >= (3, 4, 3)
3029

3130
HASHFUNC_BY_DIGESTLEN = {
@@ -53,24 +52,23 @@ def __init__(self, connector, key, request, transport, protocol, loop):
5352
if loop.get_debug():
5453
self._source_traceback = traceback.extract_stack(sys._getframe(1))
5554

56-
if PY_341:
57-
def __del__(self, _warnings=warnings):
58-
if self._transport is not None:
59-
if hasattr(self._loop, 'is_closed'):
60-
if self._loop.is_closed():
61-
return
62-
63-
self._connector._release(
64-
self._key, self._request, self._transport, self._protocol,
65-
should_close=True)
66-
67-
_warnings.warn("Unclosed connection {!r}".format(self),
68-
ResourceWarning)
69-
context = {'client_connection': self,
70-
'message': 'Unclosed connection'}
71-
if self._source_traceback is not None:
72-
context['source_traceback'] = self._source_traceback
73-
self._loop.call_exception_handler(context)
55+
def __del__(self, _warnings=warnings):
56+
if self._transport is not None:
57+
if hasattr(self._loop, 'is_closed'):
58+
if self._loop.is_closed():
59+
return
60+
61+
self._connector._release(
62+
self._key, self._request, self._transport, self._protocol,
63+
should_close=True)
64+
65+
_warnings.warn("Unclosed connection {!r}".format(self),
66+
ResourceWarning)
67+
context = {'client_connection': self,
68+
'message': 'Unclosed connection'}
69+
if self._source_traceback is not None:
70+
context['source_traceback'] = self._source_traceback
71+
self._loop.call_exception_handler(context)
7472

7573
@property
7674
def loop(self):
@@ -142,22 +140,21 @@ def __init__(self, *, conn_timeout=None, keepalive_timeout=30,
142140

143141
self.cookies = http.cookies.SimpleCookie()
144142

145-
if PY_341:
146-
def __del__(self, _warnings=warnings):
147-
if self._closed:
148-
return
149-
if not self._conns:
150-
return
143+
def __del__(self, _warnings=warnings):
144+
if self._closed:
145+
return
146+
if not self._conns:
147+
return
151148

152-
self.close()
149+
self.close()
153150

154-
_warnings.warn("Unclosed connector {!r}".format(self),
155-
ResourceWarning)
156-
context = {'connector': self,
157-
'message': 'Unclosed connector'}
158-
if self._source_traceback is not None:
159-
context['source_traceback'] = self._source_traceback
160-
self._loop.call_exception_handler(context)
151+
_warnings.warn("Unclosed connector {!r}".format(self),
152+
ResourceWarning)
153+
context = {'connector': self,
154+
'message': 'Unclosed connector'}
155+
if self._source_traceback is not None:
156+
context['source_traceback'] = self._source_traceback
157+
self._loop.call_exception_handler(context)
161158

162159
@property
163160
def force_close(self):
@@ -372,9 +369,6 @@ def _create_connection(self, req):
372369
raise NotImplementedError()
373370

374371

375-
_SSL_OP_NO_COMPRESSION = getattr(ssl, "OP_NO_COMPRESSION", 0)
376-
_SSH_HAS_CREATE_DEFAULT_CONTEXT = hasattr(ssl, 'create_default_context')
377-
378372
_marker = object()
379373

380374

@@ -455,19 +449,10 @@ def ssl_context(self):
455449
sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
456450
sslcontext.options |= ssl.OP_NO_SSLv2
457451
sslcontext.options |= ssl.OP_NO_SSLv3
458-
sslcontext.options |= _SSL_OP_NO_COMPRESSION
452+
sslcontext.options |= ssl.OP_NO_COMPRESSION
459453
sslcontext.set_default_verify_paths()
460-
elif _SSH_HAS_CREATE_DEFAULT_CONTEXT:
461-
# Python 3.4+
462-
sslcontext = ssl.create_default_context()
463454
else:
464-
# Fallback for Python 3.3.
465-
sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
466-
sslcontext.options |= ssl.OP_NO_SSLv2
467-
sslcontext.options |= ssl.OP_NO_SSLv3
468-
sslcontext.options |= _SSL_OP_NO_COMPRESSION
469-
sslcontext.set_default_verify_paths()
470-
sslcontext.verify_mode = ssl.CERT_REQUIRED
455+
sslcontext = ssl.create_default_context()
471456
self._ssl_context = sslcontext
472457
return self._ssl_context
473458

appveyor.yml

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ version: 0.18.0a0.dev{build}
22

33
environment:
44
matrix:
5-
- PYTHON: "C:\\Python33"
6-
PYTHON_VERSION: "3.3.6"
7-
PYTHON_ARCH: "32"
8-
- PYTHON: "C:\\Python33"
9-
PYTHON_VERSION: "3.3.6"
10-
PYTHON_ARCH: "64"
115
- PYTHON: "C:\\Python34"
126
PYTHON_VERSION: "3.4.3"
137
PYTHON_ARCH: "32"
148
- PYTHON: "C:\\Python34"
159
PYTHON_VERSION: "3.4.3"
1610
PYTHON_ARCH: "64"
11+
- PYTHON: "C:\\Python35"
12+
PYTHON_VERSION: "3.5.0"
13+
PYTHON_ARCH: "32"
14+
- PYTHON: "C:\\Python35"
15+
PYTHON_VERSION: "3.5.0"
16+
PYTHON_ARCH: "64"
1717

1818
install:
1919
- "powershell ./install_python_and_pip.ps1"

docs/index.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ Continuous Integration.
9898
Dependencies
9999
------------
100100

101-
- Python 3.3 and :term:`asyncio` or Python 3.4+
101+
- Python Python 3.4.1+
102102
- *chardet* library
103103
- *Optional* :term:`cchardet` library as faster replacement for
104104
:term:`chardet`.
105105

106-
Install it manually via::
106+
Install it explicitly via::
107107

108108
$ pip install cchardet
109109

examples/srv.py

-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
import aiohttp
1515
import aiohttp.server
1616

17-
assert sys.version >= '3.3', 'Please use Python 3.3 or higher.'
18-
1917

2018
class HttpRequestHandler(aiohttp.server.ServerHttpProtocol):
2119

setup.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ def build_extension(self, ext):
5757

5858
install_requires = ['chardet']
5959

60-
if sys.version_info < (3, 4):
61-
install_requires += ['asyncio', 'enum34']
60+
if sys.version_info < (3, 4, 1):
61+
raise RuntimeError("aiohttp requires Python 3.4.1+")
6262

6363

6464
def read(f):

tests/test_client_request.py

-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import gc
55
import unittest
66
import unittest.mock
7-
import sys
87

98
import inspect
109
import io
@@ -19,9 +18,6 @@
1918
from aiohttp import BaseConnector
2019

2120

22-
PY_341 = sys.version_info >= (3, 4, 1)
23-
24-
2521
class TestClientRequest(unittest.TestCase):
2622

2723
def setUp(self):

tests/test_client_response.py

-4
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@
55
import gc
66
import unittest
77
import unittest.mock
8-
import sys
98

109
import aiohttp
1110
from aiohttp.client_reqrep import ClientResponse
1211

13-
PY_341 = sys.version_info >= (3, 4, 1)
14-
1512

1613
class TestClientResponse(unittest.TestCase):
1714

@@ -30,7 +27,6 @@ def tearDown(self):
3027
self.loop.close()
3128
gc.collect()
3229

33-
@unittest.skipUnless(PY_341, "Requires Python 3.4.1+")
3430
def test_del(self):
3531
response = ClientResponse('get', 'http://del-cl-resp.org')
3632
response._post_init(self.loop)

tests/test_client_session.py

-5
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,13 @@
55
import gc
66
import unittest
77
from unittest import mock
8-
import sys
98

109
import aiohttp
1110
from aiohttp.client import ClientSession
1211
from aiohttp.multidict import MultiDict, CIMultiDict
1312
from aiohttp.connector import BaseConnector, TCPConnector
1413

1514

16-
PY_341 = sys.version_info >= (3, 4, 1)
17-
18-
1915
class TestClientSession(unittest.TestCase):
2016

2117
maxDiff = None
@@ -376,7 +372,6 @@ def test_double_close(self):
376372
self.assertTrue(session.closed)
377373
self.assertTrue(conn.closed)
378374

379-
@unittest.skipUnless(PY_341, "Requires Python 3.4.1+")
380375
def test_del(self):
381376
conn = self.make_open_connector()
382377
session = ClientSession(loop=self.loop, connector=conn)

tests/test_connector.py

-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import socket
77
import unittest
88
import ssl
9-
import sys
109
import tempfile
1110
import shutil
1211
import os.path
@@ -18,8 +17,6 @@
1817
from aiohttp.client import ClientResponse, ClientRequest
1918
from aiohttp.connector import Connection
2019

21-
PY_341 = sys.version_info >= (3, 4, 1)
22-
2320

2421
class TestHttpConnection(unittest.TestCase):
2522

@@ -36,7 +33,6 @@ def tearDown(self):
3633
self.loop.close()
3734
gc.collect()
3835

39-
@unittest.skipUnless(PY_341, "Requires Python 3.4.1+")
4036
def test_del(self):
4137
conn = Connection(
4238
self.connector, self.key, self.request,
@@ -122,7 +118,6 @@ def tearDown(self):
122118
self.loop.close()
123119
gc.collect()
124120

125-
@unittest.skipUnless(PY_341, "Requires Python 3.4.1+")
126121
def test_del(self):
127122
conn = aiohttp.BaseConnector(loop=self.loop)
128123
transp = unittest.mock.Mock()
@@ -144,7 +139,6 @@ def test_del(self):
144139
msg['source_traceback'] = unittest.mock.ANY
145140
exc_handler.assert_called_with(self.loop, msg)
146141

147-
@unittest.skipUnless(PY_341, "Requires Python 3.4.1+")
148142
def test_del_with_scheduled_cleanup(self):
149143
conn = aiohttp.BaseConnector(loop=self.loop, keepalive_timeout=0.01)
150144
transp = unittest.mock.Mock()
@@ -168,7 +162,6 @@ def test_del_with_scheduled_cleanup(self):
168162
msg['source_traceback'] = unittest.mock.ANY
169163
exc_handler.assert_called_with(self.loop, msg)
170164

171-
@unittest.skipUnless(PY_341, "Requires Python 3.4.1+")
172165
def test_del_with_closed_loop(self):
173166
conn = aiohttp.BaseConnector(loop=self.loop)
174167
transp = unittest.mock.Mock()
@@ -188,7 +181,6 @@ def test_del_with_closed_loop(self):
188181
self.assertFalse(transp.close.called)
189182
self.assertTrue(exc_handler.called)
190183

191-
@unittest.skipUnless(PY_341, "Requires Python 3.4.1+")
192184
def test_del_empty_conector(self):
193185
conn = aiohttp.BaseConnector(loop=self.loop)
194186

0 commit comments

Comments
 (0)