Compare commits

..

77 Commits

Author SHA1 Message Date
Kenneth Reitz
16c8241a81 v2.16.5 2017-05-28 00:35:36 -04:00
Kenneth Reitz
1dfa631dae updates to travis ci 2017-05-27 23:54:53 -04:00
Kenneth Reitz
1fa168eea4 tox.ini 2017-05-27 23:52:44 -04:00
Kenneth Reitz
8b5fa606ec improvements to help utility 2017-05-27 23:51:22 -04:00
Kenneth Reitz
148ab30d70 Merge pull request #4083 from kennethreitz/faster-ci
faster ci (test)
2017-05-27 20:37:37 -07:00
Kenneth Reitz
8d0c2537ee better comments 2017-05-27 23:34:56 -04:00
Kenneth Reitz
458008653c detox 2017-05-27 23:33:13 -04:00
Kenneth Reitz
679d368e3e setup.py improvements 2017-05-27 23:27:38 -04:00
Kenneth Reitz
7384fe71d6 let's see what this breaks 2017-05-27 23:22:49 -04:00
Kenneth Reitz
94331723d1 try again 2017-05-27 23:19:59 -04:00
Kenneth Reitz
b565b79858 skip that 2017-05-27 23:14:06 -04:00
Kenneth Reitz
a00d14a61f pytest 2017-05-27 23:11:01 -04:00
Kenneth Reitz
dc70edf17d try this 2017-05-27 23:09:38 -04:00
Kenneth Reitz
68fda6bcf2 see if that fixes things 2017-05-27 23:07:24 -04:00
Kenneth Reitz
141ce93445 test 2017-05-27 23:04:12 -04:00
Kenneth Reitz
6abe1ff933 update 2017-05-27 23:02:45 -04:00
Kenneth Reitz
3d425ac191 try this 2017-05-27 23:00:30 -04:00
Kenneth Reitz
0ff28d7421 faster 2017-05-27 22:57:45 -04:00
Kenneth Reitz
2758b8b0f0 improve speed of travis-ci 2017-05-27 22:56:43 -04:00
Kenneth Reitz
6746b2540d faster 2017-05-27 22:55:22 -04:00
Kenneth Reitz
03944f4cd6 restore old behavior 2017-05-27 20:33:32 -04:00
Kenneth Reitz
4a28ffcfe9 try this 2017-05-27 20:28:30 -04:00
Kenneth Reitz
b6d51d9f2b change test configuration 2017-05-27 20:25:11 -04:00
Kenneth Reitz
2edb553036 so frustrating 2017-05-27 20:23:02 -04:00
Kenneth Reitz
cffa0effe0 remove pytest-mock 2017-05-27 20:21:29 -04:00
Kenneth Reitz
76a66c41d6 final attempt 2017-05-27 20:19:42 -04:00
Kenneth Reitz
19a1379ff5 >=2.7 2017-05-27 20:17:33 -04:00
Kenneth Reitz
057689bb8a grr 2017-05-27 20:16:32 -04:00
Kenneth Reitz
88f28325c9 pytest 2017-05-27 20:15:17 -04:00
Kenneth Reitz
62afdabb30 blah 2017-05-27 20:11:04 -04:00
Kenneth Reitz
2468058fea better requirements 2017-05-27 20:09:58 -04:00
Kenneth Reitz
e4d8571080 concurrency in coverage report 2017-05-27 20:08:08 -04:00
Kenneth Reitz
048997daa0 better requirements 2017-05-27 20:07:35 -04:00
Kenneth Reitz
c166c4f5d4 remove circle.yml 2017-05-27 20:01:08 -04:00
Kenneth Reitz
f4b488b7f8 try removing that 2017-05-27 19:59:19 -04:00
Kenneth Reitz
cd4c701186 xdist 2017-05-27 19:57:40 -04:00
Kenneth Reitz
8e93b100da lets give this a try 2017-05-27 19:44:54 -04:00
Kenneth Reitz
276024b170 fix tests 2017-05-27 19:33:40 -04:00
Kenneth Reitz
6af910610f omg 2017-05-27 19:31:31 -04:00
Kenneth Reitz
1d76cb3572 cleanup tests (make them faster) 2017-05-27 19:30:13 -04:00
Kenneth Reitz
03e5f5daf3 socks needed for tests 2017-05-27 19:16:16 -04:00
Kenneth Reitz
b9a004a22b improvements 2017-05-27 17:25:44 -04:00
Kenneth Reitz
2e67c86075 merge 2017-05-27 17:24:06 -04:00
Kenneth Reitz
f0fb5034fc better headings 2017-05-27 17:14:10 -04:00
Kenneth Reitz
b0c19226c6 simplify 2017-05-27 17:12:50 -04:00
Kenneth Reitz
4e06345988 issue template 2017-05-27 17:09:52 -04:00
Kenneth Reitz
892fbe09f6 issue template 2017-05-27 17:08:50 -04:00
Kenneth Reitz
46a4e731da issue template 2017-05-27 17:07:30 -04:00
Kenneth Reitz
46a930941a issue template 2017-05-27 17:06:37 -04:00
Kenneth Reitz
c6827de846 better template 2017-05-27 17:03:17 -04:00
Kenneth Reitz
5c65f6d01e issue template 2017-05-27 17:01:09 -04:00
Kenneth Reitz
7ce5ca853d Merge pull request #4079 from kennethreitz/help
$ python -m requests.help
2017-05-27 13:58:19 -07:00
Kenneth Reitz
0ae8524e3b v2.16.4 2017-05-27 16:57:50 -04:00
Kenneth Reitz
bf4a813304 rename information/info 2017-05-27 16:50:51 -04:00
Kenneth Reitz
6d082ea972 add info about chardet and urllib3 2017-05-27 16:49:48 -04:00
Kenneth Reitz
f180980b28 Merge branch 'master' into bug-report-info 2017-05-27 13:41:54 -07:00
Kenneth Reitz
a44284c045 cleanup version.py 2017-05-27 12:41:11 -04:00
Kenneth Reitz
c1f32f68f6 v2.16.3 2017-05-27 12:20:34 -04:00
Kenneth Reitz
4c155de9fd test entrypoints 2017-05-27 11:06:53 -04:00
Kenneth Reitz
03dd91093b pep8 fix 2017-05-27 10:57:46 -04:00
Kenneth Reitz
d42556a936 2.16.2 2017-05-27 10:53:02 -04:00
Kenneth Reitz
103718847a v2.16.2 2017-05-27 10:52:47 -04:00
Kenneth Reitz
28666e5d3a vastly simpify making packages available for backwards compatibility 2017-05-27 10:49:57 -04:00
Kenneth Reitz
ecaa10543f fix setup.py 2017-05-27 10:33:10 -04:00
Kenneth Reitz
908c3b01ee restore packages to setup.py 2017-05-27 10:32:56 -04:00
Kenneth Reitz
c952e9e4e0 addded import stubs for urllib3 2017-05-27 10:29:00 -04:00
Kenneth Reitz
cceceecb68 fix history 2017-05-27 10:11:18 -04:00
Kenneth Reitz
e9ca4b39b4 more history 2017-05-27 10:09:57 -04:00
Kenneth Reitz
7962c12451 more history notes 2017-05-27 10:09:03 -04:00
Kenneth Reitz
f687e9f3d8 history 2017-05-27 09:58:37 -04:00
Kenneth Reitz
dc24bc3217 Merge branch 'master' of github.com:kennethreitz/requests 2017-05-27 09:37:17 -04:00
Kenneth Reitz
267ec2f9c3 restore package namespace 2017-05-27 09:37:09 -04:00
Kenneth Reitz
18c8924f14 better checking for urllib3 2017-05-27 09:37:02 -04:00
Kenneth Reitz
413f2a557c Update index.rst 2017-05-27 00:29:54 -04:00
Kenneth Reitz
04faf59f49 Update README.rst 2017-05-27 00:28:48 -04:00
Ian Cordasco
567e12bfb8 Add debugging submodule for bug reporters
The suggested usage in a bug report would be

    python -c 'from requests import _bug; _bug.print_information()'

This should generate most of the information we tend to ask for
repeatedly from bug reporters.
2017-03-23 07:22:55 -05:00
Gary Wu
21972c4601 fix #3902 Add proposed documentation change for post data 2017-03-01 13:04:11 -06:00
19 changed files with 270 additions and 165 deletions

28
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,28 @@
Summary.
## Expected Result
What you expected.
## Actual Result
What happened instead.
## Reproduction Steps
```python
import requests
```
## System Information
$ python -m requests.help
```
<paste here>
```
This command is only available on Requests v2.16.4 and greater. Otherwise,
please provide some basic information about your system (Python version,
operating system, &c).

1
.gitignore vendored
View File

@@ -5,7 +5,6 @@ nosetests.xml
junit-report.xml
pylint.txt
toy.py
tox.ini
cover/
build/
docs/_build

View File

@@ -7,7 +7,7 @@ python:
- "3.4"
- "3.5"
- "3.6"
- "3.7-dev"
# - "3.7-dev"
# - "pypy" -- appears to hang
# - "pypy3"
# command to install dependencies
@@ -16,7 +16,7 @@ install: "make"
script:
- |
if [[ "$TRAVIS_PYTHON_VERSION" != "2.6" ]] ; then make test-readme; fi
- make coverage
- make ci
after_success:
- pipenv run codecov
cache: pip

View File

@@ -181,3 +181,4 @@ Patches and Suggestions
- Jonathan Vanasco (`@jvanasco <https://github.com/jvanasco>`_)
- David Fontenot (`@davidfontenot <https://github.com/davidfontenot>`_)
- Shmuel Amar (`@shmuelamar <https://github.com/shmuelamar>`_)
- Gary Wu (`@garywu <https://github.com/garywu>`_)

View File

@@ -3,6 +3,51 @@
Release History
---------------
2.16.5 (2017-05-28)
+++++++++++++++++++
- Improvements to ``$ python -m requests.help``.
2.16.4 (2017-05-27)
+++++++++++++++++++
- Introduction of the ``$ python -m requests.help`` command, for debugging with maintainers!
2.16.3 (2017-05-27)
+++++++++++++++++++
- Further restored the ``requests.packages`` namespace for compatibility reasons.
2.16.2 (2017-05-27)
+++++++++++++++++++
- Further restored the ``requests.packages`` namespace for compatibility reasons.
No code modification (noted below) should be neccessary any longer.
2.16.1 (2017-05-27)
+++++++++++++++++++
- Restored the ``requests.packages`` namespace for compatibility reasons.
- Bugfix for ``urllib3`` version parsing.
**Note**: code that was written to import against the ``requests.packages``
namespace previously will have to import code that rests at this module-level
now.
For example::
from requests.packages.urllib3.poolmanager import PoolManager
Will need to be re-written to be::
from requests.packages import urllib3
urllib3.poolmanager.PoolManager
Or, even better::
from urllib3.poolmanager import PoolManager
2.16.0 (2017-05-26)
+++++++++++++++++++

View File

@@ -1,23 +1,17 @@
.PHONY: docs
init:
pip install pipenv
pipenv install --dev
pipenv run pip install -e .[socks]
pip install -r requirements.txt
test:
# This runs all of the tests. To run an individual test, run py.test with
# the -k flag, like "py.test -k test_path_is_not_double_encoded"
pipenv run py.test tests
# This runs all of the tests, on both Python 2 and Python 3.
detox
ci:
python setup.py test
test-readme:
pipenv run python setup.py check -r -s
python setup.py check -r -s
coverage:
pipenv run py.test --cov-config .coveragerc --verbose --cov-report term --cov-report xml --cov=requests tests
certs:
curl http://ci.kennethreitz.org/job/ca-bundle/lastSuccessfulBuild/artifact/cacerts.pem -o requests/cacert.pem
py.test --cov-config .coveragerc --verbose --cov-report term --cov-report xml --cov=requests tests
publish:
pip install 'twine>=1.5.0'

14
Pipfile
View File

@@ -1,14 +0,0 @@
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
[dev-packages]
pytest = ">=2.8.0"
codecov = "*"
pytest-httpbin = "==0.0.7"
pytest-mock = "*"
pytest-cov = "*"
alabaster = "*"
readme_renderer = "*"
Sphinx = "<=1.5.5"
PySocks = "*"

116
Pipfile.lock generated
View File

@@ -1,116 +0,0 @@
{
"_meta": {
"hash": {
"sha256": "a26ef57f42fa3da7d70d1c1decb4e6445a6ff66e47c9094ddc9ab8e1f4c0a5b6"
},
"requires": {},
"sources": [
{
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
},
"default": {},
"develop": {
"alabaster": {
"version": "==0.7.10"
},
"appdirs": {
"version": "==1.4.3"
},
"babel": {
"version": "==2.4.0"
},
"click": {
"version": "==6.7"
},
"codecov": {
"version": "==2.0.9"
},
"coverage": {
"version": "==4.4.1"
},
"decorator": {
"version": "==4.0.11"
},
"docutils": {
"version": "==0.13.1"
},
"flask": {
"version": "==0.12.2"
},
"funcsigs": {
"version": "==1.0.2"
},
"httpbin": {
"version": "==0.5.0"
},
"imagesize": {
"version": "==0.7.1"
},
"itsdangerous": {
"version": "==0.24"
},
"jinja2": {
"version": "==2.9.6"
},
"markupsafe": {
"version": "==1.0"
},
"mock": {
"version": "==2.0.0"
},
"packaging": {
"version": "==16.8"
},
"pbr": {
"version": "==3.0.0"
},
"py": {
"version": "==1.4.33"
},
"pygments": {
"version": "==2.2.0"
},
"pyparsing": {
"version": "==2.2.0"
},
"pysocks": {
"version": "==1.6.7"
},
"pytest": {
"version": "==3.0.7"
},
"pytest-cov": {
"version": "==2.5.1"
},
"pytest-httpbin": {
"version": "==0.0.7"
},
"pytest-mock": {
"version": "==1.6.0"
},
"pytz": {
"version": "==2017.2"
},
"requests": {
"version": "==2.14.2"
},
"setuptools": {
"version": "==35.0.2"
},
"six": {
"version": "==1.10.0"
},
"snowballstemmer": {
"version": "==1.2.1"
},
"sphinx": {
"version": "==1.5.5"
},
"werkzeug": {
"version": "==0.12.2"
}
}
}

View File

@@ -57,8 +57,7 @@ See `the similar code, sans Requests <https://gist.github.com/973705>`_.
Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, without the
need for manual labor. There's no need to manually add query strings to your
URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling
are 100% automatic, powered by `urllib3 <https://github.com/shazow/urllib3>`_,
which is embedded within Requests.
are 100% automatic, thanks to `urllib3 <https://github.com/shazow/urllib3>`_.
Besides, all the cool kids are doing it. Requests is one of the most
downloaded Python packages of all time, pulling in over 11,000,000 downloads

View File

@@ -57,8 +57,7 @@ See `similar code, sans Requests <https://gist.github.com/973705>`_.
**Requests** allows you to send *organic, grass-fed* HTTP/1.1 requests, without the
need for manual labor. There's no need to manually add query strings to your
URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling
are 100% automatic, powered by `urllib3 <https://github.com/shazow/urllib3>`_,
which is embedded within Requests.
are 100% automatic, thanks to `urllib3 <https://github.com/shazow/urllib3>`_.
User Testimonials
-----------------

View File

@@ -234,7 +234,24 @@ dictionary of data will automatically be form-encoded when the request is made::
...
}
There are many times that you want to send data that is not form-encoded. If
You can also pass a list of tuples to the ``data`` argument. This is particularly
useful when the form has multiple elements that use the same key::
>>> payload = (('key1', 'value1'), ('key1', 'value2'))
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> print(r.text)
{
...
"form": {
"key1": [
"value1",
"value2"
]
},
...
}
There are times that you may want to send data that is not form-encoded. If
you pass in a ``string`` instead of a ``dict``, that data will be posted directly.
For example, the GitHub API v3 accepts JSON-Encoded POST/PATCH data::
@@ -485,7 +502,7 @@ Timeouts
--------
You can tell Requests to stop waiting for a response after a given number of
seconds with the ``timeout`` parameter. Nearly all production code should use
seconds with the ``timeout`` parameter. Nearly all production code should use
this parameter in nearly all requests. Failure to do so can cause your program
to hang indefinitely::

View File

@@ -46,7 +46,11 @@ from .__version__ import __copyright__, __cake__
# Check urllib3 for compatibility.
import urllib3
major, minor, patch = urllib3.__version__.split('.')[:3]
urllib3_version = urllib3.__version__.split('.')
# Sometimes, urllib3 only reports its version as 16.1.
if len(urllib3_version) == 2:
urllib3_version.append('0')
major, minor, patch = urllib3_version
major, minor, patch = int(major), int(minor), int(patch)
# urllib3 >= 1.21.1, < 1.22
try:
@@ -83,6 +87,7 @@ from urllib3.exceptions import DependencyWarning
warnings.simplefilter('ignore', DependencyWarning)
from . import utils
from . import packages
from .models import Request, Response, PreparedRequest
from .api import request, get, head, post, patch, put, delete, options
from .sessions import session, Session

View File

@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
# .-. .-. .-. . . .-. .-. .-. .-.
# |( |- |.| | | |- `-. | `-.
# ' ' `-' `-`.`-' `-' `-' ' `-'
@@ -7,10 +5,12 @@
__title__ = 'requests'
__description__ = 'Python HTTP for Humans.'
__url__ = 'http://python-requests.org'
__version__ = '2.16.0'
__build__ = 0x021600
__version__ = '2.16.5'
__build__ = 0x021605
__author__ = 'Kenneth Reitz'
__author_email__ = 'me@kennethreitz.org'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2017 Kenneth Reitz'
__cake__ = u'✨ 🍰 ✨'
__cake__ = u'\u2728 \U0001f370 \u2728'

110
requests/help.py Normal file
View File

@@ -0,0 +1,110 @@
"""Module containing bug report helper(s)."""
from __future__ import print_function
import json
import platform
import sys
import ssl
import urllib3
import chardet
from . import __version__ as requests_version
try:
from .packages.urllib3.contrib import pyopenssl
except ImportError:
pyopenssl = None
OpenSSL = None
cryptography = None
else:
import OpenSSL
import cryptography
def _implementation():
"""Return a dict with the Python implementation and verison.
Provide both the name and the version of the Python implementation
currently running. For example, on CPython 2.7.5 it will return
{'name': 'CPython', 'version': '2.7.5'}.
This function works best on CPython and PyPy: in particular, it probably
doesn't work for Jython or IronPython. Future investigation should be done
to work out the correct shape of the code for those platforms.
"""
implementation = platform.python_implementation()
if implementation == 'CPython':
implementation_version = platform.python_version()
elif implementation == 'PyPy':
implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major,
sys.pypy_version_info.minor,
sys.pypy_version_info.micro)
if sys.pypy_version_info.releaselevel != 'final':
implementation_version = ''.join([
implementation_version, sys.pypy_version_info.releaselevel
])
elif implementation == 'Jython':
implementation_version = platform.python_version() # Complete Guess
elif implementation == 'IronPython':
implementation_version = platform.python_version() # Complete Guess
else:
implementation_version = 'Unknown'
return {'name': implementation, 'version': implementation_version}
def info():
"""Generate information for a bug report."""
try:
platform_info = {
'system': platform.system(),
'release': platform.release(),
}
except IOError:
platform_info = {
'system': 'Unknown',
'release': 'Unknown',
}
implementation_info = _implementation()
urllib3_info = {'version': urllib3.__version__}
chardet_info = {'version': chardet.__version__}
pyopenssl_info = {
'version': None,
'openssl_version': '',
}
if OpenSSL:
pyopenssl_info = {
'version': OpenSSL.__version__,
'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER,
}
cryptography_info = {
'version': getattr(cryptography, '__version__', ''),
}
return {
'platform': platform_info,
'implementation': implementation_info,
'system_ssl': {
'version': '%x' % ssl.OPENSSL_VERSION_NUMBER,
},
'using_pyopenssl': pyopenssl is not None,
'pyOpenSSL': pyopenssl_info,
'urllib3': urllib3_info,
'chardet': chardet_info,
'cryptography': cryptography_info,
'requests': {
'version': requests_version,
},
}
def main():
"""Pretty-print the bug information as JSON."""
print(json.dumps(info(), sort_keys=True, indent=2))
if __name__ == '__main__':
main()

15
requests/packages.py Normal file
View File

@@ -0,0 +1,15 @@
import sys
# This code exists for backwards compatibility reasons.
# I don't like it either. Just look the other way. :)
import urllib3
sys.modules['requests.packages.urllib3'] = urllib3
import idna
sys.modules['requests.packages.idna'] = idna
import chardet
sys.modules['requests.packages.chardet'] = chardet
# Kinda cool, though, right?

View File

@@ -1 +1,14 @@
-e .
-e .[socks]
pytest>=2.8.0
codecov
pytest-httpbin==0.0.7
pytest-mock
pytest-cov
pytest-xdist
alabaster
readme_renderer
Sphinx<=1.5.5
PySocks
setuptools>=18.5
tox
detox

View File

@@ -16,7 +16,7 @@ class PyTest(TestCommand):
def initialize_options(self):
TestCommand.initialize_options(self)
self.pytest_args = []
self.pytest_args = ['-n', '8', '--boxed']
def finalize_options(self):
TestCommand.finalize_options(self)
@@ -44,10 +44,10 @@ requires = [
'certifi>=2017.4.17'
]
test_requirements = ['pytest>=2.8.0', 'pytest-httpbin==0.0.7', 'pytest-cov', 'pytest-mock']
test_requirements = ['pytest-httpbin==0.0.7', 'pytest-cov', 'pytest-mock', 'pytest-xdist', 'PySocks>=1.5.6, !=1.5.7', 'pytest>=2.8.0']
about = {}
with open(os.path.join(here, 'requests', '__version__.py')) as f:
with open(os.path.join(here, 'requests', '__version__.py'), 'r', 'utf-8') as f:
exec(f.read(), about)
with open('README.rst', 'r', 'utf-8') as f:

View File

@@ -65,6 +65,8 @@ class TestRequests:
requests.put
requests.patch
requests.post
# Not really an entry point, but people rely on it.
from requests.packages.urllib3.poolmanager import PoolManager
@pytest.mark.parametrize(
'exception, url', (
@@ -633,7 +635,7 @@ class TestRequests:
post1 = requests.post(url, data={'some': 'data'})
assert post1.status_code == 200
with open('Pipfile') as f:
with open('requirements.txt') as f:
post2 = requests.post(url, files={'some': f})
assert post2.status_code == 200
@@ -693,7 +695,7 @@ class TestRequests:
post1 = requests.post(url, data={'some': 'data'})
assert post1.status_code == 200
with open('Pipfile') as f:
with open('requirements.txt') as f:
post2 = requests.post(url, data={'some': 'data'}, files={'some': f})
assert post2.status_code == 200
@@ -730,7 +732,7 @@ class TestRequests:
def test_conflicting_post_params(self, httpbin):
url = httpbin('post')
with open('Pipfile') as f:
with open('requirements.txt') as f:
pytest.raises(ValueError, "requests.post(url, data='[{\"some\": \"data\"}]', files={'some': f})")
pytest.raises(ValueError, "requests.post(url, data=u('[{\"some\": \"data\"}]'), files={'some': f})")

8
tox.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py26,py27,py33,py34,py35,py36
[testenv]
commands =
pip install -e .[socks]
python setup.py test