dmap-ng 0.2.5
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.md +130 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/dmap-ng.gemspec +69 -0
- data/lib/debug_ext.rb +13 -0
- data/lib/dmap-ng.rb +1 -0
- data/lib/dmap.rb +26 -0
- data/lib/dmap/parser.rb +44 -0
- data/lib/dmap/tag.rb +93 -0
- data/lib/dmap/tag_builder.rb +24 -0
- data/lib/dmap/tag_definitions.rb +426 -0
- data/lib/true_false_ext.rb +11 -0
- data/spec/dmap_spec.rb +88 -0
- data/spec/dsl_spec.rb +137 -0
- data/spec/packet_dumps/connection_with_voting.dump +0 -0
- data/spec/parser_spec.rb +96 -0
- data/spec/selector_spec.rb +57 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- metadata +101 -0
data/spec/dmap_spec.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'dmap'
|
3
|
+
|
4
|
+
# Time to add your specs!
|
5
|
+
# http://rspec.info/
|
6
|
+
describe DMAP do
|
7
|
+
describe ".build" do
|
8
|
+
it "builds correctly" do
|
9
|
+
server_info = DMAP.build do
|
10
|
+
msrv do
|
11
|
+
mstt 200 # Status
|
12
|
+
mpro(0,2,0,6) # DMAP protocol version
|
13
|
+
apro(0,3,0,8) # DAAP protocol version
|
14
|
+
aeSV(0,3,0,1) # iTunes sharing version
|
15
|
+
aeFP true # ??
|
16
|
+
ated 3 # ??, 3 in euphony
|
17
|
+
msed false # ??, true in euphony
|
18
|
+
msml do # Magic fucking numbers.
|
19
|
+
msma 224677167504896 # euphony has 71359108752128
|
20
|
+
msma 219298093276928 # euphony has 1102738509824
|
21
|
+
msma 183156896570880 #euphony has 8799319904256
|
22
|
+
end
|
23
|
+
ceWM 'sup' # Welcome message
|
24
|
+
ceVO true # Voting?
|
25
|
+
minm "chendo\342\200\231s Library" # Server name
|
26
|
+
mslr true # ??
|
27
|
+
mstm 1800 # Timeout
|
28
|
+
msal true # ??
|
29
|
+
msas 3 # ??
|
30
|
+
msup true # ??
|
31
|
+
mspi true # ??
|
32
|
+
msex true # ??
|
33
|
+
msbr true # ??
|
34
|
+
msqy true # ??
|
35
|
+
msix true # ??
|
36
|
+
msrs true # ??
|
37
|
+
msdc 1 # Database count?
|
38
|
+
|
39
|
+
mstc Time.at(1271418369) # Current time
|
40
|
+
msto 36000 # UTC Offset
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
server_info.to_dmap.should == "msrv\000\000\001<mstt\000\000\000\004\000\000\000\310mpro\000\000\000\004\000\002\000\006apro\000\000\000\004\000\003\000\baeSV\000\000\000\004\000\003\000\001aeFP\000\000\000\001\001ated\000\000\000\002\000\003msed\000\000\000\001\000msml\000\000\0000msma\000\000\000\b\000\000\314W\272\302\036\000msma\000\000\000\b\000\000\307sP\363\037\000msma\000\000\000\b\000\000\246\224\211\302\036\000ceWM\000\000\000\003supceVO\000\000\000\001\001minm\000\000\000\022chendo\342\200\231s Librarymslr\000\000\000\001\001mstm\000\000\000\004\000\000\a\bmsal\000\000\000\001\001msas\000\000\000\001\003msup\000\000\000\001\001mspi\000\000\000\001\001msex\000\000\000\001\001msbr\000\000\000\001\001msqy\000\000\000\001\001msix\000\000\000\001\001msrs\000\000\000\001\001msdc\000\000\000\004\000\000\000\001mstc\000\000\000\004K\310N\001msto\000\000\000\004\000\000\214\240"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".parse" do
|
49
|
+
it "parses server info data" do
|
50
|
+
expected = DMAP.build do
|
51
|
+
msrv do
|
52
|
+
mstt 200 # Status
|
53
|
+
mpro(0,2,0,6) # DMAP protocol version
|
54
|
+
apro(0,3,0,8) # DAAP protocol version
|
55
|
+
aeSV(0,3,0,1) # iTunes sharing version
|
56
|
+
aeFP true # ??
|
57
|
+
ated 3 # ??, 3 in euphony
|
58
|
+
msed false # ??, true in euphony
|
59
|
+
msml do # Magic fucking numbers.
|
60
|
+
msma 224677167504896 # euphony has 71359108752128
|
61
|
+
msma 219298093276928 # euphony has 1102738509824
|
62
|
+
msma 183156896570880 #euphony has 8799319904256
|
63
|
+
end
|
64
|
+
ceWM 'sup' # Welcome message
|
65
|
+
ceVO true # Voting?
|
66
|
+
minm "chendo\342\200\231s Library" # Server name
|
67
|
+
mslr true # ??
|
68
|
+
mstm 1800 # Timeout
|
69
|
+
msal true # ??
|
70
|
+
msas 3 # ??
|
71
|
+
msup true # ??
|
72
|
+
mspi true # ??
|
73
|
+
msex true # ??
|
74
|
+
msbr true # ??
|
75
|
+
msqy true # ??
|
76
|
+
msix true # ??
|
77
|
+
msrs true # ??
|
78
|
+
msdc 1 # Database count?
|
79
|
+
|
80
|
+
mstc Time.at(1271418369) # Current time
|
81
|
+
msto 36000 # UTC Offset
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
expected.should == DMAP.parse("msrv\000\000\001<mstt\000\000\000\004\000\000\000\310mpro\000\000\000\004\000\002\000\006apro\000\000\000\004\000\003\000\baeSV\000\000\000\004\000\003\000\001aeFP\000\000\000\001\001ated\000\000\000\002\000\003msed\000\000\000\001\000msml\000\000\0000msma\000\000\000\b\000\000\314W\272\302\036\000msma\000\000\000\b\000\000\307sP\363\037\000msma\000\000\000\b\000\000\246\224\211\302\036\000ceWM\000\000\000\003supceVO\000\000\000\001\001minm\000\000\000\022chendo\342\200\231s Librarymslr\000\000\000\001\001mstm\000\000\000\004\000\000\a\bmsal\000\000\000\001\001msas\000\000\000\001\003msup\000\000\000\001\001mspi\000\000\000\001\001msex\000\000\000\001\001msbr\000\000\000\001\001msqy\000\000\000\001\001msix\000\000\000\001\001msrs\000\000\000\001\001msdc\000\000\000\004\000\000\000\001mstc\000\000\000\004K\310N\001msto\000\000\000\004\000\000\214\240")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/spec/dsl_spec.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "DSLs" do
|
4
|
+
describe "#to_dsl" do
|
5
|
+
it "returns a DSL string" do
|
6
|
+
DMAP.build do
|
7
|
+
cmgt do
|
8
|
+
mstt 200 # Status
|
9
|
+
cmvo 88 # Volume
|
10
|
+
end
|
11
|
+
end.to_dsl.should == <<-STR.gsub(/^ /, '').strip
|
12
|
+
cmgt do # unknown.list
|
13
|
+
mstt 200 # dmap.status
|
14
|
+
cmvo 88 # dmcp.volume
|
15
|
+
end
|
16
|
+
STR
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe ".build" do
|
21
|
+
it "must be able to handle empty list tags" do
|
22
|
+
lambda {
|
23
|
+
DMAP.build do
|
24
|
+
mlcl do
|
25
|
+
end
|
26
|
+
end
|
27
|
+
}.should_not raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should throw an exception on unknown tags" do
|
31
|
+
lambda {
|
32
|
+
DMAP.build do
|
33
|
+
derp do
|
34
|
+
hurr "durr"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
}.should raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it "works with Array#each" do
|
41
|
+
DMAP.build do
|
42
|
+
apso do
|
43
|
+
mlcl do
|
44
|
+
%w(foo bar).each do |name|
|
45
|
+
mlit do
|
46
|
+
cann name
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end.should == DMAP.build do
|
52
|
+
apso do
|
53
|
+
mlcl do
|
54
|
+
mlit do
|
55
|
+
cann 'foo'
|
56
|
+
end
|
57
|
+
mlit do
|
58
|
+
cann 'bar'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it "handles the special case for ceJV" do
|
66
|
+
# ceJV is a 4 byte integer field but seems to store the value as a short in the first two bytes
|
67
|
+
DMAP.build do
|
68
|
+
mlit do # dmap.listingitem
|
69
|
+
mikd 2 # dmap.itemkind
|
70
|
+
asal "Aquarium" # daap.songalbum
|
71
|
+
asar "Naomi" # daap.songartist
|
72
|
+
miid 3123 # dmap.itemid
|
73
|
+
minm "Relax She Said" # dmap.itemname
|
74
|
+
mper 9013529250002063060 # dmap.persistentid
|
75
|
+
mcti 10386 # dmap.containeritemid
|
76
|
+
aeHV 0 # com.apple.itunes.has-video
|
77
|
+
asai 9013529250002063588 # daap.songalbumid
|
78
|
+
ceJV 2 # com.apple.itunes.jukebox-vote
|
79
|
+
ceJC 1 # com.apple.itunes.jukebox-client-vote
|
80
|
+
end
|
81
|
+
end.to_dmap.should == "mlit\000\000\000\222mikd\000\000\000\001\002asal\000\000\000\bAquariumasar\000\000\000\005Naomimiid\000\000\000\004\000\000\f3minm\000\000\000\016Relax She Saidmper\000\000\000\b}\026}\030\336\367N\324mcti\000\000\000\004\000\000(\222aeHV\000\000\000\001\000asai\000\000\000\b}\026}\030\336\367P\344ceJV\000\000\000\004\000\002\000\000ceJC\000\000\000\001\001"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "builds a valid /databases aply tag" do
|
85
|
+
DMAP.build do
|
86
|
+
aply do
|
87
|
+
mstt 200 # Status
|
88
|
+
muty 0 # Update type
|
89
|
+
mtco 2 # Total count
|
90
|
+
mrco 2 # Return count
|
91
|
+
mlcl do # Container
|
92
|
+
mlit do # Container item
|
93
|
+
miid 10310 # Item ID
|
94
|
+
mper 123 # Persistent ID
|
95
|
+
minm 'Music' # Container name
|
96
|
+
aeSP true # Smart playlist
|
97
|
+
mpco 0 # Parent ID, so therefore parent container
|
98
|
+
aePS 6 # Special playlist type/ID
|
99
|
+
meds 0 # Edit commands supported
|
100
|
+
mimc 2 # Item/Song count
|
101
|
+
end
|
102
|
+
mlit do # Container item
|
103
|
+
miid 10281
|
104
|
+
mper 1234
|
105
|
+
minm 'iTunes DJ'
|
106
|
+
mpco 0 # Parent ID
|
107
|
+
aePS 2 # Spcial playlist type/ID
|
108
|
+
meds 0 # Edit commands supported
|
109
|
+
ceJI 0x282c # Current jukebox song ID?
|
110
|
+
mimc 18 # Item/song count
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
it "builds a valid caci tag" do
|
118
|
+
DMAP.build do
|
119
|
+
caci do # Some container
|
120
|
+
mstt 200 # Status
|
121
|
+
muty 0 # Update type
|
122
|
+
mtco 1 # Total count
|
123
|
+
mrco 1 # Return count
|
124
|
+
mlcl do # Container
|
125
|
+
mlit do # Container item
|
126
|
+
miid 1 # ID
|
127
|
+
cmik 1 # ??
|
128
|
+
cmsp 1 # ??
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end.to_dmap
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
end
|
Binary file
|
data/spec/parser_spec.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'dmap'
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
+
|
4
|
+
describe DMAP::Parser do
|
5
|
+
describe "#initialize" do
|
6
|
+
it "parses a simple DMAP" do
|
7
|
+
DMAP.parse("ceWM\000\000\000\003sup").should == DMAP.build do
|
8
|
+
ceWM 'sup'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "parses a nested DMAP" do
|
13
|
+
DMAP.parse("msml\000\000\0000msma\000\000\000\b\000\000\314W\272\302\036\000msma\000\000\000\b\000\000\307sP\363\037\000").should == DMAP.build do
|
14
|
+
msml do
|
15
|
+
msma 224677167504896
|
16
|
+
msma 219298093276928
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "new tags" do
|
22
|
+
it "parses mlit (playlist entry)" do
|
23
|
+
DMAP.parse("mlit\000\000\000\222mikd\000\000\000\001\002asal\000\000\000\bAquariumasar\000\000\000\005Naomimiid\000\000\000\004\000\000\f3minm\000\000\000\016Relax She Saidmper\000\000\000\b}\026}\030\336\367N\324mcti\000\000\000\004\000\000(\222aeHV\000\000\000\001\000asai\000\000\000\b}\026}\030\336\367P\344ceJV\000\000\000\004\000\002\000\000ceJC\000\000\000\001\001").should == DMAP.build do
|
24
|
+
|
25
|
+
mlit do # dmap.listingitem
|
26
|
+
mikd 2 # dmap.itemkind
|
27
|
+
asal "Aquarium" # daap.songalbum
|
28
|
+
asar "Naomi" # daap.songartist
|
29
|
+
miid 3123 # dmap.itemid
|
30
|
+
minm "Relax She Said" # dmap.itemname
|
31
|
+
mper 9013529250002063060 # dmap.persistentid
|
32
|
+
mcti 10386 # dmap.containeritemid
|
33
|
+
aeHV 0 # com.apple.itunes.has-video
|
34
|
+
asai 9013529250002063588 # daap.songalbumid
|
35
|
+
ceJV 2 # com.apple.itunes.jukebox-vote
|
36
|
+
ceJC 1 # com.apple.itunes.jukebox-client-vote
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
it "parses cgmt" do
|
43
|
+
DMAP.parse("cmgt\000\000\000\030mstt\000\000\000\004\000\000\000\310cmvo\000\000\000\004\000\000\000X"
|
44
|
+
).should == DMAP.build do
|
45
|
+
cmgt do
|
46
|
+
mstt 200 # Status
|
47
|
+
cmvo 88 # Volume
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "parses caci" do
|
53
|
+
DMAP.parse("caci\000\000\000[mstt\000\000\000\004\000\000\000\310muty\000\000\000\001\000mtco\000\000\000\004\000\000\000\001mrco\000\000\000\004\000\000\000\001mlcl\000\000\000&mlit\000\000\000\036miid\000\000\000\004\000\000\000\001cmik\000\000\000\001\001cmsp\000\000\000\001\001").should == DMAP.build do
|
54
|
+
caci do # Some container
|
55
|
+
mstt 200 # Status
|
56
|
+
muty 0 # Update type
|
57
|
+
mtco 1 # Total count
|
58
|
+
mrco 1 # Return count
|
59
|
+
mlcl do # Container
|
60
|
+
mlit do # Container item
|
61
|
+
miid 1 # ID
|
62
|
+
cmik 1 # ??
|
63
|
+
cmsp 1 # ??
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it "parses cmst (player status)" do
|
71
|
+
DMAP.parse("cmst\000\000\001%mstt\000\000\000\004\000\000\000\310cmsr\000\000\000\004\000\000\000'caps\000\000\000\001\003cash\000\000\000\001\000carp\000\000\000\001\000cavc\000\000\000\001\001caas\000\000\000\004\000\000\000\002caar\000\000\000\004\000\000\000\006canp\000\000\000\020\000\000\000'\000\000(F\000\000(\266\000\000\016\375cann\000\000\000/Who Needs Forever? (Thievery Corporation remix)cana\000\000\000\017Astrud Gilbertocanl\000\000\000\rVerve Remixedcang\000\000\000\021Electronica/Danceasai\000\000\000\b}\026}\030\336\367Q\035cmmk\000\000\000\004\000\000\000\001ceGS\000\000\000\001\001cant\000\000\000\004\000\002 Gcast\000\000\000\004\000\003\335\024").should == DMAP.build do
|
72
|
+
cmst do
|
73
|
+
mstt 200 # Status
|
74
|
+
cmsr 39 # Revision
|
75
|
+
caps 3 # Player state
|
76
|
+
cash 0 # Shuffle state
|
77
|
+
carp 0 # Repeat state
|
78
|
+
cavc 1 # Volume controllable
|
79
|
+
caas 2 # Avaliable shuffle states
|
80
|
+
caar 6 # Avaliable repeat states
|
81
|
+
canp "\000\000\000'\000\000(F\000\000(\266\000\000\016\375" # ??
|
82
|
+
cann "Who Needs Forever? (Thievery Corporation remix)" # Track name
|
83
|
+
cana "Astrud Gilberto" # Track artist
|
84
|
+
canl "Verve Remixed" # Track album
|
85
|
+
cang "Electronica/Dance" # Track genre
|
86
|
+
asai 9013529250002063645 # ??
|
87
|
+
cmmk 1 # ??
|
88
|
+
ceGS 1 # ?? something to do with DJ
|
89
|
+
cant 139335 # elapsed play time in milliseconds
|
90
|
+
cast 253204 # total play time in milliseconds
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Selectors" do
|
4
|
+
subject do
|
5
|
+
@expected = DMAP.build do
|
6
|
+
caci do # Some container
|
7
|
+
mstt 200 # Status
|
8
|
+
muty 0 # Update type
|
9
|
+
mtco 1 # Total count
|
10
|
+
mrco 1 # Return count
|
11
|
+
ceWM 'some string'
|
12
|
+
mlcl do # Container
|
13
|
+
mlit do # Container item
|
14
|
+
miid 1 # ID
|
15
|
+
cmik 1 # ??
|
16
|
+
cmsp 1 # ??
|
17
|
+
end
|
18
|
+
mlit do # Container item
|
19
|
+
miid 2 # ID
|
20
|
+
cmik 1 # ??
|
21
|
+
cmsp 1 # ??
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "selects individual tags" do
|
29
|
+
subject.mstt.should == 200
|
30
|
+
subject.ceWM.should == 'some string'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "selects array tags" do
|
34
|
+
subject.mlcl.should == DMAP.build do
|
35
|
+
mlit do # Container item
|
36
|
+
miid 1 # ID
|
37
|
+
cmik 1 # ??
|
38
|
+
cmsp 1 # ??
|
39
|
+
end
|
40
|
+
mlit do # Container item
|
41
|
+
miid 2 # ID
|
42
|
+
cmik 1 # ??
|
43
|
+
cmsp 1 # ??
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "selects array elements" do
|
49
|
+
subject.mlcl[0].should == DMAP.build do
|
50
|
+
mlit do # Container item
|
51
|
+
miid 1 # ID
|
52
|
+
cmik 1 # ??
|
53
|
+
cmsp 1 # ??
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dmap-ng
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 5
|
9
|
+
version: 0.2.5
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Jack Chen
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-04-19 00:00:00 +10:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 2
|
30
|
+
- 9
|
31
|
+
version: 1.2.9
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
description: An improved DMAP gem that allows easy building and parsing of DMAP structures
|
35
|
+
email: chendo@chendo.net
|
36
|
+
executables: []
|
37
|
+
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files:
|
41
|
+
- LICENSE
|
42
|
+
- README.md
|
43
|
+
files:
|
44
|
+
- .document
|
45
|
+
- .gitignore
|
46
|
+
- LICENSE
|
47
|
+
- README.md
|
48
|
+
- Rakefile
|
49
|
+
- VERSION
|
50
|
+
- dmap-ng.gemspec
|
51
|
+
- lib/debug_ext.rb
|
52
|
+
- lib/dmap-ng.rb
|
53
|
+
- lib/dmap.rb
|
54
|
+
- lib/dmap/parser.rb
|
55
|
+
- lib/dmap/tag.rb
|
56
|
+
- lib/dmap/tag_builder.rb
|
57
|
+
- lib/dmap/tag_definitions.rb
|
58
|
+
- lib/true_false_ext.rb
|
59
|
+
- spec/dmap_spec.rb
|
60
|
+
- spec/dsl_spec.rb
|
61
|
+
- spec/packet_dumps/connection_with_voting.dump
|
62
|
+
- spec/parser_spec.rb
|
63
|
+
- spec/selector_spec.rb
|
64
|
+
- spec/spec.opts
|
65
|
+
- spec/spec_helper.rb
|
66
|
+
has_rdoc: true
|
67
|
+
homepage: http://github.com/chendo/dmap-ng
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options:
|
72
|
+
- --charset=UTF-8
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
version: "0"
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.3.6
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: An improved DMAP gem that allows easy building and parsing of DMAP structures
|
96
|
+
test_files:
|
97
|
+
- spec/dmap_spec.rb
|
98
|
+
- spec/dsl_spec.rb
|
99
|
+
- spec/parser_spec.rb
|
100
|
+
- spec/selector_spec.rb
|
101
|
+
- spec/spec_helper.rb
|