demo-reader 0.2.5 → 0.2.6

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/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