twb 3.9.7 → 4.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/twb.rb +5 -2
- data/lib/twb/analysis/CalculatedFields/CalculatedFieldsAnalyzer.rb +54 -34
- data/lib/twb/analysis/CalculatedFields/MarkdownEmitter.rb +24 -2
- data/lib/twb/analysis/DataSources/categoricalColorCodingAnalyzer.rb +99 -0
- data/lib/twb/analysis/DataSources/dataSourceOriginsAnalyzer.rb +71 -0
- data/lib/twb/analysis/DataSources/dataSourcesLocationsAnalyzer.rb +122 -0
- data/lib/twb/analysis/DataSources/googlesheetdatasourcesanalyzer.rb +6 -5
- data/lib/twb/analysis/Sheets/dashsheetsanalyzer.rb +7 -5
- data/lib/twb/analysis/Sheets/sheetfieldsanalyzer.rb +90 -8
- data/lib/twb/analysis/Sheets/sheetfiltersanalyzer.rb +6 -5
- data/lib/twb/analysis/Sheets/sheetsourcesanalyzer.rb +122 -0
- data/lib/twb/codedfield.rb +1 -1
- data/lib/twb/connection.rb +104 -2
- data/lib/twb/datasource.rb +35 -4
- data/lib/twb/fieldcalculation.rb +4 -15
- data/lib/twb/quickfilter.rb +10 -9
- data/lib/twb/tabtool.rb +39 -11
- data/lib/twb/workbook.rb +49 -12
- data/lib/twb/worksheet.rb +70 -7
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 896e3b1f94079e230c28b1f65553ac5b870c3263
|
4
|
+
data.tar.gz: 318d27a633debcdf2c3eb1c323017e6d227e569e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af1fe8b04a2d323252026d718f64853489e80d0db24e6255e377480d51102e928215b40eda700d474d06b795aece2858759a0aaab4d87cf93b9e47c45fabd585
|
7
|
+
data.tar.gz: 0d79ef7cc04e9adfd6c075cdf776f6ffa1a1d4b4dfd7d755f3eff2dc879a4783ea580e5499d10b5bee724ebd274529fdfa46c40929d125b75cb998b06c720431
|
data/lib/twb.rb
CHANGED
@@ -17,6 +17,7 @@ require_relative 'twb/tabclass'
|
|
17
17
|
require_relative 'twb/tabtool'
|
18
18
|
require_relative 'twb/dashboard'
|
19
19
|
require_relative 'twb/datasource'
|
20
|
+
require_relative 'twb/connection'
|
20
21
|
require_relative 'twb/docdashboard'
|
21
22
|
require_relative 'twb/dbfield'
|
22
23
|
require_relative 'twb/localfield'
|
@@ -56,16 +57,18 @@ require_relative 'twb/analysis/calculatedfields/markdownemitter'
|
|
56
57
|
require_relative 'twb/analysis/calculatedfields/csvemitter'
|
57
58
|
require_relative 'twb/analysis/datasources/DataSourceFieldsCSVEmitter'
|
58
59
|
require_relative 'twb/analysis/datasources/DataSourceTableFieldsCSVEmitter'
|
60
|
+
require_relative 'twb/analysis/datasources/categoricalColorCodingAnalyzer'
|
59
61
|
require_relative 'twb/analysis/datasources/googlesheetdatasourcesanalyzer'
|
60
62
|
require_relative 'twb/analysis/datasources/parametersanalyzer'
|
63
|
+
require_relative 'twb/analysis/datasources/DataSourceOriginsAnalyzer'
|
61
64
|
require_relative 'twb/analysis/Sheets/WorksheetDataStructureCSVEmitter'
|
62
65
|
require_relative 'twb/analysis/Sheets/sheetfiltersanalyzer'
|
63
66
|
require_relative 'twb/analysis/Sheets/sheetfieldsanalyzer'
|
64
67
|
require_relative 'twb/analysis/Sheets/dashsheetsanalyzer'
|
65
68
|
|
66
69
|
|
67
|
-
# Represents Tableau Workbooks and
|
70
|
+
# Represents Tableau Workbooks, their contents, and classes that analyze and manipulate them.
|
68
71
|
#
|
69
72
|
module Twb
|
70
|
-
VERSION = '3.
|
73
|
+
VERSION = '4.3.1'
|
71
74
|
end
|
@@ -21,7 +21,7 @@ require 'csv'
|
|
21
21
|
module Twb
|
22
22
|
module Analysis
|
23
23
|
|
24
|
-
class CalculatedFieldsAnalyzer
|
24
|
+
class CalculatedFieldsAnalyzer
|
25
25
|
|
26
26
|
include TabTool
|
27
27
|
include Graph
|
@@ -83,7 +83,7 @@ DOTHEADER
|
|
83
83
|
|
84
84
|
def initialize
|
85
85
|
init
|
86
|
-
@funcdoc = {:class=>self.class, :blurb=>'Analyze Calculated Fields
|
86
|
+
@funcdoc = {:class=>self.class, :blurb=>'Analyze Calculated Fields', :description=>'Calculated fields can be complex, this tool provides robust coverage.',}
|
87
87
|
#-- CSV records collectors
|
88
88
|
@csvCalculatedFields = []
|
89
89
|
@csvFormulaFields = []
|
@@ -101,6 +101,8 @@ DOTHEADER
|
|
101
101
|
#--
|
102
102
|
@localEmit = false
|
103
103
|
@imageFiles = []
|
104
|
+
#--
|
105
|
+
@doGraph = config(:dograph)
|
104
106
|
end
|
105
107
|
|
106
108
|
def processTWB workbook
|
@@ -164,16 +166,21 @@ DOTHEADER
|
|
164
166
|
calculatedFields = SortedSet.new
|
165
167
|
fieldFormulaLines = []
|
166
168
|
referencedFields = SortedSet.new
|
167
|
-
|
168
|
-
|
169
|
+
# if @doGraph
|
170
|
+
dataSourceNode = Twb::Util::Graphnode.new(name: ds.uiname, id: ds.id, type: ds, properties: {workbook: @twb.name})
|
171
|
+
@nodes.add dataSourceNode
|
172
|
+
# end
|
169
173
|
#-- process Calculatred Fields
|
170
174
|
ds.calculatedFields.each do |calcField|
|
175
|
+
emit "Calculated Field: #{calcField}"
|
171
176
|
calculatedFields.add calcField.id
|
172
177
|
dsFields[calcField.uiname] = calcField
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
178
|
+
# if @doGraph
|
179
|
+
calcFieldNode = Twb::Util::Graphnode.new(name: calcField.uiname, id: calcField.id, type: calcField, properties: {:DataSource => ds.uiname})
|
180
|
+
@nodes.add calcFieldNode
|
181
|
+
dsFieldEdge = Twb::Util::Graphedge.new(from: dataSourceNode, to: calcFieldNode, relationship: 'contains')
|
182
|
+
@edges.add dsFieldEdge
|
183
|
+
# end
|
177
184
|
calculation = calcField.calculation
|
178
185
|
if calculation.has_formula
|
179
186
|
#-- collect field formulas as single lines
|
@@ -201,9 +208,9 @@ DOTHEADER
|
|
201
208
|
]
|
202
209
|
#-- collect individual formula lines
|
203
210
|
flnum = 0
|
204
|
-
emit "@@
|
211
|
+
emit "@@ calcField.uiname: #{calcField.uiname}"
|
205
212
|
calculation.formulaResolvedLines.each do |fl|
|
206
|
-
emit "@@
|
213
|
+
emit "@@ resolved line:: => '#{fl}'"
|
207
214
|
fieldFormulaLines << [ @calculatedFieldsCount, # 'Calc Field #',
|
208
215
|
@twb.name, # 'Workbook',
|
209
216
|
@twbDir, # 'Workbook Dir',
|
@@ -219,24 +226,32 @@ DOTHEADER
|
|
219
226
|
]
|
220
227
|
end
|
221
228
|
#-- collect fields referenced in formula
|
229
|
+
emit "# Calculated Fields: #{calculation.calcFields.length}"
|
222
230
|
calculation.calcFields.each do |rf|
|
223
|
-
emit "
|
224
|
-
emit " rf.
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
231
|
+
emit " referenced field ::'#{rf}'"
|
232
|
+
emit " referenced field.name ::'#{rf.name.nil?}' :: '#{rf.name}'"
|
233
|
+
emit " referenced field.uiname::'#{rf.uiname}'"
|
234
|
+
# if @doGraph
|
235
|
+
unless rf.uiname.nil?
|
236
|
+
properties = {'DataSource' => ds.uiname, 'DataSourceReference' => 'local', :source => rf}
|
237
|
+
refFieldNode = Twb::Util::Graphnode.new(name: rf.uiname, id: rf.id, type: rf.type, properties: properties)
|
238
|
+
@nodes.add refFieldNode
|
239
|
+
fieldFieldEdge = Twb::Util::Graphedge.new(from: calcFieldNode, to: refFieldNode, relationship: 'references')
|
240
|
+
@edges.add fieldFieldEdge
|
241
|
+
end
|
242
|
+
# end
|
230
243
|
referencedFields.add rf.id
|
231
244
|
refFieldTable = ds.fieldTable(rf.name)
|
232
245
|
emit "refFieldTable.nil? : #{refFieldTable.nil?}"
|
233
246
|
unless refFieldTable.nil?
|
234
247
|
tableID = refFieldTable + ':::' + ds.uiname
|
235
248
|
tableName = "||#{refFieldTable}||"
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
249
|
+
# if @doGraph
|
250
|
+
tableNode = Twb::Util::Graphnode.new(name: tableName, id: tableID, type: :DBTable, properties: properties)
|
251
|
+
@nodes.add tableNode
|
252
|
+
fieldFieldEdge = Twb::Util::Graphedge.new(from: refFieldNode, to: tableNode, relationship: 'is a field in')
|
253
|
+
@edges.add fieldFieldEdge
|
254
|
+
# end
|
240
255
|
# fldToDsNode = tableNode
|
241
256
|
end
|
242
257
|
@csvFormulaFields << [
|
@@ -259,8 +274,10 @@ DOTHEADER
|
|
259
274
|
dsRootFields = calculatedFields - referencedFields
|
260
275
|
@referencedFields.merge referencedFields
|
261
276
|
@twbRootFields.merge dsRootFields
|
262
|
-
|
263
|
-
|
277
|
+
if @doGraph
|
278
|
+
cypher @twb.name
|
279
|
+
cypherPy @twb.name
|
280
|
+
end
|
264
281
|
emit "#######################"
|
265
282
|
#-- record calculated fields
|
266
283
|
emit "@@ record calculated fields ds: #{ds.uiname}"
|
@@ -333,19 +350,23 @@ DOTHEADER
|
|
333
350
|
end
|
334
351
|
|
335
352
|
def cypher twbName
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
353
|
+
if @doGraph
|
354
|
+
cypher = Twb::Util::Cypher.new
|
355
|
+
cypher.fileName = "#{twbName}.calcFields"
|
356
|
+
cypher.nodes = @nodes
|
357
|
+
cypher.edges = @edges
|
358
|
+
cypher.render
|
359
|
+
end
|
341
360
|
end
|
342
361
|
|
343
362
|
def cypherPy twbName
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
363
|
+
if @doGraph
|
364
|
+
cypher = Twb::Util::CypherPython.new
|
365
|
+
cypher.fileName = "#{twbName}.calcFields"
|
366
|
+
cypher.nodes = @nodes
|
367
|
+
cypher.edges = @edges
|
368
|
+
cypher.render
|
369
|
+
end
|
349
370
|
end
|
350
371
|
|
351
372
|
# def graphEdges twb
|
@@ -424,7 +445,6 @@ DOTHEADER
|
|
424
445
|
dotFile.puts " }"
|
425
446
|
end
|
426
447
|
|
427
|
-
|
428
448
|
def labelTypes dotFile
|
429
449
|
fromTos = Set.new
|
430
450
|
@edges.each do |edge|
|
@@ -13,7 +13,7 @@
|
|
13
13
|
# You should have received a copy of the GNU General Public License
|
14
14
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
|
16
|
+
require 'kramdown'
|
17
17
|
|
18
18
|
module Twb
|
19
19
|
module Analysis
|
@@ -26,15 +26,34 @@ module CalculatedFields
|
|
26
26
|
|
27
27
|
def initialize
|
28
28
|
init
|
29
|
-
@funcdoc = {:class=>self.class, :blurb=>'
|
29
|
+
@funcdoc = {:class=>self.class, :blurb=>'Create Markdown files (one per Workbook) documenting Calculated Fields', :description=>'Create Markdown files (one per Workbook) documenting Calculated Fields' }
|
30
30
|
@metrics = {}
|
31
31
|
end
|
32
32
|
|
33
|
+
def kramdownAvailable
|
34
|
+
gem_name, *gem_ver_reqs = 'kramdown', '~> 1.17.0'
|
35
|
+
gdep = Gem::Dependency.new(gem_name, *gem_ver_reqs)
|
36
|
+
# find latest that satisifies
|
37
|
+
found_gspec = gdep.matching_specs.max_by(&:version)
|
38
|
+
# instead of using Gem::Dependency, you can also do:
|
39
|
+
# Gem::Specification.find_all_by_name(gem_name, *gem_ver_reqs)
|
40
|
+
# if found_gspec
|
41
|
+
# puts "Requirement '#{gdep}' already satisfied by #{found_gspec.name}-#{found_gspec.version}"
|
42
|
+
# else
|
43
|
+
# puts "Requirement '#{gdep}' not satisfied; could be installing..."
|
44
|
+
# # reqs_string will be in the format: "> 1.0, < 1.2"
|
45
|
+
# # reqs_string = gdep.requirements_list.join(', ')
|
46
|
+
# # multi-arg is safer, to avoid injection attacks
|
47
|
+
# # system('gem', 'install', gem_name, '-v', reqs_string)
|
48
|
+
# end
|
49
|
+
end
|
50
|
+
|
33
51
|
def processTWB twb
|
34
52
|
# twb = File.basename(twb)
|
35
53
|
@twb = twb #Twb::Workbook.new twb
|
36
54
|
@docFileName = './ttdoc/' + @twb.name + '.CalculatedFields.md'
|
37
55
|
@docFile = File.open(@docFileName,'w')
|
56
|
+
addDocFile @docFileName,"Markdown file of Calculated fields for Workbook '#{@twb.name}'"
|
38
57
|
@docFile.puts "# #{twb.name}"
|
39
58
|
dsNames = @twb.datasourceUINames
|
40
59
|
@docFile.puts "#{dsNames.length} Data Sources"
|
@@ -78,6 +97,9 @@ module CalculatedFields
|
|
78
97
|
end
|
79
98
|
@docFile.puts "counted #{cnt} calculated fields\n "
|
80
99
|
end # twb.datasources.each
|
100
|
+
if kramdownAvailable
|
101
|
+
emit 'processing Markdown: kramdownAvailable'
|
102
|
+
end
|
81
103
|
finis
|
82
104
|
end # def processTwb twb
|
83
105
|
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# categoricalColorCodingAnalyzer.rb Copyright (C) 2018 Chris Gerrard
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require 'twb'
|
17
|
+
require 'csv'
|
18
|
+
|
19
|
+
module Twb
|
20
|
+
module Analysis
|
21
|
+
|
22
|
+
class CategoricalColorCodingAnalyzer
|
23
|
+
|
24
|
+
include TabTool
|
25
|
+
|
26
|
+
attr_accessor :localEmit
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
init
|
30
|
+
@funcdoc = {:class=>self.class, :blurb=>"Analyze Fields' values categorical color coding from Tableau Workbooks.", :description=>nil,}
|
31
|
+
#--
|
32
|
+
docFileName = docFile('CategoricalColorMappings.csv')
|
33
|
+
$csv = CSV.open(docFileName,'w')
|
34
|
+
$csv << ['Workbook', 'Workbook Dir', 'Data Source', 'Field Code', 'Field Tech', 'Field', 'Value', 'Colour']
|
35
|
+
addDocFile docFileName, "Workbooks, Data Sources, Fields, and the Fields' members' categorical color codings."
|
36
|
+
#--
|
37
|
+
@twbCnt = 0
|
38
|
+
@dscnt = 0
|
39
|
+
@fieldsCnt = 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def metrics
|
43
|
+
{
|
44
|
+
'# of Workbooks' => @twbcount,
|
45
|
+
'# of data sources' => @dscnt,
|
46
|
+
'# of Worksheet Fields' => @fieldsCnt
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def processTWB twb
|
51
|
+
@twb = twb
|
52
|
+
twbName = twb.name
|
53
|
+
twbDir = twb.dir
|
54
|
+
emit " -- #{twbName}"
|
55
|
+
@twbCnt += 1
|
56
|
+
@twbDomainsLoaded = false
|
57
|
+
# <style>
|
58
|
+
# <style-rule element='mark'>
|
59
|
+
# <encoding attr='color' field='[none:Calculation_267401288043974656:nk]' type='palette'>
|
60
|
+
# <map to='#1f77b4'>
|
61
|
+
# <bucket>"Consistently Meets Expectations"</bucket>
|
62
|
+
twb.datasources.each do |ds|
|
63
|
+
dsName = ds.uiname
|
64
|
+
puts "\t - #{dsName}"
|
65
|
+
coloredFields = ds.node.xpath('.//style/style-rule/encoding[@attr="color"]')
|
66
|
+
# puts "\t #{coloredFields.length} \t #{coloredFields.class} \t #{coloredFields.nil?}"
|
67
|
+
coloredFields.each do |cf|
|
68
|
+
puts "Attributes: #{cf.attributes}"
|
69
|
+
fieldCode = cf['field']
|
70
|
+
fieldTech = fieldCode.sub(/^\[/,'').sub(/\]$/,'').sub(/^(none|attr|usr):/,'').sub(/:nk$/,'')
|
71
|
+
fieldUI = ds.fieldUIName fieldTech
|
72
|
+
# puts "\t - #{field}"
|
73
|
+
maps = cf.xpath('./map')
|
74
|
+
maps.each do |map|
|
75
|
+
puts "MAP\n---\n#{map}\n--"
|
76
|
+
color = map['to']
|
77
|
+
value = ''
|
78
|
+
values = map.xpath('.//bucket')
|
79
|
+
unless values.nil?
|
80
|
+
if values.length == 1
|
81
|
+
value = values.first.text.gsub(/^"/,'').gsub(/"$/,'')
|
82
|
+
else
|
83
|
+
values.each do |bv|
|
84
|
+
value += "::#{bv.text}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
# puts "\t - #{color} -> #{value}"
|
89
|
+
$csv << [twbName, twbDir, dsName, fieldCode, fieldTech, fieldUI, value, color]
|
90
|
+
puts "VALUE: #{value}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end #class CategoricalColorCodingAnalyzer
|
97
|
+
|
98
|
+
end # module Analysis
|
99
|
+
end # module Twb
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# DataSourceOriginsAnalyzer.rb Copyright (C) 2018 Chris Gerrard
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require 'twb'
|
17
|
+
require 'csv'
|
18
|
+
|
19
|
+
module Twb
|
20
|
+
module Analysis
|
21
|
+
|
22
|
+
class DataSourceOriginsAnalyzer
|
23
|
+
|
24
|
+
include TabTool
|
25
|
+
|
26
|
+
@@recNum = 0
|
27
|
+
|
28
|
+
attr_accessor :localEmit
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
init
|
32
|
+
@funcdoc = {:class=>self.class, :blurb=>'Analyze Data Source Origins, i.e. where the data comes from', :description=>nil,}
|
33
|
+
#--
|
34
|
+
docFileName = docFile('DataSourceOrigins.csv')
|
35
|
+
@csvFile = CSV.open(docFileName,'w')
|
36
|
+
@csvFile << ['Workbook', 'Workbook Version', 'Workbook Directory', 'Data Source', 'Data Source (tech)', 'Is Published?', "Rec #"]
|
37
|
+
addDocFile docFileName, "Workbooks, Data Sources, and the Data Sources' origins"
|
38
|
+
#--
|
39
|
+
@twbCnt = 0
|
40
|
+
@dsCnt = 0
|
41
|
+
end
|
42
|
+
|
43
|
+
def metrics
|
44
|
+
{
|
45
|
+
'# of Workbooks' => @twbcount,
|
46
|
+
'# of Data Sources' => @dsCnt,
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def processTWB twb
|
51
|
+
@twb = twb
|
52
|
+
emit " -- twb:: #{@twb.name}"
|
53
|
+
@twbCnt += 1
|
54
|
+
@twbDomainsLoaded = false
|
55
|
+
parseDataSources
|
56
|
+
finis
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def parseDataSources
|
62
|
+
@twb.datasources.each do |ds|
|
63
|
+
@csvFile << [@twb.name, @twb.version, @twb.dir, ds.uiname, ds.name, ds.isPublished, @@recNum+=1]
|
64
|
+
@dsCnt += 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end #class SheetFieldsAnalyzer
|
69
|
+
|
70
|
+
end # module Analysis
|
71
|
+
end # module Twb
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# sheetfieldsanalyzer.rb Copyright (C) 2018 Chris Gerrard
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require 'twb'
|
17
|
+
require 'csv'
|
18
|
+
|
19
|
+
module Twb
|
20
|
+
module Analysis
|
21
|
+
|
22
|
+
class SheetSourcesAnalyzer
|
23
|
+
|
24
|
+
include TabTool
|
25
|
+
|
26
|
+
attr_accessor :localEmit
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
init
|
30
|
+
@funcdoc = {:class=>self.class, :blurb=>'Analyze Worksheet Fields', :description=>nil,}
|
31
|
+
#--
|
32
|
+
docFileName = docFile('WorksheetFields.csv')
|
33
|
+
@sheetFieldsCSV = CSV.open(docFileName,'w')
|
34
|
+
@sheetFieldsCSV << ['Workbook','Worksheet','Data Source','Data Source (tech)','Field','Field (tech)','Usage']
|
35
|
+
addDocFile docFileName, "Workbooks, Worksheets, and the Sheets' Data Sources and Fields"
|
36
|
+
#--
|
37
|
+
@twbCnt = 0
|
38
|
+
@sheetCnt = 0
|
39
|
+
@fieldsCnt = 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def metrics
|
43
|
+
{
|
44
|
+
'# of Workbooks' => @twbcount,
|
45
|
+
'# of Worksheets' => @sheetCnt,
|
46
|
+
'# of Worksheet Fields' => @fieldsCnt
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def processTWB twb
|
51
|
+
@twb = twb
|
52
|
+
emit " -- twb:: #{@twb.name}"
|
53
|
+
@twbCnt += 1
|
54
|
+
@twbDomainsLoaded = false
|
55
|
+
parseSheets
|
56
|
+
finis
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def parseSheets
|
62
|
+
@worksheets = @twb.worksheets
|
63
|
+
@worksheets.each do |sheet|
|
64
|
+
@sheet = sheet.name
|
65
|
+
@sheetCnt += 1
|
66
|
+
emit "SHEET: #{@sheet}"
|
67
|
+
showFields sheet unless sheet.datasourceFields.nil?
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def showFields sheet
|
72
|
+
showDBFields sheet
|
73
|
+
showRCFields sheet.rowFields, :row
|
74
|
+
showRCFields sheet.colFields, :column
|
75
|
+
end
|
76
|
+
|
77
|
+
def showDBFields sheet
|
78
|
+
fields = sheet.datasourceFields
|
79
|
+
emit "def showDBFields sheet: #{sheet.name} #FIELDS: #{fields.length}"
|
80
|
+
if fields.nil?
|
81
|
+
@sheetFieldsCSV << [@twb.name, @sheet, nil, nil, nil, nil, nil]
|
82
|
+
end
|
83
|
+
fields.each do |dsName, dsfields|
|
84
|
+
ds = @twb.datasource dsName
|
85
|
+
emit " ds: #{dsName}"
|
86
|
+
emit " - #{ds.uiname}"
|
87
|
+
emit " : #{ds.class}"
|
88
|
+
dsfields.each do |sheetField|
|
89
|
+
@fieldsCnt += 1
|
90
|
+
emit " f: #{sheetField}"
|
91
|
+
emit " c: #{sheetField.class}"
|
92
|
+
fuiName = ds.fieldUIName sheetField #Fields[sheetField]
|
93
|
+
@sheetFieldsCSV << [@twb.name, @sheet, ds.uiname, dsName, sheetField.uiname, sheetField.name, 'DB ref']
|
94
|
+
# emit true, " : #{dsFields[field].class}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def showRCFields fields, usage
|
100
|
+
emit "def showRCFields #fields: #{fields.length} \t #{fields}"
|
101
|
+
if fields.nil?
|
102
|
+
@sheetFieldsCSV << [@twb.name, @sheet, nil, nil, nil, nil, nil]
|
103
|
+
else
|
104
|
+
fields.each do |cf|
|
105
|
+
emit "coded field: #{cf}"
|
106
|
+
fldName = cf.name
|
107
|
+
dsName = cf.dataSource
|
108
|
+
ds = @twb.datasource cf.dataSource
|
109
|
+
emit "DATASOURCE : #{ds.class} " #{ }" #{ds}"
|
110
|
+
fuiName = ds.fieldUIName cf.name
|
111
|
+
emit " ds: #{dsName}"
|
112
|
+
emit " - #{ds.uiname}"
|
113
|
+
emit " : #{ds.class}"
|
114
|
+
@sheetFieldsCSV << [@twb.name, @sheet, ds.uiname, dsName, fuiName, fldName, usage]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end #class SheetFieldsAnalyzer
|
120
|
+
|
121
|
+
end # module Analysis
|
122
|
+
end # module Twb
|