openra 1.6.0 → 1.7.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -2
- data/Gemfile +2 -0
- data/Rakefile +2 -0
- data/lib/bindata/big_integer.rb +2 -0
- data/lib/bindata/pascal_string.rb +2 -0
- data/lib/openra-cli.rb +2 -0
- data/lib/openra-replays.rb +2 -0
- data/lib/openra-struct.rb +2 -0
- data/lib/openra-types.rb +2 -0
- data/lib/openra-yaml.rb +2 -0
- data/lib/openra.rb +2 -0
- data/lib/openra/cli.rb +4 -2
- data/lib/openra/cli/command_registry.rb +2 -0
- data/lib/openra/cli/commands/detect_production_macros.rb +14 -3
- data/lib/openra/cli/commands/formatters.rb +2 -0
- data/lib/openra/cli/commands/replay_data.rb +63 -51
- data/lib/openra/cli/commands/version.rb +2 -0
- data/lib/openra/replays.rb +2 -1
- data/lib/openra/replays/file.rb +23 -14
- data/lib/openra/replays/metadata.rb +2 -0
- data/lib/openra/replays/metadata_marker.rb +2 -0
- data/lib/openra/replays/order.rb +4 -2
- data/lib/openra/replays/order_decorator.rb +2 -0
- data/lib/openra/replays/order_list.rb +2 -0
- data/lib/openra/replays/packet.rb +3 -3
- data/lib/openra/replays/replay.rb +4 -41
- data/lib/openra/struct.rb +2 -0
- data/lib/openra/struct/client.rb +2 -0
- data/lib/openra/struct/functions.rb +2 -0
- data/lib/openra/struct/game_options.rb +2 -0
- data/lib/openra/struct/game_options/boolean_option.rb +2 -0
- data/lib/openra/struct/game_options/integer_option.rb +2 -0
- data/lib/openra/struct/game_options/string_option.rb +2 -0
- data/lib/openra/struct/global_settings.rb +2 -0
- data/lib/openra/struct/metadata.rb +2 -0
- data/lib/openra/struct/player.rb +2 -0
- data/lib/openra/struct/pre_processor.rb +2 -0
- data/lib/openra/struct/sync_info.rb +2 -0
- data/lib/openra/struct/sync_lobby_clients.rb +2 -0
- data/lib/openra/types.rb +2 -0
- data/lib/openra/version.rb +3 -1
- data/lib/openra/yaml.rb +2 -0
- data/openra.gemspec +7 -1
- metadata +31 -4
- data/lib/openra/replays/packet_list.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f5589223dd3591d9db257c50c14843f99ff9d6cb25e54f667fc2b43a8dbcfaf
|
4
|
+
data.tar.gz: 83d7082b488eb31f84e0f891e93acf1514f3b1548826190385190d6234a31ea6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56da77ac510188b14c9c2497809f65989ce92751706026350b860c111d8c94a00ad414a47e8d158a03130ff5602b2615266a3e19229f786d3dc4f4d07389aa4c
|
7
|
+
data.tar.gz: c0ebd68879e4d35bc3084052034b4068105346458665c7a475fb36a550fcb9de57269188e7fc3e5da16df871e53b87b00434fbea6576a03927c9de8397c0ef5b
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
-
[Compare v1.
|
3
|
+
[Compare v1.7.0...HEAD](https://github.com/AMHOL/openra-ruby/compare/v1.7.0...HEAD)
|
4
|
+
|
5
|
+
## v1.7.0
|
6
|
+
|
7
|
+
### Improvements
|
8
|
+
|
9
|
+
* Decreased memory usage by streaming orders with iterator ([AMHOL](https://github.com/AMHOL))
|
10
|
+
|
11
|
+
[Compare v1.6.0...v1.7.0](https://github.com/AMHOL/openra-ruby/compare/v1.6.0...v1.7.0)
|
4
12
|
|
5
13
|
## v1.6.0
|
6
14
|
|
@@ -8,7 +16,7 @@
|
|
8
16
|
|
9
17
|
* Updated to work with release-20200202 (current release) ([AMHOL](https://github.com/AMHOL))
|
10
18
|
|
11
|
-
[Compare v1.5.0...
|
19
|
+
[Compare v1.5.0...v1.6.0](https://github.com/AMHOL/openra-ruby/compare/v1.5.0...v1.6.0)
|
12
20
|
|
13
21
|
## v1.5.0
|
14
22
|
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/lib/bindata/big_integer.rb
CHANGED
data/lib/openra-cli.rb
CHANGED
data/lib/openra-replays.rb
CHANGED
data/lib/openra-struct.rb
CHANGED
data/lib/openra-types.rb
CHANGED
data/lib/openra-yaml.rb
CHANGED
data/lib/openra.rb
CHANGED
data/lib/openra/cli.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'securerandom'
|
2
4
|
require 'yaml'
|
3
5
|
require 'json'
|
@@ -12,8 +14,8 @@ require 'openra/cli/command_registry'
|
|
12
14
|
|
13
15
|
module Openra
|
14
16
|
class CLI
|
15
|
-
def call(*args)
|
16
|
-
Dry::CLI.new(CommandRegistry).call(*args)
|
17
|
+
def call(*args, **kwargs, &block)
|
18
|
+
Dry::CLI.new(CommandRegistry).call(*args, **kwargs, &block)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Openra
|
2
4
|
class CLI
|
3
5
|
module Commands
|
@@ -12,13 +14,20 @@ module Openra
|
|
12
14
|
def call(replay:, **options)
|
13
15
|
replay = Openra::Replays::Replay.new(replay)
|
14
16
|
commands = Hash.new(&ARRAY_HASH)
|
17
|
+
sync_info = nil
|
15
18
|
|
16
|
-
replay.
|
19
|
+
replay.each_order do |order|
|
17
20
|
case order.command
|
21
|
+
when 'StartGame'
|
22
|
+
game_started = true
|
23
|
+
when 'SyncInfo'
|
24
|
+
sync_info = Openra::Struct::SyncInfo.new(
|
25
|
+
Openra::YAML.load(order.target)
|
26
|
+
) unless game_started
|
18
27
|
when 'StartProduction'
|
19
28
|
commands[order.client_index.to_s] << {
|
20
29
|
target: order.target,
|
21
|
-
msec: order.frame *
|
30
|
+
msec: order.frame * sync_info.global_settings.frametime_multiplier
|
22
31
|
}
|
23
32
|
end
|
24
33
|
end
|
@@ -58,7 +67,9 @@ module Openra
|
|
58
67
|
|
59
68
|
def detect_sequences(player_commands)
|
60
69
|
sequences = []
|
61
|
-
groups = player_commands.each_with_object(
|
70
|
+
groups = player_commands.each_with_object(
|
71
|
+
Hash.new(&ARRAY_HASH)
|
72
|
+
).with_index do |(command, hash), index|
|
62
73
|
hash[command[:delay]] << command.merge(index: index)
|
63
74
|
end
|
64
75
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Openra
|
2
4
|
class CLI
|
3
5
|
module Commands
|
@@ -13,7 +15,7 @@ module Openra
|
|
13
15
|
data = {
|
14
16
|
mod: replay.metadata.mod,
|
15
17
|
version: replay.metadata.version,
|
16
|
-
server_name:
|
18
|
+
server_name: nil,
|
17
19
|
map: {
|
18
20
|
name: replay.metadata.map_name,
|
19
21
|
hash: replay.metadata.map_hash
|
@@ -29,58 +31,70 @@ module Openra
|
|
29
31
|
start_time: replay.metadata.start_time.iso8601,
|
30
32
|
end_time: replay.metadata.end_time.iso8601,
|
31
33
|
duration: time((replay.metadata.end_time - replay.metadata.start_time) * 1000),
|
32
|
-
options:
|
33
|
-
explored_map: replay.game_options.explored_map_enabled.value,
|
34
|
-
speed: replay.game_options.game_speed.value,
|
35
|
-
starting_cash: replay.game_options.starting_cash.value,
|
36
|
-
starting_units: replay.game_options.starting_units.value,
|
37
|
-
fog_enabled: replay.game_options.fog_enabled.value,
|
38
|
-
cheats_enabled: replay.game_options.cheats_enabled.value,
|
39
|
-
kill_bounty_enabled: replay.game_options.bounties_enabled.value,
|
40
|
-
allow_undeploy: replay.game_options.conyard_undeploy_enabled.value,
|
41
|
-
crates_enabled: replay.game_options.crates_enabled.value,
|
42
|
-
build_off_allies: replay.game_options.build_off_allies_enabled.value,
|
43
|
-
restrict_build_radius: replay.game_options.restricted_build_radius_enabled.value,
|
44
|
-
short_game: replay.game_options.short_game_enabled.value,
|
45
|
-
techlevel: replay.game_options.tech_level.value
|
46
|
-
}
|
47
|
-
},
|
48
|
-
clients: replay.clients.map { |client|
|
49
|
-
player = replay.player(client.index)
|
50
|
-
|
51
|
-
{
|
52
|
-
index: client.index,
|
53
|
-
name: client.name,
|
54
|
-
preferred_color: client.preferred_color,
|
55
|
-
color: client.preferred_color,
|
56
|
-
spawn: {
|
57
|
-
random: player&.is_random_spawn,
|
58
|
-
point: client.spawn_point
|
59
|
-
},
|
60
|
-
faction: {
|
61
|
-
chosen: client.faction_name.downcase,
|
62
|
-
actual: player&.faction_id
|
63
|
-
},
|
64
|
-
ip: client.ip,
|
65
|
-
team: player&.team,
|
66
|
-
is_bot: player&.is_bot || false,
|
67
|
-
is_admin: client.is_admin,
|
68
|
-
is_player: !player.nil?,
|
69
|
-
is_winner: player&.outcome == 'Won',
|
70
|
-
build: []
|
71
|
-
}
|
34
|
+
options: nil
|
72
35
|
},
|
36
|
+
clients: [],
|
73
37
|
chat: []
|
74
38
|
}
|
75
39
|
|
40
|
+
game_started = false
|
76
41
|
current_sync_clients = []
|
42
|
+
sync_info = nil
|
77
43
|
|
78
|
-
replay.
|
44
|
+
replay.each_order do |order|
|
79
45
|
client = current_sync_clients.find do |candidate|
|
80
46
|
candidate.index == order.client_index.to_s
|
81
47
|
end
|
82
48
|
|
83
49
|
case order.command
|
50
|
+
when 'StartGame'
|
51
|
+
game_started = true
|
52
|
+
|
53
|
+
data[:clients] = sync_info.clients.map do |client|
|
54
|
+
player = replay.player(client.index)
|
55
|
+
|
56
|
+
{
|
57
|
+
index: client.index,
|
58
|
+
name: client.name,
|
59
|
+
preferred_color: client.preferred_color,
|
60
|
+
color: client.color,
|
61
|
+
spawn: {
|
62
|
+
random: player&.is_random_spawn,
|
63
|
+
point: client.spawn_point
|
64
|
+
},
|
65
|
+
faction: {
|
66
|
+
chosen: client.faction_name.downcase,
|
67
|
+
actual: player&.faction_id
|
68
|
+
},
|
69
|
+
ip: client.ip,
|
70
|
+
team: player&.team,
|
71
|
+
is_bot: player&.is_bot || false,
|
72
|
+
is_admin: client.is_admin,
|
73
|
+
is_player: !player.nil?,
|
74
|
+
is_winner: player&.outcome == 'Won',
|
75
|
+
build: []
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
data[:game][:options] = {
|
80
|
+
explored_map: sync_info.global_settings.game_options.explored_map_enabled.value,
|
81
|
+
speed: sync_info.global_settings.game_options.game_speed.value,
|
82
|
+
starting_cash: sync_info.global_settings.game_options.starting_cash.value,
|
83
|
+
starting_units: sync_info.global_settings.game_options.starting_units.value,
|
84
|
+
fog_enabled: sync_info.global_settings.game_options.fog_enabled.value,
|
85
|
+
cheats_enabled: sync_info.global_settings.game_options.cheats_enabled.value,
|
86
|
+
kill_bounty_enabled: sync_info.global_settings.game_options.bounties_enabled.value,
|
87
|
+
allow_undeploy: sync_info.global_settings.game_options.conyard_undeploy_enabled.value,
|
88
|
+
crates_enabled: sync_info.global_settings.game_options.crates_enabled.value,
|
89
|
+
build_off_allies: sync_info.global_settings.game_options.build_off_allies_enabled.value,
|
90
|
+
restrict_build_radius: sync_info.global_settings.game_options.restricted_build_radius_enabled.value,
|
91
|
+
short_game: sync_info.global_settings.game_options.short_game_enabled.value,
|
92
|
+
techlevel: sync_info.global_settings.game_options.tech_level.value
|
93
|
+
}
|
94
|
+
when 'SyncInfo'
|
95
|
+
sync_info = Openra::Struct::SyncInfo.new(
|
96
|
+
Openra::YAML.load(order.target)
|
97
|
+
) unless game_started
|
84
98
|
when 'SyncLobbyClients'
|
85
99
|
current_sync_clients = Openra::Struct::SyncLobbyClients.new(
|
86
100
|
Openra::YAML.load(order.target)
|
@@ -91,40 +105,38 @@ module Openra
|
|
91
105
|
end
|
92
106
|
|
93
107
|
client_hash[:build] << {
|
94
|
-
structure:
|
95
|
-
game_time: time(order.frame *
|
108
|
+
structure: order.target,
|
109
|
+
game_time: time(order.frame * sync_info.global_settings.frametime_multiplier),
|
96
110
|
placement: order.target_pos.to_i
|
97
111
|
}
|
98
112
|
when 'Message'
|
99
113
|
data[:chat] << {
|
100
114
|
channel: 'server',
|
101
115
|
name: nil,
|
102
|
-
message:
|
116
|
+
message: order.target
|
103
117
|
}
|
104
118
|
when 'Chat'
|
105
119
|
data[:chat] << {
|
106
120
|
channel: 'global',
|
107
121
|
name: client.name,
|
108
|
-
message:
|
122
|
+
message: order.target
|
109
123
|
}
|
110
124
|
when 'TeamChat'
|
111
125
|
data[:chat] << {
|
112
126
|
channel: client.team,
|
113
127
|
name: client.name,
|
114
|
-
message:
|
128
|
+
message: order.target
|
115
129
|
}
|
116
130
|
end
|
117
131
|
end
|
118
132
|
|
133
|
+
data[:server_name] = sync_info.global_settings.server_name
|
134
|
+
|
119
135
|
puts FORMATTERS.fetch(options[:format]).call(data)
|
120
136
|
end
|
121
137
|
|
122
138
|
private
|
123
139
|
|
124
|
-
def utf8(string)
|
125
|
-
string.force_encoding('UTF-8').to_s
|
126
|
-
end
|
127
|
-
|
128
140
|
def time(msec)
|
129
141
|
sec = msec / 1000
|
130
142
|
mm, ss = sec.divmod(60)
|
data/lib/openra/replays.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'date'
|
2
4
|
require 'bindata'
|
3
5
|
require 'bindata/big_integer'
|
@@ -8,7 +10,6 @@ require 'openra/replays/order_decorator'
|
|
8
10
|
require 'openra/replays/order'
|
9
11
|
require 'openra/replays/order_list'
|
10
12
|
require 'openra/replays/packet'
|
11
|
-
require 'openra/replays/packet_list'
|
12
13
|
require 'openra/replays/metadata_marker'
|
13
14
|
require 'openra/replays/metadata'
|
14
15
|
require 'openra/replays/file'
|
data/lib/openra/replays/file.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Openra
|
2
4
|
module Replays
|
3
5
|
class File
|
@@ -5,20 +7,28 @@ module Openra
|
|
5
7
|
@filename = filename
|
6
8
|
end
|
7
9
|
|
8
|
-
def
|
9
|
-
|
10
|
-
|
10
|
+
def each_order(&block)
|
11
|
+
return enum_for(:each_order) unless block_given?
|
12
|
+
|
13
|
+
file.rewind
|
11
14
|
|
12
|
-
|
13
|
-
|
15
|
+
io = BinData::IO::Read.new(file)
|
16
|
+
template = Packet.new(fields: Packet.fields)
|
17
|
+
|
18
|
+
loop do
|
19
|
+
template.new.read(file).orders.each(&block)
|
20
|
+
rescue EOFError, IOError
|
21
|
+
break
|
22
|
+
end
|
14
23
|
end
|
15
24
|
|
16
25
|
def metadata
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
26
|
+
@metadata ||= begin
|
27
|
+
metadata_fs = file.tap(&:rewind)
|
28
|
+
offset = -(metadata_marker.data_length + 4)
|
29
|
+
metadata_fs.seek(offset, IO::SEEK_END)
|
30
|
+
Metadata.read(metadata_fs)
|
31
|
+
end
|
22
32
|
end
|
23
33
|
|
24
34
|
|
@@ -26,13 +36,12 @@ module Openra
|
|
26
36
|
|
27
37
|
attr_reader :filename
|
28
38
|
|
29
|
-
def
|
30
|
-
@
|
31
|
-
@fs.tap(&:rewind)
|
39
|
+
def file
|
40
|
+
@file ||= ::File.open(filename, 'rb')
|
32
41
|
end
|
33
42
|
|
34
43
|
def metadata_marker
|
35
|
-
@metadata_marker ||= MetadataMarker.read(
|
44
|
+
@metadata_marker ||= MetadataMarker.read(file)
|
36
45
|
end
|
37
46
|
end
|
38
47
|
end
|
data/lib/openra/replays/order.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Openra
|
2
4
|
module Replays
|
3
5
|
class Order < BinData::Record
|
4
|
-
HEX_FE = ?\xFE.force_encoding('ASCII-8BIT').freeze
|
5
|
-
HEX_FF = ?\xFF.force_encoding('ASCII-8BIT').freeze
|
6
|
+
HEX_FE = ?\xFE.dup.force_encoding('ASCII-8BIT').freeze
|
7
|
+
HEX_FF = ?\xFF.dup.force_encoding('ASCII-8BIT').freeze
|
6
8
|
# NEED TO LEARN HOW TO READ FLAGS AND TARGET TYPE
|
7
9
|
IS_STANDARD_ORDER = -> { order_type == HEX_FF }
|
8
10
|
IS_IMMEDIATE_ORDER = -> { order_type == HEX_FE }
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Openra
|
2
4
|
module Replays
|
3
5
|
class Packet < BinData::Record
|
@@ -7,9 +9,7 @@ module Openra
|
|
7
9
|
string :data, read_length: :data_length
|
8
10
|
|
9
11
|
def orders
|
10
|
-
return unless valid_order_list?
|
11
|
-
|
12
|
-
order_list = OrderList.read(data)
|
12
|
+
return [] unless valid_order_list?
|
13
13
|
|
14
14
|
@orders ||= order_list.orders.map do |order|
|
15
15
|
OrderDecorator.new(order, client_index, order_list.frame)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Openra
|
2
4
|
module Replays
|
3
5
|
class Replay
|
@@ -13,8 +15,8 @@ module Openra
|
|
13
15
|
)
|
14
16
|
end
|
15
17
|
|
16
|
-
def
|
17
|
-
|
18
|
+
def each_order(&block)
|
19
|
+
file.each_order(&block)
|
18
20
|
end
|
19
21
|
|
20
22
|
def players
|
@@ -26,45 +28,6 @@ module Openra
|
|
26
28
|
candidate.index == index
|
27
29
|
end
|
28
30
|
end
|
29
|
-
|
30
|
-
def clients
|
31
|
-
sync_info.clients
|
32
|
-
end
|
33
|
-
|
34
|
-
def client(index)
|
35
|
-
clients.find do |candidate|
|
36
|
-
candidate.index == index
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def global_settings
|
41
|
-
sync_info.global_settings
|
42
|
-
end
|
43
|
-
|
44
|
-
def frametime_multiplier
|
45
|
-
global_settings.frametime_multiplier
|
46
|
-
end
|
47
|
-
|
48
|
-
def game_options
|
49
|
-
global_settings.game_options
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def sync_info
|
55
|
-
return @sync_info if @sync_info
|
56
|
-
|
57
|
-
start_game_order = orders.find { |order| order[:command] == 'StartGame' }
|
58
|
-
start_game_index = orders.index(start_game_order)
|
59
|
-
pre_game_orders = orders[0..start_game_index]
|
60
|
-
start_game_sync_order = pre_game_orders.reverse.find do |order|
|
61
|
-
order[:command] == 'SyncInfo'
|
62
|
-
end
|
63
|
-
|
64
|
-
@sync_info = Openra::Struct::SyncInfo.new(
|
65
|
-
Openra::YAML.load(start_game_sync_order.target)
|
66
|
-
)
|
67
|
-
end
|
68
31
|
end
|
69
32
|
end
|
70
33
|
end
|
data/lib/openra/struct.rb
CHANGED
data/lib/openra/struct/client.rb
CHANGED
data/lib/openra/struct/player.rb
CHANGED
data/lib/openra/types.rb
CHANGED
data/lib/openra/version.rb
CHANGED
data/lib/openra/yaml.rb
CHANGED
data/openra.gemspec
CHANGED
@@ -10,7 +10,11 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.homepage = 'https://github.com/AMHOL/openra-ruby'
|
11
11
|
spec.license = 'MIT'
|
12
12
|
|
13
|
-
spec.files = `git ls-files -z`.split("\x0") -
|
13
|
+
spec.files = `git ls-files -z`.split("\x0") - %w(
|
14
|
+
bin/console
|
15
|
+
bin/profile
|
16
|
+
bin/trace_alloc
|
17
|
+
)
|
14
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
15
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
16
20
|
spec.require_paths = ['lib']
|
@@ -24,4 +28,6 @@ Gem::Specification.new do |spec|
|
|
24
28
|
|
25
29
|
spec.add_development_dependency 'rake'
|
26
30
|
spec.add_development_dependency 'pry'
|
31
|
+
spec.add_development_dependency 'memory_profiler'
|
32
|
+
spec.add_development_dependency 'stackprof'
|
27
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Holland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -122,6 +122,34 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: memory_profiler
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: stackprof
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
125
153
|
description:
|
126
154
|
email:
|
127
155
|
- andyholland1991@aol.com
|
@@ -159,7 +187,6 @@ files:
|
|
159
187
|
- lib/openra/replays/order_decorator.rb
|
160
188
|
- lib/openra/replays/order_list.rb
|
161
189
|
- lib/openra/replays/packet.rb
|
162
|
-
- lib/openra/replays/packet_list.rb
|
163
190
|
- lib/openra/replays/replay.rb
|
164
191
|
- lib/openra/struct.rb
|
165
192
|
- lib/openra/struct/client.rb
|
@@ -197,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
224
|
- !ruby/object:Gem::Version
|
198
225
|
version: '0'
|
199
226
|
requirements: []
|
200
|
-
rubygems_version: 3.
|
227
|
+
rubygems_version: 3.0.3
|
201
228
|
signing_key:
|
202
229
|
specification_version: 4
|
203
230
|
summary: Openra Rubygem
|