icu_tournament 1.0.12 → 1.0.13

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.
@@ -126,6 +126,22 @@ argument to specify how the renumbering is done.
126
126
 
127
127
  The return value from _renumber_ is the tournament object itself.
128
128
 
129
+
130
+ == Parsing Files
131
+
132
+ As an alternative to processing files by first instantiating a parser of the appropropriate class
133
+ (such as ICU::Tournament::SwissPerfect, ICU::Tournament::Krause and ICU::Tournament::ForeignCSV)
134
+ and then calling the parser's <em>parse_file</em> or <em>parse_file!</em> instance method,
135
+ a convenience class method, <em>parse_file!</em>, is available when a parser instance is not required.
136
+ For example:
137
+
138
+ t = ICU::Tournament.parse_file!('champs.zip', 'SwissPerfect', :start => '2010-07-03')
139
+
140
+ The method takes a filename, format and an options hash as arguments. It either returns
141
+ an instance of ICU::Tournament or throws an exception. See the documentation for the
142
+ different formats for what options are available. For some, no options are available,
143
+ in which case any options supplied to this method will be silently ignored.
144
+
129
145
  =end
130
146
 
131
147
  class Tournament
@@ -356,6 +372,18 @@ The return value from _renumber_ is the tournament object itself.
356
372
  check_ranks(:allow_none => true)
357
373
  true
358
374
  end
375
+
376
+ # Convenience method to parse a file.
377
+ def self.parse_file!(file, format, opts={})
378
+ type = format.to_s
379
+ raise "Invalid format" unless type.match(/^(SwissPerfect|Krause|ForeignCSV)$/);
380
+ parser = "ICU::Tournament::#{format}".constantize.new
381
+ if type == 'SwissPerfect'
382
+ parser.parse_file!(file, opts)
383
+ else
384
+ parser.parse_file!(file)
385
+ end
386
+ end
359
387
 
360
388
  # Convenience method to serialise the tournament into a supported format.
361
389
  # Throws and exception unless the name of a supported format is supplied (e.g. _Krause_).
@@ -1,5 +1,5 @@
1
1
  module ICU
2
2
  class Tournament
3
- VERSION = "1.0.12"
3
+ VERSION = "1.0.13"
4
4
  end
5
5
  end
@@ -799,5 +799,59 @@ EOS
799
799
  @t.player(6).rank.should == 6 # 0/5
800
800
  end
801
801
  end
802
+
803
+ context "convenience file parser" do
804
+ before(:all) do
805
+ @s = File.dirname(__FILE__) + '/samples'
806
+ @c = ICU::Tournament
807
+ end
808
+
809
+ it "should parse a valid SwissPerfect file" do
810
+ t = nil
811
+ lambda { t = @c.parse_file!("#{@s}/sp/nccz.zip", 'SwissPerfect', :start => '2010-05-08') }.should_not raise_error
812
+ t.players.size.should == 77
813
+ t.start.should == '2010-05-08'
814
+ end
815
+
816
+ it "should parse a valid CSV file" do
817
+ t = nil
818
+ lambda { t = @c.parse_file!("#{@s}/fcsv/valid.csv", 'ForeignCSV') }.should_not raise_error
819
+ t.players.size.should == 16
820
+ end
821
+
822
+ it "should parse a valid Krause file" do
823
+ t = nil
824
+ lambda { t = @c.parse_file!("#{@s}/krause/valid.tab", 'Krause') }.should_not raise_error
825
+ t.players.size.should == 12
826
+ end
827
+
828
+ it "should ignore options where appropriate" do
829
+ t = nil
830
+ lambda { t = @c.parse_file!("#{@s}/krause/valid.tab", 'Krause', :start => '2010-05-08') }.should_not raise_error
831
+ t.start.should == '2008-02-01'
832
+ end
833
+
834
+ it "should raise exceptions for invalid files" do
835
+ lambda { @c.parse_file!("#{@s}/sp/notenoughfiles.zip", 'SwissPerfect', :start => '2010-05-08') }.should raise_error(/files/)
836
+ lambda { @c.parse_file!("#{@s}/krause/invalid.tab", 'Krause') }.should raise_error(/name/)
837
+ lambda { @c.parse_file!("#{@s}/fcsv/invalid.csv", 'ForeignCSV') }.should raise_error(/termination/)
838
+ end
839
+
840
+ it "should raise exceptions if the wrong type is used" do
841
+ lambda { @c.parse_file!("#{@s}/krause/valid.tab", 'ForeignCSV') }.should raise_error(/expected/)
842
+ lambda { @c.parse_file!("#{@s}/fcsv/valid.csv", 'SwissPerfect') }.should raise_error(/cannot/)
843
+ lambda { @c.parse_file!("#{@s}/sp/nccz.zip", 'Krause') }.should raise_error(/missing/)
844
+ end
845
+
846
+ it "should raise an exception if file does not exist" do
847
+ lambda { @c.parse_file!("#{@s}/nosuchfile.cvs", 'ForeignCSV') }.should raise_error(/no such file/i)
848
+ lambda { @c.parse_file!("#{@s}/nosuchfile.zip", 'SwissPerfect') }.should raise_error(/invalid/i)
849
+ lambda { @c.parse_file!("#{@s}/nosuchfile.tab", 'Krause') }.should raise_error(/no such file/i)
850
+ end
851
+
852
+ it "should raise an exception if an invalid type is used" do
853
+ lambda { @c.parse_file!("#{@s}/krause/valid.tab", 'NoSuchType') }.should raise_error(/invalid format/i)
854
+ end
855
+ end
802
856
  end
803
857
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 12
9
- version: 1.0.12
8
+ - 13
9
+ version: 1.0.13
10
10
  platform: ruby
11
11
  authors:
12
12
  - Mark Orr
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-14 00:00:00 +01:00
17
+ date: 2010-10-16 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency