finale 0.1.0 → 0.1.1

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
  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: