rvista 0.2 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|