sdp 0.2.4 → 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/ChangeLog.rdoc +7 -0
- data/README.rdoc +7 -11
- data/Rakefile +14 -2
- data/lib/sdp.rb +15 -10
- data/lib/sdp/description.rb +8 -6
- data/lib/sdp/parse_error.rb +2 -0
- data/lib/sdp/parser.rb +7 -1
- data/lib/sdp/runtime_error.rb +2 -0
- data/lib/sdp/version.rb +1 -2
- data/sdp.gemspec +3 -3
- data/spec/sdp/parser_spec.rb +16 -19
- data/spec/sdp_spec.rb +36 -28
- data/spec/spec_helper.rb +4 -2
- metadata +28 -29
- data/tasks/metrics.rake +0 -25
- data/tasks/roodi_config.yml +0 -14
- data/tasks/stats.rake +0 -13
data/ChangeLog.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
= sdp
|
2
2
|
|
3
|
-
*
|
3
|
+
* http://rubygems.org/gems/sdp
|
4
4
|
* {Documentation}[http://rubydoc.info/gems/sdp]
|
5
|
-
* {Email}[steve.loveless
|
5
|
+
* {Email}[mailto://steve.loveless@gmail.com]
|
6
6
|
|
7
7
|
== Description
|
8
8
|
|
@@ -126,16 +126,12 @@ to use for an SDP description.
|
|
126
126
|
== Requirements
|
127
127
|
|
128
128
|
* Rubies (tested, at least):
|
129
|
-
* 1.8.7-
|
130
|
-
* 1.9.
|
131
|
-
* 1.9.
|
132
|
-
* JRuby 1.5
|
129
|
+
* 1.8.7-p352
|
130
|
+
* 1.9.2-p290
|
131
|
+
* 1.9.3-p0
|
132
|
+
* JRuby 1.6.5
|
133
133
|
* Gems:
|
134
|
-
* parslet,
|
135
|
-
* Gems (development):
|
136
|
-
* bundler, ~> 1.0.0
|
137
|
-
* rspec, >= 2.6.0
|
138
|
-
* yard, >= 0.6.0
|
134
|
+
* parslet, >= 1.1.0
|
139
135
|
|
140
136
|
== Install
|
141
137
|
|
data/Rakefile
CHANGED
@@ -2,14 +2,26 @@ require 'rubygems'
|
|
2
2
|
require 'bundler/gem_tasks'
|
3
3
|
require 'rspec/core/rake_task'
|
4
4
|
require 'yard'
|
5
|
+
require 'code_statistics'
|
5
6
|
|
7
|
+
# RSpec & `gem test`
|
6
8
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
7
9
|
t.ruby_opts = "-w"
|
8
10
|
t.rspec_opts = ['--format', 'documentation', '--color']
|
9
11
|
end
|
10
12
|
task :test => :spec
|
11
13
|
|
14
|
+
# Yard
|
12
15
|
YARD::Rake::YardocTask.new
|
13
16
|
|
14
|
-
#
|
15
|
-
|
17
|
+
# code_statistics
|
18
|
+
STATS_DIRECTORIES = [
|
19
|
+
%w(Library lib/),
|
20
|
+
%w(Behavior\ tests features/),
|
21
|
+
%w(Unit\ tests spec/)
|
22
|
+
].collect { |name, dir| [ name, "#{dir}" ] }.select { |name, dir| File.directory?(dir) }
|
23
|
+
|
24
|
+
desc "Report code statistics (KLOCs, etc) from the application"
|
25
|
+
task :stats do
|
26
|
+
CodeStatistics.new(*STATS_DIRECTORIES).to_s
|
27
|
+
end
|
data/lib/sdp.rb
CHANGED
@@ -1,23 +1,28 @@
|
|
1
|
-
require 'sdp/version'
|
2
|
-
require 'sdp/description'
|
3
|
-
require 'sdp/parser'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/sdp/version')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/sdp/description')
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/sdp/parser')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/sdp/parse_error')
|
4
5
|
|
5
|
-
# The only use for this class is the
|
6
|
+
# The only use for this class is the +#parse+ method, which is in this
|
6
7
|
# base class solely for convenience. Other than this method, this
|
7
8
|
# base class doesn't really do anything.
|
8
9
|
class SDP
|
9
10
|
|
10
|
-
# Creates a parser and parses the given text in to an SDP::Description
|
11
|
+
# Creates a parser and parses the given text in to an +SDP::Description+
|
11
12
|
# object.
|
12
13
|
#
|
13
14
|
# @param [String] sdp_text The text from an SDP description.
|
14
15
|
# @return [SDP::Description] The object that represents the description
|
15
|
-
#
|
16
|
+
# that was parsed.
|
17
|
+
# @raise [SDP::ParseError] If parsing fails, raise an SDP::ParseError instead
|
18
|
+
# of a Parslet exception that might confuse SDP users.
|
16
19
|
def self.parse sdp_text
|
17
|
-
|
20
|
+
begin
|
21
|
+
sdp_hash = SDP::Parser.new.parse sdp_text
|
22
|
+
rescue Parslet::UnconsumedInput => ex
|
23
|
+
raise SDP::ParseError, ex
|
24
|
+
end
|
25
|
+
|
18
26
|
SDP::Description.new(sdp_hash)
|
19
27
|
end
|
20
28
|
end
|
21
|
-
|
22
|
-
# Reclass so we can raise our own Exceptions.
|
23
|
-
class SDP::RuntimeError < StandardError; end;
|
data/lib/sdp/description.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'erb'
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/runtime_error')
|
3
4
|
|
4
5
|
class SDP
|
5
6
|
PROTOCOL_VERSION = 0
|
6
7
|
|
7
|
-
# Represents an SDP description as defined in
|
8
|
+
# Represents an SDP description as defined in
|
9
|
+
# {RFC 4566}[http://tools.ietf.org/html/rfc4566]. This class allows
|
8
10
|
# for creating an object so you can, in turn, create a String that
|
9
11
|
# represents an SDP description. The String, then can be used by
|
10
12
|
# other protocols that depend on an SDP description.
|
11
13
|
#
|
12
|
-
# SDP::Description objects are initialized empty (i.e. no fields are
|
14
|
+
# +SDP::Description+ objects are initialized empty (i.e. no fields are
|
13
15
|
# defined), putting the onus on you to add fields in the proper order.
|
14
|
-
# After building the description up, call
|
16
|
+
# After building the description up, call +#to_s+ to render it. This
|
15
17
|
# will render the String with fields in order that they were added
|
16
18
|
# to the object, so be sure to add them according to spec!
|
17
19
|
class Description < Hash
|
@@ -31,7 +33,7 @@ class SDP
|
|
31
33
|
#
|
32
34
|
# @param [Symbol] field_type
|
33
35
|
# @return [] Returns whatever type the value is that's stored
|
34
|
-
#
|
36
|
+
# in the Hash key.
|
35
37
|
def define_read_field_method(field_type)
|
36
38
|
define_method field_type do
|
37
39
|
if field_type == :media_sections
|
@@ -99,7 +101,7 @@ class SDP
|
|
99
101
|
end
|
100
102
|
|
101
103
|
# @param [Hash] session_as_hash Pass this in to use these values instead
|
102
|
-
#
|
104
|
+
# of building your own from scratch.
|
103
105
|
def initialize(session_as_hash=nil)
|
104
106
|
if session_as_hash.nil?
|
105
107
|
self[:session_section] = {}
|
@@ -122,7 +124,7 @@ class SDP
|
|
122
124
|
super
|
123
125
|
end
|
124
126
|
|
125
|
-
# Turns the current SDP::Description object into the SDP description,
|
127
|
+
# Turns the current +SDP::Description+ object into the SDP description,
|
126
128
|
# ready to be used.
|
127
129
|
#
|
128
130
|
# @return [String] The SDP description.
|
data/lib/sdp/parser.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'sdp'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../sdp')
|
2
|
+
require 'rubygems'
|
2
3
|
require 'parslet'
|
3
4
|
|
4
5
|
# Class for parsing SDP description text, ideally when receiving as some sort
|
@@ -10,6 +11,11 @@ require 'parslet'
|
|
10
11
|
# the RFC 4566 implies that this description isn't valid (because that field is
|
11
12
|
# required). Instead ofraising an exception, the parser lets the
|
12
13
|
# SDP::Description class deal with this.
|
14
|
+
#
|
15
|
+
# Also, an object of this class parses key/value pairs, where, as a by-product
|
16
|
+
# of using +Parslet+, values end up being +Parslet::Slice+ objects. It's worth
|
17
|
+
# pointing out that while those are not Strings, they mostly behave like
|
18
|
+
# Strings. See the Parslet docs for more info.
|
13
19
|
class SDP::Parser < Parslet::Parser
|
14
20
|
# All of the fields
|
15
21
|
rule(:version) { str('v=') >> field_value.as(:protocol_version) >> eol }
|
data/lib/sdp/version.rb
CHANGED
data/sdp.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
that can be converted to text using}
|
13
13
|
s.email = %q{steve.loveless@gmail.com}
|
14
14
|
s.extra_rdoc_files = Dir.glob("*.rdoc")
|
15
|
-
s.files = Dir.glob("{features,lib,spec
|
15
|
+
s.files = Dir.glob("{features,lib,spec}/**/*") + Dir.glob("*.rdoc") +
|
16
16
|
%w(.gemtest .rspec .yardopts Gemfile Rakefile sdp.gemspec)
|
17
17
|
s.homepage = %q{http://github.com/turboladen/sdp}
|
18
18
|
s.licenses = %w(MIT)
|
@@ -20,13 +20,13 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.summary = %q{Parse and create SDP (Session Description Protocol) text based on RFC4566.}
|
21
21
|
s.test_files = Dir.glob("spec/**/*")
|
22
22
|
|
23
|
-
s.add_runtime_dependency(%q<parslet>, ["
|
23
|
+
s.add_runtime_dependency(%q<parslet>, [">= 1.1.0"])
|
24
24
|
|
25
25
|
s.add_development_dependency(%q<bundler>, ["> 1.0.0"])
|
26
26
|
s.add_development_dependency(%q<code_statistics>, ["~> 0.2.13"])
|
27
27
|
s.add_development_dependency(%q<cucumber>, ["~> 1.1.0"])
|
28
|
-
s.add_development_dependency(%q<metric_fu>, [">= 2.1.0"])
|
29
28
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
30
29
|
s.add_development_dependency(%q<rspec>, [">= 2.6.0"])
|
30
|
+
s.add_development_dependency(%q<simplecov>, [">= 0.5.0"])
|
31
31
|
s.add_development_dependency(%q<yard>, [">= 0.6.0"])
|
32
32
|
end
|
data/spec/sdp/parser_spec.rb
CHANGED
@@ -170,25 +170,22 @@ describe SDP::Parser do
|
|
170
170
|
it "all possible fields in 1 section" do
|
171
171
|
sdp = "m=audio 0 RTP/AVP 96\r\ni=Test info\r\nc=IN IP4 0.0.0.0\r\nb=AS:40\r\nk=prompt\r\na=rtpmap:96 MP4A-LATM/44100/2\r\na=fmtp:96 cpresent=0;config=400027200000\r\n"
|
172
172
|
sdp_hash = @parser.parse sdp
|
173
|
-
sdp_hash[:media_sections].first
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
"fmtp"
|
190
|
-
sdp_hash[:media_sections].first[:attributes].last[:value].should ==
|
191
|
-
"96 cpresent=0;config=400027200000"
|
173
|
+
first_media_section = sdp_hash[:media_sections].first
|
174
|
+
first_media_section[:media].should == "audio"
|
175
|
+
first_media_section[:port].should == "0"
|
176
|
+
first_media_section[:protocol].should == "RTP/AVP"
|
177
|
+
first_media_section[:format].should == "96"
|
178
|
+
first_media_section[:information].should == "Test info"
|
179
|
+
first_media_section[:connection_network_type].should == "IN"
|
180
|
+
first_media_section[:connection_address_type].should == "IP4"
|
181
|
+
first_media_section[:connection_address].should == "0.0.0.0"
|
182
|
+
first_media_section[:bandwidth_type].should == "AS"
|
183
|
+
first_media_section[:bandwidth].should == "40"
|
184
|
+
first_media_section[:encryption_method].should == "prompt"
|
185
|
+
first_media_section[:attributes].first[:attribute].should == "rtpmap"
|
186
|
+
first_media_section[:attributes].first[:value].should == "96 MP4A-LATM/44100/2"
|
187
|
+
first_media_section[:attributes].last[:attribute].should == "fmtp"
|
188
|
+
first_media_section[:attributes].last[:value].should == "96 cpresent=0;config=400027200000"
|
192
189
|
end
|
193
190
|
end
|
194
191
|
|
data/spec/sdp_spec.rb
CHANGED
@@ -23,144 +23,152 @@ a=rtpmap:99 h263-1998/90000
|
|
23
23
|
EOF
|
24
24
|
|
25
25
|
describe SDP do
|
26
|
-
it "
|
27
|
-
SDP.const_get('VERSION').
|
26
|
+
it "VERSION is 0.2.5" do
|
27
|
+
SDP.const_get('VERSION').should eql '0.2.5'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "raises when parsing malformed SDP text" do
|
31
|
+
expect { SDP.parse("pants") }.to raise_error SDP::ParseError
|
28
32
|
end
|
29
33
|
|
30
34
|
context "parses SDP text into a Hash" do
|
31
35
|
before do
|
32
|
-
|
36
|
+
begin
|
37
|
+
@parsed_sdp = SDP.parse SDP_TEXT
|
38
|
+
rescue Parslet::ParseFailed => error
|
39
|
+
puts error, parser.root.error_tree
|
40
|
+
end
|
33
41
|
end
|
34
42
|
|
35
43
|
it "has a version number of 0" do
|
36
44
|
@parsed_sdp.protocol_version.should == "0"
|
37
|
-
@parsed_sdp.protocol_version.
|
45
|
+
@parsed_sdp.protocol_version.should be_a Parslet::Slice
|
38
46
|
end
|
39
47
|
|
40
48
|
context "origin" do
|
41
49
|
it "has a username of 'jdoe'" do
|
42
50
|
@parsed_sdp.username.should == 'jdoe'
|
43
|
-
@parsed_sdp.username.
|
51
|
+
@parsed_sdp.username.should be_a Parslet::Slice
|
44
52
|
end
|
45
53
|
|
46
54
|
it "has a session_id of '2890844526'" do
|
47
55
|
@parsed_sdp.id.should == "2890844526"
|
48
|
-
@parsed_sdp.id.
|
56
|
+
@parsed_sdp.id.should be_a Parslet::Slice
|
49
57
|
end
|
50
58
|
|
51
59
|
it "has a session_version of '2890842807'" do
|
52
60
|
@parsed_sdp.version.should == '2890842807'
|
53
|
-
@parsed_sdp.version.
|
61
|
+
@parsed_sdp.version.should be_a Parslet::Slice
|
54
62
|
end
|
55
63
|
|
56
64
|
it "has a net_type of 'IN'" do
|
57
65
|
@parsed_sdp.network_type.should == "IN"
|
58
|
-
@parsed_sdp.network_type.
|
66
|
+
@parsed_sdp.network_type.should be_a Parslet::Slice
|
59
67
|
end
|
60
68
|
|
61
69
|
it "has a address_type of 'IP4'" do
|
62
70
|
@parsed_sdp.address_type.should == "IP4"
|
63
|
-
@parsed_sdp.address_type.
|
71
|
+
@parsed_sdp.address_type.should be_a Parslet::Slice
|
64
72
|
end
|
65
73
|
|
66
74
|
it "has a unicast_address of '10.47.16.5'" do
|
67
75
|
@parsed_sdp.unicast_address.should == "10.47.16.5"
|
68
|
-
@parsed_sdp.unicast_address.
|
76
|
+
@parsed_sdp.unicast_address.should be_a Parslet::Slice
|
69
77
|
end
|
70
78
|
end
|
71
79
|
|
72
80
|
it "has a session name of 'SDP Seminar'" do
|
73
81
|
@parsed_sdp.name.should == "SDP Seminar"
|
74
|
-
@parsed_sdp.name.
|
82
|
+
@parsed_sdp.name.should be_a Parslet::Slice
|
75
83
|
end
|
76
84
|
|
77
85
|
it "has a session information of 'A Seminar on the session description protocol'" do
|
78
86
|
@parsed_sdp.information.should == "A Seminar on the session description protocol"
|
79
|
-
@parsed_sdp.information.
|
87
|
+
@parsed_sdp.information.should be_a Parslet::Slice
|
80
88
|
end
|
81
89
|
|
82
90
|
it "has a URI of 'http://www.example.com/seminars/sdp.pdf'" do
|
83
91
|
@parsed_sdp.uri.should == "http://www.example.com/seminars/sdp.pdf"
|
84
|
-
@parsed_sdp.uri.
|
92
|
+
@parsed_sdp.uri.should be_a Parslet::Slice
|
85
93
|
end
|
86
94
|
|
87
95
|
it "has an email address of 'j.doe@example.com (Jane Doe)'" do
|
88
96
|
@parsed_sdp.email_address.should == "j.doe@example.com (Jane Doe)"
|
89
|
-
@parsed_sdp.email_address.
|
97
|
+
@parsed_sdp.email_address.should be_a Parslet::Slice
|
90
98
|
end
|
91
99
|
|
92
100
|
it "has a phone number of '+1 617 555-6011'" do
|
93
101
|
@parsed_sdp.phone_number.should == "+1 617 555-6011"
|
94
|
-
@parsed_sdp.phone_number.
|
102
|
+
@parsed_sdp.phone_number.should be_a Parslet::Slice
|
95
103
|
end
|
96
104
|
|
97
105
|
context "bandwidth" do
|
98
106
|
it "has a bandwidth type of 'CT'" do
|
99
107
|
@parsed_sdp.bandwidth_type.should == "CT"
|
100
|
-
@parsed_sdp.bandwidth_type.
|
108
|
+
@parsed_sdp.bandwidth_type.should be_a Parslet::Slice
|
101
109
|
end
|
102
110
|
|
103
111
|
it "has a bandwidth of '1000'" do
|
104
112
|
@parsed_sdp.bandwidth.should == "1000"
|
105
|
-
@parsed_sdp.bandwidth.
|
113
|
+
@parsed_sdp.bandwidth.should be_a Parslet::Slice
|
106
114
|
end
|
107
115
|
end
|
108
116
|
|
109
117
|
context "timing" do
|
110
118
|
it "has a start time of '2873397496'" do
|
111
119
|
@parsed_sdp.start_time.should == '2873397496'
|
112
|
-
@parsed_sdp.start_time.
|
120
|
+
@parsed_sdp.start_time.should be_a Parslet::Slice
|
113
121
|
end
|
114
122
|
|
115
123
|
it "has a stop time of '2873404696'" do
|
116
124
|
@parsed_sdp.stop_time.should == '2873404696'
|
117
|
-
@parsed_sdp.stop_time.
|
125
|
+
@parsed_sdp.stop_time.should be_a Parslet::Slice
|
118
126
|
end
|
119
127
|
end
|
120
128
|
|
121
129
|
context "repeat times" do
|
122
130
|
it "has a repeat interval of '604800'" do
|
123
131
|
@parsed_sdp.repeat_interval.should == '604800'
|
124
|
-
@parsed_sdp.repeat_interval.
|
132
|
+
@parsed_sdp.repeat_interval.should be_a Parslet::Slice
|
125
133
|
end
|
126
134
|
|
127
135
|
it "has an active duration of '3600'" do
|
128
136
|
@parsed_sdp.active_duration.should == '3600'
|
129
|
-
@parsed_sdp.active_duration.
|
137
|
+
@parsed_sdp.active_duration.should be_a Parslet::Slice
|
130
138
|
end
|
131
139
|
|
132
140
|
it "has a offsets from start time of '0 90000'" do
|
133
141
|
@parsed_sdp.offsets_from_start_time.should == '0 90000'
|
134
|
-
@parsed_sdp.offsets_from_start_time.
|
142
|
+
@parsed_sdp.offsets_from_start_time.should be_a Parslet::Slice
|
135
143
|
end
|
136
144
|
end
|
137
145
|
|
138
146
|
context "time zones" do
|
139
147
|
it "has a time zone adjustment of '2882844526'" do
|
140
148
|
@parsed_sdp.time_zones[:adjustment_time].should == '2882844526'
|
141
|
-
@parsed_sdp.time_zones[:adjustment_time].
|
149
|
+
@parsed_sdp.time_zones[:adjustment_time].should be_a Parslet::Slice
|
142
150
|
end
|
143
151
|
|
144
152
|
it "has a time zone offset of '-1h'" do
|
145
153
|
@parsed_sdp.time_zones[:offset].should == '-1h'
|
146
|
-
@parsed_sdp.time_zones[:offset].
|
154
|
+
@parsed_sdp.time_zones[:offset].should be_a Parslet::Slice
|
147
155
|
end
|
148
156
|
end
|
149
157
|
|
150
158
|
context "connection data" do
|
151
159
|
it "has a connection network type of 'IN'" do
|
152
160
|
@parsed_sdp.connection_network_type.should == "IN"
|
153
|
-
@parsed_sdp.connection_network_type.
|
161
|
+
@parsed_sdp.connection_network_type.should be_a Parslet::Slice
|
154
162
|
end
|
155
163
|
|
156
164
|
it "has a addrtype of :IP4" do
|
157
165
|
@parsed_sdp.connection_address_type.should == "IP4"
|
158
|
-
@parsed_sdp.connection_address_type.
|
166
|
+
@parsed_sdp.connection_address_type.should be_a Parslet::Slice
|
159
167
|
end
|
160
168
|
|
161
169
|
it "has a connection address of '224.2.17.12/127'" do
|
162
170
|
@parsed_sdp.connection_address.should == '224.2.17.12/127'
|
163
|
-
@parsed_sdp.connection_address.
|
171
|
+
@parsed_sdp.connection_address.should be_a Parslet::Slice
|
164
172
|
end
|
165
173
|
end
|
166
174
|
|
@@ -177,7 +185,7 @@ describe SDP do
|
|
177
185
|
end
|
178
186
|
end
|
179
187
|
|
180
|
-
|
188
|
+
describe "PROTOCOL_VERSION" do
|
181
189
|
it "has an PROTOCOL_VERSION constant defined" do
|
182
190
|
SDP.const_defined?('PROTOCOL_VERSION').should be_true
|
183
191
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
2
4
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
3
5
|
require 'sdp/version'
|
4
6
|
|
5
|
-
SDP_MISSING_TIME = "v=0\r\no=- 1809368942 3379601213 IN IP4 127.0.0.1\r\ns=Secret Agent from SomaFM\r\ni=Downtempo Spy Lounge\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=x-qt-text-cmt:Orban Opticodec-PCx-qt-text-nam:Secret Agent from SomaFMx-qt-text-inf:Downtempo Spy Loungecontrol:*\r\nm=audio 0 RTP/AVP 96\r\na=rtpmap:96 MP4A-LATM/44100/2a=fmtp:96 cpresent=0;config=400027200000a=control:trackID=1\r\n"
|
7
|
+
SDP_MISSING_TIME = "v=0\r\no=- 1809368942 3379601213 IN IP4 127.0.0.1\r\ns=Secret Agent from SomaFM\r\ni=Downtempo Spy Lounge\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=x-qt-text-cmt:Orban Opticodec-PCx-qt-text-nam:Secret Agent from SomaFMx-qt-text-inf:Downtempo Spy Loungecontrol:*\r\nm=audio 0 RTP/AVP 96\r\na=rtpmap:96 MP4A-LATM/44100/2a=fmtp:96 cpresent=0;config=400027200000a=control:trackID=1\r\n"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sdp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-12-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parslet
|
16
|
-
requirement: &
|
16
|
+
requirement: &70223149043040 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 1.1.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70223149043040
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &70223149042480 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>'
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70223149042480
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: code_statistics
|
38
|
-
requirement: &
|
38
|
+
requirement: &70223149041980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.2.13
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70223149041980
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: cucumber
|
49
|
-
requirement: &
|
49
|
+
requirement: &70223149041460 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,43 +54,43 @@ dependencies:
|
|
54
54
|
version: 1.1.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70223149041460
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
60
|
-
requirement: &
|
59
|
+
name: rake
|
60
|
+
requirement: &70223149040940 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
65
|
+
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70223149040940
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
71
|
-
requirement: &
|
70
|
+
name: rspec
|
71
|
+
requirement: &70223149040440 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
76
|
+
version: 2.6.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70223149040440
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
82
|
-
requirement: &
|
81
|
+
name: simplecov
|
82
|
+
requirement: &70223149039920 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
87
|
+
version: 0.5.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70223149039920
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: yard
|
93
|
-
requirement: &
|
93
|
+
requirement: &70223149039400 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: 0.6.0
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70223149039400
|
102
102
|
description: ! "This gem allows for parsing SDP (Session Description\n Protocol)
|
103
103
|
information in to a Ruby object, making it easy to read \n and work with that
|
104
104
|
data. It also allows for easily creating SDP objects \n that can be converted
|
@@ -120,7 +120,9 @@ files:
|
|
120
120
|
- features/support/env.rb
|
121
121
|
- features/support/sdp_file.txt
|
122
122
|
- lib/sdp/description.rb
|
123
|
+
- lib/sdp/parse_error.rb
|
123
124
|
- lib/sdp/parser.rb
|
125
|
+
- lib/sdp/runtime_error.rb
|
124
126
|
- lib/sdp/session_template.erb
|
125
127
|
- lib/sdp/version.rb
|
126
128
|
- lib/sdp.rb
|
@@ -128,9 +130,6 @@ files:
|
|
128
130
|
- spec/sdp/parser_spec.rb
|
129
131
|
- spec/sdp_spec.rb
|
130
132
|
- spec/spec_helper.rb
|
131
|
-
- tasks/metrics.rake
|
132
|
-
- tasks/roodi_config.yml
|
133
|
-
- tasks/stats.rake
|
134
133
|
- ChangeLog.rdoc
|
135
134
|
- LICENSE.rdoc
|
136
135
|
- README.rdoc
|
@@ -161,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
160
|
version: '0'
|
162
161
|
requirements: []
|
163
162
|
rubyforge_project:
|
164
|
-
rubygems_version: 1.8.
|
163
|
+
rubygems_version: 1.8.10
|
165
164
|
signing_key:
|
166
165
|
specification_version: 3
|
167
166
|
summary: Parse and create SDP (Session Description Protocol) text based on RFC4566.
|
data/tasks/metrics.rake
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'metric_fu'
|
2
|
-
|
3
|
-
MetricFu::Configuration.run do |config|
|
4
|
-
#define which metrics you want to use
|
5
|
-
config.metrics = [:churn, :flog, :flay, :reek, :roodi, :rcov, :stats]
|
6
|
-
config.graphs = [:flog, :flay, :reek, :roodi, :rcov, :stats]
|
7
|
-
config.churn = { :start_date => "1 year ago", :minimum_churn_count => 10 }
|
8
|
-
config.flay = { :dirs_to_flay => ['lib'],
|
9
|
-
:minimum_score => 10,
|
10
|
-
:filetypes => ['rb', 'erb'] }
|
11
|
-
config.flog = { :dirs_to_flog => ['lib'] }
|
12
|
-
config.rcov = { :environment => 'test',
|
13
|
-
:test_files => ["spec/**/*_spec.rb"],
|
14
|
-
:rcov_opts => ["--sort coverage",
|
15
|
-
"--no-html",
|
16
|
-
"--text-coverage",
|
17
|
-
"--spec-only",
|
18
|
-
"--no-color",
|
19
|
-
"--profile",
|
20
|
-
"--exclude /gems/,/Library/"]
|
21
|
-
}
|
22
|
-
config.reek = { :dirs_to_reek => ['lib'] }
|
23
|
-
config.roodi = { :dirs_to_roodi => ['lib'], :roodi_config => "tasks/roodi_config.yml" }
|
24
|
-
config.graph_engine = :bluff
|
25
|
-
end
|
data/tasks/roodi_config.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
---
|
2
|
-
AssignmentInConditionalCheck: { }
|
3
|
-
CaseMissingElseCheck: { }
|
4
|
-
ClassLineCountCheck: { line_count: 300 }
|
5
|
-
ClassNameCheck: { pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/ }
|
6
|
-
CyclomaticComplexityBlockCheck: { complexity: 4 }
|
7
|
-
CyclomaticComplexityMethodCheck: { complexity: 8 }
|
8
|
-
EmptyRescueBodyCheck: { }
|
9
|
-
ForLoopCheck: { }
|
10
|
-
MethodLineCountCheck: { line_count: 30 }
|
11
|
-
MethodNameCheck: { pattern: !ruby/regexp /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ }
|
12
|
-
ModuleLineCountCheck: { line_count: 300 }
|
13
|
-
ModuleNameCheck: { pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/ }
|
14
|
-
ParameterNumberCheck: { parameter_count: 5 }
|
data/tasks/stats.rake
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'code_statistics'
|
2
|
-
|
3
|
-
STATS_DIRECTORIES = [
|
4
|
-
%w(Library lib/),
|
5
|
-
%w(Behavior\ tests features/),
|
6
|
-
%w(Unit\ tests spec/)
|
7
|
-
].collect { |name, dir| [ name, "#{dir}" ] }.select { |name, dir| File.directory?(dir) }
|
8
|
-
|
9
|
-
desc "Report code statistics (KLOCs, etc) from the application"
|
10
|
-
task :stats do
|
11
|
-
CodeStatistics.new(*STATS_DIRECTORIES).to_s
|
12
|
-
end
|
13
|
-
|