fbup 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d55ede42bbe3e933365193d25054464d9226d1a5743dc9b4919ce47760faa68d
4
+ data.tar.gz: 2c759f0719ceed561a02d25818141cb57625ef60ca99f1f294c5e80e0b185d05
5
+ SHA512:
6
+ metadata.gz: ea4c01a1e01290360ebe48028225745c6b33d6ad2196af66846f6287a1a0bd2c6713c7026127a281caade87d8b2488c27c09e0c61d54a7992322d0b334b33d12
7
+ data.tar.gz: 5b6afe253dcabb81e23918dbb257104dcb3c25446f3a5ffdcd3e12553fd5dcf69995018f4476903c3ae5844fc00e3969afb84c0634d390063b743011553d7419
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ### 0.0.1 / 2024-12-29
2
+
3
+ * Everything is new. First release.
data/Manifest.txt ADDED
@@ -0,0 +1,11 @@
1
+ CHANGELOG.md
2
+ Manifest.txt
3
+ README.md
4
+ Rakefile
5
+ bin/fbup
6
+ config/openfootball.csv
7
+ lib/fbup.rb
8
+ lib/fbup/github.rb
9
+ lib/fbup/github_config.rb
10
+ lib/fbup/main.rb
11
+ lib/fbup/version.rb
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # fbup - (auto-)update machinery for footbal match schedules & more in football.txt; incl. (auto-sync & commit) support for github openfootball repos & more
2
+
3
+
4
+ * home :: [github.com/sportdb/sport.db](https://github.com/sportdb/sport.db)
5
+ * bugs :: [github.com/sportdb/sport.db/issues](https://github.com/sportdb/sport.db/issues)
6
+ * gem :: [rubygems.org/gems/fbup](https://rubygems.org/gems/fbup)
7
+ * rdoc :: [rubydoc.info/gems/fbup](http://rubydoc.info/gems/fbup)
8
+
9
+
10
+ ## Step 0 - Installation Via Gems
11
+
12
+ To install the command-line tool via gems (ruby's package manager) use:
13
+
14
+ ```
15
+ $ gem install fbup
16
+ ```
17
+
18
+
19
+ ## Usage
20
+
21
+ Try in your shell / terminal:
22
+
23
+ ```
24
+ $ fbup -h
25
+ ```
26
+
27
+ resulting in:
28
+
29
+
30
+ ...
31
+
32
+
33
+
34
+ ## Questions? Comments?
35
+
36
+ Yes, you can. More than welcome.
37
+ See [Help & Support »](https://github.com/openfootball/help)
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ require 'hoe'
2
+ require './lib/fbup/version.rb'
3
+
4
+
5
+ Hoe.spec 'fbup' do
6
+ self.version = SportDb::Module::Fbup::VERSION
7
+
8
+ self.summary = "fbup - (auto-)update machinery for footbal match schedules & more in football.txt; incl. (auto-sync & commit) support for github openfootball repos & more"
9
+ self.description = summary
10
+
11
+ self.urls = { home: 'https://github.com/sportdb/sport.db' }
12
+
13
+ self.author = 'Gerald Bauer'
14
+ self.email = 'gerald.bauer@gmail.com'
15
+
16
+ # switch extension to .markdown for gihub formatting
17
+ self.readme_file = 'README.md'
18
+ self.history_file = 'CHANGELOG.md'
19
+
20
+ self.licenses = ['Public Domain']
21
+
22
+ self.extra_deps = [
23
+ ['sportdb-writers', '>= 0.4.0'],
24
+ ['gitti', '>= 0.6.1'],
25
+ ]
26
+
27
+ self.spec_extras = {
28
+ required_ruby_version: '>= 3.1.0'
29
+ }
30
+ end
data/bin/fbup ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ## tip: to test run:
4
+ ## ruby -I ./lib bin/fbup
5
+ ## or
6
+ ## ruby -I fbup/lib fbup/bin/fbup
7
+
8
+
9
+
10
+ require 'fbup'
11
+
12
+
13
+ Fbup.main( ARGV )
14
+
15
+
16
+ puts "bye"
@@ -0,0 +1,117 @@
1
+ key, path
2
+
3
+ at, austria
4
+
5
+ de, deutschland
6
+ eng, england
7
+ es, espana
8
+ it, italy
9
+
10
+ fr, europe/france
11
+
12
+ hu, europe/hungary
13
+ gr, europe/greece
14
+ pt, europe/portugal
15
+
16
+ ch, europe/switzerland
17
+
18
+ tr, europe/turkey
19
+
20
+ is, europe/iceland
21
+ sco, europe/scotland
22
+ ie, europe/ireland
23
+
24
+ fi, europe/finland
25
+ se, europe/sweden
26
+ no, europe/norway
27
+ dk, europe/denmark
28
+
29
+ lu, europe/luxembourg
30
+ be, europe/belgium
31
+ nl, europe/netherlands
32
+ cz, europe/czech-republic
33
+
34
+ sk, europe/slovakia
35
+ hr, europe/croatia
36
+ pl, europe/poland
37
+
38
+ ro, europe/romania
39
+
40
+ ua, europe/ukraine
41
+
42
+ ru, europe/russia
43
+
44
+
45
+ al, europe/albania
46
+ ad, europe/andorra
47
+ by, europe/belarus
48
+ ba, europe/bosnia-herzegovina ## use bosnia-n-herzegovina ??
49
+ bg, europe/bulgaria
50
+ cy, europe/cyprus
51
+ ee, europe/estonia
52
+ lv, europe/latvia
53
+ li, europe/liechtenstein
54
+ lt, europe/lithuania
55
+ mk, europe/north-macedonia
56
+ mt, europe/malta
57
+ md, europe/moldova
58
+ me, europe/montenegro
59
+
60
+ sm, europe/san-marino
61
+ rs, europe/serbia
62
+ si, europe/slovenia
63
+
64
+ xk, europe/kosovo
65
+ kos, europe/kosovo
66
+
67
+ am, europe/armenia
68
+ az, europe/azerbaijan
69
+ ge, europe/georgia
70
+ fo, europe/faroe-islands
71
+ gi, europe/gibraltar
72
+
73
+ wal, europe/wales
74
+ nir, europe/northern-ireland
75
+
76
+
77
+
78
+ uefa.cl, champions-league
79
+ uefa.champs, champions-league
80
+ uefa.el, champions-league
81
+ uefa.europa, champions-league
82
+ uefa.conf, champions-league
83
+ uefa.con, champions-league
84
+
85
+ euro, euro
86
+
87
+
88
+
89
+ mx, mexico
90
+
91
+
92
+ ar, south-america/argentina
93
+ br, south-america/brazil
94
+ co, south-america/colombia
95
+
96
+ copa.l, south-america/copa-libertadores
97
+ copa.s, south-america/copa-libertadores
98
+
99
+
100
+ eg, africa/egypt
101
+ ma, africa/morocco
102
+ dz, africa/algeria
103
+ afl, africa/african-football-league
104
+ caf.cl, africa/champions-league
105
+ caf.champs, africa/champions-league
106
+
107
+
108
+ cn, world/asia/china
109
+ jp, world/asia/japan
110
+
111
+ kz, world/asia/kazakhstan
112
+
113
+ il, world/middle-east/israel
114
+
115
+
116
+
117
+ world, worldcup
@@ -0,0 +1,115 @@
1
+
2
+ module Fbup
3
+
4
+ ###
5
+ ## todo/fix:
6
+ ## add -i/--interactive flag
7
+ ## will prompt yes/no before git operations (with consequences)!!!
8
+
9
+
10
+
11
+ class GitHubSync
12
+
13
+ ########
14
+ ## (auto)default to Writer.config.out_dir - why? why not?
15
+ ##
16
+ ## note - is monotree (that is, requires openfootball/england etc.
17
+ ## for repo pathspecs)
18
+ def self.root() @root || "/sports"; end
19
+ def self.root=( dir ) @root = dir; end
20
+ ## use root_dir (or add alias) - why? why not?
21
+
22
+
23
+ REPOS = GitHubConfig.new
24
+ recs = read_csv( "#{SportDb::Module::Fbup.root}/config/openfootball.csv" )
25
+ REPOS.add( recs )
26
+
27
+ ## note: datasets of format
28
+ ##
29
+ ## DATASETS = [
30
+ ## ['it.1', %w[2020/21 2019/20]],
31
+ ## ['it.2', %w[2019/20]],
32
+ ## ['es.1', %w[2019/20]],
33
+ ## ['es.2', %w[2019/20]],
34
+ ## ]
35
+
36
+ def self.find_repos( datasets )
37
+ repos = []
38
+ datasets.each do |league_key, seasons|
39
+ repo = REPOS[ league_key ]
40
+ ## pp repo
41
+ if repo.nil?
42
+ puts "!! ERROR - no repo config/path found for league >#{league_key}<; sorry"
43
+ exit 1
44
+ end
45
+
46
+ repos << "#{repo['owner']}/#{repo['name']}"
47
+ end
48
+
49
+ pp repos
50
+ repos.uniq ## note: remove duplicates (e.g. europe or world or such)
51
+ end
52
+
53
+
54
+
55
+ def initialize( repos )
56
+ @repos = repos
57
+ end
58
+
59
+
60
+ def git_push_if_changes
61
+ message = "auto-update week #{Date.today.cweek}" ## add /#{Date.today.cday - why? why not?
62
+ puts message
63
+
64
+ @repos.each do |pathspec|
65
+ _git_push_if_changes( pathspec, message: message )
66
+ end
67
+ end
68
+
69
+ def git_fast_forward_if_clean
70
+ @repos.each do |pathspec|
71
+ _git_fast_forward_if_clean( pathspec )
72
+ end
73
+ end
74
+
75
+
76
+
77
+ ## todo/fix: rename to something like
78
+ ## git_(auto_)commit_and_push_if_changes/if_dirty()
79
+
80
+ def _git_push_if_changes( pathspec, message: )
81
+ path = "#{self.class.root}/#{pathspec}"
82
+
83
+ Gitti::GitProject.open( path ) do |proj|
84
+ puts ''
85
+ puts "###########################################"
86
+ puts "## trying to commit & push repo in path >#{path}<"
87
+ puts "Dir.getwd: #{Dir.getwd}"
88
+ output = proj.changes
89
+ if output.empty?
90
+ puts "no changes found; skipping commit & push"
91
+ else
92
+ proj.add( '.' )
93
+ proj.commit( message )
94
+ proj.push
95
+ end
96
+ end
97
+ end
98
+
99
+
100
+ def _git_fast_forward_if_clean( pathspec )
101
+ path = "#{self.class.root}/#{pathspec}"
102
+
103
+ Gitti::GitProject.open( path ) do |proj|
104
+ output = proj.changes
105
+ unless output.empty?
106
+ puts "FAIL - cannot git pull (fast-forward) - working tree has changes:"
107
+ puts output
108
+ exit 1
109
+ end
110
+
111
+ proj.fast_forward
112
+ end
113
+ end
114
+ end # class GitHub
115
+ end # module Fbup
@@ -0,0 +1,97 @@
1
+
2
+ module Fbup
3
+ class GitHubConfig
4
+
5
+ ## map leagues to repo+path
6
+ ## e.g. fr.1 => europe/france
7
+ ## eng..1 => england
8
+ ##
9
+ ## for other than openfootball (default)
10
+ ## use @
11
+ ## e.g. myorg@austria
12
+ ## austria@myorg ??
13
+ ##
14
+ ## myorg@europe/france
15
+ ## europe/france@myorg
16
+
17
+
18
+ def self.read( path )
19
+ recs = read_csv( path )
20
+ new( recs )
21
+ end
22
+
23
+ def initialize( recs=nil )
24
+ @table = {}
25
+ add( recs ) if recs
26
+ end
27
+
28
+
29
+ def add( recs )
30
+ recs.each do |rec|
31
+ path = rec['path'] ## use pathspec - why? why not?
32
+ ## or repospec or such
33
+
34
+ ## auto-expand to openfootball as default org if no @ specified
35
+ owner, path = if path.index( '@')
36
+ path.split( '@', 2 )
37
+ else
38
+ ['openfootball', path ]
39
+ end
40
+ name, path = path.split( '/', 2 )
41
+
42
+
43
+ ## openfootball@europe/france
44
+ ## =>
45
+ ## owner: openfootball
46
+ ## name: europe
47
+ ## path: france
48
+ ##
49
+ ## openfootball@austria
50
+ ## =>
51
+ ## owner: openfootball
52
+ ## name: austria
53
+ ## path: nil
54
+ @table[ rec['key'] ] = { 'owner' => owner, ## (required)
55
+ 'name' => name, ## (required)
56
+ 'path' => path ## extra/inner/inside/local path (optional)
57
+ }
58
+ end
59
+ end
60
+
61
+
62
+ ##
63
+ ## todo/fix:
64
+ ## make key lookup more flexible
65
+ ## auto-add more variants!!!
66
+ ## e.g. at.1 AT1, AT or such
67
+ ##
68
+
69
+ ## find (full) record by key
70
+ def find( key )
71
+ key = key.to_s.downcase
72
+
73
+ ## first check for 1:1 match
74
+ rec = @table[key]
75
+ if rec.nil?
76
+ ## try match by (country / first) code
77
+ ## split by .
78
+ key, _ = key.split( '.' )
79
+ rec = @table[key]
80
+ end
81
+
82
+ rec
83
+ end
84
+ alias_method :[], :find ## keep alias - why? why not?
85
+
86
+
87
+ def find_repo( key )
88
+ rec = _find( key )
89
+
90
+ rec ? "#{rec['owner']}/#{rec['name']}" : nil
91
+ end
92
+
93
+ end # class GitHubConfig
94
+ end # module Fbup
95
+
96
+
97
+
data/lib/fbup/main.rb ADDED
@@ -0,0 +1,165 @@
1
+
2
+ module Fbup
3
+ def self.main( args=ARGV )
4
+
5
+ opts = {
6
+ source_path: [],
7
+ push: false,
8
+ ffwd: false,
9
+ dry: false, ## dry run (no write)
10
+ test: true, ## sets push & ffwd to false
11
+ debug: true,
12
+ file: nil,
13
+ test_dir: './o',
14
+ }
15
+
16
+
17
+ parser = OptionParser.new do |parser|
18
+ parser.banner = "Usage: #{$PROGRAM_NAME} [options] [args]"
19
+
20
+ parser.on( "-p", "--[no-]push",
21
+ "fast forward sync and commit & push changes to git repo - default is (#{opts[:push]})" ) do |push|
22
+ opts[:push] = push
23
+ if opts[:push] ## note: autoset ffwd too if push == true
24
+ opts[:ffwd] = true
25
+ opts[:test] = false
26
+ end
27
+ end
28
+ ## todo/check - add a --ffwd flag too - why? why not?
29
+
30
+ parser.on( "-t", "--test",
31
+ "test run; writing output to #{opts[:test_dir]} - default is #{opts[:test]}" ) do |test|
32
+ opts[:test] = true
33
+ opts[:push] = false
34
+ opts[:ffwd] = false
35
+ end
36
+
37
+ parser.on( "--dry",
38
+ "dry run; do NOT write - default is (#{opts[:dry]})" ) do |dry|
39
+ opts[:dry] = dry
40
+ opts[:test] = false
41
+ opts[:push] = false ### autoset push & ffwd - why? why not?
42
+ opts[:ffwd] = false
43
+ end
44
+
45
+ parser.on( "-q", "--quiet",
46
+ "less debug output/messages - default is (#{!opts[:debug]})" ) do |debug|
47
+ opts[:debug] = false
48
+ end
49
+
50
+ parser.on( "-I DIR", "--include DIR",
51
+ "add directory to (source) search path - default is (#{opts[:source_path].join(',')})") do |dir|
52
+ opts[:source_path] += path
53
+ end
54
+
55
+ parser.on( "-f FILE", "--file FILE",
56
+ "read leagues (and seasons) via .csv file") do |file|
57
+ opts[:file] = file
58
+ end
59
+ end
60
+ parser.parse!( args )
61
+
62
+
63
+ if opts[:source_path].empty? &&
64
+ File.exist?( '/sports/cache.api.fbdat') &&
65
+ File.exist?( '/sports/cache.wfb' )
66
+ opts[:source_path] << '/sports/cache.api.fbdat'
67
+ opts[:source_path] << '/sports/cache.wfb'
68
+ end
69
+
70
+ if opts[:source_path].empty?
71
+ opts[:source_path] = ['.'] ## use ./ as default
72
+ end
73
+
74
+
75
+
76
+ puts "OPTS:"
77
+ p opts
78
+ puts "ARGV:"
79
+ p args
80
+
81
+
82
+ datasets = if opts[:file]
83
+ read_leagueset( opts[:file] )
84
+ else
85
+ parse_leagueset_args( args )
86
+ end
87
+
88
+ puts "datasets:"
89
+ pp datasets
90
+
91
+
92
+ source_path = opts[:source_path]
93
+
94
+ root_dir = if opts[:test]
95
+ opts[:test_dir]
96
+ else
97
+ GitHubSync.root # e.g. "/sports"
98
+ end
99
+
100
+ puts " (output) root_dir: >#{root_dir}<"
101
+
102
+ repos = GitHubSync.find_repos( datasets )
103
+ puts " #{repos.size} repo(s):"
104
+ pp repos
105
+ sync = GitHubSync.new( repos )
106
+
107
+ puts " sync:"
108
+ pp sync
109
+
110
+
111
+
112
+ sync.git_fast_forward_if_clean if opts[:ffwd]
113
+
114
+ ### step 0 - validate and fill-in seasons etc.
115
+ datasets.validate!( source_path: source_path )
116
+
117
+
118
+
119
+ datasets.each do |league_key, seasons|
120
+ puts "==> gen #{league_key} - #{seasons.size} seasons(s)..."
121
+
122
+ league_info = find_league_info( league_key )
123
+ pp league_info
124
+
125
+ seasons.each do |season|
126
+ filename = "#{season.to_path}/#{league_key}.csv"
127
+ path = find_file( filename, path: source_path )
128
+
129
+ ### get matches
130
+ puts " ---> reading matches in #{path} ..."
131
+ matches = SportDb::CsvMatchParser.read( path )
132
+ puts " #{matches.size} matches"
133
+
134
+ ## build
135
+ txt = SportDb::TxtMatchWriter.build( matches )
136
+ puts txt if opts[:debug]
137
+
138
+ league_name = league_info[ :name ] # e.g. Brasileiro Série A
139
+ basename = league_info[ :basename] #.e.g 1-seriea
140
+
141
+ league_name = league_name.call( season ) if league_name.is_a?( Proc ) ## is proc/func - name depends on season
142
+ basename = basename.call( season ) if basename.is_a?( Proc ) ## is proc/func - name depends on season
143
+
144
+ buf = String.new
145
+ buf << "= #{league_name} #{season}\n\n"
146
+ buf << txt
147
+
148
+ repo = GitHubSync::REPOS[ league_key ]
149
+ repo_path = "#{repo['owner']}/#{repo['name']}"
150
+ repo_path << "/#{repo['path']}" if repo['path'] ## note: do NOT forget to add optional extra path!!!
151
+
152
+ outpath = "#{root_dir}/#{repo_path}/#{season.to_path}/#{basename}.txt"
153
+
154
+ if opts[:dry]
155
+ puts " (dry) writing to >#{outpath}<..."
156
+ else
157
+ write_text( outpath, buf )
158
+ end
159
+ end
160
+ end
161
+
162
+ sync.git_push_if_changes if opts[:push]
163
+
164
+ end # method self.main
165
+ end # module Fbup
@@ -0,0 +1,24 @@
1
+
2
+ module SportDb
3
+ module Module
4
+ module Fbup
5
+ MAJOR = 0 ## todo: namespace inside version or something - why? why not??
6
+ MINOR = 0
7
+ PATCH = 1
8
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
9
+
10
+ def self.version
11
+ VERSION
12
+ end
13
+
14
+ def self.banner
15
+ "fbup/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
16
+ end
17
+
18
+ def self.root
19
+ File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
20
+ end
21
+
22
+ end # module Fbup
23
+ end # module Module
24
+ end # module SportDb
data/lib/fbup.rb ADDED
@@ -0,0 +1,27 @@
1
+
2
+ require 'sportdb/writers'
3
+
4
+
5
+ require 'optparse' ## command-line processing; check if included updstream?
6
+
7
+ ########################
8
+ # push & pull github scripts
9
+ require 'gitti' ## note - requires git machinery
10
+
11
+
12
+
13
+ ###
14
+ # our own code
15
+ require_relative 'fbup/version'
16
+
17
+ require_relative 'fbup/github_config'
18
+ require_relative 'fbup/github' ## github helpers/update machinery
19
+
20
+
21
+ require_relative 'fbup/main'
22
+
23
+
24
+
25
+
26
+
27
+ puts SportDb::Module::Fbup.banner # say hello
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fbup
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gerald Bauer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-12-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sportdb-writers
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: gitti
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.6.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '7'
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '4.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '7'
61
+ - !ruby/object:Gem::Dependency
62
+ name: hoe
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.2'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '4.2'
75
+ description: fbup - (auto-)update machinery for footbal match schedules & more in
76
+ football.txt; incl. (auto-sync & commit) support for github openfootball repos &
77
+ more
78
+ email: gerald.bauer@gmail.com
79
+ executables:
80
+ - fbup
81
+ extensions: []
82
+ extra_rdoc_files:
83
+ - CHANGELOG.md
84
+ - Manifest.txt
85
+ - README.md
86
+ files:
87
+ - CHANGELOG.md
88
+ - Manifest.txt
89
+ - README.md
90
+ - Rakefile
91
+ - bin/fbup
92
+ - config/openfootball.csv
93
+ - lib/fbup.rb
94
+ - lib/fbup/github.rb
95
+ - lib/fbup/github_config.rb
96
+ - lib/fbup/main.rb
97
+ - lib/fbup/version.rb
98
+ homepage: https://github.com/sportdb/sport.db
99
+ licenses:
100
+ - Public Domain
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options:
104
+ - "--main"
105
+ - README.md
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 3.1.0
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubygems_version: 3.5.22
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: fbup - (auto-)update machinery for footbal match schedules & more in football.txt;
123
+ incl. (auto-sync & commit) support for github openfootball repos & more
124
+ test_files: []