finale 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7dccf6985425bb97ece7b4ea3588cd11097bb0a
4
- data.tar.gz: 79773b5bf989138bdc5aa863e735d441eec4eb4c
3
+ metadata.gz: bdd6fa1a37947ed35b33546ae027df06a1e93325
4
+ data.tar.gz: f5a6e98f7c6563523dd70c9c9a4d8dfdea9a9f10
5
5
  SHA512:
6
- metadata.gz: ec43e039350308485a2e91a8e15221687a92167e3c34835cbe95caebfc84cfd74994731d8a539b8727e5be82894d159371d2279dd618f1da4d610b3ec25edddb
7
- data.tar.gz: b861daea16936cf30fbc0fb08c69f817beeb182d37c4f9f73ee938497803bb1211d04719db363d1c77b61c401ca19508407402d59fbd50c8f6ae30fe1d4f6670
6
+ metadata.gz: c0b76ec8390220b7d31ccfaf7124999399751d0b8265c96d5c4700b859ab351c8029613e2920d978e47665814cf1193e79af9e0edd422c34d765cef381970733
7
+ data.tar.gz: c040d45991d17d31e146e0840310fa53d30425b79073ac5a64a7d1290281e4d50b9147f2b2d26b185f3c0d8d555ea03765282745b219bd9a2cdd87e595828ca8
data/.gitignore CHANGED
@@ -6,6 +6,10 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /Gemfile.lock
10
+ *.swp
11
+ *.swo
12
+ *.swn
9
13
 
10
14
  # rspec failure tracking
11
15
  .rspec_status
data/finale.gemspec CHANGED
@@ -32,7 +32,12 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ["lib"]
34
34
 
35
+ spec.add_runtime_dependency "rest-client", "~> 2.0"
36
+
35
37
  spec.add_development_dependency "bundler", "~> 1.16"
38
+ spec.add_development_dependency "webmock", "~> 3.4"
36
39
  spec.add_development_dependency "rake", "~> 10.0"
37
40
  spec.add_development_dependency "rspec", "~> 3.0"
41
+ spec.add_development_dependency 'pry-byebug', '~> 3'
42
+ spec.add_development_dependency "factory_bot", "~> 4.10"
38
43
  end
data/lib/finale.rb CHANGED
@@ -1,5 +1,76 @@
1
+ require "rest-client"
2
+
3
+ require "finale/version"
4
+ require "finale/errors"
5
+ require "finale/order"
1
6
  require "finale/version"
2
7
 
3
8
  module Finale
4
- # Your code goes here...
9
+ class Client
10
+ MAX_REQUESTS = 100 # Finale API Usage: 'https://support.finaleinventory.com/hc/en-us/articles/115007830648-Getting-Started'
11
+ BASE_URL = 'https://app.finaleinventory.com'
12
+
13
+ def initialize(company)
14
+ @cookies = nil
15
+ @request_count = 0
16
+ @company = company
17
+ @login_url = construct_url(:auth)
18
+ @order_url = construct_url(:order)
19
+ @shipment_url = construct_url(:shipment)
20
+ end
21
+
22
+ def login(username: nil, password: nil)
23
+ payload = {
24
+ username: username || ENV['FINALE_USERNAME'],
25
+ password: password || ENV['FINALE_PASSWORD']
26
+ }
27
+
28
+ request(verb: :LOGIN, payload: payload)
29
+ end
30
+
31
+ def get_order_ids
32
+ body = request(verb: :GET, url: @order_url)
33
+ order_ids = body[:orderId]
34
+ order_ids.map(&:to_i).sort.uniq
35
+ end
36
+
37
+ def get_order(id)
38
+ response = request(verb: :GET, url: "#{@order_url}/#{id}")
39
+ Order.new(response)
40
+ end
41
+
42
+ def get_shipments(order)
43
+ order.shipment_urls.map do |suffix_url|
44
+ url = "#{BASE_URL}#{suffix_url}"
45
+ response = request(verb: :GET, url: url)
46
+ Shipment.new(response)
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def construct_url(resource)
53
+ "#{BASE_URL}/#{@company}/api/#{resource}"
54
+ end
55
+
56
+ def request(verb: nil, url: nil, payload: nil)
57
+ raise MaxRequests.new(MAX_REQUESTS) if @request_count >= MAX_REQUESTS
58
+ raise NotLoggedIn.new(verb: verb, url: url) unless verb == :LOGIN || !@cookies.nil?
59
+
60
+ case verb
61
+ when :LOGIN
62
+ response = RestClient.post(@login_url, payload)
63
+ @cookies = response.cookies
64
+ when :GET
65
+ response = RestClient.get(url, cookies: @cookies)
66
+ when :POST
67
+ response = RestClient.post(url, cookies: @cookies)
68
+ end
69
+
70
+ @request_count += 1
71
+ body = JSON.parse(response.body, symbolize_names: true)
72
+ body
73
+ end
74
+ end
5
75
  end
76
+
@@ -0,0 +1,16 @@
1
+ module Finale
2
+ class NotLoggedIn < StandardError
3
+ def initialize(verb: nil, url: nil)
4
+ message = "Request to (#{verb}) #{url} can't be made. You are not logged in."
5
+ super(message)
6
+ end
7
+ end
8
+
9
+ class MaxRequests < StandardError
10
+ def initialize(max_requests)
11
+ message = "Finale API request max reached: '#{max_requests}'"
12
+ super(message)
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,12 @@
1
+ module Finale
2
+ class Order
3
+ attr_reader :id, :shipment_urls, :source
4
+
5
+ def initialize(order_response)
6
+ @id = order_response[:orderId]&.to_i
7
+ @shipment_urls = order_response[:shipmentUrlList]
8
+ @source = order_response[:saleSourceId]
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,11 @@
1
+ module Finale
2
+ class Shipment
3
+ attr_reader :id
4
+
5
+ def initialize(shipment_response)
6
+ @id = shipment_response[:shipmentId]&.to_i
7
+ @item_list = shipment_response[:shipmentItemList]
8
+ end
9
+ end
10
+ end
11
+
@@ -1,3 +1,3 @@
1
1
  module Finale
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - popp0102
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-19 00:00:00.000000000 Z
11
+ date: 2018-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,20 @@ dependencies:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
40
  version: '1.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: webmock
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.4'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.4'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,34 @@ dependencies:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
82
  version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: factory_bot
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4.10'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4.10'
55
111
  description: A client to interact with the Finale Inventory System.
56
112
  email:
57
113
  - popp0102@getnotion.com
@@ -71,6 +127,9 @@ files:
71
127
  - bin/setup
72
128
  - finale.gemspec
73
129
  - lib/finale.rb
130
+ - lib/finale/errors.rb
131
+ - lib/finale/order.rb
132
+ - lib/finale/shipment.rb
74
133
  - lib/finale/version.rb
75
134
  homepage: https://github.com/popp0102/finale
76
135
  licenses: