fruit_to_lime 0.9.1 → 0.9.2
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/bin/fruit_to_lime +24 -24
- data/lib/fruit_to_lime/address_helper.rb +17 -17
- data/lib/fruit_to_lime/csv_helper.rb +32 -32
- data/lib/fruit_to_lime/model/address.rb +37 -37
- data/lib/fruit_to_lime/model/coworker.rb +44 -44
- data/lib/fruit_to_lime/model/coworker_reference.rb +17 -17
- data/lib/fruit_to_lime/model/customfield.rb +30 -30
- data/lib/fruit_to_lime/model/note.rb +38 -38
- data/lib/fruit_to_lime/model/organization.rb +140 -140
- data/lib/fruit_to_lime/model/person.rb +115 -115
- data/lib/fruit_to_lime/model/referencetosource.rb +42 -42
- data/lib/fruit_to_lime/model/rootmodel.rb +142 -142
- data/lib/fruit_to_lime/model/tag.rb +33 -33
- data/lib/fruit_to_lime/model_helpers.rb +19 -19
- data/lib/fruit_to_lime/roo_helper.rb +59 -59
- data/lib/fruit_to_lime/serialize_helper.rb +139 -139
- data/lib/fruit_to_lime/templating.rb +51 -51
- data/lib/fruit_to_lime.rb +13 -13
- data/spec/helpers/address_helper_spec.rb +48 -48
- data/spec/helpers/csv_helper_spec.rb +15 -15
- data/spec/helpers/roo_helper_spec.rb +10 -10
- data/spec/helpers/serialize_helper_spec.rb +211 -211
- data/spec/person_spec.rb +44 -44
- data/spec/spec_helper.rb +24 -24
- data/templates/csv/Gemfile +5 -5
- data/templates/csv/Rakefile.rb +7 -7
- data/templates/csv/convert.rb +2 -2
- data/templates/csv/lib/tomodel.rb +56 -56
- data/templates/csv/spec/sample_data/organizations.csv +2 -2
- data/templates/csv/spec/spec_helper.rb +24 -24
- data/templates/csv/spec/tomodel_spec.rb +14 -14
- data/templates/excel/Gemfile +6 -6
- data/templates/excel/Rakefile.rb +7 -7
- data/templates/excel/convert.rb +2 -2
- data/templates/excel/lib/tomodel.rb +53 -53
- data/templates/excel/spec/spec_helper.rb +20 -20
- data/templates/excel/spec/tomodel_spec.rb +18 -18
- data/templates/sqlserver/Gemfile +6 -6
- data/templates/sqlserver/Rakefile.rb +7 -7
- data/templates/sqlserver/convert.rb +2 -2
- data/templates/sqlserver/lib/tomodel.rb +67 -67
- data/templates/sqlserver/spec/spec_helper.rb +20 -20
- data/templates/sqlserver/spec/tomodel_spec.rb +9 -9
- metadata +2 -2
@@ -1,59 +1,59 @@
|
|
1
|
-
require "csv"
|
2
|
-
module FruitToLime
|
3
|
-
class RooHelper
|
4
|
-
def initialize(data)
|
5
|
-
@data = data
|
6
|
-
@default_sheet = data.sheets.first
|
7
|
-
end
|
8
|
-
|
9
|
-
def rows
|
10
|
-
return rows_for_sheet(@default_sheet)
|
11
|
-
end
|
12
|
-
|
13
|
-
def rows_for_sheet(sheet)
|
14
|
-
column_headers = {}
|
15
|
-
1.upto(@data.last_column(sheet)) do |col|
|
16
|
-
column_headers[col] = @data.cell(1, col, sheet).encode('UTF-8')
|
17
|
-
end
|
18
|
-
|
19
|
-
rs = []
|
20
|
-
2.upto(@data.last_row(sheet)) do |row|
|
21
|
-
r = {}
|
22
|
-
1.upto(@data.last_column(sheet)) do |col|
|
23
|
-
val = cell_to_csv(row, col, sheet)
|
24
|
-
r[column_headers[col]] = val
|
25
|
-
end
|
26
|
-
rs.push(r)
|
27
|
-
end
|
28
|
-
return rs
|
29
|
-
end
|
30
|
-
|
31
|
-
def cell_to_csv(row, col, sheet)
|
32
|
-
if @data.empty?(row,col,sheet)
|
33
|
-
''
|
34
|
-
else
|
35
|
-
onecell = @data.cell(row,col,sheet)
|
36
|
-
case @data.celltype(row,col,sheet)
|
37
|
-
when :string
|
38
|
-
unless onecell.empty?
|
39
|
-
onecell.encode('UTF-8').strip
|
40
|
-
end
|
41
|
-
when :float, :percentage
|
42
|
-
if onecell == onecell.to_i
|
43
|
-
onecell.to_i.to_s
|
44
|
-
else
|
45
|
-
onecell.to_s
|
46
|
-
end
|
47
|
-
when :date, :datetime
|
48
|
-
onecell.to_s
|
49
|
-
when :time
|
50
|
-
Roo::Base.integer_to_timestring(onecell)
|
51
|
-
when :formula
|
52
|
-
onecell.to_s
|
53
|
-
else
|
54
|
-
raise "unhandled celltype #{@data.celltype(row,col,sheet)} for cell at row: #{row}, col: #{col} in sheet #{sheet}"
|
55
|
-
end || ""
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
1
|
+
require "csv"
|
2
|
+
module FruitToLime
|
3
|
+
class RooHelper
|
4
|
+
def initialize(data)
|
5
|
+
@data = data
|
6
|
+
@default_sheet = data.sheets.first
|
7
|
+
end
|
8
|
+
|
9
|
+
def rows
|
10
|
+
return rows_for_sheet(@default_sheet)
|
11
|
+
end
|
12
|
+
|
13
|
+
def rows_for_sheet(sheet)
|
14
|
+
column_headers = {}
|
15
|
+
1.upto(@data.last_column(sheet)) do |col|
|
16
|
+
column_headers[col] = @data.cell(1, col, sheet).encode('UTF-8')
|
17
|
+
end
|
18
|
+
|
19
|
+
rs = []
|
20
|
+
2.upto(@data.last_row(sheet)) do |row|
|
21
|
+
r = {}
|
22
|
+
1.upto(@data.last_column(sheet)) do |col|
|
23
|
+
val = cell_to_csv(row, col, sheet)
|
24
|
+
r[column_headers[col]] = val
|
25
|
+
end
|
26
|
+
rs.push(r)
|
27
|
+
end
|
28
|
+
return rs
|
29
|
+
end
|
30
|
+
|
31
|
+
def cell_to_csv(row, col, sheet)
|
32
|
+
if @data.empty?(row,col,sheet)
|
33
|
+
''
|
34
|
+
else
|
35
|
+
onecell = @data.cell(row,col,sheet)
|
36
|
+
case @data.celltype(row,col,sheet)
|
37
|
+
when :string
|
38
|
+
unless onecell.empty?
|
39
|
+
onecell.encode('UTF-8').strip
|
40
|
+
end
|
41
|
+
when :float, :percentage
|
42
|
+
if onecell == onecell.to_i
|
43
|
+
onecell.to_i.to_s
|
44
|
+
else
|
45
|
+
onecell.to_s
|
46
|
+
end
|
47
|
+
when :date, :datetime
|
48
|
+
onecell.to_s
|
49
|
+
when :time
|
50
|
+
Roo::Base.integer_to_timestring(onecell)
|
51
|
+
when :formula
|
52
|
+
onecell.to_s
|
53
|
+
else
|
54
|
+
raise "unhandled celltype #{@data.celltype(row,col,sheet)} for cell at row: #{row}, col: #{col} in sheet #{sheet}"
|
55
|
+
end || ""
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -1,139 +1,139 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module FruitToLime
|
3
|
-
module SerializeHelper
|
4
|
-
def serialize()
|
5
|
-
SerializeHelper::serialize(self)
|
6
|
-
end
|
7
|
-
|
8
|
-
def serialize_to_file(file)
|
9
|
-
SerializeHelper::serialize_to_file(file, self)
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.serialize_variables(obj)
|
13
|
-
if (obj.respond_to?(:serialize_variables))
|
14
|
-
return obj.serialize_variables.map do |ivar|
|
15
|
-
varn = ivar[:id].to_s.gsub(/^\@/,'').split('_').map do |m|
|
16
|
-
m.capitalize
|
17
|
-
end.join('')
|
18
|
-
|
19
|
-
varv = obj.instance_variable_get("@#{ivar[:id].to_s}")
|
20
|
-
if (varv.respond_to?(:serialize_variables))
|
21
|
-
varv = serialize_variables(varv)
|
22
|
-
elsif (varv.is_a?(Array))
|
23
|
-
varv = varv.map { |elem| SerializeHelper::serialize(elem) }.join("\n")
|
24
|
-
elsif (varv == nil)
|
25
|
-
varv = nil
|
26
|
-
else
|
27
|
-
varv = varv.to_s.encode('UTF-8').encode(:xml => :text)
|
28
|
-
end
|
29
|
-
if varv != nil then "<#{varn}>#{ varv }</#{varn}>" else "" end
|
30
|
-
if varv != nil then "<#{varn}>#{ varv }</#{varn}>" end
|
31
|
-
end.join("\n")
|
32
|
-
end
|
33
|
-
raise "!!#{obj.class}"
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.serialize(obj)
|
37
|
-
if (obj.respond_to?(:serialize_variables))
|
38
|
-
varn = obj.serialize_name
|
39
|
-
"<#{varn}>#{ SerializeHelper::serialize_variables(obj) }</#{varn}>"
|
40
|
-
elsif obj.respond_to?(:to_xml)
|
41
|
-
obj.to_xml
|
42
|
-
else
|
43
|
-
obj.to_s.encode(:xml => :text)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.serialize_to_file(file, obj)
|
48
|
-
File.open(file, 'w') do |f|
|
49
|
-
f.write(SerializeHelper::serialize(obj))
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def symbol_to_name(symbol)
|
54
|
-
symbol.to_s.split('_').join(' ').capitalize
|
55
|
-
end
|
56
|
-
|
57
|
-
def map_symbol_to_row(symbol,type)
|
58
|
-
{
|
59
|
-
:id => symbol.to_s,
|
60
|
-
:name => symbol == :id ? 'Go id' : symbol_to_name(symbol),
|
61
|
-
:type =>type
|
62
|
-
}
|
63
|
-
end
|
64
|
-
|
65
|
-
def map_to_row(p)
|
66
|
-
case p[:type]
|
67
|
-
when :string then
|
68
|
-
map_symbol_to_row(p[:id],p[:type])
|
69
|
-
when :bool then
|
70
|
-
map_symbol_to_row(p[:id],p[:type])
|
71
|
-
when :date then
|
72
|
-
map_symbol_to_row(p[:id],p[:type])
|
73
|
-
when :notes then
|
74
|
-
{
|
75
|
-
:id => p[:id].to_s,
|
76
|
-
:name => symbol_to_name(p[:id]),
|
77
|
-
:type => p[:type],
|
78
|
-
:models => SerializeHelper.get_import_rows(:note)
|
79
|
-
}
|
80
|
-
when :tags then
|
81
|
-
{
|
82
|
-
:id => p[:id].to_s,
|
83
|
-
:type => p[:type],
|
84
|
-
:name => symbol_to_name(p[:id]),
|
85
|
-
}
|
86
|
-
when :persons then
|
87
|
-
{
|
88
|
-
:id => p[:id].to_s,
|
89
|
-
:type => p[:type],
|
90
|
-
:name => symbol_to_name(p[:id]),
|
91
|
-
:models => SerializeHelper.get_import_rows(:person)
|
92
|
-
}
|
93
|
-
when :custom_fields then
|
94
|
-
{
|
95
|
-
:id => p[:id].to_s,
|
96
|
-
:type => p[:type],
|
97
|
-
:name => symbol_to_name(p[:id]),
|
98
|
-
:models => SerializeHelper.get_import_rows(:custom_field)
|
99
|
-
}
|
100
|
-
else
|
101
|
-
{
|
102
|
-
:id => p[:id].to_s,
|
103
|
-
:name => symbol_to_name(p[:id]),
|
104
|
-
:type => p[:type],
|
105
|
-
:model => SerializeHelper.get_import_rows(p[:type])
|
106
|
-
}
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def get_import_rows
|
111
|
-
serialize_variables.map do |p|
|
112
|
-
map_to_row p
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def self.get_import_rows(type)
|
117
|
-
case type
|
118
|
-
when :person then
|
119
|
-
Person.new
|
120
|
-
when :source_ref then
|
121
|
-
ReferenceToSource.new
|
122
|
-
when :note then
|
123
|
-
Note.new
|
124
|
-
when :address then
|
125
|
-
Address.new
|
126
|
-
when :organization then
|
127
|
-
Organization.new
|
128
|
-
when :coworker_reference then
|
129
|
-
CoworkerReference.new
|
130
|
-
when :organization_reference then
|
131
|
-
OrganizationReference.new
|
132
|
-
when :custom_field then
|
133
|
-
CustomField.new
|
134
|
-
else
|
135
|
-
raise "Unknown type: #{type}"
|
136
|
-
end.get_import_rows
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
module FruitToLime
|
3
|
+
module SerializeHelper
|
4
|
+
def serialize()
|
5
|
+
SerializeHelper::serialize(self)
|
6
|
+
end
|
7
|
+
|
8
|
+
def serialize_to_file(file)
|
9
|
+
SerializeHelper::serialize_to_file(file, self)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.serialize_variables(obj)
|
13
|
+
if (obj.respond_to?(:serialize_variables))
|
14
|
+
return obj.serialize_variables.map do |ivar|
|
15
|
+
varn = ivar[:id].to_s.gsub(/^\@/,'').split('_').map do |m|
|
16
|
+
m.capitalize
|
17
|
+
end.join('')
|
18
|
+
|
19
|
+
varv = obj.instance_variable_get("@#{ivar[:id].to_s}")
|
20
|
+
if (varv.respond_to?(:serialize_variables))
|
21
|
+
varv = serialize_variables(varv)
|
22
|
+
elsif (varv.is_a?(Array))
|
23
|
+
varv = varv.map { |elem| SerializeHelper::serialize(elem) }.join("\n")
|
24
|
+
elsif (varv == nil)
|
25
|
+
varv = nil
|
26
|
+
else
|
27
|
+
varv = varv.to_s.encode('UTF-8').encode(:xml => :text)
|
28
|
+
end
|
29
|
+
if varv != nil then "<#{varn}>#{ varv }</#{varn}>" else "" end
|
30
|
+
if varv != nil then "<#{varn}>#{ varv }</#{varn}>" end
|
31
|
+
end.join("\n")
|
32
|
+
end
|
33
|
+
raise "!!#{obj.class}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.serialize(obj)
|
37
|
+
if (obj.respond_to?(:serialize_variables))
|
38
|
+
varn = obj.serialize_name
|
39
|
+
"<#{varn}>#{ SerializeHelper::serialize_variables(obj) }</#{varn}>"
|
40
|
+
elsif obj.respond_to?(:to_xml)
|
41
|
+
obj.to_xml
|
42
|
+
else
|
43
|
+
obj.to_s.encode(:xml => :text)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.serialize_to_file(file, obj)
|
48
|
+
File.open(file, 'w') do |f|
|
49
|
+
f.write(SerializeHelper::serialize(obj))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def symbol_to_name(symbol)
|
54
|
+
symbol.to_s.split('_').join(' ').capitalize
|
55
|
+
end
|
56
|
+
|
57
|
+
def map_symbol_to_row(symbol,type)
|
58
|
+
{
|
59
|
+
:id => symbol.to_s,
|
60
|
+
:name => symbol == :id ? 'Go id' : symbol_to_name(symbol),
|
61
|
+
:type =>type
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def map_to_row(p)
|
66
|
+
case p[:type]
|
67
|
+
when :string then
|
68
|
+
map_symbol_to_row(p[:id],p[:type])
|
69
|
+
when :bool then
|
70
|
+
map_symbol_to_row(p[:id],p[:type])
|
71
|
+
when :date then
|
72
|
+
map_symbol_to_row(p[:id],p[:type])
|
73
|
+
when :notes then
|
74
|
+
{
|
75
|
+
:id => p[:id].to_s,
|
76
|
+
:name => symbol_to_name(p[:id]),
|
77
|
+
:type => p[:type],
|
78
|
+
:models => SerializeHelper.get_import_rows(:note)
|
79
|
+
}
|
80
|
+
when :tags then
|
81
|
+
{
|
82
|
+
:id => p[:id].to_s,
|
83
|
+
:type => p[:type],
|
84
|
+
:name => symbol_to_name(p[:id]),
|
85
|
+
}
|
86
|
+
when :persons then
|
87
|
+
{
|
88
|
+
:id => p[:id].to_s,
|
89
|
+
:type => p[:type],
|
90
|
+
:name => symbol_to_name(p[:id]),
|
91
|
+
:models => SerializeHelper.get_import_rows(:person)
|
92
|
+
}
|
93
|
+
when :custom_fields then
|
94
|
+
{
|
95
|
+
:id => p[:id].to_s,
|
96
|
+
:type => p[:type],
|
97
|
+
:name => symbol_to_name(p[:id]),
|
98
|
+
:models => SerializeHelper.get_import_rows(:custom_field)
|
99
|
+
}
|
100
|
+
else
|
101
|
+
{
|
102
|
+
:id => p[:id].to_s,
|
103
|
+
:name => symbol_to_name(p[:id]),
|
104
|
+
:type => p[:type],
|
105
|
+
:model => SerializeHelper.get_import_rows(p[:type])
|
106
|
+
}
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def get_import_rows
|
111
|
+
serialize_variables.map do |p|
|
112
|
+
map_to_row p
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.get_import_rows(type)
|
117
|
+
case type
|
118
|
+
when :person then
|
119
|
+
Person.new
|
120
|
+
when :source_ref then
|
121
|
+
ReferenceToSource.new
|
122
|
+
when :note then
|
123
|
+
Note.new
|
124
|
+
when :address then
|
125
|
+
Address.new
|
126
|
+
when :organization then
|
127
|
+
Organization.new
|
128
|
+
when :coworker_reference then
|
129
|
+
CoworkerReference.new
|
130
|
+
when :organization_reference then
|
131
|
+
OrganizationReference.new
|
132
|
+
when :custom_field then
|
133
|
+
CustomField.new
|
134
|
+
else
|
135
|
+
raise "Unknown type: #{type}"
|
136
|
+
end.get_import_rows
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -1,51 +1,51 @@
|
|
1
|
-
require "fileutils"
|
2
|
-
require 'open3'
|
3
|
-
module FruitToLime
|
4
|
-
class Templating
|
5
|
-
def initialize(path)
|
6
|
-
@path = path
|
7
|
-
end
|
8
|
-
|
9
|
-
def list()
|
10
|
-
Dir.entries(@path).select { |d| d != '.' && d != '..' }
|
11
|
-
end
|
12
|
-
|
13
|
-
def exec_but_dont_show_unless_error(cmd)
|
14
|
-
std_out_value = []
|
15
|
-
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
|
16
|
-
while std_line = stdout.gets
|
17
|
-
std_out_value << std_line
|
18
|
-
end
|
19
|
-
|
20
|
-
exit_status = wait_thr.value
|
21
|
-
if !exit_status.success?
|
22
|
-
puts "Failed with #{exit_status}"
|
23
|
-
puts "std_out_value"
|
24
|
-
puts std_out_value
|
25
|
-
|
26
|
-
raise "failed exec #{cmd}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def unpack(name, path)
|
32
|
-
template = list.find { |t| t == name }
|
33
|
-
if template
|
34
|
-
unpackedname = name
|
35
|
-
|
36
|
-
puts "Unpacking template #{name} to #{path}"
|
37
|
-
FileUtils.cp_r File.expand_path(name, @path), path
|
38
|
-
|
39
|
-
# Now make sure all gems in template are installed
|
40
|
-
puts "Making sure all needed gems are present"
|
41
|
-
Dir.chdir(File.expand_path(unpackedname, path)) do
|
42
|
-
exec_but_dont_show_unless_error('bundle install --verbose')
|
43
|
-
end
|
44
|
-
true
|
45
|
-
else
|
46
|
-
puts "Unable to find template #{name}"
|
47
|
-
false
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
1
|
+
require "fileutils"
|
2
|
+
require 'open3'
|
3
|
+
module FruitToLime
|
4
|
+
class Templating
|
5
|
+
def initialize(path)
|
6
|
+
@path = path
|
7
|
+
end
|
8
|
+
|
9
|
+
def list()
|
10
|
+
Dir.entries(@path).select { |d| d != '.' && d != '..' }
|
11
|
+
end
|
12
|
+
|
13
|
+
def exec_but_dont_show_unless_error(cmd)
|
14
|
+
std_out_value = []
|
15
|
+
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
|
16
|
+
while std_line = stdout.gets
|
17
|
+
std_out_value << std_line
|
18
|
+
end
|
19
|
+
|
20
|
+
exit_status = wait_thr.value
|
21
|
+
if !exit_status.success?
|
22
|
+
puts "Failed with #{exit_status}"
|
23
|
+
puts "std_out_value"
|
24
|
+
puts std_out_value
|
25
|
+
|
26
|
+
raise "failed exec #{cmd}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def unpack(name, path)
|
32
|
+
template = list.find { |t| t == name }
|
33
|
+
if template
|
34
|
+
unpackedname = name
|
35
|
+
|
36
|
+
puts "Unpacking template #{name} to #{path}"
|
37
|
+
FileUtils.cp_r File.expand_path(name, @path), path
|
38
|
+
|
39
|
+
# Now make sure all gems in template are installed
|
40
|
+
puts "Making sure all needed gems are present"
|
41
|
+
Dir.chdir(File.expand_path(unpackedname, path)) do
|
42
|
+
exec_but_dont_show_unless_error('bundle install --verbose')
|
43
|
+
end
|
44
|
+
true
|
45
|
+
else
|
46
|
+
puts "Unable to find template #{name}"
|
47
|
+
false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|