sale 0.1.6 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 450588d444cde46db5fc732c7d89d10633e3372e2dff6e4fc88d33a2f2d0c269
4
- data.tar.gz: '030684795a3a9e69fae7bf98a845811d6e159bbedc8574af59ae3791135f7f91'
3
+ metadata.gz: d2bdb714aece35dd7f04de403c5f36e973572a390938d0da5af1368b3d20563f
4
+ data.tar.gz: 61c118538568e2566b1f75a1a579f36cb0504b98a30404441a3967154188a476
5
5
  SHA512:
6
- metadata.gz: 5778d3a4424179c537181faf397a02960f798f35df3f8987f80811c774e30cc9d3d03b1795c0dd4a923b798fe3d3b78d54c3c2ff170669755ed2f7382b395292
7
- data.tar.gz: e70e56d8d47f6f7067605ca08e1d3178d362218099973daa5161f21ada54561883d72a33b6ab5a4696dc039ffc1dc1e50f7a5bea6ee88a4846d0b8261272a38c
6
+ metadata.gz: 2616e683c8f148bdb90a6ada8d151104fb092d38232fad25e428aee84360702b51c3cf4347aca41e1447e923b4d7e575ee31e104fbac5e81b0c37b1309829fa9
7
+ data.tar.gz: bf78adc18c95bc390289302ebfeafe9002e14f2e8e55ec6b0da1d0eeabd2d2215ab82387fa1661b7d254ec46905fc6865c322be6798cfecb1b172e6cea5a5cc7
data/lib/sale/base.rb CHANGED
@@ -8,6 +8,7 @@ module Bsale
8
8
  class APIBase
9
9
  ENDPOINT = 'https://api.bsale.cl'.freeze
10
10
  VERSION = 'v1'.freeze
11
+ MAX_RETRIES = 5
11
12
 
12
13
  def initialize(token)
13
14
  @token = token or raise 'Token not set!'
@@ -34,7 +35,7 @@ module Bsale
34
35
  wrap_response(resp)
35
36
  end
36
37
 
37
- def request(method, path, body = nil)
38
+ def request(method, path, body = nil, attempt = 1)
38
39
  headers = { 'access_token' => @token }
39
40
  url = path['://'] ? path : [ ENDPOINT, VERSION, path ].join('/')
40
41
 
@@ -43,6 +44,13 @@ module Bsale
43
44
  else
44
45
  Dagger.request(method, url, body, { json: true, follow: 3, headers: headers })
45
46
  end
47
+ rescue InvalidResponseError, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EINVAL, Timeout::Error, \
48
+ SocketError, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError, OpenSSL::SSL::SSLError => e
49
+
50
+ raise if attempt > MAX_RETRIES
51
+ puts "Connection refused. Retrying in a few secs... (attempt #{attempt})"
52
+ sleep(attempt * 5) # 5 secs, 10 secs, 15 secs, 20 secs
53
+ request(method, path, body, attempt + 1)
46
54
  end
47
55
 
48
56
  def connect
data/lib/sale/buyers.rb CHANGED
@@ -18,6 +18,8 @@ class Bsale::Buyers
18
18
  end
19
19
 
20
20
  return with_code.first
21
+ # else
22
+ # raise BuyerNotFoundError.new("No matches with email #{email}, code #{code}")
21
23
  end
22
24
  end
23
25
 
data/lib/sale/entity.rb CHANGED
@@ -1,19 +1,16 @@
1
1
  class Entity
2
+ include Enumerable
2
3
 
3
4
  attr_reader :data
4
5
 
5
6
  def initialize(data, client, original_params = nil)
6
- @data, @client, @original_params = data, client, original_params
7
+ @data, @client, @original_params = maybe_stringify(data), client, original_params
7
8
  end
8
9
 
9
10
  def to_s
10
11
  @data.inspect
11
12
  end
12
13
 
13
- def to_a
14
- data['items'] ? items : nil
15
- end
16
-
17
14
  def [](key)
18
15
  data[key.to_s]
19
16
  end
@@ -22,26 +19,10 @@ class Entity
22
19
  data[key.to_s] = obj
23
20
  end
24
21
 
25
- def size
26
- (to_a || []).size
27
- end
28
-
29
- alias_method :count, :size
30
-
31
- def each(&block)
32
- to_a.each(&block)
33
- end
34
-
35
- def each_with_index(&block)
36
- to_a.each_with_index &block
37
- end
38
-
39
- def map(&block)
40
- to_a.map(&block)
22
+ def to_a
23
+ data['items'] ? items : []
41
24
  end
42
25
 
43
- alias_method :collect, :map
44
-
45
26
  def load(params = nil)
46
27
  client.get(data['href'], params)
47
28
  end
@@ -51,6 +32,16 @@ class Entity
51
32
  load # just return a new instance
52
33
  end
53
34
 
35
+ def each(&block)
36
+ to_a.each(&block)
37
+ end
38
+
39
+ def count
40
+ to_a.size
41
+ end
42
+
43
+ alias_method :size, :count
44
+
54
45
  def items
55
46
  return if data['items'].nil?
56
47
  @items ||= data['items'].map { |obj| Entity.new(obj, client) }
@@ -80,20 +71,15 @@ class Entity
80
71
  data['next'] ? follow_link(data['next'], @original_params) : nil
81
72
  end
82
73
 
83
- def method_missing(name)
74
+ def method_missing(name, *args)
84
75
  name = name.to_s
85
-
86
- if data[name]
87
- # if is_link?(data[name])
88
- # follow_link(data[name]['href'])
89
- if is_hash?(data[name])
90
- Entity.new(data[name], client)
91
- else
92
- data[name]
93
- end
76
+ if is_hash?(data[name])
77
+ Entity.new(data[name], client)
78
+ elsif data[name]
79
+ data[name]
94
80
  else
95
- # puts data.inspect
96
- # puts "Unknown method: #{name}"
81
+ nil
82
+ # raise "Not found: #{name} in #{data}"
97
83
  end
98
84
  end
99
85
 
@@ -104,10 +90,22 @@ class Entity
104
90
  # is_hash?(obj) && obj['href'] && obj.keys == ['href']
105
91
  # end
106
92
 
93
+ # def is_integer?(val)
94
+ # Integer(val)
95
+ # true
96
+ # rescue
97
+ # false
98
+ # end
99
+
107
100
  def is_hash?(obj)
108
101
  obj.is_a?(Hash)
109
102
  end
110
103
 
104
+ def maybe_stringify(obj)
105
+ return obj unless is_hash?(obj)
106
+ obj.inject({}) { |memo,(k,v) | memo[k.to_s] = v; memo }
107
+ end
108
+
111
109
  def follow_link(href, params = nil)
112
110
  client.get(href, params)
113
111
  end
data/lib/sale/fake_rut.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  module FakeRUT
2
4
 
3
5
  def self.for(str)
data/sale.gemspec CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "sale"
6
- s.version = '0.1.6'
6
+ s.version = '0.2.0'
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ['Tomás Pollak']
9
9
  s.email = ['tomas@bootic.net']
data/spec/base_spec.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler/setup'
2
+ require_relative '../lib/sale'
3
+
4
+ RSpec.configure do |config|
5
+ config.color = true
6
+ end
7
+
8
+ describe 'APIBase' do
9
+
10
+ let(:subject) { Bsale::APIBase.new(token) }
11
+ let(:token) { '123456' }
12
+
13
+ describe '#request' do
14
+ it 'explodes with 401 error if invalid token' do
15
+ expect do
16
+ resp = subject.get('foo')
17
+ end.to raise_error(Bsale::InvalidResponseError)
18
+ end
19
+ end
20
+
21
+ end
data/spec/buyers_spec.rb CHANGED
@@ -56,12 +56,14 @@ describe 'Bsale' do
56
56
 
57
57
  it 'returns result, without code' do
58
58
  res = client.find_by_email_and_code('aaa@foo.com')
59
- expect(res).to eql(OpenStruct.new({ code: 123, accumulatePoints: '1' }))
59
+ expect(res).to be_a(Entity) # (OpenStruct.new({ code: 123, accumulatePoints: '1' }))
60
+ expect(res.code).to eq(123)
60
61
  end
61
62
 
62
63
  it 'returns result, with matching code' do
63
64
  res = client.find_by_email_and_code('aaa@foo.com', '123')
64
- expect(res).to eql(OpenStruct.new({ code: 123, accumulatePoints: '1' }))
65
+ expect(res).to be_a(Entity)
66
+ expect(res.code).to eq(123)
65
67
  end
66
68
 
67
69
  it 'returns nil, with non-matching code' do
@@ -81,12 +83,14 @@ describe 'Bsale' do
81
83
 
82
84
  it 'returns result, without code' do
83
85
  res = client.find_by_email_and_code('aaa@foo.com')
84
- expect(res).to eql(OpenStruct.new({ code: 123, accumulatePoints: '1' }))
86
+ expect(res).to be_a(Entity)
87
+ expect(res.code).to eq(123)
85
88
  end
86
89
 
87
90
  it 'returns result, with matching code' do
88
91
  res = client.find_by_email_and_code('aaa@foo.com', '123')
89
- expect(res).to eql(OpenStruct.new({ code: 123, accumulatePoints: '1' }))
92
+ expect(res).to be_a(Entity)
93
+ expect(res.code).to eq(123)
90
94
  end
91
95
 
92
96
  it 'returns nil, with non-matching code' do
@@ -138,7 +142,8 @@ describe 'Bsale' do
138
142
 
139
143
  it 'returns result, when code matches one' do
140
144
  res = client.find_by_email_and_code('aaa@foo.com', '123')
141
- expect(res).to eql(OpenStruct.new({ code: 123, accumulatePoints: '1' }))
145
+ expect(res).to be_a(Entity)
146
+ expect(res.code).to eq(123)
142
147
  end
143
148
 
144
149
  it 'returns nil, when code doesnt match any' do
@@ -0,0 +1,47 @@
1
+ require 'bundler/setup'
2
+ require_relative '../lib/sale'
3
+
4
+ RSpec.configure do |config|
5
+ config.color = true
6
+ end
7
+
8
+ describe 'Entity' do
9
+
10
+ describe '#to_a' do
11
+ it 'returns empty array if no items' do
12
+ obj = Entity.new({ foo: 'bar '}, nil)
13
+ expect(obj.to_a).to eq([])
14
+ end
15
+ end
16
+
17
+ describe '#count' do
18
+ it 'returns 0 array if no items' do
19
+ obj = Entity.new({ foo: 'bar '}, nil)
20
+ expect(obj.count).to eq(0)
21
+ end
22
+
23
+ it 'returns number if items' do
24
+ obj = Entity.new({ items: [1] }, nil)
25
+ expect(obj.count).to eq(1)
26
+ end
27
+ end
28
+
29
+ describe '#each_with_index' do
30
+ it 'works beautifully' do
31
+ obj = Entity.new({ foo: 'bar', items: [1, 2, 3] }, nil)
32
+ res = []
33
+ obj.each_with_index { |el, i| res.push([el.data, i]) }
34
+ expect(res).to eq([[1,0], [2,1], [3,2]])
35
+ end
36
+ end
37
+
38
+ describe '#select' do
39
+ it 'works beautifully' do
40
+ obj = Entity.new({ foo: 'bar', items: [1, 2, 3] }, nil)
41
+ res = obj.select { |el| el.data % 2 == 0 }
42
+ expect(res.map(&:data)).to eq([2])
43
+ end
44
+ end
45
+
46
+ end
47
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomás Pollak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-23 00:00:00.000000000 Z
11
+ date: 2019-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,7 +97,9 @@ files:
97
97
  - lib/sale/invoices.rb
98
98
  - lib/sale/root.rb
99
99
  - sale.gemspec
100
+ - spec/base_spec.rb
100
101
  - spec/buyers_spec.rb
102
+ - spec/entity_spec.rb
101
103
  homepage: https://github.com/github/bsale-api-wrapper
102
104
  licenses: []
103
105
  metadata: {}