go_import 3.0.39 → 3.0.40

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 10b4c342bbed4907bb37223c88ae78ca2dccdd99
4
- data.tar.gz: c441c76c21db917c6dbc7839565e7f1721494922
3
+ metadata.gz: 59427aef6763d25193bcb19a34b834207e0a1afa
4
+ data.tar.gz: 171379596422ffb7b8bf31d2d071ebb05682db26
5
5
  SHA512:
6
- metadata.gz: 4bf2826818be40929267eb8495265ad4b833dda32752cd9c9484683bcc17e2d5b01be9c728fbb9cd7a34d4de503d7d15310f6765369cb19d72cb78fcf416d1c5
7
- data.tar.gz: 3f5727edd5253712c0dfc7e296887d0e45c2be471a0511598edf63e69c07068662250e65a4ecff51046b0dfbd055dcfb5e2bb40d4f4b8b163582d2936595800b
6
+ metadata.gz: b8e6aa91dec72dbffe0bcf9d430b78a51c28208c60758a3dd85f959dce032b50d7f0f95402c4996eec20cace636173d7010a23909df1008c03ee983a9c33cfaf
7
+ data.tar.gz: f3d1e0faa54a918fce9136b5247f8af2dd6d9d6b06dffb895d9d3550d87cc24a9ba92a069f59f7b7e9ce125a5ccf3959dd468f5cb94b741b9a8cb264469fcc9f
data/bin/go-import CHANGED
@@ -67,6 +67,10 @@ class GoImportCommandLine < Thor
67
67
  :desc => "Name of the file to put imported documents in (default in same as --output)",
68
68
  :type => :string,
69
69
  :required => false)
70
+ option(:shard_size,
71
+ :desc => "Large imports are sharded into several zip-files. This property sets how many objects each zip-file should contain. Default is 25 000",
72
+ :type => :numeric,
73
+ :required => false)
70
74
  def run_import()
71
75
  if !options.log_to_file.nil?
72
76
  $stdout = File.new(options.log_to_file == "log_to_file" ? "go-import.log" : options.log_to_file, 'w')
@@ -99,14 +103,25 @@ class GoImportCommandLine < Thor
99
103
  log_and_remove_invalid_files model, max_file_size
100
104
  end
101
105
 
102
- go_data_zip = options.output.nil? == true ? "go.zip" : options.output
103
- go_files = options.output_documents.nil? == true ? nil : ::File.basename(options.output_documents,File.extname(options.output_documents))
104
- model.save_to_zip(go_data_zip, go_files)
105
- puts "Source has been been converted into '#{go_data_zip}'."
106
- puts " - and files into '#{go_files}.zip'." if !go_files.nil?
107
- if !warnings_msg.empty?
108
- puts "WARNINGS: "
109
- puts warnings_msg
106
+ puts "Starting sharding of model..."
107
+ sharder = GoImport::ShardHelper.new(options.shard_size)
108
+ models_to_serialize = sharder.shard_model(model)
109
+
110
+ if models_to_serialize.length > 1
111
+ puts "Import is large and will be broken into #{models_to_serialize.length} files"
112
+ end
113
+
114
+ models_to_serialize.each_with_index do |model, i|
115
+ go_data_zip = options.output.nil? == true ? "go" : options.output
116
+ go_data_zip += "_#{i}.zip"
117
+ go_files = options.output_documents.nil? == true ? nil : ::File.basename(options.output_documents,File.extname(options.output_documents))
118
+ model.save_to_zip(go_data_zip, go_files)
119
+ puts "Source has been been converted into '#{go_data_zip}'."
120
+ puts " - and files into '#{go_files}.zip'." if !go_files.nil?
121
+ if !warnings_msg.empty?
122
+ puts "WARNINGS: "
123
+ puts warnings_msg
124
+ end
110
125
  end
111
126
  else
112
127
  puts "ERROR: Source could not be converted due to:"
data/lib/go_import.rb CHANGED
@@ -16,4 +16,5 @@ module GoImport
16
16
  require 'go_import/excel_helper'
17
17
  require 'go_import/templating'
18
18
  require 'go_import/source'
19
+ require 'go_import/shard_helper'
19
20
  end
@@ -0,0 +1,96 @@
1
+ module GoImport
2
+ class ShardHelper
3
+
4
+ attr_accessor :shards, :current_shard_count, :current_shard
5
+
6
+ def initialize(shard_size = nil)
7
+ @shard_size = shard_size || 25000
8
+ setup()
9
+ end
10
+
11
+ def shard_model(model)
12
+ @current_shard.configuration = model.configuration
13
+
14
+ model.coworkers.each{ |key, coworker|
15
+ if coworker.integration_id != "import"
16
+ add_coworker(coworker)
17
+ end
18
+ }
19
+ model.organizations.each{|key, org| add_organization(org)}
20
+ model.deals.each{|key, deal| add_deal(deal)}
21
+ model.notes.each{|key, note| add_note(note)}
22
+ add_documents(model.documents)
23
+
24
+ return_value = @shards
25
+ setup()
26
+ return return_value
27
+ end
28
+
29
+ private
30
+ def setup()
31
+ @current_shard = GoImport::RootModel.new
32
+ @shards = [@current_shard]
33
+ @current_shard_count = 0
34
+ end
35
+
36
+ private
37
+ def add_note(note)
38
+ check_or_create_new_chard()
39
+ @current_shard.add_note(note)
40
+ @current_shard_count += 1
41
+ end
42
+
43
+ private
44
+ def add_deal(deal)
45
+ check_or_create_new_chard()
46
+ @current_shard.add_deal(deal)
47
+ @current_shard_count += 1
48
+ end
49
+
50
+ private
51
+ def add_coworker(coworker)
52
+ check_or_create_new_chard()
53
+ @current_shard.add_coworker(coworker)
54
+ @current_shard_count += 1
55
+ end
56
+
57
+ private
58
+ def add_organization(org)
59
+ check_or_create_new_chard()
60
+ if org.employees != nil
61
+ @current_shard_count += org.employees.length
62
+ end
63
+ @current_shard.add_organization(org)
64
+ @current_shard_count += 1
65
+ end
66
+
67
+ private
68
+ def add_documents(doc)
69
+ doc.files.each{|file| add_file(file)}
70
+ doc.links.each{|link| add_link(link)}
71
+ end
72
+
73
+ private
74
+ def add_file(file)
75
+ check_or_create_new_chard()
76
+ @current_shard.add_file(file)
77
+ @current_shard_count += 1
78
+ end
79
+
80
+ private
81
+ def add_link(link)
82
+ check_or_create_new_chard()
83
+ @current_shard.add_link(link)
84
+ @current_shard_count += 1
85
+ end
86
+
87
+ private
88
+ def check_or_create_new_chard()
89
+ if @current_shard_count > @shard_size
90
+ @current_shard = GoImport::RootModel.new
91
+ @shards.push(@current_shard)
92
+ @current_shard_count = 0
93
+ end
94
+ end
95
+ end
96
+ end
@@ -39,6 +39,7 @@ def convert_source
39
39
  if not row["NAMN"] == ""
40
40
  organization = converter.to_organization(row, rootmodel)
41
41
  rootmodel.add_organization(organization)
42
+ converter.organization_hook(row, organization, rootmodel) if defined? converter.organization_hook
42
43
  end
43
44
  end
44
45
  end
@@ -4,8 +4,8 @@ require_relative("../converter")
4
4
 
5
5
  # COWORKER_FILE and other file names should be defined ../converter.rb
6
6
 
7
- def process_rows(file_name)
8
- data = File.open(file_name, 'r').read.encode('UTF-8',"ISO-8859-1")
7
+ def process_rows(file_name, source_encoding)
8
+ data = File.read(file_name, :encoding => source_encoding)
9
9
  rows = GoImport::CsvHelper::text_to_hashes(data)
10
10
  rows.each do |row|
11
11
  yield row
@@ -22,28 +22,30 @@ def convert_source
22
22
  rootmodel = GoImport::RootModel.new
23
23
 
24
24
  converter.configure(rootmodel)
25
+ source_encoding = defined?(SOURCE_ENCODING) ? SOURCE_ENCODING : 'ISO-8859-1'
25
26
 
26
27
  # coworkers
27
28
  # start with these since they are referenced
28
29
  # from everywhere....
29
30
  if defined?(COWORKER_FILE) && !COWORKER_FILE.nil? && !COWORKER_FILE.empty?
30
- process_rows COWORKER_FILE do |row|
31
+ process_rows(COWORKER_FILE, source_encoding) do |row|
31
32
  rootmodel.add_coworker(converter.to_coworker(row))
32
33
  end
33
34
  end
34
35
 
35
36
  # organizations
36
37
  if defined?(ORGANIZATION_FILE) && !ORGANIZATION_FILE.nil? && !ORGANIZATION_FILE.empty?
37
- process_rows ORGANIZATION_FILE do |row|
38
+ process_rows(ORGANIZATION_FILE, source_encoding) do |row|
38
39
  organization = converter.to_organization(row, rootmodel)
39
40
  rootmodel.add_organization(organization)
41
+ converter.organization_hook(row, organization, rootmodel) if defined? converter.organization_hook
40
42
  end
41
43
  end
42
44
 
43
45
  # persons
44
46
  # depends on organizations
45
47
  if defined?(PERSON_FILE) && !PERSON_FILE.nil? && !PERSON_FILE.empty?
46
- process_rows PERSON_FILE do |row|
48
+ process_rows(PERSON_FILE, source_encoding) do |row|
47
49
  # adds it self to the employer
48
50
  converter.to_person(row, rootmodel)
49
51
  end
@@ -53,7 +55,7 @@ def convert_source
53
55
  # deals can reference coworkers (responsible), organizations
54
56
  # and persons (contact)
55
57
  if defined?(DEAL_FILE) && !DEAL_FILE.nil? && !DEAL_FILE.empty?
56
- process_rows DEAL_FILE do |row|
58
+ process_rows(DEAL_FILE, source_encoding) do |row|
57
59
  rootmodel.add_deal(converter.to_deal(row, rootmodel))
58
60
  end
59
61
  end
@@ -12,9 +12,16 @@ COWORKER_FILE = "data/coworkers.csv"
12
12
  ORGANIZATION_FILE = "data/organizations.csv"
13
13
  PERSON_FILE = "data/persons.csv"
14
14
  DEAL_FILE = "data/deals.csv"
15
-
16
15
  # Ie if you dont want to import deals, set DEAL_FILE = ""
17
16
 
17
+ # Default encoding for files are 'ISO-8859-1' (aka latin1)
18
+ # If the file is in any other encoding this must be specified with
19
+ # SOURCE_ENCODING set to correct value
20
+ # Ruby can handle lots of encodings, but common ones are:
21
+ # SOURCE_ENCODING = "UTF-8"
22
+ # SOURCE_ENCODING = "bom|UTF-8"
23
+ # SOURCE_ENCODING = "UTF-16"
24
+
18
25
  # If you are importing files then you must set the FILES_FOLDER
19
26
  # constant. FILES_FOLDER should point to the folder where the files
20
27
  # are stored. FILES_FOLDER can be relative to the project directory
@@ -35,6 +35,7 @@ def convert_source
35
35
  if defined?(ORGANIZATION_SHEET)
36
36
  if excel_workbook.has_sheet?(ORGANIZATION_SHEET)
37
37
  organization_rows = excel_workbook.rows_for_sheet ORGANIZATION_SHEET
38
+ converter.organization_hook(row, organization, rootmodel) if defined? converter.organization_hook
38
39
  else
39
40
  puts "WARNING: can't find sheet '#{ORGANIZATION_SHEET}'"
40
41
  end
@@ -30,10 +30,17 @@ class Converter
30
30
  # are :String and :Link. If no type is specified :String is
31
31
  # used as default.
32
32
 
33
+ # Organizastion
33
34
  # rootmodel.settings.with_organization do |organization|
34
35
  # organization.set_custom_field( { :integration_id => 'source', :title => 'Källa', :type => :Link } )
35
36
  # end
36
- end
37
+
38
+ #Person
39
+ #rootmodel.settings.with_person do |person|
40
+ # person.set_custom_field( { :integration_id => 'shoe_size', :title => 'Shoe Size', :type => :String} )
41
+ #end
42
+
43
+ end
37
44
 
38
45
  def import_person_to_organization(row, rootmodel)
39
46
  person = to_person(row, rootmodel)
@@ -36,6 +36,7 @@ def convert_source
36
36
  if defined?(ORGANIZATION_SHEET)
37
37
  if excel_workbook.has_sheet?(ORGANIZATION_SHEET)
38
38
  organization_rows = excel_workbook.rows_for_sheet ORGANIZATION_SHEET
39
+ converter.organization_hook(row, organization, rootmodel) if defined? converter.organization_hook
39
40
  else
40
41
  puts "WARNING: can't find sheet '#{ORGANIZATION_SHEET}'"
41
42
  end
@@ -51,6 +51,17 @@ class Converter
51
51
  # rootmodel.settings.with_organization do |organization|
52
52
  # organization.set_custom_field( { :integration_id => 'source', :title => 'Källa', :type => :Link } )
53
53
  # end
54
+
55
+ # rootmodel.settings.with_person do |person|
56
+ # person.set_custom_field( { :integration_id => 'shoe_size', :title => 'Shoe size', :type => :String} )
57
+ # end
58
+
59
+ # rootmodel.settings.with_deal do |deal|
60
+ # assessment is default DealState::NoEndState
61
+ # deal.add_status( {:label => '1. Kvalificering' })
62
+ # deal.add_status( {:label => '2. Deal closed', :assessment => GoImport::DealState::PositiveEndState })
63
+ # deal.add_status( {:label => '4. Deal lost', :assessment => GoImport::DealState::NegativeEndState })
64
+ # end
54
65
  end
55
66
 
56
67
  def import_person_to_organization(row, rootmodel)
@@ -67,14 +67,39 @@ FILES_FOLDER_AT_CUSTOMER = "m:\\documents\\"
67
67
  class Converter
68
68
  # Reads a row from the Easy exported Company.txt
69
69
  # and ads custom fields to the go_import organization.
70
-
71
- # NOTE!!! You should customize this method to include
70
+ # NOTE!!! You should customize this method to include
72
71
  # and transform the fields you want to import to LIME Go.
73
72
  # The method includes examples of different types of
74
73
  # fields and how you should handle them.
75
74
  # Sometimes it's enough to uncomment some code and
76
75
  # change the row name but in most cases you need to
77
76
  # do some thinking of your own.
77
+
78
+ def configure(rootmodel)
79
+ #####################################################################
80
+ ## LIME Go custom fields.
81
+ # This is how you add a custom field in LIME Go.
82
+ # Custom fields can be added to organization, deal and person.
83
+ # Valid types are :String and :Link. If no type is specified
84
+ # :String is used as default.
85
+
86
+ #rootmodel.settings.with_organization do |organization|
87
+ #organization.set_custom_field( { :integration_id => 'building_size', :title => 'Building Size', :type => :String } )
88
+ #end
89
+
90
+ # rootmodel.settings.with_person do |person|
91
+ # person.set_custom_field( { :integration_id => 'shoe_size', :title => 'Shoe size', :type => :String} )
92
+ # end
93
+
94
+ # rootmodel.settings.with_deal do |deal|
95
+ # assessment is default DealState::NoEndState
96
+ # deal.add_status( {:label => '1. Kvalificering' })
97
+ # deal.add_status( {:label => '2. Deal closed', :assessment => GoImport::DealState::PositiveEndState })
98
+ # deal.add_status( {:label => '4. Deal lost', :assessment => GoImport::DealState::NegativeEndState })
99
+ # end
100
+ end
101
+
102
+
78
103
  def to_organization(organization, row)
79
104
  # Here are some standard fields that are present
80
105
  # on a LIME Go organization and are usually represented
@@ -315,25 +340,7 @@ class Converter
315
340
  # return classification
316
341
  end
317
342
 
318
- def configure(rootmodel)
319
- #####################################################################
320
- ## LIME Go custom fields.
321
- # This is how you add a custom field in LIME Go.
322
- # Custom fields can be added to organization, deal and person.
323
- # Valid types are :String and :Link. If no type is specified
324
- # :String is used as default.
325
-
326
- # rootmodel.settings.with_person do |person|
327
- # person.set_custom_field( { :integration_id => 'shoe_size', :title => 'Shoe size', :type => :String} )
328
- # end
329
-
330
- # rootmodel.settings.with_deal do |deal|
331
- # assessment is default DealState::NoEndState
332
- # deal.add_status( {:label => '1. Kvalificering' })
333
- # deal.add_status( {:label => '2. Deal closed', :assessment => GoImport::DealState::PositiveEndState })
334
- # deal.add_status( {:label => '4. Deal lost', :assessment => GoImport::DealState::NegativeEndState })
335
- # end
336
- end
343
+
337
344
 
338
345
  # HOOKS
339
346
  #
@@ -108,6 +108,7 @@ def convert_source
108
108
  con.fetch_data "company" do |row|
109
109
  organization = init_organization(row, con.get_class_by_name('company'), rootmodel)
110
110
  rootmodel.add_organization(converter.to_organization(organization, row))
111
+ converter.organization_hook(row, organization, rootmodel) if defined? converter.organization_hook
111
112
  end
112
113
 
113
114
  # persons
@@ -115,6 +115,8 @@ def account_to_organization(row, rootmodel)
115
115
 
116
116
  organization.responsible_coworker =
117
117
  rootmodel.find_coworker_by_integration_id(row['OwnerId'])
118
+
119
+ converter.organization_hook(row, organization, rootmodel) if defined? converter.organization_hook
118
120
 
119
121
  return organization
120
122
  end
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+ require 'go_import'
3
+
4
+ describe GoImport::ShardHelper do
5
+ it "should shard 50 objects of a single type into two shards" do
6
+ # given
7
+ model = GoImport::RootModel.new
8
+
9
+ (1..50).each do |n|
10
+ organization = GoImport::Organization.new
11
+ organization.name = "Ankeborgs bibliotek"
12
+ organization.integration_id = n.to_s
13
+ model.add_organization(organization)
14
+ end
15
+
16
+ sharder = GoImport::ShardHelper.new(25)
17
+
18
+ # when, the
19
+ sharder.shard_model(model).length.should eq 2
20
+ end
21
+
22
+ it "should shard 60 objects of different type into three shards" do
23
+ # given
24
+ model = GoImport::RootModel.new
25
+
26
+ (1..10).each do |n|
27
+ organization = GoImport::Organization.new
28
+ organization.name = "Ankeborgs bibliotek"
29
+ organization.integration_id = n.to_s
30
+
31
+ person = GoImport::Person.new
32
+ person.first_name = "Kalle"
33
+ person.last_name = "Kula"
34
+ organization.add_employee(person)
35
+
36
+ person = GoImport::Person.new
37
+ person.first_name = "Nisse"
38
+ person.last_name = "Nice"
39
+ organization.add_employee(person)
40
+
41
+ model.add_organization(organization)
42
+ end
43
+
44
+ (1..10).each do |n|
45
+ deal = GoImport::Deal.new
46
+ deal.name = "Big deal"
47
+ deal.integration_id = n.to_s
48
+ model.add_deal(deal)
49
+ end
50
+
51
+ (1..10).each do |n|
52
+ note = GoImport::Note.new
53
+ note.text = "Important note"
54
+ model.add_note(note)
55
+ end
56
+
57
+ (1..10).each do |n|
58
+ link = GoImport::Link.new
59
+ link.url = "https://go.lime-go.com"
60
+ link.name = "Our url"
61
+ model.add_link(link)
62
+ end
63
+
64
+ sharder = GoImport::ShardHelper.new(20)
65
+
66
+ # when, then
67
+ sharder.shard_model(model).length.should eq 3
68
+ end
69
+
70
+ it "should be able to change the shard size" do
71
+ # given
72
+ model = GoImport::RootModel.new
73
+
74
+ (1..20).each do |n|
75
+ organization = GoImport::Organization.new
76
+ organization.name = "Ankeborgs bibliotek"
77
+ organization.integration_id = n.to_s
78
+ model.add_organization(organization)
79
+ end
80
+
81
+ sharder = GoImport::ShardHelper.new(5)
82
+
83
+ # when, then
84
+ sharder.shard_model(model).length.should eq 4
85
+ end
86
+
87
+ it "should add an organization into a shard" do
88
+ # given
89
+
90
+ model = GoImport::RootModel.new
91
+
92
+ organization = GoImport::Organization.new
93
+ organization.name = "Ankeborgs bibliotek"
94
+ organization.integration_id = "123"
95
+
96
+ sharder = GoImport::ShardHelper.new()
97
+ model.add_organization(organization)
98
+
99
+ # when, then
100
+ sharder.shard_model(model)[0].find_organization_by_integration_id("123").should eq organization
101
+ end
102
+
103
+ it "should add a deal into a shard" do
104
+ # given
105
+
106
+ model = GoImport::RootModel.new
107
+
108
+ deal = GoImport::Deal.new
109
+ deal.name = "Big deal"
110
+ deal.integration_id = "123"
111
+
112
+ sharder = GoImport::ShardHelper.new()
113
+ model.add_deal(deal)
114
+
115
+ # when, then
116
+ sharder.shard_model(model)[0].find_deal_by_integration_id("123").should eq deal
117
+ end
118
+
119
+ end
120
+
121
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: go_import
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.39
4
+ version: 3.0.40
5
5
  platform: ruby
6
6
  authors:
7
7
  - Petter Sandholdt
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2016-02-17 00:00:00.000000000 Z
15
+ date: 2016-04-06 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: iso_country_codes
@@ -211,6 +211,7 @@ files:
211
211
  - lib/go_import/phone_helper.rb
212
212
  - lib/go_import/roo_helper.rb
213
213
  - lib/go_import/serialize_helper.rb
214
+ - lib/go_import/shard_helper.rb
214
215
  - lib/go_import/source.rb
215
216
  - lib/go_import/templating.rb
216
217
  - sources/VISMA/.gitignore
@@ -288,6 +289,7 @@ files:
288
289
  - spec/helpers/phone_helper_spec.rb
289
290
  - spec/helpers/roo_helper_spec.rb
290
291
  - spec/helpers/serialize_helper_spec.rb
292
+ - spec/helpers/shard_helper_spec.rb
291
293
  - spec/helpers/xsd_validate_spec.rb
292
294
  - spec/link_spec.rb
293
295
  - spec/note_spec.rb
@@ -333,6 +335,7 @@ test_files:
333
335
  - spec/helpers/phone_helper_spec.rb
334
336
  - spec/helpers/roo_helper_spec.rb
335
337
  - spec/helpers/serialize_helper_spec.rb
338
+ - spec/helpers/shard_helper_spec.rb
336
339
  - spec/helpers/xsd_validate_spec.rb
337
340
  - spec/link_spec.rb
338
341
  - spec/note_spec.rb