garden 0.0.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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.markdown +5 -0
- data/Rakefile +1 -0
- data/garden.gemspec +23 -0
- data/lib/garden.rb +30 -0
- data/lib/garden/mediators.rb +107 -0
- data/lib/garden/spreadsheets.rb +50 -0
- data/lib/garden/version.rb +3 -0
- metadata +66 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.markdown
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/garden.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "garden/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "garden"
|
7
|
+
s.version = Garden::VERSION
|
8
|
+
s.authors = ["amoslanka"]
|
9
|
+
s.email = ["amoslanka@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{A utility for using different seed formats in your ActiveRecord database. }
|
12
|
+
s.description = %q{Allows you to organize your seeds in different formats. Typical seeds.rb, yaml fixtures, and a variety of spreadsheet formats. }
|
13
|
+
|
14
|
+
s.rubyforge_project = "garden"
|
15
|
+
|
16
|
+
s.add_dependency 'spreadsheet'
|
17
|
+
# s.add_dependency 'active_record'
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
end
|
data/lib/garden.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require "garden/version"
|
2
|
+
|
3
|
+
module Garden
|
4
|
+
|
5
|
+
autoload :Excel, 'garden/spreadsheets'
|
6
|
+
autoload :Mediators, 'garden/mediators'
|
7
|
+
|
8
|
+
# def self.plant
|
9
|
+
# # todo
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# def self.all
|
13
|
+
# # todo
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
#
|
17
|
+
# def self.spreadsheets
|
18
|
+
# # todo
|
19
|
+
# end
|
20
|
+
|
21
|
+
def self.excel file_name_or_path
|
22
|
+
filepath = resolve_file_path(file_name_or_path)
|
23
|
+
Excel.new filepath
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.resolve_file_path name_or_path
|
27
|
+
File.exists?(name_or_path) ? name_or_path : File.join(Rails.root, "db/seeds/#{name_or_path}.xls")
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Garden
|
2
|
+
module Mediators
|
3
|
+
class Table
|
4
|
+
|
5
|
+
def self.parse_table_name namish
|
6
|
+
namish.parameterize.underscore
|
7
|
+
end
|
8
|
+
def self.get_instance table_name, id
|
9
|
+
|
10
|
+
# puts "Find #{id} from #{table_name}"
|
11
|
+
# puts id.class.to_s
|
12
|
+
|
13
|
+
begin
|
14
|
+
clazz = table_name.to_s.classify.constantize
|
15
|
+
raise "Class #{clazz.to_s} is not an ActiveRecord subclass." unless clazz.new.is_a?(ActiveRecord::Base)
|
16
|
+
instance = clazz.find id.to_s
|
17
|
+
return instance
|
18
|
+
rescue Exception => e
|
19
|
+
puts "Could not find #{id} from table #{table_name}: #{e.message}"
|
20
|
+
return nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
def initialize namish
|
27
|
+
|
28
|
+
@name = Table.parse_table_name namish
|
29
|
+
|
30
|
+
# Get the ActiveRecord model from the tablename.
|
31
|
+
begin
|
32
|
+
@clazz = @name.classify.constantize
|
33
|
+
raise "Class #{@clazz.to_s} is not an ActiveRecord subclass." unless @clazz.new.is_a?(ActiveRecord::Base)
|
34
|
+
rescue Exception => e
|
35
|
+
puts " ** Could not derive ActiveRecord model from the provided name: #{namish}. Exception: #{e.message}"
|
36
|
+
end
|
37
|
+
|
38
|
+
@instance = @clazz.new
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
def valid?
|
43
|
+
@clazz != nil
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_headers array
|
47
|
+
@headers = array.map { |header| header.to_s.parameterize.underscore }
|
48
|
+
@relationships = []
|
49
|
+
|
50
|
+
@headers.each do |header|
|
51
|
+
@relationships.push header if @clazz.reflections.keys.include?(header.to_sym)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def relationships
|
57
|
+
@relationships
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_instance attributes
|
61
|
+
relationships = @relationships
|
62
|
+
|
63
|
+
|
64
|
+
attributes = parse_row_relationships attributes, relationships
|
65
|
+
|
66
|
+
instance = @clazz.new
|
67
|
+
|
68
|
+
rejected = {}
|
69
|
+
attributes.each_key do |key|
|
70
|
+
rejected[key] = attributes.delete(key) if !instance.attributes.include?(key.to_s) && !relationships.include?(key.to_s)
|
71
|
+
end
|
72
|
+
|
73
|
+
instance.attributes = attributes
|
74
|
+
|
75
|
+
# instance.id = rejected[:id] if rejected.key?(:id)
|
76
|
+
|
77
|
+
# puts "Valid? #{instance.valid?}"
|
78
|
+
# puts instance.errors.to_s
|
79
|
+
|
80
|
+
valid = instance.valid?
|
81
|
+
|
82
|
+
if instance.valid?
|
83
|
+
instance.save!
|
84
|
+
puts ".Saved instance: #{@clazz} #{instance.to_param}"
|
85
|
+
else
|
86
|
+
puts "Invalid instance."
|
87
|
+
puts "#{@name}:"
|
88
|
+
puts " - Valid attributes: #{attributes.keys}"
|
89
|
+
puts " - Invalid attributes: #{rejected.keys}"
|
90
|
+
puts " - Association attributes: #{relationships}"
|
91
|
+
puts " - #{instance.errors}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse_row_relationships hash, relationships
|
96
|
+
relationships.each do |r|
|
97
|
+
# puts "Parsing row relationship: #{hash[r.to_sym]}"
|
98
|
+
instance = get_instance r, hash[r.to_sym]
|
99
|
+
hash[r.to_sym] = instance
|
100
|
+
end
|
101
|
+
hash
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Garden
|
2
|
+
class Excel
|
3
|
+
|
4
|
+
def initialize filepath
|
5
|
+
open filepath
|
6
|
+
end
|
7
|
+
|
8
|
+
def open filepath
|
9
|
+
puts "Planting spreadsheet: #{filepath}"
|
10
|
+
|
11
|
+
@ss = Spreadsheet.open filepath
|
12
|
+
@ss.worksheets.each do |table|
|
13
|
+
puts "Parsing table #{table.name}"
|
14
|
+
parse_table table
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse_table table
|
20
|
+
# The table object passed in is a Spreadsheet::Worksheet instance.
|
21
|
+
|
22
|
+
table_mediator = Mediators::Table.new table.name
|
23
|
+
if !table_mediator.valid?
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get the headers. These values will be the attribute names
|
28
|
+
headers = table_mediator.parse_headers table.first.to_a
|
29
|
+
|
30
|
+
# Now loop the table rows, inserting records.
|
31
|
+
table.each do |row|
|
32
|
+
next if row.idx == 0
|
33
|
+
# puts '...............'
|
34
|
+
|
35
|
+
table_mediator.create_instance parse_worksheet_row(headers, row)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def parse_worksheet_row keys, values
|
40
|
+
h = {}
|
41
|
+
keys.each_index do |index|
|
42
|
+
key = keys[index].to_sym
|
43
|
+
h[key] = values[index]
|
44
|
+
end
|
45
|
+
h
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: garden
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- amoslanka
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-08-26 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: spreadsheet
|
16
|
+
requirement: &70240349441300 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70240349441300
|
25
|
+
description: ! 'Allows you to organize your seeds in different formats. Typical seeds.rb,
|
26
|
+
yaml fixtures, and a variety of spreadsheet formats. '
|
27
|
+
email:
|
28
|
+
- amoslanka@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- Gemfile
|
35
|
+
- README.markdown
|
36
|
+
- Rakefile
|
37
|
+
- garden.gemspec
|
38
|
+
- lib/garden.rb
|
39
|
+
- lib/garden/mediators.rb
|
40
|
+
- lib/garden/spreadsheets.rb
|
41
|
+
- lib/garden/version.rb
|
42
|
+
homepage: ''
|
43
|
+
licenses: []
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project: garden
|
62
|
+
rubygems_version: 1.8.6
|
63
|
+
signing_key:
|
64
|
+
specification_version: 3
|
65
|
+
summary: A utility for using different seed formats in your ActiveRecord database.
|
66
|
+
test_files: []
|