rbbt-util 5.21.56 → 5.21.57

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: 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