fruit_to_lime 0.6.7 → 0.7.0
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 +47 -0
- data/lib/fruit_to_lime/csv_helper.rb +0 -16
- data/lib/fruit_to_lime/model/organization.rb +9 -12
- data/lib/fruit_to_lime/model/person.rb +5 -11
- data/lib/fruit_to_lime/model/referencetosource.rb +43 -0
- data/lib/fruit_to_lime/serialize_helper.rb +1 -44
- data/lib/fruit_to_lime.rb +0 -1
- data/spec/helpers/csv_helper_spec.rb +8 -56
- data/spec/helpers/serialize_helper_spec.rb +10 -6
- data/templates/csv/Gemfile +4 -0
- data/templates/csv/Rakefile.rb +7 -0
- data/templates/csv/convert.rb +3 -0
- data/templates/csv/lib/tomodel.rb +42 -0
- data/templates/csv/spec/sample_data/organizations.csv +2 -0
- data/templates/csv/spec/spec_helper.rb +24 -0
- data/templates/csv/spec/tomodel_spec.rb +14 -0
- data/templates/excel/Gemfile +5 -0
- data/templates/excel/Rakefile.rb +7 -0
- data/templates/excel/convert.rb +3 -0
- data/templates/excel/lib/tomodel.rb +39 -0
- data/templates/excel/spec/sample_data/sample.xlsx +0 -0
- data/templates/excel/spec/spec_helper.rb +20 -0
- data/templates/excel/spec/tomodel_spec.rb +18 -0
- data/templates/sqlserver/Gemfile +5 -0
- data/templates/sqlserver/Rakefile.rb +7 -0
- data/templates/sqlserver/convert.rb +3 -0
- data/templates/sqlserver/lib/tomodel.rb +53 -0
- data/templates/sqlserver/spec/spec_helper.rb +20 -0
- data/templates/sqlserver/spec/tomodel_spec.rb +9 -0
- metadata +26 -7
- data/lib/fruit_to_lime/column.rb +0 -37
- data/lib/fruit_to_lime/model/sourceref.rb +0 -75
- data/spec/gosourceref_spec.rb +0 -39
data/bin/fruit_to_lime
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "thor"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
class Templating
|
6
|
+
def initialize(path = nil)
|
7
|
+
if path == nil
|
8
|
+
path = File.expand_path("../templates", File.dirname(__FILE__))
|
9
|
+
end
|
10
|
+
@path = path
|
11
|
+
end
|
12
|
+
|
13
|
+
def list()
|
14
|
+
Dir.entries(@path).select { |d| d != '.' && d != '..' }
|
15
|
+
end
|
16
|
+
|
17
|
+
def unpack(name, path)
|
18
|
+
template = list.find { |t| t == name }
|
19
|
+
if template
|
20
|
+
puts "Unpacking template #{name} to #{path}"
|
21
|
+
|
22
|
+
FileUtils.cp_r File.expand_path(name, @path), path
|
23
|
+
|
24
|
+
true
|
25
|
+
else
|
26
|
+
puts "Unable to find template #{name}"
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Cli < Thor
|
33
|
+
desc "unpack_template NAME PATH", "Unpacks template with NAME in specified PATH or current directory if missing."
|
34
|
+
def unpack_template(name, path = nil)
|
35
|
+
path = '.' if path == nil
|
36
|
+
path = File.absolute_path(path)
|
37
|
+
Templating.new.unpack(name, path)
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "list_templates", "Lists all templates"
|
41
|
+
def list_templates()
|
42
|
+
templates = Templating.new.list
|
43
|
+
puts templates
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Cli.start(ARGV)
|
@@ -8,22 +8,6 @@ module FruitToLime
|
|
8
8
|
firstline.include? c
|
9
9
|
end
|
10
10
|
end
|
11
|
-
# todo: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
|
12
|
-
# might be possible to simplify code using the headers option, etc
|
13
|
-
def self.read_columns_and_first_five_lines(text)
|
14
|
-
if !text
|
15
|
-
raise "Missing text"
|
16
|
-
end
|
17
|
-
rows = CSV.parse(text.strip,{:col_sep=>self.detect_col_sep(text)})
|
18
|
-
first = rows.first
|
19
|
-
first_five_lines = rows[1,5]
|
20
|
-
retval = []
|
21
|
-
(0 .. first.length-1).each do |i|
|
22
|
-
val = yield first[i], first_five_lines.map {|l| l[i] }
|
23
|
-
retval.push(val)
|
24
|
-
end
|
25
|
-
return retval
|
26
|
-
end
|
27
11
|
|
28
12
|
def self.text_to_hashes(text)
|
29
13
|
if !text
|
@@ -36,11 +36,12 @@ module FruitToLime
|
|
36
36
|
class Organization < OrganizationReference
|
37
37
|
include SerializeHelper
|
38
38
|
|
39
|
-
attr_accessor :organization_number, :email, :web_site, :postal_address, :visit_address
|
39
|
+
attr_accessor :organization_number, :email, :web_site, :external_link, :postal_address, :visit_address
|
40
40
|
attr_reader :employees, :notes, :custom_fields
|
41
41
|
|
42
42
|
def initialize()
|
43
43
|
end
|
44
|
+
|
44
45
|
def with_postal_address
|
45
46
|
@postal_address = Address.new
|
46
47
|
yield @postal_address
|
@@ -55,17 +56,13 @@ module FruitToLime
|
|
55
56
|
@custom_fields = [] if @custom_fields==nil
|
56
57
|
@custom_fields.push CustomField.new(obj)
|
57
58
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
if !val.is_a? SourceRef
|
63
|
-
@source_ref = SourceRef.new(val)
|
64
|
-
else
|
65
|
-
@source_ref = val
|
66
|
-
end
|
59
|
+
|
60
|
+
def with_source
|
61
|
+
@source = ReferenceToSource.new
|
62
|
+
yield @source
|
67
63
|
end
|
68
64
|
|
65
|
+
|
69
66
|
def add_employee(val)
|
70
67
|
@employees = [] if @employees==nil
|
71
68
|
@employees.push(if val.is_a? Person then val else Person.new(val) end)
|
@@ -81,14 +78,14 @@ module FruitToLime
|
|
81
78
|
end
|
82
79
|
|
83
80
|
def serialize_variables
|
84
|
-
[ :id, :integration_id, :name, :organization_number, :email, :web_site ].map { |prop| { :id => prop, :type => :string } } +
|
81
|
+
[ :id, :integration_id, :name, :organization_number, :external_link, :email, :web_site ].map { |prop| { :id => prop, :type => :string } } +
|
85
82
|
[
|
86
83
|
{ :id => :postal_address, :type => :address},
|
87
84
|
{ :id => :visit_address, :type => :address},
|
88
85
|
{ :id => :employees, :type => :persons},
|
89
86
|
{ :id => :tags, :type => :tags},
|
90
87
|
{ :id => :custom_fields, :type => :custom_fields},
|
91
|
-
{ :id => :
|
88
|
+
{ :id => :source, :type => :source_ref}
|
92
89
|
]
|
93
90
|
end
|
94
91
|
|
@@ -55,17 +55,11 @@ module FruitToLime
|
|
55
55
|
@custom_fields = [] if @custom_fields==nil
|
56
56
|
@custom_fields.push CustomField.new(obj)
|
57
57
|
end
|
58
|
-
def source_ref
|
59
|
-
@source_ref
|
60
|
-
end
|
61
|
-
def source_ref=(val)
|
62
|
-
if !val.is_a? SourceRef
|
63
|
-
@source_ref = SourceRef.new(val)
|
64
|
-
else
|
65
|
-
@source_ref = val
|
66
|
-
end
|
67
|
-
end
|
68
58
|
|
59
|
+
def with_source
|
60
|
+
@source = ReferenceToSource.new
|
61
|
+
yield @source
|
62
|
+
end
|
69
63
|
|
70
64
|
def tags
|
71
65
|
@tags
|
@@ -89,7 +83,7 @@ module FruitToLime
|
|
89
83
|
#{:id=>:notes,:type=>:notes},
|
90
84
|
{:id=>:tags,:type=>:tags},
|
91
85
|
{:id=>:custom_fields,:type=>:custom_fields},
|
92
|
-
{:id=>:
|
86
|
+
{:id=>:source, :type=> :source_ref}
|
93
87
|
]
|
94
88
|
end
|
95
89
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module FruitToLime
|
2
|
+
class ReferenceToSource
|
3
|
+
include SerializeHelper
|
4
|
+
attr_accessor :name, :id, :format
|
5
|
+
|
6
|
+
def serialize_variables
|
7
|
+
[:name, :id, :format].map { |prop| { :id => prop, :type => :string } }
|
8
|
+
end
|
9
|
+
|
10
|
+
def serialize_name
|
11
|
+
"ReferenceToSource"
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_import_rows
|
15
|
+
(serialize_variables + [{ :id => :value, :type => :string }]).map do |p|
|
16
|
+
map_to_row p
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(opt = nil)
|
21
|
+
if opt != nil
|
22
|
+
serialize_variables.each do |myattr|
|
23
|
+
val = opt[myattr[:id]]
|
24
|
+
instance_variable_set("@" + myattr[:id].to_s,val) if val != nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
return "#{@name}_#{@format}_#{@id}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def ==(other)
|
34
|
+
return @name == other.name && @id == other.id && @format== other.format
|
35
|
+
end
|
36
|
+
|
37
|
+
def par_se(id)
|
38
|
+
@name = 'pase'
|
39
|
+
@format = 'External'
|
40
|
+
@id = id
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -2,17 +2,6 @@
|
|
2
2
|
module FruitToLime
|
3
3
|
module SerializeHelper
|
4
4
|
|
5
|
-
def fill_using(entity_columns, row)# TODO: Move to InCSV
|
6
|
-
entity_columns.select do |ecol|
|
7
|
-
ecol.selected!=nil && ecol.selected.length >0 && ecol.column!=nil && ecol.column.length > 0
|
8
|
-
end.each do |ecol|
|
9
|
-
selected = ecol.selected
|
10
|
-
value = row[ecol.column]
|
11
|
-
set_attribute(selected, value)
|
12
|
-
end
|
13
|
-
return self
|
14
|
-
end
|
15
|
-
|
16
5
|
def serialize()
|
17
6
|
SerializeHelper::serialize(self)
|
18
7
|
end
|
@@ -60,38 +49,6 @@ module SerializeHelper
|
|
60
49
|
end
|
61
50
|
end
|
62
51
|
|
63
|
-
def set_attribute(selected, value)# TODO: Move to InCSV
|
64
|
-
if selected.is_a? String
|
65
|
-
selected = [selected]
|
66
|
-
end
|
67
|
-
case selected.length
|
68
|
-
when 1
|
69
|
-
found = get_import_rows.find do |v|
|
70
|
-
v[:id].to_s == selected.first
|
71
|
-
end
|
72
|
-
if !found
|
73
|
-
return false
|
74
|
-
end
|
75
|
-
send(found[:id].to_s+"=",value)
|
76
|
-
return true
|
77
|
-
when 2
|
78
|
-
found = get_import_rows.find do |v|
|
79
|
-
v[:id].to_s == selected.first
|
80
|
-
end
|
81
|
-
if !found
|
82
|
-
return false
|
83
|
-
end
|
84
|
-
subval = send(found[:id].to_s)
|
85
|
-
if !subval
|
86
|
-
subval = nil
|
87
|
-
send(found[:id].to_s+"=",subval)
|
88
|
-
end
|
89
|
-
subval.set_attribute(selected.slice(1), value)
|
90
|
-
else
|
91
|
-
raise "! #{selected.length}"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
52
|
def symbol_to_name(symbol)
|
96
53
|
symbol.to_s.split('_').join(' ').capitalize
|
97
54
|
end
|
@@ -160,7 +117,7 @@ module SerializeHelper
|
|
160
117
|
when :person then
|
161
118
|
Person.new
|
162
119
|
when :source_ref then
|
163
|
-
|
120
|
+
ReferenceToSource.new
|
164
121
|
when :note then
|
165
122
|
Note.new
|
166
123
|
when :address then
|
data/lib/fruit_to_lime.rb
CHANGED
@@ -1,63 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'fruit_to_lime'
|
3
|
-
# Specs in this file have access to a helper object that includes
|
4
|
-
# the CsvHelper. For example:
|
5
|
-
#
|
6
|
-
# describe CsvHelper do
|
7
|
-
# describe "string concat" do
|
8
|
-
# it "concats two strings with spaces" do
|
9
|
-
# helper.concat_strings("this","that").should == "this that"
|
10
|
-
# end
|
11
|
-
# end
|
12
|
-
# end
|
13
|
-
describe FruitToLime::CsvHelper do
|
14
|
-
def text_to_model(text)
|
15
|
-
FruitToLime::CsvHelper.read_columns_and_first_five_lines(text) do |column, first_five_lines|
|
16
|
-
{:name=>column,:sample_data=>first_five_lines}
|
17
|
-
end
|
18
|
-
end
|
19
|
-
#pending "add some examples to (or delete) #{__FILE__}"
|
20
|
-
describe "from file to model" do
|
21
|
-
it "should contain column name and sample_data" do
|
22
|
-
v = text_to_model(
|
23
|
-
"id;navn
|
24
|
-
1;Noerrebro
|
25
|
-
2;Roedoevre")
|
26
|
-
v.should include({:name=>'id',:sample_data=>['1','2']})
|
27
|
-
v.should include({:name=>'navn',:sample_data=>['Noerrebro','Roedoevre']})
|
28
|
-
end
|
29
|
-
it "should handle empty line" do
|
30
|
-
v = text_to_model(
|
31
|
-
"id;navn
|
32
|
-
1;Noerrebro
|
33
|
-
"
|
34
|
-
)
|
35
|
-
|
36
|
-
expect(v).to eq([{:name=>'id',:sample_data=>['1']},
|
37
|
-
{:name=>'navn',:sample_data=>['Noerrebro']}])
|
38
|
-
end
|
39
|
-
it "should limit to max 5 elements in sample_data" do
|
40
|
-
v = text_to_model(
|
41
|
-
"id;navn
|
42
|
-
1;Noerrebro
|
43
|
-
2;Roedoevre
|
44
|
-
3;Vesterbro
|
45
|
-
4;Roskilde
|
46
|
-
5;Taarnby
|
47
|
-
6;Naestved
|
48
|
-
7;Fredericia")
|
49
|
-
v.should include({:name=>'id',:sample_data=>(1..5).map {|i| i.to_s }})
|
50
|
-
end
|
51
3
|
|
52
|
-
|
53
|
-
|
4
|
+
describe FruitToLime::CsvHelper do
|
5
|
+
it "should" do
|
6
|
+
v = FruitToLime::CsvHelper.text_to_hashes("id;navn
|
54
7
|
1;Noerrebro")
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
8
|
+
v.should include({"id"=>"1","navn"=>"Noerrebro"})
|
9
|
+
end
|
10
|
+
it "should handle sv chars" do
|
11
|
+
v = FruitToLime::CsvHelper.text_to_hashes("id;navn
|
59
12
|
1;Bj\u{00F6}rk")
|
60
|
-
|
61
|
-
end
|
13
|
+
v.should include({"id"=>"1","navn"=>"Bj\u{00F6}rk"})
|
62
14
|
end
|
63
15
|
end
|
@@ -43,7 +43,10 @@ describe FruitToLime::SerializeHelper do
|
|
43
43
|
p.id = "1"
|
44
44
|
p.first_name = "Kalle"
|
45
45
|
p.last_name = "Anka"
|
46
|
-
p.
|
46
|
+
p.with_source do |source|
|
47
|
+
source.par_se('122345')
|
48
|
+
end
|
49
|
+
#p.source_ref = {:name=>'Go',:id=>"PASE122345"}
|
47
50
|
p.with_postal_address do |addr|
|
48
51
|
addr.city = "Ankeborg"
|
49
52
|
end
|
@@ -67,8 +70,7 @@ describe FruitToLime::SerializeHelper do
|
|
67
70
|
serialized.should match(/cf title/)
|
68
71
|
serialized.should match(/cf value/)
|
69
72
|
end
|
70
|
-
it "should contain source
|
71
|
-
serialized.should match(/PASE/)
|
73
|
+
it "should contain reference to source" do
|
72
74
|
serialized.should match(/122345/)
|
73
75
|
end
|
74
76
|
it "should handle sv chars in tags" do
|
@@ -85,7 +87,10 @@ describe FruitToLime::SerializeHelper do
|
|
85
87
|
let(:serialized) {
|
86
88
|
o = FruitToLime::Organization.new
|
87
89
|
o.name = "Ankeborgs bibliotek"
|
88
|
-
o.
|
90
|
+
o.with_source do |source|
|
91
|
+
source.par_se('122345')
|
92
|
+
end
|
93
|
+
#o.source_ref = {:name=>'Go',:id=>"PASE122345"}
|
89
94
|
o.add_tag("tag:bibliotek")
|
90
95
|
o.add_tag("tag:Bj\u{00F6}rk")
|
91
96
|
o.set_custom_field({:id=>"2", :title=>"cf title", :value=>"cf value"})
|
@@ -122,8 +127,7 @@ describe FruitToLime::SerializeHelper do
|
|
122
127
|
serialized.should match(/cf value/)
|
123
128
|
#puts serialized
|
124
129
|
end
|
125
|
-
it "should contain source
|
126
|
-
serialized.should match(/PASE/)
|
130
|
+
it "should contain reference to source" do
|
127
131
|
serialized.should match(/122345/)
|
128
132
|
end
|
129
133
|
it "should handle sv chars in tags" do
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'fruit_to_lime'
|
2
|
+
|
3
|
+
class ToModel
|
4
|
+
def to_organization(row)
|
5
|
+
organization = FruitToLime::Organization.new
|
6
|
+
organization.integration_id = row['id']
|
7
|
+
organization.name = row['name']
|
8
|
+
return organization
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_model(organization_file_name)
|
12
|
+
rootmodel = FruitToLime::RootModel.new
|
13
|
+
if organization_file_name != nil
|
14
|
+
organization_file_data = File.open(organization_file_name, 'r').read.encode('UTF-8',"ISO-8859-1")
|
15
|
+
rows = FruitToLime::CsvHelper::text_to_hashes(organization_file_data)
|
16
|
+
rows.each do |row|
|
17
|
+
rootmodel.organizations.push(to_organization(row))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
return rootmodel
|
21
|
+
end
|
22
|
+
|
23
|
+
def save_xml(file)
|
24
|
+
File.open(file,'w') do |f|
|
25
|
+
f.write(FruitToLime::SerializeHelper::serialize(to_xml_model))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
require "thor"
|
31
|
+
require "fileutils"
|
32
|
+
require 'pathname'
|
33
|
+
|
34
|
+
class Cli < Thor
|
35
|
+
desc "to_go ORGANIZATIONS FILE", "Exports xml to FILE using for ORGANIZATIONS csv file."
|
36
|
+
def to_go(organizations, file = nil)
|
37
|
+
file = 'export.xml' if file == nil
|
38
|
+
toModel = ToModel.new()
|
39
|
+
model = toModel.to_model(organizations)
|
40
|
+
model.serialize_to_file(file)
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
|
+
#require File.expand_path("../../config/environment", __FILE__)
|
3
|
+
#require 'rspec/rails'
|
4
|
+
require 'rspec/autorun'
|
5
|
+
|
6
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
7
|
+
# in spec/support/ and its subdirectories.
|
8
|
+
#Dir[File.join(File.dirname(File.absolute_path(__FILE__)),"support/**/*.rb")].each { |f| require f }
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
# ## Mock Framework
|
12
|
+
#
|
13
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
14
|
+
#
|
15
|
+
# config.mock_with :mocha
|
16
|
+
# config.mock_with :flexmock
|
17
|
+
# config.mock_with :rr
|
18
|
+
|
19
|
+
# Run specs in random order to surface order dependencies. If you find an
|
20
|
+
# order dependency and want to debug it, you can fix the order by providing
|
21
|
+
# the seed, which is printed after each run.
|
22
|
+
# --seed 1234
|
23
|
+
config.order = "random"
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tomodel'
|
3
|
+
|
4
|
+
describe 'ToModel' do
|
5
|
+
before(:all) do
|
6
|
+
toModel = ToModel.new
|
7
|
+
organizations_file =File.join(File.dirname(__FILE__), 'sample_data', 'organizations.csv')
|
8
|
+
@model = toModel.to_model(organizations_file, persons_file)
|
9
|
+
end
|
10
|
+
it "will find something with a name" do
|
11
|
+
organization = @model.organizations[0]
|
12
|
+
organization.name.length.should > 0
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'fruit_to_lime'
|
2
|
+
require 'roo'
|
3
|
+
|
4
|
+
class ToModel
|
5
|
+
def to_organization(row)
|
6
|
+
organization = FruitToLime::Organization.new()
|
7
|
+
# Map properties
|
8
|
+
organization.integration_id = row['Id']
|
9
|
+
organization.name = row['Name']
|
10
|
+
|
11
|
+
return organization
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_model(organization_file_name)
|
15
|
+
# from excel to csv
|
16
|
+
organization_file_data = Roo::Excelx.new(organization_file_name)
|
17
|
+
|
18
|
+
model = FruitToLime::RootModel.new
|
19
|
+
rows = FruitToLime::RooHelper.new(organization_file_data).rows
|
20
|
+
rows.each do |row|
|
21
|
+
model.organizations.push(to_organization(row))
|
22
|
+
end
|
23
|
+
return model
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
require "thor"
|
28
|
+
require "fileutils"
|
29
|
+
require 'pathname'
|
30
|
+
|
31
|
+
class Cli < Thor
|
32
|
+
desc "to_go ORGANIZATION FILE", "Converts excel file to Go xml format. ORGANIZATIONS is path to input file. FILE is output file where Go xml will go."
|
33
|
+
def to_go(organizations, file = nil)
|
34
|
+
file = 'export.xml' if file == nil
|
35
|
+
scala = ScalaToModel.new()
|
36
|
+
model = scala.to_model(organizations)
|
37
|
+
model.serialize_to_file(file)
|
38
|
+
end
|
39
|
+
end
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
|
+
#require File.expand_path("../../config/environment", __FILE__)
|
3
|
+
require 'rspec/autorun'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
# ## Mock Framework
|
7
|
+
#
|
8
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
9
|
+
#
|
10
|
+
# config.mock_with :mocha
|
11
|
+
# config.mock_with :flexmock
|
12
|
+
# config.mock_with :rr
|
13
|
+
|
14
|
+
# Run specs in random order to surface order dependencies. If you find an
|
15
|
+
# order dependency and want to debug it, you can fix the order by providing
|
16
|
+
# the seed, which is printed after each run.
|
17
|
+
# --seed 1234
|
18
|
+
config.order = "random"
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'tomodel'
|
5
|
+
|
6
|
+
|
7
|
+
describe 'Model' do
|
8
|
+
before(:all) do
|
9
|
+
toModel = ToModel.new
|
10
|
+
samplefile =File.join(File.dirname(__FILE__), 'sample_data', 'sample.xlsx')
|
11
|
+
@model = toModel.to_model(samplefile)
|
12
|
+
end
|
13
|
+
it "will find something with a name" do
|
14
|
+
organization = @model.organizations[0]
|
15
|
+
organization.name.length.should > 0
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'fruit_to_lime'
|
2
|
+
require 'roo'
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
class ToModel
|
6
|
+
def to_organization(row)
|
7
|
+
organization = FruitToLime::Organization.new()
|
8
|
+
organization.integration_id = row['id']
|
9
|
+
organization.name = row['name']
|
10
|
+
return organization
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_model(organization_rows)
|
14
|
+
model = FruitToLime::RootModel.new
|
15
|
+
|
16
|
+
organization_rows.each do |row|
|
17
|
+
model.organizations.push(to_organization(row))
|
18
|
+
end
|
19
|
+
|
20
|
+
return model
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
require "thor"
|
25
|
+
require "fileutils"
|
26
|
+
require 'pathname'
|
27
|
+
require 'tiny_tds'
|
28
|
+
|
29
|
+
class Cli < Thor
|
30
|
+
desc "to_go", "Connects to sql server and queries for organizations to Go xml format. HOST, DATABASE, USERNAME and PASSWORD for Sql server connection. FILE is output file where Go xml will go."
|
31
|
+
def to_go(host, database, username, password, file = nil)
|
32
|
+
puts "Connecting to database #{database} on server #{host} as user #{username}"
|
33
|
+
client = TinyTds::Client.new(
|
34
|
+
:username => username,
|
35
|
+
:password => password,
|
36
|
+
:host => host,
|
37
|
+
:database => database)
|
38
|
+
|
39
|
+
organizationSql =
|
40
|
+
"SELECT
|
41
|
+
c.id,
|
42
|
+
c.name,
|
43
|
+
FROM
|
44
|
+
company c"
|
45
|
+
|
46
|
+
organization_rows = client.execute(organizationSql)
|
47
|
+
|
48
|
+
file = 'export.xml' if file == nil
|
49
|
+
tomodel = ToModel.new()
|
50
|
+
model = tomodel.to_model(organization_rows)
|
51
|
+
model.serialize_to_file(file)
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
|
+
#require File.expand_path("../../config/environment", __FILE__)
|
3
|
+
require 'rspec/autorun'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
# ## Mock Framework
|
7
|
+
#
|
8
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
9
|
+
#
|
10
|
+
# config.mock_with :mocha
|
11
|
+
# config.mock_with :flexmock
|
12
|
+
# config.mock_with :rr
|
13
|
+
|
14
|
+
# Run specs in random order to surface order dependencies. If you find an
|
15
|
+
# order dependency and want to debug it, you can fix the order by providing
|
16
|
+
# the seed, which is printed after each run.
|
17
|
+
# --seed 1234
|
18
|
+
config.order = "random"
|
19
|
+
end
|
20
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fruit_to_lime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-11-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: iso_country_codes
|
@@ -65,12 +65,12 @@ description: ! ' With this small library it should be much easier to generate i
|
|
65
65
|
|
66
66
|
'
|
67
67
|
email: oskar.gewalli@lundalogik.se
|
68
|
-
executables:
|
68
|
+
executables:
|
69
|
+
- fruit_to_lime
|
69
70
|
extensions: []
|
70
71
|
extra_rdoc_files: []
|
71
72
|
files:
|
72
73
|
- lib/fruit_to_lime/address_helper.rb
|
73
|
-
- lib/fruit_to_lime/column.rb
|
74
74
|
- lib/fruit_to_lime/csv_helper.rb
|
75
75
|
- lib/fruit_to_lime/model/address.rb
|
76
76
|
- lib/fruit_to_lime/model/coworker_reference.rb
|
@@ -78,13 +78,33 @@ files:
|
|
78
78
|
- lib/fruit_to_lime/model/note.rb
|
79
79
|
- lib/fruit_to_lime/model/organization.rb
|
80
80
|
- lib/fruit_to_lime/model/person.rb
|
81
|
+
- lib/fruit_to_lime/model/referencetosource.rb
|
81
82
|
- lib/fruit_to_lime/model/rootmodel.rb
|
82
|
-
- lib/fruit_to_lime/model/sourceref.rb
|
83
83
|
- lib/fruit_to_lime/model/tag.rb
|
84
84
|
- lib/fruit_to_lime/roo_helper.rb
|
85
85
|
- lib/fruit_to_lime/serialize_helper.rb
|
86
86
|
- lib/fruit_to_lime.rb
|
87
|
-
-
|
87
|
+
- bin/fruit_to_lime
|
88
|
+
- templates/csv/convert.rb
|
89
|
+
- templates/csv/Gemfile
|
90
|
+
- templates/csv/lib/tomodel.rb
|
91
|
+
- templates/csv/Rakefile.rb
|
92
|
+
- templates/csv/spec/sample_data/organizations.csv
|
93
|
+
- templates/csv/spec/spec_helper.rb
|
94
|
+
- templates/csv/spec/tomodel_spec.rb
|
95
|
+
- templates/excel/convert.rb
|
96
|
+
- templates/excel/Gemfile
|
97
|
+
- templates/excel/lib/tomodel.rb
|
98
|
+
- templates/excel/Rakefile.rb
|
99
|
+
- templates/excel/spec/sample_data/sample.xlsx
|
100
|
+
- templates/excel/spec/spec_helper.rb
|
101
|
+
- templates/excel/spec/tomodel_spec.rb
|
102
|
+
- templates/sqlserver/convert.rb
|
103
|
+
- templates/sqlserver/Gemfile
|
104
|
+
- templates/sqlserver/lib/tomodel.rb
|
105
|
+
- templates/sqlserver/Rakefile.rb
|
106
|
+
- templates/sqlserver/spec/spec_helper.rb
|
107
|
+
- templates/sqlserver/spec/tomodel_spec.rb
|
88
108
|
- spec/helpers/address_helper_spec.rb
|
89
109
|
- spec/helpers/csv_helper_spec.rb
|
90
110
|
- spec/helpers/roo_helper_spec.rb
|
@@ -116,7 +136,6 @@ signing_key:
|
|
116
136
|
specification_version: 3
|
117
137
|
summary: Library to generate Lime Go xml import format
|
118
138
|
test_files:
|
119
|
-
- spec/gosourceref_spec.rb
|
120
139
|
- spec/helpers/address_helper_spec.rb
|
121
140
|
- spec/helpers/csv_helper_spec.rb
|
122
141
|
- spec/helpers/roo_helper_spec.rb
|
data/lib/fruit_to_lime/column.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module FruitToLime
|
2
|
-
def self.map_column(column)
|
3
|
-
return {
|
4
|
-
:column=>column.column,
|
5
|
-
:selected=>column.selected
|
6
|
-
}
|
7
|
-
end
|
8
|
-
class Column
|
9
|
-
attr_accessor :column, :selected
|
10
|
-
def initialize(options=nil)
|
11
|
-
if options!=nil
|
12
|
-
@column = options[:column]
|
13
|
-
@selected = options[:selected]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
def []=(val, value)
|
17
|
-
case val
|
18
|
-
when 'column'
|
19
|
-
@column = value
|
20
|
-
when 'selected'
|
21
|
-
@selected = value
|
22
|
-
else
|
23
|
-
raise "Missing! #{val}"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
def [](val)
|
27
|
-
case val
|
28
|
-
when 'column'
|
29
|
-
return @column
|
30
|
-
when 'selected'
|
31
|
-
return @selected
|
32
|
-
else
|
33
|
-
raise "Missing! #{val}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
module FruitToLime
|
2
|
-
class GoSourceRef
|
3
|
-
attr_accessor :name, :id
|
4
|
-
def initialize(opt=nil)
|
5
|
-
if opt!=nil
|
6
|
-
@name = opt[:name]
|
7
|
-
@id = opt[:id]
|
8
|
-
else
|
9
|
-
@name =""
|
10
|
-
@id =""
|
11
|
-
end
|
12
|
-
end
|
13
|
-
def value
|
14
|
-
return to_s
|
15
|
-
end
|
16
|
-
def value=(str)
|
17
|
-
m = str.match(/([a-zA-Z]+)(\d+)/)
|
18
|
-
if !m
|
19
|
-
raise "Parse error!"
|
20
|
-
end
|
21
|
-
@name = m[1]
|
22
|
-
@id = m[2]
|
23
|
-
end
|
24
|
-
def self.parse(str)
|
25
|
-
v = GoSourceRef.new
|
26
|
-
v.value = str
|
27
|
-
return v
|
28
|
-
end
|
29
|
-
def self.can_parse(str)
|
30
|
-
begin
|
31
|
-
self.parse(str)
|
32
|
-
return true
|
33
|
-
rescue Exception => e
|
34
|
-
return false
|
35
|
-
end
|
36
|
-
end
|
37
|
-
def to_s
|
38
|
-
return "#{@name}#{@id}"
|
39
|
-
end
|
40
|
-
def ==(other)
|
41
|
-
return @name == other.name && @id == other.id
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class SourceRef
|
46
|
-
include SerializeHelper
|
47
|
-
attr_accessor :name, :id, :format
|
48
|
-
def serialize_variables
|
49
|
-
[:name, :id, :format].map { |prop| {:id=>prop,:type=>:string} }
|
50
|
-
end
|
51
|
-
def serialize_name
|
52
|
-
"ExternalSourceRef"
|
53
|
-
end
|
54
|
-
def get_import_rows
|
55
|
-
(serialize_variables+[{:id=>:value, :type=>:string}]).map do |p|
|
56
|
-
map_to_row p
|
57
|
-
end
|
58
|
-
end
|
59
|
-
def initialize(opt=nil)
|
60
|
-
if opt!=nil
|
61
|
-
serialize_variables.each do |myattr|
|
62
|
-
val = opt[myattr[:id]]
|
63
|
-
instance_variable_set("@"+myattr[:id].to_s,val) if val!=nil
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def to_s
|
69
|
-
return "#{@name}_#{@format}_#{@id}"
|
70
|
-
end
|
71
|
-
def ==(other)
|
72
|
-
return @name == other.name && @id == other.id && @format== other.format
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
data/spec/gosourceref_spec.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fruit_to_lime'
|
3
|
-
|
4
|
-
class T
|
5
|
-
def self.Par(str)
|
6
|
-
return "PXX#{str}"
|
7
|
-
end
|
8
|
-
def self.PAR
|
9
|
-
return "PXX"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe FruitToLime::GoSourceRef do
|
14
|
-
|
15
|
-
it "can parse simple par id" do
|
16
|
-
FruitToLime::GoSourceRef.parse(T.Par("123")).should eq FruitToLime::GoSourceRef.new({:name=>T.PAR,:id=> "123"})
|
17
|
-
end
|
18
|
-
|
19
|
-
it "can parse long id" do
|
20
|
-
FruitToLime::GoSourceRef.parse("PASE123").should eq FruitToLime::GoSourceRef.new({:name=>"PASE",:id=> "123"})
|
21
|
-
end
|
22
|
-
|
23
|
-
it "will fail for invalid id" do
|
24
|
-
expect { FruitToLime::GoSourceRef.parse("123") }.to raise_error
|
25
|
-
end
|
26
|
-
|
27
|
-
it "can render as expected id" do
|
28
|
-
FruitToLime::GoSourceRef.new({:name=>T.PAR,:id=> "123"}).to_s.should eq T.Par("123")
|
29
|
-
end
|
30
|
-
|
31
|
-
it "can verify a valid string" do
|
32
|
-
FruitToLime::GoSourceRef.can_parse(T.Par("123")).should eq true
|
33
|
-
end
|
34
|
-
|
35
|
-
it "can verify an invalid string" do
|
36
|
-
FruitToLime::GoSourceRef.can_parse("123").should eq false
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|