rbbt-util 5.21.56 → 5.21.57

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c9f3400dbfe429698356deea0dcd2f0a8232662a
4
- data.tar.gz: 7d05e712c84d010cd1d4ca076f0036d505b2d8e0
3
+ metadata.gz: 92a11a2f42a6597852eb74111dc2355f6704ac1f
4
+ data.tar.gz: 15716a971a9ea69dc92a86ea9d9adfb76bea6d44
5
5
  SHA512:
6
- metadata.gz: a29f6431499cdd7a4c72361ab8c1d1f6c6d17300e9cdd9f3f67ae113d8bc2bdb20f22fc2161da7f27a602b5d44be7b5073fb7814cb5f679040b3ee7db785fe6e
7
- data.tar.gz: dda6fe83af93525aeff78ed47b00c36664accf5ee6be95214dbad5b115ccffb72dfd0e0a1f5e2830757267c9980710464602fe6df3ae4f8601cd111757a8cf92
6
+ metadata.gz: da503c49cffbf5dd1c1f438e51ff196c0167c2718a7e2856267b84117e042065fef188666ea9e60c9c14da8e3773452941fbd65207fdfb190eb577595142a568
7
+ data.tar.gz: 499e01ccd183f9993386d4c4ba129b015189512a4f33551b651f0e4c20ef2ab80e5cfb5a5ab05e825d17b08e62ecdbfdae5584d0d16e108257a302e530761f59
@@ -1,14 +1,42 @@
1
1
  require 'spreadsheet'
2
+ require 'rubyXL'
3
+
2
4
  module TSV
3
- def self.excel(tsv, filename, options ={})
5
+
6
+ def self._remove_link(value)
7
+ if value =~ /<([\w]+)[^>]*>(.*?)<\/\1>/
8
+ $2
9
+ else
10
+ value
11
+ end
12
+ end
13
+
14
+ def self._clean_float(v)
15
+ case v
16
+ when Float
17
+ v.to_s.sub(/e(-?\d+)$/,'E\1')
18
+ when String
19
+ if v =~ /^-?[\d\.]+e(-?\d+)$/
20
+ v.sub(/e(-?\d+)$/,'E\1')
21
+ else
22
+ v
23
+ end
24
+ else
25
+ v
26
+ end
27
+ end
28
+
29
+
30
+ def self._excel_data(tsv, options ={})
31
+ options = Misc.add_defaults options, :sep2 => ', '
32
+
4
33
  name = Misc.process_options options, :name
34
+ sep2 = Misc.process_options options, :sep2
35
+ unmerge = Misc.process_options options, :unmerge
5
36
  sort_by = Misc.process_options options, :sort_by
6
37
  sort_by_cast = Misc.process_options options, :sort_by_cast
7
- fields = Misc.process_options(options, :fields) || tsv.all_fields
38
+ remove_links = Misc.process_options options, :remove_links
8
39
 
9
- book = Spreadsheet::Workbook.new
10
- sheet1 = book.create_worksheet
11
- sheet1.row(0).concat fields
12
40
  i = 1
13
41
  if sort_by
14
42
  if sort_by_cast
@@ -26,7 +54,8 @@ module TSV
26
54
  data = tsv
27
55
  end
28
56
 
29
- data.each do |key, values|
57
+ rows = []
58
+ data.through do |key, values|
30
59
  cells = []
31
60
  cells.push((name and key.respond_to?(:name)) ? key.name || key : key )
32
61
 
@@ -34,86 +63,173 @@ module TSV
34
63
  values.each do |value|
35
64
  v = (name and value.respond_to?(:name)) ? value.name || value : value
36
65
  if Array === v
37
- cells.push v * ", "
66
+ v = v.collect{|_v| _remove_link(_v)} if remove_links
67
+ v = v.collect{|_v| _clean_float(_v)}
68
+ if unmerge
69
+ cells.push v
70
+ else
71
+ cells.push v * sep2
72
+ end
38
73
  else
74
+ v = remove_link(v) if remove_links
39
75
  cells.push v
40
76
  end
41
77
  end
42
78
 
43
- sheet1.row(i).concat cells
79
+ rows << cells
44
80
  i += 1
45
81
  end
46
- book.write filename
82
+ if unmerge
83
+ new_rows = []
84
+ rows.each do |row|
85
+ header = row.shift
86
+ Misc.zip_fields(row).each do |values|
87
+ new_rows << [header] + values
88
+ end
89
+ end
90
+ rows = new_rows
91
+ end
92
+ [tsv.all_fields, rows]
47
93
  end
48
94
 
49
- def remove_link(value)
50
- if value =~ /<([\w]+)[^>]*>(.*?)<\/\1>/
51
- $2
52
- else
53
- value
95
+ module XLS
96
+ def self.read(file, options = {})
97
+ options = Misc.add_defaults options, :sep2 => /[,|]\s?/
98
+ sheet = Misc.process_options options, :sheet
99
+ header = Misc.process_options options, :header
100
+
101
+ header = true unless header == false
102
+ sheet ||= 0
103
+ TmpFile.with_file do |filename|
104
+ workbook = Spreadsheet.open Open.open(file)
105
+ sheet = workbook.worksheet sheet
106
+
107
+ rows = []
108
+
109
+ sheet.each do |row|
110
+ rows << row.values_at(0..(row.size - 1))
111
+ end
112
+
113
+ File.open(filename, 'w') do |f|
114
+ if header
115
+ header = rows.shift
116
+ f.puts "#" + header * "\t"
117
+ end
118
+
119
+ rows.each do |row| f.puts row * "\t" end
120
+ end
121
+
122
+ TSV.open(filename, options)
123
+ end
124
+ end
125
+
126
+ def self.write(tsv, file, options = {})
127
+ options = Misc.add_defaults options, :sheet => "Sheet1"
128
+ sheet = Misc.process_options options, :sheet
129
+ fields, rows = TSV._excel_data(tsv, options)
130
+
131
+ book = Spreadsheet::Workbook.new
132
+ sheet1 = book.create_worksheet
133
+ sheet1.name = sheet if sheet
134
+
135
+ sheet1.row(0).concat fields
136
+
137
+ rows.each_with_index do |cells,i|
138
+ sheet1.row(i+1).concat cells
139
+ end
140
+
141
+ book.write file
54
142
  end
55
143
  end
56
144
 
57
- def excel(filename, options ={})
58
- name = Misc.process_options options, :name
59
- sort_by = Misc.process_options options, :sort_by
60
- sort_by_cast = Misc.process_options options, :sort_by_cast
61
- remove_links = Misc.process_options options, :remove_links
145
+ module XLSX
146
+ def self.read(file, options = {})
147
+ options = Misc.add_defaults options, :sep2 => /[,|]\s?/
148
+ sheet = Misc.process_options options, :sheet
149
+ header = Misc.process_options options, :header
62
150
 
63
- book = Spreadsheet::Workbook.new
64
- sheet1 = book.create_worksheet
65
- sheet1.row(0).concat all_fields
66
- i = 1
67
- if sort_by
68
- if sort_by_cast
69
- data = self.sort_by sort_by do |k, v|
70
- if Array === v
71
- v.first.send(sort_by_cast)
72
- else
73
- v.send(sort_by_cast)
151
+ header = true unless header == false
152
+ TmpFile.with_file do |filename|
153
+ workbook = RubyXL::Parser.parse file
154
+ sheet = sheet ? workbook[sheet] : workbook.worksheets.first
155
+
156
+ rows = []
157
+
158
+ sheet.each do |row|
159
+ rows << row.cells.collect{|c| c.value}
160
+ end
161
+
162
+ File.open(filename, 'w') do |f|
163
+ if header
164
+ header = rows.shift
165
+ f.puts "#" + header * "\t"
74
166
  end
167
+
168
+ rows.each do |row| f.puts row * "\t" end
75
169
  end
76
- else
77
- data = self.sort_by sort_by
170
+
171
+ TSV.open(filename, options)
78
172
  end
79
- else
80
- data = self
81
173
  end
82
174
 
83
- data.through do |key, values|
84
- cells = []
85
- cells.push((name and key.respond_to?(:name)) ? key.name || key : key )
175
+ def self.write(tsv, file, options = {})
176
+ sheet = Misc.process_options options, :sheet
86
177
 
87
- values = [values] unless Array === values
88
- values.each do |value|
89
- v = (name and value.respond_to?(:name)) ? value.name || value : value
90
- if Array === v
91
- v = v.collect{|_v| remove_link(_v)} if remove_links
92
- cells.push v * ", "
93
- else
94
- v = remove_link(v) if remove_links
95
- cells.push v
96
- end
178
+ fields, rows = TSV._excel_data(tsv, options)
179
+
180
+ book = RubyXL::Workbook.new
181
+ sheet1 = book.worksheets.first
182
+ sheet1.sheet_name = sheet if sheet
183
+
184
+ fields.each_with_index do |e,i|
185
+ sheet1.add_cell(0, i, e)
97
186
  end
98
187
 
99
- cells = cells.collect do |v|
100
- case v
101
- when Float
102
- v.to_s.sub(/e(-?\d+)$/,'E\1')
103
- when String
104
- if v =~ /^-?[\d\.]+e(-?\d+)$/
105
- v.sub(/e(-?\d+)$/,'E\1')
106
- else
107
- v
108
- end
109
- else
110
- v
188
+ rows.each_with_index do |cells,i|
189
+ cells.each_with_index do |e,j|
190
+ sheet1.add_cell(i+1, j, e)
111
191
  end
112
192
  end
113
193
 
114
- sheet1.row(i).concat cells
115
- i += 1
194
+ book.write file
195
+ end
196
+ end
197
+
198
+ def xls(filename, options ={})
199
+ TSV::XLS.write(self, filename, options)
200
+ end
201
+
202
+ def xlsx(filename, options ={})
203
+ TSV::XLSX.write(self, filename, options)
204
+ end
205
+
206
+ def excel(filename, options ={})
207
+ if filename =~ /\.xlsx$/
208
+ xlsx(filename, options)
209
+ else
210
+ xls(filename, options)
116
211
  end
117
- book.write filename
118
212
  end
213
+
214
+
215
+ def self.xls(filename, options ={})
216
+ TSV::XLS.read(filename, options)
217
+ end
218
+
219
+ def self.xlsx(filename, options ={})
220
+ TSV::XLSX.read(filename, options)
221
+ end
222
+
223
+ def self.excel(filename, options = {})
224
+ if filename =~ /\.xlsx$/
225
+ xlsx(filename, options)
226
+ else
227
+ xls(filename, options)
228
+ end
229
+ end
230
+
231
+ def self.excel2tsv(filename, options ={})
232
+ excel(filename, options={})
233
+ end
234
+
119
235
  end
@@ -1,33 +1,2 @@
1
- require 'spreadsheet'
2
- require 'rbbt/tsv'
3
- require 'rbbt/util/tmpfile'
4
-
5
- module TSV
6
- def self.excel2tsv(file, options = {})
7
- sheet = options.delete :sheet
8
- header = options.delete :header
9
- header = true unless header == false
10
- sheet ||= 0
11
- TmpFile.with_file do |filename|
12
- workbook = Spreadsheet.open Open.open(file)
13
- sheet = workbook.worksheet sheet
14
-
15
- rows = []
16
-
17
- sheet.each do |row|
18
- rows << row.values_at(0..(row.size - 1))
19
- end
20
-
21
- File.open(filename, 'w') do |f|
22
- if header
23
- header = rows.shift
24
- f.puts "#" + header * "\t"
25
- end
26
-
27
- rows.each do |row| f.puts row * "\t" end
28
- end
29
-
30
- TSV.open(filename, options)
31
- end
32
- end
33
- end
1
+ Log.warn "File #{__FILE__} is deprecated, please require 'rbbt/tsv/excel' instead"
2
+ require 'rbbt/tsv/excel'
@@ -208,6 +208,7 @@ module Open
208
208
  if (dir_sub_path = find_repo_dir(file))
209
209
  stream = get_stream_from_repo(*dir_sub_path)
210
210
  else
211
+ file = file.find if Path === file
211
212
  stream = File.open(file, mode)
212
213
  end
213
214
 
@@ -13,7 +13,7 @@ Use - to read from STDIN
13
13
  -k--key_field* Key field
14
14
  -f--fields* Fields
15
15
  -t--type* Type
16
- -m--merge* Merge from multiple rows
16
+ -m--merge Merge from multiple rows
17
17
  -h--help Print this help
18
18
 
19
19
  EOF
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt-util'
4
+ require 'rbbt/util/simpleopt'
5
+
6
+ $0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
7
+
8
+ options = SOPT.setup <<EOF
9
+
10
+ Description
11
+
12
+ $ rbbt tsv read_excel [options] <filename.xls|filename.xlsx>
13
+
14
+ Use - to read from STDIN
15
+
16
+ -k--key_field* Key field
17
+ -f--fields* Fields
18
+ -t--type* Type
19
+ -m--merge Merge from multiple rows
20
+ -s2--sep2* Second level separator. Default /[,|]\\s?/
21
+ -h--help Print this help
22
+
23
+ EOF
24
+ if options[:help]
25
+ if defined? rbbt_usage
26
+ rbbt_usage
27
+ else
28
+ puts SOPT.doc
29
+ end
30
+ exit 0
31
+ end
32
+
33
+ excelfile = ARGV.first
34
+
35
+ raise ParameterException, "No excel file given" if excelfile.nil?
36
+
37
+ require 'rbbt/tsv/excel'
38
+ puts TSV.excel(excelfile, options).to_s
39
+
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt-util'
4
+ require 'rbbt/util/simpleopt'
5
+
6
+ $0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
7
+
8
+ options = SOPT.setup <<EOF
9
+
10
+ Description
11
+
12
+ $ rbbt tsv write_excel [options] <filename.tsv|-> <filename.xls|filename.xlsx>
13
+
14
+ Use - to read from STDIN
15
+
16
+ -k--key_field* Key field
17
+ -f--fields* Fields
18
+ -t--type* Type
19
+ -m--merge Merge from multiple rows
20
+ -um--unmerge Write the results unmerged
21
+ -W--workflows* Load a list of workflows
22
+ -R--requires* Require a list of files
23
+ -n--name Transform entities to human readible names
24
+ -h--help Print this help
25
+
26
+ EOF
27
+ if options[:help]
28
+ if defined? rbbt_usage
29
+ rbbt_usage
30
+ else
31
+ puts SOPT.doc
32
+ end
33
+ exit 0
34
+ end
35
+
36
+ if options[:workflows]
37
+ require 'rbbt/workflow'
38
+ workflows = options[:workflows].split(',')
39
+ workflows.each do |workflow|
40
+ workflow.strip!
41
+ Workflow.require_workflow workflow
42
+ end
43
+ end
44
+
45
+ if options[:requires]
46
+ requires = options[:requires].split(',')
47
+ requires.each do |req|
48
+ req.strip!
49
+ require req
50
+ end
51
+ end
52
+
53
+ tsvfile, excelfile = ARGV
54
+
55
+ excelfile, tsvfile = tsvfile, nil if excelfile.nil? and tsvfile =~ /\.(xls|xlsx)$/
56
+
57
+ raise ParameterException, "No files given" if tsvfile.nil? and excelfile.nil?
58
+ raise ParameterException, "No excel file given" if excelfile.nil?
59
+
60
+ require 'rbbt/tsv/excel'
61
+ TSV.open(tsvfile, options).excel(excelfile, options)
62
+
@@ -0,0 +1,137 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
+ require 'rbbt/tsv/excel'
3
+
4
+ class TestExcel < Test::Unit::TestCase
5
+ def _test_xls
6
+ content =<<-EOF
7
+ #Id ValueA ValueB OtherID
8
+ row1 a|aa|aaa b Id1|Id2
9
+ row2 A B Id3
10
+ EOF
11
+
12
+ TmpFile.with_file(content) do |filename|
13
+ tsv = TSV.open(filename, :sep => /\s+/)
14
+ TmpFile.with_file(nil, true, :extension => 'xlsx') do |excelfile|
15
+ tsv.xls(excelfile)
16
+ new = TSV.xls(excelfile)
17
+ assert_equal %w(row1 row2), new.keys.sort
18
+ end
19
+ end
20
+ end
21
+
22
+ def _test_xlsx
23
+ content =<<-EOF
24
+ #Id ValueA ValueB OtherID
25
+ row1 a|aa|aaa b Id1|Id2
26
+ row2 A B Id3
27
+ EOF
28
+
29
+ TmpFile.with_file(content) do |filename|
30
+ tsv = TSV.open(filename, :sep => /\s+/)
31
+ TmpFile.with_file(nil, true, :extension => 'xlsx') do |excelfile|
32
+ tsv.xlsx(excelfile, :sheet => "Sheet1")
33
+ new = TSV.xlsx(excelfile, :sheet => "Sheet1")
34
+ assert_equal %w(row1 row2), new.keys.sort
35
+ end
36
+ end
37
+ end
38
+
39
+ def _test_excel
40
+ content =<<-EOF
41
+ #Id ValueA ValueB OtherID
42
+ row1 a|aa|aaa b Id1|Id2
43
+ row2 A B Id3
44
+ EOF
45
+
46
+ TmpFile.with_file(content) do |filename|
47
+ tsv = TSV.open(filename, :sep => /\s+/)
48
+ TmpFile.with_file(nil, true, :extension => 'xlsx') do |excelfile|
49
+ tsv.xlsx(excelfile, :sheet => "Sheet1")
50
+ new = TSV.excel(excelfile, :sheet => "Sheet1")
51
+ assert_equal %w(row1 row2), new.keys.sort
52
+ new = TSV.xlsx(excelfile, :sheet => "Sheet1")
53
+ assert_equal %w(row1 row2), new.keys.sort
54
+ end
55
+
56
+ TmpFile.with_file(nil, true, :extension => 'xls') do |excelfile|
57
+ tsv.xls(excelfile, :sheet => "Sheet1")
58
+ new = TSV.excel(excelfile, :sheet => "Sheet1")
59
+ assert_equal %w(row1 row2), new.keys.sort
60
+ new = TSV.xls(excelfile, :sheet => "Sheet1")
61
+ assert_equal %w(row1 row2), new.keys.sort
62
+ end
63
+ end
64
+ end
65
+
66
+ def _test_excel_sheets
67
+ content =<<-EOF
68
+ #Id ValueA ValueB OtherID
69
+ row1 a|aa|aaa b Id1|Id2
70
+ row2 A B Id3
71
+ EOF
72
+
73
+ TmpFile.with_file(content) do |filename|
74
+ tsv = TSV.open(filename, :sep => /\s+/)
75
+
76
+ TmpFile.with_file(nil, false, :extension => 'xlsx') do |excelfile|
77
+ tsv.xlsx(excelfile)
78
+ new = TSV.excel(excelfile)
79
+ assert_equal %w(row1 row2), new.keys.sort
80
+
81
+ tsv.xlsx(excelfile, :sheet => "Test")
82
+ new = TSV.excel(excelfile, :sheet => "Test")
83
+ assert_equal %w(row1 row2), new.keys.sort
84
+
85
+ tsv.xlsx(excelfile, :sheet => "Test")
86
+ new = TSV.excel(excelfile)
87
+ assert_equal %w(row1 row2), new.keys.sort
88
+
89
+ tsv.xlsx(excelfile)
90
+ new = TSV.excel(excelfile, :sheet => "Sheet1")
91
+ assert_equal %w(row1 row2), new.keys.sort
92
+ end
93
+
94
+
95
+ TmpFile.with_file(nil, false, :extension => 'xls') do |excelfile|
96
+ tsv.xls(excelfile)
97
+ new = TSV.excel(excelfile)
98
+ assert_equal %w(row1 row2), new.keys.sort
99
+
100
+ tsv.xls(excelfile, :sheet => "Test")
101
+ new = TSV.excel(excelfile, :sheet => "Test")
102
+ assert_equal %w(row1 row2), new.keys.sort
103
+
104
+ tsv.xls(excelfile, :sheet => "Test")
105
+ new = TSV.excel(excelfile)
106
+ assert_equal %w(row1 row2), new.keys.sort
107
+
108
+ tsv.xls(excelfile)
109
+ new = TSV.excel(excelfile, :sheet => "Sheet1")
110
+ assert_equal %w(row1 row2), new.keys.sort
111
+ end
112
+ end
113
+ end
114
+
115
+ def test_excel_unmerge
116
+ content =<<-EOF
117
+ #Id ValueA ValueB OtherID
118
+ row1 a|aa b|bb Id1|Id2
119
+ row2 A B Id3
120
+ EOF
121
+
122
+ TmpFile.with_file(content) do |filename|
123
+ tsv = TSV.open(filename, :sep => /\s+/)
124
+
125
+ TmpFile.with_file(nil, false, :extension => 'xlsx') do |excelfile|
126
+ tsv.xlsx(excelfile, :unmerge => true)
127
+
128
+ new = TSV.excel(excelfile, :merge => false)
129
+ assert_equal %w(a), new["row1"]["ValueA"]
130
+
131
+ new = TSV.excel(excelfile, :merge => true)
132
+ assert_equal %w(a aa), new["row1"]["ValueA"]
133
+ end
134
+ end
135
+ end
136
+ end
137
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.21.56
4
+ version: 5.21.57
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-24 00:00:00.000000000 Z
11
+ date: 2016-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -360,11 +360,13 @@ files:
360
360
  - share/rbbt_commands/tsv/json
361
361
  - share/rbbt_commands/tsv/query
362
362
  - share/rbbt_commands/tsv/read
363
+ - share/rbbt_commands/tsv/read_excel
363
364
  - share/rbbt_commands/tsv/slice
364
365
  - share/rbbt_commands/tsv/sort
365
366
  - share/rbbt_commands/tsv/subset
366
367
  - share/rbbt_commands/tsv/unzip
367
368
  - share/rbbt_commands/tsv/values
369
+ - share/rbbt_commands/tsv/write_excel
368
370
  - share/rbbt_commands/tsv/zip
369
371
  - share/rbbt_commands/watch
370
372
  - share/rbbt_commands/workflow/cmd
@@ -421,6 +423,7 @@ files:
421
423
  - test/rbbt/tsv/test_accessor.rb
422
424
  - test/rbbt/tsv/test_attach.rb
423
425
  - test/rbbt/tsv/test_change_id.rb
426
+ - test/rbbt/tsv/test_excel.rb
424
427
  - test/rbbt/tsv/test_field_index.rb
425
428
  - test/rbbt/tsv/test_filter.rb
426
429
  - test/rbbt/tsv/test_index.rb
@@ -559,6 +562,7 @@ test_files:
559
562
  - test/rbbt/tsv/test_parser.rb
560
563
  - test/rbbt/tsv/test_stream.rb
561
564
  - test/rbbt/tsv/test_util.rb
565
+ - test/rbbt/tsv/test_excel.rb
562
566
  - test/rbbt/tsv/test_accessor.rb
563
567
  - test/rbbt/tsv/test_filter.rb
564
568
  - test/rbbt/tsv/test_attach.rb