csv_madness 0.0.4 → 0.0.9
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 +7 -0
- data/CHANGELOG.markdown +21 -3
- data/Gemfile +9 -7
- data/README.rdoc +136 -95
- data/Rakefile +79 -60
- data/VERSION +1 -1
- data/lib/csv_madness/builder.rb +100 -0
- data/lib/csv_madness/data_accessor_module.rb +59 -24
- data/lib/csv_madness/exceptions.rb +16 -0
- data/lib/csv_madness/gem_api.rb +12 -0
- data/lib/csv_madness/record.rb +41 -2
- data/lib/csv_madness/sheet.rb +101 -292
- data/lib/csv_madness/sheet_methods/base.rb +6 -0
- data/lib/csv_madness/sheet_methods/class_methods.rb +77 -0
- data/lib/csv_madness/sheet_methods/column_methods.rb +187 -0
- data/lib/csv_madness/sheet_methods/file_methods.rb +41 -0
- data/lib/csv_madness/sheet_methods/indexing.rb +52 -0
- data/lib/csv_madness/sheet_methods/record_methods.rb +99 -0
- data/lib/csv_madness.rb +3 -13
- data/test/csv/forbidden_column.csv +2 -0
- data/test/csv/splitter.csv +11 -0
- data/test/csv/test_column_types.csv +3 -0
- data/test/csv/with_nils.csv +5 -0
- data/test/helper.rb +31 -19
- data/test/test_builder.rb +37 -0
- data/test/test_csv_madness.rb +8 -10
- data/test/test_merging_columns.rb +40 -0
- data/test/test_reloading_spreadsheet.rb +31 -0
- data/test/test_sheet.rb +117 -8
- metadata +52 -93
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
|
|
3
|
+
class TestMergingColumns < MadTestCase
|
|
4
|
+
context "with a simple spreadsheet loaded" do
|
|
5
|
+
setup do
|
|
6
|
+
set_spreadsheet_paths
|
|
7
|
+
load_simple_spreadsheet
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
teardown do
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "merge :age column into :born column, and drop :born column" do
|
|
15
|
+
@simple.merge_columns( :age, :born )
|
|
16
|
+
assert @simple.columns.include?( :born )
|
|
17
|
+
assert !@simple.columns.include?( :age )
|
|
18
|
+
|
|
19
|
+
load_mary
|
|
20
|
+
assert_equal "27", @mary.born
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "merge :age column into :born column, and keep :born column" do
|
|
24
|
+
@simple.merge_columns( :age, :born, :drop_source => false )
|
|
25
|
+
assert @simple.columns.include?( :born )
|
|
26
|
+
assert @simple.columns.include?( :age )
|
|
27
|
+
|
|
28
|
+
load_mary
|
|
29
|
+
assert_equal "27", @mary.born
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
should "concatanate first and last names" do
|
|
33
|
+
@simple.concatenate( :fname, :lname, :separator => " " )
|
|
34
|
+
@simple.rename_column( :fname, :full_name )
|
|
35
|
+
|
|
36
|
+
load_darwin
|
|
37
|
+
assert_equal "Charles Darwin", @darwin.full_name
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
|
|
3
|
+
class TestCsvMadness < MadTestCase
|
|
4
|
+
context "with a simple spreadsheet loaded" do
|
|
5
|
+
setup do
|
|
6
|
+
set_spreadsheet_paths
|
|
7
|
+
load_simple_spreadsheet
|
|
8
|
+
set_person_records
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
should "reset spreadsheet by reloading from file" do
|
|
12
|
+
assert @mary.respond_to?(:lname)
|
|
13
|
+
assert @darwin.respond_to?(:fname)
|
|
14
|
+
assert @mary.born.is_a?(String)
|
|
15
|
+
|
|
16
|
+
debugger
|
|
17
|
+
muck_up_spreadsheet
|
|
18
|
+
set_person_records
|
|
19
|
+
|
|
20
|
+
assert !@mary.respond_to?(:lname)
|
|
21
|
+
assert !@darwin.respond_to?(:fname)
|
|
22
|
+
assert @mary.born.is_a?(Float)
|
|
23
|
+
|
|
24
|
+
@simple.reload_spreadsheet
|
|
25
|
+
set_person_records
|
|
26
|
+
|
|
27
|
+
assert @mary.respond_to?(:lname)
|
|
28
|
+
assert @darwin.respond_to?(:fname)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/test/test_sheet.rb
CHANGED
|
@@ -1,24 +1,133 @@
|
|
|
1
1
|
require 'helper'
|
|
2
2
|
|
|
3
|
-
class
|
|
3
|
+
class TestSheet < MadTestCase
|
|
4
4
|
context "testing getter_name()" do
|
|
5
5
|
should "return proper function names" do
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
test_data = [
|
|
7
|
+
[" heLLo __ world ", :hello_world],
|
|
8
|
+
["0 heLLo __ worlD!!! ", :_0_hello_world],
|
|
9
|
+
["9ess 🐙 bsv++=", :_9ess_bsv ]
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
for input, expected in test_data
|
|
13
|
+
assert_equal expected, CsvMadness::Sheet.getter_name( input )
|
|
14
|
+
end
|
|
8
15
|
end
|
|
9
16
|
end
|
|
10
17
|
|
|
11
18
|
context "testing default spreadsheet paths" do
|
|
12
|
-
should "
|
|
13
|
-
|
|
19
|
+
should "raise error if a path does not exist" do
|
|
20
|
+
assert_raises( RuntimeError ) do
|
|
14
21
|
CsvMadness::Sheet.add_search_path( CsvMadness.root.join("rocaganthor") )
|
|
15
22
|
end
|
|
16
23
|
end
|
|
17
24
|
|
|
18
25
|
should "check a search path for files to load" do
|
|
19
|
-
|
|
20
|
-
sheet
|
|
21
|
-
|
|
26
|
+
load_sheet( "with_nils.csv" )
|
|
27
|
+
assert @sheet.is_a?( CsvMadness::Sheet )
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "testing column_types" do
|
|
32
|
+
should "gracefully handle empty strings for all column_types" do
|
|
33
|
+
load_sheet("test_column_types.csv")
|
|
34
|
+
|
|
35
|
+
for type, ignore_proc in CsvMadness::Sheet::COLUMN_TYPES
|
|
36
|
+
@sheet.set_column_type( type, type )
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
record = @sheet.records[0]
|
|
40
|
+
|
|
41
|
+
assert_kind_of String, record.date
|
|
42
|
+
assert_equal nil, record.number
|
|
43
|
+
assert_equal nil, record.float
|
|
44
|
+
|
|
45
|
+
record = @sheet.records[1]
|
|
46
|
+
assert_equal "12", record.id
|
|
47
|
+
assert_equal 134.2, record.number
|
|
48
|
+
assert_equal 100, record.integer
|
|
49
|
+
assert_equal Time.parse("2013-01-13"), record.date
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "testing add/remove records" do
|
|
54
|
+
setup do
|
|
55
|
+
load_sheet( "simple.csv", :index => :id )
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
should "add record" do
|
|
59
|
+
count = @sheet.records.length
|
|
60
|
+
@sheet.add_record( @sheet.records.first.to_hash )
|
|
61
|
+
assert_equal count + 1, @sheet.records.length
|
|
62
|
+
|
|
63
|
+
for method in [:id, :fname, :lname, :age, :born]
|
|
64
|
+
assert_equal @sheet.records.first.send(method), @sheet.records.last.send(method)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "test remove_record" do
|
|
69
|
+
count = @sheet.records.length
|
|
70
|
+
record = @sheet.records.last
|
|
71
|
+
record_id = record.id
|
|
72
|
+
|
|
73
|
+
assert @sheet.fetch(:id, record_id) != nil
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@sheet.remove_record( record )
|
|
77
|
+
assert_equal (count - 1), @sheet.records.length
|
|
78
|
+
assert @sheet.fetch(:id, record_id) == nil
|
|
79
|
+
|
|
80
|
+
count = @sheet.records.length
|
|
81
|
+
record = @sheet.records[0]
|
|
82
|
+
record_id = record.id
|
|
83
|
+
|
|
84
|
+
@sheet.remove_record( 0 )
|
|
85
|
+
assert_nil @sheet.fetch(:id, record_id)
|
|
86
|
+
assert_equal (count - 1), @sheet.records.length
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context "testing blanking and splitting of spreadsheet" do
|
|
91
|
+
should "deliver me a properly blanked spreadsheet (simple)" do
|
|
92
|
+
sheet = CsvMadness.load( "splitter.csv" )
|
|
93
|
+
blank_sheet = sheet.blanked
|
|
94
|
+
|
|
95
|
+
sheet.length.times do |i|
|
|
96
|
+
blank_sheet.add_record( sheet.remove_record( 0 ) )
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
assert_zero sheet.length
|
|
100
|
+
assert_equal 10, blank_sheet.length
|
|
101
|
+
assert_nil blank_sheet.spreadsheet_file
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
should "deliver me a properly blanked spreadsheet (index)" do
|
|
105
|
+
load_sheet( "splitter.csv", :index => [:id] )
|
|
106
|
+
blank_sheet = @sheet.blanked
|
|
107
|
+
|
|
108
|
+
assert_zero blank_sheet.length
|
|
109
|
+
assert_includes blank_sheet.index_columns, :id
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
should "split splitter" do
|
|
113
|
+
load_sheet( "splitter.csv", :index => [:id, :party] )
|
|
114
|
+
|
|
115
|
+
sheets = @sheet.split(&:party)
|
|
116
|
+
|
|
117
|
+
for party in %w(D I R)
|
|
118
|
+
assert_equal_length sheets[party], @sheet.records.select{|r| r.party == party }
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
assert_includes sheets["D"].index_columns, :id
|
|
122
|
+
assert_includes sheets["I"].index_columns, :party
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context "testing hilarious spreadsheet fails" do
|
|
127
|
+
should "raise error on forbidden column name" do
|
|
128
|
+
assert_raises( CsvMadness::ForbiddenColumnNameError ) do
|
|
129
|
+
CsvMadness.load( "forbidden_column.csv" )
|
|
130
|
+
end
|
|
22
131
|
end
|
|
23
132
|
end
|
|
24
133
|
end
|
metadata
CHANGED
|
@@ -1,110 +1,60 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: csv_madness
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 0.0.9
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Bryce Anderson
|
|
9
|
-
autorequire:
|
|
10
8
|
bindir: bin
|
|
11
9
|
cert_chain: []
|
|
12
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
13
11
|
dependencies:
|
|
14
12
|
- !ruby/object:Gem::Dependency
|
|
15
|
-
name:
|
|
13
|
+
name: csv
|
|
16
14
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
15
|
requirements:
|
|
19
|
-
- -
|
|
16
|
+
- - ">="
|
|
20
17
|
- !ruby/object:Gem::Version
|
|
21
18
|
version: '0'
|
|
22
19
|
type: :runtime
|
|
23
20
|
prerelease: false
|
|
24
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
22
|
requirements:
|
|
27
|
-
- -
|
|
23
|
+
- - ">="
|
|
28
24
|
- !ruby/object:Gem::Version
|
|
29
25
|
version: '0'
|
|
30
26
|
- !ruby/object:Gem::Dependency
|
|
31
|
-
name:
|
|
27
|
+
name: fun_with_gems
|
|
32
28
|
requirement: !ruby/object:Gem::Requirement
|
|
33
|
-
none: false
|
|
34
29
|
requirements:
|
|
35
|
-
- -
|
|
30
|
+
- - "~>"
|
|
36
31
|
- !ruby/object:Gem::Version
|
|
37
|
-
version: '0'
|
|
38
|
-
|
|
39
|
-
prerelease: false
|
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
-
none: false
|
|
42
|
-
requirements:
|
|
43
|
-
- - ! '>='
|
|
44
|
-
- !ruby/object:Gem::Version
|
|
45
|
-
version: '0'
|
|
46
|
-
- !ruby/object:Gem::Dependency
|
|
47
|
-
name: rdoc
|
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
|
49
|
-
none: false
|
|
50
|
-
requirements:
|
|
51
|
-
- - ~>
|
|
52
|
-
- !ruby/object:Gem::Version
|
|
53
|
-
version: '3.12'
|
|
54
|
-
type: :development
|
|
55
|
-
prerelease: false
|
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
-
none: false
|
|
58
|
-
requirements:
|
|
59
|
-
- - ~>
|
|
32
|
+
version: '0.0'
|
|
33
|
+
- - ">="
|
|
60
34
|
- !ruby/object:Gem::Version
|
|
61
|
-
version:
|
|
62
|
-
|
|
63
|
-
name: bundler
|
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
|
65
|
-
none: false
|
|
66
|
-
requirements:
|
|
67
|
-
- - ~>
|
|
68
|
-
- !ruby/object:Gem::Version
|
|
69
|
-
version: 1.3.0
|
|
70
|
-
type: :development
|
|
35
|
+
version: 0.0.7
|
|
36
|
+
type: :runtime
|
|
71
37
|
prerelease: false
|
|
72
38
|
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
-
none: false
|
|
74
|
-
requirements:
|
|
75
|
-
- - ~>
|
|
76
|
-
- !ruby/object:Gem::Version
|
|
77
|
-
version: 1.3.0
|
|
78
|
-
- !ruby/object:Gem::Dependency
|
|
79
|
-
name: jeweler
|
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
|
81
|
-
none: false
|
|
82
39
|
requirements:
|
|
83
|
-
- - ~>
|
|
40
|
+
- - "~>"
|
|
84
41
|
- !ruby/object:Gem::Version
|
|
85
|
-
version:
|
|
86
|
-
|
|
87
|
-
prerelease: false
|
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
-
none: false
|
|
90
|
-
requirements:
|
|
91
|
-
- - ~>
|
|
42
|
+
version: '0.0'
|
|
43
|
+
- - ">="
|
|
92
44
|
- !ruby/object:Gem::Version
|
|
93
|
-
version:
|
|
45
|
+
version: 0.0.7
|
|
94
46
|
- !ruby/object:Gem::Dependency
|
|
95
|
-
name:
|
|
47
|
+
name: fun_with_testing
|
|
96
48
|
requirement: !ruby/object:Gem::Requirement
|
|
97
|
-
none: false
|
|
98
49
|
requirements:
|
|
99
|
-
- -
|
|
50
|
+
- - ">="
|
|
100
51
|
- !ruby/object:Gem::Version
|
|
101
52
|
version: '0'
|
|
102
53
|
type: :development
|
|
103
54
|
prerelease: false
|
|
104
55
|
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
-
none: false
|
|
106
56
|
requirements:
|
|
107
|
-
- -
|
|
57
|
+
- - ">="
|
|
108
58
|
- !ruby/object:Gem::Version
|
|
109
59
|
version: '0'
|
|
110
60
|
description: CSV Madness removes what little pain is left from Ruby's CSV class. Load
|
|
@@ -113,50 +63,59 @@ email: keeputahweird@gmail.com
|
|
|
113
63
|
executables: []
|
|
114
64
|
extensions: []
|
|
115
65
|
extra_rdoc_files:
|
|
66
|
+
- CHANGELOG.markdown
|
|
116
67
|
- LICENSE.txt
|
|
117
68
|
- README.rdoc
|
|
118
69
|
files:
|
|
119
|
-
- ./
|
|
120
|
-
- ./
|
|
121
|
-
- ./
|
|
122
|
-
- ./
|
|
123
|
-
- ./
|
|
124
|
-
- ./lib/csv_madness.rb
|
|
125
|
-
- ./lib/csv_madness/
|
|
126
|
-
- ./lib/csv_madness/
|
|
127
|
-
- ./lib/csv_madness/
|
|
128
|
-
- ./
|
|
129
|
-
- ./
|
|
130
|
-
- ./
|
|
131
|
-
- ./
|
|
70
|
+
- "./lib/csv_madness.rb"
|
|
71
|
+
- "./lib/csv_madness/builder.rb"
|
|
72
|
+
- "./lib/csv_madness/data_accessor_module.rb"
|
|
73
|
+
- "./lib/csv_madness/exceptions.rb"
|
|
74
|
+
- "./lib/csv_madness/gem_api.rb"
|
|
75
|
+
- "./lib/csv_madness/record.rb"
|
|
76
|
+
- "./lib/csv_madness/sheet.rb"
|
|
77
|
+
- "./lib/csv_madness/sheet_methods/base.rb"
|
|
78
|
+
- "./lib/csv_madness/sheet_methods/class_methods.rb"
|
|
79
|
+
- "./lib/csv_madness/sheet_methods/column_methods.rb"
|
|
80
|
+
- "./lib/csv_madness/sheet_methods/file_methods.rb"
|
|
81
|
+
- "./lib/csv_madness/sheet_methods/indexing.rb"
|
|
82
|
+
- "./lib/csv_madness/sheet_methods/record_methods.rb"
|
|
83
|
+
- "./test/csv/forbidden_column.csv"
|
|
84
|
+
- "./test/csv/simple.csv"
|
|
85
|
+
- "./test/csv/splitter.csv"
|
|
86
|
+
- "./test/csv/test_column_types.csv"
|
|
87
|
+
- "./test/csv/with_nils.csv"
|
|
88
|
+
- "./test/helper.rb"
|
|
89
|
+
- "./test/test_builder.rb"
|
|
90
|
+
- "./test/test_csv_madness.rb"
|
|
91
|
+
- "./test/test_merging_columns.rb"
|
|
92
|
+
- "./test/test_reloading_spreadsheet.rb"
|
|
93
|
+
- "./test/test_sheet.rb"
|
|
94
|
+
- CHANGELOG.markdown
|
|
95
|
+
- Gemfile
|
|
132
96
|
- LICENSE.txt
|
|
133
97
|
- README.rdoc
|
|
98
|
+
- Rakefile
|
|
99
|
+
- VERSION
|
|
134
100
|
homepage: http://github.com/darthschmoo/csv_madness
|
|
135
101
|
licenses:
|
|
136
102
|
- MIT
|
|
137
|
-
|
|
103
|
+
metadata: {}
|
|
138
104
|
rdoc_options: []
|
|
139
105
|
require_paths:
|
|
140
106
|
- lib
|
|
141
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
142
|
-
none: false
|
|
143
108
|
requirements:
|
|
144
|
-
- -
|
|
109
|
+
- - ">="
|
|
145
110
|
- !ruby/object:Gem::Version
|
|
146
111
|
version: '0'
|
|
147
|
-
segments:
|
|
148
|
-
- 0
|
|
149
|
-
hash: 1185350757253474800
|
|
150
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
|
-
none: false
|
|
152
113
|
requirements:
|
|
153
|
-
- -
|
|
114
|
+
- - ">="
|
|
154
115
|
- !ruby/object:Gem::Version
|
|
155
116
|
version: '0'
|
|
156
117
|
requirements: []
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
signing_key:
|
|
160
|
-
specification_version: 3
|
|
118
|
+
rubygems_version: 4.0.14
|
|
119
|
+
specification_version: 4
|
|
161
120
|
summary: CSV Madness turns your CSV rows into happycrazy objects.
|
|
162
121
|
test_files: []
|