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 +1 -1
- data/demo-reader.gemspec +1 -1
- data/lib/demo-reader.rb +19 -4
- data/lib/demo_reader_defrag.rb +14 -8
- data/test/unit/demo_reader_defrag_dm_68_cpm_test.rb +9 -1
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.6
|
data/demo-reader.gemspec
CHANGED
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,
|
14
|
-
|
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,
|
27
|
-
demo = DemoReaderDefrag.new(filename,
|
41
|
+
def self.try_defrag(filename, opts)
|
42
|
+
demo = DemoReaderDefrag.new(filename, opts)
|
28
43
|
|
29
44
|
demo.valid ? demo : nil
|
30
45
|
end
|
data/lib/demo_reader_defrag.rb
CHANGED
@@ -7,9 +7,9 @@ class DemoReaderDefrag
|
|
7
7
|
|
8
8
|
|
9
9
|
|
10
|
-
def initialize(filename,
|
10
|
+
def initialize(filename, opts)
|
11
11
|
@filename = filename
|
12
|
-
@
|
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
|
-
|
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
|
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
|
-
|
100
|
-
|
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
|
-
|
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
|
-
|
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:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 6
|
10
|
+
version: 0.2.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- aekym
|