newgistics 1.0.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 (51) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +25 -0
  3. data/.env.sample +2 -0
  4. data/.gitignore +15 -0
  5. data/.rspec +2 -0
  6. data/.ruby-version +1 -0
  7. data/.simplecov +4 -0
  8. data/.travis.yml +5 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/Gemfile +6 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +187 -0
  13. data/Rakefile +6 -0
  14. data/bin/console +16 -0
  15. data/bin/setup +8 -0
  16. data/lib/newgistics.rb +68 -0
  17. data/lib/newgistics/api.rb +26 -0
  18. data/lib/newgistics/configuration.rb +23 -0
  19. data/lib/newgistics/customer.rb +20 -0
  20. data/lib/newgistics/default_logger.rb +11 -0
  21. data/lib/newgistics/errors.rb +4 -0
  22. data/lib/newgistics/fee.rb +9 -0
  23. data/lib/newgistics/inbound_return.rb +29 -0
  24. data/lib/newgistics/inventory.rb +22 -0
  25. data/lib/newgistics/item.rb +19 -0
  26. data/lib/newgistics/order.rb +32 -0
  27. data/lib/newgistics/product.rb +30 -0
  28. data/lib/newgistics/query.rb +43 -0
  29. data/lib/newgistics/requests/cancel_shipment.rb +70 -0
  30. data/lib/newgistics/requests/post_inbound_return.rb +76 -0
  31. data/lib/newgistics/requests/post_shipment.rb +121 -0
  32. data/lib/newgistics/requests/search.rb +21 -0
  33. data/lib/newgistics/requests/update_shipment_contents.rb +74 -0
  34. data/lib/newgistics/response_handlers/cancel_shipment.rb +25 -0
  35. data/lib/newgistics/response_handlers/post_errors.rb +40 -0
  36. data/lib/newgistics/response_handlers/post_inbound_return.rb +25 -0
  37. data/lib/newgistics/response_handlers/post_shipment.rb +25 -0
  38. data/lib/newgistics/response_handlers/search.rb +57 -0
  39. data/lib/newgistics/response_handlers/update_shipment_contents.rb +25 -0
  40. data/lib/newgistics/return.rb +40 -0
  41. data/lib/newgistics/shipment.rb +79 -0
  42. data/lib/newgistics/shipment_cancellation.rb +24 -0
  43. data/lib/newgistics/shipment_update.rb +24 -0
  44. data/lib/newgistics/string_helper.rb +13 -0
  45. data/lib/newgistics/time_zone.rb +31 -0
  46. data/lib/newgistics/timestamp.rb +31 -0
  47. data/lib/newgistics/version.rb +3 -0
  48. data/lib/newgistics/warehouse.rb +14 -0
  49. data/lib/newgistics/xml_marshaller.rb +72 -0
  50. data/newgistics.gemspec +37 -0
  51. metadata +263 -0
@@ -0,0 +1,24 @@
1
+ module Newgistics
2
+ class ShipmentUpdate
3
+ include Virtus.model
4
+
5
+ attribute :id, String
6
+ attribute :order_id, String
7
+ attribute :add_items, Array[Item], default: []
8
+ attribute :remove_items, Array[Item], default: []
9
+ attribute :success, Boolean
10
+
11
+ attribute :errors, Array[String], default: []
12
+ attribute :warnings, Array[String], default: []
13
+
14
+ def success?
15
+ !!success
16
+ end
17
+
18
+ def save
19
+ Requests::UpdateShipmentContents.new(self).perform
20
+
21
+ errors.empty? && success?
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ module Newgistics
2
+ class StringHelper
3
+ def self.camelize(string, upcase_first: true)
4
+ result = string.to_s.gsub(/([a-z\d]+)(_|\z)/) { $1.capitalize }
5
+ result = result.gsub(/\A[A-Z]/) { $&.downcase } unless upcase_first
6
+ result
7
+ end
8
+
9
+ def self.underscore(string)
10
+ string.to_s.gsub(/([a-z])([A-Z])/) { "#{$1}_#{$2}" }.downcase
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module Newgistics
2
+ class TimeZone
3
+ attr_reader :tz_timezone
4
+
5
+ def initialize(name)
6
+ @tz_timezone = TZInfo::Timezone.get(name)
7
+ end
8
+
9
+ def utc_offset
10
+ @utc_offset ||= formatted_utc_offset
11
+ end
12
+
13
+ def utc_offset_in_seconds
14
+ current_period.utc_total_offset
15
+ end
16
+
17
+ private
18
+
19
+ def current_period
20
+ tz_timezone.current_period
21
+ end
22
+
23
+ def formatted_utc_offset
24
+ seconds = utc_offset_in_seconds
25
+ hours = seconds / 3600
26
+ minutes = seconds % 3600 / 60
27
+ sign = hours < 0 ? "-" : "+"
28
+ "%s%02d:%02d" % [sign, hours.abs, minutes.abs]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ module Newgistics
2
+ class Timestamp < Virtus::Attribute
3
+ def coerce(value)
4
+ if value.is_a? String
5
+ coerce_string(value)
6
+ else
7
+ value
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def coerce_string(value)
14
+ date = value.dup
15
+ unless includes_timezone?(value)
16
+ date << Newgistics.time_zone.utc_offset
17
+ end
18
+ parse_date(date, value)
19
+ end
20
+
21
+ def parse_date(date, fallback)
22
+ Time.iso8601(date).getlocal(Newgistics.local_time_zone.utc_offset)
23
+ rescue ArgumentError
24
+ fallback
25
+ end
26
+
27
+ def includes_timezone?(value)
28
+ value =~ /Z|[+-]\d{2}:\d{2}\z/
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module Newgistics
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,14 @@
1
+ module Newgistics
2
+ class Warehouse
3
+ include Virtus.model
4
+
5
+ attribute :id, String
6
+
7
+ attribute :name, String
8
+ attribute :address, String
9
+ attribute :city, String
10
+ attribute :state, String
11
+ attribute :postal_code, String
12
+ attribute :country, String
13
+ end
14
+ end
@@ -0,0 +1,72 @@
1
+ module Newgistics
2
+ class XmlMarshaller
3
+ def assign_attributes(object, root)
4
+ marshall_attributes(object, root)
5
+ marshall_elements(object, root)
6
+ end
7
+
8
+ private
9
+
10
+ def marshall_attributes(object, root)
11
+ root.attributes.values.each do |attribute|
12
+ transformed_name = attribute_name(attribute)
13
+ assign_attribute(object, transformed_name, attribute.value)
14
+ end
15
+ end
16
+
17
+ def marshall_elements(object, root)
18
+ root.elements.each do |element|
19
+ if element.elements.any?
20
+ assign_nested_attribute(object, element)
21
+ else
22
+ assign_simple_attribute(object, element)
23
+ end
24
+ end
25
+ end
26
+
27
+ def assign_nested_attribute(object, element)
28
+ attribute = attribute_name(element)
29
+ attribute_set = object.class.attribute_set[attribute]
30
+ return if attribute_set.nil?
31
+
32
+ if attribute_set.type.primitive == Array
33
+ object[attribute] = build_list(attribute_set.member_type.primitive, element)
34
+ else
35
+ object[attribute] = build_object(attribute_set.type.primitive, element)
36
+ end
37
+ end
38
+
39
+ def build_list(item_class, element)
40
+ item_selector = get_list_item_selector(item_class)
41
+ element.css(item_selector).map do |child|
42
+ build_object(item_class, child)
43
+ end
44
+ end
45
+
46
+ def build_object(klass_name, element)
47
+ klass_name.new.tap do |new_object|
48
+ assign_attributes(new_object, element)
49
+ end
50
+ end
51
+
52
+ def get_list_item_selector(item_class)
53
+ item_class.to_s.split('::').last
54
+ end
55
+
56
+ def assign_simple_attribute(object, element)
57
+ attribute = attribute_name(element)
58
+ assign_attribute(object, attribute, element.text)
59
+ end
60
+
61
+ def assign_attribute(object, attribute, value)
62
+ setter = "#{attribute}="
63
+ if object.is_a?(Hash) || object.respond_to?(setter)
64
+ object[attribute.to_sym] = value unless value.empty?
65
+ end
66
+ end
67
+
68
+ def attribute_name(element)
69
+ StringHelper.underscore(element.name)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "newgistics/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "newgistics"
8
+ spec.version = Newgistics::VERSION
9
+ spec.authors = ["Manuel Martinez", "James Russo"]
10
+ spec.email = ["manuel@kubecommerce.com", "james.russo@rocketsofawesome.com"]
11
+
12
+ spec.summary = "Ruby API client for Newgistics"
13
+ spec.description = "Ruby API client for Newgistics"
14
+ spec.homepage = "https://github.com/rocketsofawesome/newgistics-ruby/"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_dependency "virtus", "~> 1.0"
25
+ spec.add_dependency "nokogiri", "~> 1.8"
26
+ spec.add_dependency "faraday", "~> 0.9"
27
+ spec.add_dependency "tzinfo", "~> 1.1"
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.15"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_development_dependency "pry"
33
+ spec.add_development_dependency "simplecov"
34
+ spec.add_development_dependency "dotenv"
35
+ spec.add_development_dependency "vcr", "~> 3.0.3"
36
+ spec.add_development_dependency "timecop", "~> 0.9"
37
+ end
metadata ADDED
@@ -0,0 +1,263 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: newgistics
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Manuel Martinez
8
+ - James Russo
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2018-05-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: virtus
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.8'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.8'
42
+ - !ruby/object:Gem::Dependency
43
+ name: faraday
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0.9'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.9'
56
+ - !ruby/object:Gem::Dependency
57
+ name: tzinfo
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.1'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.1'
70
+ - !ruby/object:Gem::Dependency
71
+ name: bundler
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.15'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '1.15'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rake
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '10.0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '10.0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '3.0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '3.0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: pry
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: dotenv
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: vcr
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 3.0.3
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 3.0.3
168
+ - !ruby/object:Gem::Dependency
169
+ name: timecop
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '0.9'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '0.9'
182
+ description: Ruby API client for Newgistics
183
+ email:
184
+ - manuel@kubecommerce.com
185
+ - james.russo@rocketsofawesome.com
186
+ executables: []
187
+ extensions: []
188
+ extra_rdoc_files: []
189
+ files:
190
+ - ".codeclimate.yml"
191
+ - ".env.sample"
192
+ - ".gitignore"
193
+ - ".rspec"
194
+ - ".ruby-version"
195
+ - ".simplecov"
196
+ - ".travis.yml"
197
+ - CODE_OF_CONDUCT.md
198
+ - Gemfile
199
+ - LICENSE.txt
200
+ - README.md
201
+ - Rakefile
202
+ - bin/console
203
+ - bin/setup
204
+ - lib/newgistics.rb
205
+ - lib/newgistics/api.rb
206
+ - lib/newgistics/configuration.rb
207
+ - lib/newgistics/customer.rb
208
+ - lib/newgistics/default_logger.rb
209
+ - lib/newgistics/errors.rb
210
+ - lib/newgistics/fee.rb
211
+ - lib/newgistics/inbound_return.rb
212
+ - lib/newgistics/inventory.rb
213
+ - lib/newgistics/item.rb
214
+ - lib/newgistics/order.rb
215
+ - lib/newgistics/product.rb
216
+ - lib/newgistics/query.rb
217
+ - lib/newgistics/requests/cancel_shipment.rb
218
+ - lib/newgistics/requests/post_inbound_return.rb
219
+ - lib/newgistics/requests/post_shipment.rb
220
+ - lib/newgistics/requests/search.rb
221
+ - lib/newgistics/requests/update_shipment_contents.rb
222
+ - lib/newgistics/response_handlers/cancel_shipment.rb
223
+ - lib/newgistics/response_handlers/post_errors.rb
224
+ - lib/newgistics/response_handlers/post_inbound_return.rb
225
+ - lib/newgistics/response_handlers/post_shipment.rb
226
+ - lib/newgistics/response_handlers/search.rb
227
+ - lib/newgistics/response_handlers/update_shipment_contents.rb
228
+ - lib/newgistics/return.rb
229
+ - lib/newgistics/shipment.rb
230
+ - lib/newgistics/shipment_cancellation.rb
231
+ - lib/newgistics/shipment_update.rb
232
+ - lib/newgistics/string_helper.rb
233
+ - lib/newgistics/time_zone.rb
234
+ - lib/newgistics/timestamp.rb
235
+ - lib/newgistics/version.rb
236
+ - lib/newgistics/warehouse.rb
237
+ - lib/newgistics/xml_marshaller.rb
238
+ - newgistics.gemspec
239
+ homepage: https://github.com/rocketsofawesome/newgistics-ruby/
240
+ licenses:
241
+ - MIT
242
+ metadata: {}
243
+ post_install_message:
244
+ rdoc_options: []
245
+ require_paths:
246
+ - lib
247
+ required_ruby_version: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
252
+ required_rubygems_version: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ requirements: []
258
+ rubyforge_project:
259
+ rubygems_version: 2.6.11
260
+ signing_key:
261
+ specification_version: 4
262
+ summary: Ruby API client for Newgistics
263
+ test_files: []