twb 1.0.5 → 1.9.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.
@@ -1,80 +0,0 @@
1
- # Copyright (C) 2014, 2015 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
-
18
- system "cls"
19
-
20
- $doctwb = true
21
- $replacetwb = false # true|false - replace/new name TWB
22
- $dashdoclbl = 'dashdoc'
23
- $localurl = 'file:///' + Dir.pwd + '/' # for Dashboard Web Page objects
24
-
25
- def xray twbname
26
- twb = Twb::Workbook.new(twbname)
27
- xrayer = Twb::DashboardXRayer.new(twb)
28
- xrays = xrayer.xray
29
- cnt = 0
30
- xrays.each do |dash, html|
31
- htmlfilename = twb.name + '.' + dash.to_s + '.html'
32
- saveHTML(htmlfilename, html)
33
- cnt += 1
34
- if $doctwb
35
- inject(twb, dash.to_s, htmlfilename)
36
- end
37
- end
38
- puts "\t #{cnt} \t #{twbname}"
39
- end
40
-
41
- def saveHTML(htmlfilename, html)
42
- begin
43
- htmlfile = File.open(htmlfilename, 'w')
44
- htmlfile.puts html
45
- htmlfile.close
46
- rescue
47
- # Common failure is when the Dashboard name contains
48
- # invalid file name Characters. or when the name is
49
- # an invalid file name.
50
- # Stripping the non-ASCII characters from the Dashboard
51
- # name fixes this, in the cases seen so far.
52
- # This rescue-recursion technique can potentially cause
53
- # an infite-loop condition. (not seen, but possible)
54
- saveHTML( sanitize(htmlfilename), html)
55
- end
56
- end
57
-
58
- def inject(twb, dashboard, htmlfilename)
59
- vDash = Twb::DocDashboardWebVert.new
60
- vDash.title=('Doc Dashboard: ' + sanitize(dashboard))
61
- vDash.url=($localurl + '/' + htmlfilename)
62
- twb.addDocDashboard(vDash)
63
- if $replacetwb
64
- twb.write
65
- else
66
- twb.writeAppend($dashdoclbl)
67
- end
68
- end
69
-
70
- def sanitize(str)
71
- str.gsub(/[^a-z0-9\-]+/i, ' ')
72
- end
73
-
74
- system 'cls'
75
- puts "\n\n\t X-raying Dashboards"
76
- puts "\n\n\t # Dashboards Workbook"
77
- puts "\n\t ------------ ----------------------"
78
-
79
- path = if ARGV.empty? then '*.twb' else ARGV[0] end
80
- Dir.glob(path) {|twb| xray twb }
@@ -1,98 +0,0 @@
1
- require 'nokogiri'
2
- require 'csv'
3
- require 'twb'
4
-
5
- def init
6
- system 'cls'
7
- $pFile = File.open('sqlFromTwbDc.txt','w')
8
-
9
- sqiCSV = 'TWBFieldsByType.csv'
10
- $fieldsCSV = CSV.open(sqiCSV, 'w')
11
- $fieldsCSV << [
12
- 'TWB',
13
- 'Data Connection - UI',
14
- 'Field Name',
15
- 'Field Type',
16
- ]
17
- $path = if ARGV.empty? then '**/*.twb' else ARGV[0] end
18
- emit " "
19
- emit " Generating SQL Create Table code for Tableau Workbook Data Connections (TWDCs)."
20
- emit " Each TWDC will have it's own *.sql file containing the SQL code.\n "
21
- emit " Looking for Workbooks matching: '#{$path}' - from: #{ARGV[0]}\n\n "
22
- end
23
-
24
- def method_name
25
- datasources = {}
26
- dataSourcesNode = doc.at_xpath('//workbook/datasources')
27
- dataSourcesNodes = doc.xpath('//workbook/datasources/datasource').to_a
28
- puts " dsn: #{dataSourcesNodes}"
29
- datasourceNodes.each do |node|
30
- datasource = Twb::DataSource.new(node)
31
- datasources[datasource.name] = datasource
32
- end
33
- end
34
-
35
- $localEmit = true
36
- def emit stuff
37
- $pFile.puts stuff
38
- puts stuff if $localEmit
39
- end
40
-
41
- $paths = {
42
- 'Relation Columns' => './connection/relation/columns/column',
43
- 'Metadata Records' => './connection/metadata-records/metadata-record',
44
- 'Columns' => './column',
45
- }
46
-
47
- def proc file
48
- emit "\n == #{file}"
49
- end
50
-
51
- def process file
52
- emit "\n == #{file}"
53
- doc = Nokogiri::XML(open(file))
54
- dataSourcesNodes = doc.xpath('//workbook/datasources/datasource')
55
- dataSourcesNodes.each do |ds|
56
- emit "\n dc: #{ds.attribute('caption')}"
57
- emit " dn: #{ds.attribute('name')}\n ---"
58
- typeCounts = {}
59
- $paths.each do |type, path|
60
- nodes = ds.xpath(path).to_a
61
- # emit " : %3i %-17s %-s" % [nodes.size, type, path]
62
- typeCnt = nodes.size
63
- nodes.each do |n|
64
- $fieldsCSV << [file,ds.attribute('name'),n.attribute('name'),type]
65
- end
66
- if type == 'Columns' then
67
- calcCnt = 0
68
- nodes.each do |n|
69
- calc = n.xpath('./calculation')
70
- # emit " c: #{calc.size} "
71
- calcCnt += calc.size
72
- end
73
- # emit ' ---'
74
- # emit " c#: %3i " % [calcCnt]
75
- # emit " !c#: %3i " % [nodes.size - calcCnt]
76
- typeCounts['Columns'] = nodes.size
77
- typeCounts['Columns - calc'] = calcCnt
78
- typeCounts['Columns - not calc'] = nodes.size - calcCnt
79
- else
80
- typeCounts[type] = typeCnt
81
- end
82
- end
83
- # emit ' ---'
84
- typeCounts.each do |t,c|
85
- emit " tc: %3i %-s" % [c, t]
86
- end
87
- end
88
- end
89
-
90
- init
91
-
92
- $paths.each do |path|
93
- emit " p: #{path}"
94
- end
95
-
96
- Dir.glob($path) {|twb| process twb }
97
-
98
- emit "\n\n== Done ==\n "