tf2_line_parser 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tf2_line_parser (0.0.2)
4
+ tf2_line_parser (0.0.4)
5
5
  activesupport
6
6
 
7
7
  GEM
@@ -10,10 +10,19 @@ GEM
10
10
  activesupport (3.2.12)
11
11
  i18n (~> 0.6)
12
12
  multi_json (~> 1.0)
13
- coderay (1.0.8)
13
+ coderay (1.0.9)
14
+ colorize (0.5.8)
15
+ coveralls (0.5.7)
16
+ colorize
17
+ json
18
+ rest-client
19
+ simplecov (>= 0.7)
20
+ thor
14
21
  diff-lcs (1.1.3)
15
- i18n (0.6.1)
22
+ i18n (0.6.2)
23
+ json (1.7.7)
16
24
  method_source (0.8.1)
25
+ mime-types (1.21)
17
26
  multi_json (1.6.1)
18
27
  pry (0.9.12)
19
28
  coderay (~> 1.0.5)
@@ -21,6 +30,8 @@ GEM
21
30
  slop (~> 3.4)
22
31
  pry-nav (0.2.3)
23
32
  pry (~> 0.9.10)
33
+ rest-client (1.6.7)
34
+ mime-types (>= 1.16)
24
35
  rspec (2.12.0)
25
36
  rspec-core (~> 2.12.0)
26
37
  rspec-expectations (~> 2.12.0)
@@ -37,11 +48,13 @@ GEM
37
48
  spec_coverage (0.0.5)
38
49
  rspec (~> 2.0)
39
50
  simplecov
51
+ thor (0.17.0)
40
52
 
41
53
  PLATFORMS
42
54
  ruby
43
55
 
44
56
  DEPENDENCIES
57
+ coveralls
45
58
  pry-nav (~> 0.2.3)
46
59
  rspec (~> 2.12.0)
47
60
  spec_coverage (~> 0.0.5)
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # TF2 line parser[![Build Status](https://travis-ci.org/Arie/tf2_line_parser.png?branch=master)](http://travis-ci.org/Arie/tf2_line_parser) [![Code Climate](https://codeclimate.com/github/Arie/tf2_line_parser.png)](https://codeclimate.com/github/Arie/tf2_line_parser)
1
+ # TF2 line parser [![Build Status](https://travis-ci.org/Arie/tf2_line_parser.png?branch=master)](http://travis-ci.org/Arie/tf2_line_parser) [![Code Climate](https://codeclimate.com/github/Arie/tf2_line_parser.png)](https://codeclimate.com/github/Arie/tf2_line_parser) [![Coverage Status](https://coveralls.io/repos/Arie/tf2_line_parser/badge.png?branch=master)](https://coveralls.io/r/Arie/tf2_line_parser)
2
2
 
3
3
  A TF2 log line parser. Unlike the other log parsers I've found, this one parses the line and returns a plain old ruby object to describe the event of the line.
4
4
  I plan to use this for my own stats parsing tool.
@@ -12,4 +12,4 @@ I plan to use this for my own stats parsing tool.
12
12
  * Enter game
13
13
 
14
14
  ## Credits
15
- * nTraum, I stole most of the regexes from him his [TF2Stats](https://github.com/nTraum/tf2stats/) project.
15
+ * nTraum, I stole most of the regexes from his [TF2Stats](https://github.com/nTraum/tf2stats/) project.
@@ -57,17 +57,5 @@ module TF2LineParser
57
57
 
58
58
  end
59
59
 
60
- class PVPEvent < Event
61
- def self.attributes
62
- @attributes ||= [:time, :player_nick, :player_steamid, :player_team, :target_nick, :target_steamid, :target_team]
63
- end
64
-
65
- def initialize(time, player_name, player_steam_id, player_team, target_name, target_steam_id, target_team)
66
- @time = parse_time(time)
67
- @player = Player.new(player_name, player_steam_id, player_team)
68
- @target = Player.new(target_name, target_steam_id, target_team)
69
- end
70
- end
71
-
72
60
  end
73
61
  end
@@ -4,7 +4,27 @@ module TF2LineParser
4
4
  class Kill < PVPEvent
5
5
 
6
6
  def self.regex
7
- @regex ||= /#{regex_time} #{regex_player} killed #{regex_target} with/
7
+ @regex ||= /#{regex_time} #{regex_player} killed #{regex_target} #{regex_weapon} #{regex_customkill}/
8
+ end
9
+
10
+ def self.regex_weapon
11
+ @regex_weapon ||= 'with "(?\'weapon\'\w*)"'
12
+ end
13
+
14
+ def self.regex_customkill
15
+ @regex_customkill ||= /(\(customkill "(?'customkill'\w*)"\))?/
16
+ end
17
+
18
+ def self.attributes
19
+ @attributes ||= [:time, :player_nick, :player_steamid, :player_team, :target_nick, :target_steamid, :target_team, :weapon, :customkill]
20
+ end
21
+
22
+ def initialize(time, player_name, player_steam_id, player_team, target_name, target_steam_id, target_team, weapon, customkill)
23
+ @time = parse_time(time)
24
+ @player = Player.new(player_name, player_steam_id, player_team)
25
+ @target = Player.new(target_name, target_steam_id, target_team)
26
+ @weapon = weapon
27
+ @customkill = customkill
8
28
  end
9
29
 
10
30
  end
@@ -1,19 +1,18 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class MatchEnd < Event
4
+ class MatchEnd < RoundEventWithVariables
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} World triggered "Game_Over" reason "(?'reason'.*)"/
6
+ def self.round_variable_regex
7
+ @round_variable_regex ||= /reason "(?'reason'.*)"/
8
8
  end
9
9
 
10
- def self.attributes
11
- @attributes ||= [:time, :reason]
10
+ def self.round_type
11
+ "Game_Over"
12
12
  end
13
13
 
14
- def initialize(time, reason)
15
- @time = parse_time(time)
16
- @reason = reason
14
+ def self.round_variable
15
+ @round_variable ||= :reason
17
16
  end
18
17
 
19
18
  end
@@ -1,10 +1,25 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class MedicDeath < PVPEvent
4
+ class MedicDeath < Event
5
5
 
6
6
  def self.regex
7
- @regex ||= /#{regex_time} #{regex_player} triggered "medic_death" against #{regex_target}.*/
7
+ @regex ||= /#{regex_time} #{regex_player} triggered "medic_death" against #{regex_target} #{regex_medic_death_info}/
8
+ end
9
+
10
+ def self.regex_medic_death_info
11
+ @regex_healing ||= '\(healing "(?\'healing\'\d+)"\) \(ubercharge "(?\'ubercharge\'\d+)"\)'
12
+ end
13
+
14
+ def self.attributes
15
+ @attributes ||= [:time, :player_nick, :player_steamid, :player_team, :target_nick, :target_steamid, :target_team, :ubercharge]
16
+ end
17
+
18
+ def initialize(time, player_name, player_steam_id, player_team, target_name, target_steam_id, target_team, ubercharge)
19
+ @time = parse_time(time)
20
+ @player = Player.new(player_name, player_steam_id, player_team)
21
+ @target = Player.new(target_name, target_steam_id, target_team)
22
+ @ubercharge = (ubercharge == "1")
8
23
  end
9
24
 
10
25
  end
@@ -1,24 +1,18 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class PickupItem < Event
4
+ class PickupItem < PlayerActionEvent
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} #{regex_player} picked up item #{regex_item}/
6
+ def self.action_text
7
+ @action_text ||= "picked up item"
8
8
  end
9
9
 
10
- def self.regex_item
10
+ def self.regex_action
11
11
  @regex_item ||= '\"(?\'item\'.*)\"'
12
12
  end
13
13
 
14
- def self.attributes
15
- @attributes ||= [:time, :player_nick, :player_steamid, :player_team, :item]
16
- end
17
-
18
- def initialize(time, player_name, player_steam_id, player_team, item)
19
- @time = parse_time(time)
20
- @player = Player.new(player_name, player_steam_id, player_team)
21
- @item = item
14
+ def self.item
15
+ :item
22
16
  end
23
17
 
24
18
  end
@@ -0,0 +1,23 @@
1
+ module TF2LineParser
2
+
3
+ module Events
4
+
5
+ class PlayerActionEvent < Event
6
+
7
+ def self.regex
8
+ @regex ||= /#{regex_time} #{regex_player} #{action_text} #{regex_action}/
9
+ end
10
+
11
+ def self.attributes
12
+ @attributes ||= [:time, :player_nick, :player_steamid, :player_team, self.item]
13
+ end
14
+
15
+ def initialize(time, player_name, player_steam_id, player_team, item = self.class.item)
16
+ @time = parse_time(time)
17
+ @player = Player.new(player_name, player_steam_id, player_team)
18
+ instance_variable_set("@#{self.class.item}", item)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module TF2LineParser
2
+
3
+ module Events
4
+
5
+ class PVPEvent < Event
6
+ def self.attributes
7
+ @attributes ||= [:time, :player_nick, :player_steamid, :player_team, :target_nick, :target_steamid, :target_team]
8
+ end
9
+
10
+ def initialize(time, player_name, player_steam_id, player_team, target_name, target_steam_id, target_team)
11
+ @time = parse_time(time)
12
+ @player = Player.new(player_name, player_steam_id, player_team)
13
+ @target = Player.new(target_name, target_steam_id, target_team)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,24 +1,18 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class RoleChange < Event
4
+ class RoleChange < PlayerActionEvent
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} #{regex_player} changed role to #{regex_role}/
6
+ def self.action_text
7
+ @action_text ||= "changed role to"
8
8
  end
9
9
 
10
- def self.regex_role
10
+ def self.regex_action
11
11
  @regex_role ||= '\"(?\'role\'.*)\"'
12
12
  end
13
13
 
14
- def self.attributes
15
- @attributes ||= [:time, :player_nick, :player_steamid, :player_team, :role]
16
- end
17
-
18
- def initialize(time, player_name, player_steam_id, player_team, role)
19
- @time = parse_time(time)
20
- @player = Player.new(player_name, player_steam_id, player_team)
21
- @role = role
14
+ def self.item
15
+ :role
22
16
  end
23
17
 
24
18
  end
@@ -0,0 +1,22 @@
1
+ module TF2LineParser
2
+ module Events
3
+
4
+ class RoundEventWithVariables < Event
5
+
6
+ def self.regex
7
+ @regex ||= /#{regex_time} World triggered "#{round_type}" #{round_variable_regex}/
8
+ end
9
+
10
+ def self.attributes
11
+ @attributes ||= [:time, round_variable]
12
+ end
13
+
14
+ def initialize(time, round_variable)
15
+ @time = parse_time(time)
16
+ instance_variable_set("@#{self.class.round_variable}", round_variable)
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ module TF2LineParser
2
+ module Events
3
+
4
+ class RoundEventWithoutVariables < Event
5
+
6
+ def self.regex
7
+ @regex ||= /#{regex_time} World triggered "#{round_type}"/
8
+ end
9
+
10
+ def self.attributes
11
+ @attributes ||= [:time]
12
+ end
13
+
14
+ def initialize(time)
15
+ @time = parse_time(time)
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+ end
@@ -1,19 +1,18 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class RoundLength < Event
4
+ class RoundLength < RoundEventWithVariables
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} World triggered "Round_Length" \(seconds \"(?'length'.*)"\)/
6
+ def self.round_type
7
+ @round_type ||= "Round_Length"
8
8
  end
9
9
 
10
- def self.attributes
11
- @attributes ||= [:time, :length]
10
+ def self.round_variable_regex
11
+ @round_variable_regex ||= /\(seconds \"(?'length'.*)"\)/
12
12
  end
13
13
 
14
- def initialize(time, length)
15
- @time = parse_time(time)
16
- @length = length
14
+ def self.round_variable
15
+ @round_variable ||= :length
17
16
  end
18
17
 
19
18
  end
@@ -1,18 +1,10 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class RoundStalemate < Event
4
+ class RoundStalemate < RoundEventWithoutVariables
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} World triggered "Round_Stalemate"/
8
- end
9
-
10
- def self.attributes
11
- @attributes ||= [:time]
12
- end
13
-
14
- def initialize(time)
15
- @time = parse_time(time)
6
+ def self.round_type
7
+ @round_type ||= "Round_Stalemate"
16
8
  end
17
9
 
18
10
  end
@@ -1,18 +1,10 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class RoundStart < Event
4
+ class RoundStart < RoundEventWithoutVariables
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} World triggered "Round_Start"/
8
- end
9
-
10
- def self.attributes
11
- @attributes ||= [:time]
12
- end
13
-
14
- def initialize(time)
15
- @time = parse_time(time)
6
+ def self.round_type
7
+ @round_type ||= "Round_Start"
16
8
  end
17
9
 
18
10
  end
@@ -1,20 +1,20 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class RoundWin < Event
4
+ class RoundWin < RoundEventWithVariables
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} World triggered "Round_Win" \(winner "(?'team'Red|Blue)"\)/
6
+ def self.round_type
7
+ @round_type ||= "Round_Win"
8
8
  end
9
9
 
10
- def self.attributes
11
- @attributes ||= [:time, :team]
10
+ def self.round_variable_regex
11
+ @round_variable_regex ||= /\(winner "(?'team'Red|Blue)"\)/
12
12
  end
13
13
 
14
- def initialize(time, team)
15
- @time = parse_time(time)
16
- @team = team
14
+ def self.round_variable
15
+ @round_variable ||= :team
17
16
  end
17
+
18
18
  end
19
19
 
20
20
  end
@@ -1,24 +1,18 @@
1
1
  module TF2LineParser
2
2
  module Events
3
3
 
4
- class Suicide < Event
4
+ class Suicide < PlayerActionEvent
5
5
 
6
- def self.regex
7
- @regex ||= /#{regex_time} #{regex_player} committed suicide with #{regex_suicide}/
6
+ def self.action_text
7
+ @action_text ||= "committed suicide with"
8
8
  end
9
9
 
10
- def self.regex_suicide
10
+ def self.regex_action
11
11
  @regex_role ||= '\"(?\'method\'\w*)\"'
12
12
  end
13
13
 
14
- def self.attributes
15
- @attributes ||= [:time, :player_nick, :player_steamid, :player_team, :method]
16
- end
17
-
18
- def initialize(time, player_name, player_steam_id, player_team, method)
19
- @time = parse_time(time)
20
- @player = Player.new(player_name, player_steam_id, player_team)
21
- @method = method
14
+ def self.item
15
+ :method
22
16
  end
23
17
 
24
18
  end
@@ -1,3 +1,3 @@
1
1
  module TF2LogLineParser
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
@@ -3,6 +3,10 @@ require "tf2_line_parser/parser"
3
3
  require "tf2_line_parser/player"
4
4
 
5
5
  require "tf2_line_parser/events/event"
6
+ require "tf2_line_parser/events/pvp_event"
7
+ require "tf2_line_parser/events/player_action_event"
8
+ require "tf2_line_parser/events/round_event_without_variables"
9
+ require "tf2_line_parser/events/round_event_with_variables"
6
10
  require "tf2_line_parser/events/score"
7
11
  Dir[File.dirname(__FILE__) + '/tf2_line_parser/events/*.rb'].each {|file| require file }
8
12
  require "tf2_line_parser/line"
@@ -89,7 +89,17 @@ module TF2LineParser
89
89
  target_name = "broder jukebox"
90
90
  target_steam_id = "STEAM_0:1:13978585"
91
91
  target_team = "Blue"
92
- Events::Kill.should_receive(:new).with(anything, player_name, player_steam_id, player_team, target_name, target_steam_id, target_team)
92
+ weapon = "pistol_scout"
93
+ customkill = nil
94
+ Events::Kill.should_receive(:new).with(anything, player_name, player_steam_id, player_team, target_name, target_steam_id, target_team, weapon, customkill)
95
+ parse(line)
96
+ end
97
+
98
+ it 'recognizes headshot kills' do
99
+ line = log_lines[1951]
100
+ weapon = "sniperrifle"
101
+ customkill = "headshot"
102
+ Events::Kill.should_receive(:new).with(anything, anything, anything, anything, anything, anything, anything, weapon, customkill)
93
103
  parse(line)
94
104
  end
95
105
 
@@ -199,10 +209,17 @@ module TF2LineParser
199
209
  killer_name = "Epsilon numlocked"
200
210
  killer_steam_id = "STEAM_0:1:16347045"
201
211
  killer_team = "Red"
202
- Events::MedicDeath.should_receive(:new).with(anything, killer_name, killer_steam_id, killer_team, medic_name, medic_steam_id, medic_team)
212
+ uber = false
213
+ Events::MedicDeath.should_receive(:new).with(anything, killer_name, killer_steam_id, killer_team, medic_name, medic_steam_id, medic_team, "0")
203
214
  parse(line)
204
215
  end
205
216
 
217
+ it 'recognizes medic uberdrops' do
218
+ uberdrop = 'L 10/04/2012 - 21:43:06: "TLR Traxantic<28><STEAM_0:1:1328042><Red>" triggered "medic_death" against "cc//Admirable<3><STEAM_0:0:154182><Blue>" (healing "6478") (ubercharge "1")'
219
+ Events::MedicDeath.should_receive(:new).with(anything, anything, anything, anything, anything, anything, anything, "1")
220
+ parse(uberdrop)
221
+ end
222
+
206
223
  it 'recognizes role changes' do
207
224
  line = log_lines[1712]
208
225
  player_name = "broder bybben"
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,11 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+ SimpleCov.start
9
+
1
10
  require 'pry-nav'
2
11
  require "tf2_line_parser"
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.homepage = 'http://github.com/Arie/tf2_line_parser'
16
16
 
17
17
  gem.add_dependency "activesupport"
18
+ gem.add_development_dependency 'coveralls'
18
19
  gem.add_development_dependency "pry-nav", "~> 0.2.3"
19
20
  gem.add_development_dependency "rspec", "~> 2.12.0"
20
21
  gem.add_development_dependency "spec_coverage", "~> 0.0.5"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tf2_line_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: coveralls
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: pry-nav
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -103,9 +119,13 @@ files:
103
119
  - lib/tf2_line_parser/events/match_end.rb
104
120
  - lib/tf2_line_parser/events/medic_death.rb
105
121
  - lib/tf2_line_parser/events/pickup_item.rb
122
+ - lib/tf2_line_parser/events/player_action_event.rb
106
123
  - lib/tf2_line_parser/events/point_capture.rb
124
+ - lib/tf2_line_parser/events/pvp_event.rb
107
125
  - lib/tf2_line_parser/events/revenge.rb
108
126
  - lib/tf2_line_parser/events/role_change.rb
127
+ - lib/tf2_line_parser/events/round_event_with_variables.rb
128
+ - lib/tf2_line_parser/events/round_event_without_variables.rb
109
129
  - lib/tf2_line_parser/events/round_length.rb
110
130
  - lib/tf2_line_parser/events/round_stalemate.rb
111
131
  - lib/tf2_line_parser/events/round_start.rb
@@ -157,4 +177,3 @@ test_files:
157
177
  - spec/lib/tf2_line_parser/parser_spec.rb
158
178
  - spec/lib/tf2_line_parser/player_spec.rb
159
179
  - spec/spec_helper.rb
160
- has_rdoc: