gamespy_query 0.1.5 → 0.2.0pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/README.md +7 -4
- data/Rakefile +14 -0
- data/bin/gamespy_query +8 -0
- data/gamespy_query.gemspec +3 -3
- data/lib/gamespy_query.rb +20 -5
- data/lib/gamespy_query/base.rb +45 -24
- data/lib/gamespy_query/master.rb +40 -13
- data/lib/gamespy_query/options.rb +140 -0
- data/lib/gamespy_query/parser.rb +29 -18
- data/lib/gamespy_query/socket.rb +81 -45
- data/lib/gamespy_query/socket_master.rb +49 -3
- data/lib/gamespy_query/version.rb +2 -1
- data/test/teststrap.rb +4 -0
- data/test/units/base_test.rb +43 -0
- data/test/units/master_test.rb +17 -0
- data/test/units/options_test.rb +27 -0
- data/test/units/parser_test.rb +47 -0
- data/test/units/socket_master_test.rb +17 -0
- data/test/units/socket_test.rb +73 -0
- metadata +51 -7
data/test/teststrap.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "Base" do
|
4
|
+
setup { GamespyQuery::Base.new }
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
context "Funcs" do
|
9
|
+
setup { GamespyQuery::Funcs }
|
10
|
+
|
11
|
+
denies("TimeOutError") { topic::TimeOutError.new }.nil
|
12
|
+
|
13
|
+
# TODO: Or should we simply test the Base class who includes this already?
|
14
|
+
context "Included" do
|
15
|
+
setup { Class.new { include GamespyQuery::Funcs } }
|
16
|
+
|
17
|
+
context "Instance" do
|
18
|
+
setup { topic.new }
|
19
|
+
# TODO: This method doesnt do anything atm
|
20
|
+
asserts("strip_tags") { topic.strip_tags "test" }.equals "test"
|
21
|
+
|
22
|
+
asserts("clean integer") { topic.clean "1" }.equals 1
|
23
|
+
asserts("clean float") { topic.clean "1.5" }.equals 1.5
|
24
|
+
|
25
|
+
asserts("encode_string") { topic.encode_string("test encoding").encoding }.equals Encoding.find("UTF-8")
|
26
|
+
|
27
|
+
asserts("handle_chr") { topic.handle_chr(25 >> 8) }.equals 0
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "Tools" do
|
34
|
+
setup { GamespyQuery::Tools }
|
35
|
+
|
36
|
+
denies("Logger") { topic.logger }.nil
|
37
|
+
|
38
|
+
# TODO: Somehow returns strange string with unescaped double quotes embedded
|
39
|
+
asserts("dbg_msg") { topic.dbg_msg Exception.new }.equals "Exception: Exception\nBackTrace: \n"
|
40
|
+
|
41
|
+
asserts("log_exception") { topic.log_exception Exception.new }.equals true
|
42
|
+
asserts("debug") { topic.debug{"test"} }.nil
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "Master" do
|
4
|
+
setup { GamespyQuery::Master.new }
|
5
|
+
|
6
|
+
asserts("geoip_path") { topic.geoip_path }.equals File.join(Dir.pwd, "config")
|
7
|
+
|
8
|
+
asserts("read returns a hash") { topic.read }.is_a?(Hash)
|
9
|
+
|
10
|
+
asserts("process returns a hash") { topic.process }.is_a?(Hash)
|
11
|
+
|
12
|
+
asserts("get_params returns a string") { topic.get_params }.is_a?(String)
|
13
|
+
|
14
|
+
asserts("handle_data") { topic.handle_data "127.0.0.1:2302\n127.0.0.1:2305" }.same_elements ["127.0.0.1:2302", "127.0.0.1:2305"]
|
15
|
+
|
16
|
+
asserts("to_hash") { topic.handle_data "127.0.0.1:2302\n127.0.0.1:2305" }.is_a?(Hash)
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
context "Options" do
|
5
|
+
context "Parser" do
|
6
|
+
setup { GamespyQuery::Options }
|
7
|
+
|
8
|
+
asserts("Default Params") { topic.parse([]) }.raises SystemExit
|
9
|
+
|
10
|
+
asserts("version") { topic.parse(["--version"]) }.raises SystemExit #.equals 0
|
11
|
+
asserts("help") { topic.parse(["--help"]) }.raises SystemExit #.equals 0
|
12
|
+
#asserts("no-verbose") { topic.parse([]).options.verbose? }.equals false
|
13
|
+
asserts("verbose") { topic.parse(["-v"]) }.raises SystemExit
|
14
|
+
|
15
|
+
context "Commands" do
|
16
|
+
asserts("sync") { topic.parse(["sync", "127.0.0.1:2302"]) }.nil
|
17
|
+
end
|
18
|
+
|
19
|
+
context "Master" do
|
20
|
+
context "Commands" do
|
21
|
+
asserts("list") { any_instance_of(GamespyQuery::Master) { |c| mock(c).read { "Test data" } }; topic.parse(["master", "list"]) }.nil
|
22
|
+
asserts("process") { any_instance_of(GamespyQuery::Master) { |c| mock(c).process { "Test data" } }; topic.parse(["master", "process"]) }.nil
|
23
|
+
asserts("process_master") { mock(GamespyQuery::SocketMaster).process_master("arma2oapc", "") { "Test data" }; topic.parse(["master", "process_master"]) }.nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "Parser" do
|
4
|
+
DEFAULT_DATA = [
|
5
|
+
"\x00\x04\x05\x06\asplitnum\x00\x00\x00gamever\x001.59.79548\x00hostname\x00-=WASP=- Warfare CO (Prime)\x00mapname\x00takistan\x00gametype\x00CTI\x00numplayers\x0046\x00numteams\x000\x00maxplayers\x0054\x00gamemode\x00openplaying\x00timelimit\x0015\x00password\x000\x00param1\x000\x00param2\x000\x00currentVersion\x00159\x00requiredVersion\x00159\x00mod\x00Arma 2;Arma 2: Operation Arrowhead;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite)\x00equalModRequired\x000\x00gameState\x007\x00dedicated\x001\x00platform\x00linux\x00language\x0065545\x00difficulty\x002\x00mission\x00[54] Warfare BE V2.069 - Takistan\x00gamename\x00arma2oapc\x00sv_battleye\x001\x00verifySignatures\x001\x00signatures\x00bi;WarFXPE;GLT_ADDONS;warFXsunlight;TGW_Zeroing;trsm_oa;soa110;SMK;jsrsfa;v2ECL;CBA_v0-7-3;ZEU_test;TRSM;TracersWAR;bi2;VopSound;cba_b158;acex_sm;WarFXLighting;gdtmod_plants2;TGW_Thermal;cba_b151;ASR;...\x00modhash\x00PMC v. 1.01;BAF v. 1.02;da39a3ee5e6b4b0d3255bfef95601890afd80709;\x00hash\x00f8c806b971abb935747da3900cab55599c0bc60c\x00\x00\x01player_\x00\x00Skilllos\x00Cool Hand\x00Viktor Reznov\x00Alchemist(HUN)\x00General Heinkel [GER]\x00Max\x00\xD0\x94\xD1\x80\xD0\xBE\xD0\xBD\xD0\xB3\xD0\xBE\x00letchik\x00Angerbode\x00TiDus\x00DrHat\x00Kermit\x00[UaS] snicka\x00Wedel\x00Dnalir [NOR]\x00Davor\x00Cateye(GER)\x00Bamse\x00Jorj\x00POMbI4\x00Daredevil\x00DrSMOKE\x00Vollpfosten\x00Maddin\x00-=[LRRP]=-Sentinel(NL)\x00Husky\x00Scumhawk\x00Bone-CH\x00Jarzah\x00I./KG40_Razor\x00Cpl.Bouiss\x00nAh\x00Tremor\x00Diamm\x00TUROCK_(FR-VODKA)\x00j.moss\x00FOKS\x00Phoenix\x00AfterShave\x00Coupe\x00Mitradis\x00Daniel\x00Flanker\x00Sig\x00_DPVf_hinkel\x00Random Sequence\x00\x00team_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ru\x00SO\x00\x00\x00\x00\x00\x00\x00\x00TF\x00\x00\x00\x00UTGPrivates\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00score_\x00\x00",
|
6
|
+
"\x00\x04\x05\x06\asplitnum\x00\x81\x01score_\x00\x00371\x00314\x00335\x0038\x00224\x0036\x0096\x0083\x0042\x00237\x0037\x00137\x00212\x0082\x0041\x0042\x0035\x0073\x0094\x0028\x00127\x0045\x00107\x0030\x00-2\x0083\x002\x0026\x0023\x0034\x0010\x0056\x0016\x006\x0036\x001\x000\x001\x000\x003\x000\x002\x001\x000\x0020\x000\x00\x00deaths_\x00\x0024\x0017\x0018\x0015\x0028\x0025\x0027\x0029\x007\x0010\x008\x0011\x008\x0011\x0016\x0015\x0016\x006\x0010\x0023\x0038\x003\x0017\x003\x002\x007\x002\x001\x004\x0014\x002\x004\x002\x000\x0019\x005\x001\x004\x004\x000\x003\x002\x000\x000\x008\x000\x00\x00\x00\x02\x00"
|
7
|
+
]
|
8
|
+
setup { GamespyQuery::Parser.new(DEFAULT_DATA) }
|
9
|
+
|
10
|
+
asserts("Packets assigned") { topic.packets }.same_elements DEFAULT_DATA
|
11
|
+
|
12
|
+
context "Parsed Output" do
|
13
|
+
setup { topic.parse }
|
14
|
+
|
15
|
+
context "Game Data" do
|
16
|
+
setup { topic[:game] }
|
17
|
+
denies("Game data") { topic }.empty
|
18
|
+
|
19
|
+
asserts("gamever") { topic["gamever"] }.equals "1.59.79548"
|
20
|
+
asserts("sv_battleye") { topic["sv_battleye"] }.equals "1"
|
21
|
+
end
|
22
|
+
|
23
|
+
context "Players data" do
|
24
|
+
setup { topic[:players] }
|
25
|
+
denies("Players data") { topic }.empty
|
26
|
+
|
27
|
+
denies("Names") { topic[:names] }.empty
|
28
|
+
denies("Teams") { topic[:teams] }.empty
|
29
|
+
denies("Scores") { topic[:scores] }.empty
|
30
|
+
denies("Deaths") { topic[:deaths] }.empty
|
31
|
+
|
32
|
+
context "First element" do
|
33
|
+
asserts("Name") { topic[:names][0] }.equals "Skilllos"
|
34
|
+
asserts("Team") { topic[:teams][0] }.equals ""
|
35
|
+
asserts("Score") { topic[:scores][0] }.equals 371
|
36
|
+
asserts("Deaths") { topic[:deaths][0] }.equals 24
|
37
|
+
end
|
38
|
+
|
39
|
+
context "Tenth element" do
|
40
|
+
asserts("Name") { topic[:names][10] }.equals "DrHat"
|
41
|
+
asserts("Team") { topic[:teams][10] }.equals ""
|
42
|
+
asserts("Score") { topic[:scores][10] }.equals 37
|
43
|
+
asserts("Deaths") { topic[:deaths][10] }.equals 8
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "SocketMaster" do
|
4
|
+
DEFAULT_ADDRS = [
|
5
|
+
"127.0.0.1:2302",
|
6
|
+
"127.0.0.1:2306"
|
7
|
+
]
|
8
|
+
setup { GamespyQuery::SocketMaster }
|
9
|
+
|
10
|
+
context "Instance" do
|
11
|
+
setup { topic.new DEFAULT_ADDRS }
|
12
|
+
asserts("Process") { topic.process! }.size 2
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
asserts("Process master") { topic.process_master }.is_a?(Array)
|
17
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "Socket" do
|
4
|
+
DEFAULT_DATA = [
|
5
|
+
"\x00\x04\x05\x06\asplitnum\x00\x00\x00gamever\x001.59.79548\x00hostname\x00-=WASP=- Warfare CO (Prime)\x00mapname\x00takistan\x00gametype\x00CTI\x00numplayers\x0046\x00numteams\x000\x00maxplayers\x0054\x00gamemode\x00openplaying\x00timelimit\x0015\x00password\x000\x00param1\x000\x00param2\x000\x00currentVersion\x00159\x00requiredVersion\x00159\x00mod\x00Arma 2;Arma 2: Operation Arrowhead;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite)\x00equalModRequired\x000\x00gameState\x007\x00dedicated\x001\x00platform\x00linux\x00language\x0065545\x00difficulty\x002\x00mission\x00[54] Warfare BE V2.069 - Takistan\x00gamename\x00arma2oapc\x00sv_battleye\x001\x00verifySignatures\x001\x00signatures\x00bi;WarFXPE;GLT_ADDONS;warFXsunlight;TGW_Zeroing;trsm_oa;soa110;SMK;jsrsfa;v2ECL;CBA_v0-7-3;ZEU_test;TRSM;TracersWAR;bi2;VopSound;cba_b158;acex_sm;WarFXLighting;gdtmod_plants2;TGW_Thermal;cba_b151;ASR;...\x00modhash\x00PMC v. 1.01;BAF v. 1.02;da39a3ee5e6b4b0d3255bfef95601890afd80709;\x00hash\x00f8c806b971abb935747da3900cab55599c0bc60c\x00\x00\x01player_\x00\x00Skilllos\x00Cool Hand\x00Viktor Reznov\x00Alchemist(HUN)\x00General Heinkel [GER]\x00Max\x00\xD0\x94\xD1\x80\xD0\xBE\xD0\xBD\xD0\xB3\xD0\xBE\x00letchik\x00Angerbode\x00TiDus\x00DrHat\x00Kermit\x00[UaS] snicka\x00Wedel\x00Dnalir [NOR]\x00Davor\x00Cateye(GER)\x00Bamse\x00Jorj\x00POMbI4\x00Daredevil\x00DrSMOKE\x00Vollpfosten\x00Maddin\x00-=[LRRP]=-Sentinel(NL)\x00Husky\x00Scumhawk\x00Bone-CH\x00Jarzah\x00I./KG40_Razor\x00Cpl.Bouiss\x00nAh\x00Tremor\x00Diamm\x00TUROCK_(FR-VODKA)\x00j.moss\x00FOKS\x00Phoenix\x00AfterShave\x00Coupe\x00Mitradis\x00Daniel\x00Flanker\x00Sig\x00_DPVf_hinkel\x00Random Sequence\x00\x00team_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ru\x00SO\x00\x00\x00\x00\x00\x00\x00\x00TF\x00\x00\x00\x00UTGPrivates\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00score_\x00\x00",
|
6
|
+
"\x00\x04\x05\x06\asplitnum\x00\x81\x01score_\x00\x00371\x00314\x00335\x0038\x00224\x0036\x0096\x0083\x0042\x00237\x0037\x00137\x00212\x0082\x0041\x0042\x0035\x0073\x0094\x0028\x00127\x0045\x00107\x0030\x00-2\x0083\x002\x0026\x0023\x0034\x0010\x0056\x0016\x006\x0036\x001\x000\x001\x000\x003\x000\x002\x001\x000\x0020\x000\x00\x00deaths_\x00\x0024\x0017\x0018\x0015\x0028\x0025\x0027\x0029\x007\x0010\x008\x0011\x008\x0011\x0016\x0015\x0016\x006\x0010\x0023\x0038\x003\x0017\x003\x002\x007\x002\x001\x004\x0014\x002\x004\x002\x000\x0019\x005\x001\x004\x004\x000\x003\x002\x000\x000\x008\x000\x00\x00\x00\x02\x00"
|
7
|
+
]
|
8
|
+
|
9
|
+
setup { GamespyQuery::Socket.new "127.0.0.1:2302" }
|
10
|
+
|
11
|
+
denies("Confirm valid") { topic.valid? }
|
12
|
+
|
13
|
+
asserts("handle_write") { topic.state = 0; topic.handle_write }.nil
|
14
|
+
asserts("handle_read") { topic.state = 1; topic.handle_read }.nil
|
15
|
+
asserts("handle_write") { topic.state = 2; topic.handle_write }.nil
|
16
|
+
asserts("handle_read") { topic.state = 3; topic.handle_read }.nil
|
17
|
+
asserts("handle_read") { topic.state = 4; topic.handle_read }.nil
|
18
|
+
asserts("Set state 5, confirm valid") { topic.state = 5; topic.valid? }
|
19
|
+
|
20
|
+
denies("handle_write") { topic.state = 1; topic.handle_write }
|
21
|
+
denies("handle_read") { topic.state = 0; topic.handle_read }
|
22
|
+
|
23
|
+
|
24
|
+
# TODO
|
25
|
+
#asserts("handle_exc") { topic.handle_exc }
|
26
|
+
|
27
|
+
asserts("handle_splitnum") { topic.handle_splitnum "" }
|
28
|
+
asserts("handle_challenge") { topic.handle_challenge "" }
|
29
|
+
asserts("handle_state (Write)") { topic.state = 0; topic.handle_state }
|
30
|
+
denies("handle_state (Read)") { topic.state = 1; topic.handle_state }
|
31
|
+
|
32
|
+
asserts("fetch") { topic.fetch }.nil
|
33
|
+
|
34
|
+
asserts("sync") { topic.sync }
|
35
|
+
|
36
|
+
context "Sync custom" do
|
37
|
+
setup { topic.sync(DEFAULT_DATA) }
|
38
|
+
asserts("Is a hash") { topic }.is_a?(Hash)
|
39
|
+
|
40
|
+
context "Players" do
|
41
|
+
setup { topic["players"] }
|
42
|
+
asserts("Players defined") { topic }.is_a?(Hash)
|
43
|
+
|
44
|
+
context "Player 0" do
|
45
|
+
setup { topic[0] }
|
46
|
+
|
47
|
+
asserts("name") { topic[:name] }.equals "-=[LRRP]=-Sentinel(NL)"
|
48
|
+
asserts("team") { topic[:team] }.equals ""
|
49
|
+
asserts("score") { topic[:score] }.equals -2
|
50
|
+
asserts("deaths") { topic[:deaths] }.equals 2
|
51
|
+
end
|
52
|
+
|
53
|
+
context "Player 10" do
|
54
|
+
setup { topic[10] }
|
55
|
+
|
56
|
+
asserts("name") { topic[:name] }.equals "Coupe"
|
57
|
+
asserts("team") { topic[:team] }.equals ""
|
58
|
+
asserts("score") { topic[:score] }.equals 3
|
59
|
+
asserts("deaths") { topic[:deaths] }.equals 0
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
asserts("Hostname defined") { topic["hostname"] }.is_a?(String)
|
64
|
+
asserts("Hostname") { topic["hostname"] }.equals "-=WASP=- Warfare CO (Prime)"
|
65
|
+
asserts("Modhash") { topic["modhash"] }.equals "PMC v. 1.01;BAF v. 1.02;da39a3ee5e6b4b0d3255bfef95601890afd80709;"
|
66
|
+
end
|
67
|
+
|
68
|
+
# TODO
|
69
|
+
context "MultiSocket" do
|
70
|
+
setup { GamespyQuery::MultiSocket }
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,54 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gamespy_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0pre
|
5
|
+
prerelease: 5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Patrick Roza
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-03-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cri
|
16
|
+
requirement: &7261020 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *7261020
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: riot
|
27
|
+
requirement: &7260060 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *7260060
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: yard
|
38
|
+
requirement: &7259340 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *7259340
|
14
47
|
description: ''
|
15
48
|
email:
|
16
49
|
- sb@dev-heaven.net
|
17
|
-
executables:
|
50
|
+
executables:
|
51
|
+
- gamespy_query
|
18
52
|
extensions: []
|
19
53
|
extra_rdoc_files: []
|
20
54
|
files:
|
@@ -22,14 +56,23 @@ files:
|
|
22
56
|
- Gemfile
|
23
57
|
- README.md
|
24
58
|
- Rakefile
|
59
|
+
- bin/gamespy_query
|
25
60
|
- gamespy_query.gemspec
|
26
61
|
- lib/gamespy_query.rb
|
27
62
|
- lib/gamespy_query/base.rb
|
28
63
|
- lib/gamespy_query/master.rb
|
64
|
+
- lib/gamespy_query/options.rb
|
29
65
|
- lib/gamespy_query/parser.rb
|
30
66
|
- lib/gamespy_query/socket.rb
|
31
67
|
- lib/gamespy_query/socket_master.rb
|
32
68
|
- lib/gamespy_query/version.rb
|
69
|
+
- test/teststrap.rb
|
70
|
+
- test/units/base_test.rb
|
71
|
+
- test/units/master_test.rb
|
72
|
+
- test/units/options_test.rb
|
73
|
+
- test/units/parser_test.rb
|
74
|
+
- test/units/socket_master_test.rb
|
75
|
+
- test/units/socket_test.rb
|
33
76
|
homepage: http://dev-heaven.net
|
34
77
|
licenses: []
|
35
78
|
post_install_message:
|
@@ -45,9 +88,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
45
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
89
|
none: false
|
47
90
|
requirements:
|
48
|
-
- - ! '
|
91
|
+
- - ! '>'
|
49
92
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
93
|
+
version: 1.3.1
|
51
94
|
requirements: []
|
52
95
|
rubyforge_project: gamespy_query
|
53
96
|
rubygems_version: 1.8.15
|
@@ -55,3 +98,4 @@ signing_key:
|
|
55
98
|
specification_version: 3
|
56
99
|
summary: Ruby library for accessing Gamespy services
|
57
100
|
test_files: []
|
101
|
+
has_rdoc:
|