dear_inventory 1.4.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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 +18 -55
- 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: 0fb20442d0a660bc2e697213c166e928d164952bda1e531ad449c2356b85f9bc
|
|
4
|
+
data.tar.gz: 4aaeda28158aaf787e854af382d98a4f8ea20f01e805a40d1f3d0470bcde1ab6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7c632d01d244d518fa513c3baf4106d7a40ea0f202fec842e5c8db773257c66d1f839f255365187846a14f159a97f1285e43bd6e22e85a52ea797b19de1df094
|
|
7
|
+
data.tar.gz: 46cceddc01f75e88068b7878f85768c79334c16431fde2b0848f196d14caae5123b6ee11461183cff70f7933b8d85772848472f5419ae94fa1fa280f78738893
|
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,52 @@ 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
41
|
self.class.enumerate_fields do |_, specifications|
|
|
71
42
|
key = specifications[:name]
|
|
72
43
|
hash[key] = public_send(key)
|
|
44
|
+
|
|
45
|
+
nested_attributes_to_hash(hash[key]) if hash[key].is_a?(Array)
|
|
73
46
|
end
|
|
74
47
|
end
|
|
75
48
|
end
|
|
76
49
|
|
|
77
50
|
private
|
|
78
51
|
|
|
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
52
|
def field_value(response_name, values, specifications)
|
|
89
|
-
model =
|
|
90
|
-
specifications[:model],
|
|
91
|
-
T.nilable(T.class_of(DearInventory::Model))
|
|
92
|
-
)
|
|
53
|
+
model = specifications[:model]
|
|
93
54
|
value = values[response_name.to_s]
|
|
94
55
|
return if value == ""
|
|
95
56
|
|
|
@@ -101,7 +62,7 @@ module DearInventory
|
|
|
101
62
|
def format_value(value, type, model)
|
|
102
63
|
case type
|
|
103
64
|
when :Array, :ResultSet
|
|
104
|
-
initialize_array_values_in_models(value,
|
|
65
|
+
initialize_array_values_in_models(value, model)
|
|
105
66
|
when :BigDecimal
|
|
106
67
|
value.to_d
|
|
107
68
|
when :Date
|
|
@@ -109,7 +70,9 @@ module DearInventory
|
|
|
109
70
|
when :DateTime
|
|
110
71
|
::DateTime.parse(value) unless value.nil?
|
|
111
72
|
when :Hash
|
|
112
|
-
|
|
73
|
+
model.new(value)
|
|
74
|
+
when :Integer
|
|
75
|
+
value.to_i
|
|
113
76
|
else
|
|
114
77
|
value
|
|
115
78
|
end
|
|
@@ -117,12 +80,12 @@ module DearInventory
|
|
|
117
80
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
118
81
|
# rubocop:enable Metrics/MethodLength
|
|
119
82
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
).returns(T.nilable(T::Array[DearInventory::Model]))
|
|
83
|
+
def nested_attributes_to_hash(collection)
|
|
84
|
+
collection.each_with_index do |record, index|
|
|
85
|
+
collection[index] = record.to_h
|
|
86
|
+
end
|
|
125
87
|
end
|
|
88
|
+
|
|
126
89
|
def initialize_array_values_in_models(array, model)
|
|
127
90
|
return if array.nil?
|
|
128
91
|
|