dear_inventory 1.4.0 → 1.5.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 (164) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +13 -4
  3. data/Gemfile +14 -0
  4. data/README.md +1 -10
  5. data/dear_inventory.gemspec +5 -15
  6. data/lib/dear_inventory/config.rb +12 -25
  7. data/lib/dear_inventory/environment.rb +1 -2
  8. data/lib/dear_inventory/error.rb +1 -6
  9. data/lib/dear_inventory/errors/api_limit.rb +0 -1
  10. data/lib/dear_inventory/errors/bad_request.rb +0 -1
  11. data/lib/dear_inventory/errors/no_more_pages.rb +0 -1
  12. data/lib/dear_inventory/errors/not_paginated.rb +0 -9
  13. data/lib/dear_inventory/errors/request.rb +1 -11
  14. data/lib/dear_inventory/errors/validation.rb +0 -1
  15. data/lib/dear_inventory/lib/date_time.rb +1 -6
  16. data/lib/dear_inventory/lib/endpoint_class.rb +4 -25
  17. data/lib/dear_inventory/lib/is_a_subclass.rb +1 -7
  18. data/lib/dear_inventory/lib/request.rb +10 -35
  19. data/lib/dear_inventory/lib/strings/urlize.rb +0 -4
  20. data/lib/dear_inventory/model.rb +26 -59
  21. data/lib/dear_inventory/models/additional_attributes.rb +0 -3
  22. data/lib/dear_inventory/models/address.rb +0 -3
  23. data/lib/dear_inventory/models/advanced_purchase.rb +0 -3
  24. data/lib/dear_inventory/models/attachment.rb +0 -3
  25. data/lib/dear_inventory/models/bill_of_materials_product.rb +0 -3
  26. data/lib/dear_inventory/models/bill_of_materials_service.rb +0 -3
  27. data/lib/dear_inventory/models/customer.rb +0 -3
  28. data/lib/dear_inventory/models/customers/address.rb +0 -3
  29. data/lib/dear_inventory/models/customers/contact.rb +0 -3
  30. data/lib/dear_inventory/models/customers.rb +0 -3
  31. data/lib/dear_inventory/models/inventory_movement.rb +0 -3
  32. data/lib/dear_inventory/models/product.rb +0 -3
  33. data/lib/dear_inventory/models/product_availability.rb +0 -3
  34. data/lib/dear_inventory/models/product_availability_results.rb +0 -3
  35. data/lib/dear_inventory/models/products/movement.rb +0 -3
  36. data/lib/dear_inventory/models/products.rb +0 -3
  37. data/lib/dear_inventory/models/purchase.rb +0 -3
  38. data/lib/dear_inventory/models/purchases/additional_charge.rb +0 -3
  39. data/lib/dear_inventory/models/purchases/advanced/credit_note.rb +0 -3
  40. data/lib/dear_inventory/models/purchases/advanced/invoice.rb +0 -3
  41. data/lib/dear_inventory/models/purchases/advanced/manual_journal.rb +0 -3
  42. data/lib/dear_inventory/models/purchases/advanced/put_away.rb +0 -3
  43. data/lib/dear_inventory/models/purchases/advanced/put_away_line.rb +0 -3
  44. data/lib/dear_inventory/models/purchases/advanced/stock.rb +0 -3
  45. data/lib/dear_inventory/models/purchases/advanced/stock_line.rb +0 -3
  46. data/lib/dear_inventory/models/purchases/credit_note.rb +0 -3
  47. data/lib/dear_inventory/models/purchases/inventory_movement.rb +0 -3
  48. data/lib/dear_inventory/models/purchases/invoice.rb +0 -3
  49. data/lib/dear_inventory/models/purchases/invoice_additional_charge.rb +0 -3
  50. data/lib/dear_inventory/models/purchases/invoice_line.rb +0 -3
  51. data/lib/dear_inventory/models/purchases/line.rb +0 -3
  52. data/lib/dear_inventory/models/purchases/manual_journal.rb +0 -3
  53. data/lib/dear_inventory/models/purchases/manual_journal_line.rb +0 -3
  54. data/lib/dear_inventory/models/purchases/order.rb +0 -3
  55. data/lib/dear_inventory/models/purchases/payment_line.rb +0 -3
  56. data/lib/dear_inventory/models/purchases/stock.rb +0 -3
  57. data/lib/dear_inventory/models/purchases/stock_line.rb +0 -3
  58. data/lib/dear_inventory/models/purchases/unstock_line.rb +0 -3
  59. data/lib/dear_inventory/models/purchases.rb +3 -8
  60. data/lib/dear_inventory/models/purchases_results.rb +0 -3
  61. data/lib/dear_inventory/models/reorder_level.rb +0 -3
  62. data/lib/dear_inventory/models/request.rb +5 -16
  63. data/lib/dear_inventory/models/sale.rb +0 -3
  64. data/lib/dear_inventory/models/sales/additional_charge.rb +0 -3
  65. data/lib/dear_inventory/models/sales/credit_note.rb +0 -3
  66. data/lib/dear_inventory/models/sales/fulfilment.rb +0 -3
  67. data/lib/dear_inventory/models/sales/fulfilments/pick_pack.rb +0 -3
  68. data/lib/dear_inventory/models/sales/fulfilments/pick_pack_line.rb +0 -3
  69. data/lib/dear_inventory/models/sales/fulfilments/ship.rb +0 -3
  70. data/lib/dear_inventory/models/sales/fulfilments/ship_line.rb +0 -3
  71. data/lib/dear_inventory/models/sales/invoice.rb +0 -3
  72. data/lib/dear_inventory/models/sales/invoice_additional_charge.rb +0 -3
  73. data/lib/dear_inventory/models/sales/invoice_line.rb +0 -3
  74. data/lib/dear_inventory/models/sales/line.rb +0 -3
  75. data/lib/dear_inventory/models/sales/manual_journal.rb +0 -3
  76. data/lib/dear_inventory/models/sales/manual_journal_line.rb +0 -3
  77. data/lib/dear_inventory/models/sales/order.rb +0 -3
  78. data/lib/dear_inventory/models/sales/payment_line.rb +0 -3
  79. data/lib/dear_inventory/models/sales/quote.rb +0 -3
  80. data/lib/dear_inventory/models/sales.rb +1 -6
  81. data/lib/dear_inventory/models/sales_results.rb +0 -3
  82. data/lib/dear_inventory/models/shipping_address.rb +0 -3
  83. data/lib/dear_inventory/models/supplier.rb +0 -3
  84. data/lib/dear_inventory/models/test_request.rb +5 -20
  85. data/lib/dear_inventory/models/transaction.rb +0 -3
  86. data/lib/dear_inventory/parameters/advanced_purchase/show.rb +0 -3
  87. data/lib/dear_inventory/parameters/customer/create.rb +170 -0
  88. data/lib/dear_inventory/parameters/customer/index.rb +0 -3
  89. data/lib/dear_inventory/parameters/customer/show.rb +170 -0
  90. data/lib/dear_inventory/parameters/customer/update.rb +175 -0
  91. data/lib/dear_inventory/parameters/product/index.rb +0 -3
  92. data/lib/dear_inventory/parameters/product_availability/index.rb +0 -3
  93. data/lib/dear_inventory/parameters/purchase/index.rb +0 -3
  94. data/lib/dear_inventory/parameters/purchase/show.rb +0 -3
  95. data/lib/dear_inventory/parameters/sale/delete.rb +0 -3
  96. data/lib/dear_inventory/parameters/sale/index.rb +0 -3
  97. data/lib/dear_inventory/parameters/sale/show.rb +0 -3
  98. data/lib/dear_inventory/parameters.rb +16 -97
  99. data/lib/dear_inventory/resource.rb +4 -15
  100. data/lib/dear_inventory/resources/advanced_purchase.rb +0 -7
  101. data/lib/dear_inventory/resources/customer.rb +17 -10
  102. data/lib/dear_inventory/resources/product.rb +0 -7
  103. data/lib/dear_inventory/resources/product_availability.rb +1 -9
  104. data/lib/dear_inventory/resources/purchase.rb +0 -12
  105. data/lib/dear_inventory/resources/sale.rb +3 -22
  106. data/lib/dear_inventory/response.rb +25 -73
  107. data/lib/dear_inventory/test_response.rb +9 -24
  108. data/lib/dear_inventory/validator.rb +10 -38
  109. data/lib/dear_inventory/validators/array.rb +15 -0
  110. data/lib/dear_inventory/validators/boolean.rb +0 -4
  111. data/lib/dear_inventory/validators/enum.rb +2 -6
  112. data/lib/dear_inventory/validators/guid.rb +4 -11
  113. data/lib/dear_inventory/validators/integer.rb +0 -4
  114. data/lib/dear_inventory/validators/required.rb +0 -4
  115. data/lib/dear_inventory/validators/string.rb +0 -4
  116. data/lib/dear_inventory/validators/time.rb +0 -4
  117. data/lib/dear_inventory/version.rb +1 -2
  118. data/lib/dear_inventory.rb +6 -12
  119. metadata +22 -219
  120. data/sorbet/config +0 -2
  121. data/sorbet/rbi/gems/addressable.rbi +0 -199
  122. data/sorbet/rbi/gems/ast.rbi +0 -48
  123. data/sorbet/rbi/gems/byebug.rbi +0 -1040
  124. data/sorbet/rbi/gems/coderay.rbi +0 -92
  125. data/sorbet/rbi/gems/crack.rbi +0 -48
  126. data/sorbet/rbi/gems/domain_name.rbi +0 -52
  127. data/sorbet/rbi/gems/dotenv.rbi +0 -68
  128. data/sorbet/rbi/gems/ffi-compiler.rbi +0 -27
  129. data/sorbet/rbi/gems/ffi.rbi +0 -560
  130. data/sorbet/rbi/gems/hashdiff.rbi +0 -66
  131. data/sorbet/rbi/gems/http-cookie.rbi +0 -93
  132. data/sorbet/rbi/gems/http-form_data.rbi +0 -76
  133. data/sorbet/rbi/gems/http-parser.rbi +0 -121
  134. data/sorbet/rbi/gems/http.rbi +0 -616
  135. data/sorbet/rbi/gems/jaro_winkler.rbi +0 -15
  136. data/sorbet/rbi/gems/method_source.rbi +0 -64
  137. data/sorbet/rbi/gems/parallel.rbi +0 -82
  138. data/sorbet/rbi/gems/parser.rbi +0 -857
  139. data/sorbet/rbi/gems/pry-byebug.rbi +0 -155
  140. data/sorbet/rbi/gems/pry.rbi +0 -1965
  141. data/sorbet/rbi/gems/public_suffix.rbi +0 -104
  142. data/sorbet/rbi/gems/rainbow.rbi +0 -118
  143. data/sorbet/rbi/gems/rake.rbi +0 -646
  144. data/sorbet/rbi/gems/rspec-core.rbi +0 -1732
  145. data/sorbet/rbi/gems/rspec-expectations.rbi +0 -388
  146. data/sorbet/rbi/gems/rspec-mocks.rbi +0 -820
  147. data/sorbet/rbi/gems/rspec-support.rbi +0 -269
  148. data/sorbet/rbi/gems/rspec.rbi +0 -15
  149. data/sorbet/rbi/gems/rubocop-performance.rbi +0 -277
  150. data/sorbet/rbi/gems/rubocop-rspec.rbi +0 -887
  151. data/sorbet/rbi/gems/rubocop.rbi +0 -6952
  152. data/sorbet/rbi/gems/ruby-progressbar.rbi +0 -305
  153. data/sorbet/rbi/gems/unf.rbi +0 -19
  154. data/sorbet/rbi/gems/unicode-display_width.rbi +0 -17
  155. data/sorbet/rbi/gems/vcr.rbi +0 -572
  156. data/sorbet/rbi/gems/webmock.rbi +0 -569
  157. data/sorbet/rbi/hidden-definitions/errors.txt +0 -11809
  158. data/sorbet/rbi/hidden-definitions/hidden.rbi +0 -20623
  159. data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +0 -8684
  160. data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +0 -276
  161. data/sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi +0 -4222
  162. data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +0 -111
  163. data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +0 -543
  164. data/sorbet/rbi/todo.rbi +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9c77cee55f30ac5aa4b5484b178363db30d6663eb172ba429d3be826ac37219
4
- data.tar.gz: 115c30635a886a41f6c93d3e8bb063679a97c39ae9d336c839105d396a5bc0bb
3
+ metadata.gz: 71b2b64af358567bd4f1a475d081aafd3c00150872a11fb7628fdbfbb97dc2c7
4
+ data.tar.gz: 0c4caf15c3e4b827f08062219c903e33110e01576f3c7cbce7baa7f834299a6c
5
5
  SHA512:
6
- metadata.gz: e1765c2d3e0a524c3c5a1227f78771277e8b9638b0437e036d3ece6f2a543e583e72b6b90026aa61a96b4569e944b3bd13223ca06a5722da19e364a427405c10
7
- data.tar.gz: b117b2fde79191b2a5f160088093b35b8d6941652fcd2bc4c2efe3265689ee3e6374b35e25b2c3de5e1332bd5c7dfddcf6c03cdc889670c0a7e21d7ce7babdf0
6
+ metadata.gz: 0b4196a33a0f47a82bee9dd375e30d24ffd560fd9f122dc88a3cd24278edd118a5bb729ee1fe8e71077b7b290561fbdd857cad0656f15a3a783fbedf272f0250
7
+ data.tar.gz: 59c6329f0930b9d1e8ca0324fb00171172cc5bb05f6bf0b90dd441d8701a4eecc2b378fa1c1e7a35546bf919b39e293572766e79dd78b52a6ee8f7c221781122
data/.rubocop.yml CHANGED
@@ -1,9 +1,10 @@
1
- require:
1
+ plugins:
2
2
  - rubocop-performance
3
3
  - rubocop-rspec
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 2.5
6
+ TargetRubyVersion: 3.4
7
+ NewCops: enable
7
8
  Exclude:
8
9
  - bin/**/*
9
10
 
@@ -30,6 +31,9 @@ Lint/AmbiguousBlockAssociation:
30
31
  Exclude:
31
32
  - spec/**/*
32
33
 
34
+ Lint/MissingSuper:
35
+ Enabled: false
36
+
33
37
  Lint/RaiseException:
34
38
  Enabled: true
35
39
 
@@ -42,9 +46,14 @@ Metrics/BlockLength:
42
46
  - spec/**/*
43
47
 
44
48
  Metrics/ClassLength:
45
- Max: 150
49
+ Max: 115
46
50
  Exclude:
47
51
  - lib/dear_inventory/models/**/*
52
+ - lib/dear_inventory/parameters.rb
53
+ - lib/dear_inventory/parameters/**/*
54
+
55
+ Naming/VariableNumber:
56
+ Enabled: false
48
57
 
49
58
  RSpec/BeforeAfterAll:
50
59
  Enabled: false
@@ -58,7 +67,7 @@ RSpec/MultipleExpectations:
58
67
  RSpec/NestedGroups:
59
68
  Max: 4
60
69
 
61
- RSpec/FilePath:
70
+ RSpec/SpecFilePathFormat:
62
71
  Enabled: false
63
72
 
64
73
  Security/Eval:
data/Gemfile CHANGED
@@ -4,3 +4,17 @@ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in dear_inventory.gemspec
6
6
  gemspec
7
+
8
+ group :development, :test do
9
+ gem "bundler", "~> 2.0"
10
+ gem "byebug"
11
+ gem "dotenv"
12
+ gem "pry-byebug"
13
+ gem "rake", ">= 13.0.0"
14
+ gem "rspec", "~> 3.0"
15
+ gem "rubocop", "~> 1.81"
16
+ gem "rubocop-performance"
17
+ gem "rubocop-rspec"
18
+ gem "vcr"
19
+ gem "webmock"
20
+ end
data/README.md CHANGED
@@ -20,21 +20,12 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install dear_inventory
22
22
 
23
- ## N.B for Ruby 2.7
24
-
25
- At time of writing, the Sorbet team has not yet accepted my pull request to fix deprecation warnings due to the use of the single splat operator. It can be quite frustrating to have your console flooded with warnings and so it may be worth your while specifying my fork of sorbet-runtime in your project's Gemfile:
26
- ```
27
- gem "sorbet-runtime",
28
- git: "https://github.com/HashNotAdam/sorbet.git",
29
- branch: "feature/ruby_2_7_keyword_arguments",
30
- glob: "gems/sorbet-runtime/sorbet-runtime.gemspec"
31
- ```
32
-
33
23
  ## Configuration
34
24
 
35
25
  Before you begin, you will need to setup API credentials in DEAR Inventory at https://inventory.dearsystems.com/ExternalApi
36
26
 
37
27
  Next you need to supply your API credentials:
28
+
38
29
  ```ruby
39
30
  require "dear_inventory"
40
31
 
@@ -16,8 +16,8 @@ Gem::Specification.new do |spec|
16
16
  spec.homepage = "https://morningcoffee.com.au"
17
17
  spec.license = "MIT"
18
18
 
19
- spec.required_ruby_version = ">= 2.5.0"
20
- spec.required_rubygems_version = ">= 1.8.11"
19
+ spec.required_ruby_version = ">= 3.4.0"
20
+ spec.required_rubygems_version = ">= 3.6.0"
21
21
 
22
22
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
23
  `git ls-files -z`.
@@ -28,19 +28,9 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
30
 
31
+ spec.add_dependency "activesupport"
31
32
  spec.add_dependency "http", ">= 5.0", "< 6.0"
32
- spec.add_dependency "sorbet-runtime"
33
+ spec.add_dependency "logger"
33
34
 
34
- spec.add_development_dependency "bundler", "~> 2.0"
35
- spec.add_development_dependency "byebug"
36
- spec.add_development_dependency "dotenv"
37
- spec.add_development_dependency "pry-byebug"
38
- spec.add_development_dependency "rake", ">= 12.3.3"
39
- spec.add_development_dependency "rspec", "~> 3.0"
40
- spec.add_development_dependency "rubocop", "~> 0.71"
41
- spec.add_development_dependency "rubocop-performance"
42
- spec.add_development_dependency "rubocop-rspec"
43
- spec.add_development_dependency "sorbet"
44
- spec.add_development_dependency "vcr"
45
- spec.add_development_dependency "webmock"
35
+ spec.metadata["rubygems_mfa_required"] = "true"
46
36
  end
@@ -1,38 +1,24 @@
1
- # typed: ignore
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require "logger"
5
4
 
6
5
  module DearInventory
7
6
  class Config
8
- extend T::Sig
7
+ attr_accessor :account_id, :key, :logger
9
8
 
10
- sig { returns(T.nilable(String)) }
11
- attr_accessor :account_id
12
-
13
- sig { returns(T.nilable(String)) }
14
- attr_accessor :key
15
-
16
- sig { returns(T.untyped) }
17
- attr_accessor :logger
18
-
19
- sig { void }
20
9
  def initialize
21
- @logger = Logger.new(STDOUT)
10
+ @logger = Logger.new($stdout)
22
11
  @logger.level = Logger::WARN
23
12
  end
24
13
 
25
- sig { returns(DearInventory::Environment.class) }
26
14
  def environment
27
15
  DearInventory::Environment
28
16
  end
29
17
 
30
- sig { params(value: Symbol).void }
31
18
  def environment=(value)
32
19
  DearInventory::Environment.set(value)
33
20
  end
34
21
 
35
- sig { params(param: Symbol).returns(String) }
36
22
  def require(param)
37
23
  value = public_send(param)
38
24
  return value unless value.nil? || value.empty?
@@ -40,26 +26,27 @@ module DearInventory
40
26
  require_error(param)
41
27
  end
42
28
 
43
- sig { params(param: Symbol).returns(String) }
44
29
  def require_parameter(param)
45
30
  require(param)
46
31
  rescue ArgumentError => e
47
- message = e.message + "\n" \
48
- "Alternatively, you can pass dynamic values with your request " \
49
- "parameters"
32
+ message = <<~MESSAGE
33
+ #{e.message}
34
+ Alternatively, you can pass dynamic values with your request parameters
35
+ MESSAGE
50
36
  raise ArgumentError, message
51
37
  end
52
38
 
53
39
  private
54
40
 
55
- sig { params(param: Symbol).void }
56
41
  def require_error(param)
57
42
  raise(
58
43
  ArgumentError,
59
- "#{param} is required but hasn't been set.\n" \
60
- "DearInventory.configure do |config|\n" +
61
- %( config.#{param} = "value") + "\n" \
62
- "end"
44
+ <<~MESSAGE
45
+ #{param} is required but hasn't been set.
46
+ DearInventory.configure do |config|
47
+ config.#{param} = "value"
48
+ end
49
+ MESSAGE
63
50
  )
64
51
  end
65
52
  end
@@ -1,4 +1,3 @@
1
- # typed: ignore
2
1
  # frozen_string_literal: true
3
2
 
4
3
  # Usually this class wouldn't be called directly, the environment can be managed
@@ -27,7 +26,7 @@ module DearInventory
27
26
  raise(
28
27
  ArgumentError,
29
28
  "#{error_value} is not an acceptable environment; " \
30
- "please use either :production or :test"
29
+ "please use either :production or :test"
31
30
  )
32
31
  end
33
32
 
@@ -1,16 +1,11 @@
1
- # typed: strong
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  class Error < StandardError
6
- extend T::Sig
7
-
8
- sig { returns(T.nilable(String)) }
9
5
  attr_reader :message
10
6
 
11
- sig { params(message: T.nilable(String)).void }
12
7
  def initialize(message = nil)
13
- @message = T.let(message, T.nilable(String))
8
+ @message = message
14
9
  end
15
10
  end
16
11
  end
@@ -1,4 +1,3 @@
1
- # typed: strong
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
@@ -1,4 +1,3 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
@@ -1,4 +1,3 @@
1
- # typed: strong
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
@@ -1,16 +1,7 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  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
5
  def initialize(message = nil, uri:)
15
6
  message ||= "The endpoint (#{uri}) is not paginated"
16
7
  super(message)
@@ -1,23 +1,13 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  class RequestError < Error
6
- extend T::Sig
7
-
8
- sig { returns(T.nilable(DearInventory::Response)) }
9
5
  attr_reader :response
10
6
 
11
- sig do
12
- params(
13
- message: T.nilable(String),
14
- response: T.nilable(DearInventory::Response)
15
- ).void
16
- end
17
7
  def initialize(message = nil, response = nil)
18
8
  super(message)
19
9
 
20
- @response = T.let(response, T.nilable(DearInventory::Response))
10
+ @response = response
21
11
  end
22
12
  end
23
13
  end
@@ -1,4 +1,3 @@
1
- # typed: strong
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
@@ -1,16 +1,11 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  class DateTime
6
- extend T::Sig
7
-
8
- sig { params(date: T.any(Date, Time)).void }
9
5
  def initialize(date)
10
- @date = T.let(date, T.any(Date, Time))
6
+ @date = date
11
7
  end
12
8
 
13
- sig { returns(String) }
14
9
  def to_s
15
10
  @date.strftime("%FT%T")
16
11
  end
@@ -1,19 +1,7 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  class EndpointClass
6
- extend T::Sig
7
-
8
- sig do
9
- params(
10
- class_type: String,
11
- resource_class: T.class_of(DearInventory::Resource),
12
- endpoint: T.nilable(String)
13
- ).returns(
14
- T.nilable(T.class_of(DearInventory::Parameters))
15
- )
16
- end
17
5
  def self.call(class_type:, resource_class:, endpoint:)
18
6
  new(
19
7
  class_type: class_type,
@@ -22,28 +10,19 @@ module DearInventory
22
10
  ).call
23
11
  end
24
12
 
25
- sig do
26
- params(
27
- class_type: String,
28
- resource_class: T.class_of(DearInventory::Resource),
29
- endpoint: T.nilable(String)
30
- ).void
31
- end
32
13
  def initialize(class_type:, resource_class:, endpoint:)
33
- @class_type = T.let(class_type, String)
34
- @resource_class = T.let(resource_class, T.untyped)
35
- @endpoint = T.let(endpoint || "Index", String)
36
- @class_name = T.let(nil, T.nilable(String))
14
+ @class_type = class_type
15
+ @resource_class = resource_class
16
+ @endpoint = endpoint || "Index"
17
+ @class_name = nil
37
18
  end
38
19
 
39
- sig { returns(T.nilable(T.class_of(DearInventory::Parameters))) }
40
20
  def call
41
21
  Object.const_get(class_name) if Object.const_defined?(class_name)
42
22
  end
43
23
 
44
24
  private
45
25
 
46
- sig { returns(String) }
47
26
  def class_name
48
27
  @class_name ||= begin
49
28
  name = ["DearInventory"]
@@ -1,17 +1,11 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  module IsASubclass
6
- extend T::Sig
7
-
8
- sig { params(comparison_class: T.untyped).returns(T::Boolean) }
9
5
  def is_a?(comparison_class)
10
6
  return true if super
11
7
 
12
- if T.unsafe(self).class == Class
13
- return T.unsafe(self).ancestors.include?(comparison_class)
14
- end
8
+ return self <= comparison_class if instance_of?(Class)
15
9
 
16
10
  false
17
11
  end
@@ -1,33 +1,17 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  class Request
6
- extend T::Sig
7
-
8
- sig do
9
- params(
10
- parameters: DearInventory::Models::Request,
11
- num_previous_records: Integer
12
- ).returns(DearInventory::Response)
13
- end
14
5
  def self.call(parameters, num_previous_records: 0)
15
6
  new(parameters, num_previous_records: num_previous_records).call
16
7
  end
17
8
 
18
- sig do
19
- params(
20
- parameters: DearInventory::Models::Request,
21
- num_previous_records: Integer
22
- ).void
23
- end
24
9
  def initialize(parameters, num_previous_records: 0)
25
- @parameters = T.let(parameters, DearInventory::Models::Request)
26
- @num_previous_records = T.let(num_previous_records, Integer)
27
- @retries = T.let(0, Integer)
10
+ @parameters = parameters
11
+ @num_previous_records = num_previous_records
12
+ @retries = 0
28
13
  end
29
14
 
30
- sig { returns(DearInventory::Response) }
31
15
  def call
32
16
  options = request_params(@parameters.action, @parameters.params)
33
17
  response = HTTP.headers(headers).
@@ -44,7 +28,6 @@ module DearInventory
44
28
 
45
29
  private
46
30
 
47
- sig { returns(T::Hash[Symbol, String]) }
48
31
  def headers
49
32
  {
50
33
  "Content-Type": "application/json",
@@ -53,10 +36,6 @@ module DearInventory
53
36
  }
54
37
  end
55
38
 
56
- sig do
57
- params(action: Symbol, params: DearInventory::Parameters).
58
- returns(T::Hash[Symbol, T::Hash[Symbol, T.untyped]])
59
- end
60
39
  def request_params(action, params)
61
40
  if %i[get delete].include?(action)
62
41
  { params: params.to_h }
@@ -65,17 +44,13 @@ module DearInventory
65
44
  end
66
45
  end
67
46
 
68
- ERROR_MESSAGE_PREFIXES = T.let(
69
- {
70
- DearInventory::APILimitError => "The API request limit was reached",
71
- HTTP::ConnectionError => "There was an error connecting to the API",
72
- }.freeze,
73
- T::Hash[T.class_of(StandardError), String]
74
- )
75
- MAX_RETRIES = T.let(4, Integer)
76
- RETRY_DELAY = T.let(5, Integer)
77
-
78
- sig { params(error: StandardError).returns(DearInventory::Response) }
47
+ ERROR_MESSAGE_PREFIXES = {
48
+ DearInventory::APILimitError => "The API request limit was reached",
49
+ HTTP::ConnectionError => "There was an error connecting to the API",
50
+ }.freeze
51
+ MAX_RETRIES = 4
52
+ RETRY_DELAY = 5
53
+ private_constant :ERROR_MESSAGE_PREFIXES, :MAX_RETRIES, :RETRY_DELAY
79
54
  def retry_request(error)
80
55
  @retries += 1
81
56
  raise if @retries >= MAX_RETRIES
@@ -1,11 +1,7 @@
1
- # typed: strict
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module Strings
5
4
  class Urlize
6
- extend T::Sig
7
-
8
- sig { params(camel_cased_word: String).returns(String) }
9
5
  def self.call(camel_cased_word)
10
6
  return camel_cased_word unless /[A-Z_]/.match?(camel_cased_word)
11
7
 
@@ -1,4 +1,3 @@
1
- # typed: true
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require "bigdecimal/util"
@@ -6,90 +5,47 @@ require "json"
6
5
 
7
6
  module DearInventory
8
7
  class Model
9
- extend T::Sig
10
- extend T::Helpers
11
- abstract!
12
-
13
8
  extend DearInventory::IsASubclass
14
9
 
15
- sig do
16
- params(
17
- fields: T::Hash[
18
- Symbol,
19
- T::Hash[Symbol, T.any(Symbol, T.class_of(DearInventory::Model))]
20
- ]
21
- ).void
22
- end
23
10
  def self.fields(fields)
24
- ancestor = T.must(ancestors[1])
25
- if ancestor.const_defined?(:FIELDS)
26
- fields = ancestor.const_get(:FIELDS).merge(fields)
27
- end
11
+ ancestor = ancestors[1]
12
+ fields = ancestor.const_get(:FIELDS).merge(fields) if ancestor.const_defined?(:FIELDS)
28
13
  const_set(:FIELDS, fields.freeze)
29
14
 
30
15
  define_readers
31
16
  end
32
17
 
33
- sig { void }
34
18
  def self.define_readers
35
19
  enumerate_fields do |_, specifications|
36
20
  __send__(:attr_reader, specifications[:name])
37
21
 
38
- if specifications[:type] == :ResultSet
39
- alias_method :records, specifications[:name]
40
- end
22
+ alias_method :records, specifications[:name] if specifications[:type] == :ResultSet
41
23
  end
42
24
  end
43
25
 
44
- sig { void }
45
- def self.enumerate_fields
46
- const_get(:FIELDS).each do |response_name, specifications|
47
- yield(response_name, specifications)
48
- end
26
+ def self.enumerate_fields(&)
27
+ const_get(:FIELDS).each(&)
49
28
  end
50
29
 
51
- alias initialize_abstract initialize
52
-
53
- sig do
54
- params(values: T.nilable(T::Hash[T.any(String, Symbol), T.untyped])).void
55
- end
56
30
  def initialize(values = nil)
57
- initialize_abstract
58
-
59
31
  return if values.nil?
60
32
 
61
33
  self.class.enumerate_fields do |response_name, specifications|
62
- value = field_value(response_name, T.must(values), specifications)
34
+ value = field_value(response_name, values, specifications)
63
35
  instance_variable_set(:"@#{specifications[:name]}", value)
64
36
  end
65
37
  end
66
38
 
67
- sig { returns(T::Hash[Symbol, T.untyped]) }
68
39
  def to_h
69
40
  {}.tap do |hash|
70
- self.class.enumerate_fields do |_, specifications|
71
- key = specifications[:name]
72
- hash[key] = public_send(key)
73
- end
41
+ attributes_to_hash(hash)
74
42
  end
75
43
  end
76
44
 
77
45
  private
78
46
 
79
- sig do
80
- params(
81
- response_name: Symbol,
82
- values:
83
- T::Hash[T.any(String, Symbol), T.untyped],
84
- specifications:
85
- T::Hash[Symbol, T.any(Symbol, T.class_of(DearInventory::Model))]
86
- ).returns(T.untyped)
87
- end
88
47
  def field_value(response_name, values, specifications)
89
- model = T.cast(
90
- specifications[:model],
91
- T.nilable(T.class_of(DearInventory::Model))
92
- )
48
+ model = specifications[:model]
93
49
  value = values[response_name.to_s]
94
50
  return if value == ""
95
51
 
@@ -101,7 +57,7 @@ module DearInventory
101
57
  def format_value(value, type, model)
102
58
  case type
103
59
  when :Array, :ResultSet
104
- initialize_array_values_in_models(value, T.must(model))
60
+ initialize_array_values_in_models(value, model)
105
61
  when :BigDecimal
106
62
  value.to_d
107
63
  when :Date
@@ -109,7 +65,9 @@ module DearInventory
109
65
  when :DateTime
110
66
  ::DateTime.parse(value) unless value.nil?
111
67
  when :Hash
112
- T.must(model).new(value)
68
+ model.new(value)
69
+ when :Integer
70
+ value.to_i
113
71
  else
114
72
  value
115
73
  end
@@ -117,12 +75,21 @@ module DearInventory
117
75
  # rubocop:enable Metrics/CyclomaticComplexity
118
76
  # rubocop:enable Metrics/MethodLength
119
77
 
120
- sig do
121
- params(
122
- array: T.nilable(T::Array[T::Hash[T.any(String, Symbol), T.untyped]]),
123
- model: T.class_of(DearInventory::Model)
124
- ).returns(T.nilable(T::Array[DearInventory::Model]))
78
+ def attributes_to_hash(hash)
79
+ self.class.enumerate_fields do |_, specifications|
80
+ key = specifications[:name]
81
+ hash[key] = public_send(key)
82
+
83
+ nested_attributes_to_hash(hash[key]) if hash[key].is_a?(Array)
84
+ end
125
85
  end
86
+
87
+ def nested_attributes_to_hash(collection)
88
+ collection.each_with_index do |record, index|
89
+ collection[index] = record.to_h
90
+ end
91
+ end
92
+
126
93
  def initialize_array_values_in_models(array, model)
127
94
  return if array.nil?
128
95
 
@@ -1,11 +1,8 @@
1
- # typed: strong
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  module Models
6
5
  class AdditionalAttributes < DearInventory::Model
7
- extend T::Sig
8
-
9
6
  fields(
10
7
  AdditionalAttribute1: {
11
8
  name: :additional_attribute_1,
@@ -1,11 +1,8 @@
1
- # typed: strong
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module DearInventory
5
4
  module Models
6
5
  class Address < DearInventory::Model
7
- extend T::Sig
8
-
9
6
  fields(
10
7
  DisplayAddressLine1: {
11
8
  name: :display_address_line_1,