dear_inventory 0.2.0 → 0.3.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.
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