garden 0.0.13.pre → 0.0.14.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/garden.gemspec +0 -1
- data/lib/garden.rb +5 -3
- data/lib/garden/mediators.rb +6 -7
- data/lib/garden/spreadsheets.rb +65 -28
- data/lib/garden/version.rb +1 -1
- metadata +4 -4
data/garden.gemspec
CHANGED
data/lib/garden.rb
CHANGED
@@ -22,12 +22,14 @@ module Garden
|
|
22
22
|
# end
|
23
23
|
|
24
24
|
def self.excel file_name_or_path, options=nil
|
25
|
-
filepath =
|
25
|
+
filepath = File.exists?(file_name_or_path) ? file_name_or_path : File.join(Rails.root, "db/seeds/#{file_name_or_path}.xls")
|
26
26
|
Spreadsheets::Excel.new filepath, options
|
27
27
|
end
|
28
28
|
|
29
|
-
def self.
|
30
|
-
File.exists?(
|
29
|
+
def self.csv file_name_or_path, options=nil
|
30
|
+
filepath = File.exists?(file_name_or_path) ? file_name_or_path : File.join(Rails.root, "db/seeds/#{file_name_or_path}.csv")
|
31
|
+
Spreadsheets::CSV.new filepath, options
|
31
32
|
end
|
32
33
|
|
34
|
+
|
33
35
|
end
|
data/lib/garden/mediators.rb
CHANGED
@@ -47,7 +47,7 @@ module Garden
|
|
47
47
|
# puts " ** Could not derive ActiveRecord model from the provided name: #{namish}. Exception: #{e.message}"
|
48
48
|
# end
|
49
49
|
|
50
|
-
@instance = @clazz.new
|
50
|
+
# @instance = @clazz.new
|
51
51
|
|
52
52
|
end
|
53
53
|
|
@@ -55,10 +55,10 @@ module Garden
|
|
55
55
|
@clazz != nil
|
56
56
|
end
|
57
57
|
|
58
|
-
def parse_headers array
|
59
|
-
|
60
|
-
|
61
|
-
end
|
58
|
+
# def parse_headers array
|
59
|
+
# # @headers = array.map { |header| header.to_s.parameterize.underscore }
|
60
|
+
# @headers = array.map { |header| header.to_s.strip.gsub(/ /, '-').underscore }
|
61
|
+
# end
|
62
62
|
|
63
63
|
def reference_by col_name
|
64
64
|
@instance_options[:reference] = col_name
|
@@ -68,11 +68,10 @@ module Garden
|
|
68
68
|
# @relationships
|
69
69
|
# end
|
70
70
|
#
|
71
|
-
def
|
71
|
+
def row attributes
|
72
72
|
Instance.new @clazz, attributes, @instance_options.dup
|
73
73
|
end
|
74
74
|
|
75
|
-
|
76
75
|
def class_exists?(name)
|
77
76
|
begin
|
78
77
|
true if Kernel.const_get(name)
|
data/lib/garden/spreadsheets.rb
CHANGED
@@ -1,58 +1,60 @@
|
|
1
1
|
require 'spreadsheet'
|
2
|
+
require 'csv'
|
2
3
|
|
3
4
|
module Garden
|
4
5
|
module Spreadsheets
|
5
|
-
class Excel
|
6
6
|
|
7
|
+
class AbstractSpreadsheet
|
7
8
|
def initialize filepath, options={}
|
8
9
|
options ||= {}
|
9
|
-
|
10
10
|
@options = options.reverse_merge! :some_option => "nevermind"
|
11
|
-
|
12
11
|
open filepath
|
13
12
|
end
|
14
13
|
|
14
|
+
def open(filepath)
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_mediator name
|
18
|
+
@mediator = Mediators::Table.new name
|
19
|
+
raise "Invalid mediator for table #{name}" unless @mediator.valid?
|
20
|
+
@mediator.reference_by(@options[:reference]) if @options.has_key?(:reference)
|
21
|
+
@mediator
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class Excel < AbstractSpreadsheet
|
27
|
+
|
15
28
|
def open filepath
|
16
|
-
message = "Planting spreadsheet: #{filepath}"
|
29
|
+
message = "Planting excel spreadsheet: #{filepath}"
|
17
30
|
message += " (only these worksheets: #{@options[:only].to_s})" if @options[:only]
|
18
31
|
message += " (worksheet #{@options[:worksheet].to_s})" if @options[:worksheet]
|
19
32
|
puts message
|
33
|
+
|
34
|
+
excel_spreadsheet = ::Spreadsheet.open filepath
|
20
35
|
|
21
|
-
|
22
|
-
worksheet_names = @options[:only] || @options[:worksheet] || @ss.worksheets.collect { |table| table.name }
|
36
|
+
worksheet_names = @options[:only] || @options[:worksheet] || excel_spreadsheet.worksheets.collect { |table| table.name }
|
23
37
|
worksheet_names = [worksheet_names] unless worksheet_names.is_a?(Enumerable)
|
24
38
|
|
25
39
|
# Import the worksheets
|
26
40
|
worksheet_names.each do |name|
|
27
41
|
puts "Parsing table #{name}"
|
28
|
-
|
42
|
+
table = excel_spreadsheet.worksheets.find { |table| table.name == name.to_s }
|
43
|
+
parse_worksheet table.name, table.to_a
|
29
44
|
end
|
30
45
|
|
31
46
|
end
|
32
|
-
|
33
|
-
def parse_table table
|
34
|
-
# The table object passed in is a Spreadsheet::Worksheet instance.
|
35
|
-
|
36
|
-
table_mediator = Mediators::Table.new table.name
|
37
|
-
if !table_mediator.valid?
|
38
|
-
return
|
39
|
-
end
|
40
47
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
# Now loop the table rows, inserting records.
|
50
|
-
table.each do |row|
|
51
|
-
next if row.idx == 0
|
52
|
-
table_mediator.create_instance parse_worksheet_row(headers, row)
|
48
|
+
def parse_worksheet name, rows
|
49
|
+
build_mediator name
|
50
|
+
# Expects the first row to be the headers.
|
51
|
+
headers = rows.shift.map { |header| header.to_s.strip.gsub(/ /, '-').underscore }
|
52
|
+
rows.each do |row|
|
53
|
+
attributes = parse_worksheet_row(headers, row)
|
54
|
+
@mediator.row attributes
|
53
55
|
end
|
54
56
|
end
|
55
|
-
|
57
|
+
|
56
58
|
def parse_worksheet_row keys, values
|
57
59
|
h = {}
|
58
60
|
keys.each_index do |index|
|
@@ -61,6 +63,41 @@ module Garden
|
|
61
63
|
end
|
62
64
|
h
|
63
65
|
end
|
66
|
+
|
64
67
|
end
|
68
|
+
|
69
|
+
class CSV < AbstractSpreadsheet
|
70
|
+
def open filepath
|
71
|
+
file = File.open filepath
|
72
|
+
begin
|
73
|
+
rows = ::CSV.parse(file, :headers => true)
|
74
|
+
rescue Exception => e
|
75
|
+
rows = []
|
76
|
+
end
|
77
|
+
|
78
|
+
# Build the mediator. Assume the table name is the same as the file's name passed in or the :table option
|
79
|
+
table_name = @options.delete(:table) || File.basename(filepath, File.extname(filepath))
|
80
|
+
message = "Planting csv spreadsheet: #{filepath}"
|
81
|
+
message << " (into table #{table_name})"
|
82
|
+
puts message
|
83
|
+
build_mediator table_name
|
84
|
+
|
85
|
+
rows.each do |row|
|
86
|
+
attributes = row_to_attributes(row)
|
87
|
+
@mediator.row attributes
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def row_to_attributes row
|
92
|
+
h = {}
|
93
|
+
row.each do |ary|
|
94
|
+
key = ary.first.to_sym
|
95
|
+
h[key] = ary.last
|
96
|
+
end
|
97
|
+
h
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
65
102
|
end
|
66
103
|
end
|
data/lib/garden/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garden
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14.pre
|
5
5
|
prerelease: 7
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-11-11 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: spreadsheet
|
16
|
-
requirement: &
|
16
|
+
requirement: &70302264679260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70302264679260
|
25
25
|
description: ! 'Allows you to organize your seeds in different formats. Typical seeds.rb,
|
26
26
|
yaml fixtures, and a variety of spreadsheet formats. '
|
27
27
|
email:
|