economic-rest 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +12 -0
- data/README.md +3 -1
- data/lib/economic/base.rb +87 -0
- data/lib/economic/base_repo.rb +82 -0
- data/lib/economic/customer.rb +39 -0
- data/lib/economic/customer_repo.rb +4 -0
- data/lib/economic/order.rb +30 -0
- data/lib/economic/orders/archived_repo.rb +6 -0
- data/lib/economic/orders/drafts_repo.rb +14 -0
- data/lib/economic/orders/repo.rb +6 -0
- data/lib/economic/orders/sent_repo.rb +14 -0
- data/lib/economic/product.rb +20 -0
- data/lib/economic/product_repo.rb +4 -0
- data/lib/economic/rest.rb +19 -8
- data/lib/economic/rest/version.rb +1 -1
- data/lib/economic/session.rb +22 -0
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a583a4c00f68b2bd538c7245d7a36505fe49d3a8
|
4
|
+
data.tar.gz: fc97557df7f768a0e1ea2cd68d6e6d7a53ba274e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee6f2b2949418ed8cbe3b176e88a60780133e8efa571f24418d4740d3c4d29b95e4bbcf0566b3014f439dea67a16584053dedf8cbde613ce77642870fe867747
|
7
|
+
data.tar.gz: 593d9e1a4cf8a4d393cf51a12f5bf9598fc28f315578476b91f6f1c88d835e4afc2ff849e5a1dd1e870650b75bee09b4b3c358a8aec10fdd0d9f8baf916429e7
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -7,8 +7,13 @@ PATH
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
+
addressable (2.5.2)
|
11
|
+
public_suffix (>= 2.0.2, < 4.0)
|
12
|
+
crack (0.4.3)
|
13
|
+
safe_yaml (~> 1.0.0)
|
10
14
|
domain_name (0.5.20180417)
|
11
15
|
unf (>= 0.0.5, < 1.0.0)
|
16
|
+
hashdiff (0.3.8)
|
12
17
|
http-cookie (1.0.3)
|
13
18
|
domain_name (~> 0.5)
|
14
19
|
m (1.5.1)
|
@@ -20,14 +25,20 @@ GEM
|
|
20
25
|
mime-types-data (3.2018.0812)
|
21
26
|
minitest (5.11.3)
|
22
27
|
netrc (0.11.0)
|
28
|
+
public_suffix (3.0.3)
|
23
29
|
rake (10.5.0)
|
24
30
|
rest-client (2.0.2)
|
25
31
|
http-cookie (>= 1.0.2, < 2.0)
|
26
32
|
mime-types (>= 1.16, < 4.0)
|
27
33
|
netrc (~> 0.8)
|
34
|
+
safe_yaml (1.0.4)
|
28
35
|
unf (0.1.4)
|
29
36
|
unf_ext
|
30
37
|
unf_ext (0.0.7.5)
|
38
|
+
webmock (3.5.1)
|
39
|
+
addressable (>= 2.3.6)
|
40
|
+
crack (>= 0.3.2)
|
41
|
+
hashdiff
|
31
42
|
|
32
43
|
PLATFORMS
|
33
44
|
ruby
|
@@ -38,6 +49,7 @@ DEPENDENCIES
|
|
38
49
|
m
|
39
50
|
minitest (~> 5.0)
|
40
51
|
rake (~> 10.0)
|
52
|
+
webmock (~> 3.5)
|
41
53
|
|
42
54
|
BUNDLED WITH
|
43
55
|
1.17.1
|
data/README.md
CHANGED
@@ -0,0 +1,87 @@
|
|
1
|
+
module Economic
|
2
|
+
class Base
|
3
|
+
def initialize(hash)
|
4
|
+
values_based_on_hash(hash)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.attributes
|
8
|
+
@attributes
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.add_attribute(name)
|
12
|
+
(@attributes ||= []).push(name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.field(name, id: false)
|
16
|
+
economic_cased_attibute_name = name.to_s
|
17
|
+
attr_accessor economic_cased_attibute_name
|
18
|
+
alias_method snake_case(economic_cased_attibute_name), economic_cased_attibute_name
|
19
|
+
alias_method "#{snake_case(economic_cased_attibute_name)}=", "#{economic_cased_attibute_name}="
|
20
|
+
alias_method 'id_key', economic_cased_attibute_name if id
|
21
|
+
add_attribute economic_cased_attibute_name
|
22
|
+
end
|
23
|
+
|
24
|
+
def values_based_on_hash(hash)
|
25
|
+
Hash.class_eval { include ExtraMethods }
|
26
|
+
@internal_hash = hash
|
27
|
+
@internal_hash.each do |k, v|
|
28
|
+
k = k.to_s
|
29
|
+
if self.class.attributes.include? k
|
30
|
+
if v.class == Hash
|
31
|
+
v.keys.count.times do |i|
|
32
|
+
v.alias!(Base.snake_case(v.keys[i]), v.keys[i])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
send("#{k}=", v)
|
36
|
+
else
|
37
|
+
warn "unassigned k #{k} in #{self.class.name}" unless %w[layout self soap metaData].include? k
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_h
|
43
|
+
self.class.attributes.each do |attribute|
|
44
|
+
@internal_hash[attribute.to_sym] = send(attribute) unless send(attribute).nil?
|
45
|
+
end
|
46
|
+
@internal_hash
|
47
|
+
end
|
48
|
+
|
49
|
+
def dirty?
|
50
|
+
self.class.attributes.each do |attribute|
|
51
|
+
return true unless send(attribute) == @internal_hash[attribute]
|
52
|
+
end
|
53
|
+
false
|
54
|
+
end
|
55
|
+
|
56
|
+
def save
|
57
|
+
if dirty?
|
58
|
+
response = repo.save(self)
|
59
|
+
values_based_on_hash(JSON.parse(response.body))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.snake_case(camel_cased)
|
64
|
+
camel_cased.to_s.gsub(/::/, '/')
|
65
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
66
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
67
|
+
.tr('-', '_')
|
68
|
+
.downcase
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.low_camel_case(snake_cased)
|
72
|
+
camel = snake_cased.split('_').collect(&:capitalize).join
|
73
|
+
camel[0, 1].downcase + camel[1..-1]
|
74
|
+
end
|
75
|
+
|
76
|
+
def repo
|
77
|
+
Object.const_get("#{self.class}Repo")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
module ExtraMethods
|
83
|
+
def alias!(newkey, oldkey)
|
84
|
+
self[newkey] = self[oldkey] if self.has_key?(oldkey)
|
85
|
+
self
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'json'
|
3
|
+
require 'economic/session'
|
4
|
+
|
5
|
+
module Economic
|
6
|
+
class BaseRepo
|
7
|
+
URL = 'https://restapi.e-conomic.com/'.freeze
|
8
|
+
class << self
|
9
|
+
def headers
|
10
|
+
{ 'X-AppSecretToken': Session.app_secret_token, 'X-AgreementGrantToken': Session.agreement_grant_token, 'Content-Type': 'application/json' }
|
11
|
+
end
|
12
|
+
def fetch(endpoint:, page_or_id: nil, pageindex: 0)
|
13
|
+
url = ''
|
14
|
+
url << URL
|
15
|
+
url << endpoint.to_s if endpoint
|
16
|
+
url << if page_or_id.nil? || page_or_id.to_s.empty?
|
17
|
+
"?skippages=#{pageindex}&pagesize=1000"
|
18
|
+
else
|
19
|
+
"/#{page_or_id}"
|
20
|
+
end
|
21
|
+
response = RestClient.get(url, headers)
|
22
|
+
response
|
23
|
+
end
|
24
|
+
|
25
|
+
def save(model)
|
26
|
+
url = ''
|
27
|
+
url << URL
|
28
|
+
url << endpoint_name.to_s if endpoint_name
|
29
|
+
url << "/#{model.id_key}"
|
30
|
+
if model.id_key
|
31
|
+
response = RestClient.put(url, model.to_h.to_json, headers)
|
32
|
+
else
|
33
|
+
response = RestClient.post(url, model.to_h.to_json, headers)
|
34
|
+
end
|
35
|
+
response
|
36
|
+
end
|
37
|
+
|
38
|
+
def all
|
39
|
+
pagination = {}
|
40
|
+
pageindex = 0
|
41
|
+
entries = []
|
42
|
+
|
43
|
+
# Loop until last page, last page does not have a 'nextPage'
|
44
|
+
while pagination['nextPage'] || pageindex.zero?
|
45
|
+
response = fetch(endpoint: endpoint_name, pageindex: pageindex)
|
46
|
+
|
47
|
+
hash = JSON.parse(response.body)
|
48
|
+
hash['collection'].each do |entry_hash|
|
49
|
+
entries.push model.new(entry_hash)
|
50
|
+
end
|
51
|
+
|
52
|
+
pagination = hash['pagination']
|
53
|
+
pageindex += 1
|
54
|
+
end
|
55
|
+
entries
|
56
|
+
end
|
57
|
+
|
58
|
+
def find(entry_number)
|
59
|
+
response = fetch(endpoint: endpoint_name, page_or_id: entry_number)
|
60
|
+
entry_hash = JSON.parse(response.body)
|
61
|
+
model.new(entry_hash)
|
62
|
+
end
|
63
|
+
|
64
|
+
def model
|
65
|
+
scopes = name.split('::')
|
66
|
+
scopes[1] = scopes[1][0...-1] if scopes.count == 3
|
67
|
+
Object.const_get("#{scopes[0]}::#{scopes[1].sub('Repo', '')}")
|
68
|
+
end
|
69
|
+
|
70
|
+
def endpoint_name
|
71
|
+
end_p = name.sub('Economic::', '')
|
72
|
+
if end_p.include?('::')
|
73
|
+
end_p = end_p.gsub('Repo', '')
|
74
|
+
end_p = end_p.gsub('::', '/')
|
75
|
+
else
|
76
|
+
end_p = end_p.gsub('Repo', 's')
|
77
|
+
end
|
78
|
+
end_p.downcase
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Economic
|
2
|
+
class Customer < Base
|
3
|
+
field :address
|
4
|
+
field :balance
|
5
|
+
field :barred
|
6
|
+
field :city
|
7
|
+
field :contacts
|
8
|
+
field :corporateIdentificationNumber
|
9
|
+
field :country
|
10
|
+
field :creditLimit
|
11
|
+
field :currency
|
12
|
+
field :customerNumber, id: true
|
13
|
+
field :deliveryLocations
|
14
|
+
field :dueAmount
|
15
|
+
field :ean
|
16
|
+
field :email
|
17
|
+
field :lastUpdated
|
18
|
+
field :name
|
19
|
+
field :mobilePhone
|
20
|
+
field :pNumber
|
21
|
+
field :publicEntryNumber
|
22
|
+
field :telephoneAndFaxNumber
|
23
|
+
field :vatNumber
|
24
|
+
field :website
|
25
|
+
field :zip
|
26
|
+
|
27
|
+
field :attention
|
28
|
+
field :customerContact
|
29
|
+
field :customerGroup
|
30
|
+
field :defaultDeliveryLocation
|
31
|
+
field :invoices
|
32
|
+
field :layout
|
33
|
+
field :paymentTerms
|
34
|
+
field :salesPerson
|
35
|
+
field :templates
|
36
|
+
field :totals
|
37
|
+
field :vatZone
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Economic
|
2
|
+
class Order < Base
|
3
|
+
field :attachment
|
4
|
+
field :costPriceInBaseCurrency
|
5
|
+
field :currency
|
6
|
+
field :date
|
7
|
+
field :dueDate
|
8
|
+
field :exchangeRate
|
9
|
+
field :grossAmount
|
10
|
+
field :grossAmountInBaseCurrency
|
11
|
+
field :lines
|
12
|
+
field :marginInBaseCurrency
|
13
|
+
field :marginPercentage
|
14
|
+
field :netAmount
|
15
|
+
field :netAmountInBaseCurrency
|
16
|
+
field :orderNumber, id: true
|
17
|
+
field :roundingAmount
|
18
|
+
field :vatAmount
|
19
|
+
|
20
|
+
field :customer
|
21
|
+
field :delivery
|
22
|
+
field :notes
|
23
|
+
field :paymentTerms
|
24
|
+
field :pdf
|
25
|
+
field :project
|
26
|
+
field :recipient
|
27
|
+
field :references
|
28
|
+
field :templates
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Economic
|
2
|
+
module Orders
|
3
|
+
class DraftsRepo < Economic::Orders::Repo
|
4
|
+
def self.send(model)
|
5
|
+
url = ''
|
6
|
+
url << URL
|
7
|
+
url << '/orders'
|
8
|
+
url << '/sent'
|
9
|
+
response = RestClient.post(url, model.to_h.to_json, headers)
|
10
|
+
response
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Economic
|
2
|
+
module Orders
|
3
|
+
class SentRepo < Economic::Orders::Repo
|
4
|
+
def self.send(model)
|
5
|
+
url = ''
|
6
|
+
url << URL
|
7
|
+
url << '/orders'
|
8
|
+
url << '/drafts'
|
9
|
+
response = RestClient.post(url, model.to_h.to_json, headers)
|
10
|
+
response
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Economic
|
2
|
+
class Product < Base
|
3
|
+
field :barCode
|
4
|
+
field :barred
|
5
|
+
field :costPrice
|
6
|
+
field :description
|
7
|
+
field :lastUpdated
|
8
|
+
field :name
|
9
|
+
field :productNumber, id: true
|
10
|
+
field :recommendedPrice
|
11
|
+
field :salesPrice
|
12
|
+
|
13
|
+
field :departmentalDistribution
|
14
|
+
field :inventory
|
15
|
+
field :invoices
|
16
|
+
field :pricing
|
17
|
+
field :productGroup
|
18
|
+
field :unit
|
19
|
+
end
|
20
|
+
end
|
data/lib/economic/rest.rb
CHANGED
@@ -1,15 +1,26 @@
|
|
1
1
|
require 'economic/rest/version'
|
2
2
|
require 'rest-client'
|
3
3
|
|
4
|
+
require 'economic/base_repo'
|
5
|
+
require 'economic/base'
|
6
|
+
require 'economic/customer_repo'
|
7
|
+
require 'economic/customer'
|
8
|
+
require 'economic/product_repo'
|
9
|
+
require 'economic/product'
|
10
|
+
|
11
|
+
require 'economic/orders/repo'
|
12
|
+
require 'economic/order'
|
13
|
+
require 'economic/orders/archived_repo'
|
14
|
+
require 'economic/orders/drafts_repo'
|
15
|
+
require 'economic/orders/sent_repo'
|
16
|
+
|
4
17
|
module Economic
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
'Content-Type': 'application/json')
|
12
|
-
end
|
18
|
+
class Demo
|
19
|
+
def self.hello
|
20
|
+
RestClient.get('https://restapi.e-conomic.com/',
|
21
|
+
'X-AppSecretToken': 'Demo',
|
22
|
+
'X-AgreementGrantToken': 'Demo',
|
23
|
+
'Content-Type': 'application/json')
|
13
24
|
end
|
14
25
|
end
|
15
26
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Economic
|
2
|
+
# The Economic::Session contains details and behaviors for a current
|
3
|
+
# connection to the API endpoint.
|
4
|
+
class Session
|
5
|
+
def self.authentication(private_app_id, access_id)
|
6
|
+
@private_app_id = private_app_id
|
7
|
+
@access_id = access_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.app_secret_token
|
11
|
+
raise ArgumentError, 'Authentication tokens not set, Call Session.authentication' if @private_app_id.nil?
|
12
|
+
|
13
|
+
@private_app_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.agreement_grant_token
|
17
|
+
raise ArgumentError, 'Authentication tokens not set, Call Session.authentication' if @access_id.nil?
|
18
|
+
|
19
|
+
@access_id
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: economic-rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Klogborg
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -97,8 +97,20 @@ files:
|
|
97
97
|
- bin/console
|
98
98
|
- bin/setup
|
99
99
|
- economic-rest.gemspec
|
100
|
+
- lib/economic/base.rb
|
101
|
+
- lib/economic/base_repo.rb
|
102
|
+
- lib/economic/customer.rb
|
103
|
+
- lib/economic/customer_repo.rb
|
104
|
+
- lib/economic/order.rb
|
105
|
+
- lib/economic/orders/archived_repo.rb
|
106
|
+
- lib/economic/orders/drafts_repo.rb
|
107
|
+
- lib/economic/orders/repo.rb
|
108
|
+
- lib/economic/orders/sent_repo.rb
|
109
|
+
- lib/economic/product.rb
|
110
|
+
- lib/economic/product_repo.rb
|
100
111
|
- lib/economic/rest.rb
|
101
112
|
- lib/economic/rest/version.rb
|
113
|
+
- lib/economic/session.rb
|
102
114
|
homepage: https://bitbucket.org/traels/economic-rest
|
103
115
|
licenses:
|
104
116
|
- MIT
|