newgistics 1.0.0

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