dmapparser 0.0.2 → 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 +4 -4
- data/Gemfile +2 -2
- data/Rakefile +1 -1
- data/dmapparser.gemspec +1 -1
- data/lib/dmapparser/builder.rb +2 -2
- data/lib/dmapparser/converter.rb +6 -8
- data/lib/dmapparser/parser.rb +2 -3
- data/lib/dmapparser/tag.rb +8 -0
- data/lib/dmapparser/tag_container.rb +5 -9
- data/lib/dmapparser/version.rb +1 -1
- data/test/lib/dmapparser/converter_test.rb +38 -0
- data/test/lib/dmapparser/parser_test.rb +4 -1
- data/test/lib/dmapparser/tag_container_test.rb +14 -0
- data/test/lib/dmapparser/tag_test.rb +14 -0
- data/test/test_helper.rb +4 -5
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68b7396a6898eeefafa26e430022b49d3b281115
|
4
|
+
data.tar.gz: d0188b16664b041ca72ba713dafa45aafbf919d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a339caec989bebaecb8792e3b3ddd09fca8305822a32690bb5da872af5efc68e5362f94781a51279dd8cd3064b88b85a4f8f123ebfa5350c984c5a9a4b2491e
|
7
|
+
data.tar.gz: d09b9ba744cee11dbe7ea60c49607905aef822d9c61bb23e5352b2c337813a675517e655a54d3673bd2d8de222aadb61053f5aed4bbc935cb2dc2857674c1d20
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -16,7 +16,7 @@ task :rubocop do
|
|
16
16
|
puts "Running Rubocop #{Rubocop::Version::STRING}"
|
17
17
|
args = FileList['**/*.rb', 'Rakefile', 'dmapparser.gemspec', 'Gemfile']
|
18
18
|
cli = Rubocop::CLI.new
|
19
|
-
|
19
|
+
cli.run(args)
|
20
20
|
end
|
21
21
|
|
22
22
|
task default: :test
|
data/dmapparser.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = DMAPParser::VERSION
|
9
9
|
spec.authors = ['Jurriaan Pruis']
|
10
10
|
spec.email = ['email@jurriaanpruis.nl']
|
11
|
-
spec.summary = %q
|
11
|
+
spec.summary = %q(Parses DMAP data)
|
12
12
|
spec.homepage = 'https://github.com/jurriaan/dmapparser'
|
13
13
|
spec.license = 'MIT'
|
14
14
|
spec.platform = Gem::Platform::RUBY
|
data/lib/dmapparser/builder.rb
CHANGED
@@ -16,7 +16,7 @@ module DMAPParser
|
|
16
16
|
tag = TagDefinition[method]
|
17
17
|
return super if tag.nil?
|
18
18
|
|
19
|
-
if block_given?
|
19
|
+
if block_given? || tag.container?
|
20
20
|
fail "Tag #{tag} is not a container type" unless tag.container?
|
21
21
|
build_container(tag, &block)
|
22
22
|
else
|
@@ -35,7 +35,7 @@ module DMAPParser
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
def build_container(tag
|
38
|
+
def build_container(tag, &block)
|
39
39
|
@dmap_stack << TagContainer.new(tag)
|
40
40
|
instance_exec(&block)
|
41
41
|
if @dmap_stack.length > 1
|
data/lib/dmapparser/converter.rb
CHANGED
@@ -3,7 +3,7 @@ module DMAPParser
|
|
3
3
|
class Converter
|
4
4
|
class << self
|
5
5
|
def date_to_bin(data)
|
6
|
-
int_to_bin(
|
6
|
+
int_to_bin(data.to_i)
|
7
7
|
end
|
8
8
|
|
9
9
|
def bin_to_byte(data)
|
@@ -11,7 +11,7 @@ module DMAPParser
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def bin_to_long(data)
|
14
|
-
(bin_to_int(data[0..3]) << 32)
|
14
|
+
(bin_to_int(data[0..3]) << 32) | bin_to_int(data[4..7])
|
15
15
|
end
|
16
16
|
|
17
17
|
def bin_to_int(data)
|
@@ -31,7 +31,7 @@ module DMAPParser
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def bin_to_hex(data)
|
34
|
-
data.bytes.reduce('') { |a, e| a +
|
34
|
+
data.bytes.reduce('') { |a, e| a + format('%02X', e) }
|
35
35
|
end
|
36
36
|
|
37
37
|
def bin_to_date(data)
|
@@ -51,7 +51,7 @@ module DMAPParser
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def long_to_bin(data)
|
54
|
-
[data >> 32, data &
|
54
|
+
[data >> 32, data & 0xFFFFFFFF].pack 'NN'
|
55
55
|
end
|
56
56
|
|
57
57
|
def short_to_bin(data)
|
@@ -59,7 +59,7 @@ module DMAPParser
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def version_to_bin(data)
|
62
|
-
data.split('.').pack 'nCC'
|
62
|
+
data.split('.').map { |part| part.to_i }.pack 'nCC'
|
63
63
|
end
|
64
64
|
|
65
65
|
def hex_to_bin(data)
|
@@ -108,7 +108,6 @@ module DMAPParser
|
|
108
108
|
if respond_to? decode_method
|
109
109
|
send(decode_method, data)
|
110
110
|
else
|
111
|
-
warn "Decoder: Unknown type #{type}"
|
112
111
|
decode_unknown(data)
|
113
112
|
end
|
114
113
|
end
|
@@ -118,8 +117,7 @@ module DMAPParser
|
|
118
117
|
if respond_to? encode_method
|
119
118
|
send(encode_method, data)
|
120
119
|
else
|
121
|
-
|
122
|
-
data
|
120
|
+
data # This only works for strings..
|
123
121
|
end
|
124
122
|
end
|
125
123
|
end
|
data/lib/dmapparser/parser.rb
CHANGED
@@ -14,14 +14,13 @@ module DMAPParser
|
|
14
14
|
def initialize(response)
|
15
15
|
@response = response
|
16
16
|
@response = StringIO.new(response) unless @response.is_a? IO
|
17
|
-
@response.set_encoding(Encoding::BINARY)
|
17
|
+
@response.set_encoding(Encoding::BINARY)
|
18
18
|
end
|
19
19
|
|
20
20
|
def parse
|
21
21
|
return nil if @response.nil? || @response.size == 0
|
22
22
|
fail ParseError if @response.size < 8
|
23
|
-
ret = TagContainer.new
|
24
|
-
ret.type = TagDefinition[read_key]
|
23
|
+
ret = TagContainer.new(read_key)
|
25
24
|
fail ParseError if ret.type && !ret.type.container?
|
26
25
|
ret.value = parse_container(read_length)
|
27
26
|
ret
|
data/lib/dmapparser/tag.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
module DMAPParser
|
2
2
|
# The Tag class
|
3
3
|
class Tag < Struct.new(:type, :value)
|
4
|
+
def initialize(type, value)
|
5
|
+
unless type.is_a? TagDefinition
|
6
|
+
type = TagDefinition[type] ||
|
7
|
+
TagDefinition.new(type, :unknown, "unknown (#{length})")
|
8
|
+
end
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
4
12
|
def to_s
|
5
13
|
"#<#{self.class.name} #{type}>"
|
6
14
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module DMAPParser
|
2
2
|
# The TagContainer class is a Tag which contains other Tags
|
3
3
|
class TagContainer < Tag
|
4
|
-
def initialize(type
|
5
|
-
super
|
4
|
+
def initialize(type, value = [])
|
5
|
+
super
|
6
6
|
end
|
7
7
|
|
8
8
|
def inspect(level = 0)
|
@@ -14,12 +14,8 @@ module DMAPParser
|
|
14
14
|
def get_value(key)
|
15
15
|
return value[key] if key.is_a? Fixnum
|
16
16
|
tag = get_tag(key)
|
17
|
-
|
18
|
-
|
19
|
-
tag
|
20
|
-
elsif !tag.nil?
|
21
|
-
tag.value
|
22
|
-
end
|
17
|
+
return unless tag
|
18
|
+
tag.type.container? ? tag : tag.value
|
23
19
|
end
|
24
20
|
|
25
21
|
def get_tag(key)
|
@@ -39,7 +35,7 @@ module DMAPParser
|
|
39
35
|
elsif has?(method)
|
40
36
|
get_value(method)
|
41
37
|
else
|
42
|
-
|
38
|
+
nil
|
43
39
|
end
|
44
40
|
end
|
45
41
|
|
data/lib/dmapparser/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe DMAPParser::Converter do
|
4
|
+
it 'should return the original output again' do
|
5
|
+
time = Time.now
|
6
|
+
klass = DMAPParser::Converter
|
7
|
+
klass.bin_to_date(klass.date_to_bin(time)).to_i.must_equal time.to_i
|
8
|
+
klass.bin_to_bool(klass.bool_to_bin(true)).must_equal true
|
9
|
+
klass.bin_to_int(klass.int_to_bin(90000)).must_equal 90000
|
10
|
+
klass.bin_to_byte(klass.byte_to_bin(190)).must_equal 190
|
11
|
+
klass.bin_to_long(klass.long_to_bin(3**25)).must_equal 3**25
|
12
|
+
klass.bin_to_version(klass.version_to_bin('1322.200.3')).must_equal '1322.200.3'
|
13
|
+
klass.bin_to_short(klass.short_to_bin(19007)).must_equal 19007
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should automatically convert numerics' do
|
17
|
+
klass = DMAPParser::Converter
|
18
|
+
byte = klass.byte_to_bin(244)
|
19
|
+
short = klass.short_to_bin(244)
|
20
|
+
int = klass.int_to_bin(244)
|
21
|
+
long = klass.long_to_bin(244)
|
22
|
+
klass.data_to_numeric(byte).must_equal(244)
|
23
|
+
klass.data_to_numeric(short).must_equal(244)
|
24
|
+
klass.data_to_numeric(int).must_equal(244)
|
25
|
+
klass.data_to_numeric(long).must_equal(244)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should decode unknown types' do
|
29
|
+
klass = DMAPParser::Converter
|
30
|
+
byte = klass.byte_to_bin(244)
|
31
|
+
klass.decode(:ZZZZ, byte).must_equal 244
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should encode unknown strings' do
|
35
|
+
klass = DMAPParser::Converter
|
36
|
+
klass.encode(:ZZZZ, 'aaa').must_equal 'aaa'
|
37
|
+
end
|
38
|
+
end
|
@@ -3,8 +3,11 @@ require_relative '../../test_helper'
|
|
3
3
|
describe DMAPParser::Parser do
|
4
4
|
it 'should raise a ParserError when given invalid data' do
|
5
5
|
invalid = []
|
6
|
-
|
6
|
+
20.times do
|
7
|
+
invalid << (0..255).map { |c| c.chr }.join # random data
|
8
|
+
end
|
7
9
|
invalid << "rand\x00\x00\x00\x01" # non correct size
|
10
|
+
invalid << "mcon\x00\x00\x00\x05rand\x09" # wrong tag size
|
8
11
|
invalid << "msup\x00\x00\x00\x01\x01" # not a container!
|
9
12
|
invalid << "rand\x00\x00\x00\x01\x01" # not a container!
|
10
13
|
invalid.each do |data|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe DMAPParser::TagContainer do
|
4
|
+
it 'should respond to known tags' do
|
5
|
+
subject = DMAPParser::TagContainer.new(:mcon,
|
6
|
+
[DMAPParser::Tag.new(:minm, 1337)])
|
7
|
+
subject.respond_to?(:unknown).must_equal false
|
8
|
+
subject.respond_to?(:minm).must_equal true
|
9
|
+
subject.minm.must_equal 1337
|
10
|
+
subject.unknown.must_equal nil
|
11
|
+
subject.inspect.must_include('minm')
|
12
|
+
subject.inspect.must_include('1337')
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe DMAPParser::Tag do
|
4
|
+
it 'should return the correct value' do
|
5
|
+
subject = DMAPParser::Tag.new(:minm, 'Test thing')
|
6
|
+
subject.value.must_equal 'Test thing'
|
7
|
+
subject.type.must_equal DMAPParser::TagDefinition[:minm]
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should be recognizable as a tag' do
|
11
|
+
subject = DMAPParser::Tag.new(:minm, 'Test thing')
|
12
|
+
subject.to_s.must_equal('#<DMAPParser::Tag minm (dmap.itemname: string)>')
|
13
|
+
end
|
14
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'simplecov'
|
2
2
|
require 'coveralls'
|
3
|
+
Coveralls.wear!
|
3
4
|
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
4
|
-
|
5
|
-
|
5
|
+
SimpleCov::Formatter::HTMLFormatter,
|
6
|
+
Coveralls::SimpleCov::Formatter
|
6
7
|
]
|
7
|
-
SimpleCov.start
|
8
|
-
# add_filter '/test/'
|
9
|
-
end
|
8
|
+
SimpleCov.start
|
10
9
|
gem 'minitest'
|
11
10
|
require 'minitest/autorun'
|
12
11
|
require 'minitest/hell'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dmapparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jurriaan Pruis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03
|
11
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- lib/dmapparser/version.rb
|
84
84
|
- test/.rubocop.yml
|
85
85
|
- test/lib/dmapparser/builder_test.rb
|
86
|
+
- test/lib/dmapparser/converter_test.rb
|
86
87
|
- test/lib/dmapparser/parser_test.rb
|
87
88
|
- test/lib/dmapparser/tag_container_test.rb
|
88
89
|
- test/lib/dmapparser/tag_test.rb
|
@@ -116,6 +117,7 @@ summary: Parses DMAP data
|
|
116
117
|
test_files:
|
117
118
|
- test/.rubocop.yml
|
118
119
|
- test/lib/dmapparser/builder_test.rb
|
120
|
+
- test/lib/dmapparser/converter_test.rb
|
119
121
|
- test/lib/dmapparser/parser_test.rb
|
120
122
|
- test/lib/dmapparser/tag_container_test.rb
|
121
123
|
- test/lib/dmapparser/tag_test.rb
|