csv_pirate 3.3.2 → 3.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +8 -0
- data/README.rdoc +17 -9
- data/Rakefile +1 -1
- data/VERSION.yml +2 -2
- data/csv_pirate.gemspec +5 -5
- data/lib/csv_pirate.rb +63 -2
- data/lib/ninth_bit/pirate_ship.rb +4 -1
- metadata +3 -3
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
Version 3.4.1 2009-10-12
|
2
|
+
- :blackjack option :join is now working.
|
3
|
+
- Added warnings, and improved Readme
|
4
|
+
|
5
|
+
Version 3.4.0 2009-10-12
|
6
|
+
- Now the auto generated columns based on the booty array print nicely, with customization options
|
7
|
+
- You are now able to specify your own array of strings to use as the CSV header, in case you don't want to use the booty methods.
|
8
|
+
|
1
9
|
Version 3.3.2 2009-10-11
|
2
10
|
- You can now declare has_csv_pirate_ship in a model whose migration has not been run yet without making the app barf.
|
3
11
|
- Cleaned up Gem Dependency (faster_csv)
|
data/README.rdoc
CHANGED
@@ -9,7 +9,7 @@ My goal is to have it do EVERYTHING it possibly can for me, since almost every p
|
|
9
9
|
|
10
10
|
CsvPirate only works for commissions of swag OR grub!
|
11
11
|
|
12
|
-
Initialize method (a.k.a new()) takes a hash of
|
12
|
+
Initialize method (a.k.a new()) takes a hash of parameters:
|
13
13
|
|
14
14
|
# CsvPirate only works for commissions of swag OR grub!
|
15
15
|
# :swag the ARrr collection of swag to work on (optional)
|
@@ -28,9 +28,13 @@ Initialize method (a.k.a new()) takes a hash of params:
|
|
28
28
|
# :timestamp - each successive run will create a new file using a HHMMSS time stamp
|
29
29
|
# :none - no iterative file naming convention, just use waggoner and aft
|
30
30
|
# :mop can be :clean or :dirty (:overwrite or :append) (only has an effect if :swab is :none) since overwriting is irrelevant for a new file
|
31
|
-
# :clean - do not use :counter or :timestamp, and instead overwrite the file
|
32
|
-
# :dirty - do not use :counter, or :timestamp,
|
31
|
+
# :clean - do not use :swab above (:counter or :timestamp), and instead overwrite the file
|
32
|
+
# :dirty - do not use :swab above (:counter, or :timestamp), and do not overwrite. Just keep adding on.
|
33
33
|
# :bury_treasure should we store the csv data as it is collected in an array in Ruby form for later use (true), or just write the CSV (false)?
|
34
|
+
# :blackjack Specify how you want your CSV header
|
35
|
+
# {:join => '-'} joins the method names called to get hte data for that column with '_' underscores.
|
36
|
+
# {:humanize =>'-'} first joins as above, then humanizes the string
|
37
|
+
# {:array => ['col1',col2','col3'] Uses the column names provided. If the array's length is less than the booty array's length it reverts to :humanize =>'_'
|
34
38
|
# check the source to see if there anything else hiding in there!
|
35
39
|
|
36
40
|
The create method has the same parameters, and actually creates the CSV.
|
@@ -63,7 +67,7 @@ Gem Using Git building from source:
|
|
63
67
|
git clone git://github.com/pboling/csv_pirate.git
|
64
68
|
cd csv_pirate
|
65
69
|
gem build csv_pirate.gemspec
|
66
|
-
sudo gem install csv_pirate-3.
|
70
|
+
sudo gem install csv_pirate-3.4.1.gem # (Or whatever version gets built)
|
67
71
|
|
68
72
|
Then cd to your rails app to optionally freeze the gem into your app:
|
69
73
|
|
@@ -187,19 +191,23 @@ Assuming a Make (as in manufacturers of automobiles) model like this:
|
|
187
191
|
:mop => :clean # Symbol: If we DO end up writing to a preexisting file (by design or accident) should we overwrite (:clean) or append (:dirty)?
|
188
192
|
:shrouds => ',' # String: Delimiter for CSV. '\t' will create a tab delimited file (tsv), '|' will create a pipe delimited file.
|
189
193
|
:bury_treasure => true # Boolean: Should the array of objects in :swag be stored in the CsvPirate object for later inspection?
|
194
|
+
:blackjack => {:humanize => '-'} # Hash: Specify how you want your CSV header
|
195
|
+
# {:join => '-'} joins the method names called to get hte data for that column with '_' underscores.
|
196
|
+
# {:humanize => '-'} first joins as above, then humanizes the string
|
197
|
+
# {:array => ['col1',col2','col3'] Uses the column names provided in the array. If the array provided is too short defaults to :humanize =>'_'
|
190
198
|
|
191
199
|
# A customized version to create a tab delimited file for this class might look like this:
|
192
200
|
# has_csv_pirate_ship :spyglasses => [:factory_in_germany],
|
193
201
|
# :booty => [:id, :name],
|
194
202
|
# :shrouds => '\t'
|
195
|
-
# #
|
203
|
+
# # keeping the rest of the options at the default values, so they don't need to be defined.
|
196
204
|
end
|
197
205
|
|
198
206
|
To create a csv of the names and ids of makes with factories in germany and return the text of the export:
|
199
207
|
|
200
208
|
Make.walk_the_plank # Get it? HA! If you can't believe I wrote this whole thing JUST to be able to make jokes like that... check ma sources :)
|
201
209
|
|
202
|
-
The name of the csv that comes out will be (by
|
210
|
+
The name of the csv that comes out will be (by default located in log directory):
|
203
211
|
|
204
212
|
Make.20090930.export.13.csv
|
205
213
|
|
@@ -208,10 +216,10 @@ Where Make is the class, 20090930 is today's date, .export is the gibbet, and 13
|
|
208
216
|
All of those filename parts are customizable to a degree. For example if you want to have the date NOT be today's date you can supply your own date:
|
209
217
|
|
210
218
|
Make.walk_the_plank({:chronometer => Date.parse("December 21, 2012") })
|
211
|
-
#
|
219
|
+
# File name would be: Make.20121221.export.13.csv
|
212
220
|
|
213
221
|
Make.walk_the_plank({:chronometer => false })
|
214
|
-
#
|
222
|
+
# File name would be: Make.export.13.csv
|
215
223
|
|
216
224
|
What if you want the file name to be always the same and to always append to the end of it?
|
217
225
|
#Example: I want the file to be named "data", with no extension, both of the following accomplish that:
|
@@ -364,7 +372,7 @@ Then check the output from the console:
|
|
364
372
|
|
365
373
|
a.weigh_anchor
|
366
374
|
|
367
|
-
|
375
|
+
Id,Name,Year,Make name,Tires size width inches
|
368
376
|
1,Cavalier,1999,Chevrolet,13
|
369
377
|
2,Trailblazer,2006,Chevrolet,13
|
370
378
|
3,Corvette,2010,Chevrolet,13
|
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ It works better if you are wearing a tricorne!}
|
|
10
10
|
gemspec.email = "peter.boling@gmail.com"
|
11
11
|
gemspec.homepage = "http://github.com/pboling/csv_pirate"
|
12
12
|
gemspec.authors = ["Peter Boling"]
|
13
|
-
gemspec.add_dependency '
|
13
|
+
gemspec.add_dependency 'fastercsv'
|
14
14
|
gemspec.files = ["README.rdoc",
|
15
15
|
"csv_pirate.gemspec",
|
16
16
|
"init.rb",
|
data/VERSION.yml
CHANGED
data/csv_pirate.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{csv_pirate}
|
8
|
-
s.version = "3.
|
8
|
+
s.version = "3.4.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Peter Boling"]
|
12
|
-
s.date = %q{2009-10-
|
12
|
+
s.date = %q{2009-10-13}
|
13
13
|
s.description = %q{CsvPirate is the easy way to create a CSV of essentially anything in Rails, in full pirate regalia.
|
14
14
|
It works better if you are wearing a tricorne!}
|
15
15
|
s.email = %q{peter.boling@gmail.com}
|
@@ -45,11 +45,11 @@ It works better if you are wearing a tricorne!}
|
|
45
45
|
s.specification_version = 3
|
46
46
|
|
47
47
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
48
|
-
s.add_runtime_dependency(%q<
|
48
|
+
s.add_runtime_dependency(%q<fastercsv>, [">= 0"])
|
49
49
|
else
|
50
|
-
s.add_dependency(%q<
|
50
|
+
s.add_dependency(%q<fastercsv>, [">= 0"])
|
51
51
|
end
|
52
52
|
else
|
53
|
-
s.add_dependency(%q<
|
53
|
+
s.add_dependency(%q<fastercsv>, [">= 0"])
|
54
54
|
end
|
55
55
|
end
|
data/lib/csv_pirate.rb
CHANGED
@@ -47,6 +47,10 @@ class CsvPirate
|
|
47
47
|
attr_accessor :swabbie # value of the counter / timestamp
|
48
48
|
attr_accessor :maroon # text of csv
|
49
49
|
attr_accessor :nocturnal # basename of the filepath (i.e. filename)
|
50
|
+
attr_accessor :blackjack # Hash: Specify how you want your CSV header
|
51
|
+
# {:join => '-'} joins the method names called to get hte data for that column with '_' underscores.
|
52
|
+
# {:humanize => '-'} first joins as above, then humanizes the string
|
53
|
+
# {:array => ['col1',col2','col3'] Uses the column names provided in the array. If the array provided is too short defaults to :humanize =>'_'
|
50
54
|
|
51
55
|
cattr_accessor :parlay # verbosity on a scale of 0 - 3 (0=:none, 1=:error, 2=:info, 3=:debug, 0 being no screen output, 1 is default
|
52
56
|
|
@@ -70,6 +74,10 @@ class CsvPirate
|
|
70
74
|
# :clean - do not use :counter or :timestamp, and instead overwrite the file
|
71
75
|
# :dirty - do not use :counter, or :timestamp, or :overwrite. Just keep adding on.
|
72
76
|
# :bury_treasure should we store the csv data as it is collected in an array in Ruby form for later use (true), or just write the CSV (false)?
|
77
|
+
# :blackjack Specify how you want your CSV header
|
78
|
+
# {:join => '-'} joins the method names called to get hte data for that column with '_' underscores.
|
79
|
+
# {:humanize =>'-'} first joins as above, then humanizes the string
|
80
|
+
# {:array => ['col1',col2','col3'] Uses the column names provided. If the array provided is too short defaults to :humanize =>'_'
|
73
81
|
# See README for examples
|
74
82
|
|
75
83
|
def initialize(*args)
|
@@ -113,6 +121,15 @@ class CsvPirate
|
|
113
121
|
@bury_treasure = args.first[:astrolabe] || false
|
114
122
|
@buried_treasure = []
|
115
123
|
|
124
|
+
#Default is different than default for has_csv_pirate because this might gem wants to be clean for use outside rails, and humanize may not always be defined for String class
|
125
|
+
@blackjack = args.first[:blackjack] || {:join => '_'}
|
126
|
+
|
127
|
+
#Make sure the header array is the same length as the booty columns
|
128
|
+
if self.blackjack.keys.first == :array && (self.blackjack.values.first.length != self.booty.length)
|
129
|
+
@blackjack = {:join => '_'}
|
130
|
+
puts "Warning: :blackjack reset to {:join => '_'} because the length of the :booty is different than the length of the array provided to :blackjack" if CsvPirate.parlance(2)
|
131
|
+
end
|
132
|
+
|
116
133
|
# Initialize doesn't write anything to a CSV,
|
117
134
|
# but does create the traverse_board and opens the waggoner for reading / writing
|
118
135
|
self.northwest_passage unless self.astrolabe
|
@@ -144,6 +161,7 @@ class CsvPirate
|
|
144
161
|
:spyglasses => args.first[:spyglasses],
|
145
162
|
:booty => args.first[:booty],
|
146
163
|
:astrolabe => args.first[:astrolabe],
|
164
|
+
:blackjack => args.first[:blackjack],
|
147
165
|
:bury_treasure => args.first[:bury_treasure]
|
148
166
|
})
|
149
167
|
csv_pirate.hoist_mainstay()
|
@@ -225,8 +243,7 @@ class CsvPirate
|
|
225
243
|
end
|
226
244
|
|
227
245
|
def sounding(csv)
|
228
|
-
|
229
|
-
csv << self.booty
|
246
|
+
csv << self.block_and_tackle
|
230
247
|
# create the data for the csv
|
231
248
|
self.dig_for_treasure do |treasure|
|
232
249
|
moidore = treasure.map {|x| "#{x}"}
|
@@ -235,6 +252,50 @@ class CsvPirate
|
|
235
252
|
end
|
236
253
|
end
|
237
254
|
|
255
|
+
# create the header of the CSV (column/method names)
|
256
|
+
# returns an array of strings for CSV header based on blackjack
|
257
|
+
def block_and_tackle
|
258
|
+
self.blackjack.map do |k,v|
|
259
|
+
case k
|
260
|
+
#Joining is only relevant when the booty contains a nested hash of method calls as at least one of the booty array elements
|
261
|
+
#Use the booty (methods) as the column headers
|
262
|
+
when :join then self.binnacle(v, false)
|
263
|
+
#Use the humanized booty (methods) as the column headers
|
264
|
+
when :humanize then self.binnacle(v, true)
|
265
|
+
when :array then v
|
266
|
+
end
|
267
|
+
end.first
|
268
|
+
end
|
269
|
+
|
270
|
+
#returns an array of strings for CSV header based on booty
|
271
|
+
def binnacle(join_value, humanize = true)
|
272
|
+
self.booty.map do |compass|
|
273
|
+
string = compass.is_a?(Hash) ?
|
274
|
+
self.run_through(compass, join_value) :
|
275
|
+
compass.is_a?(String) ?
|
276
|
+
compass :
|
277
|
+
compass.is_a?(Symbol) ?
|
278
|
+
compass.to_s :
|
279
|
+
compass.to_s
|
280
|
+
humanize ? string.humanize : string
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
#Takes a potentially nested hash element of a booty array and turns it into a string for a column header
|
285
|
+
# hash = {:a => {:b => {:c => {:d => {"e" => "fghi"}}}}}
|
286
|
+
# run_through(hash, '_')
|
287
|
+
# => "a_b_c_d_e_fghi"
|
288
|
+
# Ooooh so recursive!
|
289
|
+
def run_through(hash, join_value)
|
290
|
+
hash.map do |k,v|
|
291
|
+
if v.is_a?(Hash)
|
292
|
+
[k,run_through(v, join_value)].join(join_value)
|
293
|
+
else #works for Symbols and Strings
|
294
|
+
[k,v].join(join_value)
|
295
|
+
end
|
296
|
+
end.first
|
297
|
+
end
|
298
|
+
|
238
299
|
#complete file path
|
239
300
|
def poop_deck
|
240
301
|
"#{self.analemma}#{self.swabbie}#{self.aft}"
|
@@ -25,6 +25,7 @@ module NinthBit
|
|
25
25
|
# Have to protect against model definitions pre-migration, since column names will fail if
|
26
26
|
options[:booty] ||= check_booty ? self.column_names : []
|
27
27
|
options[:bury_treasure] ||= true
|
28
|
+
options[:blackjack] ||= {:humanize => '_'}
|
28
29
|
options[:parlay] ||= 1
|
29
30
|
|
30
31
|
# if they provide both
|
@@ -38,6 +39,7 @@ module NinthBit
|
|
38
39
|
raise ArgumentError, ":booty is #{options[:booty].inspect}, and must be an array of methods to call on a class for CSV data" if check_booty && (options[:booty].nil? || !options[:booty].is_a?(Array) || options[:booty].empty?)
|
39
40
|
raise ArgumentError, ":chart is #{options[:chart].inspect}, and must be an array of directory names, which will become the filepath for the csv file" if options[:chart].nil? || !options[:chart].is_a?(Array) || options[:chart].empty?
|
40
41
|
raise ArgumentError, ":shrouds is #{options[:shrouds].inspect}, and must be a string (e.g. ',' or '\t'), which will be used as the delimeter for the csv file" if options[:shrouds].nil? || !options[:shrouds].is_a?(String)
|
42
|
+
raise ArgumentError, ":blackjack is #{options[:blackjack].inspect}, and must be a hash (e.g. {:humanize => '_'}), which defines how the header of the CSV will be created" if options[:blackjack].nil? || !options[:blackjack].is_a?(Hash)
|
41
43
|
|
42
44
|
extend ClassMethods unless (class << self; included_modules; end).include?(ClassMethods)
|
43
45
|
|
@@ -54,7 +56,7 @@ module NinthBit
|
|
54
56
|
|
55
57
|
# intended for use with send_data for downloading the text of the csv:
|
56
58
|
# send_data Make.say_your_last_words
|
57
|
-
# TODO: Fix
|
59
|
+
# TODO: Fix say_your_last_words so it works! Use send_data args for real
|
58
60
|
#def say_your_last_words(charset = 'utf-8', args = {})
|
59
61
|
# csv_pirate = self.blindfold(args)
|
60
62
|
# return [ csv_pirate.maroon,
|
@@ -109,6 +111,7 @@ module NinthBit
|
|
109
111
|
:grub => args[:grub] || self.piratey_options[:grub],
|
110
112
|
:spyglasses => args[:spyglasses] || self.piratey_options[:spyglasses],
|
111
113
|
:booty => args[:booty] || self.piratey_options[:booty],
|
114
|
+
:blackjack => args[:blackjack] || self.piratey_options[:blackjack],
|
112
115
|
:bury_treasure => args[:bury_treasure] || self.piratey_options[:bury_treasure] }
|
113
116
|
end
|
114
117
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv_pirate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Boling
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-13 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: fastercsv
|
17
17
|
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|