loady 0.0.1
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/.gitignore +8 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +18 -0
- data/README.rdoc +41 -0
- data/Rakefile +11 -0
- data/lib/loady.rb +1 -0
- data/lib/loady/csv_loader.rb +60 -0
- data/lib/loady/version.rb +3 -0
- data/loady.gemspec +24 -0
- data/test/csv/file1.csv +11 -0
- data/test/csv/file2.csv +15 -0
- data/test/test_csv_loader.rb +38 -0
- data/test/test_helper.rb +4 -0
- metadata +105 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
= Loady - A CSV file loader with simple logging
|
2
|
+
|
3
|
+
Loady is a simple file reader and logger. Use it to quickly load a csv file, continue on error rows, and do basic logging.
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
gem install loady
|
8
|
+
|
9
|
+
Use bunder. Include the gem in your Gemfile:
|
10
|
+
|
11
|
+
gem 'loady'
|
12
|
+
|
13
|
+
== Use
|
14
|
+
|
15
|
+
If any error occurs, Loady will continue reading the file, ignoring problems rows and logging a warning for each.
|
16
|
+
|
17
|
+
By default, messages are logged to the standard output.
|
18
|
+
|
19
|
+
Basic usage:
|
20
|
+
|
21
|
+
Loady::CsvLoader.read "/your/file.csv" do |row|
|
22
|
+
puts "#{row[0]},#{row[1]},etc."
|
23
|
+
end
|
24
|
+
|
25
|
+
Skip first row and log to a file:
|
26
|
+
|
27
|
+
logger = Logger.new("/your/file.log")
|
28
|
+
|
29
|
+
Loady::CsvLoader.read "/your/file.csv", :logger => logger, :skip_first_row => true do |row|
|
30
|
+
# do some stuff
|
31
|
+
end
|
32
|
+
|
33
|
+
== Development
|
34
|
+
|
35
|
+
Fork away. Please create a topic branch and write passing tests if you are submitting a pull request.
|
36
|
+
|
37
|
+
git clone git://github.com/[yourfork]/loady.git
|
38
|
+
cd loady
|
39
|
+
bundle install
|
40
|
+
rake test
|
41
|
+
git checkout -b your_fix
|
data/Rakefile
ADDED
data/lib/loady.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'loady/csv_loader.rb'
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'csv'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
module Loady
|
5
|
+
class CsvLoader
|
6
|
+
|
7
|
+
# options:
|
8
|
+
# :skip_first_row => true -- default = false
|
9
|
+
# :logger => Logger.new('/somewhere/file.log') -- default = Logger.new(STDOUT)
|
10
|
+
def self.read(filename, options = {})
|
11
|
+
success = 0
|
12
|
+
warning = 0
|
13
|
+
|
14
|
+
logger = options[:logger]
|
15
|
+
|
16
|
+
unless logger
|
17
|
+
logger = Logger.new(STDOUT)
|
18
|
+
logger.datetime_format = "%H:%M:%S"
|
19
|
+
end
|
20
|
+
|
21
|
+
begin
|
22
|
+
f = File.new(filename)
|
23
|
+
f.readline if options[:skip_first_row]
|
24
|
+
|
25
|
+
line_number = 0
|
26
|
+
|
27
|
+
begin
|
28
|
+
while (line = f.readline)
|
29
|
+
begin
|
30
|
+
line_number += 1
|
31
|
+
|
32
|
+
row = CSV.parse(line)[0]
|
33
|
+
|
34
|
+
unless row.empty?
|
35
|
+
yield row
|
36
|
+
|
37
|
+
success += 1
|
38
|
+
end
|
39
|
+
rescue Exception => message
|
40
|
+
warning += 1
|
41
|
+
logger.warn "#{message.to_s.gsub("line 1", "line #{line_number}")}\n#{line}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
rescue EOFError
|
45
|
+
f.close
|
46
|
+
rescue Exception => message
|
47
|
+
warning += 1
|
48
|
+
line_number += 1
|
49
|
+
logger.error "#{message.to_s + " - at line #{line_number}"}\n#{line}"
|
50
|
+
end
|
51
|
+
|
52
|
+
logger.info "Finished. Loaded #{success} rows. #{warning} unprocessed rows."
|
53
|
+
|
54
|
+
rescue Exception => message
|
55
|
+
logger.fatal "Unhandled error: \n#{message}\n"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
data/loady.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "loady/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "loady"
|
7
|
+
s.version = Loady::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Tee Parham"]
|
10
|
+
s.email = ["tee@stackpilot.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{CSV file loader with simple logging}
|
13
|
+
s.description = %q{CSV file loader with simple logging}
|
14
|
+
|
15
|
+
s.rubyforge_project = "loady"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_development_dependency "test-unit"
|
23
|
+
s.add_development_dependency "shoulda"
|
24
|
+
end
|
data/test/csv/file1.csv
ADDED
data/test/csv/file2.csv
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
"Bubbles","2000"
|
2
|
+
"Grape Ape",1975
|
3
|
+
Albert,1948,note: everything is read as a string whether it is quoted or not
|
4
|
+
Koko,1971
|
5
|
+
Curious George,1941
|
6
|
+
blah.......
|
7
|
+
",,,,,,,,,,,,,,,,,,,,this is a bad row because of the quote
|
8
|
+
",,,,,,,,,,,",,,/"\",,,,,,this is a bad row too
|
9
|
+
|
10
|
+
" blank rows are skipped, this is bad though
|
11
|
+
|
12
|
+
Bear,1980,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"this is ok"
|
13
|
+
Mighty Joe Young,1998
|
14
|
+
Donkey Kong,1981
|
15
|
+
King Kong,1933
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.expand_path('test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class CsvLoaderTest < Test::Unit::TestCase
|
4
|
+
context "Simple class" do
|
5
|
+
setup do
|
6
|
+
end
|
7
|
+
|
8
|
+
should "read file1" do
|
9
|
+
monkeys = []
|
10
|
+
|
11
|
+
Loady::CsvLoader.read "test/csv/file1.csv", :skip_first_row => true do |row|
|
12
|
+
monkeys << { :name => row[0], :year => row[1] }
|
13
|
+
end
|
14
|
+
|
15
|
+
assert monkeys.count == 10, "total rows read"
|
16
|
+
assert monkeys[0][:name] == "Bubbles", "first row name"
|
17
|
+
assert monkeys[0][:year] == "2000", "first row year"
|
18
|
+
assert monkeys[9][:name] == "King Kong", "last row name"
|
19
|
+
assert monkeys[9][:year] == "1933", "last row year"
|
20
|
+
end
|
21
|
+
|
22
|
+
should "read file2" do
|
23
|
+
logger = Logger.new("/dev/null")
|
24
|
+
monkeys = []
|
25
|
+
|
26
|
+
Loady::CsvLoader.read "test/csv/file2.csv", :logger => logger do |row|
|
27
|
+
monkeys << { :name => row[0], :year => row[1] }
|
28
|
+
end
|
29
|
+
|
30
|
+
assert monkeys.count == 10, "total rows read"
|
31
|
+
assert monkeys[0][:name] == "Bubbles", "first row name"
|
32
|
+
assert monkeys[0][:year] == "2000", "first row year"
|
33
|
+
assert monkeys[9][:name] == "King Kong", "last row name"
|
34
|
+
assert monkeys[9][:year] == "1933", "last row year"
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: loady
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Tee Parham
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-13 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: test-unit
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :development
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: shoulda
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :development
|
45
|
+
version_requirements: *id002
|
46
|
+
description: CSV file loader with simple logging
|
47
|
+
email:
|
48
|
+
- tee@stackpilot.com
|
49
|
+
executables: []
|
50
|
+
|
51
|
+
extensions: []
|
52
|
+
|
53
|
+
extra_rdoc_files: []
|
54
|
+
|
55
|
+
files:
|
56
|
+
- .gitignore
|
57
|
+
- Gemfile
|
58
|
+
- Gemfile.lock
|
59
|
+
- README.rdoc
|
60
|
+
- Rakefile
|
61
|
+
- lib/loady.rb
|
62
|
+
- lib/loady/csv_loader.rb
|
63
|
+
- lib/loady/version.rb
|
64
|
+
- loady.gemspec
|
65
|
+
- test/csv/file1.csv
|
66
|
+
- test/csv/file2.csv
|
67
|
+
- test/test_csv_loader.rb
|
68
|
+
- test/test_helper.rb
|
69
|
+
has_rdoc: true
|
70
|
+
homepage: ""
|
71
|
+
licenses: []
|
72
|
+
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
version: "0"
|
94
|
+
requirements: []
|
95
|
+
|
96
|
+
rubyforge_project: loady
|
97
|
+
rubygems_version: 1.3.7
|
98
|
+
signing_key:
|
99
|
+
specification_version: 3
|
100
|
+
summary: CSV file loader with simple logging
|
101
|
+
test_files:
|
102
|
+
- test/csv/file1.csv
|
103
|
+
- test/csv/file2.csv
|
104
|
+
- test/test_csv_loader.rb
|
105
|
+
- test/test_helper.rb
|