class Object

Public Instance Methods

checkFile(fileName) click to toggle source
# File lib/t.rb, line 1
def checkFile fileName
    qfn    = "./#{fileName}"
    exists = File.exists? qnf



require_relative 'twb/tabclass'
require_relative 'twb/tabtool'
require_relative 'twb/dashboard'
require_relative 'twb/datasource'
require_relative 'twb/connection'
require_relative 'twb/docdashboard'
require_relative 'twb/dbfield'
require_relative 'twb/localfield'
require_relative 'twb/metadatafield'
require_relative 'twb/storyboard'
require_relative 'twb/window'
require_relative 'twb/workbook'
require_relative 'twb/worksheet'
require_relative 'twb/parameter'
require_relative 'twb/action'
require_relative 'twb/columnfield.rb'
require_relative 'twb/calculatedfield'
require_relative 'twb/codedfield'
require_relative 'twb/groupfield'
require_relative 'twb/fieldcalculation'
require_relative 'twb/quickfilter'
require_relative 'twb/docdashboardimagevert'
require_relative 'twb/docdashboardwebvert'
require_relative 'twb/util/twbDashSheetDataDotBuilder'
require_relative 'twb/util/dotFileRenderer'
require_relative 'twb/util/htmllistcollapsible'
require_relative 'twb/util/xraydashboards'
require_relative 'twb/util/graph'
require_relative 'twb/util/graphnode'
require_relative 'twb/util/graphedge'
require_relative 'twb/util/graphedges'
require_relative 'twb/util/gml'
require_relative 'twb/util/cypher'
require_relative 'twb/util/cypherpython'
require_relative 'twb/util/fielddomainloader'
require_relative 'twb/util/docprep'
require_relative 'twb/analysis/documentedfieldsmarkdownemitter'
require_relative 'twb/analysis/annotatedfieldscsvemitter'
require_relative 'twb/analysis/WorkbookSummaryAnalyzer'
require_relative 'twb/analysis/calculatedfields/calculatedfieldsanalyzer'
require_relative 'twb/analysis/calculatedfields/groupfieldsanalyzer'
require_relative 'twb/analysis/calculatedfields/markdownemitter'
require_relative 'twb/analysis/calculatedfields/csvemitter'
require_relative 'twb/analysis/datasources/DataSourceFieldsCSVEmitter'
require_relative 'twb/analysis/datasources/DataSourceTableFieldsCSVEmitter'
require_relative 'twb/analysis/datasources/categoricalColorCodingAnalyzer'
require_relative 'twb/analysis/datasources/googlesheetdatasourcesanalyzer'
require_relative 'twb/analysis/datasources/parametersanalyzer'
require_relative 'twb/analysis/datasources/DataSourceOriginsAnalyzer'
require_relative 'twb/analysis/Sheets/WorksheetDataStructureCSVEmitter'
require_relative 'twb/analysis/Sheets/sheetfiltersanalyzer'
require_relative 'twb/analysis/Sheets/sheetfieldsanalyzer'
require_relative 'twb/analysis/Sheets/dashsheetsanalyzer'


# Represents Tableau Workbooks, their contents, and classes that analyze and manipulate them.
#
module Twb
  VERSION = '4.5.1'
emit(stuff) click to toggle source
# File lib/twb/countNodes.rb, line 36
def emit stuff
    $pFile.puts stuff
           puts stuff if $localEmit
end
init() click to toggle source
# File lib/twb/countNodes.rb, line 5
def init
  system 'cls'
  $pFile = File.open('sqlFromTwbDc.txt','w')

  sqiCSV = 'TWBFieldsByType.csv'
  $fieldsCSV = CSV.open(sqiCSV, 'w')
  $fieldsCSV    << [
                    'TWB', 
                    'Data Connection - UI', 
                    'Field Name', 
                    'Field Type', 
                   ]
  $path    = if ARGV.empty? then '**/*.twb' else ARGV[0] end
  emit " "
  emit " Generating SQL Create Table code for Tableau Workbook Data Connections (TWDCs)."
  emit " Each TWDC will have it's own *.sql file containing the SQL code.\n "
  emit " Looking for Workbooks matching: '#{$path}'  - from: #{ARGV[0]}\n\n "
end
localColumns(dataSource) click to toggle source
# File lib/twb/findDSFields.rb, line 80
def localColumns dataSource
  emit "\t localColumns  " #connClass: '%s'" % [connClass]
  colNodes = dataSource.xpath('./column')
  emit "  colNodes.size: #{colNodes.size}"
  fields = {}
  colNodes.each do |node|
    calcField = !node.at_xpath('./calculation').nil?
    caption   = node.attribute('caption')
    name      = node.attribute('name').text.gsub(/^\[/,'').gsub(/\]$/,'')
    type      = node.attribute('datatype')
    emit "  \t    name: %s\n \t    type: %s\n \t caption: %s" % [name, type, caption]
    caption   = name if caption.nil?
    emit "  \t caption: %s  \n " % [caption]
    fields[caption] = {'type' => type, 'calcField' => calcField}
  end
  return fields
end
metaDataRecords(dataSource) click to toggle source
# File lib/twb/findDSFields.rb, line 67
def metaDataRecords dataSource
  emit "\t metaDataRecords  " #connClass: '%s'" % [connClass]
  mdNodes = dataSource.xpath('./connection/metadata-records/metadata-record[@class="column"]')
  emit "  mdNodes.size: #{mdNodes.size}"
  fields = {}
  mdNodes.each do |node|
    name = node.xpath('./local-name').text.gsub(/^\[/,'').gsub(/\]$/,'')
    type = node.xpath('./local-type').text
    fields[name] = {'type' => type}
  end
  return fields
end
method_name() click to toggle source
# File lib/twb/countNodes.rb, line 24
def method_name
    datasources     = {}
    dataSourcesNode  = doc.at_xpath('//workbook/datasources')
    dataSourcesNodes = doc.xpath('//workbook/datasources/datasource').to_a
    puts "  dsn: #{dataSourcesNodes}"
    datasourceNodes.each do |node|
        datasource = Twb::DataSource.new(node)
        datasources[datasource.name] = datasource
    end
end
proc(file) click to toggle source
# File lib/twb/countNodes.rb, line 47
def proc file
  emit "\n == #{file}"
end
process(file) click to toggle source
# File lib/twb/countNodes.rb, line 51
def process file
  emit "\n == #{file}"
  doc = Nokogiri::XML(open(file))
  dataSourcesNodes = doc.xpath('//workbook/datasources/datasource')
  dataSourcesNodes.each do |ds|
    emit "\n   dc: #{ds.attribute('caption')}"
    emit   "   dn: #{ds.attribute('name')}\n   ---"
    typeCounts = {}
    $paths.each do |type, path|
      nodes = ds.xpath(path).to_a
#      emit "     : %3i  %-17s  %-s" % [nodes.size, type, path]
      typeCnt = nodes.size
      nodes.each do |n|
        $fieldsCSV << [file,ds.attribute('name'),n.attribute('name'),type]
      end
      if type == 'Columns' then 
        calcCnt = 0
        nodes.each do |n|
          calc = n.xpath('./calculation')
#          emit "    c:   #{calc.size} "
          calcCnt += calc.size
        end
#        emit '   ---'
#        emit "   c#: %3i " % [calcCnt]
#        emit "  !c#: %3i " % [nodes.size - calcCnt]
        typeCounts['Columns']            = nodes.size 
        typeCounts['Columns - calc']     = calcCnt 
        typeCounts['Columns - not calc'] = nodes.size - calcCnt 
      else
        typeCounts[type] = typeCnt 
      end
    end
#    emit '   ---'
    typeCounts.each do |t,c|
      emit "   tc: %3i  %-s" % [c, t]
    end
  end
end
processTwb(twbName) click to toggle source
# File lib/twb/analysis/Sheets/analyzedashboardsheets.rb, line 24
def processTwb twbName
    twb = Twb::Workbook.new twbName
    puts  "\t - #{twb.name}"
    # --
    $analyzer.processTWB twb
    # --
    $twbCount += 1
end
relationFields(dataSource, connClass) click to toggle source
# File lib/twb/findDSFields.rb, line 57
def relationFields dataSource, connClass
  emit "\t relationFields  connClass: '%s'" % [connClass]
  xPaths     = $relClassPaths[connClass]
  emit "\t xPaths: #{xPaths}"
  fnodesPath = xPaths['fieldXPath']
  fnamePath  = xPaths['nameXPath']
  fieldNodes = dataSource.xpath(fnodesPath)
    
end
showPaths() click to toggle source
# File lib/twb/findDSFields.rb, line 139
def showPaths
  $paths.each do |type, paths|
        emit "  #{type}"
    paths.each do |key, value|
      emit "      : %10s  =>  %-s" % [key, value]    
    end
    puts " "
  end
end