Module: Fbtok

Defined in:
lib/fbtok/fbtok.rb

Class Method Summary collapse

Class Method Details

.main(args = ARGV) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/fbtok/fbtok.rb', line 5

def self.main( args=ARGV )

opts = {
    debug: true,
    warn:  false,
    file:  nil,
}


parser = OptionParser.new do |parser|
  parser.banner = "Usage: #{$PROGRAM_NAME} [options] DATAFILE or DIR"


  parser.on( "-q", "--quiet",
             "less debug output/messages (default: #{!opts[:debug]})" ) do |debug|
    opts[:debug] = false
  end
  parser.on( "--verbose", "--debug",
               "turn on verbose / debug output (default: #{opts[:debug]})" ) do |debug|
    opts[:debug] = true
  end
  parser.on( "-w", "--warn",
              "turn warnings into errors (default: #{opts[:warn]})" ) do |warn|
    opts[:warn] = true
  end


  parser.on( "-f FILE", "--file FILE",
                "read datafiles (pathspecs) via .csv file") do |file|
    opts[:file] = file
    ## note: for batch (massive) processing auto-set debug (verbose output) to false (as default)
    opts[:debug] = false
  end
end
parser.parse!( args )



if opts[:debug]
  puts "OPTS:"
  p opts
  puts "ARGV:"
  p args
end


# SportDb::Parser::Linter.debug = opts[:debug]
# SportDb::Parser::Linter.warn  = opts[:warn]



## todo/check - use packs or projects or such
##                instead of specs - why? why not?
specs =  if opts[:file]
            read_pathspecs( opts[:file] )
         else
           args = ['/sports/openfootball/euro/2021--europe/euro.txt',
                   '/sports/openfootball/euro/2024--germany/euro.txt']  if args.empty?

            build_pathspecs( args )
         end


pp specs



specs.each_with_index do |rec,i|
    datafiles = rec['datafiles']

    errors = []

    datafiles.each_with_index do |path,j|
      puts "==> [#{i+1}/#{specs.size}, #{j+1}/#{datafiles.size}] reading >#{path}<..."

      txt = read_text( path )
      lexer = SportDb::Lexer.new( txt, debug: opts[:debug] )
      tokens, more_errors = lexer.tokenize_with_errors

      ####
      ## todo - report error on empty file (no tokens!!!)

      puts "   #{tokens.size} token(s)"

      errors += more_errors    if more_errors.size > 0
   end

   if errors.size > 0
      puts
      pp errors
      puts
      puts "!!   #{errors.size} tokenize error(s) in #{datafiles.size} datafiles(s)"
   else
      puts
      puts "OK   no tokenize errors found in #{datafiles.size} datafile(s)"
   end

   ## add errors to rec via rec['errors'] to allow
   ##   for further processing/reporting
   rec['errors'] = errors
end


###
## generate a report if --file option used
if opts[:file]
  buf = SportDb::PathspecReport.new(
            specs,
            title: 'fbtok summary report' ).build

  puts
  puts "SUMMARY:"
  puts buf

  #  maybe write out in the future?
  # basedir  = File.dirname( opts[:file] )
  # basename = File.basename( opts[:file], File.extname( opts[:file] ))
end

puts "bye"

end