zanders 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 320b713912cf45d9193b127a38bfb51e5b5b91d6
4
+ data.tar.gz: 7736dcf3ffab83a65309c16cea0df56e8235bb5c
5
+ SHA512:
6
+ metadata.gz: 3203095d5298e9e5ca76c00bcde33e576e5a549fe6e492844eda133d731bd0b7de5571fc65355b9794f2024b8a824aac45f397b4acbb75469d1b67c23eeaa334
7
+ data.tar.gz: 419adab7698aa2915f0703be0baef0efbded9b282c44fa0bc9f03d8e95edf8e094799b61c46ee4e85a9d9355a68a453778f5542756a2f8044c3157943b7b5efd
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ zanders
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.1
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.1
5
+ before_install: gem install bundler -v 1.14.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in zanders.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 David Knight
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # Zanders
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "zanders"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,88 @@
1
+ module Zanders
2
+ class Address < SoapClient
3
+
4
+ attr_reader :username
5
+ attr_reader :password
6
+
7
+ # Public: Initializes a new Address with username
8
+ # and password
9
+ #
10
+ # username - A String username
11
+ # password - A String password
12
+ #
13
+ # Returns a new Address service interface
14
+ def initialize(options = {})
15
+ requires!(options, :username, :password)
16
+
17
+ @username = options[:username]
18
+ @password = options[:password]
19
+ end
20
+
21
+ def self.ship_to_number(address, options = {})
22
+ new(options).ship_to_number(address)
23
+ end
24
+
25
+ # Public: Get a shipToNumber for the address
26
+ # provided in `address`
27
+ #
28
+ # address - Hash of the address
29
+ #
30
+ # Returns Hash containing the ship to number, or an error
31
+ # code if the call failed
32
+ def ship_to_number(address)
33
+ request_data = build_request_data(address)
34
+
35
+ response = soap_client(ADDRESS_API_URL).call(:use_ship_to, message: request_data)
36
+ response = response.body[:use_ship_to_response][:return][:item]
37
+
38
+ # Successful call return_code is 0
39
+ if response.first[:value] == "0"
40
+ ship_to_number = Hash.new
41
+
42
+ # Let's dig to get to data we actually need. Yay, digging...
43
+ parts = ship_to_number[:ship_to_number] = response.last[:value].first[1]
44
+
45
+ # We only need the ship_to_number out of the data received
46
+ ship_to_number[:ship_to_number] = parts.find { |i| i[:key] == "ShipToNo" }[:value]
47
+
48
+ ship_to_number[:success] = true
49
+
50
+ ship_to_number
51
+ else
52
+ { success: false, error_code: response.first[:value] }
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ # Private: Combines request data with the username,
59
+ # password, and type-cast assignments
60
+ #
61
+ # hash - Hash of request data
62
+ #
63
+ # Returns merged Hash
64
+ def build_request_data(hash)
65
+ {
66
+ :attributes! => {
67
+ addressinfo: { "xsi:type" => "ns2:Map" },
68
+ },
69
+ username: @username,
70
+ password: @password,
71
+ addressinfo: {
72
+ item: [
73
+ { key: 'name', value: hash[:name] },
74
+ { key: 'address1', value: hash[:address1] },
75
+ { key: 'address2', value: hash[:address2] },
76
+ { key: 'city', value: hash[:city] },
77
+ { key: 'state', value: hash[:state] },
78
+ { key: 'zip', value: hash[:zip] },
79
+ { key: 'fflno', value: hash[:fflno] },
80
+ { key: 'fflexp', value: hash[:fflexp] }
81
+ ]
82
+ },
83
+ testing: true
84
+ }
85
+ end
86
+
87
+ end
88
+ end
@@ -0,0 +1,43 @@
1
+ module Zanders
2
+ class Base
3
+
4
+ def self.connect(options = {})
5
+ requires!(options, :username, :password)
6
+
7
+ Net::FTP.open(Zanders.config.ftp_host, options[:username], options[:password]) do |ftp|
8
+ ftp.passive = true
9
+ yield ftp
10
+ end
11
+ rescue Net::FTPPermError
12
+ raise Zanders::NotAuthenticated
13
+ end
14
+
15
+ protected
16
+
17
+ # Wrapper to `self.requires!` that can be used as an instance method.
18
+ def requires!(*args)
19
+ self.class.requires!(*args)
20
+ end
21
+
22
+ def self.requires!(hash, *params)
23
+ params.each do |param|
24
+ if param.is_a?(Array)
25
+ raise ArgumentError.new("Missing required parameter: #{param.first}") unless hash.has_key?(param.first)
26
+
27
+ valid_options = param[1..-1]
28
+ raise ArgumentError.new("Parameter: #{param.first} must be one of: #{valid_options.join(', ')}") unless valid_options.include?(hash[param.first])
29
+ else
30
+ raise ArgumentError.new("Missing required parameter: #{param}") unless hash.has_key?(param)
31
+ end
32
+ end
33
+ end
34
+
35
+ # Instance methods become class methods through inheritance
36
+ def connect(options)
37
+ self.class.connect(options) do |ftp|
38
+ yield ftp
39
+ end
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,54 @@
1
+ module Zanders
2
+ class Inventory < Base
3
+
4
+ INVENTORY_FILENAME = "zandersinv.csv"
5
+ QUANTITY_FILENAME = "liveinv.csv"
6
+
7
+ def initialize(options = {})
8
+ requires!(options, :username, :password)
9
+
10
+ @options = options
11
+ end
12
+
13
+ def self.all(chunk_size = 15, options = {}, &block)
14
+ requires!(options, :username, :password)
15
+ new(options).all(chunk_size, &block)
16
+ end
17
+
18
+ def self.quantities(chunk_size = 15, options = {}, &block)
19
+ requires!(options, :username, :password)
20
+ new(options).quantities(chunk_size, &block)
21
+ end
22
+
23
+ def all(chunk_size, &block)
24
+ connect(@options) do |ftp|
25
+ csv_tempfile = Tempfile.new
26
+
27
+ ftp.chdir(Zanders.config.ftp_directory)
28
+ ftp.getbinaryfile(INVENTORY_FILENAME, csv_tempfile.path)
29
+
30
+ SmarterCSV.process(csv_tempfile, { :chunk_size => chunk_size, :convert_values_to_numeric => false }) do |chunk|
31
+ yield(chunk)
32
+ end
33
+
34
+ csv_tempfile.unlink
35
+ end
36
+ end
37
+
38
+ def quantities(chunk_size, &block)
39
+ connect(@options) do |ftp|
40
+ csv_tempfile = Tempfile.new
41
+
42
+ ftp.chdir(Zanders.config.ftp_directory)
43
+ ftp.getbinaryfile(QUANTITY_FILENAME, csv_tempfile.path)
44
+
45
+ SmarterCSV.process(csv_tempfile, { :chunk_size => chunk_size, :convert_values_to_numeric => false }) do |chunk|
46
+ yield(chunk)
47
+ end
48
+
49
+ csv_tempfile.unlink
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,105 @@
1
+ module Zanders
2
+ class Item < SoapClient
3
+
4
+ attr_reader :username
5
+ attr_reader :password
6
+
7
+ # Public: Initialize a new Item interface with
8
+ # username and password
9
+ #
10
+ # options - Hash of username and password
11
+ #
12
+ # Returns a new Item service interface
13
+ def initialize(options = {})
14
+ requires!(options, :username, :password)
15
+
16
+ @username = options[:username]
17
+ @password = options[:password]
18
+ end
19
+
20
+ # Public: Get item info by item number
21
+ #
22
+ # item_number - Integer of the item number
23
+ #
24
+ # Returns Hash containing item info, or an error code if
25
+ # the call failed
26
+ def get_info(item_number)
27
+ request_data = build_request_data({ itemnumber: item_number })
28
+
29
+ response = soap_client(ITEM_API_URL).call(:get_item_info, message: request_data)
30
+ response = response.body[:get_item_info_response][:return][:item]
31
+
32
+ # Successful call return_code is 0
33
+ if response.first[:value] == "0"
34
+ info = Hash.new
35
+
36
+ # Let's toss the data we need into a ruby-ish hash
37
+ response.each do |info_part|
38
+ case info_part[:key]
39
+ when "itemNumber"
40
+ info[:item_number] = info_part[:value]
41
+ when "itemDescription"
42
+ info[:description] = info_part[:value]
43
+ when "itemPrice"
44
+ info[:price] = info_part[:value]
45
+ when "itemWeight"
46
+ info[:weight] = info_part[:value]
47
+ when "numberAvailable"
48
+ info[:quantity] = info_part[:value]
49
+ else
50
+ next
51
+ end
52
+ end
53
+
54
+ info[:success] = true
55
+
56
+ info
57
+ else
58
+ { success: false, error_code: response.first[:value] }
59
+ end
60
+ end
61
+
62
+ # Public: Get item quantity by item number
63
+ #
64
+ # item_number - Integer of the item number
65
+ #
66
+ # Returns Hash containing item quantity, or an error code
67
+ # if the call failed
68
+ def get_quantity(item_number)
69
+ request_data = build_request_data({ itemnumber: item_number })
70
+
71
+ response = soap_client(ITEM_API_URL).call(:get_item_inventory, message: request_data)
72
+ response = response.body[:get_item_inventory_response][:return][:item]
73
+
74
+ # Successful call return_code is 0
75
+ if response.first[:value] == "0"
76
+ quantity = Hash.new
77
+
78
+ # We only need the quantity out of the data received
79
+ quantity[:quantity] = response.find { |i| i[:key] == "numberAvailable" }[:value]
80
+
81
+ quantity[:success] = true
82
+
83
+ quantity
84
+ else
85
+ { success: false, error_code: response.first[:value] }
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ # Private: Combines request data with the username and password
92
+ #
93
+ # hash - Hash of request data
94
+ #
95
+ # Returns merged Hash
96
+ def build_request_data(hash)
97
+ {
98
+ username: @username,
99
+ password: @password,
100
+ testing: true
101
+ }.merge(hash)
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,160 @@
1
+ module Zanders
2
+ class Order < SoapClient
3
+
4
+ ##
5
+ # == Order Service
6
+ #
7
+ # Return Codes
8
+ # 0: Success
9
+ # 1: Username and/or Password were incorrect
10
+ # 2: There was a problem creating the order
11
+ # 5: Cannot create order with no items
12
+ # 9: Order not created because all items not available and not to be back ordered
13
+ # 10: Ship date cannot be before today
14
+ # 11: Ship date cannoy be more than 30days in the future
15
+ # 21: The order number is NOT connected to your customer number
16
+ # 31: Can NOT add item with quantity of less than 1
17
+ # 41: The item number requested is NOT connected to this order
18
+
19
+ attr_reader :username, :password, :options
20
+
21
+ # Public: Initialize a new Order
22
+ #
23
+ # options - Hash of username, password, and address information
24
+ #
25
+ # Returns an Order service interface
26
+ def initialize(options = {})
27
+ requires!(options, :username, :password)
28
+
29
+ @username = options[:username]
30
+ @password = options[:password]
31
+
32
+ @options = options
33
+ end
34
+
35
+ # Public: Create a new order
36
+ #
37
+ # items - Array of hashes containing item_number and quantity
38
+ #
39
+ # Returns an order_number
40
+ def create_order(items, address)
41
+ order = build_order_data
42
+ order_items = Array.new
43
+
44
+ items.each do |item|
45
+ order_items.push(item: [
46
+ { key: 'itemNumber', value: item[:item_number] },
47
+ { key: 'quantity', value: item[:quantity] },
48
+ { key: 'allowBackOrder', value: false }
49
+ ])
50
+ end
51
+
52
+ ship_to_number = Zanders::Address.ship_to_number(address, @options)
53
+
54
+ if ship_to_number[:success]
55
+ shipping_information = [
56
+ { key: 'shipToNo', value: ship_to_number[:ship_to_number] },
57
+ { key: 'shipDate', value: Time.now.strftime("%Y-%m-%d") },
58
+ # TODO-david
59
+ { key: 'ShipViaCode', value: 'UG' },
60
+ # TODO-david
61
+ { key: 'purchaseOrderNumber', value: '4567' }
62
+ ]
63
+
64
+ # NOTE-david
65
+ # order(ns2 map)
66
+ # item
67
+ # key
68
+ # value(ns2map)
69
+ # item - order item
70
+ # item - order item
71
+ # item
72
+ # "
73
+ #
74
+ order[:order] = Hash.new
75
+ order[:order][:item] = shipping_information
76
+
77
+ order_items = {item: order_items, attributes!: { item: { "xsi:type" => "ns2:Map"} }}
78
+
79
+ order[:order][:item].push({
80
+ key: 'items',
81
+ value: order_items
82
+ })
83
+
84
+ response = soap_client(ORDER_API_URL).call(:create_order, message: order)
85
+ end
86
+ end
87
+
88
+ # Public: Get order info
89
+ #
90
+ # order_number - The String order number
91
+ #
92
+ # Returns Hash containing order information, or an error
93
+ # code if the call failed
94
+ def get_order(order_number)
95
+ order = build_order_data.merge({ ordernumber: order_number })
96
+
97
+ response = soap_client(ORDER_API_URL).call(:get_order_info, message: order)
98
+ response = response.body[:get_order_info_response][:return][:item]
99
+
100
+ # Successful call return_code is 0
101
+ if response.first[:value] == "0"
102
+ info = Hash.new
103
+
104
+ # Just use the order number we already have
105
+ info[:order_number] = order_number
106
+
107
+ # Transform the response into a ruby-ish hash
108
+ response.each do |part|
109
+ case part[:key]
110
+ when "purchaseOrderNumber"
111
+ info[:purchase_order_number] = part[:value]
112
+ when "orderDate"
113
+ info[:order_date] = part[:value]
114
+ when "orderEnteredDate"
115
+ info[:ordered_entered_date] = part[:value]
116
+ when "orderShipDate"
117
+ info[:order_ship_date] = part[:value]
118
+ when "subtotal"
119
+ info[:subtotal] = part[:value]
120
+ when "freight"
121
+ info[:freight] = part[:value]
122
+ when "miscFee"
123
+ info[:misc_fee] = part[:value]
124
+ when "selectionCode"
125
+ info[:selection_code] = part[:value]
126
+ when "datePicked"
127
+ info[:date_picked] = part[:value]
128
+ when "grandTotal"
129
+ info[:grand_total] = part[:value]
130
+ end
131
+ end
132
+
133
+ info[:success] = true
134
+
135
+ info
136
+ else
137
+ { success: false, error_code: response.first[:value] }
138
+ end
139
+ end
140
+
141
+ private
142
+
143
+ # Private: Builds request data
144
+ #
145
+ # Returns Hash of username, password, and cast assignments
146
+ def build_order_data
147
+ hash = {
148
+ :attributes! => {
149
+ order: { "xsi:type" => "ns2:Map" }
150
+ },
151
+ username: @username,
152
+ password: @password,
153
+ testing: true
154
+ }
155
+
156
+ hash
157
+ end
158
+
159
+ end
160
+ end
@@ -0,0 +1,39 @@
1
+ module Zanders
2
+ class SoapClient < Base
3
+
4
+ ##
5
+ # == Item Service
6
+ #
7
+ # Return Codes
8
+ # 0: Success
9
+ # 1: Username and/or Password were incorrect
10
+ # 2: There was a problem retrieving information on the item(s)
11
+
12
+ protected
13
+
14
+ def soap_client(api_url)
15
+ namespaces = {
16
+ "xmlns:env" => "http://www.w3.org/2003/05/soap-envelope",
17
+ "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema",
18
+ "xmlns:xsl" => "http://www.w3.org/2001/XMLSchema-Instance",
19
+ "xmlns:ns2" => "http://xml.apache.org/xml-soap",
20
+ "xmlns:enc" => "http://www.w3.org/2003/05/soap-encoding"
21
+ }
22
+
23
+ @soap_client ||= Savon.client do
24
+ wsdl(api_url)
25
+ namespaces(namespaces)
26
+ namespace_identifier(:ns1)
27
+ strip_namespaces true
28
+ ssl_verify_mode :none
29
+
30
+ if DEBUG
31
+ log(true)
32
+ log_level(:debug)
33
+ pretty_print_xml(true)
34
+ end
35
+ end
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module Zanders
2
+ VERSION = "0.1.5"
3
+ end
data/lib/zanders.rb ADDED
@@ -0,0 +1,47 @@
1
+ require "zanders/version"
2
+
3
+ require 'net/ftp'
4
+ require 'savon'
5
+ # TODO-david
6
+ require 'pp'
7
+
8
+ require 'zanders/base'
9
+ require 'zanders/soap_client'
10
+
11
+ require 'zanders/address'
12
+ require 'zanders/order'
13
+ require 'zanders/item'
14
+ require 'zanders/inventory'
15
+
16
+ module Zanders
17
+
18
+ DEBUG = true
19
+
20
+ ADDRESS_API_URL = 'https://shop2.gzanders.com/webservice/shiptoaddresses?wsdl'
21
+ ORDER_API_URL = 'https://shop2.gzanders.com/webservice/orders?wsdl'
22
+ ITEM_API_URL = 'https://shop2.gzanders.com/webservice/items?wsdl'
23
+
24
+ class NotAuthenticated < StandardError; end
25
+
26
+ class << self
27
+ attr_accessor :config
28
+ end
29
+
30
+ def self.config
31
+ @config ||= Configuration.new
32
+ end
33
+
34
+ def self.configure
35
+ yield(config)
36
+ end
37
+
38
+ class Configuration
39
+ attr_accessor :ftp_host
40
+ attr_accessor :ftp_directory
41
+
42
+ def initialize
43
+ @ftp_host ||= "ftp.gzanders.com"
44
+ @ftp_directory ||= "Inventory/AmmoReady"
45
+ end
46
+ end
47
+ end
data/zanders.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'zanders/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "zanders"
8
+ spec.version = Zanders::VERSION
9
+ spec.authors = ["David Knight"]
10
+ spec.email = ["viacoffee@gmail.com"]
11
+
12
+ spec.summary = %q{Ruby library for Zanders}
13
+ spec.description = %q{}
14
+ spec.homepage = ""
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 "nokogiri", "~> 1.6"
25
+ spec.add_dependency "savon", "~> 2.11.1"
26
+
27
+ spec.add_runtime_dependency "smarter_csv", "~> 1.1.4"
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.14"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zanders
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.5
5
+ platform: ruby
6
+ authors:
7
+ - David Knight
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-07-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: savon
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.11.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.11.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: smarter_csv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.4
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.4
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.14'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.14'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ description: ''
98
+ email:
99
+ - viacoffee@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".ruby-gemset"
107
+ - ".ruby-version"
108
+ - ".travis.yml"
109
+ - Gemfile
110
+ - LICENSE.txt
111
+ - README.md
112
+ - Rakefile
113
+ - bin/console
114
+ - bin/setup
115
+ - lib/zanders.rb
116
+ - lib/zanders/address.rb
117
+ - lib/zanders/base.rb
118
+ - lib/zanders/inventory.rb
119
+ - lib/zanders/item.rb
120
+ - lib/zanders/order.rb
121
+ - lib/zanders/soap_client.rb
122
+ - lib/zanders/version.rb
123
+ - zanders.gemspec
124
+ homepage: ''
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.5.1
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: Ruby library for Zanders
148
+ test_files: []