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.
- checksums.yaml +4 -4
- data/.rubocop.yml +13 -4
- data/Gemfile +14 -0
- data/README.md +1 -10
- data/dear_inventory.gemspec +5 -15
- data/lib/dear_inventory/config.rb +12 -25
- data/lib/dear_inventory/environment.rb +1 -2
- data/lib/dear_inventory/error.rb +1 -6
- data/lib/dear_inventory/errors/api_limit.rb +0 -1
- data/lib/dear_inventory/errors/bad_request.rb +0 -1
- data/lib/dear_inventory/errors/no_more_pages.rb +0 -1
- data/lib/dear_inventory/errors/not_paginated.rb +0 -9
- data/lib/dear_inventory/errors/request.rb +1 -11
- data/lib/dear_inventory/errors/validation.rb +0 -1
- data/lib/dear_inventory/lib/date_time.rb +1 -6
- data/lib/dear_inventory/lib/endpoint_class.rb +4 -25
- data/lib/dear_inventory/lib/is_a_subclass.rb +1 -7
- data/lib/dear_inventory/lib/request.rb +10 -35
- data/lib/dear_inventory/lib/strings/urlize.rb +0 -4
- data/lib/dear_inventory/model.rb +26 -59
- data/lib/dear_inventory/models/additional_attributes.rb +0 -3
- data/lib/dear_inventory/models/address.rb +0 -3
- data/lib/dear_inventory/models/advanced_purchase.rb +0 -3
- data/lib/dear_inventory/models/attachment.rb +0 -3
- data/lib/dear_inventory/models/bill_of_materials_product.rb +0 -3
- data/lib/dear_inventory/models/bill_of_materials_service.rb +0 -3
- data/lib/dear_inventory/models/customer.rb +0 -3
- data/lib/dear_inventory/models/customers/address.rb +0 -3
- data/lib/dear_inventory/models/customers/contact.rb +0 -3
- data/lib/dear_inventory/models/customers.rb +0 -3
- data/lib/dear_inventory/models/inventory_movement.rb +0 -3
- data/lib/dear_inventory/models/product.rb +0 -3
- data/lib/dear_inventory/models/product_availability.rb +0 -3
- data/lib/dear_inventory/models/product_availability_results.rb +0 -3
- data/lib/dear_inventory/models/products/movement.rb +0 -3
- data/lib/dear_inventory/models/products.rb +0 -3
- data/lib/dear_inventory/models/purchase.rb +0 -3
- data/lib/dear_inventory/models/purchases/additional_charge.rb +0 -3
- data/lib/dear_inventory/models/purchases/advanced/credit_note.rb +0 -3
- data/lib/dear_inventory/models/purchases/advanced/invoice.rb +0 -3
- data/lib/dear_inventory/models/purchases/advanced/manual_journal.rb +0 -3
- data/lib/dear_inventory/models/purchases/advanced/put_away.rb +0 -3
- data/lib/dear_inventory/models/purchases/advanced/put_away_line.rb +0 -3
- data/lib/dear_inventory/models/purchases/advanced/stock.rb +0 -3
- data/lib/dear_inventory/models/purchases/advanced/stock_line.rb +0 -3
- data/lib/dear_inventory/models/purchases/credit_note.rb +0 -3
- data/lib/dear_inventory/models/purchases/inventory_movement.rb +0 -3
- data/lib/dear_inventory/models/purchases/invoice.rb +0 -3
- data/lib/dear_inventory/models/purchases/invoice_additional_charge.rb +0 -3
- data/lib/dear_inventory/models/purchases/invoice_line.rb +0 -3
- data/lib/dear_inventory/models/purchases/line.rb +0 -3
- data/lib/dear_inventory/models/purchases/manual_journal.rb +0 -3
- data/lib/dear_inventory/models/purchases/manual_journal_line.rb +0 -3
- data/lib/dear_inventory/models/purchases/order.rb +0 -3
- data/lib/dear_inventory/models/purchases/payment_line.rb +0 -3
- data/lib/dear_inventory/models/purchases/stock.rb +0 -3
- data/lib/dear_inventory/models/purchases/stock_line.rb +0 -3
- data/lib/dear_inventory/models/purchases/unstock_line.rb +0 -3
- data/lib/dear_inventory/models/purchases.rb +3 -8
- data/lib/dear_inventory/models/purchases_results.rb +0 -3
- data/lib/dear_inventory/models/reorder_level.rb +0 -3
- data/lib/dear_inventory/models/request.rb +5 -16
- data/lib/dear_inventory/models/sale.rb +0 -3
- data/lib/dear_inventory/models/sales/additional_charge.rb +0 -3
- data/lib/dear_inventory/models/sales/credit_note.rb +0 -3
- data/lib/dear_inventory/models/sales/fulfilment.rb +0 -3
- data/lib/dear_inventory/models/sales/fulfilments/pick_pack.rb +0 -3
- data/lib/dear_inventory/models/sales/fulfilments/pick_pack_line.rb +0 -3
- data/lib/dear_inventory/models/sales/fulfilments/ship.rb +0 -3
- data/lib/dear_inventory/models/sales/fulfilments/ship_line.rb +0 -3
- data/lib/dear_inventory/models/sales/invoice.rb +0 -3
- data/lib/dear_inventory/models/sales/invoice_additional_charge.rb +0 -3
- data/lib/dear_inventory/models/sales/invoice_line.rb +0 -3
- data/lib/dear_inventory/models/sales/line.rb +0 -3
- data/lib/dear_inventory/models/sales/manual_journal.rb +0 -3
- data/lib/dear_inventory/models/sales/manual_journal_line.rb +0 -3
- data/lib/dear_inventory/models/sales/order.rb +0 -3
- data/lib/dear_inventory/models/sales/payment_line.rb +0 -3
- data/lib/dear_inventory/models/sales/quote.rb +0 -3
- data/lib/dear_inventory/models/sales.rb +1 -6
- data/lib/dear_inventory/models/sales_results.rb +0 -3
- data/lib/dear_inventory/models/shipping_address.rb +0 -3
- data/lib/dear_inventory/models/supplier.rb +0 -3
- data/lib/dear_inventory/models/test_request.rb +5 -20
- data/lib/dear_inventory/models/transaction.rb +0 -3
- data/lib/dear_inventory/parameters/advanced_purchase/show.rb +0 -3
- data/lib/dear_inventory/parameters/customer/create.rb +170 -0
- data/lib/dear_inventory/parameters/customer/index.rb +0 -3
- data/lib/dear_inventory/parameters/customer/show.rb +170 -0
- data/lib/dear_inventory/parameters/customer/update.rb +175 -0
- data/lib/dear_inventory/parameters/product/index.rb +0 -3
- data/lib/dear_inventory/parameters/product_availability/index.rb +0 -3
- data/lib/dear_inventory/parameters/purchase/index.rb +0 -3
- data/lib/dear_inventory/parameters/purchase/show.rb +0 -3
- data/lib/dear_inventory/parameters/sale/delete.rb +0 -3
- data/lib/dear_inventory/parameters/sale/index.rb +0 -3
- data/lib/dear_inventory/parameters/sale/show.rb +0 -3
- data/lib/dear_inventory/parameters.rb +16 -97
- data/lib/dear_inventory/resource.rb +4 -15
- data/lib/dear_inventory/resources/advanced_purchase.rb +0 -7
- data/lib/dear_inventory/resources/customer.rb +17 -10
- data/lib/dear_inventory/resources/product.rb +0 -7
- data/lib/dear_inventory/resources/product_availability.rb +1 -9
- data/lib/dear_inventory/resources/purchase.rb +0 -12
- data/lib/dear_inventory/resources/sale.rb +3 -22
- data/lib/dear_inventory/response.rb +25 -73
- data/lib/dear_inventory/test_response.rb +9 -24
- data/lib/dear_inventory/validator.rb +10 -38
- data/lib/dear_inventory/validators/array.rb +15 -0
- data/lib/dear_inventory/validators/boolean.rb +0 -4
- data/lib/dear_inventory/validators/enum.rb +2 -6
- data/lib/dear_inventory/validators/guid.rb +4 -11
- data/lib/dear_inventory/validators/integer.rb +0 -4
- data/lib/dear_inventory/validators/required.rb +0 -4
- data/lib/dear_inventory/validators/string.rb +0 -4
- data/lib/dear_inventory/validators/time.rb +0 -4
- data/lib/dear_inventory/version.rb +1 -2
- data/lib/dear_inventory.rb +6 -12
- metadata +22 -219
- data/sorbet/config +0 -2
- data/sorbet/rbi/gems/addressable.rbi +0 -199
- data/sorbet/rbi/gems/ast.rbi +0 -48
- data/sorbet/rbi/gems/byebug.rbi +0 -1040
- data/sorbet/rbi/gems/coderay.rbi +0 -92
- data/sorbet/rbi/gems/crack.rbi +0 -48
- data/sorbet/rbi/gems/domain_name.rbi +0 -52
- data/sorbet/rbi/gems/dotenv.rbi +0 -68
- data/sorbet/rbi/gems/ffi-compiler.rbi +0 -27
- data/sorbet/rbi/gems/ffi.rbi +0 -560
- data/sorbet/rbi/gems/hashdiff.rbi +0 -66
- data/sorbet/rbi/gems/http-cookie.rbi +0 -93
- data/sorbet/rbi/gems/http-form_data.rbi +0 -76
- data/sorbet/rbi/gems/http-parser.rbi +0 -121
- data/sorbet/rbi/gems/http.rbi +0 -616
- data/sorbet/rbi/gems/jaro_winkler.rbi +0 -15
- data/sorbet/rbi/gems/method_source.rbi +0 -64
- data/sorbet/rbi/gems/parallel.rbi +0 -82
- data/sorbet/rbi/gems/parser.rbi +0 -857
- data/sorbet/rbi/gems/pry-byebug.rbi +0 -155
- data/sorbet/rbi/gems/pry.rbi +0 -1965
- data/sorbet/rbi/gems/public_suffix.rbi +0 -104
- data/sorbet/rbi/gems/rainbow.rbi +0 -118
- data/sorbet/rbi/gems/rake.rbi +0 -646
- data/sorbet/rbi/gems/rspec-core.rbi +0 -1732
- data/sorbet/rbi/gems/rspec-expectations.rbi +0 -388
- data/sorbet/rbi/gems/rspec-mocks.rbi +0 -820
- data/sorbet/rbi/gems/rspec-support.rbi +0 -269
- data/sorbet/rbi/gems/rspec.rbi +0 -15
- data/sorbet/rbi/gems/rubocop-performance.rbi +0 -277
- data/sorbet/rbi/gems/rubocop-rspec.rbi +0 -887
- data/sorbet/rbi/gems/rubocop.rbi +0 -6952
- data/sorbet/rbi/gems/ruby-progressbar.rbi +0 -305
- data/sorbet/rbi/gems/unf.rbi +0 -19
- data/sorbet/rbi/gems/unicode-display_width.rbi +0 -17
- data/sorbet/rbi/gems/vcr.rbi +0 -572
- data/sorbet/rbi/gems/webmock.rbi +0 -569
- data/sorbet/rbi/hidden-definitions/errors.txt +0 -11809
- data/sorbet/rbi/hidden-definitions/hidden.rbi +0 -20623
- data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +0 -8684
- data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +0 -276
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi +0 -4222
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +0 -111
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +0 -543
- data/sorbet/rbi/todo.rbi +0 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 71b2b64af358567bd4f1a475d081aafd3c00150872a11fb7628fdbfbb97dc2c7
|
|
4
|
+
data.tar.gz: 0c4caf15c3e4b827f08062219c903e33110e01576f3c7cbce7baa7f834299a6c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0b4196a33a0f47a82bee9dd375e30d24ffd560fd9f122dc88a3cd24278edd118a5bb729ee1fe8e71077b7b290561fbdd857cad0656f15a3a783fbedf272f0250
|
|
7
|
+
data.tar.gz: 59c6329f0930b9d1e8ca0324fb00171172cc5bb05f6bf0b90dd441d8701a4eecc2b378fa1c1e7a35546bf919b39e293572766e79dd78b52a6ee8f7c221781122
|
data/.rubocop.yml
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
plugins:
|
|
2
2
|
- rubocop-performance
|
|
3
3
|
- rubocop-rspec
|
|
4
4
|
|
|
5
5
|
AllCops:
|
|
6
|
-
TargetRubyVersion:
|
|
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:
|
|
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/
|
|
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
|
|
data/dear_inventory.gemspec
CHANGED
|
@@ -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 = ">=
|
|
20
|
-
spec.required_rubygems_version = ">=
|
|
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 "
|
|
33
|
+
spec.add_dependency "logger"
|
|
33
34
|
|
|
34
|
-
spec.
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
29
|
+
"please use either :production or :test"
|
|
31
30
|
)
|
|
32
31
|
end
|
|
33
32
|
|
data/lib/dear_inventory/error.rb
CHANGED
|
@@ -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 =
|
|
8
|
+
@message = message
|
|
14
9
|
end
|
|
15
10
|
end
|
|
16
11
|
end
|
|
@@ -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 =
|
|
10
|
+
@response = response
|
|
21
11
|
end
|
|
22
12
|
end
|
|
23
13
|
end
|
|
@@ -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 =
|
|
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 =
|
|
34
|
-
@resource_class =
|
|
35
|
-
@endpoint =
|
|
36
|
-
@class_name =
|
|
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
|
-
|
|
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 =
|
|
26
|
-
@num_previous_records =
|
|
27
|
-
@retries =
|
|
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 =
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
data/lib/dear_inventory/model.rb
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
45
|
-
|
|
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,
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
|