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 +4 -4
- data/Manifest.txt +2 -0
- data/lib/sportdb/readers.rb +1 -0
- data/lib/sportdb/readers/club_props_reader.rb +70 -0
- data/lib/sportdb/readers/datafile.rb +16 -0
- data/lib/sportdb/readers/version.rb +1 -1
- data/test/test_props.rb +47 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbf4efcbeb2e1af833862fa9654f7832552082d3
|
4
|
+
data.tar.gz: 108ddbf3e0951307fc5ad1c3c36a9b11e00c16cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/sportdb/readers.rb
CHANGED
@@ -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
|
data/test/test_props.rb
ADDED
@@ -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.
|
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
|