fbtok 0.1.0 → 0.1.2

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: 82c6131cf108aae7a0d7284bba488be307c1cb81c099dad53960d500a8710483
4
- data.tar.gz: ae5c2366e89ac5ef1a25567a0c328aafc12ddc21f826e43c927027dfa48e5f47
3
+ metadata.gz: efa16f747083c94f0a8fbb8df7ac3d1718ad2c204fca2008b711da35a7adf5ac
4
+ data.tar.gz: da8dfd82204875f23fc9efa236a1af79701e83047c5c3bf1fc34b4032371db51
5
5
  SHA512:
6
- metadata.gz: e43061028eb9eae6a3f0cc50eccdf111f41270c89189fc50e5a9f4c56da976ed3b858d2201b234367009dbf036c17747a4e53952eaab3f500787fb1b695e023a
7
- data.tar.gz: 18a70dbed909e896b47ddfe63ea98d1ed5ed3fe37a9dee15418e713790465ccc2a4f3033110a32916924dcf1fab9eb5132e411c37792c37abcf8b54ed301b3f9
6
+ metadata.gz: 29635412c9fb671cc254fa735dbf994289a961d02b92ca2480e80f4021d7f0d5b154f3b6d00c10cf50b1bce6f950ab624cbb1865d1273595a9401ad9c66a9ad4
7
+ data.tar.gz: b81ed7ecffc27725bef9dbb0f9b448eac302b649e89b7ac7da68c556fff4b14a4243dfe736145210b4cabc3a4b1b30d6633ab7a4d9fcd9f4e8082fc88522b275
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.1.0
1
+ ### 0.1.2
2
2
  ### 0.0.1 / 2025-01-02
3
3
 
4
4
  * Everything is new. First release.
data/Manifest.txt CHANGED
@@ -2,6 +2,7 @@ CHANGELOG.md
2
2
  Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
+ bin/fbchk
5
6
  bin/fbt
6
7
  bin/fbtok
7
8
  bin/fbx
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.1.0'
5
+ self.version = '0.1.2'
6
6
 
7
7
  self.summary = "fbtok - football.txt lint tools incl. tokenizer, parser & more"
8
8
  self.description = summary
@@ -22,7 +22,7 @@ Hoe.spec 'fbtok' do
22
22
  # ['sportdb-parser', '>= 0.2.2'],
23
23
  # ['sportdb-structs', '>= 0.5.0'],
24
24
  # ['logutils', '>= 0.6.1'],
25
- ['sportdb-quick', '>= 0.3.0'],
25
+ ['sportdb-formats', '>= 2.1.2'],
26
26
  ]
27
27
 
28
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/fbx CHANGED
@@ -84,16 +84,16 @@ paths.each_with_index do |path,i|
84
84
  puts "==> [#{i+1}/#{paths.size}] reading >#{path}<..."
85
85
 
86
86
  txt = read_text( path )
87
- secs = SportDb::LeagueOutlineReader.parse( txt )
87
+ secs = SportDb::QuickLeagueOutlineReader.parse( txt )
88
88
  ## pp secs
89
89
 
90
90
  secs.each_with_index do |sec,j| ## sec(tion)s
91
- season = sec[:season]
91
+ season = Season.parse( sec[:season] ) ## convert (str) to season obj!!!
92
92
  league = sec[:league]
93
93
  stage = sec[:stage]
94
94
  lines = sec[:lines]
95
95
 
96
- puts " section #{j+1}/#{secs.size} - #{league.name} #{season}, #{stage} - #{lines.size} line(s)"
96
+ puts " section #{j+1}/#{secs.size} - #{league} #{season}, #{stage} - #{lines.size} line(s)"
97
97
 
98
98
  next if opts[:outline]
99
99
 
data/lib/fbtok/opts.rb CHANGED
@@ -18,11 +18,12 @@ class Opts
18
18
  ## note: if pattern includes directory add here
19
19
  ## (otherwise move to more "generic" datafile) - why? why not?
20
20
  ## update - note include/allow dot (.) too
21
+ ## BUT NOT as first character!!! (e.g. exclude .confg.txt !!!)
21
22
  ## e.g. 2024-25/at.1.txt
22
23
  ## change to at_1 or uefa_cl or such - why? why not?
23
24
  MATCH_RE = %r{ (?: ^|/ ) # beginning (^) or beginning of path (/)
24
25
  #{SEASON}
25
- /[a-z0-9_.-]+\.txt$ ## txt e.g /1-premierleague.txt
26
+ /[a-z0-9][a-z0-9_.-]*\.txt$ ## txt e.g /1-premierleague.txt
26
27
  }x
27
28
 
28
29
 
data/lib/fbtok.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- require 'sportdb/quick'
2
+ require 'sportdb/formats'
3
3
 
4
4
 
5
5
  ## more stdlibs
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.1.0
4
+ version: 0.1.2
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-quick
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.0
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.0
26
+ version: 2.1.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rdoc
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -61,6 +61,7 @@ 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
64
65
  - fbt
65
66
  - fbtok
66
67
  - fbx
@@ -74,6 +75,7 @@ files:
74
75
  - Manifest.txt
75
76
  - README.md
76
77
  - Rakefile
78
+ - bin/fbchk
77
79
  - bin/fbt
78
80
  - bin/fbtok
79
81
  - bin/fbx