csv_pirate 3.3.2 → 3.4.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/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
|