icu_tournament 1.0.3 → 1.0.4

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.
data/README.rdoc CHANGED
@@ -9,11 +9,10 @@ The gem is hosted on gemcutter only:
9
9
 
10
10
  sudo gem install icu_tournament
11
11
 
12
- For Ruby prior to version 1.9 you also need:
12
+ For handling SwissPerfect files the _dbf_, _inifile_ and _rubyzip_ gems are required.
13
+ For Ruby prior to version 1.9 the _fastercsv_ gem is needed to handle CSV files.
14
+
13
15
 
14
- sudo gem install fastercsv
15
-
16
-
17
16
  == Usage
18
17
 
19
18
  There are two main uses for this gem:
@@ -24,11 +23,11 @@ There are two main uses for this gem:
24
23
  * You have a file in a supported format and you need to extract the information it contains.
25
24
  For example, you have a Krause formatted file and want to extract the data and insert it into a database.
26
25
 
27
- The currently supported formats (more are planned) are:
26
+ The currently supported formats are:
28
27
 
29
28
  * ICU::Tournament::Krause - the format used by FIDE.
30
29
  * ICU::Tournament::ForeignCSV - used by Irish players to report their individual results in foreign tournaments.
31
- * ICU::Tournament::SwissPerfect - very often used by Irish tournament controllers to report results.
30
+ * ICU::Tournament::SwissPerfect - often used by Irish tournament controllers to report results.
32
31
 
33
32
 
34
33
  == Writing Files
@@ -41,7 +40,7 @@ the information that a Krause file might contain is included here (see ICU::Tour
41
40
  t.add_player(ICU::Player.new('Robert J.', 'Fischer', 1))
42
41
  t.add_player(ICU::Player.new('Boris V.', 'Spassky', 2))
43
42
 
44
- Then the results for each round are added using the ID numbers to refer to the players.
43
+ Then the results for each round are added using the unique ID numbers to refer to the players.
45
44
 
46
45
  t.add_result(ICU::Result.new(1, 1, 'L', :opponent => 2, :colour => 'B'))
47
46
 
@@ -67,11 +66,13 @@ Suppose you have a tournament file in Krause format. Parse it into a tournament
67
66
  data = open('tournament.txt') { |f| f.read }
68
67
  parser = ICU::Tournament::Krause.new
69
68
  tournament = parser.parse(data)
70
-
69
+
71
70
  On success, the _parse_ method returns an object of type ICU::Tournament. A tournament (ICU::Tournament)
72
71
  has two or more players (ICU::Player), and each player has one or more results (ICU::Result). See the
73
- rdoc for more details. On error, the _parse_ method returns _nil_ and an error message can be retrieved
74
- from the parser (parser.error).
72
+ rdoc for more details. You can traverse these objects and do what you want with them, such as storing the
73
+ information in a database.
74
+
75
+ On error, the _parse_ method returns _nil_ and an error message can be retrieved from the parser (parser.error).
75
76
 
76
77
  == Author
77
78
 
@@ -1,5 +1,7 @@
1
1
  require 'inifile'
2
2
  require 'dbf'
3
+ require 'zip/zipfilesystem'
4
+ require 'tempfile'
3
5
 
4
6
  module ICU
5
7
  class Tournament
@@ -149,7 +151,7 @@ Should you wish to rank the tournament using a different set of tie-break rules,
149
151
  private
150
152
 
151
153
  def get_files(file)
152
- file.match(/\.zip$/i) ? get_zipped_files(file) : get_bare_files(file)
154
+ file.match(/\.zip$/i) ? get_zip_files(file) : get_bare_files(file)
153
155
  end
154
156
 
155
157
  def get_bare_files(file)
@@ -161,8 +163,32 @@ Should you wish to rank the tournament using a different set of tie-break rules,
161
163
  end
162
164
  end
163
165
 
164
- def get_zipped_files(file)
165
- raise "get_zip_files not implemented"
166
+ def get_zip_files(file)
167
+ temp = Hash.new
168
+ begin
169
+ Zip::ZipFile.open(file) do |zf|
170
+ raise "ZIP file should contain exactly 3 files (.ini, .trn and .sco)" unless zf.size == 3
171
+ stem = Hash.new
172
+ zf.entries.each do |e|
173
+ if e.file? && e.name.match(/^(.+)\.(ini|trn|sco)$/i)
174
+ stm = $1
175
+ ext = $2.downcase
176
+ stem[ext] = stm
177
+ tmp = Tempfile.new(e.name)
178
+ tmp.close
179
+ e.extract(tmp.path) { true }
180
+ temp[ext] = tmp.path
181
+ end
182
+ end
183
+ %w(ini trn sco).each { |ext| raise "no #{ext.upcase} file found" unless stem[ext] }
184
+ raise "different stem names found" unless stem['ini'] == stem['trn'] && stem['trn'] == stem['sco']
185
+ end
186
+ rescue Zip::ZipError
187
+ raise "invalid ZIP file"
188
+ rescue => ex
189
+ raise ex
190
+ end
191
+ %w(ini trn sco).map { |ext| temp[ext] }
166
192
  end
167
193
 
168
194
  def parse_ini(file)
@@ -1,5 +1,5 @@
1
1
  module ICU
2
2
  class Tournament
3
- VERSION = "1.0.3"
3
+ VERSION = "1.0.4"
4
4
  end
5
5
  end
@@ -43,11 +43,11 @@ module ICU
43
43
  @t.player(45).signature.should == "Catre, Loredan||507|3.5|18|123456|WDLWLW|BWBWBW|FTTTFT" # had two byes
44
44
  @t.player(56).signature.should == "McDonnell, Cathal||498|0.0|54|1|L|-|F" # last
45
45
  end
46
-
46
+
47
47
  it "should have consistent ranks" do
48
48
  @t.players.map{ |p| p.rank }.sort.join('').should == (1..@t.players.size).to_a.join('')
49
49
  end
50
-
50
+
51
51
  it "should have the correct tie breaks" do
52
52
  @t.tie_breaks.join('|').should == "buchholz|harkness"
53
53
  end
@@ -76,11 +76,11 @@ module ICU
76
76
  @t.player(3).signature.should == "Hulleman, Leon|6409|1466|1.0|3|123|LWL|BBW|TTT"
77
77
  @t.player(4).signature.should == "Dunne, Thomas|10914||0.0|4|123|LLL|BWB|TTT"
78
78
  end
79
-
79
+
80
80
  it "should have consistent ranks" do
81
81
  @t.players.map{ |p| p.rank }.sort.join('').should == (1..@t.players.size).to_a.join('')
82
82
  end
83
-
83
+
84
84
  it "should have the no tie breaks" do
85
85
  @t.tie_breaks.join('|').should == ""
86
86
  end
@@ -110,11 +110,11 @@ module ICU
110
110
  @t.player(18).signature.should == "Freeman, Ruiri|||2.0|17|1234567|DDLLLLW|--WBBWB|FFTTTTF" # had byes and bonus (in BONUS)
111
111
  @t.player(16).signature.should == "O'Connor, David|||1.0|19|123|WLL|WBW|FTF" # last
112
112
  end
113
-
113
+
114
114
  it "should have consistent ranks" do
115
115
  @t.players.map{ |p| p.rank }.sort.join('').should == (1..@t.players.size).to_a.join('')
116
116
  end
117
-
117
+
118
118
  it "should have the correct tie breaks" do
119
119
  @t.tie_breaks.join('|').should == "harkness|buchholz"
120
120
  end
@@ -138,11 +138,11 @@ module ICU
138
138
  @t.player(8).signature.should == "Berney, Mark|10328|1948|2.0|3|23|WW|BW|TT" # didn't play in round 1
139
139
  @t.player(10).signature.should == "O'Donnell, Conor E.|10792|1073|2.0|10|123|LWW|WBW|TFT" # got just 1 point for a bye
140
140
  end
141
-
141
+
142
142
  it "should have consistent ranks" do
143
143
  @t.players.map{ |p| p.rank }.sort.join('').should == (1..@t.players.size).to_a.join('')
144
144
  end
145
-
145
+
146
146
  it "should have the correct tie breaks" do
147
147
  @t.tie_breaks.join('|').should == "neustadtl"
148
148
  end
@@ -167,7 +167,7 @@ module ICU
167
167
  @t.player(46).signature.should == "O'Riordan, Pat|10696|900|2.0|42|123456|LDDLDD|BWBWWB|TTTTFT"
168
168
  @t.player(38).signature.should == "Gill, Craig I.|10637|1081|2.0|43|123456|LLWDDL|BWBWWB|TTTTFT"
169
169
  end
170
-
170
+
171
171
  it "should have consistent ranks" do
172
172
  @t.players.map{ |p| p.rank }.sort.join('').should == (1..@t.players.size).to_a.join('')
173
173
  end
@@ -191,7 +191,87 @@ module ICU
191
191
  @t.player(8).signature.should == "Vega, Marcos Llaneza||2475|3.0|16|1234|DDWW|BWBW|TTTT"
192
192
  @t.player(67).signature.should == "Lee, Shane|780|1633|1.0|52|134|DLD|WWW|TTT"
193
193
  end
194
-
194
+
195
+ it "should have correct details for selection of players, including international IDs and ratings when so configured" do
196
+ @t = @p.parse_file(SAMPLES + 'ncc', "2010-05-08", :id => :intl, :rating => :intl)
197
+ @t.player(2).signature.should == "Szabo, Gergely|1205064||4.0|4|1234|WWWW|WBWB|TTTT"
198
+ @t.player(5).signature.should == "Daly, Colm|2500434||3.5|7|1234|WWWD|WBWB|TTTT"
199
+ @t.player(8).signature.should == "Vega, Marcos Llaneza|2253585||3.0|16|1234|DDWW|BWBW|TTTT"
200
+ @t.player(67).signature.should == "Lee, Shane|||1.0|52|134|DLD|WWW|TTT"
201
+ end
202
+ end
203
+
204
+ context "Non-existant ZIP file" do
205
+
206
+ before(:all) do
207
+ @p = ICU::Tournament::SwissPerfect.new
208
+ @t = @p.parse_file(SAMPLES + 'nosuchzipfile.zip', "2010-05-08")
209
+ end
210
+
211
+ it "should not parse and should have a relevant error" do
212
+ @t.should be_nil
213
+ @p.error.should match(/invalid ZIP file/i)
214
+ end
215
+ end
216
+
217
+ context "Invalid ZIP file" do
218
+
219
+ before(:all) do
220
+ @p = ICU::Tournament::SwissPerfect.new
221
+ @t = @p.parse_file(SAMPLES + 'notazipfile.zip', "2010-05-08")
222
+ end
223
+
224
+ it "should not parse and have a should have relevant error" do
225
+ @t.should be_nil
226
+ @p.error.should match(/invalid ZIP file/i)
227
+ end
228
+ end
229
+
230
+ context "ZIP file containing the wrong number of files" do
231
+
232
+ before(:all) do
233
+ @p = ICU::Tournament::SwissPerfect.new
234
+ @t = @p.parse_file(SAMPLES + 'notenoughfiles.zip', "2010-05-08")
235
+ end
236
+
237
+ it "should not parse and should have a relevant error" do
238
+ @t.should be_nil
239
+ @p.error.should match(/3 files/i)
240
+ end
241
+ end
242
+
243
+ context "ZIP file containing the files with mixed stems" do
244
+
245
+ before(:all) do
246
+ @p = ICU::Tournament::SwissPerfect.new
247
+ @t = @p.parse_file(SAMPLES + 'mixedstems.zip', "2010-05-08")
248
+ end
249
+
250
+ it "should not parse and should have a relevant error" do
251
+ @t.should be_nil
252
+ @p.error.should match(/different stem/i)
253
+ end
254
+ end
255
+
256
+ context "National Club Champiomships 2010 ZIP file" do
257
+
258
+ before(:all) do
259
+ @p = ICU::Tournament::SwissPerfect.new
260
+ @t = @p.parse_file(SAMPLES + 'nccz.zip', "2010-05-08")
261
+ end
262
+
263
+ it "should parse and have the right basic details" do
264
+ @p.error.should be_nil
265
+ @t.signature.should == "National Club Championship 2010|Gerry Graham|4|2010-05-08|77"
266
+ end
267
+
268
+ it "should have correct details for selection of players, including ICU IDs" do
269
+ @t.player(2).signature.should == "Szabo, Gergely|12379|2530|4.0|4|1234|WWWW|WBWB|TTTT"
270
+ @t.player(5).signature.should == "Daly, Colm|295|2314|3.5|7|1234|WWWD|WBWB|TTTT"
271
+ @t.player(8).signature.should == "Vega, Marcos Llaneza||2475|3.0|16|1234|DDWW|BWBW|TTTT"
272
+ @t.player(67).signature.should == "Lee, Shane|780|1633|1.0|52|134|DLD|WWW|TTT"
273
+ end
274
+
195
275
  it "should have correct details for selection of players, including international IDs and ratings when so configured" do
196
276
  @t = @p.parse_file(SAMPLES + 'ncc', "2010-05-08", :id => :intl, :rating => :intl)
197
277
  @t.player(2).signature.should == "Szabo, Gergely|1205064||4.0|4|1234|WWWW|WBWB|TTTT"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icu_tournament
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Orr
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-05-20 00:00:00 +01:00
12
+ date: 2010-07-17 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -42,6 +42,16 @@ dependencies:
42
42
  - !ruby/object:Gem::Version
43
43
  version: 1.2.5
44
44
  version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: rubyzip
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.4
54
+ version:
45
55
  - !ruby/object:Gem::Dependency
46
56
  name: rspec
47
57
  type: :development