sportdb-readers 0.3.1 → 0.3.2

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 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