dear_inventory 0.2.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 (110) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +2 -0
  3. data/.gitignore +15 -0
  4. data/.rspec +5 -0
  5. data/.rubocop.yml +84 -0
  6. data/.travis.yml +7 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +6 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +69 -0
  11. data/Rakefile +8 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/dear_inventory.gemspec +45 -0
  15. data/lib/dear_inventory.rb +79 -0
  16. data/lib/dear_inventory/config.rb +55 -0
  17. data/lib/dear_inventory/environment.rb +54 -0
  18. data/lib/dear_inventory/error.rb +16 -0
  19. data/lib/dear_inventory/errors/request.rb +40 -0
  20. data/lib/dear_inventory/errors/validation.rb +6 -0
  21. data/lib/dear_inventory/lib/date_time.rb +18 -0
  22. data/lib/dear_inventory/lib/endpoint_class.rb +57 -0
  23. data/lib/dear_inventory/lib/is_a_subclass.rb +19 -0
  24. data/lib/dear_inventory/model.rb +98 -0
  25. data/lib/dear_inventory/models/additional_attributes.rb +53 -0
  26. data/lib/dear_inventory/models/additional_charge.rb +45 -0
  27. data/lib/dear_inventory/models/address.rb +45 -0
  28. data/lib/dear_inventory/models/attachment.rb +33 -0
  29. data/lib/dear_inventory/models/inventory_movement.rb +29 -0
  30. data/lib/dear_inventory/models/sale.rb +217 -0
  31. data/lib/dear_inventory/models/sale_list.rb +133 -0
  32. data/lib/dear_inventory/models/sale_lists.rb +26 -0
  33. data/lib/dear_inventory/models/sales/credit_note.rb +75 -0
  34. data/lib/dear_inventory/models/sales/fulfilment.rb +46 -0
  35. data/lib/dear_inventory/models/sales/fulfilments/pick_pack.rb +26 -0
  36. data/lib/dear_inventory/models/sales/fulfilments/pick_pack_line.rb +57 -0
  37. data/lib/dear_inventory/models/sales/fulfilments/ship.rb +35 -0
  38. data/lib/dear_inventory/models/sales/fulfilments/ship_line.rb +45 -0
  39. data/lib/dear_inventory/models/sales/invoice.rb +86 -0
  40. data/lib/dear_inventory/models/sales/invoice_line.rb +19 -0
  41. data/lib/dear_inventory/models/sales/line.rb +59 -0
  42. data/lib/dear_inventory/models/sales/manual_journal.rb +24 -0
  43. data/lib/dear_inventory/models/sales/manual_journal_line.rb +35 -0
  44. data/lib/dear_inventory/models/sales/order.rb +49 -0
  45. data/lib/dear_inventory/models/sales/payment_line.rb +43 -0
  46. data/lib/dear_inventory/models/sales/quote.rb +50 -0
  47. data/lib/dear_inventory/models/shipping_address.rb +25 -0
  48. data/lib/dear_inventory/models/transaction.rb +41 -0
  49. data/lib/dear_inventory/parameters.rb +209 -0
  50. data/lib/dear_inventory/parameters/sale/index.rb +35 -0
  51. data/lib/dear_inventory/parameters/sale_list/index.rb +119 -0
  52. data/lib/dear_inventory/resource.rb +59 -0
  53. data/lib/dear_inventory/resources/sale.rb +22 -0
  54. data/lib/dear_inventory/resources/sale_list.rb +24 -0
  55. data/lib/dear_inventory/response.rb +75 -0
  56. data/lib/dear_inventory/validator.rb +61 -0
  57. data/lib/dear_inventory/validators/boolean.rb +18 -0
  58. data/lib/dear_inventory/validators/enum.rb +23 -0
  59. data/lib/dear_inventory/validators/guid.rb +27 -0
  60. data/lib/dear_inventory/validators/integer.rb +19 -0
  61. data/lib/dear_inventory/validators/required.rb +17 -0
  62. data/lib/dear_inventory/validators/string.rb +35 -0
  63. data/lib/dear_inventory/validators/time.rb +21 -0
  64. data/lib/dear_inventory/version.rb +6 -0
  65. data/sorbet/config +2 -0
  66. data/sorbet/rbi/gems/addressable.rbi +199 -0
  67. data/sorbet/rbi/gems/ast.rbi +48 -0
  68. data/sorbet/rbi/gems/byebug.rbi +1040 -0
  69. data/sorbet/rbi/gems/coderay.rbi +92 -0
  70. data/sorbet/rbi/gems/crack.rbi +48 -0
  71. data/sorbet/rbi/gems/domain_name.rbi +52 -0
  72. data/sorbet/rbi/gems/dotenv.rbi +68 -0
  73. data/sorbet/rbi/gems/ffi-compiler.rbi +27 -0
  74. data/sorbet/rbi/gems/ffi.rbi +560 -0
  75. data/sorbet/rbi/gems/hashdiff.rbi +66 -0
  76. data/sorbet/rbi/gems/http-cookie.rbi +93 -0
  77. data/sorbet/rbi/gems/http-form_data.rbi +76 -0
  78. data/sorbet/rbi/gems/http-parser.rbi +121 -0
  79. data/sorbet/rbi/gems/http.rbi +616 -0
  80. data/sorbet/rbi/gems/jaro_winkler.rbi +15 -0
  81. data/sorbet/rbi/gems/method_source.rbi +64 -0
  82. data/sorbet/rbi/gems/parallel.rbi +82 -0
  83. data/sorbet/rbi/gems/parser.rbi +857 -0
  84. data/sorbet/rbi/gems/pry-byebug.rbi +155 -0
  85. data/sorbet/rbi/gems/pry.rbi +1965 -0
  86. data/sorbet/rbi/gems/public_suffix.rbi +104 -0
  87. data/sorbet/rbi/gems/rainbow.rbi +118 -0
  88. data/sorbet/rbi/gems/rake.rbi +646 -0
  89. data/sorbet/rbi/gems/rspec-core.rbi +1732 -0
  90. data/sorbet/rbi/gems/rspec-expectations.rbi +388 -0
  91. data/sorbet/rbi/gems/rspec-mocks.rbi +820 -0
  92. data/sorbet/rbi/gems/rspec-support.rbi +269 -0
  93. data/sorbet/rbi/gems/rspec.rbi +15 -0
  94. data/sorbet/rbi/gems/rubocop-performance.rbi +277 -0
  95. data/sorbet/rbi/gems/rubocop-rspec.rbi +887 -0
  96. data/sorbet/rbi/gems/rubocop.rbi +6952 -0
  97. data/sorbet/rbi/gems/ruby-progressbar.rbi +305 -0
  98. data/sorbet/rbi/gems/unf.rbi +19 -0
  99. data/sorbet/rbi/gems/unicode-display_width.rbi +17 -0
  100. data/sorbet/rbi/gems/vcr.rbi +572 -0
  101. data/sorbet/rbi/gems/webmock.rbi +569 -0
  102. data/sorbet/rbi/hidden-definitions/errors.txt +11809 -0
  103. data/sorbet/rbi/hidden-definitions/hidden.rbi +20627 -0
  104. data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +8684 -0
  105. data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +276 -0
  106. data/sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi +4222 -0
  107. data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +111 -0
  108. data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +543 -0
  109. data/sorbet/rbi/todo.rbi +11 -0
  110. metadata +339 -0
@@ -0,0 +1,24 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ module Sales
7
+ class ManualJournal < DearInventory::Model
8
+ extend T::Sig
9
+
10
+ fields({
11
+ Status: {
12
+ name: :status,
13
+ type: :String,
14
+ },
15
+ Lines: {
16
+ name: :lines,
17
+ type: :Array,
18
+ model: DearInventory::Models::Sales::ManualJournalLine,
19
+ },
20
+ })
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ module Sales
7
+ class ManualJournalLine < DearInventory::Model
8
+ extend T::Sig
9
+
10
+ fields({
11
+ Reference: {
12
+ name: :reference,
13
+ type: :String,
14
+ },
15
+ Amount: {
16
+ name: :amount,
17
+ type: :Numeric,
18
+ },
19
+ Date: {
20
+ name: :date,
21
+ type: :DateTime,
22
+ },
23
+ Debit: {
24
+ name: :debit,
25
+ type: :String,
26
+ },
27
+ Credit: {
28
+ name: :credit,
29
+ type: :String,
30
+ },
31
+ })
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,49 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ module Sales
7
+ class Order < DearInventory::Model
8
+ extend T::Sig
9
+
10
+ fields({
11
+ SaleOrderNumber: {
12
+ name: :sale_order_number,
13
+ type: :String,
14
+ },
15
+ Memo: {
16
+ name: :memo,
17
+ type: :String,
18
+ },
19
+ Status: {
20
+ name: :status,
21
+ type: :String,
22
+ },
23
+ Lines: {
24
+ name: :lines,
25
+ type: :Array,
26
+ model: DearInventory::Models::Sales::Line,
27
+ },
28
+ AdditionalCharges: {
29
+ name: :additional_charges,
30
+ type: :Array,
31
+ model: DearInventory::Models::AdditionalCharge,
32
+ },
33
+ TotalBeforeTax: {
34
+ name: :total_before_tax,
35
+ type: :Numeric,
36
+ },
37
+ Tax: {
38
+ name: :tax,
39
+ type: :Numeric,
40
+ },
41
+ Total: {
42
+ name: :total,
43
+ type: :Numeric,
44
+ },
45
+ })
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,43 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ module Sales
7
+ class PaymentLine < DearInventory::Model
8
+ extend T::Sig
9
+
10
+ fields({
11
+ ID: {
12
+ name: :id,
13
+ type: :Guid,
14
+ },
15
+ Reference: {
16
+ name: :reference,
17
+ type: :String,
18
+ },
19
+ Amount: {
20
+ name: :amount,
21
+ type: :Numeric,
22
+ },
23
+ DatePaid: {
24
+ name: :date_paid,
25
+ type: :DateTime,
26
+ },
27
+ Account: {
28
+ name: :account,
29
+ type: :String,
30
+ },
31
+ CurrencyRate: {
32
+ name: :currency_rate,
33
+ type: :Numeric,
34
+ },
35
+ DateCreated: {
36
+ name: :date_created,
37
+ type: :DateTime,
38
+ },
39
+ })
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,50 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ module Sales
7
+ class Quote < DearInventory::Model
8
+ extend T::Sig
9
+
10
+ fields({
11
+ Memo: {
12
+ name: :memo,
13
+ type: :String,
14
+ },
15
+ Status: {
16
+ name: :status,
17
+ type: :String,
18
+ },
19
+ Prepayments: {
20
+ name: :prepayments,
21
+ type: :Array,
22
+ model: DearInventory::Models::Sales::PaymentLine,
23
+ },
24
+ Lines: {
25
+ name: :lines,
26
+ type: :Array,
27
+ model: DearInventory::Models::Sales::Line,
28
+ },
29
+ AdditionalCharges: {
30
+ name: :additional_charges,
31
+ type: :Array,
32
+ model: DearInventory::Models::AdditionalCharge,
33
+ },
34
+ TotalBeforeTax: {
35
+ name: :total_before_tax,
36
+ type: :Numeric,
37
+ },
38
+ Tax: {
39
+ name: :tax,
40
+ type: :Numeric,
41
+ },
42
+ Total: {
43
+ name: :total,
44
+ type: :Numeric,
45
+ },
46
+ })
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,25 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ class ShippingAddress < Address
7
+ extend T::Sig
8
+
9
+ fields({
10
+ Company: {
11
+ name: :company,
12
+ type: :String,
13
+ },
14
+ Contact: {
15
+ name: :contact,
16
+ type: :String,
17
+ },
18
+ ShipToOther: {
19
+ name: :ship_to_other,
20
+ type: :Boolean,
21
+ },
22
+ })
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ module Models
6
+ class Transaction < DearInventory::Model
7
+ extend T::Sig
8
+
9
+ fields({
10
+ TaskID: {
11
+ name: :task_id,
12
+ type: :Guid,
13
+ },
14
+ TransactionID: {
15
+ name: :transaction_id,
16
+ type: :Guid,
17
+ },
18
+ Debit: {
19
+ name: :debit,
20
+ type: :String,
21
+ },
22
+ Credit: {
23
+ name: :credit,
24
+ type: :String,
25
+ },
26
+ Description: {
27
+ name: :description,
28
+ type: :String,
29
+ },
30
+ Amount: {
31
+ name: :credit,
32
+ type: :Numeric,
33
+ },
34
+ EffectiveDate: {
35
+ name: :description,
36
+ type: :DateTime,
37
+ },
38
+ })
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,209 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module DearInventory
5
+ class Parameters
6
+ extend T::Sig
7
+ extend DearInventory::IsASubclass
8
+
9
+ sig { params(params: T::Hash[Symbol, T.untyped]).void }
10
+ def initialize(params)
11
+ @values = T.let({}, T::Hash[Symbol, T.untyped])
12
+ assign_params(params)
13
+ end
14
+
15
+ class << self
16
+ extend T::Sig
17
+
18
+ sig do
19
+ params(
20
+ fields: T::Hash[
21
+ Symbol, T::Hash[Symbol, T.any(Symbol, T::Array[String], T::Boolean)]
22
+ ]
23
+ ).void
24
+ end
25
+ def fields(fields)
26
+ const_set(:FIELDS, fields.freeze)
27
+
28
+ fields.each do |name, specifications|
29
+ define_method_for_validator(name, specifications)
30
+ end
31
+ end
32
+
33
+ sig do
34
+ params(
35
+ resource_class: T.untyped,
36
+ endpoint: T.nilable(String),
37
+ params: T::Hash[Symbol, T.untyped]
38
+ ).returns(T.untyped)
39
+ end
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
+ )
51
+
52
+ convert_with_params_class(
53
+ endpoint: endpoint, params_class: params_class,
54
+ resource_class: resource_class, params: params
55
+ )
56
+ end
57
+
58
+ private
59
+
60
+ sig do
61
+ params(
62
+ name: Symbol,
63
+ specifications: T::Hash[
64
+ Symbol, T.any(Symbol, T::Array[String], T::Boolean)
65
+ ]
66
+ ).void
67
+ end
68
+ def define_method_for_validator(name, specifications)
69
+ case specifications[:type]
70
+ when :Enum
71
+ define_enum_method(name, specifications)
72
+ when :String
73
+ define_string_method(
74
+ name,
75
+ T.cast(specifications, T::Hash[Symbol, T.any(Symbol, T::Boolean)])
76
+ )
77
+ else
78
+ define_method_without_options(
79
+ name,
80
+ T.cast(specifications, T::Hash[Symbol, T.any(Symbol, T::Boolean)])
81
+ )
82
+ end
83
+ end
84
+
85
+ sig do
86
+ params(
87
+ name: Symbol,
88
+ specifications: T::Hash[
89
+ Symbol, T.any(Symbol, T::Array[String], T::Boolean)
90
+ ]
91
+ ).void
92
+ end
93
+ def define_enum_method(name, specifications)
94
+ validator = DearInventory::Validators::Enum
95
+ options = {
96
+ values: specifications[:values]
97
+ }
98
+ define_method_with_options(name, validator, options)
99
+ end
100
+
101
+ sig do
102
+ params(
103
+ name: Symbol,
104
+ specifications: T::Hash[Symbol, T.any(Symbol, T::Boolean)]
105
+ ).void
106
+ end
107
+ def define_string_method(name, specifications)
108
+ validator = DearInventory::Validators::String
109
+ options = {
110
+ max_length: specifications[:max_length]
111
+ }
112
+ define_method_with_options(name, validator, options)
113
+ end
114
+
115
+ sig do
116
+ params(
117
+ name: Symbol,
118
+ validator: T.class_of(DearInventory::Validator),
119
+ options: T::Hash[
120
+ Symbol, T.nilable(T.any(Symbol, T::Array[String], T::Boolean))
121
+ ],
122
+ ).void
123
+ end
124
+ def define_method_with_options(name, validator, options)
125
+ define_method("#{name}=") do |value|
126
+ validator.(
127
+ name,
128
+ value,
129
+ options: options
130
+ )
131
+
132
+ T.unsafe(self).instance_variable_get(:@values)[name] = value
133
+ end
134
+ end
135
+
136
+ sig do
137
+ params(
138
+ name: Symbol,
139
+ specifications: T::Hash[Symbol, T.any(Symbol, T::Boolean)]
140
+ ).void
141
+ end
142
+ def define_method_without_options(name, specifications)
143
+ validator = Object.const_get(
144
+ "DearInventory::Validators::#{specifications[:type]}"
145
+ )
146
+ define_method("#{name}=") do |value|
147
+ validator.(name, value)
148
+ T.unsafe(self).instance_variable_get(:@values)[name] = value
149
+ end
150
+ end
151
+
152
+ sig do
153
+ params(
154
+ params_class: T.nilable(T.class_of(DearInventory::Parameters)),
155
+ resource_class: DearInventory::Resource,
156
+ endpoint: T.nilable(String),
157
+ params: T::Hash[Symbol, T.untyped]
158
+ ).returns(T.nilable(DearInventory::Parameters))
159
+ end
160
+ def convert_with_params_class(
161
+ params_class:, resource_class:, endpoint:, params:
162
+ )
163
+ return params_class.new(params) unless params_class.nil?
164
+
165
+ message = "No parameters class can be found for resource, " \
166
+ "#{resource_class}, with endpoint #{endpoint}"
167
+ raise ArgumentError, message
168
+ end
169
+ end
170
+
171
+ sig { returns(T::Hash[Symbol, T.untyped]) }
172
+ def to_h
173
+ self.class.
174
+ const_get(:FIELDS).
175
+ each_with_object({}) do |(field_name, specifications), hash|
176
+ value = parameter_value(field_name, specifications)
177
+ next if value.nil?
178
+
179
+ hash[specifications[:property]] = value
180
+ end
181
+ end
182
+
183
+ private
184
+
185
+ sig do
186
+ params(
187
+ field_name: Symbol,
188
+ specifications: T::Hash[Symbol, T.untyped]
189
+ ).returns(T.nilable(T.any(String, Numeric, T::Boolean)))
190
+ end
191
+ def parameter_value(field_name, specifications)
192
+ value = @values[field_name]
193
+ Validators::Required.(field_name, value) if specifications[:required]
194
+
195
+ if value.respond_to?(:strftime)
196
+ ::DearInventory::DateTime.new(value).to_s
197
+ else
198
+ value
199
+ end
200
+ end
201
+
202
+ sig { params(params: T::Hash[Symbol, T.untyped]).void }
203
+ def assign_params(params)
204
+ params.each do |name, value|
205
+ __send__(:"#{name}=", value)
206
+ end
207
+ end
208
+ end
209
+ end