Source code for pymws.utils

import csv
import base64
from collections import namedtuple
import hashlib

from io import BytesIO
from builtins import str

from .exceptions import MWSException


Marketplace = namedtuple(
    'Marketplace', ['code', 'currency', 'id', 'endpoint', 'name']
)

#: A list of `Marketplaces
#: <http://docs.developer.amazonservices.com/en_US/dev_guide/DG_Endpoints.html>`_
MARKETPLACES = [

    # North america region
    Marketplace(
        'BR', 'BRL', 'A2Q3Y263D00KWC',
        'https://mws.amazonservices.com', 'Amazon.com.br'),
    Marketplace(
        'CA', 'CAD', 'A2EUQ1WTGCTBG2',
        'https://mws.amazonservices.ca', 'Amazon.ca'),
    Marketplace(
        'MX', 'MXN', 'A1AM78C64UM0Y8',
        'https://mws.amazonservices.com.mx', 'Amazon.com.mx'),
    Marketplace(
        'US', 'USD', 'ATVPDKIKX0DER',
        'https://mws.amazonservices.com', 'Amazon.com'),

    # Europe region
    Marketplace(
        'AE', 'AED', 'A2VIGQ35RCS4UG',
        'https://mws.amazonservices.ae', 'United Arab Emirates (U.A.E.)'),
    Marketplace(
        'DE', 'EUR', 'A1PA6795UKMFR9',
        'https://mws-eu.amazonservices.com', 'Amazon.de'),
    Marketplace(
        'EG', 'EGP', 'ARBP9OOSHTCHU',
        'https://mws-eu.amazonservices.com', 'Egypt'),
    Marketplace(
        'ES', 'EUR', 'A1RKKUPIHCS9HS',
        'https://mws-eu.amazonservices.com', 'Amazon.es'),
    Marketplace(
        'FR', 'EUR', 'A13V1IB3VIYZZH',
        'https://mws-eu.amazonservices.com', 'Amazon.fr'),
    Marketplace(
        'GB', 'GBP', 'A1F83G8C2ARO7P',
        'https://mws-eu.amazonservices.com', 'Amazon.co.uk'),
    Marketplace(
        'IN', 'INR', 'A21TJRUUN4KGV',
        'https://mws.amazonservices.in', 'Amazon.in'),
    Marketplace(
        'IT', 'EUR', 'APJ6JRA9NG5V4',
        'https://mws-eu.amazonservices.com', 'Amazon.it'),
    Marketplace(
        'NL', 'EUR', 'A1805IZSGTT6HS',
        'https://mws-eu.amazonservices.com', 'Amazon.nl'),
    Marketplace(
        'SA', 'SAR', 'A17E79C6D8DWNP',
        'https://mws-eu.amazonservices.com', 'Saudi Arabia'),
    Marketplace(
        'TR', 'EUR', 'A33AVAJ2PDY3EV',
        'https://mws-eu.amazonservices.com', 'Turkey'),

    # Far East region
    Marketplace(
        'SG', 'SGD', 'A19VAU5U5O7RUS',
        'https://mws-fe.amazonservices.com', 'Amazon.sg'),
    Marketplace(
        'AU', 'AUD', 'A39IBJ37TRP1C6',
        'https://mws.amazonservices.com.au', 'Amazon.com.au'),
    Marketplace(
        'JP', 'JPY', 'A1VC38T7YXB528',
        'https://mws.amazonservices.jp', 'Amazon.jp'),

]


[docs]def get_marketplace(id_or_code): """ Given a code, get the marketplace """ id_or_code = id_or_code.upper() for marketplace in MARKETPLACES: if marketplace.code == id_or_code or \ marketplace.id == id_or_code: return marketplace raise MWSException( '{} is not a valid marketplace id or code'.format(id_or_code) )
[docs]def flatten_list(kwargs, key, separator): """ Convert a list into URL parameters the way amazon like it. Example:: flatten_list( {'ReportTypeList': ['_A_', '_B_']}, 'ReportTypeList', 'Type' ) Becomes:: ReportTypeList.Type.1=_A_&ReportTypeList.Type.2=_B_ """ vals = kwargs.pop(key, []) for index, value in enumerate(vals, 1): subkey = '{}.{}.{}'.format(key, separator, index) kwargs[subkey] = value if isinstance(value, dict): flatten_dict(kwargs, subkey)
[docs]def flatten_dict(kwargs, key): """ Convert a dict into URL parameters the way amazon like it. Example:: flatten_dict( {'DestinationAddress': {'Name': 'John', 'Country': 'US'}}, 'DestinationAddress', ) Becomes:: DestinationAddress.Name=John&DestinationAddress.Country=US """ vals = kwargs.pop(key, {}) for subkey, value in vals.items(): kwargs['{}.{}'.format(key, subkey)] = value
[docs]def parse_xsv(text): """ Python 2 and 3 compatible (X)SV - CSV/TSV parser that returns a list of dictionary objects. """ header = BytesIO(text.encode("utf-8")).readline().decode("utf-8") dialect = csv.Sniffer().sniff(header) return list( csv.DictReader( text.split("\n"), delimiter=dialect.delimiter, quotechar='•', ) )
def get_md5_hash(string): hasher = hashlib.md5() if isinstance(string, str): hasher.update(string.encode('utf-8')) else: hasher.update(string) return base64.b64encode( hasher.digest() ).decode('utf-8')