diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..4699897 --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 120 +exclude=.venv diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8ce1ece --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: python +python: + -3.7 + +install: + -pip install -r requirements-dev.txt + diff --git a/README.md b/README.md index 7040001..6cb8598 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # API-3.0-Python SDK API-3.0 Python Cielo +[![Build Status](https://travis-ci.org/CharlesTenorio/API-3.0-Python.svg?branch=master)](https://travis-ci.org/CharlesTenorio/API-3.0-Python) diff --git a/cieloApi3/__init__.py b/cieloApi3/__init__.py index 5168708..81b0df2 100644 --- a/cieloApi3/__init__.py +++ b/cieloApi3/__init__.py @@ -1,11 +1,8 @@ from .environment import * from .merchant import * - from .sale import * from .customer import * from .creditCard import * from .payment import * - from .recurrentPayment import * - from .cieloEcommerce import * diff --git a/cieloApi3/address.py b/cieloApi3/address.py index 47292e0..bb4f192 100644 --- a/cieloApi3/address.py +++ b/cieloApi3/address.py @@ -1,4 +1,3 @@ - class Address(object): def __init__(self): diff --git a/cieloApi3/cieloEcommerce.py b/cieloApi3/cieloEcommerce.py index 1767665..53dc44e 100644 --- a/cieloApi3/cieloEcommerce.py +++ b/cieloApi3/cieloEcommerce.py @@ -1,4 +1,3 @@ - from .request.createSale import CreateSale from .request.querySale import QuerySale from .request.updateSale import UpdateSale @@ -7,20 +6,19 @@ from .request.deactivateRecorrency import DeactivateRecorrency from .request.reactivateRecorrency import ReactivateRecorrency + class CieloEcommerce(object): def __init__(self, merchant, environment): - self.environment = environment self.merchant = merchant def create_sale(self, sale): - request = CreateSale(self.merchant, self.environment) return request.execute(sale) - def capture_sale(self, payment_id, amount = None, service_tax_amount = None): + def capture_sale(self, payment_id, amount=None, service_tax_amount=None): request = UpdateSale('capture', self.merchant, self.environment) request.amount = amount @@ -28,7 +26,7 @@ def capture_sale(self, payment_id, amount = None, service_tax_amount = None): return request.execute(payment_id) - def cancel_sale(self, payment_id, amount = None): + def cancel_sale(self, payment_id, amount=None): request = UpdateSale('void', self.merchant, self.environment) request.amount = amount @@ -41,27 +39,21 @@ def get_sale(self, payment_id): return request.execute(payment_id) def create_card_token(self, creditCard): - request = CreateCardToken(self.merchant, self.environment) return request.execute(creditCard) def get_recurrent_payment(self, recurrent_payment_id): - request = QueryRecorrency(self.merchant, self.environment) return request.execute(recurrent_payment_id) def deactivate_recurrent_payment(self, recurrent_payment_id): - request = DeactivateRecorrency(self.merchant, self.environment) return request.execute(recurrent_payment_id) def reactivate_recurrent_payment(self, recurrent_payment_id): - request = ReactivateRecorrency(self.merchant, self.environment) return request.execute(recurrent_payment_id) - - diff --git a/cieloApi3/creditCard.py b/cieloApi3/creditCard.py index 5326f96..a6aa5f4 100644 --- a/cieloApi3/creditCard.py +++ b/cieloApi3/creditCard.py @@ -1,6 +1,6 @@ - from .objectJSON import ObjectJSON + class CreditCard(ObjectJSON): def __init__(self, security_code, brand): diff --git a/cieloApi3/customer.py b/cieloApi3/customer.py index 9df26c5..0ed4afb 100644 --- a/cieloApi3/customer.py +++ b/cieloApi3/customer.py @@ -1,4 +1,3 @@ - class Customer(object): def __init__(self, name): diff --git a/cieloApi3/objectJSON.py b/cieloApi3/objectJSON.py index dc657c5..6cd176e 100644 --- a/cieloApi3/objectJSON.py +++ b/cieloApi3/objectJSON.py @@ -1,4 +1,3 @@ - import json from future.utils import integer_types @@ -38,6 +37,7 @@ def process_name_key(dictionary): return newDictionary + def capitalize_key(key): parts = key.split('_') @@ -47,6 +47,7 @@ def capitalize_key(key): return ''.join(newParts) + def remove_none(dado): if isinstance(dado, dict): @@ -56,6 +57,7 @@ def remove_none(dado): return dado + def remove_none_dict(obj): retorno = {} for chave in obj: @@ -66,6 +68,7 @@ def remove_none_dict(obj): return retorno + def remove_none_list(lista): resposta = [] for linha in lista: diff --git a/cieloApi3/payment.py b/cieloApi3/payment.py index 34eafab..febf3f0 100644 --- a/cieloApi3/payment.py +++ b/cieloApi3/payment.py @@ -1,4 +1,3 @@ - from .objectJSON import ObjectJSON PAYMENTTYPE_CREDITCARD = "CreditCard" @@ -10,9 +9,10 @@ PROVIDER_BANCO_DO_BRASIL = "BancoDoBrasil" PROVIDER_SIMULADO = "Simulado" + class Payment(ObjectJSON): - def __init__(self, amount, installments = 1): + def __init__(self, amount, installments=1): self.amount = amount self.service_tax_amount = None @@ -48,14 +48,13 @@ def __init__(self, amount, installments = 1): self.digitable_line = None self.address = None - #Boleto + # Boleto self.boleto_number = None self.assignor = None self.demonstrative = None self.identification = None self.instructions = None - def prepare(self): if self.credit_card: diff --git a/cieloApi3/recurrentPayment.py b/cieloApi3/recurrentPayment.py index 726317f..de4d8fe 100644 --- a/cieloApi3/recurrentPayment.py +++ b/cieloApi3/recurrentPayment.py @@ -1,10 +1,10 @@ - INTERVAL_MONTHLY = "Monthly" INTERVAL_BIMONTHLY = "Bimonthly" INTERVAL_QUARTERLY = "Quarterly" INTERVAL_SEMIANNUAL = "SemiAnnual" INTERVAL_ANNUAL = "Annual" + class RecurrentPayment(object): def __init__(self, authorize_now=True): diff --git a/cieloApi3/request/base.py b/cieloApi3/request/base.py index 3b8cd4d..da3619c 100644 --- a/cieloApi3/request/base.py +++ b/cieloApi3/request/base.py @@ -1,8 +1,8 @@ import uuid, json - from future.utils import raise_with_traceback from requests import Request, Session + class Base(object): def __init__(self, merchant): @@ -36,7 +36,8 @@ def send_request(self, method, uri, data=None, params=None): response = s.send(prep) - if 'json' in response.headers['Content-Type'].lower(): + if 'json' in response: + response.headers['Content-Type'].lower() answers = response.json() else: answers = [{ @@ -52,6 +53,7 @@ def send_request(self, method, uri, data=None, params=None): data_send = json.loads(body or 'null') - raise_with_traceback(Exception('\r\n%s\r\nMethod: %s\r\nUri: %s\r\nData: %s' % (''.join(errors), method, response.url, json.dumps(data_send, indent=2)))) + raise_with_traceback(Exception('\r\n%s\r\nMethod: %s\r\nUri: %s\r\nData: %s' % ( + ''.join(errors), method, response.url, json.dumps(data_send, indent=2)))) return answers diff --git a/cieloApi3/request/createCardToken.py b/cieloApi3/request/createCardToken.py index 9140b50..e4e1c55 100644 --- a/cieloApi3/request/createCardToken.py +++ b/cieloApi3/request/createCardToken.py @@ -1,6 +1,6 @@ - from .base import Base + class CreateCardToken(Base): def __init__(self, merchant, environment): diff --git a/cieloApi3/request/createSale.py b/cieloApi3/request/createSale.py index 273d6ee..88a56e9 100644 --- a/cieloApi3/request/createSale.py +++ b/cieloApi3/request/createSale.py @@ -1,6 +1,6 @@ - from .base import Base + class CreateSale(Base): def __init__(self, merchant, environment): diff --git a/cieloApi3/request/deactivateRecorrency.py b/cieloApi3/request/deactivateRecorrency.py index b7980d6..122934c 100644 --- a/cieloApi3/request/deactivateRecorrency.py +++ b/cieloApi3/request/deactivateRecorrency.py @@ -1,6 +1,6 @@ - from .base import Base + class DeactivateRecorrency(Base): def __init__(self, merchant, environment): diff --git a/cieloApi3/request/queryRecorrency.py b/cieloApi3/request/queryRecorrency.py index 31b6928..fca777d 100644 --- a/cieloApi3/request/queryRecorrency.py +++ b/cieloApi3/request/queryRecorrency.py @@ -1,6 +1,6 @@ - from .base import Base + class QueryRecorrency(Base): def __init__(self, merchant, environment): diff --git a/cieloApi3/request/querySale.py b/cieloApi3/request/querySale.py index d73f972..9f6d94b 100644 --- a/cieloApi3/request/querySale.py +++ b/cieloApi3/request/querySale.py @@ -1,6 +1,6 @@ - from .base import Base + class QuerySale(Base): def __init__(self, merchant, environment): diff --git a/cieloApi3/request/reactivateRecorrency.py b/cieloApi3/request/reactivateRecorrency.py index c6b0313..ceaf8d3 100644 --- a/cieloApi3/request/reactivateRecorrency.py +++ b/cieloApi3/request/reactivateRecorrency.py @@ -1,6 +1,6 @@ - from .base import Base + class ReactivateRecorrency(Base): def __init__(self, merchant, environment): diff --git a/cieloApi3/request/updateSale.py b/cieloApi3/request/updateSale.py index 41abbb7..c9c639f 100644 --- a/cieloApi3/request/updateSale.py +++ b/cieloApi3/request/updateSale.py @@ -1,6 +1,6 @@ - from .base import Base + class UpdateSale(Base): def __init__(self, type, merchant, environment): diff --git a/cieloApi3/sale.py b/cieloApi3/sale.py index 983e89c..4c864a1 100644 --- a/cieloApi3/sale.py +++ b/cieloApi3/sale.py @@ -1,6 +1,6 @@ - from .objectJSON import ObjectJSON + class Sale(ObjectJSON): def __init__(self, merchant_order_id): diff --git a/example/saleBoletoComplete.py b/example/saleBoletoComplete.py index 3a7ef35..05618fe 100644 --- a/example/saleBoletoComplete.py +++ b/example/saleBoletoComplete.py @@ -1,6 +1,7 @@ -#-*- coding: utf-8 -*-s +# -*- coding: utf-8 -*-s import sys + sys.path.insert(0, "./") from cieloApi3 import * @@ -39,9 +40,9 @@ # Criar a venda e imprime o retorno response_create_sale = cielo_ecommerce.create_sale(sale) -print '----------------------response_create_sale----------------------' -print json.dumps(response_create_sale, indent=2) -print '----------------------response_create_sale----------------------' +print('----------------------response_create_sale----------------------') +print(json.dumps(response_create_sale, indent=2)) +print('----------------------response_create_sale----------------------') # Com a venda criada na Cielo, já temos o ID do pagamento, TID e demais # dados retornados pela Cielo @@ -49,8 +50,8 @@ # Com o ID do pagamento, podemos fazer uma consulta do pagamento response_get_sale = cielo_ecommerce.get_sale(payment_id) -print '----------------------response_get_sale----------------------' -print json.dumps(response_get_sale, indent=2) -print '----------------------response_get_sale----------------------' +print('----------------------response_get_sale----------------------') +print(json.dumps(response_get_sale, indent=2)) +print('----------------------response_get_sale----------------------') -print '\r\nLink Boleto:', sale.payment.url, '\r\n' +print('\r\nLink Boleto:', sale.payment.url, '\r\n') diff --git a/example/saleBoletoSimple.py b/example/saleBoletoSimple.py index e3f4c1d..23c117c 100644 --- a/example/saleBoletoSimple.py +++ b/example/saleBoletoSimple.py @@ -1,6 +1,7 @@ -#-*- coding: utf-8 -*-s +# -*- coding: utf-8 -*-s import sys + sys.path.insert(0, "./") from cieloApi3 import * @@ -30,9 +31,9 @@ # Criar a venda e imprime o retorno response_create_sale = cielo_ecommerce.create_sale(sale) -print '----------------------response_create_sale----------------------' -print json.dumps(response_create_sale, indent=2) -print '----------------------response_create_sale----------------------' +print('----------------------response_create_sale----------------------') +print(json.dumps(response_create_sale, indent=2)) +print('----------------------response_create_sale----------------------') # Com a venda criada na Cielo, já temos o ID do pagamento, TID e demais # dados retornados pela Cielo @@ -40,8 +41,8 @@ # Com o ID do pagamento, podemos fazer uma consulta do pagamento response_get_sale = cielo_ecommerce.get_sale(payment_id) -print '----------------------response_get_sale----------------------' -print json.dumps(response_get_sale, indent=2) -print '----------------------response_get_sale----------------------' +print('----------------------response_get_sale----------------------') +print(json.dumps(response_get_sale, indent=2)) +print('----------------------response_get_sale----------------------') -print '\r\nLink Boleto:', sale.payment.url, '\r\n' +print('\r\nLink Boleto:', sale.payment.url, '\r\n') diff --git a/example/saleCard.py b/example/saleCard.py index 1b5d17e..ee50d36 100644 --- a/example/saleCard.py +++ b/example/saleCard.py @@ -1,11 +1,12 @@ -#-*- coding: utf-8 -*-s - +# -*- coding: utf-8 -*-s import sys -sys.path.insert(0, "./") - +import json from cieloApi3 import * -import json + + +sys.path.insert(0, "./") + # Configure o ambiente environment = Environment(sandbox=True) @@ -35,9 +36,9 @@ # Criar a venda e imprime o retorno response_create_sale = cielo_ecommerce.create_sale(sale) -print '----------------------response_create_sale----------------------' -print json.dumps(response_create_sale, indent=2) -print '----------------------response_create_sale----------------------' +print('----------------------response_create_sale----------------------') +print(json.dumps(response_create_sale, indent=2)) +print('----------------------response_create_sale----------------------') # Com a venda criada na Cielo, já temos o ID do pagamento, TID e demais # dados retornados pela Cielo @@ -46,12 +47,12 @@ # Com o ID do pagamento, podemos fazer sua captura, # se ela não tiver sido capturada ainda response_capture_sale = cielo_ecommerce.capture_sale(payment_id, 15700, 0) -print '----------------------response_capture_sale----------------------' -print json.dumps(response_capture_sale, indent=2) -print '----------------------response_capture_sale----------------------' +print('----------------------response_capture_sale----------------------') +print(json.dumps(response_capture_sale, indent=2)) +print('----------------------response_capture_sale----------------------') # E também podemos fazer seu cancelamento, se for o caso response_cancel_sale = cielo_ecommerce.cancel_sale(payment_id, 15700) -print '---------------------response_cancel_sale---------------------' -print json.dumps(response_cancel_sale, indent=2) -print '---------------------response_cancel_sale---------------------' +print('---------------------response_cancel_sale---------------------') +print(json.dumps(response_cancel_sale, indent=2)) +print('---------------------response_cancel_sale---------------------') diff --git a/example/saleCardRecurring.py b/example/saleCardRecurring.py index 4685495..58fe32e 100644 --- a/example/saleCardRecurring.py +++ b/example/saleCardRecurring.py @@ -1,12 +1,10 @@ -#-*- coding: utf-8 -*-s - +# -*- coding: utf-8 -*-s import sys -sys.path.insert(0, "./") - +import json from cieloApi3 import * -import json +sys.path.insert(0, "./") # Configure o ambiente environment = Environment(sandbox=True) @@ -40,13 +38,9 @@ # Criar a venda e imprime o retorno response_create_sale = cielo_ecommerce.create_sale(sale) -print '----------------------response_create_sale----------------------' -print json.dumps(response_create_sale, indent=2) -print '----------------------response_create_sale----------------------' - - - - +print('----------------------response_create_sale----------------------') +print(json.dumps(response_create_sale, indent=2)) +print('----------------------response_create_sale----------------------') # Com a venda criada na Cielo, já temos o ID do pagamento, TID e demais # dados retornados pela Cielo @@ -55,28 +49,24 @@ # Com o ID do pagamento, podemos fazer sua captura, # se ela não tiver sido capturada ainda response_capture_sale = cielo_ecommerce.capture_sale(payment_id, 15700, 0) -print '----------------------response_capture_sale----------------------' -print json.dumps(response_capture_sale, indent=2) -print '----------------------response_capture_sale----------------------' +print('----------------------response_capture_sale----------------------') +print(json.dumps(response_capture_sale, indent=2)) +print('----------------------response_capture_sale----------------------') # E também podemos fazer seu cancelamento, se for o caso response_cancel_sale = cielo_ecommerce.cancel_sale(payment_id, 15700) -print '---------------------response_cancel_sale---------------------' -print json.dumps(response_cancel_sale, indent=2) -print '---------------------response_cancel_sale---------------------' - - - - +print('---------------------response_cancel_sale---------------------') +print(json.dumps(response_cancel_sale, indent=2)) +print('---------------------response_cancel_sale---------------------') # Com a venda recorrente criada na Cielo, já temos o ID do pagamento recorrente recurrent_payment_id = sale.payment.recurrent_payment.recurrent_payment_id # Consulta informações da venda recorrente response_get_recurrent_payment = cielo_ecommerce.get_recurrent_payment(recurrent_payment_id) -print '---------------------response_get_recurrent_payment---------------------' -print json.dumps(response_get_recurrent_payment, indent=2) -print '---------------------response_get_recurrent_payment---------------------' +print('---------------------response_get_recurrent_payment---------------------') +print(json.dumps(response_get_recurrent_payment, indent=2)) +print('---------------------response_get_recurrent_payment---------------------') # # Desativa uma venda recorrente (Algum erro na API da Cielo, parou de funcionar) # response_deactivate_recurrent_payment = cielo_ecommerce.deactivate_recurrent_payment(recurrent_payment_id) diff --git a/example/saleCardRecurringSchedule.py b/example/saleCardRecurringSchedule.py index a611035..ce7a501 100644 --- a/example/saleCardRecurringSchedule.py +++ b/example/saleCardRecurringSchedule.py @@ -1,6 +1,7 @@ -#-*- coding: utf-8 -*-s +# -*- coding: utf-8 -*-s import sys + sys.path.insert(0, "./") from cieloApi3 import * @@ -41,6 +42,6 @@ # Criar a venda e imprime o retorno response_create_sale = cielo_ecommerce.create_sale(sale) -print '----------------------response_create_sale----------------------' -print json.dumps(response_create_sale, indent=2) -print '----------------------response_create_sale----------------------' +print('----------------------response_create_sale----------------------') +print(json.dumps(response_create_sale, indent=2)) +print('----------------------response_create_sale----------------------') diff --git a/example/saleCardToken.py b/example/saleCardToken.py index 6ca2bf3..3f3f04a 100644 --- a/example/saleCardToken.py +++ b/example/saleCardToken.py @@ -1,6 +1,7 @@ -#-*- coding: utf-8 -*-s +# -*- coding: utf-8 -*-s import sys + sys.path.insert(0, "./") from cieloApi3 import * @@ -26,13 +27,13 @@ # Criar a venda e imprime o retorno response_create_card_token = cielo_ecommerce.create_card_token(credit_card) -print '----------------------response_create_card_token----------------------' -print json.dumps(response_create_card_token, indent=2) -print '----------------------response_create_card_token----------------------' +print('----------------------response_create_card_token----------------------') +print(json.dumps(response_create_card_token, indent=2)) +print('----------------------response_create_card_token----------------------') # Com o cartão gerado token na Cielo, já temos o Token do cartão para uma futura cobrança new_card_token = credit_card.card_token -print 'New Card Token:', new_card_token +print('New Card Token:', new_card_token) # Crie uma instância de Sale informando o ID do pagamento sale = Sale('456') @@ -53,6 +54,6 @@ # Criar a venda e imprime o retorno response_create_sale = cielo_ecommerce.create_sale(sale) -print '----------------------response_create_sale----------------------' -print json.dumps(response_create_sale, indent=2) -print '----------------------response_create_sale----------------------' +print('----------------------response_create_sale----------------------') +print(json.dumps(response_create_sale, indent=2)) +print('----------------------response_create_sale----------------------') diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..2b9fc79 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,6 @@ +entrypoints==0.3 +flake8==3.7.8 +mccabe==0.6.1 +pycodestyle==2.5.0 +pyflakes==2.1.1 +-r requirements.txt diff --git a/requirements.txt b/requirements.txt index 0442a2b..bcd7b6e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,11 @@ appdirs==1.4.3 -future==0.16.0 -packaging==16.8 -pyparsing==2.2.0 -requests==2.13.0 +attrs==19.1.0 +certifi==2019.6.16 +chardet==3.0.4 +future==0.17.1 +idna==2.8 +packaging==19.1 +pyparsing==2.4.2 +requests==2.22.0 +six==1.12.0 +urllib3==1.25.3 diff --git a/setup.py b/setup.py index 759f6c6..b585c7e 100644 --- a/setup.py +++ b/setup.py @@ -19,26 +19,24 @@ settings.update( name='cieloApi3', - version='0.1.5', + version='0.1.7', description='SDK API-3.0 Python Cielo', - author='Thiago Malaquias', - author_email='thiago.malaca@gmail.com', - url='https://github.com/thiago-Malaca/API-3.0-Python', + author='Charles Tenorio da Silva', + author_email='charlestenorios@gmail.com', + url='https://github.com/CharlesTenorio/API-3.0-Python', keywords='api3.0 cielo python sdk ecommerce', packages=find_packages(), install_requires=['requests', 'future'], license='MIT', classifiers=( - # 'Development Status :: 5 - Production/Stable', + # 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'Natural Language :: English', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', - # 'Programming Language :: Python :: 2.5', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Framework :: Pytest', ) )