steam_codec 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eee4dc9e00766d0a54f476547502bcb1f3dcba75
4
- data.tar.gz: 77f03fedd878d4b1b7a221d327bc56dd2b9e4076
3
+ metadata.gz: 93fd1b633432abfc06e6bb11aec0df481b4e366e
4
+ data.tar.gz: 89a9ca4cb5975b3abcbf0c6e818f61cf333bdbfe
5
5
  SHA512:
6
- metadata.gz: d53efad14a7f667a56139fa2129b998b33cef15edfe600c6a52b219ef5952490c4250033a95f5f59927fd44c0434a5f45648e6039b136b3d5fa41414bed99e3d
7
- data.tar.gz: 63589876c263ac878e4a1b1c8ece6193e39e14bfb675ec1181461af9bcef5ad585e2ef8cf785dcf291d3b83da953dc23b459ce32aab7d773823d3fa2a70c30fb
6
+ metadata.gz: b28226526d56a91911f058ed1be3a397825851cf41cef6700f212891dd2fa033896d6c8a52eeb84d910dcfff83a62995e345317528ca7b7e5edfb4e295c5cbb3
7
+ data.tar.gz: fb81d45dc2484c102e704024fad68014aed5115ada853d8fb9da4c632657c9e82431e0ff87db9c3d59bb615e2c3a2c9d4347fbf10623e25dff5992851d1230ce
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  group :development, :test do
data/README.md CHANGED
@@ -62,6 +62,7 @@ code coverage will also be generated
62
62
  [![Build Status](https://travis-ci.org/davispuh/SteamCodec.png?branch=master)](https://travis-ci.org/davispuh/SteamCodec)
63
63
  [![Dependency Status](https://gemnasium.com/davispuh/SteamCodec.png)](https://gemnasium.com/davispuh/SteamCodec)
64
64
  [![Coverage Status](https://coveralls.io/repos/davispuh/SteamCodec/badge.png)](https://coveralls.io/r/davispuh/SteamCodec)
65
+ [![Code Climate](https://codeclimate.com/github/davispuh/SteamCodec.png)](https://codeclimate.com/github/davispuh/SteamCodec)
65
66
 
66
67
  ## Unlicense
67
68
 
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  require "bundler/gem_tasks"
2
3
  require 'rspec/core/rake_task'
3
4
  require 'yard'
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  require "steam_codec/version"
2
3
  require "steam_codec/key_values"
3
4
  require "steam_codec/value_array"
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module SteamCodec
2
3
  class ACF
3
4
 
@@ -82,7 +83,7 @@ module SteamCodec
82
83
  @UserConfig = userConfig
83
84
  @Name = @UserConfig.name if @UserConfig.key?(:name)
84
85
  @GameID = @UserConfig.gameid.to_i if @UserConfig.key?(:gameid)
85
- @Installed = !@UserConfig.installdir.to_i.zero? if @UserConfig.key?(:installdir)
86
+ @Installed = !@UserConfig.installed.to_i.zero? if @UserConfig.key?(:installed)
86
87
  @AppInstallDir = @UserConfig.appinstalldir if @UserConfig.key?(:appinstalldir)
87
88
  @Language = @UserConfig.language if @UserConfig.key?(:language)
88
89
  @BetaKey = @UserConfig.BetaKey if @UserConfig.key?(:BetaKey)
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  require 'json'
2
3
  require 'insensitive_hash/minimal'
3
4
 
@@ -103,6 +104,31 @@ module SteamCodec
103
104
  self.loadFromJSON(json)
104
105
  end
105
106
 
107
+ def get(path = '')
108
+ fields = path.gsub(/^\/|\/$/, '').split('/')
109
+ current = self
110
+ fields.each do |name|
111
+ return nil if not current.key?(name)
112
+ current = current[name]
113
+ end
114
+ current
115
+ end
116
+
117
+ def asArray(name, seperator = '_')
118
+ data = []
119
+ counter = 0
120
+ cname = name+seperator+counter.to_s
121
+ data << self[cname] if key?(cname)
122
+ counter += 1
123
+ cname = name+seperator+counter.to_s
124
+ while key?(cname) do
125
+ data << self[cname]
126
+ counter += 1
127
+ cname = name+seperator+counter.to_s
128
+ end
129
+ data
130
+ end
131
+
106
132
  def method_missing(name, *args, &block) # :nodoc:
107
133
  return self[name] if args.empty? and block.nil? and key?(name)
108
134
  super
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module SteamCodec
2
3
  class ValueArray
3
4
  def initialize(valueHash = {})
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module SteamCodec
2
3
  class VDF < KeyValues
3
4
  # About VDF => http://wiki.teamfortress.com/wiki/WebAPI/VDF
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module SteamCodec
2
- VERSION = "0.0.2"
3
+ VERSION = '0.0.3'
3
4
  end
@@ -1,137 +1,138 @@
1
- require 'spec_helper'
2
-
3
- describe SteamCodec::ACF do
4
-
5
- let(:appCacheFile) { <<-EOS
6
- "AppState"
7
- {
8
- "appid" "207930"
9
- "Universe" "1"
10
- "StateFlags" "4"
11
- "installdir" "sacred_citadel"
12
- "LastUpdated" "1377100000"
13
- "UpdateResult" "0"
14
- "SizeOnDisk" "1193761500"
15
- "buildid" "60250"
16
- "LastOwner" "0"
17
- "BytesToDownload" "0"
18
- "BytesDownloaded" "0"
19
- "FullValidateOnNextUpdate" "1"
20
- "UserConfig"
21
- {
22
- "name" "Sacred Citadel"
23
- "gameid" "207930"
24
- "installed" "1"
25
- "appinstalldir" "C:\\Steam\\steamapps\\common\\sacred_citadel"
26
- "language" "english"
27
- "BetaKey" "public"
28
- }
29
- "MountedDepots"
30
- {
31
- "228982" "6039653574073929574"
32
- "228983" "4721092052804263356"
33
- }
34
- "SharedDepots"
35
- {
36
- "228984" "228980"
37
- }
38
- "checkguid"
39
- {
40
- "0" "Bin\\some.exe"
41
- "1" "Bin\\another.exe"
42
- }
43
- "InstallScripts"
44
- {
45
- "0" "_CommonRedist\\vcredist\\2008\\installscript.vdf"
46
- "1" "_CommonRedist\\vcredist\\2010\\installscript.vdf"
47
- }
48
- }
49
- EOS
50
- }
51
-
52
- describe '.loadFromFile' do
53
- it 'should successfully load from file' do
54
- StringIO.open(appCacheFile) do |file|
55
- SteamCodec::ACF::loadFromFile(file).should be_an_instance_of SteamCodec::ACF
56
- end
57
- end
58
- end
59
-
60
- describe '.load' do
61
- it 'should successfully load' do
62
- SteamCodec::ACF::load(appCacheFile).should be_an_instance_of SteamCodec::ACF
63
- end
64
- end
65
-
66
- describe '.new' do
67
- it 'should initialize new instance with empty fields' do
68
- SteamCodec::ACF.new.AppID.should be_nil
69
- end
70
- end
71
-
72
- describe '#InstallDir' do
73
- it 'should return value' do
74
- SteamCodec::ACF::load(appCacheFile).InstallDir.should eq("sacred_citadel")
75
- end
76
- end
77
-
78
- describe SteamCodec::ACF::UserConfig do
79
- describe '.new' do
80
- it 'should initialize new instance with empty fields' do
81
- SteamCodec::ACF::UserConfig.new.Name.should be_nil
82
- end
83
-
84
- it 'should initialize new instance with provided fields' do
85
- SteamCodec::ACF::UserConfig.new(SteamCodec::KeyValues[{"Name" => "Game"}]).Name.should eq("Game")
86
- end
87
- end
88
- end
89
-
90
- describe SteamCodec::ACF::MountedDepots do
91
- let(:depots) { {"228982" => "6039653574073929574"} }
92
- describe '.new' do
93
- it 'should initialize new instance with empty fields' do
94
- SteamCodec::ACF::MountedDepots.new.depots.should eq([])
95
- SteamCodec::ACF::MountedDepots.new.manifests.should eq([])
96
- end
97
-
98
- it 'should initialize new instance with provided fields' do
99
- SteamCodec::ACF::MountedDepots.new(depots).depots.should eq([228982])
100
- SteamCodec::ACF::MountedDepots.new(depots).manifests.should eq(["6039653574073929574"])
101
- end
102
- end
103
-
104
- describe '#getManifest' do
105
- it 'should return manifest' do
106
- SteamCodec::ACF::MountedDepots.new(depots).getManifest(228982).should eq("6039653574073929574")
107
- end
108
- end
109
-
110
- describe '#getDepot' do
111
- it 'should return depot' do
112
- SteamCodec::ACF::MountedDepots.new(depots).getDepot("6039653574073929574").should eq(228982)
113
- end
114
- end
115
- end
116
-
117
- describe SteamCodec::ACF::SharedDepots do
118
- let(:depots) { {"228984" => "228980"} }
119
- describe '.new' do
120
- it 'should initialize new instance with empty fields' do
121
- SteamCodec::ACF::SharedDepots.new.depots.should eq([])
122
- end
123
-
124
- it 'should initialize new instance with provided fields' do
125
- SteamCodec::ACF::SharedDepots.new(depots).depots.should eq([228984])
126
- SteamCodec::ACF::SharedDepots.new(depots).getDepot(228984).should eq(228980)
127
- end
128
- end
129
-
130
- describe '#getDepot' do
131
- it 'should return depot' do
132
- SteamCodec::ACF::SharedDepots.new(depots).getDepot(228984).should eq(228980)
133
- end
134
- end
135
- end
136
-
137
- end
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe SteamCodec::ACF do
5
+
6
+ let(:appCacheFile) { <<-EOS
7
+ "AppState"
8
+ {
9
+ "appid" "207930"
10
+ "Universe" "1"
11
+ "StateFlags" "4"
12
+ "installdir" "sacred_citadel"
13
+ "LastUpdated" "1377100000"
14
+ "UpdateResult" "0"
15
+ "SizeOnDisk" "1193761500"
16
+ "buildid" "60250"
17
+ "LastOwner" "0"
18
+ "BytesToDownload" "0"
19
+ "BytesDownloaded" "0"
20
+ "FullValidateOnNextUpdate" "1"
21
+ "UserConfig"
22
+ {
23
+ "name" "Sacred Citadel"
24
+ "gameid" "207930"
25
+ "installed" "1"
26
+ "appinstalldir" "C:\\Steam\\steamapps\\common\\sacred_citadel"
27
+ "language" "english"
28
+ "BetaKey" "public"
29
+ }
30
+ "MountedDepots"
31
+ {
32
+ "228982" "6039653574073929574"
33
+ "228983" "4721092052804263356"
34
+ }
35
+ "SharedDepots"
36
+ {
37
+ "228984" "228980"
38
+ }
39
+ "checkguid"
40
+ {
41
+ "0" "Bin\\some.exe"
42
+ "1" "Bin\\another.exe"
43
+ }
44
+ "InstallScripts"
45
+ {
46
+ "0" "_CommonRedist\\vcredist\\2008\\installscript.vdf"
47
+ "1" "_CommonRedist\\vcredist\\2010\\installscript.vdf"
48
+ }
49
+ }
50
+ EOS
51
+ }
52
+
53
+ describe '.loadFromFile' do
54
+ it 'should successfully load from file' do
55
+ StringIO.open(appCacheFile) do |file|
56
+ SteamCodec::ACF::loadFromFile(file).should be_an_instance_of SteamCodec::ACF
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '.load' do
62
+ it 'should successfully load' do
63
+ SteamCodec::ACF::load(appCacheFile).should be_an_instance_of SteamCodec::ACF
64
+ end
65
+ end
66
+
67
+ describe '.new' do
68
+ it 'should initialize new instance with empty fields' do
69
+ SteamCodec::ACF.new.AppID.should be_nil
70
+ end
71
+ end
72
+
73
+ describe '#InstallDir' do
74
+ it 'should return value' do
75
+ SteamCodec::ACF::load(appCacheFile).InstallDir.should eq("sacred_citadel")
76
+ end
77
+ end
78
+
79
+ describe SteamCodec::ACF::UserConfig do
80
+ describe '.new' do
81
+ it 'should initialize new instance with empty fields' do
82
+ SteamCodec::ACF::UserConfig.new.Name.should be_nil
83
+ end
84
+
85
+ it 'should initialize new instance with provided fields' do
86
+ SteamCodec::ACF::UserConfig.new(SteamCodec::KeyValues[{"Name" => "Game"}]).Name.should eq("Game")
87
+ end
88
+ end
89
+ end
90
+
91
+ describe SteamCodec::ACF::MountedDepots do
92
+ let(:depots) { {"228982" => "6039653574073929574"} }
93
+ describe '.new' do
94
+ it 'should initialize new instance with empty fields' do
95
+ SteamCodec::ACF::MountedDepots.new.depots.should eq([])
96
+ SteamCodec::ACF::MountedDepots.new.manifests.should eq([])
97
+ end
98
+
99
+ it 'should initialize new instance with provided fields' do
100
+ SteamCodec::ACF::MountedDepots.new(depots).depots.should eq([228982])
101
+ SteamCodec::ACF::MountedDepots.new(depots).manifests.should eq(["6039653574073929574"])
102
+ end
103
+ end
104
+
105
+ describe '#getManifest' do
106
+ it 'should return manifest' do
107
+ SteamCodec::ACF::MountedDepots.new(depots).getManifest(228982).should eq("6039653574073929574")
108
+ end
109
+ end
110
+
111
+ describe '#getDepot' do
112
+ it 'should return depot' do
113
+ SteamCodec::ACF::MountedDepots.new(depots).getDepot("6039653574073929574").should eq(228982)
114
+ end
115
+ end
116
+ end
117
+
118
+ describe SteamCodec::ACF::SharedDepots do
119
+ let(:depots) { {"228984" => "228980"} }
120
+ describe '.new' do
121
+ it 'should initialize new instance with empty fields' do
122
+ SteamCodec::ACF::SharedDepots.new.depots.should eq([])
123
+ end
124
+
125
+ it 'should initialize new instance with provided fields' do
126
+ SteamCodec::ACF::SharedDepots.new(depots).depots.should eq([228984])
127
+ SteamCodec::ACF::SharedDepots.new(depots).getDepot(228984).should eq(228980)
128
+ end
129
+ end
130
+
131
+ describe '#getDepot' do
132
+ it 'should return depot' do
133
+ SteamCodec::ACF::SharedDepots.new(depots).getDepot(228984).should eq(228980)
134
+ end
135
+ end
136
+ end
137
+
138
+ end
@@ -1,179 +1,216 @@
1
- require 'spec_helper'
2
-
3
- describe SteamCodec::KeyValues do
4
-
5
- let(:tokenKey) { 'TokenKey123' }
6
- let(:tokenValue) { 'Token+Value4567' }
7
- let(:tokenKeyQuoted) { "\"#{tokenKey}\"" }
8
- let(:tokenValueQuoted) { "\"#{tokenValue}\"" }
9
-
10
- let(:jsonSample1a) { "#{tokenKeyQuoted} #{tokenValueQuoted}" }
11
- let(:jsonSample1b) { "#{tokenKeyQuoted}\n{\t#{tokenKeyQuoted}\t#{tokenValueQuoted}\n}" }
12
-
13
- let(:jsonSample2a) { "#{tokenKeyQuoted} #{tokenValueQuoted}\n#{tokenKeyQuoted}\t#{tokenValueQuoted}" }
14
- let(:jsonSample2b) { "#{tokenKeyQuoted}\t{}\n#{tokenKeyQuoted} #{tokenValueQuoted}" }
15
-
16
- let(:jsonSample3a) { '"Ke\\ty\\\\is" "Val\\nue\\\\\\""' }
17
- let(:jsonSample3b) { '"Ke\\\\ty\\is\\\\" "te\\\\s\\\\n\\\\v\\"\\\\"' }
18
-
19
- let(:jsonSample4a) { "#{tokenKey} #{tokenValue}" }
20
- let(:jsonSample4b) { "#{tokenKey}\n{\t#{tokenKey}\t#{tokenValue}\n}" }
21
-
22
- let(:jsonSample5a) { 'abc "lol this {weird string}"' }
23
- let(:jsonSample5b) { "\"\\\"really weird\\\"\n{\n\\\"string\\\" \\\"this is\\\"\n}\"\n{\n\"string\" \"this is\"\n}" }
24
-
25
- let(:jsonSample6a) { "#{tokenKeyQuoted}\\\\this should be ignored\n{\t#{tokenKeyQuoted}\t#{tokenValueQuoted}\n}" }
26
-
27
- let(:jsonSample7a) { "#base <blah.vdf>\n#{tokenKey}\n{\t#{tokenKey}\t#{tokenValue}\n}" }
28
- let(:jsonSample7b) { "#include <blah.vdf>\n#{tokenKey}\n{\t#{tokenKey}\t#{tokenValue}\n}" }
29
-
30
- let(:keyValueData) { <<-EOS
31
- "AppState"
32
- {
33
- "appid" "320"
34
- "Universe" "1"
35
- }
36
- EOS
37
- }
38
-
39
- describe SteamCodec::KeyValues::Parser do
40
-
41
- describe '.isEscaped' do
42
- it 'empty string should not be escaped' do
43
- SteamCodec::KeyValues::Parser::isEscaped('', 0).should be_false
44
- end
45
-
46
- it 'should be escaped' do
47
- SteamCodec::KeyValues::Parser::isEscaped('\\"', 1).should be_true
48
- SteamCodec::KeyValues::Parser::isEscaped('\\\\\\"', 3).should be_true
49
- SteamCodec::KeyValues::Parser::isEscaped('trol\\lol\\lol\\"trrr', 13).should be_true
50
- end
51
-
52
- it 'should not be escaped' do
53
- SteamCodec::KeyValues::Parser::isEscaped('\\\\"', 2).should be_false
54
- SteamCodec::KeyValues::Parser::isEscaped('\\\\\\\\"', 4).should be_false
55
- SteamCodec::KeyValues::Parser::isEscaped('trol\\lol\\lol\\\\"trrr', 14).should be_false
56
- end
57
-
58
- end
59
-
60
- describe '.toJSON' do
61
- it 'should convert correctly empty data' do
62
- SteamCodec::KeyValues::Parser::toJSON('').should eq('{}')
63
- end
64
-
65
- it 'should raise exception on invalid data' do
66
- expect { SteamCodec::KeyValues::Parser::toJSON(nil) }.to raise_error(ArgumentError)
67
- expect { SteamCodec::KeyValues::Parser::toJSON({}) }.to raise_error(ArgumentError)
68
- end
69
-
70
- it 'should add colon after tokens' do
71
- SteamCodec::KeyValues::Parser::toJSON(jsonSample1a).should eq("{#{tokenKeyQuoted}: #{tokenValueQuoted}}")
72
- SteamCodec::KeyValues::Parser::toJSON(jsonSample1b).should eq("{#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
73
- end
74
-
75
- it 'should add comma after entries' do
76
- SteamCodec::KeyValues::Parser::toJSON(jsonSample2a).should eq("{#{tokenKeyQuoted}: #{tokenValueQuoted},\n#{tokenKeyQuoted}:\t#{tokenValueQuoted}}")
77
- SteamCodec::KeyValues::Parser::toJSON(jsonSample2b).should eq("{#{tokenKeyQuoted}:\t{},\n#{tokenKeyQuoted}: #{tokenValueQuoted}}")
78
- end
79
-
80
- it 'should regard slashes' do
81
- SteamCodec::KeyValues::Parser::toJSON(jsonSample3a).should eq('{"Ke\\ty\\\\is": "Val\\nue\\\\\\""}')
82
- SteamCodec::KeyValues::Parser::toJSON(jsonSample3b).should eq('{"Ke\\\\ty\\is\\\\": "te\\\\s\\\\n\\\\v\\"\\\\"}')
83
- end
84
-
85
- it 'should parse keys and values without quotes' do
86
- SteamCodec::KeyValues::Parser::toJSON(jsonSample4a).should eq("{#{tokenKeyQuoted}: #{tokenValueQuoted}}")
87
- SteamCodec::KeyValues::Parser::toJSON(jsonSample4b).should eq("{#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
88
- end
89
-
90
- it 'should parse special cases' do
91
- SteamCodec::KeyValues::Parser::toJSON(jsonSample5a).should eq("{\"abc\": \"lol this {weird string}\"}")
92
- SteamCodec::KeyValues::Parser::toJSON(jsonSample5b).should eq("{\"\\\"really weird\\\"\\n{\\n\\\"string\\\" \\\"this is\\\"\\n}\":\n{\n\"string\": \"this is\"\n}}")
93
- end
94
-
95
- it 'should ignore comments' do
96
- SteamCodec::KeyValues::Parser::toJSON(jsonSample6a).should eq("{#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
97
- end
98
-
99
- it 'should ignore #include and #base' do
100
- SteamCodec::KeyValues::Parser::toJSON(jsonSample7a).should eq("{\n#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
101
- SteamCodec::KeyValues::Parser::toJSON(jsonSample7b).should eq("{\n#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe SteamCodec::KeyValues do
5
+
6
+ let(:tokenKey) { 'ToknKey123' }
7
+ let(:tokenValue) { 'Tokén+Value4567' }
8
+ let(:tokenKeyQuoted) { "\"#{tokenKey}\"" }
9
+ let(:tokenValueQuoted) { "\"#{tokenValue}\"" }
10
+
11
+ let(:jsonSample1a) { "#{tokenKeyQuoted} #{tokenValueQuoted}" }
12
+ let(:jsonSample1b) { "#{tokenKeyQuoted}\n{\t#{tokenKeyQuoted}\t#{tokenValueQuoted}\n}" }
13
+
14
+ let(:jsonSample2a) { "#{tokenKeyQuoted} #{tokenValueQuoted}\n#{tokenKeyQuoted}\t#{tokenValueQuoted}" }
15
+ let(:jsonSample2b) { "#{tokenKeyQuoted}\t{}\n#{tokenKeyQuoted} #{tokenValueQuoted}" }
16
+
17
+ let(:jsonSample3a) { '"Ke\\ty\\\\is" "Val\\nue\\\\\\""' }
18
+ let(:jsonSample3b) { '"Ke\\\\ty\\is\\\\" "te\\\\s\\\\n\\\\v\\"\\\\"' }
19
+
20
+ let(:jsonSample4a) { "#{tokenKey} #{tokenValue}" }
21
+ let(:jsonSample4b) { "#{tokenKey}\n{\t#{tokenKey}\t#{tokenValue}\n}" }
22
+
23
+ let(:jsonSample5a) { 'abc "lol this {weird string}"' }
24
+ let(:jsonSample5b) { "\"\\\"really weird\\\"\n{\n\\\"string\\\" \\\"this is\\\"\n}\"\n{\n\"string\" \"this is\"\n}" }
25
+
26
+ let(:jsonSample6a) { "#{tokenKeyQuoted}\\\\this should be ignored\n{\t#{tokenKeyQuoted}\t#{tokenValueQuoted}\n}" }
27
+
28
+ let(:jsonSample7a) { "#base <blah.vdf>\n#{tokenKey}\n{\t#{tokenKey}\t#{tokenValue}\n}" }
29
+ let(:jsonSample7b) { "#include <blah.vdf>\n#{tokenKey}\n{\t#{tokenKey}\t#{tokenValue}\n}" }
30
+
31
+ let(:keyValueData) { <<-EOS
32
+ "AppState"
33
+ {
34
+ "appid" "320"
35
+ "Universe" "1"
36
+ "SomeArrayValue_1" "4"
37
+ "SomeArrayValue_2" "3"
38
+ "SomeArrayValue_3" "2"
39
+ "UserConfig"
40
+ {
41
+ "name" "Brütal Legend"
42
+ }
43
+ }
44
+ EOS
45
+ }
46
+
47
+ let(:keyValueResult) {
48
+ { 'appid' => '320', 'Universe' => '1', 'SomeArrayValue_1' => '4', 'SomeArrayValue_2' => '3', 'SomeArrayValue_3' => '2', 'UserConfig' => {'name' => 'Brütal Legend'} }
49
+ }
50
+
51
+ describe SteamCodec::KeyValues::Parser do
52
+
53
+ describe '.isEscaped' do
54
+ it 'empty string should not be escaped' do
55
+ SteamCodec::KeyValues::Parser::isEscaped('', 0).should be_false
102
56
  end
103
- end
104
- end
105
-
106
- describe '.loadFromJSON' do
107
- it 'should return nil for invalid json' do
108
- SteamCodec::KeyValues::loadFromJSON('invalid :P').should be_nil
109
- end
110
- end
111
-
112
- describe '.load' do
113
- it 'should load correctly empty data' do
114
- SteamCodec::KeyValues::load('').should eq({})
115
- end
116
-
117
- it 'should raise exception on invalid data' do
118
- expect { SteamCodec::KeyValues::load(nil) }.to raise_error(ArgumentError)
119
- expect { SteamCodec::KeyValues::load({}) }.to raise_error(ArgumentError)
120
- end
121
-
122
- it 'should load correctly various representations' do
123
- SteamCodec::KeyValues::load(jsonSample1a).should eq({ tokenKey => tokenValue })
124
- SteamCodec::KeyValues::load(jsonSample1b).should eq({ tokenKey => { tokenKey => tokenValue } })
125
- SteamCodec::KeyValues::load(jsonSample2a).should eq({ tokenKey => tokenValue })
126
- SteamCodec::KeyValues::load(jsonSample2b).should eq({ tokenKey => tokenValue })
127
- SteamCodec::KeyValues::load(jsonSample3a).should eq({"Ke\ty\\is" => "Val\nue\\\""})
128
- SteamCodec::KeyValues::load(jsonSample3b).should eq({'Ke\\tyis\\' => "te\\s\\n\\v\"\\"})
129
- SteamCodec::KeyValues::load(jsonSample4a).should eq({ tokenKey => tokenValue })
130
- SteamCodec::KeyValues::load(jsonSample4b).should eq({ tokenKey => { tokenKey => tokenValue } })
131
- SteamCodec::KeyValues::load(jsonSample5a).should eq({"abc" => "lol this {weird string}"})
132
- SteamCodec::KeyValues::load(jsonSample5b).should eq({"\"really weird\"\n{\n\"string\" \"this is\"\n}" => {"string" => "this is"}})
133
- SteamCodec::KeyValues::load(jsonSample6a).should eq({ tokenKey => { tokenKey => tokenValue } })
134
- SteamCodec::KeyValues::load(jsonSample7a).should eq({ tokenKey => { tokenKey => tokenValue } })
135
- SteamCodec::KeyValues::load(jsonSample7b).should eq({ tokenKey => { tokenKey => tokenValue } })
136
- end
137
- end
138
-
139
- describe '.loadFromFile' do
140
- it 'should raise exception if not file' do
141
- expect { SteamCodec::KeyValues::loadFromFile("blah") }.to raise_error(ArgumentError)
142
- end
143
-
144
- it 'should succesfully load from file' do
145
- StringIO.open(keyValueData) do |file|
146
- SteamCodec::KeyValues::loadFromFile(file).should eq({ "AppState" => { "appid" => "320", "Universe" => "1" } })
147
- end
148
- end
149
-
150
- it 'should be KeyValues instance' do
151
- StringIO.open(keyValueData) do |file|
152
- SteamCodec::KeyValues::loadFromFile(file).should be_an_instance_of SteamCodec::KeyValues
153
- end
154
- end
155
- end
156
-
157
- describe 'access any field' do
158
- let(:keyValues) { SteamCodec::KeyValues::load(keyValueData) }
159
- it 'should be able to access AppState' do
160
- keyValues.AppState.should eq({ "appid" => "320", "Universe" => "1" })
161
- end
162
-
163
- it 'should be able to read AppID' do
164
- keyValues.AppState.AppID.should eq("320")
165
- end
166
-
167
- it 'should check if field exists' do
168
- keyValues.AppState.has_key?(:AppID).should be_true
169
- keyValues.AppState.has_key?(:UserConfig).should be_false
170
- keyValues.respond_to?(:appstate).should be_true
171
- keyValues.respond_to?(:nope).should be_false
172
- end
173
-
174
- it 'should raise exception for non-existent field' do
175
- expect { keyValues.AppState.UserConfig }.to raise_error(NoMethodError)
176
- end
177
- end
178
-
179
- end
57
+
58
+ it 'should be escaped' do
59
+ SteamCodec::KeyValues::Parser::isEscaped('\\"', 1).should be_true
60
+ SteamCodec::KeyValues::Parser::isEscaped('\\\\\\"', 3).should be_true
61
+ SteamCodec::KeyValues::Parser::isEscaped('trol\\lol\\lol\\"trrr', 13).should be_true
62
+ end
63
+
64
+ it 'should not be escaped' do
65
+ SteamCodec::KeyValues::Parser::isEscaped('\\\\"', 2).should be_false
66
+ SteamCodec::KeyValues::Parser::isEscaped('\\\\\\\\"', 4).should be_false
67
+ SteamCodec::KeyValues::Parser::isEscaped('trol\\lol\\lol\\\\"trrr', 14).should be_false
68
+ end
69
+
70
+ end
71
+
72
+ describe '.toJSON' do
73
+ it 'should convert correctly empty data' do
74
+ SteamCodec::KeyValues::Parser::toJSON('').should eq('{}')
75
+ end
76
+
77
+ it 'should raise exception on invalid data' do
78
+ expect { SteamCodec::KeyValues::Parser::toJSON(nil) }.to raise_error(ArgumentError)
79
+ expect { SteamCodec::KeyValues::Parser::toJSON({}) }.to raise_error(ArgumentError)
80
+ end
81
+
82
+ it 'should add colon after tokens' do
83
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample1a).should eq("{#{tokenKeyQuoted}: #{tokenValueQuoted}}")
84
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample1b).should eq("{#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
85
+ end
86
+
87
+ it 'should add comma after entries' do
88
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample2a).should eq("{#{tokenKeyQuoted}: #{tokenValueQuoted},\n#{tokenKeyQuoted}:\t#{tokenValueQuoted}}")
89
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample2b).should eq("{#{tokenKeyQuoted}:\t{},\n#{tokenKeyQuoted}: #{tokenValueQuoted}}")
90
+ end
91
+
92
+ it 'should regard slashes' do
93
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample3a).should eq('{"Ke\\ty\\\\is": "Val\\nue\\\\\\""}')
94
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample3b).should eq('{"Ke\\\\ty\\is\\\\": "te\\\\s\\\\n\\\\v\\"\\\\"}')
95
+ end
96
+
97
+ it 'should parse keys and values without quotes' do
98
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample4a).should eq("{#{tokenKeyQuoted}: #{tokenValueQuoted}}")
99
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample4b).should eq("{#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
100
+ end
101
+
102
+ it 'should parse special cases' do
103
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample5a).should eq("{\"abc\": \"lol this {weird string}\"}")
104
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample5b).should eq("{\"\\\"really weird\\\"\\n{\\n\\\"string\\\" \\\"this is\\\"\\n}\":\n{\n\"string\": \"this is\"\n}}")
105
+ end
106
+
107
+ it 'should ignore comments' do
108
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample6a).should eq("{#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
109
+ end
110
+
111
+ it 'should ignore #include and #base' do
112
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample7a).should eq("{\n#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
113
+ SteamCodec::KeyValues::Parser::toJSON(jsonSample7b).should eq("{\n#{tokenKeyQuoted}:\n{\t#{tokenKeyQuoted}:\t#{tokenValueQuoted}\n}}")
114
+ end
115
+ end
116
+ end
117
+
118
+ describe '.loadFromJSON' do
119
+ it 'should return nil for invalid json' do
120
+ SteamCodec::KeyValues::loadFromJSON('invalid :P').should be_nil
121
+ end
122
+ end
123
+
124
+ describe '.load' do
125
+ it 'should load correctly empty data' do
126
+ SteamCodec::KeyValues::load('').should eq({})
127
+ end
128
+
129
+ it 'should raise exception on invalid data' do
130
+ expect { SteamCodec::KeyValues::load(nil) }.to raise_error(ArgumentError)
131
+ expect { SteamCodec::KeyValues::load({}) }.to raise_error(ArgumentError)
132
+ end
133
+
134
+ it 'should load correctly various representations' do
135
+ SteamCodec::KeyValues::load(jsonSample1a).should eq({ tokenKey => tokenValue })
136
+ SteamCodec::KeyValues::load(jsonSample1b).should eq({ tokenKey => { tokenKey => tokenValue } })
137
+ SteamCodec::KeyValues::load(jsonSample2a).should eq({ tokenKey => tokenValue })
138
+ SteamCodec::KeyValues::load(jsonSample2b).should eq({ tokenKey => tokenValue })
139
+ SteamCodec::KeyValues::load(jsonSample3a).should eq({"Ke\ty\\is" => "Val\nue\\\""})
140
+ SteamCodec::KeyValues::load(jsonSample3b).should eq({'Ke\\tyis\\' => "te\\s\\n\\v\"\\"})
141
+ SteamCodec::KeyValues::load(jsonSample4a).should eq({ tokenKey => tokenValue })
142
+ SteamCodec::KeyValues::load(jsonSample4b).should eq({ tokenKey => { tokenKey => tokenValue } })
143
+ SteamCodec::KeyValues::load(jsonSample5a).should eq({"abc" => "lol this {weird string}"})
144
+ SteamCodec::KeyValues::load(jsonSample5b).should eq({"\"really weird\"\n{\n\"string\" \"this is\"\n}" => {"string" => "this is"}})
145
+ SteamCodec::KeyValues::load(jsonSample6a).should eq({ tokenKey => { tokenKey => tokenValue } })
146
+ SteamCodec::KeyValues::load(jsonSample7a).should eq({ tokenKey => { tokenKey => tokenValue } })
147
+ SteamCodec::KeyValues::load(jsonSample7b).should eq({ tokenKey => { tokenKey => tokenValue } })
148
+ end
149
+ end
150
+
151
+ describe '.loadFromFile' do
152
+ it 'should raise exception if not file' do
153
+ expect { SteamCodec::KeyValues::loadFromFile("blah") }.to raise_error(ArgumentError)
154
+ end
155
+
156
+ it 'should succesfully load from file' do
157
+ StringIO.open(keyValueData) do |file|
158
+ SteamCodec::KeyValues::loadFromFile(file).should eq({ "AppState" => keyValueResult })
159
+ end
160
+ end
161
+
162
+ it 'should be KeyValues instance' do
163
+ StringIO.open(keyValueData) do |file|
164
+ SteamCodec::KeyValues::loadFromFile(file).should be_an_instance_of SteamCodec::KeyValues
165
+ end
166
+ end
167
+ end
168
+
169
+ describe '#get' do
170
+ let(:keyValues) { SteamCodec::KeyValues::load(keyValueData) }
171
+
172
+ it 'should get field value' do
173
+ keyValues.get('AppState/AppID').should eq("320")
174
+ end
175
+
176
+ it 'should get field value even with slashes at start and end' do
177
+ keyValues.get('/AppState/AppID/').should eq("320")
178
+ end
179
+
180
+ it 'should be nil if field doesn\'t exist' do
181
+ keyValues.get('AppState/Something').should be_nil
182
+ end
183
+ end
184
+
185
+ describe '#asArray' do
186
+ let(:keyValues) { SteamCodec::KeyValues::load(keyValueData) }
187
+
188
+ it 'should load fields as array' do
189
+ keyValues.AppState.asArray('SomeArrayValue').should eq(['4','3','2'])
190
+ end
191
+ end
192
+
193
+ describe 'access any field' do
194
+ let(:keyValues) { SteamCodec::KeyValues::load(keyValueData) }
195
+
196
+ it 'should be able to access AppState' do
197
+ keyValues.AppState.should eq(keyValueResult)
198
+ end
199
+
200
+ it 'should be able to read AppID' do
201
+ keyValues.AppState.AppID.should eq("320")
202
+ end
203
+
204
+ it 'should check if field exists' do
205
+ keyValues.AppState.has_key?(:AppID).should be_true
206
+ keyValues.AppState.has_key?(:StateFlags).should be_false
207
+ keyValues.respond_to?(:appstate).should be_true
208
+ keyValues.respond_to?(:nope).should be_false
209
+ end
210
+
211
+ it 'should raise exception for non-existent field' do
212
+ expect { keyValues.AppState.StateFlags }.to raise_error(NoMethodError)
213
+ end
214
+ end
215
+
216
+ end
@@ -1,4 +1,5 @@
1
- require 'simplecov'
2
-
3
- SimpleCov.start
4
- require_relative '../lib/steam_codec'
1
+ # encoding: UTF-8
2
+ require 'simplecov'
3
+
4
+ SimpleCov.start
5
+ require_relative '../lib/steam_codec'
@@ -1,136 +1,137 @@
1
- require 'spec_helper'
2
-
3
- describe SteamCodec::VDF do
4
-
5
- let(:valveDataFile) { <<-EOS
6
- "InstallScript"
7
- {
8
- "Registry"
9
- {
10
- "HKEY_LOCAL_MACHINE\\SOFTWARE\\Activision\\Singularity"
11
- {
12
- "string"
13
- {
14
- "EXEString" "%INSTALLDIR%\\Binaries\\Singularity.exe"
15
- "InstallPath" "%INSTALLDIR%"
16
- "IntVersion" "35.0"
17
- "Version" "1.0"
18
- "english"
19
- {
20
- "Language" "1033"
21
- "LanguageCode" "ENU"
22
- "Localization" "ENU"
23
- }
24
- "french"
25
- {
26
- "Language" "1036"
27
- "LanguageCode" "FRA"
28
- "Localization" "FRA"
29
- }
30
- "german"
31
- {
32
- "Language" "1031"
33
- "LanguageCode" "DEU"
34
- "Localization" "DEU"
35
- }
36
- "italian"
37
- {
38
- "Language" "1040"
39
- "LanguageCode" "ITA"
40
- "Localization" "ITA"
41
- }
42
- "spanish"
43
- {
44
- "Language" "1034"
45
- "LanguageCode" "ESP"
46
- "Localization" "ESP"
47
- }
48
- }
49
- "dword"
50
- {
51
- "english"
52
- {
53
- "GameLanguage" "0"
54
- }
55
- "french"
56
- {
57
- "GameLanguage" "1"
58
- }
59
- "german"
60
- {
61
- "GameLanguage" "0"
62
- }
63
- "italian"
64
- {
65
- "GameLanguage" "2"
66
- }
67
- "spanish"
68
- {
69
- "GameLanguage" "4"
70
- }
71
- }
72
- }
73
- }
74
- "Run Process"
75
- {
76
- "DirectX"
77
- {
78
- "process 1" "%INSTALLDIR%\\redist\\DirectX\\DXSETUP.exe"
79
- "command 1" "/silent"
80
- "Description" "DirectX Installation"
81
- "NoCleanUp" "1"
82
- }
83
- "VC++"
84
- {
85
- "process 1" "%INSTALLDIR%\\redist\\vcredist_x86.exe"
86
- "command 1" "/q:a"
87
- "process 2" "%INSTALLDIR%\\redist\\vcredist_x86_2005.exe"
88
- "command 2" "/q:a"
89
- "Description" "VC++ Redist Installation"
90
- "NoCleanUp" "1"
91
- }
92
- "PhysX Version"
93
- {
94
- "HasRunKey" "HKEY_LOCAL_MACHINE\\SOFTWARE\\AGEIA Technologies"
95
- "process 1" "%INSTALLDIR%\\redist\\PhysX_9.09.1112_SystemSoftware.exe"
96
- "command 1" "/quiet"
97
- "NoCleanUp" "1"
98
- "MinimumHasRunValue" "9091112"
99
- }
100
- }
101
- }
102
- "kvsignatures"
103
- {
104
- "InstallScript" "973f7d89125ad1fc782a970deb175cf84d48c49581ba3a76fedfefa8116a6d500459fd8df99285850ef99d767a83c2de009de5951607930557c937439908fbc1cc8156e963320c54080e7a1a634ccbf2e5f58883bd11bb2ed10c07be5af8e482d9a17d22a6fe40980124e5fced1c241f158b460941984c41432eeeb2aeaa01b1"
105
- }
106
- EOS
107
- }
108
-
109
- describe '.loadFromFile' do
110
- it 'should successfully load from file' do
111
- StringIO.open(valveDataFile) do |file|
112
- SteamCodec::VDF::loadFromFile(file).should be_an_instance_of SteamCodec::VDF
113
- end
114
- end
115
- end
116
-
117
- describe '.load' do
118
- it 'should successfully load' do
119
- SteamCodec::VDF::load(valveDataFile).should be_an_instance_of SteamCodec::VDF
120
- end
121
- end
122
-
123
- describe 'key field' do
124
- it 'should return value' do
125
- SteamCodec::VDF::load(valveDataFile).InstallScript.Registry.should be_an_instance_of SteamCodec::KeyValues
126
- end
127
- end
128
-
129
- describe '#isSignaturesValid?' do
130
- it 'should check if signature is valid' do
131
- SteamCodec::VDF.new.isSignaturesValid?(nil).should be_true
132
- SteamCodec::VDF::load(valveDataFile).isSignaturesValid?(nil).should be_false
133
- end
134
- end
135
-
136
- end
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe SteamCodec::VDF do
5
+
6
+ let(:valveDataFile) { <<-EOS
7
+ "InstallScript"
8
+ {
9
+ "Registry"
10
+ {
11
+ "HKEY_LOCAL_MACHINE\\SOFTWARE\\Activision\\Singularity"
12
+ {
13
+ "string"
14
+ {
15
+ "EXEString" "%INSTALLDIR%\\Binaries\\Singularity.exe"
16
+ "InstallPath" "%INSTALLDIR%"
17
+ "IntVersion" "35.0"
18
+ "Version" "1.0"
19
+ "english"
20
+ {
21
+ "Language" "1033"
22
+ "LanguageCode" "ENU"
23
+ "Localization" "ENU"
24
+ }
25
+ "french"
26
+ {
27
+ "Language" "1036"
28
+ "LanguageCode" "FRA"
29
+ "Localization" "FRA"
30
+ }
31
+ "german"
32
+ {
33
+ "Language" "1031"
34
+ "LanguageCode" "DEU"
35
+ "Localization" "DEU"
36
+ }
37
+ "italian"
38
+ {
39
+ "Language" "1040"
40
+ "LanguageCode" "ITA"
41
+ "Localization" "ITA"
42
+ }
43
+ "spanish"
44
+ {
45
+ "Language" "1034"
46
+ "LanguageCode" "ESP"
47
+ "Localization" "ESP"
48
+ }
49
+ }
50
+ "dword"
51
+ {
52
+ "english"
53
+ {
54
+ "GameLanguage" "0"
55
+ }
56
+ "french"
57
+ {
58
+ "GameLanguage" "1"
59
+ }
60
+ "german"
61
+ {
62
+ "GameLanguage" "0"
63
+ }
64
+ "italian"
65
+ {
66
+ "GameLanguage" "2"
67
+ }
68
+ "spanish"
69
+ {
70
+ "GameLanguage" "4"
71
+ }
72
+ }
73
+ }
74
+ }
75
+ "Run Process"
76
+ {
77
+ "DirectX"
78
+ {
79
+ "process 1" "%INSTALLDIR%\\redist\\DirectX\\DXSETUP.exe"
80
+ "command 1" "/silent"
81
+ "Description" "DirectX Installation"
82
+ "NoCleanUp" "1"
83
+ }
84
+ "VC++"
85
+ {
86
+ "process 1" "%INSTALLDIR%\\redist\\vcredist_x86.exe"
87
+ "command 1" "/q:a"
88
+ "process 2" "%INSTALLDIR%\\redist\\vcredist_x86_2005.exe"
89
+ "command 2" "/q:a"
90
+ "Description" "VC++ Redist Installation"
91
+ "NoCleanUp" "1"
92
+ }
93
+ "PhysX Version"
94
+ {
95
+ "HasRunKey" "HKEY_LOCAL_MACHINE\\SOFTWARE\\AGEIA Technologies"
96
+ "process 1" "%INSTALLDIR%\\redist\\PhysX_9.09.1112_SystemSoftware.exe"
97
+ "command 1" "/quiet"
98
+ "NoCleanUp" "1"
99
+ "MinimumHasRunValue" "9091112"
100
+ }
101
+ }
102
+ }
103
+ "kvsignatures"
104
+ {
105
+ "InstallScript" "973f7d89125ad1fc782a970deb175cf84d48c49581ba3a76fedfefa8116a6d500459fd8df99285850ef99d767a83c2de009de5951607930557c937439908fbc1cc8156e963320c54080e7a1a634ccbf2e5f58883bd11bb2ed10c07be5af8e482d9a17d22a6fe40980124e5fced1c241f158b460941984c41432eeeb2aeaa01b1"
106
+ }
107
+ EOS
108
+ }
109
+
110
+ describe '.loadFromFile' do
111
+ it 'should successfully load from file' do
112
+ StringIO.open(valveDataFile) do |file|
113
+ SteamCodec::VDF::loadFromFile(file).should be_an_instance_of SteamCodec::VDF
114
+ end
115
+ end
116
+ end
117
+
118
+ describe '.load' do
119
+ it 'should successfully load' do
120
+ SteamCodec::VDF::load(valveDataFile).should be_an_instance_of SteamCodec::VDF
121
+ end
122
+ end
123
+
124
+ describe 'key field' do
125
+ it 'should return value' do
126
+ SteamCodec::VDF::load(valveDataFile).InstallScript.Registry.should be_an_instance_of SteamCodec::KeyValues
127
+ end
128
+ end
129
+
130
+ describe '#isSignaturesValid?' do
131
+ it 'should check if signature is valid' do
132
+ SteamCodec::VDF.new.isSignaturesValid?(nil).should be_true
133
+ SteamCodec::VDF::load(valveDataFile).isSignaturesValid?(nil).should be_false
134
+ end
135
+ end
136
+
137
+ end
@@ -1,4 +1,4 @@
1
- # coding: utf-8
1
+ # encoding: UTF-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'steam_codec/version'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: steam_codec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dāvis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-16 00:00:00.000000000 Z
11
+ date: 2013-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: insensitive_hash