twb 3.9.7 → 4.3.1
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 +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
|