twb 4.3.1 → 4.3.3
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 +5 -5
- data/lib/twb.rb +1 -1
- data/lib/twb/analysis/CalculatedFields/CalculatedFieldsAnalyzer.rb +3 -3
- data/lib/twb/analysis/CalculatedFields/groupfieldsanalyzer.rb +1 -1
- data/lib/twb/analysis/DataSources/parametersanalyzer.rb +1 -1
- data/lib/twb/analysis/Sheets/sheetfiltersanalyzerA.rb +1 -1
- data/lib/twb/util/fielddomainloader.rb +19 -17
- data/lib/twb/workbook.rb +6 -1
- data/lib/twb/worksheet.rb +22 -19
- data/test/testFieldDomainLoader.rb +1 -1
- metadata +44 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 150eff5c8dea70f1bb4a81416ba1097fe200e76ae173976f2cb6991f3b62fd02
|
4
|
+
data.tar.gz: 9238b3a04c9fc93d173743fdd15f9274b8b0f4a01dea00dcaa5cee27cf981c68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 025cc5a832adcf6b550808affe56077a2b8a605080424a57ce0f4f1138887c4ce8d5646f6505e9dcf114364bd8f9e58a40743b450cc1f51188aa10ad35c906b8
|
7
|
+
data.tar.gz: 69b0a5f7ba2cb26a88925c86ada6b7aad6ab6df9bb3ee4ffd04845842657df4037273d9df994c8439043ee29528f375549894f7ec68f5dafec33488809841269
|
data/lib/twb.rb
CHANGED
@@ -33,7 +33,7 @@ module Analysis
|
|
33
33
|
@@gvDotLocation = 'C:\\tech\\graphviz\\Graphviz2.38\\bin\\dot.exe'
|
34
34
|
@@processName = '.CalculatedFields'
|
35
35
|
|
36
|
-
@@calcFieldsCSVFileName = '
|
36
|
+
@@calcFieldsCSVFileName = 'CalculatedFields.csv'
|
37
37
|
@@calcFieldsCSVFileHeader = ['Record #',
|
38
38
|
'Workbook', 'Workbook Dir',
|
39
39
|
'Data Source', 'Data Source Caption', 'Data Source Name (tech)',
|
@@ -49,7 +49,7 @@ module Analysis
|
|
49
49
|
'Formula LOD?'
|
50
50
|
]
|
51
51
|
|
52
|
-
@@calcLinesCSVFileName = '
|
52
|
+
@@calcLinesCSVFileName = 'CalculatedFieldFormulaLines.csv'
|
53
53
|
@@calcLinesCSVFileHeader = ['Calc Field #',
|
54
54
|
'Workbook', 'Workbook Dir',
|
55
55
|
'Data Source', 'Data Source Caption', 'Data Source Name (tech)',
|
@@ -57,7 +57,7 @@ module Analysis
|
|
57
57
|
'Formula', 'Formula Line #', 'Formula Line'
|
58
58
|
]
|
59
59
|
|
60
|
-
@@formFieldsCSVFileName = '
|
60
|
+
@@formFieldsCSVFileName = 'CalculatedFieldsReferenced.csv'
|
61
61
|
@@formFieldsCSVFileHeader = ['Rec #',
|
62
62
|
'Workbook', 'Workbook Dir',
|
63
63
|
'Data Source',
|
@@ -29,7 +29,7 @@ module Analysis
|
|
29
29
|
init
|
30
30
|
@funcdoc = {:class=>self.class, :blurb=>'Analyze Group Fields.', :description=>'Identifies the Groups and their Members for grouped fields.',}
|
31
31
|
#--
|
32
|
-
docFileName = docFile('
|
32
|
+
docFileName = docFile('GroupFields.csv')
|
33
33
|
@csv = CSV.open(docFileName,'w')
|
34
34
|
@csv << ['Workbook','Data Source','Field','Group','Member']
|
35
35
|
addDocFile docFileName, "Workbooks, Data Sources, and their Grouped Fields"
|
@@ -33,7 +33,7 @@ module Analysis
|
|
33
33
|
@paramscount = 0
|
34
34
|
#--
|
35
35
|
@funcdoc = {:class=>self.class, :blurb=>'Analyzing Parameters from Tableau Workbooks.', :description=>nil,}
|
36
|
-
docFileName = docFile('
|
36
|
+
docFileName = docFile('Parameters.csv')
|
37
37
|
@csv = CSV.open(docFileName, 'w')
|
38
38
|
@csv << ["Workbook",'Parameter','Caption','Name (tech)','Type','Format','Type (custom)','Type (domain)','Role', 'Value (current)', 'Value','Value (tech)']
|
39
39
|
# [ @twbname, name, caption, nameTech, type, format, typeCustom, domainType, role]
|
@@ -29,7 +29,7 @@ module Analysis
|
|
29
29
|
init
|
30
30
|
@funcdoc = {:class=>self.class, :blurb=>'Analyze Worksheet filters.', :description=>'Documents Quick Filters and the values they employ, if any. Work in progess.',}
|
31
31
|
#--
|
32
|
-
docFileName = docFile('
|
32
|
+
docFileName = docFile('WorksheetFiltersA.csv')
|
33
33
|
$sheetFieldsCSV = CSV.open( docFileName ,'w')
|
34
34
|
$sheetFieldsCSV << ['Workbook','Worksheet','Filter Type','Operation','Data Source','Field','Value','Alias', 'Alias?']
|
35
35
|
addDocFile docFileName, "Workbooks, Worksheets and the sheets' Quick Filters"
|
@@ -40,7 +40,7 @@ require 'csv'
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def initCSV opt
|
43
|
-
@csvFile = CSV.open(@xmllocation + '/
|
43
|
+
@csvFile = CSV.open(@xmllocation + '/FieldDomains.csv', opt )
|
44
44
|
if 'w'.eql? opt
|
45
45
|
@csvFile << ['Workbook', 'Data Source', 'Field', 'Value']
|
46
46
|
end
|
@@ -71,22 +71,24 @@ require 'csv'
|
|
71
71
|
|
72
72
|
def loadxlsx fileName
|
73
73
|
fieldDomains = {}
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
74
|
+
# TODO - fix this - when Creek::Book is in place, the twb gem cannot be loaded in Ruby on Rails, as of Jan 26, 2019
|
75
|
+
# - commenting out to sidestep problem giving up functionality for expedience in gtting online
|
76
|
+
# if File.file?(fileName)
|
77
|
+
# xlsx = Creek::Book.new fileName
|
78
|
+
# sheets = xlsx.sheets
|
79
|
+
# sheets.each do |sheet|
|
80
|
+
# rows = sheet.rows.to_a
|
81
|
+
# if rows.count > 1
|
82
|
+
# fieldValues = parseRows(rows)
|
83
|
+
# unless fieldValues.empty? || fieldValues.values.first.empty?
|
84
|
+
# fieldDomains[fieldValues.keys.first] = fieldValues.values.first
|
85
|
+
# end
|
86
|
+
# end
|
87
|
+
# end
|
88
|
+
# else
|
89
|
+
# alert "#### ALERT #### Twb:'#{@workbook}' DS: '#{@datasource}' DomRef: #{fileName}' file does not exist."
|
90
|
+
# end
|
91
|
+
# return fieldDomains
|
90
92
|
end
|
91
93
|
|
92
94
|
def parseRows rows
|
data/lib/twb/workbook.rb
CHANGED
@@ -136,10 +136,15 @@ module Twb
|
|
136
136
|
end
|
137
137
|
|
138
138
|
def loadWorksheets
|
139
|
-
@worksheets
|
139
|
+
@worksheets = {}
|
140
|
+
hiddenSheets = []
|
141
|
+
@ndoc.xpath('//workbook/windows/window[@hidden="true"]').each do |hs|
|
142
|
+
hiddenSheets << hs['name']
|
143
|
+
end
|
140
144
|
sheets = @ndoc.xpath('//workbook/worksheets/worksheet' ).to_a
|
141
145
|
sheets.each do |node|
|
142
146
|
sheet = Twb::Worksheet.new(node, self)
|
147
|
+
sheet.hidden = hiddenSheets.include? sheet.name
|
143
148
|
@worksheets[sheet.name] = sheet
|
144
149
|
end
|
145
150
|
end
|
data/lib/twb/worksheet.rb
CHANGED
@@ -26,25 +26,26 @@ module Twb
|
|
26
26
|
|
27
27
|
@fieldEncodingsXPath = './table/panes/pane//encodings'
|
28
28
|
|
29
|
-
attr_reader
|
30
|
-
attr_reader
|
31
|
-
attr_reader
|
32
|
-
attr_reader
|
33
|
-
attr_reader
|
34
|
-
|
29
|
+
attr_reader :node, :name, :datasourcenames, :datasources
|
30
|
+
attr_reader :panesCount
|
31
|
+
attr_reader :fields, :rowFields, :colFields, :paneFields, :datasourceFields, :pageFields, :encodedFields
|
32
|
+
attr_reader :filters
|
33
|
+
attr_reader :tooltip
|
34
|
+
attr_accessor :hidden, :visible
|
35
35
|
|
36
36
|
def initialize sheetNode, twb
|
37
37
|
@twb = twb
|
38
38
|
@node = sheetNode
|
39
39
|
@name = @node['name']
|
40
40
|
emit "########################## Worksheet initialize name: #{@name}"
|
41
|
+
|
41
42
|
loadDataSourceNames
|
42
43
|
loadFields
|
43
44
|
return self
|
44
45
|
end
|
45
46
|
|
46
47
|
def id
|
47
|
-
@id ||= @
|
48
|
+
@id ||= @name.hash
|
48
49
|
end
|
49
50
|
|
50
51
|
def loadDataSourceNames
|
@@ -57,7 +58,7 @@ module Twb
|
|
57
58
|
end
|
58
59
|
|
59
60
|
def workbook
|
60
|
-
@workbook ||= @
|
61
|
+
@workbook ||= @node.at_xpath('/').root
|
61
62
|
end
|
62
63
|
|
63
64
|
def datasources
|
@@ -85,9 +86,9 @@ module Twb
|
|
85
86
|
@tooltip ||= loadTooltip
|
86
87
|
end
|
87
88
|
|
88
|
-
def hidden
|
89
|
-
|
90
|
-
end
|
89
|
+
# def hidden
|
90
|
+
# @hidden ||= resolveHidden
|
91
|
+
# end
|
91
92
|
|
92
93
|
def visible
|
93
94
|
@visible ||= !hidden
|
@@ -118,7 +119,7 @@ module Twb
|
|
118
119
|
|
119
120
|
def loadFieldEncodings
|
120
121
|
@encodedFields = Hash.new { |h,k| h[k] = [] }
|
121
|
-
enodes = node.xpath('.//table/panes/pane/encodings')
|
122
|
+
enodes = @node.xpath('.//table/panes/pane/encodings')
|
122
123
|
enodes.each do |enode|
|
123
124
|
enode.children.each do |child|
|
124
125
|
unless child['column'].nil?
|
@@ -152,7 +153,7 @@ module Twb
|
|
152
153
|
end
|
153
154
|
|
154
155
|
def panesCount
|
155
|
-
@panesCount ||= @
|
156
|
+
@panesCount ||= @node.xpath('.//panes/pane').length
|
156
157
|
end
|
157
158
|
|
158
159
|
def loadRowColFields(type)
|
@@ -188,7 +189,7 @@ module Twb
|
|
188
189
|
|
189
190
|
def loadpageFields
|
190
191
|
@pageFields = [] # { |h,k| h[k] = [] }
|
191
|
-
nodes = node.xpath('.//table/pages/column')
|
192
|
+
nodes = @node.xpath('.//table/pages/column')
|
192
193
|
nodes.each do |node|
|
193
194
|
@pageFields << CodedField.new(node.text)
|
194
195
|
end
|
@@ -199,13 +200,15 @@ module Twb
|
|
199
200
|
@datasources.keys
|
200
201
|
end
|
201
202
|
|
202
|
-
def resolveHidden
|
203
|
-
windowNode = node.at_xpath("//windows/window[@name=\"#{@name}\"]")
|
204
|
-
@hidden = !windowNode.nil? && 'true' == windowNode['hidden']
|
205
|
-
end
|
206
|
-
|
207
203
|
private
|
208
204
|
|
205
|
+
# def resolveHidden
|
206
|
+
# xpath = "//windows/window[@name=\"#{@name}\"]"
|
207
|
+
# emit true, "resolveHidden: #{xpath}"
|
208
|
+
# windowNode = @node.at_xpath(xpath)
|
209
|
+
# @hidden = !windowNode.nil? && 'true' == windowNode['hidden']
|
210
|
+
# end
|
211
|
+
|
209
212
|
def loadFilters
|
210
213
|
emit ""########################## loadFilters"
|
211
214
|
@filters = []
|
@@ -24,7 +24,7 @@ twb = Twb::Workbook.new 'Sheet43.twb'
|
|
24
24
|
puts "\n\nLoading TWB '#{twb.name}'..."
|
25
25
|
domains = loader.loadWorkbook twb
|
26
26
|
# puts domains
|
27
|
-
$csv = CSV.open('
|
27
|
+
$csv = CSV.open('FieldDomainValues.csv', 'w')
|
28
28
|
$csv << ['Workbook','Data Source','Field Name','Value']
|
29
29
|
domains.each do |ds,fieldVals|
|
30
30
|
puts "== #{ds}"
|
metadata
CHANGED
@@ -1,15 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.3.
|
4
|
+
version: 4.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Gerrard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2019-01-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: creek
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.4'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.4.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.4'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.4.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: kramdown
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.17'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.17.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.17'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.17.0
|
13
53
|
description: A sollection of Ruby classes designed for accessing and recording information
|
14
54
|
about, and for manipulating, Tableau Workbooks and their contents.
|
15
55
|
email: Chris@Gerrard.net
|
@@ -130,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
170
|
version: '0'
|
131
171
|
requirements: []
|
132
172
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.6
|
173
|
+
rubygems_version: 2.7.6
|
134
174
|
signing_key:
|
135
175
|
specification_version: 4
|
136
176
|
summary: Classes for accessing Tableau Workbooks and their contents.
|