From bc0d17c04c0624c5223a67b769bd29a78da9a407 Mon Sep 17 00:00:00 2001 From: Jakub Roztocil Date: Sun, 15 Feb 2015 00:36:55 +0100 Subject: [PATCH] Added a PyPy incompatibility workaround. --- httpie/compat.py | 5 ++++- httpie/input.py | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/httpie/compat.py b/httpie/compat.py index eb26c2be..6de02616 100644 --- a/httpie/compat.py +++ b/httpie/compat.py @@ -4,7 +4,10 @@ Python 2.6, 2.7, and 3.x compatibility. """ # Borrow these from requests: # noinspection PyUnresolvedReferences -from requests.compat import is_windows, bytes, str, is_py3, is_py26, is_pypy +from requests.compat import ( + is_windows, bytes, str, + is_py3, is_py26, is_pypy, is_py27 +) try: # pragma: no cover # noinspection PyUnresolvedReferences,PyCompatibility diff --git a/httpie/input.py b/httpie/input.py index 88bc3c87..e21d2a42 100644 --- a/httpie/input.py +++ b/httpie/input.py @@ -8,7 +8,7 @@ import errno import mimetypes import getpass from io import BytesIO -from collections import namedtuple +from collections import namedtuple, Iterable # noinspection PyCompatibility from argparse import ArgumentParser, ArgumentTypeError, ArgumentError @@ -16,7 +16,7 @@ from argparse import ArgumentParser, ArgumentTypeError, ArgumentError # https://github.com/jakubroztocil/httpie/issues/130 from requests.structures import CaseInsensitiveDict -from httpie.compat import OrderedDict, urlsplit, str +from httpie.compat import OrderedDict, urlsplit, str, is_pypy, is_py27 from httpie.sessions import VALID_SESSION_NAME_PATTERN from httpie.utils import load_json_preserve_order @@ -561,6 +561,17 @@ class AuthCredentialsArgType(KeyValueArgType): class RequestItemsDict(OrderedDict): """Multi-value dict for URL parameters and form data.""" + if is_pypy and is_py27: + # Manually set keys when initialized with an iterable as PyPy + # doesn't call __setitem__ in such case (pypy3 does). + def __init__(self, *args, **kwargs): + if len(args) == 1 and isinstance(args[0], Iterable): + super(RequestItemsDict, self).__init__(**kwargs) + for k, v in args[0]: + self[k] = v + else: + super(RequestItemsDict, self).__init__(*args, **kwargs) + #noinspection PyMethodOverriding def __setitem__(self, key, value): """ If `key` is assigned more than once, `self[key]` holds a