bling-ruby-api 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +44 -0
- data/LICENSE +21 -0
- data/README.md +68 -0
- data/Rakefile +10 -0
- data/bling.gemspec +27 -0
- data/lib/bling.rb +16 -0
- data/lib/bling/api.rb +26 -0
- data/lib/bling/api/client.rb +67 -0
- data/lib/bling/api/locales/translations.yml +71 -0
- data/lib/bling/api/order.rb +224 -0
- data/lib/bling/api/parser.rb +30 -0
- data/lib/bling/api/product.rb +143 -0
- data/lib/bling/api/record.rb +25 -0
- data/lib/bling/api/request.rb +53 -0
- data/lib/bling/api/response.rb +46 -0
- data/lib/bling/api/templates/order_installment_template +6 -0
- data/lib/bling/api/templates/order_item_template +8 -0
- data/lib/bling/api/templates/order_template +46 -0
- data/lib/bling/api/templates/order_update_template +4 -0
- data/lib/bling/api/templates/product_template +22 -0
- data/lib/bling/api/templates/user_template +17 -0
- data/lib/bling/api/translator.rb +61 -0
- data/lib/bling/api/user.rb +72 -0
- data/lib/bling/base.rb +15 -0
- data/lib/bling/config.rb +50 -0
- data/lib/bling/railtie.rb +9 -0
- data/lib/bling/version.rb +3 -0
- data/spec/lib/bling/api/client_spec.rb +45 -0
- data/spec/lib/bling/api/product_spec.rb +50 -0
- data/spec/lib/bling/api/record_spec.rb +12 -0
- data/spec/lib/bling/api/response_spec.rb +23 -0
- data/spec/lib/bling/api/translator_spec.rb +83 -0
- data/spec/spec_helper.rb +8 -0
- metadata +113 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
module Bling
|
2
|
+
module API
|
3
|
+
# This class is used to make requests to all available
|
4
|
+
# actions related to users in Bling api. Is strongly recommended
|
5
|
+
# to use the Bling::API module wrapper
|
6
|
+
#
|
7
|
+
class User < Request
|
8
|
+
# Get a list of available users
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# users = Bling::API::User.new.list
|
12
|
+
#
|
13
|
+
# @return [Array] Call users index and return an array with records
|
14
|
+
#
|
15
|
+
def list
|
16
|
+
get_request(t_url(:users))
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get a specific object based on user_id
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# user = Bling::API::user.new.get
|
23
|
+
#
|
24
|
+
# @param [String] cpf or cnpj from the user in Bling
|
25
|
+
#
|
26
|
+
# @return [Array] Call user#show and return an array with one record
|
27
|
+
#
|
28
|
+
def get(user_id)
|
29
|
+
get_request(t_url(:user, user_id))
|
30
|
+
end
|
31
|
+
|
32
|
+
# Insert a user in Bling
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# user = Bling::API::User.new.create(
|
36
|
+
# {
|
37
|
+
# name: 'Jonh Doe',
|
38
|
+
# company_name: '',
|
39
|
+
# tax_type: 1,
|
40
|
+
# document: '35165478662',
|
41
|
+
# ir_rg: '306153420',
|
42
|
+
# address: 'My great street',
|
43
|
+
# number: '33',
|
44
|
+
# additional_address: 'apt 12',
|
45
|
+
# zipcode: '03454020',
|
46
|
+
# city: 'Sao Paulo',
|
47
|
+
# uf: 'SP',
|
48
|
+
# phone: '(11) 2233-3322',
|
49
|
+
# email: jonh@@doe.com'
|
50
|
+
# }
|
51
|
+
# )
|
52
|
+
#
|
53
|
+
# @param [Hash] params A hash with user options
|
54
|
+
#
|
55
|
+
# @return [Array] Call user#create and return an array with one record
|
56
|
+
#
|
57
|
+
def create(params)
|
58
|
+
post_request(t_url(:user), parsed_xml(params))
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def parsed_xml(params)
|
64
|
+
params = translate(params) unless Bling.config.default_language == :en
|
65
|
+
validate(params, :name, :user_type, :tax_type, :document)
|
66
|
+
user_template % params
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
data/lib/bling/base.rb
ADDED
data/lib/bling/config.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
module Bling
|
2
|
+
class Config
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@api_url = 'https://bling.com.br/Api/v2/'
|
6
|
+
@response_format = :json
|
7
|
+
end
|
8
|
+
|
9
|
+
# The api key supplied by Bling service.
|
10
|
+
#
|
11
|
+
# @return [String]
|
12
|
+
attr_accessor :api_key
|
13
|
+
|
14
|
+
# Set response format from Bling, can be :xml or :json (default).
|
15
|
+
#
|
16
|
+
# @param [:xml, :json, 'xml', 'json']
|
17
|
+
def response_format=(response_format)
|
18
|
+
@response_format = response_format.to_sym
|
19
|
+
end
|
20
|
+
|
21
|
+
# The base API url
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
attr_reader :api_url
|
25
|
+
|
26
|
+
# The response format from Bling, can be :xml or :json (default).
|
27
|
+
#
|
28
|
+
# @return [Symbol]
|
29
|
+
def response_format
|
30
|
+
@response_format || :json
|
31
|
+
end
|
32
|
+
|
33
|
+
# The default language if set to english lib will translate
|
34
|
+
# to portuguese before actually make request. Default to :en
|
35
|
+
#
|
36
|
+
# @param [:pt, :en]
|
37
|
+
def default_language=(language)
|
38
|
+
raise ArgumentError unless [:en, :pt].include?(language.to_sym)
|
39
|
+
@default_language = language.to_sym
|
40
|
+
end
|
41
|
+
|
42
|
+
# The default language of API params
|
43
|
+
#
|
44
|
+
# @return [Symbol]
|
45
|
+
def default_language
|
46
|
+
@default_language || :en
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bling::API::Client do
|
4
|
+
before(:each) { allow(Net::HTTP).to receive(:get_response) }
|
5
|
+
let(:client) { Bling::API::Client.new('path', {}, :product) }
|
6
|
+
|
7
|
+
it 'always return a Response object' do
|
8
|
+
expect(client.get).to be_kind_of(Bling::API::Response)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'always set api key' do
|
12
|
+
expect(Bling.config).to receive(:api_key)
|
13
|
+
client.get
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'get default response format' do
|
17
|
+
expect(Bling.config).to receive(:response_format)
|
18
|
+
client.get
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'get default api endpoint' do
|
22
|
+
expect(Bling.config).to receive(:api_url).and_return('https://foo.bar')
|
23
|
+
client.get
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#get' do
|
27
|
+
it 'set parameter to uri' do
|
28
|
+
expect( URI ).to receive(:encode_www_form)
|
29
|
+
client.get
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'makes a get request' do
|
33
|
+
expect(Net::HTTP).to receive(:get_response)
|
34
|
+
client.get
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#post' do
|
39
|
+
it 'makes a post request' do
|
40
|
+
expect(Net::HTTP).to receive(:post_form)
|
41
|
+
client.post
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bling::API::Product do
|
4
|
+
|
5
|
+
describe 'parsed hash' do
|
6
|
+
it 'correctly parses it to template' do
|
7
|
+
params = {
|
8
|
+
code: '92314',
|
9
|
+
description: 'Awesome product',
|
10
|
+
additional_description: 'In lovely colors',
|
11
|
+
unit: 'Pc',
|
12
|
+
price: 20.50,
|
13
|
+
cost_price: 14.30,
|
14
|
+
raw_weight: 2,
|
15
|
+
weight: 1.8,
|
16
|
+
tax_category: '1000.01.01',
|
17
|
+
origin: 0,
|
18
|
+
quantity: 10,
|
19
|
+
gtin: 832222,
|
20
|
+
gtin_package: 13414,
|
21
|
+
width: 25,
|
22
|
+
height: 15,
|
23
|
+
depth: 10,
|
24
|
+
min_quantity: 1,
|
25
|
+
max_quantity: 200,
|
26
|
+
cest: ''
|
27
|
+
}
|
28
|
+
product = Bling::API::Product.new
|
29
|
+
product.instance_variable_set(:@params, params)
|
30
|
+
|
31
|
+
parsed_params = product.send :parsed_xml
|
32
|
+
expect(parsed_params).to match(/Awesome/)
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
it 'works with the min required params' do
|
37
|
+
params = {
|
38
|
+
description: 'Awesome product',
|
39
|
+
price: 20.50,
|
40
|
+
}
|
41
|
+
|
42
|
+
product = Bling::API::Product.new
|
43
|
+
product.instance_variable_set(:@params, params)
|
44
|
+
|
45
|
+
parsed_params = product.send :parsed_xml
|
46
|
+
expect(parsed_params).to match(/20.5/)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bling::API::Record do
|
4
|
+
|
5
|
+
it 'create readers to each hash key' do
|
6
|
+
params = { name: 'Bilbo', age: 111 }
|
7
|
+
hobbit = Bling::API::Record.new(params)
|
8
|
+
expect(hobbit.name).to eq 'Bilbo'
|
9
|
+
expect(hobbit.age).to eq 111
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bling::API::Response do
|
4
|
+
|
5
|
+
|
6
|
+
context 'with a valid http response' do
|
7
|
+
let(:http_response) { Net::HTTPOK.new('1.1', '200', 'OK') }
|
8
|
+
|
9
|
+
it 'is a success' do
|
10
|
+
pending
|
11
|
+
expect(described_class.new(http_response, 'foo').success?).to be_truthy
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'with a invalid http response' do
|
17
|
+
let(:http_response) { Net::HTTPBadRequest.new('1.1', '400', 'Bad request') }
|
18
|
+
|
19
|
+
it 'is a failure' do
|
20
|
+
expect(described_class.new(http_response, 'foo').success?).to be_falsey
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bling::API::Translator do
|
4
|
+
|
5
|
+
describe '#translate_url' do
|
6
|
+
it 'accepts a Symbol as key' do
|
7
|
+
expect(described_class.translate_url(:product)).to eq 'produto'
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'accepts a String as key' do
|
11
|
+
expect(described_class.translate_url('product')).to eq 'produto'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'return a nested id if passed' do
|
15
|
+
expect(described_class.translate_url(:product, id: 1)).to eq 'produto/1'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'accepts anything as id' do
|
19
|
+
expect(described_class.translate_url(:product, id: 'foobar')).to eq 'produto/foobar'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#translate_hash' do
|
24
|
+
context 'to en' do
|
25
|
+
let(:response) { { code: '001', description: 'Awesome thing' } }
|
26
|
+
|
27
|
+
it 'translate a hash of Symbol keys' do
|
28
|
+
params = { codigo: '001', descricao: 'Awesome thing' }
|
29
|
+
expect(described_class.translate_hash(params)).to eq response
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'converts non-snakecase to snakecase' do
|
33
|
+
params = { 'pesoBruto' => '1', descricao: 'Awesome thing' }
|
34
|
+
response = { :raw_weight => '1', description: 'Awesome thing' }
|
35
|
+
expect(described_class.translate_hash(params)).to eq response
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'accepts Strings and Symbols as keys' do
|
39
|
+
params = { 'codigo' => '001', descricao: 'Awesome thing' }
|
40
|
+
expect(described_class.translate_hash(params)).to eq response
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'recursively translate hashes and arrays' do
|
44
|
+
params = { resultado: { produtos: [{codigo: '001'}, {codigo: '002'}] } }
|
45
|
+
result = { result: { products: [{code: '001'}, {code: '002'}] } }
|
46
|
+
expect(described_class.translate_hash(params)).to eq result
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'keeps keys missing on yml' do
|
50
|
+
params = { codigo: '001', nao_existente: 'foo' }
|
51
|
+
result = { code: '001', nao_existente: 'foo' }
|
52
|
+
expect(described_class.translate_hash(params)).to eq result
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'to pt' do
|
57
|
+
let(:response) { { codigo: '001', descricao: 'Awesome thing' } }
|
58
|
+
|
59
|
+
it 'translate a hash of Symbol keys' do
|
60
|
+
params = { code: '001', description: 'Awesome thing' }
|
61
|
+
expect(described_class.translate_hash(params, to: :pt)).to eq response
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'accepts Strings and Symbols as keys' do
|
65
|
+
params = { 'code' => '001', description: 'Awesome thing' }
|
66
|
+
expect(described_class.translate_hash(params, to: :pt)).to eq response
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'recursively translate hashes and arrays' do
|
70
|
+
params = { result: { products: [{code: '001'}, {code: '002'}] } }
|
71
|
+
result = { resultado: { produtos: [{codigo: '001'}, {codigo: '002'}] } }
|
72
|
+
expect(described_class.translate_hash(params, to: :pt)).to eq result
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'keeps keys missing on yml' do
|
76
|
+
params = { code: '001', nao_existente: 'foo' }
|
77
|
+
result = { codigo: '001', nao_existente: 'foo' }
|
78
|
+
expect(described_class.translate_hash(params, to: :pt)).to eq result
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bling-ruby-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Denis Tierno
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-01-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Gem to access Bling API in ruby
|
42
|
+
email: contato@locomotiva.pro
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- ".gitignore"
|
48
|
+
- Gemfile
|
49
|
+
- Gemfile.lock
|
50
|
+
- LICENSE
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- bling.gemspec
|
54
|
+
- lib/bling.rb
|
55
|
+
- lib/bling/api.rb
|
56
|
+
- lib/bling/api/client.rb
|
57
|
+
- lib/bling/api/locales/translations.yml
|
58
|
+
- lib/bling/api/order.rb
|
59
|
+
- lib/bling/api/parser.rb
|
60
|
+
- lib/bling/api/product.rb
|
61
|
+
- lib/bling/api/record.rb
|
62
|
+
- lib/bling/api/request.rb
|
63
|
+
- lib/bling/api/response.rb
|
64
|
+
- lib/bling/api/templates/order_installment_template
|
65
|
+
- lib/bling/api/templates/order_item_template
|
66
|
+
- lib/bling/api/templates/order_template
|
67
|
+
- lib/bling/api/templates/order_update_template
|
68
|
+
- lib/bling/api/templates/product_template
|
69
|
+
- lib/bling/api/templates/user_template
|
70
|
+
- lib/bling/api/translator.rb
|
71
|
+
- lib/bling/api/user.rb
|
72
|
+
- lib/bling/base.rb
|
73
|
+
- lib/bling/config.rb
|
74
|
+
- lib/bling/railtie.rb
|
75
|
+
- lib/bling/version.rb
|
76
|
+
- spec/lib/bling/api/client_spec.rb
|
77
|
+
- spec/lib/bling/api/product_spec.rb
|
78
|
+
- spec/lib/bling/api/record_spec.rb
|
79
|
+
- spec/lib/bling/api/response_spec.rb
|
80
|
+
- spec/lib/bling/api/translator_spec.rb
|
81
|
+
- spec/spec_helper.rb
|
82
|
+
homepage: http://locomotiva.pro
|
83
|
+
licenses: []
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '2.1'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements:
|
100
|
+
- none
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.2.2
|
103
|
+
signing_key:
|
104
|
+
specification_version: 4
|
105
|
+
summary: Gem to access Bling API in ruby
|
106
|
+
test_files:
|
107
|
+
- spec/lib/bling/api/client_spec.rb
|
108
|
+
- spec/lib/bling/api/product_spec.rb
|
109
|
+
- spec/lib/bling/api/record_spec.rb
|
110
|
+
- spec/lib/bling/api/response_spec.rb
|
111
|
+
- spec/lib/bling/api/translator_spec.rb
|
112
|
+
- spec/spec_helper.rb
|
113
|
+
has_rdoc:
|