sportdb-readers 1.0.1 → 1.1.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 +4 -4
- data/README.md +86 -20
- data/Rakefile +1 -1
- data/lib/sportdb/readers.rb +4 -4
- data/lib/sportdb/readers/conf_reader.rb +2 -2
- data/lib/sportdb/readers/match_reader.rb +48 -14
- data/lib/sportdb/readers/package.rb +2 -1
- data/lib/sportdb/readers/version.rb +2 -2
- data/test/helper.rb +1 -1
- data/test/test_conf_reader.rb +2 -2
- data/test/test_match_reader_champs.rb +2 -2
- data/test/test_match_reader_eng.rb +2 -2
- data/test/test_match_reader_euro.rb +1 -1
- data/test/test_match_reader_mu.rb +1 -1
- data/test/test_reader.rb +2 -2
- data/test/test_reader_champs.rb +2 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b92858d91cd8a8229f492aba44a58e3dd6be1b40
|
4
|
+
data.tar.gz: 36d490bff1de4f88216e4092abc73927a1fb0de6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b509fe042ac69758777e838f245d929807c23ccc3276d1216d0dc127fd54f1758a3474a56469b5c42fb073862431a96bcd85fa78b15979e61272251cfb61237
|
7
|
+
data.tar.gz: cb9b1868690d2cd36c9ae2cc50a2cef6962192f072bf5cd70710f9942439d62dbfbb8f6fa67908eddb69853f6a1284840a6502f5daf237864059a716aaf2511e
|
data/README.md
CHANGED
@@ -31,50 +31,116 @@ Let's read in some leagues, seasons, clubs, and match schedules and results.
|
|
31
31
|
Let's use the public domain football.db datasets for England (see [`openfootball/england`](https://github.com/openfootball/england)), as an example:
|
32
32
|
|
33
33
|
|
34
|
-
```
|
35
|
-
|
36
|
-
|
34
|
+
```
|
35
|
+
= English Premier League 2015/16
|
36
|
+
|
37
|
+
Matchday 1
|
38
|
+
|
39
|
+
[Sat Aug 8]
|
40
|
+
Manchester United 1-0 Tottenham Hotspur
|
41
|
+
AFC Bournemouth 0-1 Aston Villa
|
42
|
+
Everton FC 2-2 Watford FC
|
43
|
+
Leicester City 4-2 Sunderland AFC
|
44
|
+
Norwich City 1-3 Crystal Palace
|
45
|
+
Chelsea FC 2-2 Swansea City
|
46
|
+
[Sun Aug 9]
|
47
|
+
Arsenal FC 0-2 West Ham United
|
48
|
+
Newcastle United 2-2 Southampton FC
|
49
|
+
Stoke City 0-1 Liverpool FC
|
50
|
+
[Mon Aug 10]
|
51
|
+
West Bromwich Albion 0-3 Manchester City
|
52
|
+
|
53
|
+
...
|
54
|
+
```
|
55
|
+
|
56
|
+
(Source: [england/2015-16/1-premierleague-i.txt](https://github.com/openfootball/england/blob/master/2015-16/1-premierleague-i.txt))
|
37
57
|
|
58
|
+
and let's try:
|
59
|
+
|
60
|
+
``` ruby
|
38
61
|
## assumes football.db datasets for England in ./england directory
|
39
62
|
## see github.com/openfootball/england
|
40
|
-
SportDb
|
41
|
-
SportDb
|
42
|
-
SportDb::MatchReaderV2.read( './england/2015-16/1-premierleague-ii.txt' )
|
63
|
+
SportDb.read( './england/2015-16/1-premierleague-i.txt' )
|
64
|
+
SportDb.read( './england/2015-16/1-premierleague-ii.txt' )
|
43
65
|
|
44
66
|
## let's try another season
|
45
|
-
SportDb
|
46
|
-
SportDb::MatchReaderV2.read( './england/2019-20/1-premierleague.txt' )
|
67
|
+
SportDb.read( './england/2019-20/1-premierleague.txt' )
|
47
68
|
```
|
48
69
|
|
49
70
|
All leagues, seasons, clubs, match days and rounds, match fixtures and results,
|
50
71
|
and more are now in your (SQL) database of choice.
|
51
72
|
|
52
|
-
|
53
|
-
Or as an alternative use the `read` convenience all-in-one shortcut helper:
|
73
|
+
The proof of the pudding - Let's query the (SQL) database using the sport.db ActiveRecord models:
|
54
74
|
|
55
75
|
``` ruby
|
56
|
-
|
57
|
-
## see github.com/openfootball/england
|
58
|
-
SportDb.read( './england/2015-16/.conf.txt' )
|
59
|
-
SportDb.read( './england/2015-16/1-premierleague-i.txt' )
|
60
|
-
SportDb.read( './england/2015-16/1-premierleague-ii.txt' )
|
76
|
+
include SportDb::Models
|
61
77
|
|
62
|
-
|
63
|
-
|
64
|
-
|
78
|
+
pl_2015_16 = Event.find_by( key: 'eng.1.2015/16' )
|
79
|
+
#=> SELECT * FROM events WHERE key = 'eng.1.2015/16' LIMIT 1
|
80
|
+
|
81
|
+
pl_2015_16.teams.count #=> 20
|
82
|
+
#=> SELECT COUNT(*) FROM teams
|
83
|
+
# INNER JOIN events_teams ON teams.id = events_teams.team_id
|
84
|
+
# WHERE events_teams.event_id = 1
|
85
|
+
|
86
|
+
pl_2015_16.games.count #=> 380
|
87
|
+
#=> SELECT COUNT(*) FROM games
|
88
|
+
# INNER JOIN rounds ON games.round_id = rounds.id
|
89
|
+
# WHERE rounds.event_id = 1
|
90
|
+
|
91
|
+
pl_2019_20 = Event.find_by( key: 'eng.1.2019/20' )
|
92
|
+
pl_2015_16.teams.count #=> 20
|
93
|
+
pl_2015_16.games.count #=> 380
|
94
|
+
|
95
|
+
# -or-
|
96
|
+
|
97
|
+
pl = League.find_by( key: 'eng.1' )
|
98
|
+
#=> SELECT * FROM leagues WHERE key = 'eng.1' LIMIT 1
|
99
|
+
|
100
|
+
pl.seasons.count #=> 2
|
101
|
+
#=> SELECT COUNT(*) FROM seasons
|
102
|
+
# INNER JOIN events ON seasons.id = events.season_id
|
103
|
+
# WHERE events.league_id = 1
|
104
|
+
|
105
|
+
# and so on and so forth.
|
65
106
|
```
|
66
107
|
|
67
|
-
|
68
|
-
out what datafiles to read:
|
108
|
+
Bonus: As an alternative pass in the "package" directory or a zip archive and let `read` figure
|
109
|
+
out what datafiles to read in:
|
69
110
|
|
70
111
|
``` ruby
|
71
112
|
## assumes football.db datasets for England in ./england directory
|
72
113
|
## see github.com/openfootball/england
|
73
114
|
SportDb.read( './england' )
|
115
|
+
## -or- use a zip archive download
|
116
|
+
SportDb.read( './england.zip' )
|
74
117
|
```
|
75
118
|
|
76
119
|
That's it.
|
77
120
|
|
121
|
+
## Frequently Asked Questions (F.A.Q.s) and Answers
|
122
|
+
|
123
|
+
Q: What about reading in datasets in comma-separated values (CSV) format?
|
124
|
+
Example:
|
125
|
+
|
126
|
+
```
|
127
|
+
Round, Date, Team 1, FT, HT, Team 2
|
128
|
+
1, (Fri) 9 Aug 2019, Liverpool FC, 4-1, 4-0, Norwich City FC
|
129
|
+
1, (Sat) 10 Aug 2019, West Ham United FC, 0-5, 0-1, Manchester City FC
|
130
|
+
1, (Sat) 10 Aug 2019, AFC Bournemouth, 1-1, 0-0, Sheffield United FC
|
131
|
+
1, (Sat) 10 Aug 2019, Burnley FC, 3-0, 0-0, Southampton FC
|
132
|
+
1, (Sat) 10 Aug 2019, Crystal Palace FC, 0-0, 0-0, Everton FC
|
133
|
+
1, (Sat) 10 Aug 2019, Watford FC, 0-3, 0-1, Brighton & Hove Albion FC
|
134
|
+
1, (Sat) 10 Aug 2019, Tottenham Hotspur FC, 3-1, 0-1, Aston Villa FC
|
135
|
+
1, (Sun) 11 Aug 2019, Leicester City FC, 0-0, 0-0, Wolverhampton Wanderers FC
|
136
|
+
1, (Sun) 11 Aug 2019, Newcastle United FC, 0-1, 0-0, Arsenal FC
|
137
|
+
1, (Sun) 11 Aug 2019, Manchester United FC, 4-0, 1-0, Chelsea FC
|
138
|
+
...
|
139
|
+
```
|
140
|
+
(Source: [england/2019-20/eng.1.csv](https://github.com/footballcsv/england/blob/master/2010s/2019-20/eng.1.csv))
|
141
|
+
|
142
|
+
Yes, you can. See the [sportdb-importers library / gem »](https://github.com/sportdb/sport.db/tree/master/sportdb-importers)
|
143
|
+
|
78
144
|
|
79
145
|
|
80
146
|
## License
|
data/Rakefile
CHANGED
data/lib/sportdb/readers.rb
CHANGED
@@ -16,12 +16,12 @@ require 'sportdb/readers/package'
|
|
16
16
|
##
|
17
17
|
## add convenience shortcut helpers
|
18
18
|
module SportDb
|
19
|
-
def self.read_conf( path, season: nil )
|
20
|
-
def self.parse_conf( txt, season: nil )
|
19
|
+
def self.read_conf( path, season: nil ) ConfReader.read( path, season: season ); end
|
20
|
+
def self.parse_conf( txt, season: nil ) ConfReader.parse( txt, season: season ); end
|
21
21
|
|
22
22
|
### todo/check: add alias read_matches - why? why not?
|
23
|
-
def self.read_match( path, season: nil )
|
24
|
-
def self.parse_match( txt, season: nil )
|
23
|
+
def self.read_match( path, season: nil ) MatchReader.read( path, season: season ); end
|
24
|
+
def self.parse_match( txt, season: nil ) MatchReader.parse( txt, season: season ); end
|
25
25
|
|
26
26
|
def self.read_club_props( path ) Import::ClubPropsReader.read( path ); end
|
27
27
|
def self.parse_club_props( txt ) Import::ClubPropsReader.parse( txt ); end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module SportDb
|
4
4
|
|
5
5
|
|
6
|
-
class
|
6
|
+
class ConfReader ## todo/check: rename to EventsReaderV2 (use plural?) why? why not?
|
7
7
|
|
8
8
|
def self.read( path, season: nil ) ## use - rename to read_file or from_file etc. - why? why not?
|
9
9
|
txt = File.open( path, 'r:utf-8' ) {|f| f.read }
|
@@ -96,5 +96,5 @@ class ConfReaderV2 ## todo/check: rename to EventsReaderV2 (use plural?) why?
|
|
96
96
|
|
97
97
|
def catalog() Import.catalog; end ## shortcut convenience helper
|
98
98
|
|
99
|
-
end # class
|
99
|
+
end # class ConfReader
|
100
100
|
end # module SportDb
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module SportDb
|
4
4
|
|
5
|
-
class
|
5
|
+
class MatchReader ## todo/check: rename to MatchReaderV2 (use plural?) why? why not?
|
6
6
|
|
7
7
|
def self.read( path, season: nil ) ## use - rename to read_file or from_file etc. - why? why not?
|
8
8
|
txt = File.open( path, 'r:utf-8' ) {|f| f.read }
|
@@ -31,12 +31,14 @@ class MatchReaderV2 ## todo/check: rename to MatchReaderV2 (use plural?) why?
|
|
31
31
|
langs = { ## map country keys to lang codes
|
32
32
|
'de' => 'de', ## de - Deutsch (German)
|
33
33
|
'at' => 'de',
|
34
|
+
'ch' => 'de',
|
34
35
|
'fr' => 'fr', ## fr - French
|
35
36
|
'it' => 'it', ## it - Italian
|
36
37
|
'es' => 'es', ## es - Español (Spanish)
|
37
38
|
'mx' => 'es',
|
39
|
+
'ar' => 'es', ## Argentina
|
38
40
|
'pt' => 'pt', ## pt - Português (Portuguese)
|
39
|
-
'br' => '
|
41
|
+
'br' => 'pt',
|
40
42
|
}
|
41
43
|
|
42
44
|
secs.each do |sec| ## sec(tion)s
|
@@ -53,13 +55,23 @@ class MatchReaderV2 ## todo/check: rename to MatchReaderV2 (use plural?) why?
|
|
53
55
|
Import.config.lang = langs[ league.country.key ] || 'en'
|
54
56
|
end
|
55
57
|
|
58
|
+
### check if event info availabe - use start_date;
|
59
|
+
## otherwise we have to guess (use a "synthetic" start_date)
|
60
|
+
event_info = catalog.events.find_by( season: season,
|
61
|
+
league: league )
|
56
62
|
|
57
|
-
start = if
|
58
|
-
|
63
|
+
start = if event_info && event_info.start_date
|
64
|
+
event_info.start_date
|
59
65
|
else
|
60
|
-
|
66
|
+
if season.year?
|
67
|
+
Date.new( season.start_year, 1, 1 )
|
68
|
+
else
|
69
|
+
Date.new( season.start_year, 7, 1 )
|
70
|
+
end
|
61
71
|
end
|
62
72
|
|
73
|
+
|
74
|
+
### todo/check: make sure team include teams from group def too!!!!!
|
63
75
|
auto_conf_teams, _ = AutoConfParser.parse( lines,
|
64
76
|
start: start )
|
65
77
|
|
@@ -72,7 +84,10 @@ class MatchReaderV2 ## todo/check: rename to MatchReaderV2 (use plural?) why?
|
|
72
84
|
## todo/fix: make more generic / reuseable!!!!
|
73
85
|
mods = {}
|
74
86
|
## europa league uses same mods as champions league
|
75
|
-
mods[ 'uefa.el
|
87
|
+
mods[ 'uefa.el.quali' ] =
|
88
|
+
mods[ 'uefa.cl.quali' ] =
|
89
|
+
mods[ 'uefa.el' ] =
|
90
|
+
mods[ 'uefa.cl' ] = catalog.clubs.build_mods(
|
76
91
|
{ 'Liverpool | Liverpool FC' => 'Liverpool FC, ENG',
|
77
92
|
'Arsenal | Arsenal FC' => 'Arsenal FC, ENG',
|
78
93
|
'Barcelona' => 'FC Barcelona, ESP',
|
@@ -87,7 +102,7 @@ class MatchReaderV2 ## todo/check: rename to MatchReaderV2 (use plural?) why?
|
|
87
102
|
team_mapping = auto_conf_teams.keys.zip( teams ).to_h
|
88
103
|
|
89
104
|
|
90
|
-
parser =
|
105
|
+
parser = MatchParser.new( lines,
|
91
106
|
team_mapping,
|
92
107
|
start ) ## note: keep season start_at date for now (no need for more specific stage date need for now)
|
93
108
|
|
@@ -124,18 +139,37 @@ class MatchReaderV2 ## todo/check: rename to MatchReaderV2 (use plural?) why?
|
|
124
139
|
end
|
125
140
|
|
126
141
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
round_rec = Sync::Round.find_or_create( round, event: event_rec ) ## check: use/rename to EventRound why? why not?
|
131
|
-
end
|
142
|
+
## build a lookup cache for team_recs (used by group lookup)
|
143
|
+
## lookup by "canonical" name
|
144
|
+
cache_team_recs = new_team_recs.reduce({}) { |h,rec| h[rec.name] = rec; h }
|
132
145
|
|
133
146
|
groups.each do |group|
|
134
147
|
group_rec = Sync::Group.find_or_create( group, event: event_rec ) ## check: use/rename to EventGroup why? why not?
|
148
|
+
|
149
|
+
########
|
150
|
+
## add/update teams - todo/fix/clean-up - find a better way or move to sync? - possible?
|
151
|
+
## e.g. group.teams assumes an array of team names e.g.
|
152
|
+
## ["Spain", "Czech Republic", "Turkey", "Croatia"]
|
153
|
+
group_team_ids = []
|
154
|
+
group.teams.each do |team_name|
|
155
|
+
team_rec = cache_team_recs[ team_name ]
|
156
|
+
if team_rec.nil? ## assume team MUST always be present/known in mapping (via autoconfig parser)
|
157
|
+
puts "!! ERROR - no (cached) team rec found for team in group >#{group.name}< for >#{team_name}<"
|
158
|
+
exit 1
|
159
|
+
end
|
160
|
+
group_team_ids << team_rec.id
|
161
|
+
end
|
162
|
+
group_rec.team_ids = group_team_ids ## reset/update all teams at once (via ids)
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
rounds.each do |round|
|
167
|
+
round_rec = Sync::Round.find_or_create( round, event: event_rec ) ## check: use/rename to EventRound why? why not?
|
135
168
|
end
|
136
169
|
|
137
170
|
matches.each do |match|
|
138
|
-
##
|
171
|
+
## note: pass along stage (if present): stage - optional from heading!!!!
|
172
|
+
match = match.update( stage: stage ) if stage
|
139
173
|
match_rec = Sync::Match.create_or_update( match, event: event_rec )
|
140
174
|
end
|
141
175
|
end
|
@@ -149,5 +183,5 @@ class MatchReaderV2 ## todo/check: rename to MatchReaderV2 (use plural?) why?
|
|
149
183
|
|
150
184
|
def catalog() Import.catalog; end
|
151
185
|
|
152
|
-
end # class
|
186
|
+
end # class MatchReader
|
153
187
|
end # module SportDb
|
data/test/helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
## note: use the local version of sportdb gems
|
2
2
|
$LOAD_PATH.unshift( File.expand_path( '../sportdb-formats/lib' ))
|
3
|
-
$LOAD_PATH.unshift( File.expand_path( '../sportdb-
|
3
|
+
$LOAD_PATH.unshift( File.expand_path( '../sportdb-catalogs/lib' ))
|
4
4
|
$LOAD_PATH.unshift( File.expand_path( '../sportdb-models/lib' ))
|
5
5
|
$LOAD_PATH.unshift( File.expand_path( '../sportdb-sync/lib' ))
|
6
6
|
|
data/test/test_conf_reader.rb
CHANGED
@@ -25,7 +25,7 @@ class TestConfReader < MiniTest::Test
|
|
25
25
|
# path = "../../../openfootball/england/2017-18/.conf.txt"
|
26
26
|
# path = "../../../openfootball/england/2018-19/.conf.txt"
|
27
27
|
# path = "../../../openfootball/england/2019-20/.conf.txt"
|
28
|
-
SportDb::
|
28
|
+
SportDb::ConfReader.read( path )
|
29
29
|
end # method test_read
|
30
30
|
|
31
31
|
|
@@ -73,6 +73,6 @@ Monaco › MCO
|
|
73
73
|
APOEL › CYP
|
74
74
|
TXT
|
75
75
|
|
76
|
-
SportDb::
|
76
|
+
SportDb::ConfReader.parse( txt )
|
77
77
|
end
|
78
78
|
end # class TestConfReader
|
@@ -363,7 +363,7 @@ Group H:
|
|
363
363
|
[Llorente 20' Son Heung-min 37' N'Koudou 80']
|
364
364
|
TXT
|
365
365
|
|
366
|
-
SportDb::
|
366
|
+
SportDb::MatchReader.parse( txt )
|
367
367
|
end
|
368
368
|
|
369
369
|
def test_read_finals
|
@@ -480,7 +480,7 @@ Final
|
|
480
480
|
[Benzema 51' Bale 64', 83'; Mané 55']
|
481
481
|
TXT
|
482
482
|
|
483
|
-
SportDb::
|
483
|
+
SportDb::MatchReader.parse( txt )
|
484
484
|
end
|
485
485
|
|
486
486
|
|
@@ -58,7 +58,7 @@ Matchday 2
|
|
58
58
|
Manchester City 1-1 Everton FC
|
59
59
|
TXT
|
60
60
|
|
61
|
-
SportDb::
|
61
|
+
SportDb::MatchReader.parse( txt )
|
62
62
|
end # method test_read_eng
|
63
63
|
|
64
64
|
def test_read_eng_2012_13
|
@@ -87,7 +87,7 @@ Matchday 20
|
|
87
87
|
QPR 0-3 Liverpool
|
88
88
|
TXT
|
89
89
|
|
90
|
-
SportDb::
|
90
|
+
SportDb::MatchReader.parse( txt )
|
91
91
|
|
92
92
|
puts SportDb::Model::Game.count
|
93
93
|
end
|
data/test/test_reader.rb
CHANGED
@@ -24,13 +24,13 @@ class TestReader < MiniTest::Test
|
|
24
24
|
# path = "../../../openfootball/england/2017-18/.conf.txt"
|
25
25
|
# path = "../../../openfootball/england/2018-19/.conf.txt"
|
26
26
|
# path = "../../../openfootball/england/2019-20/.conf.txt"
|
27
|
-
recs = SportDb::
|
27
|
+
recs = SportDb::ConfReader.read( path )
|
28
28
|
# path = "../../../openfootball/austria/2018-19/1-bundesliga.txt"
|
29
29
|
path = "../../../openfootball/england/2015-16/1-premierleague-i.txt"
|
30
30
|
# path = "../../../openfootball/england/2017-18/1-premierleague-i.txt"
|
31
31
|
# path = "../../../openfootball/england/2018-19/1-premierleague.txt"
|
32
32
|
# path = "../../../openfootball/england/2019-20/1-premierleague.txt"
|
33
|
-
recs = SportDb::
|
33
|
+
recs = SportDb::MatchReader.read( path )
|
34
34
|
# path = "../../../openfootball/england/2017-18/1-premierleague-ii.txt"
|
35
35
|
#recs = SportDb::MatchReaderV2.read( path )
|
36
36
|
end # method test_read
|
data/test/test_reader_champs.rb
CHANGED
@@ -64,7 +64,7 @@ Monaco › MCO
|
|
64
64
|
APOEL › CYP
|
65
65
|
TXT
|
66
66
|
|
67
|
-
SportDb::
|
67
|
+
SportDb::ConfReader.parse( txt )
|
68
68
|
|
69
69
|
|
70
70
|
txt =<<TXT
|
@@ -180,7 +180,7 @@ Final
|
|
180
180
|
[Benzema 51' Bale 64', 83'; Mané 55']
|
181
181
|
TXT
|
182
182
|
|
183
|
-
SportDb::
|
183
|
+
SportDb::MatchReader.parse( txt )
|
184
184
|
end
|
185
185
|
|
186
186
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sportdb-readers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sportdb-sync
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.1.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.1.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rdoc
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|