fbtok 0.0.1 → 0.1.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: 434d60833636dd403ce4671279c847aa446295236685f264fa31b4791d9cdf82
4
- data.tar.gz: 55729c6c2100163e05af42f53121958f7b9442ee15e07af2bfc28a7a94cdb75f
3
+ metadata.gz: b4ab88883b8f80ee4824cab352297f037e2afcb72351bf6956a8e48bddd5a164
4
+ data.tar.gz: 6bd75bea2015124e34b01f506757a54a5537ca0544559a0377b6f0a6a0533c0b
5
5
  SHA512:
6
- metadata.gz: e0694f22d437e9d614070acf083db4c4b522d99fe20c0c53370c6dd59d73107cc9ab7f94b26a049c4f3031f2acbfef2ff64ad0eb447dd6c2a54c34293becc717
7
- data.tar.gz: fbe918cfe469447bcc1b77e9bb12a17e6430e6dc1bf5e287637cc0cb8379f606582c9adbfb1e3150609887db26fc7f75506f7faa64ae992f4e7a5487b7d0c16e
6
+ metadata.gz: 94b3582db70136fdeadeebe003fefdff304ca923bd76edcc0a40d28731c64e73f372b7c0ecf74e58623358102c32ad51e0a233becee4555d5ccd322552d53d80
7
+ data.tar.gz: dca47c3d3e134ed9c103ba873e76e0c4793d690bbaf6ced8a34693e4c2fea3fc1ff43af0d45ebc62738022f02bb02a0e0bcc04c153dd752a49c7a50d62ba6bba
data/CHANGELOG.md CHANGED
@@ -1,3 +1,4 @@
1
+ ### 0.1.1
1
2
  ### 0.0.1 / 2025-01-02
2
3
 
3
4
  * Everything is new. First release.
data/Manifest.txt CHANGED
@@ -2,8 +2,10 @@ CHANGELOG.md
2
2
  Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
+ bin/fbchk
6
+ bin/fbt
5
7
  bin/fbtok
8
+ bin/fbx
6
9
  lib/fbtok.rb
7
- lib/fbtok/fbtok.rb
8
10
  lib/fbtok/linter.rb
9
11
  lib/fbtok/opts.rb
data/README.md CHANGED
@@ -19,6 +19,20 @@ $ gem install fbtok
19
19
 
20
20
  ## Usage
21
21
 
22
+
23
+ ### fbtok - use tokenizer/parser
24
+
25
+ - depends on sportdb-parser
26
+
27
+ ### fbt - use quick match reader & fbx - dump match schedule - uses quick league & match readers
28
+
29
+ - depends on sportdb-quick
30
+
31
+ ### fbchk - use quick match linter; check league and team names via search & more
32
+
33
+ - depends on sportdb-formats (incl. sportdb-search & sportdb-catalogs)
34
+
35
+
22
36
  ...
23
37
 
24
38
 
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'hoe'
2
2
 
3
3
 
4
4
  Hoe.spec 'fbtok' do
5
- self.version = '0.0.1'
5
+ self.version = '0.1.1'
6
6
 
7
7
  self.summary = "fbtok - football.txt lint tools incl. tokenizer, parser & more"
8
8
  self.description = summary
@@ -19,7 +19,10 @@ Hoe.spec 'fbtok' do
19
19
  self.licenses = ['Public Domain']
20
20
 
21
21
  self.extra_deps = [
22
- ['sportdb-parser', '>= 0.3.9'],
22
+ # ['sportdb-parser', '>= 0.2.2'],
23
+ # ['sportdb-structs', '>= 0.5.0'],
24
+ # ['logutils', '>= 0.6.1'],
25
+ ['sportdb-formats', '>= 2.1.2'],
23
26
  ]
24
27
 
25
28
  self.spec_extras = {
data/bin/fbchk ADDED
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ## tip: to test run:
4
+ ## ruby -I ./lib bin/fbchk
5
+
6
+
7
+ ## local hack for debugging
8
+ ## use local versions if present
9
+ $LOAD_PATH.unshift( File.expand_path( '/sports/sportdb/sport.db/sportdb-structs/lib' ))
10
+ $LOAD_PATH.unshift( File.expand_path( '/sports/sportdb/sport.db/sportdb-catalogs/lib' ))
11
+ $LOAD_PATH.unshift( File.expand_path( '/sports/sportdb/sport.db/sportdb-search/lib' ))
12
+
13
+
14
+ ## our own code
15
+ require 'fbtok'
16
+
17
+
18
+
19
+ ## local hack
20
+ ## if exists up-to-date catalog db (use local version NOT built-in)
21
+ catalog_path = '/sports/sportdb/sport.db/catalog/catalog.db'
22
+ if File.exist?( catalog_path )
23
+ SportDb::Import.config.catalog_path = catalog_path
24
+ end
25
+
26
+
27
+ args = ARGV
28
+ opts = { debug: false,
29
+ file: nil,
30
+ teams: true, ## check/lint teams (name errros etc.)
31
+ }
32
+
33
+ parser = OptionParser.new do |parser|
34
+ parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
35
+
36
+ ##
37
+ ## check if git has a offline option?? (use same)
38
+ ## check for other tools - why? why not?
39
+ # parser.on( "-q", "--quiet",
40
+ # "less debug output/messages - default is (#{!opts[:debug]})" ) do |debug|
41
+ # opts[:debug] = false
42
+ # end
43
+ parser.on( "--verbose", "--debug",
44
+ "turn on verbose / debug output (default: #{opts[:debug]})" ) do |debug|
45
+ opts[:debug] = true
46
+ end
47
+
48
+ parser.on( "-f FILE", "--file FILE",
49
+ "read datafiles (pathspecs) via .csv file") do |file|
50
+ opts[:file] = file
51
+ end
52
+
53
+ parser.on( "--[no-]teams",
54
+ "turn on/off team name checks (default: #{opts[:teams]})") do |teams|
55
+ opts[:teams] = teams
56
+ end
57
+ end
58
+ parser.parse!( args )
59
+
60
+
61
+ puts "OPTS:"
62
+ p opts
63
+ puts "ARGV:"
64
+ p args
65
+
66
+
67
+ ## todo/check - use packs or projects or such
68
+ ## instead of specs - why? why not?
69
+ specs = []
70
+ if opts[:file]
71
+ recs = read_csv( opts[:file] )
72
+ pp recs
73
+ ## note - make pathspecs relative to passed in file arg!!!
74
+ basedir = File.dirname( opts[:file] )
75
+ recs.each do |rec|
76
+ paths = SportDb::Parser::Opts.find( rec['path'], dir: basedir )
77
+ specs << [paths, rec]
78
+ end
79
+ else
80
+ paths = if args.empty?
81
+ []
82
+ else
83
+ ## check for directories
84
+ ## and auto-expand
85
+ SportDb::Parser::Opts.expand_args( args )
86
+ end
87
+ specs << [paths, {}]
88
+ end
89
+
90
+
91
+ if opts[:debug]
92
+ SportDb::QuickMatchLinter.debug = true
93
+ SportDb::QuickMatchReader.debug = true
94
+ SportDb::MatchParser.debug = true
95
+ else
96
+ SportDb::QuickMatchLinter.debug = false
97
+ SportDb::QuickMatchReader.debug = false
98
+ SportDb::MatchParser.debug = false
99
+ LogUtils::Logger.root.level = :info
100
+ end
101
+
102
+
103
+ specs.each_with_index do |(paths, rec),i|
104
+ errors = []
105
+ paths.each_with_index do |path,j|
106
+ puts "==> [#{j+1}/#{paths.size}] reading >#{path}<..."
107
+ quick = SportDb::QuickMatchLinter.new( read_text( path ),
108
+ check_teams: opts[:teams] )
109
+ matches = quick.parse
110
+
111
+
112
+ if quick.errors?
113
+ puts "!! #{quick.errors.size} error(s):"
114
+ pp quick.errors
115
+
116
+ quick.errors.each do |err|
117
+ errors << [ path, *err ] # note: use splat (*) to add extra values (starting with msg)
118
+ end
119
+ end
120
+ puts " #{matches.size} match(es)"
121
+ end
122
+
123
+ if errors.size > 0
124
+ puts
125
+ puts "!! #{errors.size} PARSE ERRORS in #{paths.size} datafile(s)"
126
+ pp errors
127
+ else
128
+ puts
129
+ puts " OK - no parse errors in #{paths.size} datafile(s)"
130
+ end
131
+
132
+ ## add errors to rec via rec['errors'] to allow
133
+ ## for further processing/reporting
134
+ rec['errors'] = errors
135
+ end
136
+
137
+
138
+
139
+ ###
140
+ ## generate a report if --file option used
141
+ if opts[:file]
142
+
143
+ buf = String.new
144
+
145
+ buf << "# fbchk summary report - #{specs.size} dataset(s)\n\n"
146
+
147
+ specs.each_with_index do |(paths, rec),i|
148
+ errors = rec['errors']
149
+
150
+ if errors.size > 0
151
+ buf << "!! #{errors.size} ERROR(S) "
152
+ else
153
+ buf << " OK "
154
+ end
155
+ buf << "%-20s" % rec['path']
156
+ buf << " - #{paths.size} datafile(s)"
157
+ buf << "\n"
158
+
159
+ if errors.size > 0
160
+ buf << errors.pretty_inspect
161
+ buf << "\n"
162
+ end
163
+ end
164
+
165
+ puts
166
+ puts "SUMMARY:"
167
+ puts buf
168
+
169
+ basedir = File.dirname( opts[:file] )
170
+ basename = File.basename( opts[:file], File.extname( opts[:file] ))
171
+ outpath = "#{basedir}/fbcheck.#{basename}.txt"
172
+ write_text( outpath, buf )
173
+ end
174
+
175
+
176
+ puts "bye"
177
+
data/bin/fbt ADDED
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ## tip: to test run:
4
+ ## ruby -I ./lib bin/fbt
5
+ ## -or-
6
+ ## ruby -I ../parser/lib -I ./lib bin/fbt
7
+ ## -or-
8
+ ## ruby -I ../parser/lib -I ../sportdb-structs/lib -I ./lib bin/fbt
9
+
10
+
11
+ ## our own code
12
+ require 'fbtok'
13
+
14
+
15
+ ##
16
+ ## read textfile
17
+ ## and dump tokens
18
+ ##
19
+ ## fbt ../openfootball/.../euro.txt
20
+
21
+
22
+
23
+
24
+ args = ARGV
25
+ opts = { debug: false,
26
+ file: nil,
27
+ }
28
+
29
+ parser = OptionParser.new do |parser|
30
+ parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
31
+
32
+ ##
33
+ ## check if git has a offline option?? (use same)
34
+ ## check for other tools - why? why not?
35
+ # parser.on( "-q", "--quiet",
36
+ # "less debug output/messages - default is (#{!opts[:debug]})" ) do |debug|
37
+ # opts[:debug] = false
38
+ # end
39
+ parser.on( "--verbose", "--debug",
40
+ "turn on verbose / debug output (default: #{opts[:debug]})" ) do |debug|
41
+ opts[:debug] = true
42
+ end
43
+
44
+ parser.on( "-f FILE", "--file FILE",
45
+ "read datafiles (pathspecs) via .csv file") do |file|
46
+ opts[:file] = file
47
+ end
48
+
49
+
50
+ end
51
+ parser.parse!( args )
52
+
53
+ puts "OPTS:"
54
+ p opts
55
+ puts "ARGV:"
56
+ p args
57
+
58
+
59
+ ## todo/check - use packs or projects or such
60
+ ## instead of specs - why? why not?
61
+ specs = []
62
+ if opts[:file]
63
+ recs = read_csv( opts[:file] )
64
+ pp recs
65
+ ## note - make pathspecs relative to passed in file arg!!!
66
+ basedir = File.dirname( opts[:file] )
67
+ recs.each do |rec|
68
+ paths = SportDb::Parser::Opts.find( rec['path'], dir: basedir )
69
+ specs << [paths, rec]
70
+ end
71
+ else
72
+ paths = if args.empty?
73
+ [
74
+ '../../../openfootball/euro/2021--europe/euro.txt',
75
+ '../../../openfootball/euro/2024--germany/euro.txt',
76
+ ]
77
+ else
78
+ ## check for directories
79
+ ## and auto-expand
80
+ SportDb::Parser::Opts.expand_args( args )
81
+ end
82
+ specs << [paths, {}]
83
+ end
84
+
85
+
86
+ if opts[:debug]
87
+ SportDb::QuickMatchReader.debug = true
88
+ SportDb::MatchParser.debug = true
89
+ else
90
+ SportDb::QuickMatchReader.debug = false
91
+ SportDb::MatchParser.debug = false
92
+ LogUtils::Logger.root.level = :info
93
+ end
94
+
95
+
96
+ specs.each_with_index do |(paths, rec),i|
97
+ errors = []
98
+ paths.each_with_index do |path,j|
99
+ puts "==> [#{j+1}/#{paths.size}] reading >#{path}<..."
100
+ quick = SportDb::QuickMatchReader.new( read_text( path ) )
101
+ matches = quick.parse
102
+
103
+ if quick.errors?
104
+ puts "!! #{quick.errors.size} error(s):"
105
+ pp quick.errors
106
+
107
+ quick.errors.each do |err|
108
+ errors << [ path, *err ] # note: use splat (*) to add extra values (starting with msg)
109
+ end
110
+ end
111
+ puts " #{matches.size} match(es)"
112
+ end
113
+
114
+ if errors.size > 0
115
+ puts
116
+ puts "!! #{errors.size} PARSE ERRORS in #{paths.size} datafile(s)"
117
+ pp errors
118
+ else
119
+ puts
120
+ puts " OK - no parse errors in #{paths.size} datafile(s)"
121
+ end
122
+
123
+ ## add errors to rec via rec['errors'] to allow
124
+ ## for further processing/reporting
125
+ rec['errors'] = errors
126
+ end
127
+
128
+
129
+
130
+ ###
131
+ ## generate a report if --file option used
132
+ if opts[:file]
133
+
134
+ buf = String.new
135
+
136
+ buf << "# fbt summary report - #{specs.size} dataset(s)\n\n"
137
+
138
+ specs.each_with_index do |(paths, rec),i|
139
+ errors = rec['errors']
140
+
141
+ if errors.size > 0
142
+ buf << "!! #{errors.size} ERROR(S) "
143
+ else
144
+ buf << " OK "
145
+ end
146
+ buf << "%-20s" % rec['path']
147
+ buf << " - #{paths.size} datafile(s)"
148
+ buf << "\n"
149
+
150
+ if errors.size > 0
151
+ buf << errors.pretty_inspect
152
+ buf << "\n"
153
+ end
154
+ end
155
+
156
+ puts
157
+ puts "SUMMARY:"
158
+ puts buf
159
+
160
+ # maybe write out in the future?
161
+ # basedir = File.dirname( opts[:file] )
162
+ # basename = File.basename( opts[:file], File.extname( opts[:file] ))
163
+ end
164
+
165
+
166
+ puts "bye"
167
+
data/bin/fbtok CHANGED
@@ -5,9 +5,141 @@
5
5
 
6
6
  require 'fbtok'
7
7
 
8
+ args = ARGV
9
+
8
10
 
9
- Fbtok.main( ARGV )
11
+ opts = {
12
+ debug: true,
13
+ metal: false,
14
+ file: nil,
15
+ }
10
16
 
17
+ parser = OptionParser.new do |parser|
18
+ parser.banner = "Usage: #{$PROGRAM_NAME} [options] PATH"
19
+
20
+
21
+ parser.on( "-q", "--quiet",
22
+ "less debug output/messages - default is (#{!opts[:debug]})" ) do |debug|
23
+ opts[:debug] = false
24
+ end
25
+ parser.on( "--verbose", "--debug",
26
+ "turn on verbose / debug output (default: #{opts[:debug]})" ) do |debug|
27
+ opts[:debug] = true
28
+ end
29
+
30
+ parser.on( "--metal",
31
+ "turn off typed parse tree; show to the metal tokens"+
32
+ " (default: #{opts[:metal]})" ) do |metal|
33
+ opts[:metal] = true
34
+ end
35
+
36
+ parser.on( "-f FILE", "--file FILE",
37
+ "read datafiles (pathspecs) via .csv file") do |file|
38
+ opts[:file] = file
39
+ ## note: for batch (massive) processing auto-set debug (verbose output) to false (as default)
40
+ opts[:debug] = false
41
+ end
42
+ end
43
+ parser.parse!( args )
44
+
45
+ puts "OPTS:"
46
+ p opts
47
+ puts "ARGV:"
48
+ p args
49
+
50
+
51
+ ## todo/check - use packs or projects or such
52
+ ## instead of specs - why? why not?
53
+ specs = []
54
+ if opts[:file]
55
+ recs = read_csv( opts[:file] )
56
+ pp recs
57
+ ## note - make pathspecs relative to passed in file arg!!!
58
+ basedir = File.dirname( opts[:file] )
59
+ recs.each do |rec|
60
+ paths = SportDb::Parser::Opts.find( rec['path'], dir: basedir )
61
+ specs << [paths, rec]
62
+ end
63
+ else
64
+ paths = if args.empty?
65
+ [
66
+ '../../../openfootball/euro/2021--europe/euro.txt',
67
+ '../../../openfootball/euro/2024--germany/euro.txt',
68
+ ]
69
+ else
70
+ ## check for directories
71
+ ## and auto-expand
72
+ SportDb::Parser::Opts.expand_args( args )
73
+ end
74
+ specs << [paths, {}]
75
+ end
76
+
77
+
78
+ SportDb::Parser::Linter.debug = true if opts[:debug]
79
+
80
+ linter = SportDb::Parser::Linter.new
81
+
82
+
83
+ specs.each_with_index do |(paths, rec),i|
84
+ errors = []
85
+
86
+ paths.each_with_index do |path,j|
87
+ puts "==> [#{j+1}/#{paths.size}] reading >#{path}<..."
88
+ linter.read( path, parse: !opts[:metal] )
89
+
90
+ errors += linter.errors if linter.errors?
91
+ end
92
+
93
+ if errors.size > 0
94
+ puts
95
+ pp errors
96
+ puts
97
+ puts "!! #{errors.size} parse error(s) in #{paths.size} datafiles(s)"
98
+ else
99
+ puts
100
+ puts "OK no parse errors found in #{paths.size} datafile(s)"
101
+ end
102
+
103
+ ## add errors to rec via rec['errors'] to allow
104
+ ## for further processing/reporting
105
+ rec['errors'] = errors
106
+ end
107
+
108
+
109
+ ###
110
+ ## generate a report if --file option used
111
+ if opts[:file]
112
+
113
+ buf = String.new
114
+
115
+ buf << "# fbtok summary report - #{specs.size} dataset(s)\n\n"
116
+
117
+ specs.each_with_index do |(paths, rec),i|
118
+ errors = rec['errors']
119
+
120
+ if errors.size > 0
121
+ buf << "!! #{errors.size} ERROR(S) "
122
+ else
123
+ buf << " OK "
124
+ end
125
+ buf << "%-20s" % rec['path']
126
+ buf << " - #{paths.size} datafile(s)"
127
+ buf << "\n"
128
+
129
+ if errors.size > 0
130
+ buf << errors.pretty_inspect
131
+ buf << "\n"
132
+ end
133
+ end
134
+
135
+ puts
136
+ puts "SUMMARY:"
137
+ puts buf
138
+
139
+ # maybe write out in the future?
140
+ # basedir = File.dirname( opts[:file] )
141
+ # basename = File.basename( opts[:file], File.extname( opts[:file] ))
142
+ end
11
143
 
12
144
  puts "bye"
13
145
 
data/bin/fbx ADDED
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ## tip: to test run:
4
+ ## ruby -I ./lib -I ../parser/lib bin/fbx
5
+
6
+ ##
7
+ ## todo/fix - use for testing
8
+ # reads textfile and dumps results in json
9
+ #
10
+ # check - keep fbx name or find a differnt name - why? why not?
11
+
12
+
13
+ ## our own code
14
+ require 'fbtok'
15
+
16
+
17
+ ##
18
+ ## read textfile
19
+ ## and dump match parse results
20
+ ##
21
+ ## fbt ../openfootball/.../euro.txt
22
+
23
+
24
+
25
+
26
+ args = ARGV
27
+ opts = { debug: false,
28
+ outline: false }
29
+
30
+ parser = OptionParser.new do |parser|
31
+ parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
32
+
33
+ ##
34
+ ## check if git has a offline option?? (use same)
35
+ ## check for other tools - why? why not?
36
+
37
+
38
+ parser.on( "--verbose", "--debug",
39
+ "turn on verbose / debug output (default: #{opts[:debug]})" ) do |debug|
40
+ opts[:debug] = debug
41
+ end
42
+
43
+ parser.on( "--outline",
44
+ "turn on outline (only) output (default: #{opts[:outline]})" ) do |outline|
45
+ opts[:outline] = outline
46
+ end
47
+ end
48
+ parser.parse!( args )
49
+
50
+ puts "OPTS:"
51
+ p opts
52
+ puts "ARGV:"
53
+ p args
54
+
55
+
56
+
57
+
58
+
59
+ paths = if args.empty?
60
+ [
61
+ '../../../openfootball/euro/2021--europe/euro.txt',
62
+ '../../../openfootball/euro/2024--germany/euro.txt',
63
+ ]
64
+ else
65
+ ## check for directories
66
+ ## and auto-expand
67
+
68
+ SportDb::Parser::Opts.expand_args( args )
69
+ end
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+ SportDb::MatchParser.debug = true if opts[:debug]
78
+
79
+
80
+ ## errors = []
81
+
82
+
83
+ paths.each_with_index do |path,i|
84
+ puts "==> [#{i+1}/#{paths.size}] reading >#{path}<..."
85
+
86
+ txt = read_text( path )
87
+ secs = SportDb::QuickLeagueOutlineReader.parse( txt )
88
+ ## pp secs
89
+
90
+ secs.each_with_index do |sec,j| ## sec(tion)s
91
+ season = sec[:season]
92
+ league = sec[:league]
93
+ stage = sec[:stage]
94
+ lines = sec[:lines]
95
+
96
+ puts " section #{j+1}/#{secs.size} - #{league.name} #{season}, #{stage} - #{lines.size} line(s)"
97
+
98
+ next if opts[:outline]
99
+
100
+ =begin
101
+ ### check if event info availabe - use start_date;
102
+ ## otherwise we have to guess (use a "synthetic" start_date)
103
+ event_info = catalog.events.find_by( season: season,
104
+ league: league )
105
+
106
+ start = if event_info && event_info.start_date
107
+ puts "event info found:"
108
+ puts " using start date from event: "
109
+ pp event_info
110
+ pp event_info.start_date
111
+ event_info.start_date
112
+ else
113
+ =end
114
+ start = if season.year?
115
+ Date.new( season.start_year, 1, 1 )
116
+ else
117
+ Date.new( season.start_year, 7, 1 )
118
+ end
119
+
120
+ parser = SportDb::MatchParser.new( lines,
121
+ start ) ## note: keep season start_at date for now (no need for more specific stage date need for now)
122
+
123
+ auto_conf_teams, matches, rounds, groups = parser.parse
124
+
125
+ puts ">>> #{auto_conf_teams.size} teams:"
126
+ pp auto_conf_teams
127
+ puts ">>> #{matches.size} matches:"
128
+ ## pp matches
129
+ puts ">>> #{rounds.size} rounds:"
130
+ pp rounds
131
+ puts ">>> #{groups.size} groups:"
132
+ pp groups
133
+ end # each secs
134
+ end # each paths
135
+
136
+ =begin
137
+ if errors.size > 0
138
+ puts
139
+ pp errors
140
+ puts
141
+ puts "!! #{errors.size} parse error(s) in #{paths.size} datafiles(s)"
142
+ else
143
+ puts
144
+ puts "OK no parse errors found in #{paths.size} datafile(s)"
145
+ end
146
+ =end
147
+
148
+ puts "bye"
149
+
data/lib/fbtok.rb CHANGED
@@ -1,9 +1,13 @@
1
1
 
2
- require 'sportdb/parser'
2
+ require 'sportdb/formats'
3
+
4
+
5
+ ## more stdlibs
6
+ require 'optparse' ## check - already auto-required in cocos? keep? why? why not?
3
7
 
4
8
 
5
9
  ## our own code
6
10
  require_relative 'fbtok/opts'
7
- require_relative 'fbtok/fbtok'
11
+ require_relative 'fbtok/linter'
8
12
 
9
13
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fbtok
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
@@ -11,19 +11,19 @@ cert_chain: []
11
11
  date: 2025-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: sportdb-parser
14
+ name: sportdb-formats
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.9
19
+ version: 2.1.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.3.9
26
+ version: 2.1.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rdoc
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -61,7 +61,10 @@ dependencies:
61
61
  description: fbtok - football.txt lint tools incl. tokenizer, parser & more
62
62
  email: gerald.bauer@gmail.com
63
63
  executables:
64
+ - fbchk
65
+ - fbt
64
66
  - fbtok
67
+ - fbx
65
68
  extensions: []
66
69
  extra_rdoc_files:
67
70
  - CHANGELOG.md
@@ -72,9 +75,11 @@ files:
72
75
  - Manifest.txt
73
76
  - README.md
74
77
  - Rakefile
78
+ - bin/fbchk
79
+ - bin/fbt
75
80
  - bin/fbtok
81
+ - bin/fbx
76
82
  - lib/fbtok.rb
77
- - lib/fbtok/fbtok.rb
78
83
  - lib/fbtok/linter.rb
79
84
  - lib/fbtok/opts.rb
80
85
  homepage: https://github.com/sportdb/footty
data/lib/fbtok/fbtok.rb DELETED
@@ -1,141 +0,0 @@
1
-
2
- module Fbtok
3
- def self.main( args=ARGV )
4
-
5
- opts = {
6
- debug: true,
7
- metal: false,
8
- file: nil,
9
- }
10
-
11
- parser = OptionParser.new do |parser|
12
- parser.banner = "Usage: #{$PROGRAM_NAME} [options] PATH"
13
-
14
-
15
- parser.on( "-q", "--quiet",
16
- "less debug output/messages - default is (#{!opts[:debug]})" ) do |debug|
17
- opts[:debug] = false
18
- end
19
- parser.on( "--verbose", "--debug",
20
- "turn on verbose / debug output (default: #{opts[:debug]})" ) do |debug|
21
- opts[:debug] = true
22
- end
23
-
24
- parser.on( "--metal",
25
- "turn off typed parse tree; show to the metal tokens"+
26
- " (default: #{opts[:metal]})" ) do |metal|
27
- opts[:metal] = true
28
- end
29
-
30
- parser.on( "-f FILE", "--file FILE",
31
- "read datafiles (pathspecs) via .csv file") do |file|
32
- opts[:file] = file
33
- ## note: for batch (massive) processing auto-set debug (verbose output) to false (as default)
34
- opts[:debug] = false
35
- end
36
- end
37
- parser.parse!( args )
38
-
39
- puts "OPTS:"
40
- p opts
41
- puts "ARGV:"
42
- p args
43
-
44
-
45
- ## todo/check - use packs or projects or such
46
- ## instead of specs - why? why not?
47
- specs = []
48
- if opts[:file]
49
- recs = read_csv( opts[:file] )
50
- pp recs
51
- ## note - make pathspecs relative to passed in file arg!!!
52
- basedir = File.dirname( opts[:file] )
53
- recs.each do |rec|
54
- paths = SportDb::Parser::Opts.find( rec['path'], dir: basedir )
55
- specs << [paths, rec]
56
- end
57
- else
58
- paths = if args.empty?
59
- [
60
- '../../../openfootball/euro/2021--europe/euro.txt',
61
- '../../../openfootball/euro/2024--germany/euro.txt',
62
- ]
63
- else
64
- ## check for directories
65
- ## and auto-expand
66
- SportDb::Parser::Opts.expand_args( args )
67
- end
68
- specs << [paths, {}]
69
- end
70
-
71
-
72
- SportDb::Parser::Linter.debug = true if opts[:debug]
73
-
74
- linter = SportDb::Parser::Linter.new
75
-
76
-
77
- specs.each_with_index do |(paths, rec),i|
78
- errors = []
79
-
80
- paths.each_with_index do |path,j|
81
- puts "==> [#{j+1}/#{paths.size}] reading >#{path}<..."
82
- linter.read( path, parse: !opts[:metal] )
83
-
84
- errors += linter.errors if linter.errors?
85
- end
86
-
87
- if errors.size > 0
88
- puts
89
- pp errors
90
- puts
91
- puts "!! #{errors.size} parse error(s) in #{paths.size} datafiles(s)"
92
- else
93
- puts
94
- puts "OK no parse errors found in #{paths.size} datafile(s)"
95
- end
96
-
97
- ## add errors to rec via rec['errors'] to allow
98
- ## for further processing/reporting
99
- rec['errors'] = errors
100
- end
101
-
102
-
103
- ###
104
- ## generate a report if --file option used
105
- if opts[:file]
106
-
107
- buf = String.new
108
-
109
- buf << "# fbtok summary report - #{specs.size} dataset(s)\n\n"
110
-
111
- specs.each_with_index do |(paths, rec),i|
112
- errors = rec['errors']
113
-
114
- if errors.size > 0
115
- buf << "!! #{errors.size} ERROR(S) "
116
- else
117
- buf << " OK "
118
- end
119
- buf << "%-20s" % rec['path']
120
- buf << " - #{paths.size} datafile(s)"
121
- buf << "\n"
122
-
123
- if errors.size > 0
124
- buf << errors.pretty_inspect
125
- buf << "\n"
126
- end
127
- end
128
-
129
- puts
130
- puts "SUMMARY:"
131
- puts buf
132
-
133
- # maybe write out in the future?
134
- # basedir = File.dirname( opts[:file] )
135
- # basename = File.basename( opts[:file], File.extname( opts[:file] ))
136
- end
137
-
138
-
139
-
140
- end # method self.main
141
- end # module Fbtok