dear_inventory 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/dear_inventory.gemspec +1 -1
  4. data/lib/dear_inventory.rb +4 -0
  5. data/lib/dear_inventory/errors/not_paginated.rb +19 -0
  6. data/lib/dear_inventory/errors/request.rb +2 -2
  7. data/lib/dear_inventory/lib/request.rb +58 -0
  8. data/lib/dear_inventory/model.rb +8 -3
  9. data/lib/dear_inventory/models/additional_attributes.rb +3 -3
  10. data/lib/dear_inventory/models/additional_charge.rb +3 -3
  11. data/lib/dear_inventory/models/address.rb +3 -3
  12. data/lib/dear_inventory/models/attachment.rb +3 -3
  13. data/lib/dear_inventory/models/inventory_movement.rb +3 -3
  14. data/lib/dear_inventory/models/request.rb +27 -0
  15. data/lib/dear_inventory/models/sale.rb +3 -3
  16. data/lib/dear_inventory/models/sale_list.rb +3 -3
  17. data/lib/dear_inventory/models/sale_lists.rb +3 -3
  18. data/lib/dear_inventory/models/sales/credit_note.rb +3 -3
  19. data/lib/dear_inventory/models/sales/fulfilment.rb +3 -3
  20. data/lib/dear_inventory/models/sales/fulfilments/pick_pack.rb +3 -3
  21. data/lib/dear_inventory/models/sales/fulfilments/pick_pack_line.rb +3 -3
  22. data/lib/dear_inventory/models/sales/fulfilments/ship.rb +4 -4
  23. data/lib/dear_inventory/models/sales/fulfilments/ship_line.rb +3 -3
  24. data/lib/dear_inventory/models/sales/invoice.rb +3 -3
  25. data/lib/dear_inventory/models/sales/invoice_line.rb +3 -3
  26. data/lib/dear_inventory/models/sales/line.rb +3 -3
  27. data/lib/dear_inventory/models/sales/manual_journal.rb +3 -3
  28. data/lib/dear_inventory/models/sales/manual_journal_line.rb +3 -3
  29. data/lib/dear_inventory/models/sales/order.rb +3 -3
  30. data/lib/dear_inventory/models/sales/payment_line.rb +3 -3
  31. data/lib/dear_inventory/models/sales/quote.rb +3 -3
  32. data/lib/dear_inventory/models/shipping_address.rb +3 -3
  33. data/lib/dear_inventory/models/transaction.rb +3 -3
  34. data/lib/dear_inventory/parameters.rb +24 -16
  35. data/lib/dear_inventory/parameters/sale/index.rb +3 -3
  36. data/lib/dear_inventory/parameters/sale_list/index.rb +7 -7
  37. data/lib/dear_inventory/resource.rb +13 -30
  38. data/lib/dear_inventory/response.rb +25 -8
  39. data/lib/dear_inventory/validators/enum.rb +1 -1
  40. data/lib/dear_inventory/validators/guid.rb +1 -1
  41. data/lib/dear_inventory/validators/time.rb +1 -1
  42. data/lib/dear_inventory/version.rb +1 -1
  43. metadata +9 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5de01e56315ab3e8fdab17da4ac986c6a0e8a28cea8ca4f12c6d3fe9d72d4b2b
4
- data.tar.gz: fa31df63741d89de3b94f23ecd4de85e6de934dffc65dbcdebf41bf8469776be
3
+ metadata.gz: 06b7290754b857b04a983d81fb7f409600b11c6cc3ea2c7aa29d2ab5d6de9169
4
+ data.tar.gz: ea6cc10252ec0131abcc507f11bf29a498ba9c33e5d166c1614a7c5039307c8b
5
5
  SHA512:
6
- metadata.gz: c49a7abd36e48c1f3bbe90e39343db5468737f70f5b626b061234e728981308b16fe236fc8168daf49a415b90f2f8c98354b7990db8aea3c5062bad2b712649e
7
- data.tar.gz: fbb67a2d10e7a6fb7f4145babe1d6b7a50e2625c7d50140c250f48a7972c803a852eaa5905539c4f16f9f90f109fc80789382593fac241094454fcab8f71c205
6
+ metadata.gz: 1f46d30f480e186c5c96aa29c5aada16358377a02972472bbbc5e2e0d0021cc145a79b500bb16cee31fc577de87e1c359cb513ca0a0e5f5924c69437e52b2ee5
7
+ data.tar.gz: 80de674c305a60635ce942ee63c68afaea977a46a0cb968276af08e6b5cb6543737387adc38368f0957584e72a6dbec349c918df4f99fb60ccbf90ab84e323c4
data/.rubocop.yml CHANGED
@@ -35,6 +35,10 @@ Metrics/BlockLength:
35
35
  - dear_inventory.gemspec
36
36
  - spec/**/*
37
37
 
38
+ Metrics/ClassLength:
39
+ Exclude:
40
+ - lib/dear_inventory/models/**/*
41
+
38
42
  RSpec/BeforeAfterAll:
39
43
  Enabled: false
40
44
 
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency "bundler", "~> 2.0"
35
35
  spec.add_development_dependency "dotenv"
36
36
  spec.add_development_dependency "pry-byebug"
37
- spec.add_development_dependency "rake", "~> 10.0"
37
+ spec.add_development_dependency "rake", ">= 12.3.3"
38
38
  spec.add_development_dependency "rspec", "~> 3.0"
39
39
  spec.add_development_dependency "rubocop", "~> 0.71"
40
40
  spec.add_development_dependency "rubocop-performance"
@@ -8,11 +8,14 @@ require "dear_inventory/config"
8
8
  require "dear_inventory/environment"
9
9
 
10
10
  require "dear_inventory/error"
11
+ require "dear_inventory/errors/not_paginated"
11
12
  require "dear_inventory/errors/request"
12
13
  require "dear_inventory/errors/validation"
13
14
 
14
15
  require "dear_inventory/lib/endpoint_class"
16
+ require "dear_inventory/lib/date_time"
15
17
  require "dear_inventory/lib/is_a_subclass"
18
+ require "dear_inventory/lib/request"
16
19
 
17
20
  require "dear_inventory/model"
18
21
  require "dear_inventory/models/additional_attributes"
@@ -39,6 +42,7 @@ require "dear_inventory/models/sale_lists"
39
42
  require "dear_inventory/models/sales/credit_note"
40
43
  require "dear_inventory/models/sales/invoice"
41
44
  require "dear_inventory/models/sale"
45
+ require "dear_inventory/models/request"
42
46
 
43
47
  require "dear_inventory/validator"
44
48
  require "dear_inventory/validators/boolean"
@@ -0,0 +1,19 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ class NotPaginatedError < Error
6
+ extend T::Sig
7
+
8
+ sig do
9
+ params(
10
+ message: T.nilable(String),
11
+ uri: String
12
+ ).void
13
+ end
14
+ def initialize(message = nil, uri:)
15
+ message ||= "The endpoint (#{uri}) is not paginated"
16
+ super(message)
17
+ end
18
+ end
19
+ end
@@ -33,8 +33,8 @@ module DearInventory
33
33
  end
34
34
 
35
35
  sig { returns(T.nilable(String)) }
36
- def url
37
- @response&.url&.to_s
36
+ def uri
37
+ @response&.uri&.to_s
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,58 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ class Request
6
+ extend T::Sig
7
+
8
+ sig do
9
+ params(parameters: DearInventory::Models::Request).
10
+ returns(DearInventory::Response)
11
+ end
12
+ def self.call(parameters)
13
+ new(parameters).call
14
+ end
15
+
16
+ sig do
17
+ params(parameters: DearInventory::Models::Request).void
18
+ end
19
+ def initialize(parameters)
20
+ @parameters = parameters
21
+ end
22
+
23
+ sig { returns(DearInventory::Response) }
24
+ def call
25
+ options = request_params(@parameters.action, @parameters.params)
26
+ response = HTTP.headers(headers).
27
+ public_send(@parameters.action, @parameters.uri, options)
28
+
29
+ DearInventory::Response.new(
30
+ response: response,
31
+ request: @parameters
32
+ )
33
+ end
34
+
35
+ private
36
+
37
+ sig { returns(T::Hash[Symbol, String]) }
38
+ def headers
39
+ {
40
+ "Content-Type": "application/json",
41
+ "api-auth-accountid": DearInventory.config.require(:account_id),
42
+ "api-auth-applicationkey": DearInventory.config.require(:key),
43
+ }
44
+ end
45
+
46
+ sig do
47
+ params(action: Symbol, params: DearInventory::Parameters).
48
+ returns(T::Hash[Symbol, T::Hash[Symbol, T.untyped]])
49
+ end
50
+ def request_params(action, params)
51
+ if action == :get
52
+ { params: params.to_h }
53
+ else
54
+ { json: params.to_h }
55
+ end
56
+ end
57
+ end
58
+ end
@@ -51,6 +51,7 @@ module DearInventory
51
51
 
52
52
  private
53
53
 
54
+ # rubocop:disable Metrics/MethodLength
54
55
  sig do
55
56
  params(
56
57
  response_name: Symbol,
@@ -68,18 +69,22 @@ module DearInventory
68
69
  )
69
70
  end
70
71
  def field_value(response_name, values, specifications)
71
- model = specifications[:model]
72
+ model = T.cast(
73
+ specifications[:model],
74
+ T.nilable(T.class_of(DearInventory::Model))
75
+ )
72
76
  value = values[response_name.to_s]
73
77
 
74
78
  case specifications[:type]
75
79
  when :Array
76
- initialize_array_values_in_models(value, model)
80
+ initialize_array_values_in_models(value, T.must(model))
77
81
  when :Hash
78
- model.new(value)
82
+ T.must(model).new(value)
79
83
  else
80
84
  value
81
85
  end
82
86
  end
87
+ # rubocop:enable Metrics/MethodLength
83
88
 
84
89
  sig do
85
90
  params(
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class AdditionalAttributes < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  AdditionalAttribute1: {
11
11
  name: :additional_attribute_1,
12
12
  type: :String,
@@ -46,8 +46,8 @@ module DearInventory
46
46
  AdditionalAttribute10: {
47
47
  name: :additional_attribute_10,
48
48
  type: :String,
49
- },
50
- })
49
+ }
50
+ )
51
51
  end
52
52
  end
53
53
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class AdditionalCharge < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  Description: {
11
11
  name: :description,
12
12
  type: :String,
@@ -38,8 +38,8 @@ module DearInventory
38
38
  Comment: {
39
39
  name: :comment,
40
40
  type: :String,
41
- },
42
- })
41
+ }
42
+ )
43
43
  end
44
44
  end
45
45
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class Address < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  DisplayAddressLine1: {
11
11
  name: :display_address_line_1,
12
12
  type: :String,
@@ -38,8 +38,8 @@ module DearInventory
38
38
  Country: {
39
39
  name: :country,
40
40
  type: :String,
41
- },
42
- })
41
+ }
42
+ )
43
43
  end
44
44
  end
45
45
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class Attachment < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  ID: {
11
11
  name: :id,
12
12
  type: :Guid,
@@ -26,8 +26,8 @@ module DearInventory
26
26
  DownloadUrl: {
27
27
  name: :download_url,
28
28
  type: :String,
29
- },
30
- })
29
+ }
30
+ )
31
31
  end
32
32
  end
33
33
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class InventoryMovement < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  TaskID: {
11
11
  name: :task_id,
12
12
  type: :Guid,
@@ -22,8 +22,8 @@ module DearInventory
22
22
  COGS: {
23
23
  name: :cogs,
24
24
  type: :Numeric,
25
- },
26
- })
25
+ }
26
+ )
27
27
  end
28
28
  end
29
29
  end
@@ -0,0 +1,27 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ class Request < DearInventory::Model
7
+ extend T::Sig
8
+
9
+ sig { returns(Symbol) }
10
+ attr_reader :action
11
+ sig { returns(T.class_of(DearInventory::Model)) }
12
+ attr_reader :model
13
+ sig { returns(DearInventory::Parameters) }
14
+ attr_reader :params
15
+ sig { returns(String) }
16
+ attr_reader :uri
17
+
18
+ sig { params(parameters: T::Hash[Symbol, T.untyped]).void }
19
+ def initialize(parameters)
20
+ @action = T.let(parameters[:action], Symbol)
21
+ @model = T.let(parameters[:model], T.class_of(DearInventory::Model))
22
+ @params = T.let(parameters[:params], DearInventory::Parameters)
23
+ @uri = T.let(parameters[:uri], String)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class Sale < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  ID: {
11
11
  name: :id,
12
12
  type: :Guid,
@@ -210,8 +210,8 @@ module DearInventory
210
210
  name: :transactions,
211
211
  type: :Array,
212
212
  model: DearInventory::Models::InventoryMovement,
213
- },
214
- })
213
+ }
214
+ )
215
215
  end
216
216
  end
217
217
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class SaleList < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  SaleID: {
11
11
  name: :id,
12
12
  type: :Guid,
@@ -126,8 +126,8 @@ module DearInventory
126
126
  ExternalID: {
127
127
  name: :external_id,
128
128
  type: :String,
129
- },
130
- })
129
+ }
130
+ )
131
131
  end
132
132
  end
133
133
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class SaleLists < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  Total: {
11
11
  name: :total,
12
12
  type: :Integer,
@@ -19,8 +19,8 @@ module DearInventory
19
19
  name: :sale_list,
20
20
  type: :Array,
21
21
  model: DearInventory::Models::SaleList,
22
- },
23
- })
22
+ }
23
+ )
24
24
  end
25
25
  end
26
26
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class CreditNote < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  TaskID: {
12
12
  name: :task_id,
13
13
  type: :Guid,
@@ -67,8 +67,8 @@ module DearInventory
67
67
  Total: {
68
68
  name: :total,
69
69
  type: :Numeric,
70
- },
71
- })
70
+ }
71
+ )
72
72
  end
73
73
  end
74
74
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class Fulfilment < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  TaskID: {
12
12
  name: :task_id,
13
13
  type: :Guid,
@@ -38,8 +38,8 @@ module DearInventory
38
38
  name: :ship,
39
39
  type: :Hash,
40
40
  model: DearInventory::Models::Sales::Fulfilments::Ship,
41
- },
42
- })
41
+ }
42
+ )
43
43
  end
44
44
  end
45
45
  end
@@ -8,7 +8,7 @@ module DearInventory
8
8
  class PickPack < DearInventory::Model
9
9
  extend T::Sig
10
10
 
11
- fields({
11
+ fields(
12
12
  Status: {
13
13
  name: :status,
14
14
  type: :String,
@@ -17,8 +17,8 @@ module DearInventory
17
17
  name: :lines,
18
18
  type: :Array,
19
19
  model: DearInventory::Models::Sales::Fulfilments::PickPackLine,
20
- },
21
- })
20
+ }
21
+ )
22
22
  end
23
23
  end
24
24
  end
@@ -8,7 +8,7 @@ module DearInventory
8
8
  class PickPackLine < DearInventory::Model
9
9
  extend T::Sig
10
10
 
11
- fields({
11
+ fields(
12
12
  ProductID: {
13
13
  name: :product_id,
14
14
  type: :Guid,
@@ -48,8 +48,8 @@ module DearInventory
48
48
  WarrantyRegistrationNumber: {
49
49
  name: :warranty_registration_number,
50
50
  type: :String,
51
- },
52
- })
51
+ }
52
+ )
53
53
  end
54
54
  end
55
55
  end
@@ -8,7 +8,7 @@ module DearInventory
8
8
  class Ship < DearInventory::Model
9
9
  extend T::Sig
10
10
 
11
- fields({
11
+ fields(
12
12
  Status: {
13
13
  name: :status,
14
14
  type: :String,
@@ -20,14 +20,14 @@ module DearInventory
20
20
  ShippingAddress: {
21
21
  name: :status,
22
22
  type: :Hash,
23
- model: DearInventory::Models::ShippingAddress
23
+ model: DearInventory::Models::ShippingAddress,
24
24
  },
25
25
  Lines: {
26
26
  name: :lines,
27
27
  type: :Array,
28
28
  model: DearInventory::Models::Sales::Fulfilments::ShipLine,
29
- },
30
- })
29
+ }
30
+ )
31
31
  end
32
32
  end
33
33
  end
@@ -8,7 +8,7 @@ module DearInventory
8
8
  class ShipLine < DearInventory::Model
9
9
  extend T::Sig
10
10
 
11
- fields({
11
+ fields(
12
12
  ID: {
13
13
  name: :id,
14
14
  type: :Guid,
@@ -36,8 +36,8 @@ module DearInventory
36
36
  IsShipped: {
37
37
  name: :is_shipped,
38
38
  type: :Boolean,
39
- },
40
- })
39
+ }
40
+ )
41
41
  end
42
42
  end
43
43
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class Invoice < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  TaskID: {
12
12
  name: :task_id,
13
13
  type: :Guid,
@@ -78,8 +78,8 @@ module DearInventory
78
78
  Paid: {
79
79
  name: :paid,
80
80
  type: :Numeric,
81
- },
82
- })
81
+ }
82
+ )
83
83
  end
84
84
  end
85
85
  end
@@ -7,12 +7,12 @@ module DearInventory
7
7
  class InvoiceLine < Line
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  Account: {
12
12
  name: :account,
13
13
  type: :String,
14
- },
15
- })
14
+ }
15
+ )
16
16
  end
17
17
  end
18
18
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class Line < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  ProductID: {
12
12
  name: :product_id,
13
13
  type: :Guid,
@@ -51,8 +51,8 @@ module DearInventory
51
51
  Total: {
52
52
  name: :total,
53
53
  type: :Numeric,
54
- },
55
- })
54
+ }
55
+ )
56
56
  end
57
57
  end
58
58
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class ManualJournal < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  Status: {
12
12
  name: :status,
13
13
  type: :String,
@@ -16,8 +16,8 @@ module DearInventory
16
16
  name: :lines,
17
17
  type: :Array,
18
18
  model: DearInventory::Models::Sales::ManualJournalLine,
19
- },
20
- })
19
+ }
20
+ )
21
21
  end
22
22
  end
23
23
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class ManualJournalLine < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  Reference: {
12
12
  name: :reference,
13
13
  type: :String,
@@ -27,8 +27,8 @@ module DearInventory
27
27
  Credit: {
28
28
  name: :credit,
29
29
  type: :String,
30
- },
31
- })
30
+ }
31
+ )
32
32
  end
33
33
  end
34
34
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class Order < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  SaleOrderNumber: {
12
12
  name: :sale_order_number,
13
13
  type: :String,
@@ -41,8 +41,8 @@ module DearInventory
41
41
  Total: {
42
42
  name: :total,
43
43
  type: :Numeric,
44
- },
45
- })
44
+ }
45
+ )
46
46
  end
47
47
  end
48
48
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class PaymentLine < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  ID: {
12
12
  name: :id,
13
13
  type: :Guid,
@@ -35,8 +35,8 @@ module DearInventory
35
35
  DateCreated: {
36
36
  name: :date_created,
37
37
  type: :DateTime,
38
- },
39
- })
38
+ }
39
+ )
40
40
  end
41
41
  end
42
42
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class Quote < DearInventory::Model
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  Memo: {
12
12
  name: :memo,
13
13
  type: :String,
@@ -42,8 +42,8 @@ module DearInventory
42
42
  Total: {
43
43
  name: :total,
44
44
  type: :Numeric,
45
- },
46
- })
45
+ }
46
+ )
47
47
  end
48
48
  end
49
49
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class ShippingAddress < Address
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  Company: {
11
11
  name: :company,
12
12
  type: :String,
@@ -18,8 +18,8 @@ module DearInventory
18
18
  ShipToOther: {
19
19
  name: :ship_to_other,
20
20
  type: :Boolean,
21
- },
22
- })
21
+ }
22
+ )
23
23
  end
24
24
  end
25
25
  end
@@ -6,7 +6,7 @@ module DearInventory
6
6
  class Transaction < DearInventory::Model
7
7
  extend T::Sig
8
8
 
9
- fields({
9
+ fields(
10
10
  TaskID: {
11
11
  name: :task_id,
12
12
  type: :Guid,
@@ -34,8 +34,8 @@ module DearInventory
34
34
  EffectiveDate: {
35
35
  name: :description,
36
36
  type: :DateTime,
37
- },
38
- })
37
+ }
38
+ )
39
39
  end
40
40
  end
41
41
  end
@@ -32,22 +32,13 @@ module DearInventory
32
32
 
33
33
  sig do
34
34
  params(
35
- resource_class: T.untyped,
35
+ resource_class: T.class_of(DearInventory::Resource),
36
36
  endpoint: T.nilable(String),
37
37
  params: T::Hash[Symbol, T.untyped]
38
38
  ).returns(T.untyped)
39
39
  end
40
40
  def convert(resource_class, endpoint, params)
41
- resource = resource_class.name.split("::").last
42
- params_class = DearInventory::EndpointClass.(
43
- class_type: "Parameters",
44
- resource_class: resource_class,
45
- endpoint: endpoint
46
- )
47
- params_class = T.cast(
48
- params_class,
49
- T.class_of(DearInventory::Parameters)
50
- )
41
+ params_class = endpoint_class(resource_class, endpoint)
51
42
 
52
43
  convert_with_params_class(
53
44
  endpoint: endpoint, params_class: params_class,
@@ -57,6 +48,22 @@ module DearInventory
57
48
 
58
49
  private
59
50
 
51
+ sig do
52
+ params(
53
+ resource_class: T.class_of(DearInventory::Resource),
54
+ endpoint: T.nilable(String)
55
+ ).returns(T.class_of(DearInventory::Parameters))
56
+ end
57
+ def endpoint_class(resource_class, endpoint)
58
+ params_class = DearInventory::EndpointClass.(
59
+ class_type: "Parameters",
60
+ resource_class: resource_class,
61
+ endpoint: endpoint
62
+ )
63
+ T.cast(params_class, T.class_of(DearInventory::Parameters))
64
+ end
65
+
66
+ # rubocop:disable Metrics/MethodLength
60
67
  sig do
61
68
  params(
62
69
  name: Symbol,
@@ -81,6 +88,7 @@ module DearInventory
81
88
  )
82
89
  end
83
90
  end
91
+ # rubocop:enable Metrics/MethodLength
84
92
 
85
93
  sig do
86
94
  params(
@@ -93,7 +101,7 @@ module DearInventory
93
101
  def define_enum_method(name, specifications)
94
102
  validator = DearInventory::Validators::Enum
95
103
  options = {
96
- values: specifications[:values]
104
+ values: specifications[:values],
97
105
  }
98
106
  define_method_with_options(name, validator, options)
99
107
  end
@@ -107,7 +115,7 @@ module DearInventory
107
115
  def define_string_method(name, specifications)
108
116
  validator = DearInventory::Validators::String
109
117
  options = {
110
- max_length: specifications[:max_length]
118
+ max_length: specifications[:max_length],
111
119
  }
112
120
  define_method_with_options(name, validator, options)
113
121
  end
@@ -118,7 +126,7 @@ module DearInventory
118
126
  validator: T.class_of(DearInventory::Validator),
119
127
  options: T::Hash[
120
128
  Symbol, T.nilable(T.any(Symbol, T::Array[String], T::Boolean))
121
- ],
129
+ ]
122
130
  ).void
123
131
  end
124
132
  def define_method_with_options(name, validator, options)
@@ -152,7 +160,7 @@ module DearInventory
152
160
  sig do
153
161
  params(
154
162
  params_class: T.nilable(T.class_of(DearInventory::Parameters)),
155
- resource_class: DearInventory::Resource,
163
+ resource_class: T.class_of(DearInventory::Resource),
156
164
  endpoint: T.nilable(String),
157
165
  params: T::Hash[Symbol, T.untyped]
158
166
  ).returns(T.nilable(DearInventory::Parameters))
@@ -202,7 +210,7 @@ module DearInventory
202
210
  sig { params(params: T::Hash[Symbol, T.untyped]).void }
203
211
  def assign_params(params)
204
212
  params.each do |name, value|
205
- __send__(:"#{name}=", value)
213
+ public_send(:"#{name}=", value)
206
214
  end
207
215
  end
208
216
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class Index < DearInventory::Parameters
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  id: {
12
12
  property: :ID,
13
13
  type: :String,
@@ -27,8 +27,8 @@ module DearInventory
27
27
  property: :IncludeTransactions,
28
28
  type: :Boolean,
29
29
  required: false,
30
- },
31
- })
30
+ }
31
+ )
32
32
  end
33
33
  end
34
34
  end
@@ -7,7 +7,7 @@ module DearInventory
7
7
  class Index < DearInventory::Parameters
8
8
  extend T::Sig
9
9
 
10
- fields({
10
+ fields(
11
11
  page: {
12
12
  property: :Page,
13
13
  type: :Integer,
@@ -49,7 +49,7 @@ module DearInventory
49
49
  type: :Enum,
50
50
  values: [
51
51
  "NOT AVAILABLE", "DRAFT", "AUTHORISED", "VOIDED", "AUTH_NO_ALLOC",
52
- "FULFILLED", "CLOSED"
52
+ "FULFILLED", "CLOSED",
53
53
  ],
54
54
  required: false,
55
55
  },
@@ -58,7 +58,7 @@ module DearInventory
58
58
  type: :Enum,
59
59
  values: [
60
60
  "VOIDED", "NOT AVAILABLE", "PICKED", "PICKING", "NOT PICKED",
61
- "PARTIALLY PICKED"
61
+ "PARTIALLY PICKED",
62
62
  ],
63
63
  required: false,
64
64
  },
@@ -67,7 +67,7 @@ module DearInventory
67
67
  type: :Enum,
68
68
  values: [
69
69
  "VOIDED", "NOT AVAILABLE", "PACKED", "PACKING", "NOT PACKED",
70
- "PARTIALLY PACKED"
70
+ "PARTIALLY PACKED",
71
71
  ],
72
72
  required: false,
73
73
  },
@@ -76,7 +76,7 @@ module DearInventory
76
76
  type: :Enum,
77
77
  values: [
78
78
  "VOIDED", "NOT AVAILABLE", "SHIPPED", "SHIPPING", "NOT SHIPPED",
79
- "PARTIALLY SHIPPED"
79
+ "PARTIALLY SHIPPED",
80
80
  ],
81
81
  required: false,
82
82
  },
@@ -111,8 +111,8 @@ module DearInventory
111
111
  property: :ReadyForShipping,
112
112
  type: :Boolean,
113
113
  required: false,
114
- },
115
- })
114
+ }
115
+ )
116
116
  end
117
117
  end
118
118
  end
@@ -15,45 +15,28 @@ module DearInventory
15
15
  ).returns(DearInventory::Response)
16
16
  end
17
17
  def request(action, model:, endpoint: nil, params: {})
18
- url = resource_url(endpoint)
18
+ uri = resource_uri(endpoint)
19
19
  params = DearInventory::Parameters.convert(self.class, endpoint, params)
20
- options = request_params(action, params)
21
20
 
22
- response = HTTP.headers(headers).public_send(action, url, options)
23
- DearInventory::Response.new(response: response, model: model)
21
+ request = DearInventory::Models::Request.new(
22
+ action: action,
23
+ model: model,
24
+ params: params,
25
+ uri: uri
26
+ )
27
+ DearInventory::Request.(request)
24
28
  end
25
29
 
26
30
  private
27
31
 
28
- URL_BASE = "https://inventory.dearsystems.com/ExternalApi/v2"
32
+ URI_BASE = "https://inventory.dearsystems.com/ExternalApi/v2"
29
33
 
30
34
  sig { params(endpoint: T.nilable(String)).returns(String) }
31
- def resource_url(endpoint)
35
+ def resource_uri(endpoint)
32
36
  resource = T.must(self.class.name).split("::").last
33
- url = "#{URL_BASE}/#{T.must(resource).downcase}"
34
- url += "/#{endpoint}" unless endpoint.nil?
35
- url
36
- end
37
-
38
- sig { returns(T::Hash[Symbol, String]) }
39
- def headers
40
- {
41
- "Content-Type": "application/json",
42
- "api-auth-accountid": DearInventory.config.require(:account_id),
43
- "api-auth-applicationkey": DearInventory.config.require(:key),
44
- }
45
- end
46
-
47
- sig do
48
- params(action: Symbol, params: DearInventory::Parameters).
49
- returns(T::Hash[Symbol, T.untyped])
50
- end
51
- def request_params(action, params)
52
- if action == :get
53
- { params: params.to_h }
54
- else
55
- { json: params.to_h }
56
- end
37
+ uri = "#{URI_BASE}/#{T.must(resource).downcase}"
38
+ uri += "/#{endpoint}" unless endpoint.nil?
39
+ uri
57
40
  end
58
41
  end
59
42
  end
@@ -6,20 +6,26 @@ module DearInventory
6
6
  extend T::Sig
7
7
  extend DearInventory::IsASubclass
8
8
 
9
+ sig { returns(DearInventory::Models::Request) }
10
+ attr_reader :request
11
+ sig { returns(HTTP::Response) }
12
+ attr_reader :response
13
+
9
14
  sig do
10
15
  params(
11
- model: T.class_of(DearInventory::Model),
16
+ request: DearInventory::Models::Request,
12
17
  response: HTTP::Response
13
18
  ).void
14
19
  end
15
- def initialize(model:, response:)
16
- @model = T.let(nil, T.nilable(DearInventory::Model))
20
+ def initialize(request:, response:)
21
+ @request = T.let(request, DearInventory::Models::Request)
17
22
  @response = T.let(response, HTTP::Response)
18
23
  @body = T.let(nil, T.nilable(String))
19
24
  @http_status = T.let(nil, T.nilable(Integer))
25
+ @model = T.let(nil, T.nilable(DearInventory::Model))
20
26
  @uri = T.let(nil, T.nilable(String))
21
27
 
22
- assign_values(model)
28
+ assign_values
23
29
  raise_error unless success?
24
30
  end
25
31
 
@@ -44,6 +50,17 @@ module DearInventory
44
50
  @http_status ||= @response.status.code
45
51
  end
46
52
 
53
+ sig { returns(DearInventory::Response) }
54
+ def next_page
55
+ unless T.must(@model).respond_to?(:page)
56
+ raise DearInventory::NotPaginatedError.new(uri: uri)
57
+ end
58
+
59
+ request = @request.dup
60
+ T.unsafe(request.params).page = T.unsafe(@model).page + 1
61
+ DearInventory::Request.(request)
62
+ end
63
+
47
64
  sig { returns(T::Boolean) }
48
65
  def success?
49
66
  http_status == 200
@@ -56,10 +73,10 @@ module DearInventory
56
73
 
57
74
  private
58
75
 
59
- sig { params(model: T.class_of(DearInventory::Model)).void }
60
- def assign_values(model)
61
- @model = model.new(body)
62
- model.const_get(:FIELDS).each do |response_name, specifications|
76
+ sig { void }
77
+ def assign_values
78
+ @model = @request.model.new(body)
79
+ @request.model.const_get(:FIELDS).each do |_, specifications|
63
80
  define_singleton_method(specifications[:name]) do
64
81
  @model.public_send(specifications[:name])
65
82
  end
@@ -14,7 +14,7 @@ module DearInventory
14
14
 
15
15
  raise_error(
16
16
  "expected one of " \
17
- "#{T.must(@values).map { |val| val.inspect }.join(", ")} " \
17
+ "#{T.must(@values).map(&:inspect).join(", ")} " \
18
18
  "but received #{value.inspect}"
19
19
  )
20
20
  end
@@ -9,7 +9,7 @@ module DearInventory
9
9
  REGEX = T.let(
10
10
  [
11
11
  /\A[\da-f]{32}\z/i,
12
- /\A(urn:uuid:)?[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}\z/i
12
+ /\A(urn:uuid:)?[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}\z/i,
13
13
  ].freeze,
14
14
  T::Array[Regexp]
15
15
  )
@@ -1,6 +1,6 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
- require "pry"
3
+
4
4
  module DearInventory
5
5
  module Validators
6
6
  class DateTime < DearInventory::Validator
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module DearInventory
5
- VERSION = "0.2.0"
5
+ VERSION = "0.3.0"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dear_inventory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Rice
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-04 00:00:00.000000000 Z
11
+ date: 2020-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -90,16 +90,16 @@ dependencies:
90
90
  name: rake
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - "~>"
93
+ - - ">="
94
94
  - !ruby/object:Gem::Version
95
- version: '10.0'
95
+ version: 12.3.3
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - "~>"
100
+ - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: '10.0'
102
+ version: 12.3.3
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: rspec
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -222,17 +222,20 @@ files:
222
222
  - lib/dear_inventory/config.rb
223
223
  - lib/dear_inventory/environment.rb
224
224
  - lib/dear_inventory/error.rb
225
+ - lib/dear_inventory/errors/not_paginated.rb
225
226
  - lib/dear_inventory/errors/request.rb
226
227
  - lib/dear_inventory/errors/validation.rb
227
228
  - lib/dear_inventory/lib/date_time.rb
228
229
  - lib/dear_inventory/lib/endpoint_class.rb
229
230
  - lib/dear_inventory/lib/is_a_subclass.rb
231
+ - lib/dear_inventory/lib/request.rb
230
232
  - lib/dear_inventory/model.rb
231
233
  - lib/dear_inventory/models/additional_attributes.rb
232
234
  - lib/dear_inventory/models/additional_charge.rb
233
235
  - lib/dear_inventory/models/address.rb
234
236
  - lib/dear_inventory/models/attachment.rb
235
237
  - lib/dear_inventory/models/inventory_movement.rb
238
+ - lib/dear_inventory/models/request.rb
236
239
  - lib/dear_inventory/models/sale.rb
237
240
  - lib/dear_inventory/models/sale_list.rb
238
241
  - lib/dear_inventory/models/sale_lists.rb