go_import 3.0.10 → 3.0.12

Sign up to get free protection for your applications and to get access to all the features.
data/bin/go-import CHANGED
@@ -42,6 +42,10 @@ class GoImportCommandLine < Thor
42
42
  :desc => "Name of the file where the converted source will be saved. This file should be sent to LIME Go. If the file already exist it will be replaced.",
43
43
  :type => :string,
44
44
  :required => false)
45
+ option(:ignore_missing_files,
46
+ :desc => "Output will be created even if the import contains missing files",
47
+ :type => :boolean,
48
+ :required => false)
45
49
  def run_import()
46
50
  if !is_valid_goimport_project?
47
51
  return
@@ -61,23 +65,58 @@ class GoImportCommandLine < Thor
61
65
  puts "WARNING: This means that files with an absolute path will be imported with their original path. Set this constant if you want to get files from the FILES_FOLDER directory."
62
66
  end
63
67
 
64
- is_ok, error_msg = can_be_serialized?(model)
68
+ is_ok, error_msg = can_be_serialized?(model, options.ignore_missing_files)
65
69
  if is_ok
70
+ if options.ignore_missing_files && model.documents.files.length > 0
71
+ log_and_remove_missing_files model
72
+ end
73
+
66
74
  go_data_zip = options.output.nil? == true ? "go.zip" : options.output
67
75
  model.save_to_zip(go_data_zip)
68
76
  puts "Source has been been converted into '#{go_data_zip}'."
69
77
  else
70
- puts "Source could not be converted due to"
78
+ puts "ERROR: Source could not be converted due to:"
71
79
  puts error_msg
80
+
81
+ if !options.ignore_missing_files &&
82
+ model.documents.files.any? {|file| !::File.exists?(file.path_for_project)}
83
+ puts "go-import detected missing files (see above), you can ignore these with the option --ignore-missing-files."
84
+ end
85
+ end
86
+ end
87
+
88
+ private
89
+ def log_and_remove_missing_files(model)
90
+ if model.documents.files.length > 0
91
+ puts "Trying to log files that can't be found..."
92
+ file_log_header = "name;integration_id;path;organization.integrationid;organization.name;deal.integrationid;deal.name"
93
+ file_log = ""
94
+ model.documents.files.each do |file|
95
+ if !::File.exists?(file.path_for_project)
96
+ file_log = "#{file_log}#{file.name};#{file.integration_id};#{file.path};#{file.organization.nil? ? '' : file.organization.integration_id};#{file.organization.nil? ? '' : file.organization.name};#{file.deal.nil? ? '' : file.deal.integration_id};#{file.deal.nil? ? '' : file.deal.name}\n"
97
+ model.documents.files.delete file
98
+ end
99
+ end
100
+
101
+ if file_log.length > 0
102
+ log_filename = 'go-import-missing-files.csv'
103
+ ::File.open(log_filename, 'w') { |f|
104
+ f.puts file_log_header
105
+ f.puts file_log
106
+ }
107
+ puts "WARNING: go-import has ignored files. Filenames of all ignored files has been written to '#{log_filename}'."
108
+ else
109
+ puts "All files are OK."
110
+ end
72
111
  end
73
112
  end
74
113
 
75
114
  private
76
- def can_be_serialized?(rootmodel)
115
+ def can_be_serialized?(rootmodel, ignore_missing_files)
77
116
  is_ok = false
78
117
  error = rootmodel.sanity_check
79
118
  if error.empty?
80
- error = rootmodel.validate
119
+ error = rootmodel.validate(ignore_missing_files)
81
120
 
82
121
  if error.empty?
83
122
  is_ok = true
@@ -15,9 +15,9 @@ module GoImport
15
15
 
16
16
  attr_reader :name
17
17
 
18
- # zip_path is used internally when the file is stored in the
19
- # zip file that is sent to LIME Go. You should not modify this
20
- # property
18
+ # location_in_zip_file is used internally when the file is
19
+ # stored in the zip file that is sent to LIME Go. You should
20
+ # not modify this property
21
21
  attr_accessor :location_in_zip_file
22
22
 
23
23
  def initialize(opt = nil)
@@ -150,17 +150,14 @@ module GoImport
150
150
  end
151
151
 
152
152
  def add_to_zip_file(zip_file)
153
- if has_relative_path?
154
- @location_in_zip_file = "files/#{@path}"
155
- else
156
- @location_in_zip_file = "files/__abs/#{SecureRandom.uuid}/#{::File.basename(@path).to_s}"
157
- end
153
+ @location_in_zip_file = "files/#{SecureRandom.uuid}#{::File.extname(@path).to_s}"
158
154
 
159
155
  zip_file.add(@location_in_zip_file, path_for_project)
160
156
  end
161
157
 
162
- def validate
158
+ def validate(ignore_missing_files = false)
163
159
  error = String.new
160
+ warning = String.new
164
161
 
165
162
  if @name.nil? || @name.empty?
166
163
  error = "#{error}A file must have a name.\n"
@@ -169,7 +166,7 @@ module GoImport
169
166
  if @path.nil? || @path.empty?
170
167
  error = "Path is required for file.\n"
171
168
  else
172
- if !::File.exists?(path_for_project())
169
+ if !ignore_missing_files && !::File.exists?(path_for_project())
173
170
  error = "#{error}Can't find file with name '#{@name}' and original path '#{@path}' at '#{path_for_project()}'."
174
171
  end
175
172
  end
@@ -304,7 +304,7 @@ module GoImport
304
304
  return error.strip
305
305
  end
306
306
 
307
- def validate()
307
+ def validate(ignore_missing_files = false)
308
308
  error = String.new
309
309
 
310
310
  @organizations.each do |o|
@@ -339,7 +339,7 @@ module GoImport
339
339
  end
340
340
 
341
341
  @documents.files.each do |file|
342
- validation_message = file.validate
342
+ validation_message = file.validate(ignore_missing_files)
343
343
  if !validation_message.empty?
344
344
  error = "#{error}\n#{validation_message}"
345
345
  end
@@ -174,7 +174,12 @@ def to_organization_document(row, rootmodel)
174
174
  file.name = row['Comment']
175
175
 
176
176
  file.created_by = rootmodel.find_coworker_by_integration_id(row['idUser-Created'])
177
- file.organization = rootmodel.find_organization_by_integration_id(row['idCompany'])
177
+
178
+ org = rootmodel.find_organization_by_integration_id(row['idCompany'])
179
+ if org.nil?
180
+ return nil
181
+ end
182
+ file.organization = org
178
183
 
179
184
  return file
180
185
  end
@@ -189,7 +194,12 @@ def from_project_document_to_organization_document(row, includes, rootmodel)
189
194
  file.created_by = rootmodel.find_coworker_by_integration_id(row['idUser-Created'])
190
195
 
191
196
  organization_id = includes[row['idProject']]
192
- file.organization = rootmodel.find_organization_by_integration_id(organization_id)
197
+ org = rootmodel.find_organization_by_integration_id(organization_id)
198
+ if org.nil?
199
+ return nil
200
+ end
201
+
202
+ file.organization = org
193
203
 
194
204
  return file
195
205
  end
data/spec/file_spec.rb CHANGED
@@ -27,16 +27,16 @@ describe "File" do
27
27
  file.validate.should eq ""
28
28
  end
29
29
 
30
- # it "fe" do
31
- # # given
32
- # FILES_FOLDER = "./files"
33
- # FILES_FOLDER_AT_CUSTOMER = ""
34
- # file.name = "Offert"
35
- # file.path = "spec/sample_data/offert.docx"
36
-
37
- # # when, then
30
+ it "is valid when it has name, invalid path, created_by and deal but ignores the path" do
31
+ # given
32
+ file.name = "Offert"
33
+ file.path = "c:\\mydocs\\offert.docx"
34
+ file.created_by = GoImport::CoworkerReference.new( { :integration_id => "123" } )
35
+ file.deal = GoImport::DealReference.new( { :integration_id => "456" } )
38
36
 
39
- # end
37
+ # when, then
38
+ file.validate(true).should eq ""
39
+ end
40
40
 
41
41
 
42
42
  it "is not valid when it has path and deal" do
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.10
4
+ version: 3.0.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-10-09 00:00:00.000000000 Z
15
+ date: 2014-10-17 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: iso_country_codes