sportdb-readers 0.3.1 → 0.3.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
  SHA1:
3
- metadata.gz: 4299b02180313d31b3706a9248032471ffff4b23
4
- data.tar.gz: b11257f793ff6292ad4bb201f3326e719c791360
3
+ metadata.gz: fbf4efcbeb2e1af833862fa9654f7832552082d3
4
+ data.tar.gz: 108ddbf3e0951307fc5ad1c3c36a9b11e00c16cb
5
5
  SHA512:
6
- metadata.gz: 1e73305335ddcc20ffcfbd064770edb6469b4b3ab62c3c574e76fbdcb3522f42256f3f337e9a07bef5ffb7ed15786f96fd9c04c5267281aa2cba34283e6284fb
7
- data.tar.gz: e0b4d66842c4e66c7bb818496abc26cf75e2932617c19446bc9a804cdde01437866a1d7e61f5364940c569d3f196aa056592fc6fe349afb45b184914afffb627
6
+ metadata.gz: 720dcb7703b7687eeae81485ee95a702c9ac433d468ba9bba8ab04a3dc0417e97d9a72fc6b862fca4f5e9a29b228ab2310cc1f2a8cbddb215e168e06f6c1a818
7
+ data.tar.gz: 193d88f88d0404499f5a2f18c5034fabec41d977a1864936edc46f26b3260552fa44028cd8134940acb4dc912a12a2f47aba8f84642c730ce2ebdd790cd04583
data/Manifest.txt CHANGED
@@ -3,6 +3,7 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  lib/sportdb/readers.rb
6
+ lib/sportdb/readers/club_props_reader.rb
6
7
  lib/sportdb/readers/conf_linter.rb
7
8
  lib/sportdb/readers/conf_reader.rb
8
9
  lib/sportdb/readers/datafile.rb
@@ -14,5 +15,6 @@ lib/sportdb/readers/version.rb
14
15
  test/helper.rb
15
16
  test/test_match_parser.rb
16
17
  test/test_package.rb
18
+ test/test_props.rb
17
19
  test/test_read.rb
18
20
  test/test_reader.rb
@@ -18,6 +18,7 @@ require 'sportdb/readers/conf_linter'
18
18
  require 'sportdb/readers/match_parser'
19
19
  require 'sportdb/readers/match_reader'
20
20
  require 'sportdb/readers/match_linter'
21
+ require 'sportdb/readers/club_props_reader'
21
22
  require 'sportdb/readers/datafile'
22
23
 
23
24
 
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ module SportDb
5
+ module Import
6
+
7
+
8
+ class ClubPropsReader
9
+
10
+ def self.config() Import.config; end ## shortcut convenience helper
11
+
12
+ def self.read( path ) ## use - rename to read_file or from_file etc. - why? why not?
13
+ txt = File.open( path, 'r:utf-8' ).read
14
+ parse( txt )
15
+ end
16
+
17
+ def self.parse( txt )
18
+ recs = parse_csv( txt )
19
+ recs.each do |rec|
20
+ name = rec[:name]
21
+ if name.nil?
22
+ puts "** !!! ERROR !!! Name column required / missing / NOT found in row:"
23
+ pp rec
24
+ exit 1
25
+ end
26
+
27
+ ## find / match club by (canocial) name
28
+ m = config.clubs.match( name )
29
+ if m && m.size > 1
30
+ puts "** !!! WARN !!! ambigious (multiple) club matches (#{m.size}) for name >#{name}< in props row:"
31
+ pp rec
32
+ pp m
33
+
34
+ ## todo/fix: try filter by canonical name if more than one match
35
+ m = m.select { |club| club.name == name }
36
+ m = nil if m.empty? ## note: reset to nil if no more matches
37
+ end
38
+
39
+ if m.nil?
40
+ puts "** !!! ERROR !!! no club match for (canonical) name >#{name}< in props row:"
41
+ pp rec
42
+ exit 1
43
+ elsif m.size > 1
44
+ puts "** !!! ERROR !!! ambigious (multiple) club matches (#{m.size}) for (canonical) name >#{name}< in props row:"
45
+ pp rec
46
+ pp m
47
+ exit 1
48
+ else ## assume size == 1, bingo!!!
49
+ club_rec = m[0]
50
+ ## todo/fix: warn if name differes from (canonical) name
51
+ ## todo/fix: also add props to in-memory structs/records!!!
52
+ ## todo/fix: only updated "on-demand" from in-memory struct/records!!!!
53
+
54
+ ## update database
55
+ club = Sync::Club.find_or_create( club_rec )
56
+ ## update attributes
57
+ attributes = {}
58
+ attributes[:key] = rec[:key] if rec[:key]
59
+ attributes[:code] = rec[:code] if rec[:code]
60
+
61
+ club.attributes = attributes
62
+ club.save!
63
+ end
64
+ end
65
+ end # method parse
66
+
67
+ end # class ClubPropsReader
68
+
69
+ end ## module Import
70
+ end ## module SportDb
@@ -12,6 +12,12 @@ module Datafile
12
12
  /[a-z0-9_-]+\.txt$ ## txt e.g /1-premierleague.txt
13
13
  }x
14
14
 
15
+ CLUBS_PROPS_RE = %r{ (?:^|/) # beginning (^) or beginning of path (/)
16
+ (?:[a-z]{1,4}\.)? # optional country code/key e.g. eng.clubs.props.txt
17
+ clubs\.props\.txt$
18
+ }x
19
+ def self.match_clubs_props( path, pattern: CLUBS_PROPS_RE ) pattern.match( path ); end
20
+
15
21
  ZIP_RE = %r{ \.zip$
16
22
  }x
17
23
  def self.match_zip( path, pattern: ZIP_RE ) pattern.match( path ); end
@@ -26,6 +32,14 @@ class PackageBase
26
32
  def each_match( &blk ) each( pattern: MATCH_RE, &blk ); end
27
33
 
28
34
 
35
+
36
+ def read_clubs_props
37
+ each_read( pattern: CLUBS_PROPS_RE ) do |name, txt|
38
+ ## todo/fix: add/use SportDb.parse_club_props helper !!!!!!
39
+ SportDb::Import::ClubPropsReader.parse( txt )
40
+ end
41
+ end
42
+
29
43
  def read_conf( *names,
30
44
  season: nil, sync: true )
31
45
  if names.empty? ## no (entry) names passed in; read in all
@@ -58,11 +72,13 @@ class PackageBase
58
72
  def read( *names,
59
73
  season: nil, sync: true )
60
74
  if names.empty? ## read all datafiles
75
+ read_clubs_props() if sync
61
76
  read_conf( season: season, sync: sync )
62
77
  read_match( season: season, sync: sync )
63
78
  else
64
79
  names.each do |name|
65
80
  txt = read_entry( name )
81
+ ## fix/todo: add read_clubs_props too!!!
66
82
  if Datafile.match_conf( name ) ## check if datafile matches conf(iguration) naming (e.g. .conf.txt)
67
83
  SportDb.parse_conf( txt, season: season, sync: sync )
68
84
  else ## assume "regular" match datafile
@@ -6,7 +6,7 @@ module Readers
6
6
 
7
7
  MAJOR = 0 ## todo: namespace inside version or something - why? why not??
8
8
  MINOR = 3
9
- PATCH = 1
9
+ PATCH = 2
10
10
  VERSION = [MAJOR,MINOR,PATCH].join('.')
11
11
 
12
12
  def self.version
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_props.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+ class TestProps < MiniTest::Test
11
+
12
+ ENG_CLUBS_PROPS_TXT =<<TXT
13
+ ####################################
14
+ # English League Teams
15
+ #
16
+ # note: three letter codes (tags) taken from official premierleague.com site
17
+
18
+ Key, Name, Code
19
+ chelsea, Chelsea FC, CHE
20
+ arsenal, Arsenal FC, ARS
21
+ tottenham, Tottenham Hotspur, TOT
22
+ westham, West Ham United, WHU
23
+ crystalpalace, Crystal Palace, CRY
24
+ manutd, Manchester United, MUN
25
+ mancity, Manchester City, MCI
26
+ TXT
27
+
28
+ def test_parse_csv
29
+ recs = parse_csv( ENG_CLUBS_PROPS_TXT )
30
+ pp recs
31
+
32
+ assert_equal [{ key: 'chelsea', name: 'Chelsea FC', code: 'CHE' },
33
+ { key: 'arsenal', name: 'Arsenal FC', code: 'ARS' }], recs[0..1]
34
+ end
35
+
36
+
37
+ def test_parse
38
+ SportDb.connect( adapter: 'sqlite3', database: ':memory:' )
39
+ SportDb.create_all ## build schema
40
+
41
+ ## turn on logging to console
42
+ ActiveRecord::Base.logger = Logger.new(STDOUT)
43
+
44
+ SportDb::Import::ClubPropsReader.parse( ENG_CLUBS_PROPS_TXT )
45
+ end # method test_parse
46
+
47
+ end # class TestProps
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sportdb-readers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
@@ -95,6 +95,7 @@ files:
95
95
  - README.md
96
96
  - Rakefile
97
97
  - lib/sportdb/readers.rb
98
+ - lib/sportdb/readers/club_props_reader.rb
98
99
  - lib/sportdb/readers/conf_linter.rb
99
100
  - lib/sportdb/readers/conf_reader.rb
100
101
  - lib/sportdb/readers/datafile.rb
@@ -106,6 +107,7 @@ files:
106
107
  - test/helper.rb
107
108
  - test/test_match_parser.rb
108
109
  - test/test_package.rb
110
+ - test/test_props.rb
109
111
  - test/test_read.rb
110
112
  - test/test_reader.rb
111
113
  homepage: https://github.com/sportdb/sport.db