ms-binary-resources 0.1.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 +7 -0
- data/.gitignore +16 -0
- data/.rspec +2 -0
- data/.rubocop.yml +4 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +57 -0
- data/Rakefile +7 -0
- data/lib/ms/binary/resources.rb +3 -0
- data/lib/ms/binary/resources/constants.rb +30 -0
- data/lib/ms/binary/resources/reader.rb +185 -0
- data/lib/ms/binary/resources/version.rb +5 -0
- data/ms-binary-resources.gemspec +33 -0
- data/spec/reader_spec.rb +174 -0
- data/spec/spec_helper.rb +32 -0
- data/support/data/Example.resources +0 -0
- data/support/data/Example.txt +17 -0
- data/support/data/Example2.resources +0 -0
- data/support/data/Example2.resx +318 -0
- data/support/data/invalid/derp.bin +0 -0
- data/support/dump-resources/DumpResources.cs +19 -0
- metadata +237 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 86da19e6dd64a8090ae6f58af1ee9389c064c2a4
|
4
|
+
data.tar.gz: 146e58a02d2cdb175ee62fbd09852646f7d4afab
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d7a57c1f7c631d0169cedbee504e4fc4dbee44c66988fb94ef53c9bca9cf0a1ff659967bbde449a520b0ff2f69afd326ecc0af1156ff23431011b0684be9b2aa
|
7
|
+
data.tar.gz: 0995fe940c55880302f93f636a57785492c0bc238dce4d81e0699d4c705c095aadf43cea5af9fbb773640109394672d3c565f434898761e506664abd0d7f4bf3
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.2
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Aramis Group, LLC dba code lever
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Ms::BinaryResources [](https://travis-ci.org/code-lever/ms-binary-resources) [](https://gemnasium.com/code-lever/ms-binary-resources) [](https://codeclimate.com/github/code-lever/ms-binary-resources)
|
2
|
+
|
3
|
+
A way to read Microsoft's binary resource files in Ruby.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'ms-binary-resources'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
```
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
```
|
22
|
+
$ gem install ms-binary-resources
|
23
|
+
```
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
reader = Ms::BinaryResources::Reader.new('/path/to/file')
|
29
|
+
reader.keys
|
30
|
+
=> ['key1', 'key2', ...]
|
31
|
+
reader.key? 'key1'
|
32
|
+
=> true
|
33
|
+
reader.key? 'keyxx'
|
34
|
+
=> false
|
35
|
+
reader['key1']
|
36
|
+
=> 'some value'
|
37
|
+
reader.type_of 'key2'
|
38
|
+
=> :int32
|
39
|
+
reader['key2']
|
40
|
+
=> 8675309
|
41
|
+
```
|
42
|
+
|
43
|
+
## Caveats
|
44
|
+
|
45
|
+
Currently only string values are supported.
|
46
|
+
|
47
|
+
## Thanks
|
48
|
+
|
49
|
+
This is largely cribbed off of the [Mono Project's](https://github.com/mono/mono) class library implementation of ResourceReader and friends.
|
50
|
+
|
51
|
+
## Contributing
|
52
|
+
|
53
|
+
1. Fork it ( https://github.com/code-lever/ms-binary-resources/fork )
|
54
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
55
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
56
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
57
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Ms
|
2
|
+
module BinaryResources
|
3
|
+
|
4
|
+
MAGIC_NUMBER = 0xBEEFCACE
|
5
|
+
|
6
|
+
RESOURCE_TYPES = {
|
7
|
+
null: 0,
|
8
|
+
string: 1,
|
9
|
+
bool: 2,
|
10
|
+
char: 3,
|
11
|
+
byte: 4,
|
12
|
+
sbyte: 5,
|
13
|
+
int16: 6,
|
14
|
+
uint16: 7,
|
15
|
+
int32: 8,
|
16
|
+
uint32: 9,
|
17
|
+
int64: 10,
|
18
|
+
uint64: 11,
|
19
|
+
single: 12,
|
20
|
+
double: 13,
|
21
|
+
decimal: 14,
|
22
|
+
datetime: 15,
|
23
|
+
timespan: 16,
|
24
|
+
bytearray: 32,
|
25
|
+
stream: 33,
|
26
|
+
fistcustom: 64,
|
27
|
+
}
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module Ms
|
5
|
+
module BinaryResources
|
6
|
+
|
7
|
+
class Reader
|
8
|
+
|
9
|
+
include Enumerable
|
10
|
+
|
11
|
+
attr_reader :manager_magic, :manager_version, :manager_length, :resource_version,
|
12
|
+
:resource_count, :type_count
|
13
|
+
|
14
|
+
def initialize(uri)
|
15
|
+
@file = open(uri, 'rb')
|
16
|
+
read_headers
|
17
|
+
rescue => e
|
18
|
+
raise ArgumentError, "file does not appear to be a resources @file (#{e})"
|
19
|
+
@file.close
|
20
|
+
end
|
21
|
+
|
22
|
+
def each(&block)
|
23
|
+
keys.each { |k| block.call(k, (self[k] rescue nil)) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def key?(name)
|
27
|
+
info_for_name(name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def keys
|
31
|
+
@keys ||= @resource_infos.map(&:name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def type_of(name)
|
35
|
+
info = info_for_name(name)
|
36
|
+
if info
|
37
|
+
type = RESOURCE_TYPES.find { |_,v| info.type_index == v }
|
38
|
+
type && type.first
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def [](name)
|
43
|
+
info = info_for_name(name)
|
44
|
+
info ? read_value(info) : nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def close
|
48
|
+
@file.close
|
49
|
+
@file = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def info_for_name(name)
|
55
|
+
@resource_infos.find { |info| info.name.encode(name.encoding) == name }
|
56
|
+
end
|
57
|
+
|
58
|
+
def read_headers
|
59
|
+
@manager_magic = read_uint32
|
60
|
+
raise 'magic (%08X)' % manager_magic unless MAGIC_NUMBER == manager_magic
|
61
|
+
|
62
|
+
@manager_version = read_uint32
|
63
|
+
@manager_length = read_uint32
|
64
|
+
|
65
|
+
if 1 == manager_version
|
66
|
+
@reader_class = @file.read(@manager_length)
|
67
|
+
else
|
68
|
+
raise 'Unsupported manager version (%d)' % manager_version
|
69
|
+
end
|
70
|
+
|
71
|
+
@resource_version = read_uint32
|
72
|
+
unless [1, 2].include?(resource_version)
|
73
|
+
raise 'Unsupported resource version (%d)' % resource_version
|
74
|
+
end
|
75
|
+
|
76
|
+
@resource_count = read_uint32
|
77
|
+
@type_count = read_uint32
|
78
|
+
|
79
|
+
@type_names = @type_count.times.map { read_string }
|
80
|
+
|
81
|
+
# next section is 8-byte aligned, there will be PADPADPAD characters to make it so
|
82
|
+
pad_alignment = @file.pos & 0x07
|
83
|
+
pad_count = pad_alignment > 0 ? 8 - pad_alignment : 0
|
84
|
+
padding = @file.read(pad_count)
|
85
|
+
|
86
|
+
@hashes = resource_count.times.map { read_uint32 }
|
87
|
+
@positions = resource_count.times.map { read_uint32 }
|
88
|
+
|
89
|
+
@data_section_offset = read_uint32
|
90
|
+
@name_section_offset = @file.pos
|
91
|
+
|
92
|
+
@resource_infos = @positions.map { |pos| read_resource_info(pos) }
|
93
|
+
|
94
|
+
@file.seek(@name_section_offset)
|
95
|
+
end
|
96
|
+
|
97
|
+
def read_resource_info(name_position)
|
98
|
+
seek_to_name(name_position)
|
99
|
+
length = read_7bit_encoded_int
|
100
|
+
name = read(length).encode('UTF-16LE', 'UTF-16LE')
|
101
|
+
|
102
|
+
seek_to_data(read_uint32)
|
103
|
+
type_index = read_7bit_encoded_int
|
104
|
+
|
105
|
+
OpenStruct.new name: name, value_position: @file.pos, type_index: type_index
|
106
|
+
end
|
107
|
+
|
108
|
+
def read(bytes)
|
109
|
+
@file.read(bytes)
|
110
|
+
end
|
111
|
+
|
112
|
+
def read_byte
|
113
|
+
read(1).unpack('C').first
|
114
|
+
end
|
115
|
+
|
116
|
+
def read_int16
|
117
|
+
read(2).unpack('s<').first
|
118
|
+
end
|
119
|
+
|
120
|
+
def read_uint16
|
121
|
+
read(2).unpack('S<').first
|
122
|
+
end
|
123
|
+
|
124
|
+
def read_int32
|
125
|
+
read(4).unpack('l<').first
|
126
|
+
end
|
127
|
+
|
128
|
+
def read_uint32
|
129
|
+
read(4).unpack('L<').first
|
130
|
+
end
|
131
|
+
|
132
|
+
def read_int64
|
133
|
+
read(8).unpack('q<').first
|
134
|
+
end
|
135
|
+
|
136
|
+
def read_uint64
|
137
|
+
read(8).unpack('Q<').first
|
138
|
+
end
|
139
|
+
|
140
|
+
def read_7bit_encoded_int
|
141
|
+
ret = 0
|
142
|
+
shift = 0
|
143
|
+
b = 0
|
144
|
+
|
145
|
+
begin
|
146
|
+
b = read_byte
|
147
|
+
ret |= (b & 0x7f) << shift
|
148
|
+
shift += 7
|
149
|
+
end while (b & 0x80) == 0x80
|
150
|
+
|
151
|
+
ret
|
152
|
+
end
|
153
|
+
|
154
|
+
def read_string
|
155
|
+
read(read_7bit_encoded_int)
|
156
|
+
end
|
157
|
+
|
158
|
+
def read_value(resource_info)
|
159
|
+
@file.seek(resource_info.value_position)
|
160
|
+
|
161
|
+
case resource_info.type_index
|
162
|
+
when RESOURCE_TYPES[:string]; read_string
|
163
|
+
when RESOURCE_TYPES[:int16]; read_int16
|
164
|
+
when RESOURCE_TYPES[:uint16]; read_uint16
|
165
|
+
when RESOURCE_TYPES[:int32]; read_int32
|
166
|
+
when RESOURCE_TYPES[:uint32]; read_uint32
|
167
|
+
when RESOURCE_TYPES[:int64]; read_int64
|
168
|
+
when RESOURCE_TYPES[:uint64]; read_uint64
|
169
|
+
else
|
170
|
+
raise 'Unsupported type index: %d' % resource_info.type_index
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def seek_to_name(position)
|
175
|
+
@file.seek(@name_section_offset + position)
|
176
|
+
end
|
177
|
+
|
178
|
+
def seek_to_data(position)
|
179
|
+
@file.seek(@data_section_offset + position)
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ms/binary/resources/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'ms-binary-resources'
|
8
|
+
spec.version = Ms::BinaryResources::VERSION
|
9
|
+
spec.authors = ['Nick Veys']
|
10
|
+
spec.email = ['nick@codelever.com']
|
11
|
+
spec.summary = %q{Read binary resource files}
|
12
|
+
spec.description = %q{}
|
13
|
+
spec.homepage = 'https://github.com/code-lever/ms-binary-resources'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'awesome_print'
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
23
|
+
spec.add_development_dependency 'ci_reporter', '~> 1.9'
|
24
|
+
spec.add_development_dependency 'pry'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 2.99'
|
27
|
+
spec.add_development_dependency 'rubocop'
|
28
|
+
spec.add_development_dependency 'rubocop-checkstyle_formatter'
|
29
|
+
spec.add_development_dependency 'simplecov'
|
30
|
+
spec.add_development_dependency 'simplecov-gem-adapter'
|
31
|
+
spec.add_development_dependency 'simplecov-rcov'
|
32
|
+
spec.add_development_dependency 'yard'
|
33
|
+
end
|
data/spec/reader_spec.rb
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ms::BinaryResources::Reader do
|
4
|
+
|
5
|
+
context 'with invalid derp.bin' do
|
6
|
+
|
7
|
+
describe '.new' do
|
8
|
+
|
9
|
+
invalid_data_files.each do |file|
|
10
|
+
it "raises when created with #{file}" do
|
11
|
+
expect { described_class.new(file) }.to raise_error
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'with Example.resources' do
|
20
|
+
|
21
|
+
let(:file) { data_file('Example.resources') }
|
22
|
+
|
23
|
+
subject { described_class.new(file) }
|
24
|
+
|
25
|
+
its(:manager_magic) { should eql(0xBEEFCACE) }
|
26
|
+
|
27
|
+
its(:manager_version) { should eql(1) }
|
28
|
+
|
29
|
+
its(:manager_length) { should eql(145) }
|
30
|
+
|
31
|
+
its(:resource_version) { should eql(2) }
|
32
|
+
|
33
|
+
its(:resource_count) { should eql(16) }
|
34
|
+
|
35
|
+
its(:type_count) { should eql(0) }
|
36
|
+
|
37
|
+
describe '#key?' do
|
38
|
+
|
39
|
+
%w(Title Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8
|
40
|
+
Label9 Label10 Label11 Label12 Label13 Label14 Label15).each do |key|
|
41
|
+
it "is true for #{key}" do
|
42
|
+
expect(subject.key?(key)).to be_truthy
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'is false for keys not present' do
|
47
|
+
expect(subject.key?('hello')).to be_falsey
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#type_of' do
|
53
|
+
|
54
|
+
context 'with existing key Label1' do
|
55
|
+
|
56
|
+
specify { expect(subject.type_of('Label1')).to eql(:string) }
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'with non-existant key Label155' do
|
61
|
+
|
62
|
+
specify { expect(subject.type_of('Label155')).to be_nil }
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#[]' do
|
69
|
+
|
70
|
+
{
|
71
|
+
'Title' => '"Contact Information"',
|
72
|
+
'Label1' => '"First Name:"',
|
73
|
+
'Label2' => '"Middle Name:"',
|
74
|
+
'Label3' => '"Last Name:"',
|
75
|
+
'Label4' => '"SSN:"',
|
76
|
+
'Label5' => '"Street Address:"',
|
77
|
+
'Label6' => '"City:"',
|
78
|
+
'Label7' => '"State:"',
|
79
|
+
'Label8' => '"Zip Code:"',
|
80
|
+
'Label9' => '"Home Phone:"',
|
81
|
+
'Label10' => '"Business Phone:"',
|
82
|
+
'Label11' => '"Mobile Phone:"',
|
83
|
+
'Label12' => '"Other Phone:"',
|
84
|
+
'Label13' => '"Fax:"',
|
85
|
+
'Label14' => '"Email Address:"',
|
86
|
+
'Label15' => '"Alternate Email Address:"',
|
87
|
+
}.each do |k,v|
|
88
|
+
it "is #{v} for #{k}" do
|
89
|
+
expect(subject[k]).to eql(v)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'with Example2.resources' do
|
98
|
+
|
99
|
+
let(:file) { data_file('Example2.resources') }
|
100
|
+
|
101
|
+
subject { described_class.new(file) }
|
102
|
+
|
103
|
+
its(:manager_magic) { should eql(0xBEEFCACE) }
|
104
|
+
|
105
|
+
its(:manager_version) { should eql(1) }
|
106
|
+
|
107
|
+
its(:manager_length) { should eql(145) }
|
108
|
+
|
109
|
+
its(:resource_version) { should eql(2) }
|
110
|
+
|
111
|
+
its(:resource_count) { should eql(63) }
|
112
|
+
|
113
|
+
its(:type_count) { should eql(9) }
|
114
|
+
|
115
|
+
describe '#key?' do
|
116
|
+
|
117
|
+
context 'with existing key descriptionLabel.Text' do
|
118
|
+
|
119
|
+
specify { expect(subject.key?('descriptionLabel.Text')).to be_truthy }
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'with non-existent key descriptionLabelzzz.Text' do
|
124
|
+
|
125
|
+
specify { expect(subject.key?('descriptionLabelzzz.Text')).to be_falsey }
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#type_of' do
|
132
|
+
|
133
|
+
{
|
134
|
+
'errorDetailsTextBox.Size' => nil,
|
135
|
+
'panel1.TabIndex16' => :int16,
|
136
|
+
'progressBar.TabIndex16' => :uint16,
|
137
|
+
'panel1.TabIndex32' => :int32,
|
138
|
+
'progressBar.TabIndex32' => :uint32,
|
139
|
+
'panel1.TabIndex64' => :int64,
|
140
|
+
'progressBar.TabIndex64' => :uint64,
|
141
|
+
'hello' => nil,
|
142
|
+
}.each do |k,v|
|
143
|
+
it "is #{v.inspect} for #{k}" do
|
144
|
+
expect(subject.type_of(k)).to eql(v)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
describe '#[]' do
|
151
|
+
|
152
|
+
{
|
153
|
+
'panel1.TabIndex16' => 13,
|
154
|
+
'progressBar.TabIndex16' => 2500,
|
155
|
+
'panel1.TabIndex32' => 365,
|
156
|
+
'progressBar.TabIndex32' => 250000,
|
157
|
+
'panel1.TabIndex64' => 30,
|
158
|
+
'progressBar.TabIndex64' => 250000000000000,
|
159
|
+
'hello' => nil,
|
160
|
+
}.each do |k,v|
|
161
|
+
it "is #{v.inspect} for #{k}" do
|
162
|
+
expect(subject[k]).to eql(v)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'raises for unsupported type' do
|
167
|
+
expect { subject['errorDetailsTextBox.Size'] }.to raise_error
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'simplecov-gem-adapter'
|
3
|
+
require 'simplecov-rcov'
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
5
|
+
SimpleCov.start 'gem' if ENV['COVERAGE']
|
6
|
+
|
7
|
+
require 'awesome_print'
|
8
|
+
require 'pathname'
|
9
|
+
require 'ms/binary/resources'
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
|
+
config.run_all_when_everything_filtered = true
|
14
|
+
config.filter_run :focus
|
15
|
+
|
16
|
+
# Run specs in random order to surface order dependencies. If you find an
|
17
|
+
# order dependency and want to debug it, you can fix the order by providing
|
18
|
+
# the seed, which is printed after each run.
|
19
|
+
# --seed 1234
|
20
|
+
config.order = 'random'
|
21
|
+
end
|
22
|
+
|
23
|
+
def data_file(name)
|
24
|
+
File.expand_path("#{File.dirname(__FILE__)}/../support/data/#{name}")
|
25
|
+
end
|
26
|
+
|
27
|
+
def invalid_data_files
|
28
|
+
dir = "#{File.dirname(__FILE__)}/../support/data/invalid"
|
29
|
+
invalid = Dir.glob("#{dir}/**/*").select { |e| File.file? e }
|
30
|
+
invalid << __FILE__
|
31
|
+
invalid << 'not-really-a-file.resources'
|
32
|
+
end
|
Binary file
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Generate resources file via 'resgen Example.txt'
|
2
|
+
Title="Contact Information"
|
3
|
+
Label1="First Name:"
|
4
|
+
Label2="Middle Name:"
|
5
|
+
Label3="Last Name:"
|
6
|
+
Label4="SSN:"
|
7
|
+
Label5="Street Address:"
|
8
|
+
Label6="City:"
|
9
|
+
Label7="State:"
|
10
|
+
Label8="Zip Code:"
|
11
|
+
Label9="Home Phone:"
|
12
|
+
Label10="Business Phone:"
|
13
|
+
Label11="Mobile Phone:"
|
14
|
+
Label12="Other Phone:"
|
15
|
+
Label13="Fax:"
|
16
|
+
Label14="Email Address:"
|
17
|
+
Label15="Alternate Email Address:"
|
Binary file
|
@@ -0,0 +1,318 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<root>
|
3
|
+
<!--
|
4
|
+
Microsoft ResX Schema
|
5
|
+
|
6
|
+
Version 2.0
|
7
|
+
|
8
|
+
The primary goals of this format is to allow a simple XML format
|
9
|
+
that is mostly human readable. The generation and parsing of the
|
10
|
+
various data types are done through the TypeConverter classes
|
11
|
+
associated with the data types.
|
12
|
+
|
13
|
+
Example:
|
14
|
+
|
15
|
+
... ado.net/XML headers & schema ...
|
16
|
+
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
17
|
+
<resheader name="version">2.0</resheader>
|
18
|
+
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
19
|
+
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
20
|
+
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
21
|
+
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
22
|
+
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
23
|
+
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
24
|
+
</data>
|
25
|
+
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
26
|
+
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
27
|
+
<comment>This is a comment</comment>
|
28
|
+
</data>
|
29
|
+
|
30
|
+
There are any number of "resheader" rows that contain simple
|
31
|
+
name/value pairs.
|
32
|
+
|
33
|
+
Each data row contains a name, and value. The row also contains a
|
34
|
+
type or mimetype. Type corresponds to a .NET class that support
|
35
|
+
text/value conversion through the TypeConverter architecture.
|
36
|
+
Classes that don't support this are serialized and stored with the
|
37
|
+
mimetype set.
|
38
|
+
|
39
|
+
The mimetype is used for serialized objects, and tells the
|
40
|
+
ResXResourceReader how to depersist the object. This is currently not
|
41
|
+
extensible. For a given mimetype the value must be set accordingly:
|
42
|
+
|
43
|
+
Note - application/x-microsoft.net.object.binary.base64 is the format
|
44
|
+
that the ResXResourceWriter will generate, however the reader can
|
45
|
+
read any of the formats listed below.
|
46
|
+
|
47
|
+
mimetype: application/x-microsoft.net.object.binary.base64
|
48
|
+
value : The object must be serialized with
|
49
|
+
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
50
|
+
: and then encoded with base64 encoding.
|
51
|
+
|
52
|
+
mimetype: application/x-microsoft.net.object.soap.base64
|
53
|
+
value : The object must be serialized with
|
54
|
+
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
55
|
+
: and then encoded with base64 encoding.
|
56
|
+
|
57
|
+
mimetype: application/x-microsoft.net.object.bytearray.base64
|
58
|
+
value : The object must be serialized into a byte array
|
59
|
+
: using a System.ComponentModel.TypeConverter
|
60
|
+
: and then encoded with base64 encoding.
|
61
|
+
-->
|
62
|
+
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
63
|
+
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
64
|
+
<xsd:element name="root" msdata:IsDataSet="true">
|
65
|
+
<xsd:complexType>
|
66
|
+
<xsd:choice maxOccurs="unbounded">
|
67
|
+
<xsd:element name="metadata">
|
68
|
+
<xsd:complexType>
|
69
|
+
<xsd:sequence>
|
70
|
+
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
71
|
+
</xsd:sequence>
|
72
|
+
<xsd:attribute name="name" use="required" type="xsd:string" />
|
73
|
+
<xsd:attribute name="type" type="xsd:string" />
|
74
|
+
<xsd:attribute name="mimetype" type="xsd:string" />
|
75
|
+
<xsd:attribute ref="xml:space" />
|
76
|
+
</xsd:complexType>
|
77
|
+
</xsd:element>
|
78
|
+
<xsd:element name="assembly">
|
79
|
+
<xsd:complexType>
|
80
|
+
<xsd:attribute name="alias" type="xsd:string" />
|
81
|
+
<xsd:attribute name="name" type="xsd:string" />
|
82
|
+
</xsd:complexType>
|
83
|
+
</xsd:element>
|
84
|
+
<xsd:element name="data">
|
85
|
+
<xsd:complexType>
|
86
|
+
<xsd:sequence>
|
87
|
+
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
88
|
+
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
89
|
+
</xsd:sequence>
|
90
|
+
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
91
|
+
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
92
|
+
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
93
|
+
<xsd:attribute ref="xml:space" />
|
94
|
+
</xsd:complexType>
|
95
|
+
</xsd:element>
|
96
|
+
<xsd:element name="resheader">
|
97
|
+
<xsd:complexType>
|
98
|
+
<xsd:sequence>
|
99
|
+
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
100
|
+
</xsd:sequence>
|
101
|
+
<xsd:attribute name="name" type="xsd:string" use="required" />
|
102
|
+
</xsd:complexType>
|
103
|
+
</xsd:element>
|
104
|
+
</xsd:choice>
|
105
|
+
</xsd:complexType>
|
106
|
+
</xsd:element>
|
107
|
+
</xsd:schema>
|
108
|
+
<resheader name="resmimetype">
|
109
|
+
<value>text/microsoft-resx</value>
|
110
|
+
</resheader>
|
111
|
+
<resheader name="version">
|
112
|
+
<value>2.0</value>
|
113
|
+
</resheader>
|
114
|
+
<resheader name="reader">
|
115
|
+
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
116
|
+
</resheader>
|
117
|
+
<resheader name="writer">
|
118
|
+
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
119
|
+
</resheader>
|
120
|
+
<data name=">>panel1.Parent" xml:space="preserve">
|
121
|
+
<value>tableLayoutPanel</value>
|
122
|
+
</data>
|
123
|
+
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
124
|
+
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
125
|
+
<value>550, 147</value>
|
126
|
+
</data>
|
127
|
+
<data name=">>errorDetailsTextBox.Type" xml:space="preserve">
|
128
|
+
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
129
|
+
</data>
|
130
|
+
<data name=">>$this.Type" xml:space="preserve">
|
131
|
+
<value>SharePointInstaller.InstallerControl, Setup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cb87ba0215b862e1</value>
|
132
|
+
</data>
|
133
|
+
<data name="descriptionLabel.Location" type="System.Drawing.Point, System.Drawing">
|
134
|
+
<value>3, 132</value>
|
135
|
+
</data>
|
136
|
+
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
137
|
+
<data name="tableLayoutPanel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
138
|
+
<value>Fill</value>
|
139
|
+
</data>
|
140
|
+
<data name="errorDetailsTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
141
|
+
<value>Top, Left, Right</value>
|
142
|
+
</data>
|
143
|
+
<data name=">>descriptionLabel.ZOrder" xml:space="preserve">
|
144
|
+
<value>1</value>
|
145
|
+
</data>
|
146
|
+
<data name="progressBar.Size" type="System.Drawing.Size, System.Drawing">
|
147
|
+
<value>550, 24</value>
|
148
|
+
</data>
|
149
|
+
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
150
|
+
<data name="descriptionLabel.TabIndex" type="System.Int32, mscorlib">
|
151
|
+
<value>1</value>
|
152
|
+
</data>
|
153
|
+
<data name="errorDetailsTextBox.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
|
154
|
+
<value>Both</value>
|
155
|
+
</data>
|
156
|
+
<data name=">>errorPictureBox.ZOrder" xml:space="preserve">
|
157
|
+
<value>1</value>
|
158
|
+
</data>
|
159
|
+
<data name=">>errorDetailsTextBox.ZOrder" xml:space="preserve">
|
160
|
+
<value>0</value>
|
161
|
+
</data>
|
162
|
+
<data name="tableLayoutPanel.RowCount" type="System.Int32, mscorlib">
|
163
|
+
<value>4</value>
|
164
|
+
</data>
|
165
|
+
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
166
|
+
<value>Fill</value>
|
167
|
+
</data>
|
168
|
+
<data name=">>errorPictureBox.Parent" xml:space="preserve">
|
169
|
+
<value>panel1</value>
|
170
|
+
</data>
|
171
|
+
<data name="errorPictureBox.BackgroundImageLayout" type="System.Windows.Forms.ImageLayout, System.Windows.Forms">
|
172
|
+
<value>Center</value>
|
173
|
+
</data>
|
174
|
+
<data name="errorDetailsTextBox.TabIndex" type="System.Int32, mscorlib">
|
175
|
+
<value>3</value>
|
176
|
+
</data>
|
177
|
+
<data name=">>tableLayoutPanel.ZOrder" xml:space="preserve">
|
178
|
+
<value>0</value>
|
179
|
+
</data>
|
180
|
+
<data name=">>descriptionLabel.Name" xml:space="preserve">
|
181
|
+
<value>descriptionLabel</value>
|
182
|
+
</data>
|
183
|
+
<data name="descriptionLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
184
|
+
<value>Fill</value>
|
185
|
+
</data>
|
186
|
+
<data name=">>panel1.Type" xml:space="preserve">
|
187
|
+
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
188
|
+
</data>
|
189
|
+
<data name=">>tableLayoutPanel.Type" xml:space="preserve">
|
190
|
+
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
191
|
+
</data>
|
192
|
+
<data name="descriptionLabel.Text" xml:space="preserve">
|
193
|
+
<value>Working...</value>
|
194
|
+
</data>
|
195
|
+
<data name="$this.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
196
|
+
<value>10, 10, 10, 10</value>
|
197
|
+
</data>
|
198
|
+
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
199
|
+
<value>6, 13</value>
|
200
|
+
</data>
|
201
|
+
<data name=">>progressBar.Name" xml:space="preserve">
|
202
|
+
<value>progressBar</value>
|
203
|
+
</data>
|
204
|
+
<data name=">>errorPictureBox.Name" xml:space="preserve">
|
205
|
+
<value>errorPictureBox</value>
|
206
|
+
</data>
|
207
|
+
<data name=">>errorDetailsTextBox.Name" xml:space="preserve">
|
208
|
+
<value>errorDetailsTextBox</value>
|
209
|
+
</data>
|
210
|
+
<data name=">>tableLayoutPanel.Parent" xml:space="preserve">
|
211
|
+
<value>$this</value>
|
212
|
+
</data>
|
213
|
+
<data name=">>errorPictureBox.Type" xml:space="preserve">
|
214
|
+
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
215
|
+
</data>
|
216
|
+
<data name="errorPictureBox.TabIndex" type="System.Int32, mscorlib">
|
217
|
+
<value>2</value>
|
218
|
+
</data>
|
219
|
+
<data name=">>progressBar.Parent" xml:space="preserve">
|
220
|
+
<value>tableLayoutPanel</value>
|
221
|
+
</data>
|
222
|
+
<data name="errorDetailsTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
223
|
+
<value>82, 0</value>
|
224
|
+
</data>
|
225
|
+
<data name=">>errorDetailsTextBox.Parent" xml:space="preserve">
|
226
|
+
<value>panel1</value>
|
227
|
+
</data>
|
228
|
+
<data name="tableLayoutPanel.Location" type="System.Drawing.Point, System.Drawing">
|
229
|
+
<value>10, 10</value>
|
230
|
+
</data>
|
231
|
+
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
|
232
|
+
<value>576, 345</value>
|
233
|
+
</data>
|
234
|
+
<data name="errorDetailsTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
235
|
+
<value>465, 137</value>
|
236
|
+
</data>
|
237
|
+
<data name="descriptionLabel.Size" type="System.Drawing.Size, System.Drawing">
|
238
|
+
<value>550, 40</value>
|
239
|
+
</data>
|
240
|
+
<data name=">>descriptionLabel.Parent" xml:space="preserve">
|
241
|
+
<value>tableLayoutPanel</value>
|
242
|
+
</data>
|
243
|
+
<data name="tableLayoutPanel.ColumnCount" type="System.Int32, mscorlib">
|
244
|
+
<value>1</value>
|
245
|
+
</data>
|
246
|
+
<data name="tableLayoutPanel.Size" type="System.Drawing.Size, System.Drawing">
|
247
|
+
<value>556, 325</value>
|
248
|
+
</data>
|
249
|
+
<data name=">>descriptionLabel.Type" xml:space="preserve">
|
250
|
+
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
251
|
+
</data>
|
252
|
+
<data name="errorPictureBox.Size" type="System.Drawing.Size, System.Drawing">
|
253
|
+
<value>73, 70</value>
|
254
|
+
</data>
|
255
|
+
<data name=">>panel1.Name" xml:space="preserve">
|
256
|
+
<value>panel1</value>
|
257
|
+
</data>
|
258
|
+
<data name=">>progressBar.ZOrder" xml:space="preserve">
|
259
|
+
<value>0</value>
|
260
|
+
</data>
|
261
|
+
<data name="progressBar.Location" type="System.Drawing.Point, System.Drawing">
|
262
|
+
<value>3, 105</value>
|
263
|
+
</data>
|
264
|
+
<data name=">>progressBar.Type" xml:space="preserve">
|
265
|
+
<value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
266
|
+
</data>
|
267
|
+
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
268
|
+
<value>3, 175</value>
|
269
|
+
</data>
|
270
|
+
<data name=">>panel1.ZOrder" xml:space="preserve">
|
271
|
+
<value>2</value>
|
272
|
+
</data>
|
273
|
+
<data name="errorDetailsTextBox.Multiline" type="System.Boolean, mscorlib">
|
274
|
+
<value>True</value>
|
275
|
+
</data>
|
276
|
+
<data name="errorPictureBox.Location" type="System.Drawing.Point, System.Drawing">
|
277
|
+
<value>3, 0</value>
|
278
|
+
</data>
|
279
|
+
<data name="progressBar.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
280
|
+
<value>Fill</value>
|
281
|
+
</data>
|
282
|
+
<data name="panel1.TabIndex16" type="System.Int16, mscorlib">
|
283
|
+
<value>13</value>
|
284
|
+
</data>
|
285
|
+
<data name="progressBar.TabIndex16" type="System.UInt16, mscorlib">
|
286
|
+
<value>2500</value>
|
287
|
+
</data>
|
288
|
+
<data name="panel1.TabIndex32" type="System.Int32, mscorlib">
|
289
|
+
<value>365</value>
|
290
|
+
</data>
|
291
|
+
<data name="progressBar.TabIndex32" type="System.UInt32, mscorlib">
|
292
|
+
<value>250000</value>
|
293
|
+
</data>
|
294
|
+
<data name="panel1.TabIndex64" type="System.Int64, mscorlib">
|
295
|
+
<value>30</value>
|
296
|
+
</data>
|
297
|
+
<data name="progressBar.TabIndex64" type="System.UInt64, mscorlib">
|
298
|
+
<value>250000000000000</value>
|
299
|
+
</data>
|
300
|
+
<data name=">>$this.Name" xml:space="preserve">
|
301
|
+
<value>InstallProcessControl</value>
|
302
|
+
</data>
|
303
|
+
<data name="descriptionLabel.AutoSize" type="System.Boolean, mscorlib">
|
304
|
+
<value>True</value>
|
305
|
+
</data>
|
306
|
+
<data name=">>tableLayoutPanel.Name" xml:space="preserve">
|
307
|
+
<value>tableLayoutPanel</value>
|
308
|
+
</data>
|
309
|
+
<data name="tableLayoutPanel.TabIndex" type="System.Int32, mscorlib">
|
310
|
+
<value>0</value>
|
311
|
+
</data>
|
312
|
+
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
313
|
+
<value>True</value>
|
314
|
+
</metadata>
|
315
|
+
<metadata name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
316
|
+
<value>English (United States)</value>
|
317
|
+
</metadata>
|
318
|
+
</root>
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Collections;
|
3
|
+
using System.Resources;
|
4
|
+
|
5
|
+
/// Build via 'mcs DumpResources.cs'
|
6
|
+
public class DumpResources
|
7
|
+
{
|
8
|
+
public static void Main(string[] args)
|
9
|
+
{
|
10
|
+
ResourceReader rdr = new ResourceReader(args[0]);
|
11
|
+
Console.WriteLine(rdr.GetType());
|
12
|
+
IDictionaryEnumerator dict = rdr.GetEnumerator();
|
13
|
+
while (dict.MoveNext()) {
|
14
|
+
Console.WriteLine("{0}: '{1}' (Type {2})",
|
15
|
+
dict.Key, dict.Value, dict.Value.GetType().Name);
|
16
|
+
}
|
17
|
+
rdr.Close();
|
18
|
+
}
|
19
|
+
}
|
metadata
ADDED
@@ -0,0 +1,237 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ms-binary-resources
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nick Veys
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: awesome_print
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ci_reporter
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.9'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.9'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.99'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.99'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-checkstyle_formatter
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
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: simplecov-gem-adapter
|
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'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov-rcov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: yard
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
description: ''
|
182
|
+
email:
|
183
|
+
- nick@codelever.com
|
184
|
+
executables: []
|
185
|
+
extensions: []
|
186
|
+
extra_rdoc_files: []
|
187
|
+
files:
|
188
|
+
- ".gitignore"
|
189
|
+
- ".rspec"
|
190
|
+
- ".rubocop.yml"
|
191
|
+
- ".ruby-version"
|
192
|
+
- ".travis.yml"
|
193
|
+
- Gemfile
|
194
|
+
- LICENSE.txt
|
195
|
+
- README.md
|
196
|
+
- Rakefile
|
197
|
+
- lib/ms/binary/resources.rb
|
198
|
+
- lib/ms/binary/resources/constants.rb
|
199
|
+
- lib/ms/binary/resources/reader.rb
|
200
|
+
- lib/ms/binary/resources/version.rb
|
201
|
+
- ms-binary-resources.gemspec
|
202
|
+
- spec/reader_spec.rb
|
203
|
+
- spec/spec_helper.rb
|
204
|
+
- support/data/Example.resources
|
205
|
+
- support/data/Example.txt
|
206
|
+
- support/data/Example2.resources
|
207
|
+
- support/data/Example2.resx
|
208
|
+
- support/data/invalid/derp.bin
|
209
|
+
- support/dump-resources/DumpResources.cs
|
210
|
+
homepage: https://github.com/code-lever/ms-binary-resources
|
211
|
+
licenses:
|
212
|
+
- MIT
|
213
|
+
metadata: {}
|
214
|
+
post_install_message:
|
215
|
+
rdoc_options: []
|
216
|
+
require_paths:
|
217
|
+
- lib
|
218
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
224
|
+
requirements:
|
225
|
+
- - ">="
|
226
|
+
- !ruby/object:Gem::Version
|
227
|
+
version: '0'
|
228
|
+
requirements: []
|
229
|
+
rubyforge_project:
|
230
|
+
rubygems_version: 2.2.2
|
231
|
+
signing_key:
|
232
|
+
specification_version: 4
|
233
|
+
summary: Read binary resource files
|
234
|
+
test_files:
|
235
|
+
- spec/reader_spec.rb
|
236
|
+
- spec/spec_helper.rb
|
237
|
+
has_rdoc:
|