rvista 0.2 → 0.5
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.
- data/Rakefile +2 -2
- data/examples/test.rb +14 -0
- data/lib/rvista/invoice.rb +104 -0
- data/lib/rvista/invoice_line_item.rb +86 -0
- data/lib/rvista/{message.rb → po.rb} +3 -5
- data/lib/rvista/{line_item.rb → po_line_item.rb} +2 -2
- data/lib/rvista/poa.rb +96 -0
- data/lib/rvista/poa_line_item.rb +71 -0
- data/lib/rvista.rb +6 -2
- data/test/data/invoice/invalid_line.txt +4 -0
- data/test/data/invoice/invalid_missing_footer.txt +3 -0
- data/test/data/invoice/invalid_missing_header.txt +3 -0
- data/test/data/invoice/valid.txt +4 -0
- data/test/data/{invalid_line.txt → po/invalid_line.txt} +0 -0
- data/test/data/{invalid_missing_footer.txt → po/invalid_missing_footer.txt} +0 -0
- data/test/data/{invalid_missing_header.txt → po/invalid_missing_header.txt} +0 -0
- data/test/data/po/no_delivery_location.txt +3 -0
- data/test/data/po/seperate_delivery_location.txt +3 -0
- data/test/data/{valid.txt → po/valid.txt} +0 -0
- data/test/data/poa/invalid_line.txt +4 -0
- data/test/data/poa/invalid_missing_footer.txt +3 -0
- data/test/data/poa/invalid_missing_header.txt +3 -0
- data/test/data/poa/valid.txt +4 -0
- data/test/unit/invoice_line_item_test.rb +71 -0
- data/test/unit/invoice_test.rb +73 -0
- data/test/unit/line_item_test.rb +35 -4
- data/test/unit/message_test.rb +15 -15
- data/test/unit/poa_line_item_test.rb +75 -0
- data/test/unit/poa_test.rb +78 -0
- metadata +35 -12
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rake/testtask'
|
|
5
5
|
require "rake/gempackagetask"
|
6
6
|
require "rubygems"
|
7
7
|
|
8
|
-
PKG_VERSION = "0.
|
8
|
+
PKG_VERSION = "0.5"
|
9
9
|
PKG_NAME = "rvista"
|
10
10
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
11
11
|
|
@@ -53,7 +53,7 @@ spec = Gem::Specification.new do |spec|
|
|
53
53
|
spec.extra_rdoc_files = %w{README COPYING LICENSE}
|
54
54
|
spec.rdoc_options << '--title' << 'rvista Documentation' <<
|
55
55
|
'--main' << 'README' << '-q'
|
56
|
-
spec.add_dependency('fastercsv', '>=
|
56
|
+
spec.add_dependency('fastercsv', '>= 1.2.1')
|
57
57
|
spec.author = "James Healy"
|
58
58
|
spec.email = "jimmy@deefa.com"
|
59
59
|
spec.description = <<END_DESC
|
data/examples/test.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + "/../lib/rvista"
|
4
|
+
|
5
|
+
#filename = File.dirname(__FILE__) + "/../test/data/seperate_delivery_location.txt"
|
6
|
+
filename = File.dirname(__FILE__) + "/../test/data/no_delivery_location.txt"
|
7
|
+
#filename = File.dirname(__FILE__) + "/../test/data/valid.txt"
|
8
|
+
|
9
|
+
msg = RVista::Message.load_from_file(filename)
|
10
|
+
if msg.delivery_location.nil?
|
11
|
+
puts "nil delivery location"
|
12
|
+
else
|
13
|
+
puts msg.delivery_location
|
14
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'fastercsv'
|
3
|
+
|
4
|
+
module RVista
|
5
|
+
|
6
|
+
# Represents a single Vista Invoice
|
7
|
+
class Invoice
|
8
|
+
|
9
|
+
attr_accessor :sender_id, :receiver_id, :doc_type, :description
|
10
|
+
attr_accessor :doc_number, :doc_date, :delivery_location, :currency
|
11
|
+
attr_accessor :items
|
12
|
+
|
13
|
+
# creates a new RVista::Invoice object
|
14
|
+
def initialize
|
15
|
+
@items = []
|
16
|
+
end
|
17
|
+
|
18
|
+
# reads a vista invoice file into memory. input should be a string
|
19
|
+
# that specifies the file path
|
20
|
+
def self.load_from_file(input)
|
21
|
+
raise InvalidFileError, 'Invalid file' unless File.exist?(input)
|
22
|
+
data = FasterCSV.read(input)
|
23
|
+
return self.build_message(data)
|
24
|
+
end
|
25
|
+
|
26
|
+
# creates a RVista::Invoice object from a string. Input should
|
27
|
+
# be a complete vista file as a string
|
28
|
+
def self.load_from_string(input)
|
29
|
+
data = FasterCSV.parse(input)
|
30
|
+
return self.build_message(data)
|
31
|
+
end
|
32
|
+
|
33
|
+
# print a string representation of this order that meets the spec
|
34
|
+
def to_s
|
35
|
+
# message header
|
36
|
+
msg = ""
|
37
|
+
msg << "H,"
|
38
|
+
msg << "#{sender_id},"
|
39
|
+
msg << "#{receiver_id},"
|
40
|
+
msg << "#{doc_type},"
|
41
|
+
msg << "#{description},"
|
42
|
+
msg << "#{doc_number},"
|
43
|
+
msg << "#{doc_date},"
|
44
|
+
msg << "#{delivery_location},"
|
45
|
+
msg << "#{currency}\n"
|
46
|
+
|
47
|
+
total_value = BigDecimal.new("0")
|
48
|
+
total_qty = BigDecimal.new("0")
|
49
|
+
total_gst = BigDecimal.new("0")
|
50
|
+
|
51
|
+
# message line items
|
52
|
+
@items.each do |item|
|
53
|
+
msg << item.to_s << "\n"
|
54
|
+
total_value += item.value
|
55
|
+
total_qty += item.qty
|
56
|
+
total_gst += item.gst
|
57
|
+
end
|
58
|
+
|
59
|
+
# message summary
|
60
|
+
msg << "S,"
|
61
|
+
msg << "#{@items.size.to_s},"
|
62
|
+
msg << sprintf("%.2f", total_value)
|
63
|
+
msg << ","
|
64
|
+
msg << sprintf("%.0f", total_qty)
|
65
|
+
msg << ","
|
66
|
+
msg << sprintf("%.2f", total_gst)
|
67
|
+
msg << "\n"
|
68
|
+
|
69
|
+
return msg
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def self.build_message(data)
|
75
|
+
raise InvalidFileError, 'File appears to be too short' unless data.size >= 3
|
76
|
+
raise InvalidFileError, 'Missing header information' unless data[0][0].eql?("H")
|
77
|
+
raise InvalidFileError, 'Missing footer information' unless data[-1][0].eql?("S")
|
78
|
+
|
79
|
+
msg = self.new
|
80
|
+
|
81
|
+
# set message attributes
|
82
|
+
msg.sender_id = data[0][1]
|
83
|
+
msg.receiver_id = data[0][2]
|
84
|
+
msg.doc_type = data[0][3]
|
85
|
+
msg.description = data[0][4]
|
86
|
+
msg.doc_number = data[0][5]
|
87
|
+
msg.doc_date = data[0][6]
|
88
|
+
msg.delivery_location = data[0][7]
|
89
|
+
msg.currency = data[0][8]
|
90
|
+
|
91
|
+
# load each lineitem into the message
|
92
|
+
data[1,data.size - 2].each do |row|
|
93
|
+
raise InvalidLineItemError, 'Invalid line detected' unless row[0].eql?("D")
|
94
|
+
item = InvoiceLineItem.load_from_array(row)
|
95
|
+
msg.items << item
|
96
|
+
end
|
97
|
+
|
98
|
+
raise InvalidFileError, 'Line item count doesn\'t match footer' unless data[-1][1].to_i.eql?(msg.items.size)
|
99
|
+
|
100
|
+
# return the results
|
101
|
+
return msg
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
|
3
|
+
module RVista
|
4
|
+
|
5
|
+
# represents a single line on an invoice. Has attributes like
|
6
|
+
# price, qty and description
|
7
|
+
class InvoiceLineItem
|
8
|
+
|
9
|
+
attr_accessor :line_num, :po_number, :qualifier, :ean, :description
|
10
|
+
attr_accessor :qty, :unit_measure, :rrp, :discount_percent
|
11
|
+
attr_accessor :nett_unit_price, :gst_inclusive, :value
|
12
|
+
attr_accessor :discount_value, :nett_value, :gst, :firm_sale
|
13
|
+
|
14
|
+
# returns a new RVista::POALineItem object using the data passed in as an
|
15
|
+
# array. The array should have exactly 14 items in it. Refer to the Vista
|
16
|
+
# standard to see what those 14 items should be.
|
17
|
+
def self.load_from_array(data)
|
18
|
+
item = self.new
|
19
|
+
raise InvalidLineItemError, 'incorrect number of data points' unless data.size == 17
|
20
|
+
|
21
|
+
item.line_num = data[1].to_i
|
22
|
+
item.po_number = data[2]
|
23
|
+
item.qualifier = data[3]
|
24
|
+
item.ean = data[4]
|
25
|
+
item.description = data[5]
|
26
|
+
item.qty = data[6].to_i
|
27
|
+
item.unit_measure = data[7]
|
28
|
+
item.rrp = BigDecimal.new(data[8]) unless data[8].nil?
|
29
|
+
item.discount_percent = BigDecimal.new(data[9]) unless data[9].nil?
|
30
|
+
item.nett_unit_price = BigDecimal.new(data[10]) unless data[10].nil?
|
31
|
+
if data[11].eql?("Y")
|
32
|
+
item.gst_inclusive = true
|
33
|
+
else
|
34
|
+
item.gst_inclusive = false
|
35
|
+
end
|
36
|
+
item.value = BigDecimal.new(data[12]) unless data[12].nil?
|
37
|
+
item.discount_value = BigDecimal.new(data[13]) unless data[13].nil?
|
38
|
+
item.nett_value = BigDecimal.new(data[14]) unless data[14].nil?
|
39
|
+
item.gst = BigDecimal.new(data[15]) unless data[15].nil?
|
40
|
+
if data[16].eql?("F")
|
41
|
+
item.firm_sale = true
|
42
|
+
else
|
43
|
+
item.firm_sale = false
|
44
|
+
end
|
45
|
+
|
46
|
+
return item
|
47
|
+
end
|
48
|
+
|
49
|
+
# output a string that represents this line item that meets the vista spec
|
50
|
+
def to_s
|
51
|
+
msg = ""
|
52
|
+
msg << "D,"
|
53
|
+
msg << "#{line_num},"
|
54
|
+
msg << "#{po_number},"
|
55
|
+
msg << "#{qualifier},"
|
56
|
+
msg << "#{ean},"
|
57
|
+
msg << "#{description},"
|
58
|
+
msg << "#{qty},"
|
59
|
+
msg << "#{unit_measure},"
|
60
|
+
msg << sprintf("%.2f", rrp) unless rrp.nil?
|
61
|
+
msg << ","
|
62
|
+
msg << sprintf("%.2f", discount_percent) unless discount_percent.nil?
|
63
|
+
msg << ","
|
64
|
+
msg << sprintf("%.2f", nett_unit_price) unless nett_unit_price.nil?
|
65
|
+
msg << ","
|
66
|
+
if gst_inclusive
|
67
|
+
msg << "Y,"
|
68
|
+
else
|
69
|
+
msg << ","
|
70
|
+
end
|
71
|
+
msg << sprintf("%.2f", value) unless value.nil?
|
72
|
+
msg << ","
|
73
|
+
msg << sprintf("%.2f", discount_value) unless discount_value.nil?
|
74
|
+
msg << ","
|
75
|
+
msg << sprintf("%.2f", nett_value) unless nett_value.nil?
|
76
|
+
msg << ","
|
77
|
+
msg << sprintf("%.2f", gst) unless gst.nil?
|
78
|
+
msg << ","
|
79
|
+
if firm_sale
|
80
|
+
msg << "F"
|
81
|
+
end
|
82
|
+
|
83
|
+
return msg
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'fastercsv'
|
3
|
-
require File.dirname(__FILE__) + '/line_item'
|
4
|
-
require File.dirname(__FILE__) + '/errors'
|
5
3
|
|
6
4
|
module RVista
|
7
5
|
|
8
6
|
# Represents a single Vista message (purchase order).
|
9
|
-
class
|
7
|
+
class PO
|
10
8
|
|
11
9
|
attr_accessor :sender_id, :receiver_id, :internal_control_number, :po_number
|
12
10
|
attr_accessor :po_subset_code, :purpose_code, :purpose_desc, :date
|
@@ -78,7 +76,7 @@ module RVista
|
|
78
76
|
raise InvalidFileError, 'Missing header information' unless data[0][0].eql?("H")
|
79
77
|
raise InvalidFileError, 'Missing footer information' unless data[-1][0].eql?("S")
|
80
78
|
|
81
|
-
msg =
|
79
|
+
msg = self.new
|
82
80
|
|
83
81
|
# set message attributes
|
84
82
|
msg.sender_id = data[0][1]
|
@@ -104,7 +102,7 @@ module RVista
|
|
104
102
|
# load each lineitem into the message
|
105
103
|
data[1,data.size - 2].each do |row|
|
106
104
|
raise InvalidLineItemError, 'Invalid line detected' unless row[0].eql?("D")
|
107
|
-
item =
|
105
|
+
item = POLineItem.load_from_array(row)
|
108
106
|
msg.items << item
|
109
107
|
end
|
110
108
|
|
@@ -4,7 +4,7 @@ module RVista
|
|
4
4
|
|
5
5
|
# represents a single line on the purchase order. Has attributes like
|
6
6
|
# price, qty and description
|
7
|
-
class
|
7
|
+
class POLineItem
|
8
8
|
|
9
9
|
attr_accessor :line_num, :qualifier, :ean, :description
|
10
10
|
attr_accessor :qty, :nett_unit_price, :unit_measure
|
@@ -55,7 +55,7 @@ module RVista
|
|
55
55
|
if backorder == true
|
56
56
|
msg << "Y,"
|
57
57
|
else
|
58
|
-
"N,"
|
58
|
+
msg << "N,"
|
59
59
|
end
|
60
60
|
msg << "#{additional_discount},"
|
61
61
|
msg << "#{firm_sale}"
|
data/lib/rvista/poa.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'fastercsv'
|
3
|
+
|
4
|
+
module RVista
|
5
|
+
|
6
|
+
# Represents a single Vista Purchase Order Ack (POA).
|
7
|
+
class POA
|
8
|
+
|
9
|
+
attr_accessor :sender_id, :receiver_id, :po_number, :date
|
10
|
+
attr_accessor :supply_after, :supply_before, :delivery_location
|
11
|
+
attr_accessor :delivery_location_name
|
12
|
+
attr_accessor :items
|
13
|
+
|
14
|
+
# creates a new RVista::POA object
|
15
|
+
def initialize
|
16
|
+
@items = []
|
17
|
+
end
|
18
|
+
|
19
|
+
# reads a vista poa file into memory. input should be a string
|
20
|
+
# that specifies the file path
|
21
|
+
def self.load_from_file(input)
|
22
|
+
raise InvalidFileError, 'Invalid file' unless File.exist?(input)
|
23
|
+
data = FasterCSV.read(input)
|
24
|
+
return self.build_message(data)
|
25
|
+
end
|
26
|
+
|
27
|
+
# creates a RVista::POA object from a string. Input should
|
28
|
+
# be a complete vista file as a string
|
29
|
+
def self.load_from_string(input)
|
30
|
+
data = FasterCSV.parse(input)
|
31
|
+
return self.build_message(data)
|
32
|
+
end
|
33
|
+
|
34
|
+
# print a string representation of this order that meets the spec
|
35
|
+
def to_s
|
36
|
+
# message header
|
37
|
+
msg = ""
|
38
|
+
msg << "H,"
|
39
|
+
msg << "#{sender_id},"
|
40
|
+
msg << "#{receiver_id},"
|
41
|
+
msg << ","
|
42
|
+
msg << ","
|
43
|
+
msg << ","
|
44
|
+
msg << ","
|
45
|
+
msg << "#{po_number},"
|
46
|
+
msg << "#{date},"
|
47
|
+
msg << ","
|
48
|
+
msg << "#{supply_after},"
|
49
|
+
msg << "#{supply_before},"
|
50
|
+
msg << "SP,"
|
51
|
+
msg << "#{delivery_location},"
|
52
|
+
msg << "#{delivery_location_name}\n"
|
53
|
+
|
54
|
+
# message line items
|
55
|
+
@items.each { |item| msg << item.to_s << "\n"}
|
56
|
+
|
57
|
+
# message summary
|
58
|
+
msg << "S,#{@items.size.to_s},\n"
|
59
|
+
|
60
|
+
|
61
|
+
return msg
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def self.build_message(data)
|
67
|
+
raise InvalidFileError, 'File appears to be too short' unless data.size >= 3
|
68
|
+
raise InvalidFileError, 'Missing header information' unless data[0][0].eql?("H")
|
69
|
+
raise InvalidFileError, 'Missing footer information' unless data[-1][0].eql?("S")
|
70
|
+
|
71
|
+
msg = self.new
|
72
|
+
|
73
|
+
# set message attributes
|
74
|
+
msg.sender_id = data[0][1]
|
75
|
+
msg.receiver_id = data[0][2]
|
76
|
+
msg.po_number = data[0][7]
|
77
|
+
msg.date = data[0][8]
|
78
|
+
msg.supply_after = data[0][10]
|
79
|
+
msg.supply_before = data[0][11]
|
80
|
+
msg.delivery_location = data[0][13]
|
81
|
+
msg.delivery_location_name = data[0][14]
|
82
|
+
|
83
|
+
# load each lineitem into the message
|
84
|
+
data[1,data.size - 2].each do |row|
|
85
|
+
raise InvalidLineItemError, 'Invalid line detected' unless row[0].eql?("D")
|
86
|
+
item = POALineItem.load_from_array(row)
|
87
|
+
msg.items << item
|
88
|
+
end
|
89
|
+
|
90
|
+
raise InvalidFileError, 'Line item count doesn\'t match footer' unless data[-1][1].to_i.eql?(msg.items.size)
|
91
|
+
|
92
|
+
# return the results
|
93
|
+
return msg
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
|
3
|
+
module RVista
|
4
|
+
|
5
|
+
# represents a single line on the purchase order ack. Has attributes like
|
6
|
+
# price, qty and description
|
7
|
+
class POALineItem
|
8
|
+
|
9
|
+
attr_accessor :line_num, :ean, :description
|
10
|
+
attr_accessor :nett_unit_price, :qty_inners, :tax_rate
|
11
|
+
attr_accessor :buying_location, :buying_location_name, :delivered_qty
|
12
|
+
attr_accessor :status_code, :demand_qty, :rrp, :discount_percent
|
13
|
+
attr_accessor :availability_date, :text
|
14
|
+
|
15
|
+
# returns a new RVista::POALineItem object using the data passed in as an
|
16
|
+
# array. The array should have exactly 14 items in it. Refer to the Vista
|
17
|
+
# standard to see what those 14 items should be.
|
18
|
+
def self.load_from_array(data)
|
19
|
+
item = self.new
|
20
|
+
raise InvalidLineItemError, 'incorrect number of data points' unless data.size == 20
|
21
|
+
|
22
|
+
item.line_num = data[1].to_i
|
23
|
+
item.ean = data[2]
|
24
|
+
item.description = data[4]
|
25
|
+
item.nett_unit_price = BigDecimal.new(data[5]) unless data[5].nil?
|
26
|
+
item.qty_inners = data[7].to_i
|
27
|
+
item.tax_rate = BigDecimal.new(data[8]) unless data[8].nil?
|
28
|
+
item.buying_location = data[10]
|
29
|
+
item.buying_location_name = data[11]
|
30
|
+
item.delivered_qty = data[13].to_i
|
31
|
+
item.status_code = data[14]
|
32
|
+
item.demand_qty = data[15].to_i
|
33
|
+
item.rrp = BigDecimal.new(data[16]) unless data[16].nil?
|
34
|
+
item.discount_percent = BigDecimal.new(data[17]) unless data[17].nil?
|
35
|
+
item.availability_date = data[18] # TODO: convert this to a Date?
|
36
|
+
item.text = data[19]
|
37
|
+
|
38
|
+
return item
|
39
|
+
end
|
40
|
+
|
41
|
+
# output a string that represents this line item that meets the vista spec
|
42
|
+
def to_s
|
43
|
+
msg = ""
|
44
|
+
msg << "D,"
|
45
|
+
msg << "#{line_num},"
|
46
|
+
msg << "#{ean},"
|
47
|
+
msg << ","
|
48
|
+
msg << "#{description},"
|
49
|
+
msg << sprintf("%.2f", nett_unit_price) unless nett_unit_price.nil?
|
50
|
+
msg << ","
|
51
|
+
msg << "1,"
|
52
|
+
msg << "#{qty_inners},"
|
53
|
+
msg << sprintf("%.2f", tax_rate) unless tax_rate.nil?
|
54
|
+
msg << ","
|
55
|
+
msg << ","
|
56
|
+
msg << "#{buying_location},"
|
57
|
+
msg << "#{buying_location_name},"
|
58
|
+
msg << ","
|
59
|
+
msg << "#{delivered_qty},"
|
60
|
+
msg << "#{status_code},"
|
61
|
+
msg << "#{demand_qty},"
|
62
|
+
msg << sprintf("%.2f", rrp) unless rrp.nil?
|
63
|
+
msg << ","
|
64
|
+
msg << sprintf("%.2f", discount_percent) unless discount_percent.nil?
|
65
|
+
msg << ","
|
66
|
+
msg << "#{availability_date},"
|
67
|
+
msg << "#{text}"
|
68
|
+
return msg
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/rvista.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
|
2
|
-
require File.dirname(__FILE__) + '/rvista/message'
|
3
|
-
require File.dirname(__FILE__) + '/rvista/line_item'
|
4
2
|
require File.dirname(__FILE__) + '/rvista/errors'
|
3
|
+
require File.dirname(__FILE__) + '/rvista/invoice'
|
4
|
+
require File.dirname(__FILE__) + '/rvista/invoice_line_item'
|
5
|
+
require File.dirname(__FILE__) + '/rvista/po'
|
6
|
+
require File.dirname(__FILE__) + '/rvista/po_line_item'
|
7
|
+
require File.dirname(__FILE__) + '/rvista/poa'
|
8
|
+
require File.dirname(__FILE__) + '/rvista/poa_line_item'
|
5
9
|
|
6
10
|
# Ruby module for reading Vista HDS order files
|
7
11
|
#
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,4 @@
|
|
1
|
+
H,1111111,2222222,,,,,1234,060915,,071010,071030,SP,1111111,Some Store
|
2
|
+
D,1,0701180358,,DIGGING TO AMERICA,10.00,1,0,10.00,,1111111,Some Store,,1,01,1,11.00,40.00,20071015,
|
3
|
+
D,2,071267344X,,THE LAST ENEMY,15.00,1,0,10.00,,1111111,Some Store,,7,02,5,16.50,50.00,20071015,
|
4
|
+
S,2,
|
@@ -0,0 +1,71 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rvista'
|
5
|
+
require 'fastercsv'
|
6
|
+
|
7
|
+
class InvoiceLineItemTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@row = []
|
11
|
+
@row << "D"
|
12
|
+
@row << "1"
|
13
|
+
@row << "1234"
|
14
|
+
@row << "EN"
|
15
|
+
@row << "9781857230765"
|
16
|
+
@row << "Eye of the World"
|
17
|
+
@row << "5"
|
18
|
+
@row << "EA"
|
19
|
+
@row << "19.95"
|
20
|
+
@row << "40.00"
|
21
|
+
@row << "17.95"
|
22
|
+
@row << "Y"
|
23
|
+
@row << "89.75"
|
24
|
+
@row << "35.90"
|
25
|
+
@row << "53.85"
|
26
|
+
@row << "2.00"
|
27
|
+
@row << "F"
|
28
|
+
end
|
29
|
+
|
30
|
+
# ensure the load_from_array method works as expected
|
31
|
+
def test_load_from_array
|
32
|
+
item = RVista::InvoiceLineItem.load_from_array(@row)
|
33
|
+
assert_kind_of RVista::InvoiceLineItem, item
|
34
|
+
|
35
|
+
assert_equal item.line_num, 1
|
36
|
+
assert_equal item.po_number, "1234"
|
37
|
+
assert_equal item.qualifier, "EN"
|
38
|
+
assert_equal item.ean, "9781857230765"
|
39
|
+
assert_equal item.description, "Eye of the World"
|
40
|
+
assert_equal item.qty, 5
|
41
|
+
assert_equal item.unit_measure, "EA"
|
42
|
+
assert_equal item.rrp, 19.95
|
43
|
+
assert_equal item.discount_percent, 40.00
|
44
|
+
assert_equal item.nett_unit_price, 17.95
|
45
|
+
assert_equal item.gst_inclusive, true
|
46
|
+
assert_equal item.value, 89.75
|
47
|
+
assert_equal item.discount_value, 35.90
|
48
|
+
assert_equal item.nett_value, 53.85
|
49
|
+
assert_equal item.gst, 2.00
|
50
|
+
assert_equal item.firm_sale, true
|
51
|
+
end
|
52
|
+
|
53
|
+
# ensure the load_from_file method throws the correct exceptions
|
54
|
+
# when it encounters a problem
|
55
|
+
def test_product_validation
|
56
|
+
assert_raise(RVista::InvalidLineItemError) {
|
57
|
+
item = RVista::InvoiceLineItem.load_from_array(%w[D blah])
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_to_s
|
62
|
+
item = RVista::InvoiceLineItem.load_from_array(@row)
|
63
|
+
str = item.to_s
|
64
|
+
arr = FasterCSV.parse(str).first
|
65
|
+
|
66
|
+
assert_equal 17, arr.size
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rvista'
|
5
|
+
|
6
|
+
class InvoiceTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
VALID = File.dirname(__FILE__) + "/../data/invoice/valid.txt"
|
9
|
+
INVALID_MISSING_HEADER = File.dirname(__FILE__) + "/../data/invoice/invalid_missing_header.txt"
|
10
|
+
INVALID_MISSING_FOOTER = File.dirname(__FILE__) + "/../data/invoice/invalid_missing_footer.txt"
|
11
|
+
INVALID_LINE = File.dirname(__FILE__) + "/../data/invoice/invalid_line.txt"
|
12
|
+
INVALID_DOESNT_EXIST = File.dirname(__FILE__) + "/../data/blah.txt"
|
13
|
+
|
14
|
+
# ensure the load_from_file method works as expected
|
15
|
+
def test_load_from_file
|
16
|
+
msg = RVista::Invoice.load_from_file(VALID)
|
17
|
+
assert_kind_of RVista::Invoice, msg
|
18
|
+
assert_equal msg.items.size, 2
|
19
|
+
|
20
|
+
validate_msg(msg)
|
21
|
+
end
|
22
|
+
|
23
|
+
# ensure the load_from_file method works as expected
|
24
|
+
def test_load_from_string
|
25
|
+
msg = RVista::Invoice.load_from_string(File.read(VALID))
|
26
|
+
assert_kind_of RVista::Invoice, msg
|
27
|
+
assert_equal msg.items.size, 2
|
28
|
+
|
29
|
+
validate_msg(msg)
|
30
|
+
end
|
31
|
+
|
32
|
+
# ensure the load_from_file method throws the correct exceptions
|
33
|
+
# when it encounters a problem
|
34
|
+
def test_product_validation
|
35
|
+
|
36
|
+
assert_raise(RVista::InvalidFileError) {
|
37
|
+
msg = RVista::Invoice.load_from_file(INVALID_MISSING_HEADER)
|
38
|
+
}
|
39
|
+
|
40
|
+
assert_raise(RVista::InvalidFileError) {
|
41
|
+
msg = RVista::Invoice.load_from_file(INVALID_MISSING_FOOTER)
|
42
|
+
}
|
43
|
+
|
44
|
+
assert_raise(RVista::InvalidLineItemError) {
|
45
|
+
msg = RVista::Invoice.load_from_file(INVALID_LINE)
|
46
|
+
}
|
47
|
+
|
48
|
+
assert_raise(RVista::InvalidFileError) {
|
49
|
+
msg = RVista::Invoice.load_from_file(INVALID_DOESNT_EXIST)
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_to_s
|
54
|
+
msg = RVista::Invoice.load_from_file(VALID)
|
55
|
+
content = File.read(VALID)
|
56
|
+
assert_equal content, msg.to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
# ensures the properties of the supplied RVista::Invoice object
|
62
|
+
# match the properties specified in the VALID file
|
63
|
+
def validate_msg(msg)
|
64
|
+
assert_equal msg.sender_id, "1111111"
|
65
|
+
assert_equal msg.receiver_id, "2222222"
|
66
|
+
assert_equal msg.doc_type, "IN"
|
67
|
+
assert_equal msg.description, "Invoice"
|
68
|
+
assert_equal msg.doc_number, "5678"
|
69
|
+
assert_equal msg.doc_date, "071011"
|
70
|
+
assert_equal msg.delivery_location, "1111111"
|
71
|
+
assert_equal msg.currency, nil
|
72
|
+
end
|
73
|
+
end
|
data/test/unit/line_item_test.rb
CHANGED
@@ -2,8 +2,9 @@ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
|
2
2
|
|
3
3
|
require 'test/unit'
|
4
4
|
require 'rvista'
|
5
|
+
require 'fastercsv'
|
5
6
|
|
6
|
-
class
|
7
|
+
class POLineItemTest < Test::Unit::TestCase
|
7
8
|
|
8
9
|
def setup
|
9
10
|
@row = []
|
@@ -21,12 +22,28 @@ class LineItemTest < Test::Unit::TestCase
|
|
21
22
|
@row << "Y"
|
22
23
|
@row << nil
|
23
24
|
@row << nil
|
25
|
+
|
26
|
+
@row2 = []
|
27
|
+
@row2 << "D"
|
28
|
+
@row2 << "1"
|
29
|
+
@row2 << "IB"
|
30
|
+
@row2 << "0701180358"
|
31
|
+
@row2 << "DIGGING TO AMERICA"
|
32
|
+
@row2 << "3"
|
33
|
+
@row2 << "0.00"
|
34
|
+
@row2 << "EA"
|
35
|
+
@row2 << nil
|
36
|
+
@row2 << nil
|
37
|
+
@row2 << "43"
|
38
|
+
@row2 << "N"
|
39
|
+
@row2 << nil
|
40
|
+
@row2 << nil
|
24
41
|
end
|
25
42
|
|
26
43
|
# ensure the load_from_array method works as expected
|
27
44
|
def test_load_from_array
|
28
|
-
item = RVista::
|
29
|
-
assert_kind_of RVista::
|
45
|
+
item = RVista::POLineItem.load_from_array(@row)
|
46
|
+
assert_kind_of RVista::POLineItem, item
|
30
47
|
|
31
48
|
assert_equal item.line_num, 1
|
32
49
|
assert_equal item.qualifier, "IB"
|
@@ -48,11 +65,25 @@ class LineItemTest < Test::Unit::TestCase
|
|
48
65
|
def test_product_validation
|
49
66
|
|
50
67
|
assert_raise(RVista::InvalidLineItemError) {
|
51
|
-
item = RVista::
|
68
|
+
item = RVista::POLineItem.load_from_array(%w[D blah])
|
52
69
|
}
|
53
70
|
|
54
71
|
end
|
55
72
|
|
73
|
+
def test_to_s
|
74
|
+
item = RVista::POLineItem.load_from_array(@row)
|
75
|
+
str = item.to_s
|
76
|
+
arr = FasterCSV.parse(str).first
|
77
|
+
|
78
|
+
assert_equal 14, arr.size
|
79
|
+
|
80
|
+
item = RVista::POLineItem.load_from_array(@row2)
|
81
|
+
str = item.to_s
|
82
|
+
arr = FasterCSV.parse(str).first
|
83
|
+
|
84
|
+
assert_equal 14, arr.size
|
85
|
+
end
|
86
|
+
|
56
87
|
end
|
57
88
|
|
58
89
|
|
data/test/unit/message_test.rb
CHANGED
@@ -3,18 +3,18 @@ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
|
3
3
|
require 'test/unit'
|
4
4
|
require 'rvista'
|
5
5
|
|
6
|
-
class
|
6
|
+
class POTest < Test::Unit::TestCase
|
7
7
|
|
8
|
-
VALID = File.dirname(__FILE__) + "/../data/valid.txt"
|
9
|
-
INVALID_MISSING_HEADER = File.dirname(__FILE__) + "/../data/invalid_missing_header.txt"
|
10
|
-
INVALID_MISSING_FOOTER = File.dirname(__FILE__) + "/../data/invalid_missing_footer.txt"
|
11
|
-
INVALID_LINE = File.dirname(__FILE__) + "/../data/invalid_line.txt"
|
8
|
+
VALID = File.dirname(__FILE__) + "/../data/po/valid.txt"
|
9
|
+
INVALID_MISSING_HEADER = File.dirname(__FILE__) + "/../data/po/invalid_missing_header.txt"
|
10
|
+
INVALID_MISSING_FOOTER = File.dirname(__FILE__) + "/../data/po/invalid_missing_footer.txt"
|
11
|
+
INVALID_LINE = File.dirname(__FILE__) + "/../data/po/invalid_line.txt"
|
12
12
|
INVALID_DOESNT_EXIST = File.dirname(__FILE__) + "/../data/blah.txt"
|
13
13
|
|
14
14
|
# ensure the load_from_file method works as expected
|
15
15
|
def test_load_from_file
|
16
|
-
msg = RVista::
|
17
|
-
assert_kind_of RVista::
|
16
|
+
msg = RVista::PO.load_from_file(VALID)
|
17
|
+
assert_kind_of RVista::PO, msg
|
18
18
|
assert_equal msg.items.size, 38
|
19
19
|
|
20
20
|
validate_msg(msg)
|
@@ -23,8 +23,8 @@ class MessageTest < Test::Unit::TestCase
|
|
23
23
|
|
24
24
|
# ensure the load_from_file method works as expected
|
25
25
|
def test_load_from_string
|
26
|
-
msg = RVista::
|
27
|
-
assert_kind_of RVista::
|
26
|
+
msg = RVista::PO.load_from_string(File.read(VALID))
|
27
|
+
assert_kind_of RVista::PO, msg
|
28
28
|
assert_equal msg.items.size, 38
|
29
29
|
|
30
30
|
validate_msg(msg)
|
@@ -35,32 +35,32 @@ class MessageTest < Test::Unit::TestCase
|
|
35
35
|
def test_product_validation
|
36
36
|
|
37
37
|
assert_raise(RVista::InvalidFileError) {
|
38
|
-
msg = RVista::
|
38
|
+
msg = RVista::PO.load_from_file(INVALID_MISSING_HEADER)
|
39
39
|
}
|
40
40
|
|
41
41
|
assert_raise(RVista::InvalidFileError) {
|
42
|
-
msg = RVista::
|
42
|
+
msg = RVista::PO.load_from_file(INVALID_MISSING_FOOTER)
|
43
43
|
}
|
44
44
|
|
45
45
|
assert_raise(RVista::InvalidLineItemError) {
|
46
|
-
msg = RVista::
|
46
|
+
msg = RVista::PO.load_from_file(INVALID_LINE)
|
47
47
|
}
|
48
48
|
|
49
49
|
assert_raise(RVista::InvalidFileError) {
|
50
|
-
msg = RVista::
|
50
|
+
msg = RVista::PO.load_from_file(INVALID_DOESNT_EXIST)
|
51
51
|
}
|
52
52
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_to_s
|
56
|
-
msg = RVista::
|
56
|
+
msg = RVista::PO.load_from_file(VALID)
|
57
57
|
content = File.read(VALID)
|
58
58
|
assert_equal content, msg.to_s
|
59
59
|
end
|
60
60
|
|
61
61
|
private
|
62
62
|
|
63
|
-
# ensures the properties of the supplied RVista::
|
63
|
+
# ensures the properties of the supplied RVista::PO object
|
64
64
|
# match the properties specified in the VALID file
|
65
65
|
def validate_msg(msg)
|
66
66
|
assert_equal msg.sender_id, "1111111"
|
@@ -0,0 +1,75 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rvista'
|
5
|
+
require 'fastercsv'
|
6
|
+
|
7
|
+
class POALineItemTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@row = []
|
11
|
+
@row << "D"
|
12
|
+
@row << "1"
|
13
|
+
@row << "0701180358"
|
14
|
+
@row << nil
|
15
|
+
@row << "DIGGING TO AMERICA"
|
16
|
+
@row << "10.00"
|
17
|
+
@row << "1"
|
18
|
+
@row << "0"
|
19
|
+
@row << "10.00"
|
20
|
+
@row << nil
|
21
|
+
@row << "1111111"
|
22
|
+
@row << "Some Store"
|
23
|
+
@row << nil
|
24
|
+
@row << "1"
|
25
|
+
@row << "01"
|
26
|
+
@row << "1"
|
27
|
+
@row << "11.00"
|
28
|
+
@row << "40.00"
|
29
|
+
@row << "20071015"
|
30
|
+
@row << nil
|
31
|
+
end
|
32
|
+
|
33
|
+
# ensure the load_from_array method works as expected
|
34
|
+
def test_load_from_array
|
35
|
+
item = RVista::POALineItem.load_from_array(@row)
|
36
|
+
assert_kind_of RVista::POALineItem, item
|
37
|
+
|
38
|
+
assert_equal item.line_num, 1
|
39
|
+
assert_equal item.ean, "0701180358"
|
40
|
+
assert_equal item.description, "DIGGING TO AMERICA"
|
41
|
+
assert_equal item.nett_unit_price, 10.00
|
42
|
+
assert_equal item.qty_inners, 0
|
43
|
+
assert_equal item.tax_rate, 10.00
|
44
|
+
assert_equal item.buying_location, "1111111"
|
45
|
+
assert_equal item.buying_location_name, "Some Store"
|
46
|
+
assert_equal item.delivered_qty, 1
|
47
|
+
assert_equal item.status_code, "01"
|
48
|
+
assert_equal item.demand_qty, 1
|
49
|
+
assert_equal item.rrp, 11.00
|
50
|
+
assert_equal item.discount_percent, 40.00
|
51
|
+
assert_equal item.availability_date, "20071015"
|
52
|
+
assert_equal item.text, nil
|
53
|
+
end
|
54
|
+
|
55
|
+
# ensure the load_from_file method throws the correct exceptions
|
56
|
+
# when it encounters a problem
|
57
|
+
def test_product_validation
|
58
|
+
|
59
|
+
assert_raise(RVista::InvalidLineItemError) {
|
60
|
+
item = RVista::POALineItem.load_from_array(%w[D blah])
|
61
|
+
}
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_to_s
|
66
|
+
item = RVista::POALineItem.load_from_array(@row)
|
67
|
+
str = item.to_s
|
68
|
+
arr = FasterCSV.parse(str).first
|
69
|
+
|
70
|
+
assert_equal 20, arr.size
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
|
@@ -0,0 +1,78 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rvista'
|
5
|
+
|
6
|
+
class POATest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
VALID = File.dirname(__FILE__) + "/../data/poa/valid.txt"
|
9
|
+
INVALID_MISSING_HEADER = File.dirname(__FILE__) + "/../data/poa/invalid_missing_header.txt"
|
10
|
+
INVALID_MISSING_FOOTER = File.dirname(__FILE__) + "/../data/poa/invalid_missing_footer.txt"
|
11
|
+
INVALID_LINE = File.dirname(__FILE__) + "/../data/poa/invalid_line.txt"
|
12
|
+
INVALID_DOESNT_EXIST = File.dirname(__FILE__) + "/../data/blah.txt"
|
13
|
+
|
14
|
+
# ensure the load_from_file method works as expected
|
15
|
+
def test_load_from_file
|
16
|
+
msg = RVista::POA.load_from_file(VALID)
|
17
|
+
assert_kind_of RVista::POA, msg
|
18
|
+
assert_equal msg.items.size, 2
|
19
|
+
|
20
|
+
validate_msg(msg)
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# ensure the load_from_file method works as expected
|
25
|
+
def test_load_from_string
|
26
|
+
msg = RVista::POA.load_from_string(File.read(VALID))
|
27
|
+
assert_kind_of RVista::POA, msg
|
28
|
+
assert_equal msg.items.size, 2
|
29
|
+
|
30
|
+
validate_msg(msg)
|
31
|
+
end
|
32
|
+
|
33
|
+
# ensure the load_from_file method throws the correct exceptions
|
34
|
+
# when it encounters a problem
|
35
|
+
def test_product_validation
|
36
|
+
|
37
|
+
assert_raise(RVista::InvalidFileError) {
|
38
|
+
msg = RVista::POA.load_from_file(INVALID_MISSING_HEADER)
|
39
|
+
}
|
40
|
+
|
41
|
+
assert_raise(RVista::InvalidFileError) {
|
42
|
+
msg = RVista::POA.load_from_file(INVALID_MISSING_FOOTER)
|
43
|
+
}
|
44
|
+
|
45
|
+
assert_raise(RVista::InvalidLineItemError) {
|
46
|
+
msg = RVista::POA.load_from_file(INVALID_LINE)
|
47
|
+
}
|
48
|
+
|
49
|
+
assert_raise(RVista::InvalidFileError) {
|
50
|
+
msg = RVista::POA.load_from_file(INVALID_DOESNT_EXIST)
|
51
|
+
}
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_to_s
|
56
|
+
msg = RVista::POA.load_from_file(VALID)
|
57
|
+
content = File.read(VALID)
|
58
|
+
assert_equal content, msg.to_s
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
# ensures the properties of the supplied RVista::POA object
|
64
|
+
# match the properties specified in the VALID file
|
65
|
+
def validate_msg(msg)
|
66
|
+
assert_equal msg.sender_id, "1111111"
|
67
|
+
assert_equal msg.receiver_id, "2222222"
|
68
|
+
assert_equal msg.po_number, "1234"
|
69
|
+
assert_equal msg.date, "060915"
|
70
|
+
assert_equal msg.supply_after, "071010"
|
71
|
+
assert_equal msg.supply_before, "071030"
|
72
|
+
assert_equal msg.delivery_location, "1111111"
|
73
|
+
assert_equal msg.delivery_location_name, "Some Store"
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: rvista
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "0.
|
7
|
-
date:
|
6
|
+
version: "0.5"
|
7
|
+
date: 2007-10-11 00:00:00 +10:00
|
8
8
|
summary: A small library for reading Vista HDS order files
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,22 +25,45 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- James Healy
|
30
31
|
files:
|
32
|
+
- examples/test.rb
|
31
33
|
- lib/rvista
|
32
|
-
- lib/rvista.rb
|
33
34
|
- lib/rvista/errors.rb
|
34
|
-
- lib/rvista/
|
35
|
-
- lib/rvista/
|
35
|
+
- lib/rvista/poa.rb
|
36
|
+
- lib/rvista/po.rb
|
37
|
+
- lib/rvista/po_line_item.rb
|
38
|
+
- lib/rvista/poa_line_item.rb
|
39
|
+
- lib/rvista/invoice_line_item.rb
|
40
|
+
- lib/rvista/invoice.rb
|
41
|
+
- lib/rvista.rb
|
36
42
|
- test/unit
|
37
|
-
- test/data
|
38
43
|
- test/unit/message_test.rb
|
39
44
|
- test/unit/line_item_test.rb
|
40
|
-
- test/
|
41
|
-
- test/
|
42
|
-
- test/
|
43
|
-
- test/
|
45
|
+
- test/unit/poa_test.rb
|
46
|
+
- test/unit/poa_line_item_test.rb
|
47
|
+
- test/unit/invoice_line_item_test.rb
|
48
|
+
- test/unit/invoice_test.rb
|
49
|
+
- test/data
|
50
|
+
- test/data/poa
|
51
|
+
- test/data/poa/invalid_line.txt
|
52
|
+
- test/data/poa/valid.txt
|
53
|
+
- test/data/poa/invalid_missing_footer.txt
|
54
|
+
- test/data/poa/invalid_missing_header.txt
|
55
|
+
- test/data/invoice
|
56
|
+
- test/data/invoice/invalid_line.txt
|
57
|
+
- test/data/invoice/valid.txt
|
58
|
+
- test/data/invoice/invalid_missing_header.txt
|
59
|
+
- test/data/invoice/invalid_missing_footer.txt
|
60
|
+
- test/data/po
|
61
|
+
- test/data/po/invalid_line.txt
|
62
|
+
- test/data/po/invalid_missing_footer.txt
|
63
|
+
- test/data/po/invalid_missing_header.txt
|
64
|
+
- test/data/po/no_delivery_location.txt
|
65
|
+
- test/data/po/valid.txt
|
66
|
+
- test/data/po/seperate_delivery_location.txt
|
44
67
|
- Rakefile
|
45
68
|
- README
|
46
69
|
- COPYING
|
@@ -71,5 +94,5 @@ dependencies:
|
|
71
94
|
requirements:
|
72
95
|
- - ">="
|
73
96
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
97
|
+
version: 1.2.1
|
75
98
|
version:
|