honeys-place 0.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.
- checksums.yaml +7 -0
- data/lib/honey.rb +9 -0
- data/lib/honey/builder.rb +52 -0
- data/lib/honey/client.rb +75 -0
- data/lib/honey/order.rb +53 -0
- data/lib/honey/version.rb +3 -0
- data/lib/nokogiri/xml/document_to_hash.rb +22 -0
- data/test/honey/builder_test.rb +24 -0
- data/test/honey/client_test.rb +38 -0
- data/test/honey/order_test.rb +30 -0
- data/test/honey_test.rb +7 -0
- data/test/nokogiri/xml/document_to_hash_test.rb +11 -0
- data/test/test_helper.rb +28 -0
- metadata +117 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 71351a33d6e2c6f96e7092ab8c809c139b7ed1a7
|
|
4
|
+
data.tar.gz: 1ddc4dff2ab7cd2a336a8d1acc0c2508e576d778
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: df23261220ad988a1b154423a2fb7113e4548314261d23d69ff27ee25b75366b31ba206d8ab8605ef583ff1b41df2c965f04fa5f6ad1d2b9c72d89c2228861be
|
|
7
|
+
data.tar.gz: 7c49d62cbb2c9d86e734a278a5b9a31ce666d5aa8487156421c1a9ab5df565bf4a4dd5a3b6d69c925d2a61e79d8c129d21601d6b2c4d4dbf78382c09789a8e7a
|
data/lib/honey.rb
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Honey
|
|
2
|
+
class Builder
|
|
3
|
+
attr_reader :username, :password
|
|
4
|
+
|
|
5
|
+
def initialize(username, password)
|
|
6
|
+
@username = username
|
|
7
|
+
@password = password
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def build(data)
|
|
11
|
+
@data = Nokogiri::XML::Builder.new do |xml|
|
|
12
|
+
xml.HPEnvelope do
|
|
13
|
+
xml.username(username)
|
|
14
|
+
xml.password(password)
|
|
15
|
+
data.each_pair do |key, value|
|
|
16
|
+
xml_pair(xml, key, value)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end.to_xml.strip
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def destruct(data)
|
|
23
|
+
Nokogiri::XML(data).to_hash
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
def xml_pair(xml, key, value)
|
|
28
|
+
key = key.to_sym
|
|
29
|
+
if value.respond_to? :each_pair
|
|
30
|
+
xml.send(key) do
|
|
31
|
+
value.each_pair { |k, v| xml_pair(xml, k, v) }
|
|
32
|
+
end
|
|
33
|
+
elsif value.respond_to? :each
|
|
34
|
+
xml.send(key) do
|
|
35
|
+
value.each { |val| xml_array(xml, val) }
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
xml.send(key.to_sym, value)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def xml_array(xml, value)
|
|
43
|
+
if value.respond_to? :each_pair
|
|
44
|
+
value.each_pair { |k, v| xml_pair(xml, k, v) }
|
|
45
|
+
elsif value.respond_to? :each
|
|
46
|
+
value.each { |v| v }
|
|
47
|
+
else
|
|
48
|
+
value
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
data/lib/honey/client.rb
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module Honey
|
|
2
|
+
class Client
|
|
3
|
+
include HTTParty
|
|
4
|
+
base_uri 'http://ws.honeysplace.com/ws/'
|
|
5
|
+
|
|
6
|
+
def initialize(username = '', password = '')
|
|
7
|
+
login(username, password)
|
|
8
|
+
self
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# type :xml, :text
|
|
12
|
+
def self.data_feed(type = :xml, path = '/tmp/honey')
|
|
13
|
+
IO.popen("curl #{self.class.base_uri}/#{data_feed_url(type)} -o #{path}.#{type}")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.data_feed_url(type = :xml)
|
|
17
|
+
"xml/honeysinventory" << case type
|
|
18
|
+
when :xml
|
|
19
|
+
"v2_0.xml"
|
|
20
|
+
when :txt
|
|
21
|
+
"_v_1.0.txt"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def submit_order(order)
|
|
26
|
+
post build_order(order)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def order_status(reference_number)
|
|
30
|
+
post build_order_status(reference_number)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def stock_check(*skus)
|
|
34
|
+
results = {}
|
|
35
|
+
if skus.first.is_a? Array
|
|
36
|
+
skus = skus.first
|
|
37
|
+
end
|
|
38
|
+
skus.each_slice(25) do |sku_group|
|
|
39
|
+
response = post(build_stock_check(*sku_group)).parsed_response
|
|
40
|
+
data = response["message"]["stock"]["item"]
|
|
41
|
+
data = [data] if sku_group.count == 1 # Honey's API Quirk
|
|
42
|
+
data.each do |datum|
|
|
43
|
+
results[datum["sku"]] = datum["qty"]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
results
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def build_order(order)
|
|
50
|
+
request(order: order)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def build_order_status(reference_number)
|
|
54
|
+
request(orderstatus: reference_number)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def build_stock_check(*skus)
|
|
58
|
+
request(stockcheck: skus.map { |sku| { sku: sku } })
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def post(xml)
|
|
64
|
+
self.class.post('', { query: { xmldata: xml }})
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def login(username, password)
|
|
68
|
+
@builder = Honey::Builder.new(username, password)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def request(object)
|
|
72
|
+
@builder.build(object)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
data/lib/honey/order.rb
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Honey
|
|
2
|
+
class Order
|
|
3
|
+
def self.attr_accessor(*attributes)
|
|
4
|
+
@attributes ||= []
|
|
5
|
+
@attributes.concat attributes
|
|
6
|
+
super(*attributes)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.attributes
|
|
10
|
+
@attributes
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def attributes
|
|
14
|
+
self.class.attributes
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
attr_accessor :reference, :shipby, :items, :last, :first, :address1, :address2, :city, :state, :zip, :country, :phone, :emailaddress, :instructions
|
|
18
|
+
|
|
19
|
+
def initialize(args = {})
|
|
20
|
+
update(args)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def update(args = {})
|
|
24
|
+
args.each_pair do |key, value|
|
|
25
|
+
self.send("#{key}=".to_sym, value)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def each_pair(&block)
|
|
30
|
+
present_attributes.each do |key|
|
|
31
|
+
yield(key, self.send(key), block)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def valid?
|
|
36
|
+
(required_attributes - present_attributes) == []
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def invalid?
|
|
40
|
+
!valid?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def required_attributes
|
|
44
|
+
(attributes - [:address2, :reference, :instructions])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def present_attributes
|
|
48
|
+
attributes.collect do |attr|
|
|
49
|
+
attr unless self.send(attr).nil?
|
|
50
|
+
end.compact
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Nokogiri
|
|
2
|
+
module XML
|
|
3
|
+
class Document < Nokogiri::XML::Node
|
|
4
|
+
def to_hash
|
|
5
|
+
children_to_hash(children)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
def children_to_hash(children)
|
|
10
|
+
hash = {}
|
|
11
|
+
children.each do |child|
|
|
12
|
+
if child.children.any?
|
|
13
|
+
hash[child.name.to_sym] = children_to_hash(child.children)
|
|
14
|
+
else
|
|
15
|
+
hash = child.content.to_s
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
hash
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class BuilderTest < Minitest::Test
|
|
4
|
+
def setup
|
|
5
|
+
@builder = Honey::Builder.new("username", "password")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_builds_nested_hash_xml
|
|
9
|
+
assert_match_xpath "hello/there", @builder.build(hello: { there: "buddy" })
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_builds_array_xml
|
|
13
|
+
assert_match_xpath "skus/sku", @builder.build(skus: [{sku: 12345}, {sku: 67890}])
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_breaks_down_xml
|
|
17
|
+
assert_equal @builder.destruct("<hello><there>buddy</there></hello>"), { hello: { there: "buddy" } }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_builds_honey_order
|
|
21
|
+
order = Honey::Order.new(reference: "TEST")
|
|
22
|
+
assert_match_xpath "order/reference", @builder.build(order: order)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ClientTest < Minitest::Test
|
|
4
|
+
def setup
|
|
5
|
+
@client = Honey::Client.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_data_feed_url
|
|
9
|
+
assert_equal Honey::Client.data_feed_url(:xml), "xml/honeysinventoryv2_0.xml"
|
|
10
|
+
assert_equal Honey::Client.data_feed_url(:txt), "xml/honeysinventory_v_1.0.txt"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_builds_order
|
|
14
|
+
assert_match_xpath "order/items/item", @client.build_order(valid_order)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_builds_stock_check
|
|
18
|
+
assert_match_xpath "stockcheck/sku", @client.build_stock_check(12345)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_builds_order_status
|
|
22
|
+
assert_match_xpath "orderstatus", @client.build_order_status(12345)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# These only work when supplied valid credentials
|
|
26
|
+
#
|
|
27
|
+
# def test_checks_stock_as_arguments
|
|
28
|
+
# results = @client.stock_check("BMS28515", "KL-468B")
|
|
29
|
+
# assert results.has_key?("BMS28515")
|
|
30
|
+
# assert results.has_key?("KL-468B")
|
|
31
|
+
# end
|
|
32
|
+
|
|
33
|
+
# def test_checks_stock_as_array
|
|
34
|
+
# results = @client.stock_check(["BMS28515", "KL-468B"])
|
|
35
|
+
# assert results.has_key?("BMS28515")
|
|
36
|
+
# assert results.has_key?("KL-468B")
|
|
37
|
+
# end
|
|
38
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class OrderTest < Minitest::Test
|
|
4
|
+
def setup
|
|
5
|
+
@order = Honey::Order.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def teardown
|
|
9
|
+
@order = nil
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_update
|
|
13
|
+
@order.update(last: "Shreve", items: [:item, :item])
|
|
14
|
+
assert_equal "Shreve", @order.last
|
|
15
|
+
assert_equal [:item, :item], @order.items
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_validity
|
|
19
|
+
assert @order.invalid?
|
|
20
|
+
@order.required_attributes.each do |attr|
|
|
21
|
+
@order.send("#{attr}=".to_sym, "hello")
|
|
22
|
+
end
|
|
23
|
+
assert @order.valid?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_present_attributes
|
|
27
|
+
@order.update(last: "Shreve", first: "Jacob")
|
|
28
|
+
assert_equal @order.present_attributes, [:last, :first]
|
|
29
|
+
end
|
|
30
|
+
end
|
data/test/honey_test.rb
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DocumentToHashTest < Minitest::Test
|
|
4
|
+
def setup
|
|
5
|
+
@document = Nokogiri::XML("<hello><there>buddy</there></hello")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_document_to_hash
|
|
9
|
+
assert_equal @document.to_hash, { hello: { there: "buddy" } }
|
|
10
|
+
end
|
|
11
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..','lib'))
|
|
2
|
+
require 'honey'
|
|
3
|
+
|
|
4
|
+
def valid_order
|
|
5
|
+
Honey::Order.new({
|
|
6
|
+
items: [
|
|
7
|
+
{ item: { sku: 1234, qty: 1 } },
|
|
8
|
+
{ item: { sku: 5678, qty: 1 } }
|
|
9
|
+
],
|
|
10
|
+
last: "Shreve",
|
|
11
|
+
first: "Jacob",
|
|
12
|
+
address1: "1234 East St.",
|
|
13
|
+
city: "Fowlerville",
|
|
14
|
+
state: "MI",
|
|
15
|
+
zip: 48836,
|
|
16
|
+
country: "US",
|
|
17
|
+
phone: "(123) 456-7890",
|
|
18
|
+
emailaddress: "jacob@example.com",
|
|
19
|
+
instructions: "Leave the package behind the wooden bear"
|
|
20
|
+
})
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def assert_match_xpath(expected, actual, message = nil)
|
|
24
|
+
expected = "/HPEnvelope/#{expected}"
|
|
25
|
+
doc = Nokogiri::XML(actual)
|
|
26
|
+
nodes = doc.xpath(expected)
|
|
27
|
+
assert !nodes.empty?, message || "Expected to find xpath #{expected} in response:\n#{actual}"
|
|
28
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: honeys-place
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Jacob Evan Shreve
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-07-24 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: httparty
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0.13'
|
|
20
|
+
- - ">="
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: 0.13.0
|
|
23
|
+
type: :runtime
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
requirements:
|
|
27
|
+
- - "~>"
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0.13'
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 0.13.0
|
|
33
|
+
- !ruby/object:Gem::Dependency
|
|
34
|
+
name: nokogiri
|
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '1.6'
|
|
40
|
+
- - ">="
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
version: 1.6.1
|
|
43
|
+
type: :runtime
|
|
44
|
+
prerelease: false
|
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
46
|
+
requirements:
|
|
47
|
+
- - "~>"
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: '1.6'
|
|
50
|
+
- - ">="
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: 1.6.1
|
|
53
|
+
- !ruby/object:Gem::Dependency
|
|
54
|
+
name: guard-minitest
|
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '2'
|
|
60
|
+
type: :development
|
|
61
|
+
prerelease: false
|
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - "~>"
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '2'
|
|
67
|
+
description: |2
|
|
68
|
+
Honey's Place is a wrapper for the Honey's Place API which easily enables
|
|
69
|
+
placing orders, checking order statuses, and stock checking.
|
|
70
|
+
email: jacob@sugutoys.com
|
|
71
|
+
executables: []
|
|
72
|
+
extensions: []
|
|
73
|
+
extra_rdoc_files: []
|
|
74
|
+
files:
|
|
75
|
+
- lib/honey.rb
|
|
76
|
+
- lib/honey/builder.rb
|
|
77
|
+
- lib/honey/client.rb
|
|
78
|
+
- lib/honey/order.rb
|
|
79
|
+
- lib/honey/version.rb
|
|
80
|
+
- lib/nokogiri/xml/document_to_hash.rb
|
|
81
|
+
- test/honey/builder_test.rb
|
|
82
|
+
- test/honey/client_test.rb
|
|
83
|
+
- test/honey/order_test.rb
|
|
84
|
+
- test/honey_test.rb
|
|
85
|
+
- test/nokogiri/xml/document_to_hash_test.rb
|
|
86
|
+
- test/test_helper.rb
|
|
87
|
+
homepage: http://github.com/SuguToys/honeys-place
|
|
88
|
+
licenses:
|
|
89
|
+
- MIT
|
|
90
|
+
metadata: {}
|
|
91
|
+
post_install_message:
|
|
92
|
+
rdoc_options: []
|
|
93
|
+
require_paths:
|
|
94
|
+
- lib
|
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
|
+
requirements:
|
|
97
|
+
- - ">="
|
|
98
|
+
- !ruby/object:Gem::Version
|
|
99
|
+
version: '0'
|
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
|
+
requirements:
|
|
102
|
+
- - ">="
|
|
103
|
+
- !ruby/object:Gem::Version
|
|
104
|
+
version: '0'
|
|
105
|
+
requirements: []
|
|
106
|
+
rubyforge_project:
|
|
107
|
+
rubygems_version: 2.2.2
|
|
108
|
+
signing_key:
|
|
109
|
+
specification_version: 4
|
|
110
|
+
summary: A wrapper for the Honey's Place API
|
|
111
|
+
test_files:
|
|
112
|
+
- test/honey/builder_test.rb
|
|
113
|
+
- test/honey/client_test.rb
|
|
114
|
+
- test/honey/order_test.rb
|
|
115
|
+
- test/honey_test.rb
|
|
116
|
+
- test/nokogiri/xml/document_to_hash_test.rb
|
|
117
|
+
- test/test_helper.rb
|