honeys-place 0.0.0 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 71351a33d6e2c6f96e7092ab8c809c139b7ed1a7
4
- data.tar.gz: 1ddc4dff2ab7cd2a336a8d1acc0c2508e576d778
3
+ metadata.gz: 4c8bcca4987d91d3dade107ade3eff462b8d999e
4
+ data.tar.gz: 2f33b11637765359f8879336be2115cd000fcaa4
5
5
  SHA512:
6
- metadata.gz: df23261220ad988a1b154423a2fb7113e4548314261d23d69ff27ee25b75366b31ba206d8ab8605ef583ff1b41df2c965f04fa5f6ad1d2b9c72d89c2228861be
7
- data.tar.gz: 7c49d62cbb2c9d86e734a278a5b9a31ce666d5aa8487156421c1a9ab5df565bf4a4dd5a3b6d69c925d2a61e79d8c129d21601d6b2c4d4dbf78382c09789a8e7a
6
+ metadata.gz: b59f1069e1952f9c79c79f0e4d8ba6db4cfde0e9670c25b4bee5b56561211d0279436d50b8b13e77ca03f317bded74dd16e7975b49cdf6755351f3d0484292ea
7
+ data.tar.gz: d4d5e02b8b92a742ff9b31e9a3f87a11ba0a357d7e729d7921f56b319121cae2a44376b7977e07d5e2e391c0c868fb1f4af393cfd228b91c7bf73a5942d21bac
@@ -3,7 +3,9 @@ require 'httparty'
3
3
  require 'nokogiri'
4
4
  require 'nokogiri/xml/document_to_hash'
5
5
 
6
+ require 'honey/error'
6
7
  require 'honey/client'
7
8
  require 'honey/builder'
8
9
  require 'honey/order'
10
+ require 'honey/response'
9
11
  require 'honey/version'
@@ -5,7 +5,6 @@ module Honey
5
5
 
6
6
  def initialize(username = '', password = '')
7
7
  login(username, password)
8
- self
9
8
  end
10
9
 
11
10
  # type :xml, :text
@@ -36,8 +35,8 @@ module Honey
36
35
  skus = skus.first
37
36
  end
38
37
  skus.each_slice(25) do |sku_group|
39
- response = post(build_stock_check(*sku_group)).parsed_response
40
- data = response["message"]["stock"]["item"]
38
+ response = post(build_stock_check(*sku_group))
39
+ data = response.stock["item"]
41
40
  data = [data] if sku_group.count == 1 # Honey's API Quirk
42
41
  data.each do |datum|
43
42
  results[datum["sku"]] = datum["qty"]
@@ -61,7 +60,7 @@ module Honey
61
60
  private
62
61
 
63
62
  def post(xml)
64
- self.class.post('', { query: { xmldata: xml }})
63
+ Honey::Response.new(self.class.post('', { query: { xmldata: xml }}))
65
64
  end
66
65
 
67
66
  def login(username, password)
@@ -0,0 +1,35 @@
1
+ module Honey
2
+ class Error < StandardError
3
+ def initialize(code)
4
+ @code = code
5
+ super(message)
6
+ end
7
+
8
+ def message
9
+ CODES[@code]
10
+ end
11
+
12
+ CODES = {
13
+ 999 => "An invalid username / password has been submitted. Please contact Honey's Place.",
14
+ 800 => "First Name is required.",
15
+ 801 => "Last Name is required.",
16
+ 802 => "Address1 is required.",
17
+ 803 => "City is required.",
18
+ 804 => "State is required.",
19
+ 805 => "Zip Code is required.",
20
+ 806 => "Zip Code is invalid.",
21
+ 807 => "Country is invalid.",
22
+ 808 => "E-Mail is invalid.",
23
+ 809 => "State must be only 2 characters.",
24
+ 700 => "Reference number already used.",
25
+ 701 => "Reference number is required.",
26
+ 600 => "Invalid Shipping Code.",
27
+ 500 => "One or more of the submitted products have been discontinued by the manufacturer.",
28
+ 501 => "One or more of the submitted products do not exist.",
29
+ 400 => "Duplicate product within same order. Please combine SKU's and QTY.",
30
+ 300 => "You are checking status on an order you have not yet submitted.",
31
+ 100 => "Order accepted for processing.",
32
+ 0 => "Unknown Error. Please contact Honey's Place."
33
+ }
34
+ end
35
+ end
@@ -14,7 +14,7 @@ module Honey
14
14
  self.class.attributes
15
15
  end
16
16
 
17
- attr_accessor :reference, :shipby, :items, :last, :first, :address1, :address2, :city, :state, :zip, :country, :phone, :emailaddress, :instructions
17
+ attr_accessor :reference, :shipby, :items, :last, :first, :address1, :address2, :city, :state, :zip, :country, :phone, :emailaddress, :instructions, :date
18
18
 
19
19
  def initialize(args = {})
20
20
  update(args)
@@ -26,6 +26,24 @@ module Honey
26
26
  end
27
27
  end
28
28
 
29
+ def reference=(id)
30
+ if id == :test
31
+ @reference = "TEST" << Digest::MD5.base64digest(Time.now.to_s).gsub(/\W/, '')
32
+ else
33
+ @reference = id
34
+ end
35
+ end
36
+
37
+ def shipby=(code)
38
+ if code.is_a?(String)
39
+ @shipby = code
40
+ else
41
+ @shipby = shipping_option(code)
42
+ end
43
+ end
44
+ alias_method :shipping, :shipby
45
+ alias_method :shipping=, :shipby=
46
+
29
47
  def each_pair(&block)
30
48
  present_attributes.each do |key|
31
49
  yield(key, self.send(key), block)
@@ -33,7 +51,7 @@ module Honey
33
51
  end
34
52
 
35
53
  def valid?
36
- (required_attributes - present_attributes) == []
54
+ (required_attributes - present_attributes).empty?
37
55
  end
38
56
 
39
57
  def invalid?
@@ -41,7 +59,7 @@ module Honey
41
59
  end
42
60
 
43
61
  def required_attributes
44
- (attributes - [:address2, :reference, :instructions])
62
+ attributes - [:address2, :instructions, :phone]
45
63
  end
46
64
 
47
65
  def present_attributes
@@ -49,5 +67,69 @@ module Honey
49
67
  attr unless self.send(attr).nil?
50
68
  end.compact
51
69
  end
70
+
71
+ def self.shipping_option(carrier: :special, service:)
72
+ carrier = carrier.to_s
73
+ service = service.to_s
74
+ unless carrier_options = shipping_options[carrier.downcase]
75
+ raise Honey::Error, "'#{carrier}' isn't a valid carrier. Valid carriers are: #{shipping_options.keys}"
76
+ end
77
+ unless option = carrier_options[service.downcase]
78
+ raise Honey::Error, "'#{service}' isn't a shipping option for #{carrier}. Valid options are: #{carrier_options.keys}"
79
+ end
80
+ option
81
+ end
82
+
83
+ def shipping_option(*args)
84
+ self.class.shipping_option(*args)
85
+ end
86
+
87
+ def self.shipping_option_from_api_code(api_code)
88
+ shipping_options.each_pair do |carrier, options|
89
+ options.each_pair do |service, code|
90
+ return { carrier: carrier, service: service } if api_code == code
91
+ end
92
+ end
93
+ nil
94
+ end
95
+
96
+ private
97
+ def self.shipping_options
98
+ {
99
+ "special" => {
100
+ "pickup" => "PICKUP",
101
+ "best rate" => "RTSHOP",
102
+ "cheapest" => "RTSHOP"
103
+ },
104
+ "fedex" => {
105
+ "first overnight" => "F001",
106
+ "priority overnight" => "F002",
107
+ "standard overnight" => "F003",
108
+ "2 day air" => "F004",
109
+ "express saver" => "F005",
110
+ "ground north america" => "F006",
111
+ "ground home delivery" => "F007",
112
+ "international priority" => "F008",
113
+ "international economy" => "F009"
114
+ },
115
+ "usps" => {
116
+ "express mail" => "P001",
117
+ "priority mail" => "P002",
118
+ "first class" => "P003",
119
+ "parcel post" => "P004",
120
+ "international express" => "P005",
121
+ "international priority" => "P006",
122
+ "international first class" => "P007",
123
+ "priority flat rate" => "P008"
124
+ },
125
+ "ups" => {
126
+ "next day air" => "U001",
127
+ "2 day air" => "U002",
128
+ "3 day air" => "U003",
129
+ "ground" => "U004",
130
+ "standard" => "U005"
131
+ }
132
+ }
133
+ end
52
134
  end
53
135
  end
@@ -0,0 +1,59 @@
1
+ require 'ostruct'
2
+
3
+ module Honey
4
+ class Response
5
+ attr_accessor :data
6
+
7
+ def initialize(http_response)
8
+ @data = OpenStruct.new(http_response.parsed_response["message"])
9
+ end
10
+
11
+ def method_missing(method, *args, &block)
12
+ if method.to_s.end_with?('=')
13
+ data.try(method, *args)
14
+ else
15
+ data.try(method)
16
+ end
17
+ end
18
+
19
+ def inspect
20
+ data.inspect
21
+ end
22
+
23
+ def successful?
24
+ !failed?
25
+ end
26
+
27
+ def failed?
28
+ data.code.present? && data.code.to_i != 100
29
+ end
30
+
31
+ def cancelled?
32
+ data.cancelled == "Yes"
33
+ end
34
+
35
+ def shipped?
36
+ data.status == "Shipped"
37
+ end
38
+
39
+ def error
40
+ Honey::Error.new(data.code.to_i)
41
+ end
42
+
43
+ def log
44
+ "[#{data.code}] #{message}"
45
+ end
46
+
47
+ def message
48
+ data.error || data.details
49
+ end
50
+
51
+ def tracking_numbers
52
+ (1..5).map { |i| data.try(:"trackingnumber#{i}") }.compact.join(',')
53
+ end
54
+
55
+ def notes
56
+ data.warehousenotes || ""
57
+ end
58
+ end
59
+ end
@@ -1,3 +1,3 @@
1
1
  module Honey
2
- Version = "0.0.0"
2
+ Version = "0.0.1"
3
3
  end
@@ -27,4 +27,15 @@ class OrderTest < Minitest::Test
27
27
  @order.update(last: "Shreve", first: "Jacob")
28
28
  assert_equal @order.present_attributes, [:last, :first]
29
29
  end
30
+
31
+ def test_shipping_options_as_hash
32
+ @order.shipping = { carrier: :USPS, service: "first class" }
33
+ assert_equal "P003", @order.shipping
34
+ end
35
+
36
+ def test_shipping_option_from_api_code
37
+ shipping_option = Honey::Order.shipping_option_from_api_code("P003")
38
+ assert_equal "usps", shipping_option[:carrier]
39
+ assert_equal "first class", shipping_option[:service]
40
+ end
30
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeys-place
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Evan Shreve
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-24 00:00:00.000000000 Z
11
+ date: 2016-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -75,7 +75,9 @@ files:
75
75
  - lib/honey.rb
76
76
  - lib/honey/builder.rb
77
77
  - lib/honey/client.rb
78
+ - lib/honey/error.rb
78
79
  - lib/honey/order.rb
80
+ - lib/honey/response.rb
79
81
  - lib/honey/version.rb
80
82
  - lib/nokogiri/xml/document_to_hash.rb
81
83
  - test/honey/builder_test.rb
@@ -104,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
106
  version: '0'
105
107
  requirements: []
106
108
  rubyforge_project:
107
- rubygems_version: 2.2.2
109
+ rubygems_version: 2.4.5
108
110
  signing_key:
109
111
  specification_version: 4
110
112
  summary: A wrapper for the Honey's Place API