sportdb-writers 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +6 -4
- data/Manifest.txt +2 -4
- data/README.md +26 -28
- data/Rakefile +32 -30
- data/lib/sportdb/leagues/leagues_at.rb +35 -39
- data/lib/sportdb/leagues/leagues_de.rb +21 -29
- data/lib/sportdb/leagues/leagues_eng.rb +58 -70
- data/lib/sportdb/leagues/leagues_es.rb +15 -19
- data/lib/sportdb/leagues/leagues_europe.rb +178 -213
- data/lib/sportdb/leagues/leagues_it.rb +16 -20
- data/lib/sportdb/leagues/leagues_mx.rb +23 -25
- data/lib/sportdb/leagues/leagues_south_america.rb +17 -21
- data/lib/sportdb/leagues/leagues_world.rb +14 -16
- data/lib/sportdb/writers/github.rb +195 -0
- data/lib/sportdb/writers/goals.rb +57 -0
- data/lib/sportdb/writers/txt_writer.rb +218 -407
- data/lib/sportdb/writers/version.rb +24 -24
- data/lib/sportdb/writers/write.rb +269 -367
- data/lib/sportdb/writers.rb +97 -31
- metadata +42 -17
- data/lib/sportdb/writers/config.rb +0 -18
- data/test/helper.rb +0 -19
- data/test/test_txt_writer.rb +0 -124
- data/test/test_version.rb +0 -16
| @@ -0,0 +1,195 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            module SportDb
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            ###
         | 
| 5 | 
            +
            ## todo/fix:
         | 
| 6 | 
            +
            ##   add -i/--interactive flag
         | 
| 7 | 
            +
            ##     will prompt yes/no  before git operations (with consequences)!!!
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            class GitHubSync
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              ## map leagues to repo+path
         | 
| 12 | 
            +
              ##  e.g.   fr.1   => europe/france
         | 
| 13 | 
            +
              ##         eng..1 => england
         | 
| 14 | 
            +
            REPOS = {
         | 
| 15 | 
            +
              'at.1' =>  'austria',
         | 
| 16 | 
            +
              'at.2' =>  'austria',
         | 
| 17 | 
            +
              'at.3.o' =>   'austria',
         | 
| 18 | 
            +
              'at.cup' =>   'austria',
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              'de.1' =>  'deutschland',
         | 
| 21 | 
            +
              'de.2' =>  'deutschland',
         | 
| 22 | 
            +
              'de.3' =>  'deutschland',
         | 
| 23 | 
            +
              'de.cup' => 'deutschland',
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              'eng.1' =>  'england',
         | 
| 26 | 
            +
            'eng.2' =>  'england',
         | 
| 27 | 
            +
            'eng.3' =>  'england',
         | 
| 28 | 
            +
            'eng.4' =>  'england',
         | 
| 29 | 
            +
            'eng.5' =>  'england',
         | 
| 30 | 
            +
            'eng.cup' => 'england',   # English FA Cup
         | 
| 31 | 
            +
             
         | 
| 32 | 
            +
            'es.1' => 'espana',
         | 
| 33 | 
            +
            'es.2' => 'espana',
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              'fr.1' =>  'europe/france',
         | 
| 36 | 
            +
              'fr.2' =>  'europe/france',
         | 
| 37 | 
            +
              
         | 
| 38 | 
            +
              'hu.1' => 'europe/hungary',
         | 
| 39 | 
            +
              'gr.1' => 'europe/greece',
         | 
| 40 | 
            +
              'pt.1' => 'europe/portugal',
         | 
| 41 | 
            +
              'pt.2' => 'europe/portugal',
         | 
| 42 | 
            +
              
         | 
| 43 | 
            +
              'ch.1' => 'europe/switzerland',
         | 
| 44 | 
            +
              'ch.2' => 'europe/switzerland',
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              'tr.1' => 'europe/turkey',
         | 
| 47 | 
            +
              'tr.2' => 'europe/turkey',
         | 
| 48 | 
            +
              
         | 
| 49 | 
            +
              'is.1' => 'europe/iceland',
         | 
| 50 | 
            +
              'sco.1' =>  'europe/scotland',
         | 
| 51 | 
            +
              'ie.1' => 'europe/ireland',
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              'fi.1' =>  'europe/finland',
         | 
| 54 | 
            +
               'se.1'  =>  'europe/sweden',
         | 
| 55 | 
            +
               'se.2'  =>  'europe/sweden',
         | 
| 56 | 
            +
               'no.1'  =>  'europe/norway',
         | 
| 57 | 
            +
               'dk.1'  =>  'europe/denmark',
         | 
| 58 | 
            +
               
         | 
| 59 | 
            +
               'lu.1'  =>  'europe/luxembourg',
         | 
| 60 | 
            +
               'be.1'  =>  'europe/belgium',
         | 
| 61 | 
            +
                'nl.1' =>  'europe/netherlands',
         | 
| 62 | 
            +
                'cz.1' =>  'europe/czech-republic',
         | 
| 63 | 
            +
                           
         | 
| 64 | 
            +
              'sk.1' =>   'europe/slovakia',
         | 
| 65 | 
            +
              'hr.1'  =>  'europe/croatia',
         | 
| 66 | 
            +
              'pl.1' =>   'europe/poland',
         | 
| 67 | 
            +
              
         | 
| 68 | 
            +
              'ro.1' =>  'europe/romania',
         | 
| 69 | 
            +
              
         | 
| 70 | 
            +
              'ua.1' =>  'europe/ukraine',
         | 
| 71 | 
            +
             | 
| 72 | 
            +
               'ru.1' =>  'europe/russia',
         | 
| 73 | 
            +
                'ru.2' => 'europe/russia',
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                'it.1' =>  'italy',
         | 
| 76 | 
            +
                'it.2' =>  'italy',
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                'mx.1' => 'mexico',
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                'ar.1' => 'south-america/argentina',
         | 
| 81 | 
            +
                'br.1' => 'south-america/brazil',
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                'cn.1' =>  'world/asia/china',
         | 
| 84 | 
            +
                'jp.1' =>  'world/asia/japan',
         | 
| 85 | 
            +
            }
         | 
| 86 | 
            +
             | 
| 87 | 
            +
             | 
| 88 | 
            +
             | 
| 89 | 
            +
            ######## 
         | 
| 90 | 
            +
            ##  (auto)default to Writer.config.out_dir - why? why not?
         | 
| 91 | 
            +
            ##
         | 
| 92 | 
            +
            ##    note - is root for org (NOT monotree for now - why?`why not?)
         | 
| 93 | 
            +
            def self.root()  @root || "/sports/openfootball"; end
         | 
| 94 | 
            +
            def self.root=( dir ) @root = dir; end  
         | 
| 95 | 
            +
            ## use root_dir (alias) - why? why not?
         | 
| 96 | 
            +
             | 
| 97 | 
            +
             | 
| 98 | 
            +
            def initialize( datasets )
         | 
| 99 | 
            +
                @repos = _find_repos( datasets )
         | 
| 100 | 
            +
            end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
             | 
| 103 | 
            +
            def git_push_if_changes 
         | 
| 104 | 
            +
                _git_push_if_changes( @repos )
         | 
| 105 | 
            +
            end 
         | 
| 106 | 
            +
                
         | 
| 107 | 
            +
            def git_fast_forward_if_clean
         | 
| 108 | 
            +
               _git_fast_forward_if_clean( @repos )
         | 
| 109 | 
            +
            end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
             | 
| 112 | 
            +
            ## todo/fix: rename to something like
         | 
| 113 | 
            +
            ##    git_(auto_)commit_and_push_if_changes/if_dirty()
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            def _git_push_if_changes( names )   ## optenfootball repo names e.g. world, england, etc.
         | 
| 116 | 
            +
              message = "auto-update week #{Date.today.cweek}"  ## add /#{Date.today.cday - why? why not?
         | 
| 117 | 
            +
              puts message
         | 
| 118 | 
            +
             | 
| 119 | 
            +
              names.each do |name|
         | 
| 120 | 
            +
                path = "#{self.class.root}/#{name}"
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                Gitti::GitProject.open( path ) do |proj|
         | 
| 123 | 
            +
                  puts ''
         | 
| 124 | 
            +
                  puts "###########################################"
         | 
| 125 | 
            +
                  puts "## trying to commit & push repo in path >#{path}<"
         | 
| 126 | 
            +
                  puts "Dir.getwd: #{Dir.getwd}"
         | 
| 127 | 
            +
                  output = proj.changes
         | 
| 128 | 
            +
                  if output.empty?
         | 
| 129 | 
            +
                    puts "no changes found; skipping commit & push"
         | 
| 130 | 
            +
                  else
         | 
| 131 | 
            +
                    proj.add( '.' )
         | 
| 132 | 
            +
                    proj.commit( message )
         | 
| 133 | 
            +
                    proj.push
         | 
| 134 | 
            +
                  end
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
              end
         | 
| 137 | 
            +
            end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
             | 
| 140 | 
            +
            def _git_fast_forward_if_clean( names )
         | 
| 141 | 
            +
              names.each do |name|
         | 
| 142 | 
            +
                path = "#{self.class.root}/#{name}"
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                Gitti::GitProject.open( path ) do |proj|
         | 
| 145 | 
            +
                  output = proj.changes
         | 
| 146 | 
            +
                  unless  output.empty?
         | 
| 147 | 
            +
                    puts "FAIL - cannot git pull (fast-forward) - working tree has changes:"
         | 
| 148 | 
            +
                    puts output
         | 
| 149 | 
            +
                    exit 1
         | 
| 150 | 
            +
                  end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                  proj.fast_forward
         | 
| 153 | 
            +
                end
         | 
| 154 | 
            +
              end
         | 
| 155 | 
            +
            end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
             | 
| 158 | 
            +
            ## todo/check: find a better name for helper?
         | 
| 159 | 
            +
            ## note: datasets of format
         | 
| 160 | 
            +
            ##  
         | 
| 161 | 
            +
            ## DATASETS = [
         | 
| 162 | 
            +
            ##   ['it.1',    %w[2020/21 2019/20]],
         | 
| 163 | 
            +
            ##  ['it.2',    %w[2019/20]],
         | 
| 164 | 
            +
            ##  ['es.1',    %w[2019/20]],
         | 
| 165 | 
            +
            ##  ['es.2',    %w[2019/20]],
         | 
| 166 | 
            +
            ## ]
         | 
| 167 | 
            +
             | 
| 168 | 
            +
             | 
| 169 | 
            +
            def _find_repos( datasets )
         | 
| 170 | 
            +
                repos = []
         | 
| 171 | 
            +
                datasets.each do |dataset|
         | 
| 172 | 
            +
                  league_key = dataset[0]
         | 
| 173 | 
            +
                  path  = REPOS[ league_key ]
         | 
| 174 | 
            +
                  ## pp path
         | 
| 175 | 
            +
                  if path.nil?
         | 
| 176 | 
            +
                     puts "!! ERROR - no repo path found for league >#{league_key}<; sorry"
         | 
| 177 | 
            +
                     exit 1
         | 
| 178 | 
            +
                  end
         | 
| 179 | 
            +
              
         | 
| 180 | 
            +
                  ## auto-add
         | 
| 181 | 
            +
                  ##   openfootball/ org here 
         | 
| 182 | 
            +
                  ##  and keep root "generic" to monoroot - why? why not?
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                  ## use only first part e.g. europe/belgium => europe
         | 
| 185 | 
            +
                  repos << path.split( '/' )[0]
         | 
| 186 | 
            +
                end
         | 
| 187 | 
            +
                pp repos
         | 
| 188 | 
            +
                repos.uniq   ## note: remove duplicates (e.g. europe or world or such)
         | 
| 189 | 
            +
            end
         | 
| 190 | 
            +
              
         | 
| 191 | 
            +
             | 
| 192 | 
            +
              
         | 
| 193 | 
            +
             | 
| 194 | 
            +
            end  # class GitHub
         | 
| 195 | 
            +
            end  # module SportDb
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            ######
         | 
| 2 | 
            +
            # goals helper
         | 
| 3 | 
            +
            #   todo/check/fix:  move upstream for (re)use  - why? why not?
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Writer
         | 
| 7 | 
            +
             | 
| 8 | 
            +
             | 
| 9 | 
            +
            def self.merge_goals( matches, goals )
         | 
| 10 | 
            +
              goals_by_match = goals.group_by { |rec| rec.match_id }
         | 
| 11 | 
            +
              puts "match goal reports - #{goals_by_match.size} records"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              ## lets group by date for easier lookup
         | 
| 14 | 
            +
              matches_by_date = matches.group_by { |rec| rec.date }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
              ## note: "shadow / reuse" matches and goals vars for now in loop
         | 
| 18 | 
            +
              ##  find better names to avoid confusion!!
         | 
| 19 | 
            +
              goals_by_match.each_with_index do |(match_id, goals),i|
         | 
| 20 | 
            +
                ## split match_id
         | 
| 21 | 
            +
                team_str, more_str   = match_id.split( '|' )
         | 
| 22 | 
            +
                team1_str, team2_str = team_str.split( ' - ' )
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                more_str  = more_str.strip
         | 
| 25 | 
            +
                team1_str = team1_str.strip
         | 
| 26 | 
            +
                team2_str = team2_str.strip
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                ## for now assume date in more (and not round or something else)
         | 
| 29 | 
            +
                date_str = more_str  # e.g. in 2019-07-26 format
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                puts ">#{team1_str}< - >#{team2_str}< | #{date_str},    #{goals.size} goals"
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                ## try a join - find matching match
         | 
| 34 | 
            +
                matches = matches_by_date[ date_str ]
         | 
| 35 | 
            +
                if matches.nil?
         | 
| 36 | 
            +
                  puts "!! ERROR: no match found for date >#{date_str}<"
         | 
| 37 | 
            +
                  exit 1
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                found_matches = matches.select {|match| match.team1 == team1_str &&
         | 
| 41 | 
            +
                                                        match.team2 == team2_str }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                if found_matches.size == 1
         | 
| 44 | 
            +
                  match = found_matches[0]
         | 
| 45 | 
            +
                  match.goals = SportDb::Import::Goal.build( goals )
         | 
| 46 | 
            +
                else
         | 
| 47 | 
            +
                  puts "!!! ERROR: found #{found_matches.size} in #{matches.size} matches for date >#{date_str}<:"
         | 
| 48 | 
            +
                  matches.each do |match|
         | 
| 49 | 
            +
                    puts "  >#{match.team1}< - >#{match.team2}<"
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                  exit 1
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
             | 
| 57 | 
            +
            end # module Writer
         |