twb 4.6.0 → 4.6.1
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
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 199291219b0d5c06c822c4eedce63579a9a7cf80a1c4acfc53429403aeddc7f6
|
4
|
+
data.tar.gz: c6889a7c889c8c0890bde9f6e9e8b8a016af6a319d75dc3634d266ce36a7cbab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74f35bd36b750b031999d6fbdfc3f57113114ab54c8fbec33e9874203402e09c24374619ec74af683cd5c687e5dea5d8e5a7a2ec5f99a06851f975590aeceabc
|
7
|
+
data.tar.gz: 92af9190a8661aee7e1e45fe689c7737c802b617ba74eac8efd409c5c7b5569bbfa5a822bd16e4b9b4a18f7d297c889c8e27c1ab566df105722ae32db1b01bcb
|
data/lib/twb.rb
CHANGED
@@ -56,7 +56,8 @@ require_relative 'twb/analysis/calculatedfields/calculatedfieldsanalyzer'
|
|
56
56
|
require_relative 'twb/analysis/calculatedfields/groupfieldsanalyzer'
|
57
57
|
require_relative 'twb/analysis/calculatedfields/markdownemitter'
|
58
58
|
require_relative 'twb/analysis/calculatedfields/csvemitter'
|
59
|
-
require_relative 'twb/analysis/datasources/datasourcefieldscsvemitter'
|
59
|
+
# require_relative 'twb/analysis/datasources/datasourcefieldscsvemitter'
|
60
|
+
require_relative 'twb/analysis/datasources/datasourcefieldsanalyzer'
|
60
61
|
require_relative 'twb/analysis/datasources/datasourcetablefieldscsvemitter'
|
61
62
|
require_relative 'twb/analysis/datasources/categoricalcolorcodinganalyzer'
|
62
63
|
require_relative 'twb/analysis/datasources/googlesheetdatasourcesanalyzer'
|
@@ -71,5 +72,5 @@ require_relative 'twb/analysis/sheets/dashsheetsanalyzer'
|
|
71
72
|
# Represents Tableau Workbooks, their contents, and classes that analyze and manipulate them.
|
72
73
|
#
|
73
74
|
module Twb
|
74
|
-
VERSION = '4.6.
|
75
|
+
VERSION = '4.6.1'
|
75
76
|
end
|
@@ -0,0 +1,284 @@
|
|
1
|
+
# calculatedfieldsanalyzer.rb - this Ruby script Copyright 2017, 2018 Christopher 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
|
+
module DataSources
|
22
|
+
|
23
|
+
class DataSourceFieldsAnalyzer
|
24
|
+
|
25
|
+
include TabTool
|
26
|
+
|
27
|
+
attr_reader :csvFileName, :csvRecords
|
28
|
+
attr_reader :dsCount, :fieldsCount
|
29
|
+
|
30
|
+
# @@csvHeader = ['Record #',
|
31
|
+
# 'Workbook',
|
32
|
+
# 'Workbook Dir',
|
33
|
+
# 'Data Source',
|
34
|
+
# 'Field',
|
35
|
+
# 'Twb Type',
|
36
|
+
# 'Hidden', # props[:hidden],
|
37
|
+
# 'Type - Column', # props[:columnField],
|
38
|
+
# 'Type - Calculated', # props[:calculatedField],
|
39
|
+
# 'Type - Db', # props[:dbField],
|
40
|
+
# 'Type - Mapped', # props[:mappedField]
|
41
|
+
# 'Type - MetaData', # props[:mappedField]
|
42
|
+
# ]
|
43
|
+
# @@csvFileType = 'TwbDataSourceFields'
|
44
|
+
# @@csvFileName = @@csvFileType + '.csv'
|
45
|
+
|
46
|
+
@@fullFileType = 'DataSourceFieldsDetails'
|
47
|
+
@@fullFileName = @@fullFileType + '.csv'
|
48
|
+
@@fullHeader = ['Field #',
|
49
|
+
'Workbook',
|
50
|
+
'Data Source',
|
51
|
+
'Field',
|
52
|
+
'Field - source',
|
53
|
+
'Field - class',
|
54
|
+
'Field - path',
|
55
|
+
'Property - Name',
|
56
|
+
'Property - Value'
|
57
|
+
]
|
58
|
+
|
59
|
+
# @@techFileType = 'TwbDataSourceFieldsTech'
|
60
|
+
# @@techFileName = @@techFileType + '.csv'
|
61
|
+
# @@techHeader = ['Field #',
|
62
|
+
# 'Workbook',
|
63
|
+
# 'Workbook Dir',
|
64
|
+
# 'Data Source',
|
65
|
+
# 'Field',
|
66
|
+
# 'Field Type',
|
67
|
+
# 'Property - Name',
|
68
|
+
# 'Property - Value'
|
69
|
+
# ]
|
70
|
+
|
71
|
+
def initialize(**args)
|
72
|
+
@args = args
|
73
|
+
# puts "@args: #{@args}"
|
74
|
+
@recordDir = !@args.nil? && @args[:recordDir] == true
|
75
|
+
@ttdocdir = @args[:ttdocdir]
|
76
|
+
@csvAdd = args[:csvMode] == :add
|
77
|
+
@csvMode = @csvAdd ? 'a' : 'w'
|
78
|
+
init
|
79
|
+
@funcdoc = {:class=>self.class, :blurb=>'Analyze Data Source Fields', :description=>'Documents Data Source fields, with (some) technical information.',}
|
80
|
+
#--
|
81
|
+
docFileName = docFile(@@fullFileName)
|
82
|
+
@csvFile = CSV.open( docFileName,@csvMode)
|
83
|
+
unless @csvAdd
|
84
|
+
if @recordDir
|
85
|
+
@csvFile << @@fullHeader + ['Workbook Dir']
|
86
|
+
else
|
87
|
+
@csvFile << @@fullHeader
|
88
|
+
end
|
89
|
+
end
|
90
|
+
addDocFile @csvFile, docFileName, "Workbooks, Data Sources, and Fields."
|
91
|
+
#--
|
92
|
+
# --
|
93
|
+
@dsCount = 0
|
94
|
+
@recNum = 0
|
95
|
+
end
|
96
|
+
|
97
|
+
def initializeX
|
98
|
+
# @csvFile = CSV.open(@@csvFileName,'w')
|
99
|
+
# @csvFile << @@csvHeader
|
100
|
+
# @csvRecords = Set.new
|
101
|
+
# puts "Opened: #{!@csvFile.nil?} - #{@@csvFileName}"
|
102
|
+
# --
|
103
|
+
@csvFileFull = CSV.open(@@fullFileName,'w')
|
104
|
+
@csvFileFull << @@fullHeader
|
105
|
+
puts "Opened: #{!@csvFileFull.nil?} - #{@@fullFileName} "
|
106
|
+
# --
|
107
|
+
# @csvFileTech = CSV.open(@@techFileName,'w')
|
108
|
+
# @csvFileTech << @@techHeader
|
109
|
+
# puts "Opened: #{!@csvFileTech.nil?} - #{@@techFileName}"
|
110
|
+
# --
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.csvHeader
|
114
|
+
@@csvHeader
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.csvFileType
|
118
|
+
@@csvFileType
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.csvFileNaame
|
122
|
+
@@csvFileName
|
123
|
+
end
|
124
|
+
|
125
|
+
def processTWB twb
|
126
|
+
@twb = nil
|
127
|
+
@twb = twb if twb.instance_of? Twb::Workbook
|
128
|
+
@twb = Twb::Workbook.new(twb) if twb.instance_of? String
|
129
|
+
raise ArgumentError.new("ERROR in Workbok processing: '#{twb}' must be a Workbook (class) or the name of a Workbook (String), is a #{twb.class} \n ") unless @twb.is_a? Twb::Workbook
|
130
|
+
# --
|
131
|
+
dss = @twb.datasources
|
132
|
+
@fieldCnt = 0
|
133
|
+
dss.each do |ds|
|
134
|
+
@dsname = ds.uiname
|
135
|
+
# puts "\n -- #{ds.uiname} "
|
136
|
+
# tables = Set.new
|
137
|
+
# fields = {}
|
138
|
+
@dsCount += 1
|
139
|
+
fclasses = Set.new
|
140
|
+
ds.localFields.each do |field|
|
141
|
+
recordFieldFull field, :local
|
142
|
+
# recordField( fields, field, {:type=>:local,:columnField=>true,:hidden=>field.hidden} )
|
143
|
+
# emitTech( ds, field.uiname, 'Local', field.properties)
|
144
|
+
# recordTech( field, 'LocalA')
|
145
|
+
end
|
146
|
+
ds.columnFields.each do |field|
|
147
|
+
recordFieldFull field, :column
|
148
|
+
# recordField( fields, field, {:type=>'column',:columnField=>true,:hidden=>field.hidden} )
|
149
|
+
# emitTech( ds, field.uiname, 'Column', field.properties)
|
150
|
+
# recordTech( field, 'ColumnA')
|
151
|
+
end
|
152
|
+
ds.calculatedFields.each do |field|
|
153
|
+
recordFieldFull field, :calc
|
154
|
+
# puts "WWW #{field.class} :: #{field} ::prop:: #{field.properties.class} :: #{field.properties}"
|
155
|
+
# recordField( fields, field, {:type=>'calc',:calculatedField=>true,:hidden=>field.hidden} )
|
156
|
+
# emitTech( ds, field.uiname, 'Calculated', field.properties)
|
157
|
+
# recordTech( field, 'CalcA')
|
158
|
+
end
|
159
|
+
ds.metadataFields.each do |field|
|
160
|
+
recordFieldFull field, :metadata
|
161
|
+
# recordField( fields, field, {:type=>'metadata',:metadataField=>true} )
|
162
|
+
# emitTech( ds, field.uiname, 'MetaData', field.properties)
|
163
|
+
# recordTech( field, 'MetadataA')
|
164
|
+
end
|
165
|
+
ds.dbFields.each do |field|
|
166
|
+
recordFieldFull field, :db
|
167
|
+
# recordField( fields, field, {:type=>'database',:dbField=>true} )
|
168
|
+
# emitTech( ds, field.uiname, 'Db', field.properties)
|
169
|
+
# recordTech( field, 'DbA')
|
170
|
+
end
|
171
|
+
ds.mappedFields.each do |field|
|
172
|
+
recordFieldFull field, :mapped
|
173
|
+
# recordField( fields, field, {:type=>'mapped',:mappedField=>true} )
|
174
|
+
# emitTech( ds, field.uiname, 'Mapped', field.properties)
|
175
|
+
# recordTech( field, 'MappedA')
|
176
|
+
end
|
177
|
+
# emitFields(fields)
|
178
|
+
end
|
179
|
+
end # def processTwb twb
|
180
|
+
|
181
|
+
def metrics
|
182
|
+
{
|
183
|
+
'# of Data Sources' => @dsCount,
|
184
|
+
'# of Records' => @recNum
|
185
|
+
}
|
186
|
+
end
|
187
|
+
|
188
|
+
private
|
189
|
+
|
190
|
+
def recordFieldFull field, source
|
191
|
+
# print field.properties.nil? ? '-' : ":#{field.properties.length}"
|
192
|
+
# puts field.properties
|
193
|
+
@fieldCnt+=1
|
194
|
+
field.properties.each do |name,value|
|
195
|
+
# print name
|
196
|
+
csvRec = [ @recNum+=1,
|
197
|
+
@twb.name,
|
198
|
+
# @twb.dir,
|
199
|
+
@dsname,
|
200
|
+
field.uiname,
|
201
|
+
source,
|
202
|
+
field.class,
|
203
|
+
field.node.path.to_s.gsub(/[0-9]/,'').gsub('[]',''),
|
204
|
+
name,
|
205
|
+
value
|
206
|
+
]
|
207
|
+
csvRec << @twb.dir if @recordDir
|
208
|
+
@csvFile << csvRec
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# def recordField fields, field, props
|
213
|
+
# # puts "%-65s :: %s " % [fieldName,props]
|
214
|
+
# return if field.uiname.nil?
|
215
|
+
# if fields.has_key? field.uiname
|
216
|
+
# fields[field.uiname].merge! field.properties
|
217
|
+
# else
|
218
|
+
# fields[field.uiname] = field.properties
|
219
|
+
# end
|
220
|
+
# end
|
221
|
+
|
222
|
+
# def emitFields fields
|
223
|
+
# fields.each do |fieldName,props|
|
224
|
+
# # puts "FIELD:: %-40s :: %s" % [fieldName,props.inspect]
|
225
|
+
# # class = props[]
|
226
|
+
# csvRec = [ @recNum+=1,
|
227
|
+
# @twb.name,
|
228
|
+
# @twb.dir,
|
229
|
+
# @dsname,
|
230
|
+
# fieldName,
|
231
|
+
# props[:type],
|
232
|
+
# props['hidden'],
|
233
|
+
# props[:columnField],
|
234
|
+
# props[:calculatedField],
|
235
|
+
# props[:dbField],
|
236
|
+
# props[:mappedField],
|
237
|
+
# props[:metadataField]
|
238
|
+
# ]
|
239
|
+
# @csvFile << csvRec
|
240
|
+
# @csvRecords.add csvRec
|
241
|
+
# end
|
242
|
+
# end
|
243
|
+
|
244
|
+
# def recordTech field, type
|
245
|
+
# @recNum+=1
|
246
|
+
# field.properties.each do |name,value|
|
247
|
+
# @csvFileTech << [ @recNum,
|
248
|
+
# @twb.name,
|
249
|
+
# @twb.dir,
|
250
|
+
# @dsname,
|
251
|
+
# field.uiname,
|
252
|
+
# type,
|
253
|
+
# name,
|
254
|
+
# value
|
255
|
+
# ]
|
256
|
+
# end
|
257
|
+
# end
|
258
|
+
|
259
|
+
# def emitTech dataSource, fieldName, type, properties
|
260
|
+
# # puts "XX #{dataSource.uiname} :: #{fieldName} #{} :: #{type} :: #{properties}"
|
261
|
+
# @recNum+=1
|
262
|
+
# properties.each do |name,value|
|
263
|
+
# @csvFileTech << [ @recNum,
|
264
|
+
# @twb.name,
|
265
|
+
# @twb.dir,
|
266
|
+
# dataSource.uiname,
|
267
|
+
# fieldName,
|
268
|
+
# type,
|
269
|
+
# name,
|
270
|
+
# value
|
271
|
+
# ]
|
272
|
+
# end
|
273
|
+
# end
|
274
|
+
|
275
|
+
# def cleanup
|
276
|
+
# @csvFile.close unless @csvFile.nil?
|
277
|
+
# end
|
278
|
+
|
279
|
+
end # class DataSourceFieldsCSVEmitter
|
280
|
+
|
281
|
+
|
282
|
+
end # module DataSources
|
283
|
+
end # module Analysis
|
284
|
+
end # module Twb
|
@@ -22,6 +22,8 @@ module DataSources
|
|
22
22
|
|
23
23
|
class DataSourceFieldsCSVEmitter
|
24
24
|
|
25
|
+
include TabTool
|
26
|
+
|
25
27
|
attr_reader :csvFileName, :csvRecords
|
26
28
|
attr_reader :dsCount, :fieldsCount
|
27
29
|
|
@@ -67,7 +69,33 @@ module DataSources
|
|
67
69
|
# 'Property - Value'
|
68
70
|
# ]
|
69
71
|
|
70
|
-
def initialize
|
72
|
+
def initialize(**args)
|
73
|
+
@args = args
|
74
|
+
# puts "@args: #{@args}"
|
75
|
+
@recordDir = !@args.nil? && @args[:recordDir] == true
|
76
|
+
@ttdocdir = @args[:ttdocdir]
|
77
|
+
@csvAdd = args[:csvMode] == :add
|
78
|
+
@csvMode = @csvAdd ? 'a' : 'w'
|
79
|
+
init
|
80
|
+
@funcdoc = {:class=>self.class, :blurb=>'Analyze Worksheet Filters', :description=>'Documents Quick Filters and the values they employ, if any. Work in progess.',}
|
81
|
+
#--
|
82
|
+
docFileName = docFile(@@fullFileName)
|
83
|
+
@sheetFieldsCSV = CSV.open( docFileName,@csvMode)
|
84
|
+
unless @csvAdd
|
85
|
+
if @recordDir
|
86
|
+
@sheetFieldsCSV << ['Rec #','Workbook','Workbook Modified','Worksheet','Filter Type','Operation','Data Source','Field','Value','Alias', 'Alias?','Operation Mode','Include Null?','Kind','Workbook Dir']
|
87
|
+
else
|
88
|
+
@sheetFieldsCSV << ['Rec #','Workbook','Workbook Modified','Worksheet','Filter Type','Operation','Data Source','Field','Value','Alias', 'Alias?','Operation Mode','Include Null?','Kind']
|
89
|
+
end
|
90
|
+
end
|
91
|
+
addDocFile @sheetFieldsCSV, docFileName, "Workbooks, Worksheets and the sheets' Quick Filters"
|
92
|
+
#--
|
93
|
+
@sheetCount = 0
|
94
|
+
@filterCount = 0
|
95
|
+
@recNum = 0
|
96
|
+
end
|
97
|
+
|
98
|
+
def initializeX
|
71
99
|
# @csvFile = CSV.open(@@csvFileName,'w')
|
72
100
|
# @csvFile << @@csvHeader
|
73
101
|
# @csvRecords = Set.new
|
data/lib/twb/datasource.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.6.
|
4
|
+
version: 4.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Gerrard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: creek
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- lib/twb/analysis/calculatedfields/groupfieldsanalyzer.rb
|
67
67
|
- lib/twb/analysis/calculatedfields/markdownemitter.rb
|
68
68
|
- lib/twb/analysis/datasources/categoricalcolorcodinganalyzer.rb
|
69
|
+
- lib/twb/analysis/datasources/datasourcefieldsanalyzer.rb
|
69
70
|
- lib/twb/analysis/datasources/datasourcefieldscsvemitter.rb
|
70
71
|
- lib/twb/analysis/datasources/datasourceoriginsanalyzer.rb
|
71
72
|
- lib/twb/analysis/datasources/datasourceslocationsanalyzer.rb
|