dear_inventory 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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