ecommerce-client 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/README.md +25 -2
- data/ecommerce-client.gemspec +1 -0
- data/lib/ecommerce.rb +5 -0
- data/lib/ecommerce/attribute_handler.rb +1 -1
- data/lib/ecommerce/resources/account_order.rb +26 -0
- data/lib/ecommerce/resources/collection.rb +57 -0
- data/lib/ecommerce/resources/invoice_order.rb +52 -0
- data/lib/ecommerce/resources/invoice_order_collection.rb +20 -0
- data/lib/ecommerce/resources/invoice_plan.rb +27 -0
- data/lib/ecommerce/resources/order.rb +18 -13
- data/lib/ecommerce/resources/order_collection.rb +6 -48
- data/lib/ecommerce/version.rb +1 -1
- data/spec/ecommerce/attribute_handler_spec.rb +24 -0
- data/spec/ecommerce/resources/account_order_spec.rb +24 -0
- data/spec/ecommerce/resources/collection_spec.rb +70 -0
- data/spec/ecommerce/resources/invoice_order_collection_spec.rb +20 -0
- data/spec/ecommerce/resources/invoice_order_spec.rb +54 -0
- data/spec/ecommerce/resources/invoice_plan_spec.rb +23 -0
- data/spec/ecommerce/resources/order_collection_spec.rb +7 -69
- data/spec/ecommerce/resources/order_spec.rb +46 -5
- data/spec/spec_helper.rb +3 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_AccountOrder_find_all_when_not_found_raises_NotFound.yml +219 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_AccountOrder_find_all_when_success_returns_a_find_all_of_orders.yml +297 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_InvoiceOrder_find_all_when_not_found_raises_NotFound.yml +30 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_InvoiceOrder_find_all_when_success_returns_a_find_all_of_orders.yml +73 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_InvoiceOrder_find_when_not_found_raises_NotFound.yml +46 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_InvoiceOrder_find_when_success_returns_order_object.yml +59 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_InvoicePlan_find_all_when_not_found_raises_NotFound.yml +46 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_InvoicePlan_find_all_when_success_returns_a_find_all_of_orders.yml +63 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_Order_update_when_sending_not_all_required_parameters_raises_error_BarRequ.yml +49 -0
- data/spec/vcr_cassettes/Ecommerce/Resources_Order_update_with_success_returns_order_information_on_body.yml +61 -0
- metadata +52 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 372faf95c34b3244ee4aa37429bf146c59df0541
|
4
|
+
data.tar.gz: a86671860634547190e26e59d38935ec23949cad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5af1bcf38deac81ff229e0e654446d9d4c658ca849b47a096c1c5fe8826bd9b843b9c300cfb71eac6f5a471853c4141191628cca22078bc525869534d5a58ead
|
7
|
+
data.tar.gz: f32b025ac5266fd9873bf7512ea7d05541ef6fae88810ea6645f291d63aa28ec61968f6ad598e9c69e4be761a2336e963dec921f8310f9fa182e7ca5f5241e93
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
+
[](http://badge.fury.io/rb/ecommerce-client)
|
2
|
+
[](https://travis-ci.org/myfreecomm/ecommerce-client-ruby)
|
3
|
+
[](https://codeclimate.com/github/myfreecomm/ecommerce-client-ruby)
|
4
|
+
[](https://codeclimate.com/github/myfreecomm/ecommerce-client-ruby)
|
5
|
+
[](http://inch-ci.org/github/myfreecomm/ecommerce-client-ruby)
|
6
|
+
|
1
7
|
# Ecommerce Client
|
2
8
|
|
3
|
-
A Ruby client for Myfreecomm's Ecommerce REST API
|
9
|
+
A Ruby client for [Myfreecomm's Ecommerce REST API](http://myfreecomm.github.io/passaporte-web/ecommerce/api/index.html).
|
4
10
|
|
5
11
|
## Installation
|
6
12
|
|
@@ -16,9 +22,26 @@ Or install it yourself as:
|
|
16
22
|
|
17
23
|
$ gem install ecommerce-client
|
18
24
|
|
25
|
+
## Configuration
|
26
|
+
|
27
|
+
To access the Ecommerce API, you must provide the *token* and the *secret*:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
Ecommerce.configuration do |config|
|
31
|
+
config.token = 'YOUR-TOKEN'
|
32
|
+
config.secret = 'YOUR-SECRET'
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
19
36
|
## Usage
|
20
37
|
|
21
|
-
|
38
|
+
Ecommerce endpoints are represented as Resources. To check the list of all available Resources, please visit [Ecommerce::Resources](https://github.com/myfreecomm/ecommerce-client-ruby/tree/master/lib/ecommerce/resources) module folder.
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
# listing orders of a plan
|
42
|
+
Ecommerce::Resources::Order.find_all('specific-plan')
|
43
|
+
=> #<Ecommerce::Resources::OrderCollection:0x000000028739b0...>
|
44
|
+
```
|
22
45
|
|
23
46
|
## Contributing
|
24
47
|
|
data/ecommerce-client.gemspec
CHANGED
@@ -26,4 +26,5 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency 'rspec', "~> 3.2"
|
27
27
|
spec.add_development_dependency "pry", "~> 0.10"
|
28
28
|
spec.add_development_dependency "vcr", "~> 2.9"
|
29
|
+
spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
|
29
30
|
end
|
data/lib/ecommerce.rb
CHANGED
@@ -7,8 +7,13 @@ require "ecommerce/client"
|
|
7
7
|
require "ecommerce/attribute_handler"
|
8
8
|
|
9
9
|
require "ecommerce/resources/base"
|
10
|
+
require "ecommerce/resources/collection"
|
11
|
+
require "ecommerce/resources/account_order"
|
10
12
|
require "ecommerce/resources/order"
|
11
13
|
require "ecommerce/resources/order_collection"
|
14
|
+
require "ecommerce/resources/invoice_order"
|
15
|
+
require "ecommerce/resources/invoice_order_collection"
|
16
|
+
require "ecommerce/resources/invoice_plan"
|
12
17
|
|
13
18
|
module Ecommerce
|
14
19
|
def self.configuration
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ecommerce
|
2
|
+
module Resources
|
3
|
+
#
|
4
|
+
# A wrapper to Ecommerce orders API
|
5
|
+
#
|
6
|
+
# [API]
|
7
|
+
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/index.html
|
8
|
+
#
|
9
|
+
class AccountOrder < Base
|
10
|
+
#
|
11
|
+
# Lists all Orders of an account and return a collection with orders and pagination information (represented by Ecommerce::Resources::Collection)
|
12
|
+
#
|
13
|
+
# [API]
|
14
|
+
# Method: <tt>GET /api/accounts/:account_uuid/orders/</tt>
|
15
|
+
#
|
16
|
+
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#listagem-das-ordens-de-compra-de-uma-conta
|
17
|
+
#
|
18
|
+
def self.find_all(account_uuid, page = 1, limit = 20)
|
19
|
+
body = { page: page, limit: limit }
|
20
|
+
client.get("/api/accounts/#{account_uuid}/orders/", body: body) do |response|
|
21
|
+
Ecommerce::Resources::OrderCollection.build(response)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Ecommerce
|
2
|
+
module Resources
|
3
|
+
#
|
4
|
+
# A wrapper to Ecommerce collection returns from API. This wrapper represents a collection and it's responsible for processing pagination information as well.
|
5
|
+
#
|
6
|
+
class Collection < Base
|
7
|
+
PAGE_REGEX = /page=(\d+)/
|
8
|
+
|
9
|
+
attr_reader :response, :collection, :headers
|
10
|
+
|
11
|
+
def initialize(response)
|
12
|
+
@response = response
|
13
|
+
@collection = []
|
14
|
+
@headers = response.headers['Link'].split(',')
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.build(response)
|
18
|
+
self.new(response).build
|
19
|
+
end
|
20
|
+
|
21
|
+
def build
|
22
|
+
build_collection
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def next_page
|
27
|
+
page_for(:next)
|
28
|
+
end
|
29
|
+
|
30
|
+
def last_page
|
31
|
+
page_for(:last)
|
32
|
+
end
|
33
|
+
|
34
|
+
def previous_page
|
35
|
+
page_for(:prev)
|
36
|
+
end
|
37
|
+
|
38
|
+
def first_page
|
39
|
+
page_for(:first)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def page_for(page_rel)
|
45
|
+
header_link_for(page_rel).match(PAGE_REGEX)[1].to_i rescue nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def header_link_for(rel)
|
49
|
+
headers.select{|n| n =~ /rel=#{rel}/}.first
|
50
|
+
end
|
51
|
+
|
52
|
+
def build_collection
|
53
|
+
raise NotImplementedError
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Ecommerce
|
2
|
+
module Resources
|
3
|
+
#
|
4
|
+
# A wrapper to Ecommerce orders invoice API
|
5
|
+
#
|
6
|
+
# [API]
|
7
|
+
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/index.html
|
8
|
+
#
|
9
|
+
class InvoiceOrder < Base
|
10
|
+
attr_reader :redeemed_adjustments, :order_url, :url, :created_at, :activated_at, :number, :user_data,
|
11
|
+
:amount_with_adjustments, :amount, :paid, :payment_method, :plan_data, :charge_date,
|
12
|
+
:next_payment_date
|
13
|
+
|
14
|
+
#
|
15
|
+
# Lists all invoice of an orders and return a collection of invoice with
|
16
|
+
# pagination information (represented by Ecommerce::Resources::InvoiceOrderCollection)
|
17
|
+
#
|
18
|
+
# [API]
|
19
|
+
# Method: <tt>GET /api/orders/:slug/:id/invoices/ </tt>
|
20
|
+
#
|
21
|
+
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#listagem-das-ordens-de-compra-de-uma-conta
|
22
|
+
#
|
23
|
+
def self.find_all(order_id, slug, page = 1, limit = 20)
|
24
|
+
body = { page: page, limit: limit }
|
25
|
+
client.get("/api/orders/#{slug}/#{order_id}/invoices/", body: body) do |response|
|
26
|
+
Ecommerce::Resources::InvoiceOrderCollection.build(response)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Finds an invoice of an order
|
32
|
+
#
|
33
|
+
# [API]
|
34
|
+
# Method: <tt>GET /api/orders/:slug/:order_id/invoices/:id/</tt>
|
35
|
+
#
|
36
|
+
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#listagem-das-ordens-de-compra-de-uma-conta
|
37
|
+
#
|
38
|
+
def self.find(invoice_order_id, order_id, slug)
|
39
|
+
client.get("/api/orders/#{slug}/#{order_id}/invoices/#{invoice_order_id}/") do |response|
|
40
|
+
build_invoice(response)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def self.build_invoice(response)
|
47
|
+
invoice_attributes = parsed_body(response)
|
48
|
+
invoice_attributes.empty? ? {} : new(invoice_attributes)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ecommerce
|
2
|
+
module Resources
|
3
|
+
#
|
4
|
+
# A wrapper to Ecommerce orders API.
|
5
|
+
#
|
6
|
+
class InvoiceOrderCollection < Collection
|
7
|
+
def orders
|
8
|
+
collection
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def build_collection
|
14
|
+
Ecommerce::Resources::Base.parsed_body(response).each do |invoice_attributes|
|
15
|
+
collection.push(Ecommerce::Resources::InvoiceOrder.new(invoice_attributes))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ecommerce
|
2
|
+
module Resources
|
3
|
+
#
|
4
|
+
# A wrapper to Ecommerce invoice per plan API
|
5
|
+
#
|
6
|
+
# [API]
|
7
|
+
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/index.html
|
8
|
+
#
|
9
|
+
class InvoicePlan < Base
|
10
|
+
#
|
11
|
+
# Lists all paid invoices of a plan and return a collection of invoice with
|
12
|
+
# pagination information (represented by Ecommerce::Resources::InvoiceOrderCollection)
|
13
|
+
#
|
14
|
+
# [API]
|
15
|
+
# Method: <tt>GET /api/:slug/invoices/paid/
|
16
|
+
#
|
17
|
+
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#listagem-das-faturas-pagas-para-um-plano
|
18
|
+
#
|
19
|
+
def self.find_all(slug, page = 1, limit = 20)
|
20
|
+
body = { page: page, limit: limit }
|
21
|
+
client.get("/api/#{slug}/invoices/paid/", body: body) do |response|
|
22
|
+
Ecommerce::Resources::InvoiceOrderCollection.build(response)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,15 +1,12 @@
|
|
1
1
|
module Ecommerce
|
2
2
|
module Resources
|
3
|
-
|
4
3
|
#
|
5
4
|
# A wrapper to Ecommerce orders API
|
6
5
|
#
|
7
6
|
# [API]
|
8
7
|
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/index.html
|
9
8
|
#
|
10
|
-
|
11
9
|
class Order < Base
|
12
|
-
|
13
10
|
attr_reader :is_paid, :address_number, :plan_change_urls, :activation_expired, :number, :is_trial,
|
14
11
|
:address_state, :global_account, :api_url, :document_number, :checkout_url, :active_until,
|
15
12
|
:charge_day, :address_quarter, :activated_at, :is_active, :user_code, :address, :is_recurring,
|
@@ -24,24 +21,24 @@ module Ecommerce
|
|
24
21
|
#
|
25
22
|
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#criacao-de-ordem-de-compra
|
26
23
|
#
|
27
|
-
|
28
24
|
def self.create(slug, params)
|
29
|
-
client.post("/api/orders/#{slug}/",
|
25
|
+
client.post("/api/orders/#{slug}/", body: params) do |response|
|
30
26
|
build_order(response)
|
31
27
|
end
|
32
28
|
end
|
33
29
|
|
34
30
|
#
|
35
|
-
# Lists all Orders of a slug and return a collection with orders
|
31
|
+
# Lists all Orders of a slug and return a collection with orders
|
32
|
+
# and pagination information (represented by Ecommerce::Resources::OrderCollection)
|
36
33
|
#
|
37
34
|
# [API]
|
38
35
|
# Method: <tt>GET /api/orders/:slug/</tt>
|
39
36
|
#
|
40
37
|
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#listagem-de-ordens-de-compra
|
41
38
|
#
|
42
|
-
|
43
39
|
def self.find_all(slug, page = 1, limit = 20)
|
44
|
-
|
40
|
+
body = { page: page, limit: limit }
|
41
|
+
client.get("/api/orders/#{slug}/", body: body) do |response|
|
45
42
|
Ecommerce::Resources::OrderCollection.build(response)
|
46
43
|
end
|
47
44
|
end
|
@@ -54,7 +51,6 @@ module Ecommerce
|
|
54
51
|
#
|
55
52
|
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#detalhes-de-uma-ordem-de-compra
|
56
53
|
#
|
57
|
-
|
58
54
|
def self.find(order_id, slug)
|
59
55
|
client.get("/api/orders/#{slug}/#{order_id}/") do |response|
|
60
56
|
build_order(response)
|
@@ -69,22 +65,31 @@ module Ecommerce
|
|
69
65
|
#
|
70
66
|
# Documentation: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#delete-api-orders-slug-id
|
71
67
|
#
|
72
|
-
|
73
68
|
def self.destroy(order_id, slug)
|
74
69
|
client.delete("/api/orders/#{slug}/#{order_id}/") do |response|
|
75
70
|
build_order(response)
|
76
71
|
end
|
77
72
|
end
|
78
73
|
|
79
|
-
|
80
|
-
|
74
|
+
#
|
75
|
+
# Updates an Order client information
|
76
|
+
#
|
77
|
+
# [API]
|
78
|
+
# Method: <tt>PUT /api/orders/:slug/:order_id/</tt>
|
79
|
+
#
|
80
|
+
# Documentation for available and required fields: http://myfreecomm.github.io/passaporte-web/ecommerce/api/orders.html#put-api-orders-slug-id
|
81
|
+
#
|
82
|
+
def self.update(order_id, slug, order_params={})
|
83
|
+
client.put("/api/orders/#{slug}/#{order_id}/", body: order_params) do |response|
|
84
|
+
build_order(response)
|
85
|
+
end
|
81
86
|
end
|
82
87
|
|
83
88
|
private
|
84
89
|
|
85
90
|
def self.build_order(response)
|
86
91
|
order_attributes = parsed_body(response)
|
87
|
-
order_attributes.empty? ? {} :
|
92
|
+
order_attributes.empty? ? {} : new(order_attributes)
|
88
93
|
end
|
89
94
|
end
|
90
95
|
end
|
@@ -1,60 +1,18 @@
|
|
1
1
|
module Ecommerce
|
2
2
|
module Resources
|
3
|
-
|
4
3
|
#
|
5
|
-
# A wrapper to Ecommerce orders API.
|
4
|
+
# A wrapper to Ecommerce orders API.
|
6
5
|
#
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
PAGE_REGEX = /page=(\d+)/
|
11
|
-
|
12
|
-
attr_reader :response, :orders, :headers
|
13
|
-
|
14
|
-
def initialize(response)
|
15
|
-
@response = response
|
16
|
-
@orders = []
|
17
|
-
@headers = response.headers['Link'].split(',')
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.build(response)
|
21
|
-
self.new(response).build
|
22
|
-
end
|
23
|
-
|
24
|
-
def build
|
25
|
-
build_orders
|
26
|
-
self
|
27
|
-
end
|
28
|
-
|
29
|
-
def next_page
|
30
|
-
page_for(:next)
|
31
|
-
end
|
32
|
-
|
33
|
-
def last_page
|
34
|
-
page_for(:last)
|
35
|
-
end
|
36
|
-
|
37
|
-
def previous_page
|
38
|
-
page_for(:prev)
|
39
|
-
end
|
40
|
-
|
41
|
-
def first_page
|
42
|
-
page_for(:first)
|
6
|
+
class OrderCollection < Collection
|
7
|
+
def orders
|
8
|
+
collection
|
43
9
|
end
|
44
10
|
|
45
11
|
private
|
46
12
|
|
47
|
-
def
|
48
|
-
header_link_for(page_rel).match(PAGE_REGEX)[1].to_i rescue nil
|
49
|
-
end
|
50
|
-
|
51
|
-
def header_link_for(rel)
|
52
|
-
headers.select{|n| n =~ /rel=#{rel}/}.first
|
53
|
-
end
|
54
|
-
|
55
|
-
def build_orders
|
13
|
+
def build_collection
|
56
14
|
Ecommerce::Resources::Base.parsed_body(response).each do |order_attributes|
|
57
|
-
|
15
|
+
collection.push(Ecommerce::Resources::Order.new(order_attributes))
|
58
16
|
end
|
59
17
|
end
|
60
18
|
end
|
data/lib/ecommerce/version.rb
CHANGED
@@ -49,6 +49,30 @@ describe Ecommerce::AttributeHandler do
|
|
49
49
|
expect(subject.handle).to eq(DateTime.new(2014, 6, 1, 14, 17, 56))
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
context 'when parameter is nil' do
|
54
|
+
subject { Ecommerce::AttributeHandler.new(nil) }
|
55
|
+
|
56
|
+
it 'returns parameter' do
|
57
|
+
expect(subject.handle).to be_nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when parameter is blank' do
|
62
|
+
subject { Ecommerce::AttributeHandler.new('') }
|
63
|
+
|
64
|
+
it 'returns parameter' do
|
65
|
+
expect(subject.handle).to eq('')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when parameter is different from String' do
|
70
|
+
subject { Ecommerce::AttributeHandler.new([]) }
|
71
|
+
|
72
|
+
it 'returns parameter' do
|
73
|
+
expect(subject.handle).to eq([])
|
74
|
+
end
|
75
|
+
end
|
52
76
|
end
|
53
77
|
end
|
54
78
|
end
|