movable_erb 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -16,6 +16,10 @@ rescue LoadError
16
16
  puts "Jeweler not available. Install it with: sudo gem install jeweler"
17
17
  end
18
18
 
19
+ require 'spec/rake/spectask'
20
+ Spec::Rake::SpecTask.new(:spec) do |spec|
21
+ spec.libs << 'lib' << 'spec'
22
+ spec.spec_files = FileList['spec/**/*_spec.rb']
23
+ end
19
24
 
20
- Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
21
-
25
+ task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.5
1
+ 0.2.6
data/lib/movable_erb.rb CHANGED
@@ -39,20 +39,28 @@ end
39
39
  ##
40
40
  # Loads a CSV document into an array of hashes
41
41
  class MovableErb::CSV
42
- require 'fastercsv'
42
+ if RUBY_VERSION =~ /1.9/
43
+ require 'csv'
44
+ CSV_PARSER = ::CSV
45
+ else
46
+ require 'fastercsv'
47
+ CSV_PARSER = FasterCSV
48
+ end
43
49
 
44
50
  attr_accessor :filename, :hashes
51
+ attr_reader :headers
45
52
 
46
53
  ##
47
54
  # Initializes and yields a new instance
48
55
  # @yield [csv] a new instance of {MovableErb::CSV}
49
56
  # @return [MovableErb::CSV]
50
57
  def self.setup(&block)
58
+ raise "no block given" unless block_given?
51
59
  csv = self.new
52
60
  yield csv
53
61
  csv.parse!
54
62
  end
55
-
63
+
56
64
  ##
57
65
  # Internally calls {#to_hashes}, but returns self
58
66
  # @see to_hashes
@@ -61,24 +69,32 @@ class MovableErb::CSV
61
69
  @hashes = self.to_hashes
62
70
  self
63
71
  end
64
-
72
+
65
73
  ##
66
74
  # Reads the CSV file into an array of hashes
67
75
  # @return [Array] an Array of Hashes
68
76
  def to_hashes
69
- array_of_arrays = FasterCSV.read(filename)
70
- headers = array_of_arrays.shift
71
- headers.each { |h| h.downcase! && h.gsub!(/\s/,"_") } if headers
72
- hashes = Array.new(array_of_arrays.length) { Hash.new }
73
- array_of_arrays.each_with_index do |row,i|
74
- headers.each_with_index do |header, j|
75
- unless row[j].nil?
76
- hashes[i][header] = [] if hashes[i][header].nil?
77
- hashes[i][header] << row[j]
78
- end
79
- end
77
+ raw_arrays = CSV_PARSER.read(filename)
78
+ extract_headers!(raw_arrays)
79
+ raw_arrays.map {|row| to_hash(row) }
80
+ end
81
+
82
+ protected
83
+
84
+ def extract_headers!(array)
85
+ first_row = array.shift
86
+ first_row.each { |h| h.downcase! && h.gsub!(/\s/,"_") } if first_row
87
+ @headers = first_row
88
+ end
89
+
90
+ def to_hash(cells)
91
+ hash = Hash.new
92
+ headers.each_with_index do |column_name, column_index|
93
+ next unless cells[column_index]
94
+ hash[column_name] ||= []
95
+ hash[column_name] << cells[column_index]
80
96
  end
81
- hashes
97
+ hash
82
98
  end
83
99
  end
84
100
 
@@ -88,14 +104,14 @@ class MovableErb::Erb
88
104
  require 'erb'
89
105
 
90
106
  attr_accessor :template, :parsed_string, :data
91
-
107
+
92
108
  ##
93
109
  # Creates a new instance and allow manipulation of it via block.
94
- #
110
+ #
95
111
  # This can be used to initialize and parse quickly.
96
112
  #
97
113
  # @yield [erb] a new instance of {MovableErb::Erb}
98
- #
114
+ #
99
115
  # @example Create a new instance, setup and build the template
100
116
  # @erb = MovableErb::Erb.setup do |erb|
101
117
  # erb.data = {'hash' => 'of', 'meaningful' => 'values'}
@@ -104,6 +120,7 @@ class MovableErb::Erb
104
120
  # end
105
121
  # @return [MovableErb::Erb]
106
122
  def self.setup
123
+ raise "no block given" unless block_given?
107
124
  erb = self.new
108
125
  yield erb
109
126
  erb
data/movable_erb.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # Generated by jeweler
2
- # DO NOT EDIT THIS FILE
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{movable_erb}
8
- s.version = "0.2.5"
8
+ s.version = "0.2.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joshua Davey"]
12
- s.date = %q{2009-10-17}
12
+ s.date = %q{2009-12-20}
13
13
  s.default_executable = %q{movable_erb}
14
14
  s.description = %q{A General-purpose CSV to ERB template formatter. Useful for converting legacy CSV data to an importable blog format.}
15
15
  s.email = %q{josh@joshuadavey.com}
@@ -66,3 +66,4 @@ Gem::Specification.new do |s|
66
66
  s.add_dependency(%q<fastercsv>, [">= 1.5.0"])
67
67
  end
68
68
  end
69
+
data/spec/csv_spec.rb CHANGED
@@ -3,6 +3,13 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
3
  TEMPLATE_FIXTURE = File.expand_path(File.dirname(__FILE__) + '/fixtures/template.erb')
4
4
  CSV_FIXTURE = File.expand_path(File.dirname(__FILE__) + '/fixtures/example.csv')
5
5
 
6
+
7
+ if RUBY_VERSION =~ /1.9/
8
+ CSV_PARSER = ::CSV
9
+ else
10
+ CSV_PARSER = FasterCSV
11
+ end
12
+
6
13
  describe MovableErb do
7
14
  it "should have a CSV instance" do
8
15
  m = MovableErb.new
@@ -120,7 +127,7 @@ describe MovableErb::CSV do
120
127
  context "shortcut setup class method" do
121
128
  before(:each) do
122
129
  MovableErb::CSV.any_instance.stubs(:filename).returns("fake")
123
- FasterCSV.stubs(:read).returns([])
130
+ CSV_PARSER.stubs(:read).returns([])
124
131
  end
125
132
 
126
133
  it "should create a new instance" do
@@ -153,7 +160,7 @@ describe MovableErb::CSV do
153
160
 
154
161
  describe "parsing" do
155
162
  before(:each) do
156
- FasterCSV.stubs(:read).returns([["row1"], ["row2"]])
163
+ CSV_PARSER.stubs(:read).returns([["row1"], ["row2"]])
157
164
  @csv = MovableErb::CSV.new
158
165
  @csv.filename = "test.csv"
159
166
  end
@@ -169,7 +176,7 @@ describe MovableErb::CSV do
169
176
 
170
177
  context "#to_hashes" do
171
178
  it "should read from file" do
172
- FasterCSV.expects(:read).with("test.csv").returns([[]])
179
+ CSV_PARSER.expects(:read).with("test.csv").returns([[]])
173
180
  @csv.to_hashes
174
181
  end
175
182
 
@@ -178,17 +185,17 @@ describe MovableErb::CSV do
178
185
  end
179
186
 
180
187
  it "should downcase the header row" do
181
- FasterCSV.stubs(:read).returns([["Name"],["Billy Bob"]])
188
+ CSV_PARSER.stubs(:read).returns([["Name"],["Billy Bob"]])
182
189
  @csv.to_hashes.should == [{'name' => ['Billy Bob']}]
183
190
  end
184
191
 
185
192
  it "should convert the header row to snake_case" do
186
- FasterCSV.stubs(:read).returns([["Extended Body"],["Billy Bob"]])
193
+ CSV_PARSER.stubs(:read).returns([["Extended Body"],["Billy Bob"]])
187
194
  @csv.to_hashes.should == [{'extended_body' => ['Billy Bob']}]
188
195
  end
189
196
 
190
197
  it "should return an array of hashes (3 rows, 3 columns)" do
191
- FasterCSV.stubs(:read).returns([["Name", "Phone", "Email"],
198
+ CSV_PARSER.stubs(:read).returns([["Name", "Phone", "Email"],
192
199
  ["John", "773-123-1234", "john@example.com"],
193
200
  ["Abigail", nil, "abby@example.com"],
194
201
  ["Casius", nil, nil]])
@@ -200,12 +207,12 @@ describe MovableErb::CSV do
200
207
  end
201
208
 
202
209
  it "should collect values with the same key" do
203
- FasterCSV.stubs(:read).returns([["Name", "Name", "Email"], ["John", "James", "john@example.com"]])
210
+ CSV_PARSER.stubs(:read).returns([["Name", "Name", "Email"], ["John", "James", "john@example.com"]])
204
211
  @csv.to_hashes.should == [{'name' => ['John', 'James'],'email' => ['john@example.com']}]
205
212
  end
206
213
 
207
214
  it "should collect values with the same key (more than 2)" do
208
- FasterCSV.stubs(:read).returns([["Name", "Name", "Name"], ["John", "James", "Jill"]])
215
+ CSV_PARSER.stubs(:read).returns([["Name", "Name", "Name"], ["John", "James", "Jill"]])
209
216
  @csv.to_hashes.should == [{'name' => ['John', 'James', 'Jill']}]
210
217
  end
211
218
  end
@@ -278,7 +285,7 @@ describe MovableErb::Erb do
278
285
 
279
286
  it "should parse a template with data given" do
280
287
  @erb.template = TEMPLATE_FIXTURE
281
- @erb.data = {'name' => 'Johnny', 'email' => 'john@example.com'}
288
+ @erb.data = {'name' => ['Johnny'], 'email' => ['john@example.com']}
282
289
  @erb.build!
283
290
  @erb.parsed_string.should == <<-ERB.gsub(/^\s+/,'')
284
291
  Name: Johnny
@@ -1,4 +1,4 @@
1
- Name: <%= data['name'] %>
1
+ Name: <%= data['name'].join(" ") %>
2
2
  <% if data['email'] %>
3
- Email: <%= data['email'] %>
3
+ Email: <%= data['email'].join(" ") %>
4
4
  <% end %>
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,13 @@
1
1
  require 'rubygems'
2
2
 
3
+ if RUBY_VERSION =~ /1.9/
4
+ require 'csv'
5
+ $csv_library = ::CSV
6
+ else
7
+ require 'fastercsv'
8
+ $csv_library = FasterCSV
9
+ end
10
+
3
11
  require File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib movable_erb]))
4
12
 
5
13
  Spec::Runner.configure do |config|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: movable_erb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Davey
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-17 00:00:00 -05:00
12
+ date: 2009-12-20 00:00:00 -06:00
13
13
  default_executable: movable_erb
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency