demo-reader 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.5
1
+ 0.2.6
data/demo-reader.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{demo-reader}
8
- s.version = "0.2.5"
8
+ s.version = "0.2.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["aekym"]
data/lib/demo-reader.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "demo_reader_warsow"
2
2
  require "demo_reader_defrag"
3
+ require "active_support/core_ext/hash"
3
4
 
4
5
 
5
6
  class DemoReader
@@ -8,10 +9,24 @@ class DemoReader
8
9
  # tries to parse the given demo file in order to detect first a warsow,
9
10
  # then a defrag demo
10
11
  #
12
+ # @param filename path of the demo file to parse
13
+ # @param opts
14
+ # :raise_errors if errors should raise or not, default true
15
+ # :hint_for_time string with a time in format m.s.ms (%d{2}\.%d{2}\.%d{3}),
16
+ # default is the given filename
17
+ #
11
18
  # @returns an instance of DemoReaderWarsow or DemoReaderDefrag or nil on failure
12
19
  #
13
- def self.parse(filename, hint_for_time = nil)
14
- try_warsow(filename) || try_defrag(filename, hint_for_time)
20
+ def self.parse(filename, opts = nil)
21
+ opts = {} if opts.blank?
22
+ opts.assert_valid_keys :raise_errors, :hint_for_time
23
+
24
+ # set default options when not set
25
+ #
26
+ opts[:raise_errors] = true unless opts[:raise_errors].equal?(false)
27
+ opts[:hint_for_time] = filename unless opts[:hint_for_time].is_a?(String)
28
+
29
+ try_warsow(filename) || try_defrag(filename, opts)
15
30
  end
16
31
 
17
32
 
@@ -23,8 +38,8 @@ class DemoReader
23
38
  demo.valid ? demo : nil
24
39
  end
25
40
 
26
- def self.try_defrag(filename, hint_for_time)
27
- demo = DemoReaderDefrag.new(filename, hint_for_time)
41
+ def self.try_defrag(filename, opts)
42
+ demo = DemoReaderDefrag.new(filename, opts)
28
43
 
29
44
  demo.valid ? demo : nil
30
45
  end
@@ -7,9 +7,9 @@ class DemoReaderDefrag
7
7
 
8
8
 
9
9
 
10
- def initialize(filename, hint_for_time = nil)
10
+ def initialize(filename, opts)
11
11
  @filename = filename
12
- @hint_for_time = hint_for_time
12
+ @opts = opts
13
13
 
14
14
  @game = "Defrag"
15
15
  @version = -1
@@ -34,7 +34,7 @@ class DemoReaderDefrag
34
34
  out = DM68.parse_file(@filename)
35
35
  @raw = YAML.load(out)
36
36
 
37
- raise out unless @raw
37
+ conditionally_raise out unless @raw
38
38
 
39
39
  @version = @raw['server_info']['protocol'].to_i
40
40
  @mapname = @raw['server_info']['mapname'].downcase
@@ -46,7 +46,7 @@ class DemoReaderDefrag
46
46
  if @raw['server_info']['defrag_vers'].to_i > 0
47
47
  @gamemode = @raw['server_info']['df_promode'].to_i.zero? ? 'vq3' : 'cpm'
48
48
 
49
- time_hint = extract_time_from_filename(@hint_for_time || @filename)
49
+ time_hint = extract_time_from_filename(@opts[:hint_for_time])
50
50
  @time = extract_time(@raw['prints'], time_hint)
51
51
 
52
52
  @player = extract_player(@raw['prints'], @time)
@@ -72,7 +72,13 @@ class DemoReaderDefrag
72
72
 
73
73
  protected
74
74
 
75
+ def conditionally_raise(msg)
76
+ raise msg if @opts[:raise_errors]
77
+ end
78
+
75
79
  def guessable_time(time)
80
+ return nil if time.blank?
81
+
76
82
  time = time.sub(/^[0:\.]*/, "") # remove empty min, sec, etc
77
83
  parts = time.split(/\.|:/).map(&:to_i)
78
84
 
@@ -96,8 +102,8 @@ class DemoReaderDefrag
96
102
  arr
97
103
  end
98
104
 
99
- raise "No player was found." if players.empty?
100
- raise "Not only one player was found #{players.inspect}." if players.size > 1
105
+ conditionally_raise "No player was found." if players.empty?
106
+ conditionally_raise "Not only one player was found #{players.inspect}." if players.size > 1
101
107
 
102
108
  players.first
103
109
  end
@@ -117,7 +123,7 @@ class DemoReaderDefrag
117
123
  arr
118
124
  end
119
125
 
120
- raise "No time was found." if times.empty?
126
+ conditionally_raise "No time was found." if times.empty?
121
127
  return times.first if times.one?
122
128
 
123
129
  # multiple times found
@@ -126,7 +132,7 @@ class DemoReaderDefrag
126
132
  time_hint = normalize_time(time_hint) if time_hint.present?
127
133
  return time_hint if times.member?(time_hint)
128
134
 
129
- raise "Not only one time was found #{times.inspect}."
135
+ conditionally_raise "Not only one time was found #{times.inspect}."
130
136
  end
131
137
 
132
138
  def plain_text(text)
@@ -18,7 +18,7 @@ class DemoReaderDefragDm68CpmTest < Test::Unit::TestCase
18
18
  time_hint = entry.last if entry.size > 4
19
19
 
20
20
  define_method "test_defrag_dm_#{version}_demo_#{file.gsub(/[^a-z_0-9]/, "_")}" do
21
- demo = DemoReader.parse("test/fixtures/defrag/dm_#{version}/#{gamemode}/#{file}.dm_#{version}", time_hint)
21
+ demo = DemoReader.parse("test/fixtures/defrag/dm_#{version}/#{gamemode}/#{file}.dm_#{version}", :hint_for_time => time_hint)
22
22
 
23
23
  assert demo.valid
24
24
  assert_equal game, demo.game
@@ -31,5 +31,13 @@ class DemoReaderDefragDm68CpmTest < Test::Unit::TestCase
31
31
 
32
32
  end
33
33
 
34
+ def test_ignore_errors_option
35
+ demo = DemoReader.parse("test/fixtures/defrag/dm_68/cpm/mega_wood[mdf.cpm]_without_time_hint_\(kreator.Germany\).dm_68",
36
+ :raise_errors => false)
37
+
38
+ assert demo.valid
39
+ assert_equal "mega_wood", demo.mapname
40
+ end
41
+
34
42
  end
35
43
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: demo-reader
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 5
10
- version: 0.2.5
9
+ - 6
10
+ version: 0.2.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - aekym