bill_hicks 0.2.2 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cbae56f3c12ad2cdd106414eb844183939c1b247
4
- data.tar.gz: 14ef1d1a11211f29edb2022d7eb54794fab5aae1
3
+ metadata.gz: 63513599c0b2819f553f3c2a761fe07f931c1697
4
+ data.tar.gz: 8484b2ac79c96634b3cf4d05aa91ba0e131d203f
5
5
  SHA512:
6
- metadata.gz: 65862430456703f1a6aae57757c0ea9af0ab6bba92664eb79e188239394da4ea1aec53e0baa0729604aaf5b1df9f98f19db7dadb5e23086fff188c9f09ba1003
7
- data.tar.gz: b0b7aac2904172780ac42eb08a228a625677fa21959a2eb33f6be56487e3499829710dd684ac909dd080c59b2c39ad2de412de19b71849f8608c29dac24b3a6d
6
+ metadata.gz: 47872726da303d436c4d3a65361b5a263f825ebea540f0c4956edec9eff6e20a96f1696eb2a2a3ebad9cd4624b0130559b1b7aac00bc6d227a970ed9965cdc50
7
+ data.tar.gz: 81cf9a3343ea5a8c9b4a029c587b358745555c885e5f9248ea0fc8f45ea3cb31952ff9bf6e843b628d27049da5fd0d32ff512987b50b045f95ccc65e403a6264
data/.gitignore CHANGED
@@ -7,3 +7,5 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ script/*
11
+
data/bill_hicks.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.13"
24
+ spec.add_development_dependency "bundler", "~> 1.12"
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  end
data/bin/setup CHANGED
@@ -4,5 +4,3 @@ IFS=$'\n\t'
4
4
  set -vx
5
5
 
6
6
  bundle install
7
-
8
- # Do any other automated setup that you need to do here
data/lib/bill_hicks.rb CHANGED
@@ -8,9 +8,44 @@ require 'bill_hicks/catalog'
8
8
  require 'bill_hicks/category'
9
9
  require 'bill_hicks/inventory'
10
10
  require 'bill_hicks/order'
11
+ require 'bill_hicks/response_file'
11
12
  require 'bill_hicks/user'
12
13
 
13
14
  module BillHicks
14
15
  class InvalidOrder < StandardError; end
15
16
  class NotAuthenticated < StandardError; end
17
+
18
+ class << self
19
+ attr_accessor :config
20
+ end
21
+
22
+ def self.config
23
+ @config ||= Configuration.new
24
+ end
25
+
26
+ def self.configure
27
+ yield(config)
28
+ end
29
+
30
+ class Configuration
31
+ attr_accessor :ftp_host
32
+ attr_accessor :response_dir
33
+ attr_accessor :submission_dir
34
+ attr_accessor :top_level_dir
35
+
36
+ def initialize
37
+ @ftp_host ||= "billhicksco.hostedftp.com"
38
+ @top_level_dir ||= "AmmoReady"
39
+ @submission_dir ||= "toBHC"
40
+ @response_dir ||= "fromBHC"
41
+ end
42
+
43
+ def full_submission_dir
44
+ File.join(@top_level_dir, @submission_dir)
45
+ end
46
+
47
+ def full_response_dir
48
+ File.join(@top_level_dir, @response_dir)
49
+ end
50
+ end
16
51
  end
@@ -1,8 +1,16 @@
1
1
  module BillHicks
2
2
  class Base
3
3
 
4
- FTP_HOST = 'billhicksco.hostedftp.com'
5
- FTP_DIR = 'AmmoReady'
4
+ def self.connect(options = {})
5
+ requires!(options, :username, :password)
6
+
7
+ Net::FTP.open(BillHicks.config.ftp_host, options[:username], options[:password]) do |ftp|
8
+ ftp.passive = true
9
+ yield ftp
10
+ end
11
+ rescue Net::FTPPermError
12
+ raise BillHicks::NotAuthenticated
13
+ end
6
14
 
7
15
  protected
8
16
 
@@ -24,15 +32,11 @@ module BillHicks
24
32
  end
25
33
  end
26
34
 
27
- def connect(options = {})
28
- requires!(options, :username, :password)
29
-
30
- Net::FTP.open(FTP_HOST, options[:username], options[:password]) do |ftp|
31
- ftp.passive = true
35
+ # Instance methods become class methods through inheritance
36
+ def connect(options)
37
+ self.class.connect(options) do |ftp|
32
38
  yield ftp
33
39
  end
34
- rescue Net::FTPPermError
35
- raise BillHicks::NotAuthenticated
36
40
  end
37
41
 
38
42
  end
@@ -20,7 +20,6 @@ module BillHicks
20
20
 
21
21
  CATALOG_FILENAME = 'billhickscatalog.csv'
22
22
 
23
-
24
23
  def initialize(options = {})
25
24
  requires!(options, :username, :password)
26
25
  @options = options
@@ -36,7 +35,7 @@ module BillHicks
36
35
  catalog = []
37
36
 
38
37
  connect(@options) do |ftp|
39
- ftp.chdir(FTP_DIR)
38
+ ftp.chdir(BillHicks.config.top_level_dir)
40
39
 
41
40
  lines = ftp.gettextfile(CATALOG_FILENAME, nil)
42
41
 
@@ -10,7 +10,6 @@ module BillHicks
10
10
 
11
11
  INVENTORY_FILENAME = 'billhicksinventory.csv'
12
12
 
13
-
14
13
  def initialize(options = {})
15
14
  requires!(options, :username, :password)
16
15
  @options = options
@@ -26,7 +25,7 @@ module BillHicks
26
25
  inventory = []
27
26
 
28
27
  connect(@options) do |ftp|
29
- ftp.chdir(FTP_DIR)
28
+ ftp.chdir(BillHicks.config.top_level_dir)
30
29
 
31
30
  lines = ftp.gettextfile(INVENTORY_FILENAME, nil)
32
31
 
@@ -9,8 +9,6 @@ module BillHicks
9
9
  # See each method for a list of required options.
10
10
  class Order < Base
11
11
 
12
- ORDER_UPLOAD_DIR = [FTP_DIR, 'toBHC'].join('/')
13
-
14
12
  # @option options [String] :username *required*
15
13
  # @option options [String] :password *required*
16
14
  def initialize(options = {})
@@ -45,12 +43,15 @@ module BillHicks
45
43
  @items << item
46
44
  end
47
45
 
46
+ def filename
47
+ "#{@header[:purchase_order]}-order.txt"
48
+ end
49
+
48
50
  def submit!
49
51
  raise BillHicks::InvalidOrder.new("Must call #add_header before submitting") if @header.nil?
50
52
  raise BillHicks::InvalidOrder.new("Must add items with #add_item before submitting") if @items.empty?
51
53
 
52
- @order_filename = "#{@header[:purchase_order]}-order.txt"
53
- @order_file = Tempfile.new(@order_filename)
54
+ @order_file = Tempfile.new(filename)
54
55
  begin
55
56
  CSV.open(@order_file.path, 'w+') do |csv|
56
57
  csv << header_names
@@ -111,8 +112,8 @@ module BillHicks
111
112
 
112
113
  def upload!
113
114
  connect(@options) do |ftp|
114
- ftp.chdir(ORDER_UPLOAD_DIR)
115
- ftp.puttextfile(@order_file.path, @order_filename)
115
+ ftp.chdir(BillHicks.config.full_submission_dir)
116
+ ftp.puttextfile(@order_file.path, filename)
116
117
  end
117
118
  end
118
119
 
@@ -0,0 +1,51 @@
1
+ module BillHicks
2
+ class ResponseFile < Base
3
+
4
+ attr_reader :content
5
+ attr_reader :credentials
6
+ attr_reader :filename
7
+
8
+ FILE_TYPES = {
9
+ "ACK" => "Purchase Order Acknowledgement",
10
+ "ASN" => "Advance Shipping Notice"
11
+ }
12
+
13
+ # @option options [String] :username *required*
14
+ # @option options [String] :password *required*
15
+ # @option options [String] :filename *required*
16
+ def initialize(options = {})
17
+ requires!(options, :username, :password, :filename)
18
+
19
+ @credentials = options.select { |k, v| [:username, :password].include?(k) }
20
+ @filename = options[:filename]
21
+ end
22
+
23
+ # Return list of '855 Purchase Order Acknowledgement' files
24
+ # @option options [String] :username *required*
25
+ # @option options [String] :password *required*
26
+ def self.all(options = {})
27
+ requires!(options, :username, :password)
28
+
29
+ Base.connect(options) do |ftp|
30
+ ftp.chdir(BillHicks.config.full_response_dir)
31
+ ftp.nlst("*.txt")
32
+ end
33
+ end
34
+
35
+ def content
36
+ return @content if @content
37
+ connect(@credentials) do |ftp|
38
+ ftp.chdir(BillHicks.config.full_response_dir)
39
+ @content = ftp.gettextfile(@filename, nil)
40
+ end
41
+ end
42
+
43
+ def to_json
44
+ CSV.parse(content, headers: true, col_sep: "|").
45
+ map { |x| x.to_h }.
46
+ group_by { |x| x["PO Number"] }
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -1,3 +1,3 @@
1
1
  module BillHicks
2
- VERSION = "0.2.2"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bill_hicks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Campbell
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-11-23 00:00:00.000000000 Z
11
+ date: 2016-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: '1.12'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: '1.12'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -77,6 +77,7 @@ files:
77
77
  - lib/bill_hicks/category.rb
78
78
  - lib/bill_hicks/inventory.rb
79
79
  - lib/bill_hicks/order.rb
80
+ - lib/bill_hicks/response_file.rb
80
81
  - lib/bill_hicks/user.rb
81
82
  - lib/bill_hicks/version.rb
82
83
  homepage: ''
@@ -99,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
100
  version: '0'
100
101
  requirements: []
101
102
  rubyforge_project:
102
- rubygems_version: 2.5.1
103
+ rubygems_version: 2.6.7
103
104
  signing_key:
104
105
  specification_version: 4
105
106
  summary: Ruby library for Bill Hicks ERP system