playful 0.1.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +5 -0
  6. data/Gemfile +6 -0
  7. data/History.rdoc +3 -0
  8. data/LICENSE.rdoc +22 -0
  9. data/README.rdoc +194 -0
  10. data/Rakefile +20 -0
  11. data/features/control_point.feature +13 -0
  12. data/features/device.feature +22 -0
  13. data/features/device_discovery.feature +9 -0
  14. data/features/step_definitions/control_point_steps.rb +19 -0
  15. data/features/step_definitions/device_discovery_steps.rb +40 -0
  16. data/features/step_definitions/device_steps.rb +28 -0
  17. data/features/support/common.rb +9 -0
  18. data/features/support/env.rb +17 -0
  19. data/features/support/fake_upnp_device_collection.rb +108 -0
  20. data/features/support/world_extensions.rb +15 -0
  21. data/lib/core_ext/hash_patch.rb +5 -0
  22. data/lib/core_ext/socket_patch.rb +16 -0
  23. data/lib/core_ext/to_upnp_s.rb +65 -0
  24. data/lib/playful.rb +5 -0
  25. data/lib/playful/control_point.rb +175 -0
  26. data/lib/playful/control_point/base.rb +74 -0
  27. data/lib/playful/control_point/device.rb +511 -0
  28. data/lib/playful/control_point/error.rb +13 -0
  29. data/lib/playful/control_point/service.rb +404 -0
  30. data/lib/playful/device.rb +28 -0
  31. data/lib/playful/logger.rb +8 -0
  32. data/lib/playful/ssdp.rb +195 -0
  33. data/lib/playful/ssdp/broadcast_searcher.rb +114 -0
  34. data/lib/playful/ssdp/error.rb +6 -0
  35. data/lib/playful/ssdp/listener.rb +38 -0
  36. data/lib/playful/ssdp/multicast_connection.rb +112 -0
  37. data/lib/playful/ssdp/network_constants.rb +17 -0
  38. data/lib/playful/ssdp/notifier.rb +41 -0
  39. data/lib/playful/ssdp/searcher.rb +87 -0
  40. data/lib/playful/version.rb +3 -0
  41. data/lib/rack/upnp_control_point.rb +70 -0
  42. data/playful.gemspec +38 -0
  43. data/spec/spec_helper.rb +16 -0
  44. data/spec/support/search_responses.rb +134 -0
  45. data/spec/unit/core_ext/to_upnp_s_spec.rb +105 -0
  46. data/spec/unit/playful/control_point/device_spec.rb +7 -0
  47. data/spec/unit/playful/control_point_spec.rb +45 -0
  48. data/spec/unit/playful/ssdp/listener_spec.rb +29 -0
  49. data/spec/unit/playful/ssdp/multicast_connection_spec.rb +157 -0
  50. data/spec/unit/playful/ssdp/notifier_spec.rb +76 -0
  51. data/spec/unit/playful/ssdp/searcher_spec.rb +110 -0
  52. data/spec/unit/playful/ssdp_spec.rb +214 -0
  53. data/tasks/control_point.html +30 -0
  54. data/tasks/control_point.thor +43 -0
  55. data/tasks/search.thor +128 -0
  56. data/tasks/test_js/FABridge.js +1425 -0
  57. data/tasks/test_js/WebSocketMain.swf +807 -0
  58. data/tasks/test_js/swfobject.js +825 -0
  59. data/tasks/test_js/web_socket.js +1133 -0
  60. data/test/test_ssdp.rb +298 -0
  61. data/test/test_ssdp_notification.rb +74 -0
  62. data/test/test_ssdp_response.rb +31 -0
  63. data/test/test_ssdp_search.rb +23 -0
  64. metadata +339 -0
data/test/test_ssdp.rb ADDED
@@ -0,0 +1,298 @@
1
+ require 'test/unit'
2
+ require_relative 'utilities'
3
+ require 'ssdp'
4
+ require 'upnp_savon/test_utilities'
5
+
6
+ class TestSSDP < SSDP::TestCase
7
+ def setup
8
+ super
9
+
10
+ @ssdp = SSDP.new
11
+ @ssdp.timeout = 0
12
+ end
13
+
14
+ def teardown
15
+ @ssdp.listener.kill if @ssdp.listener
16
+ end
17
+
18
+ def test_discover
19
+ socket = UPnPSavon::FakeSocket.new util_notify
20
+ @ssdp.socket = socket
21
+
22
+ notifications = @ssdp.discover
23
+
24
+ assert_equal [], socket.sent
25
+
26
+ assert_equal 1, notifications.length
27
+ assert_equal 'upnp:rootdevice', notifications.first.type
28
+ end
29
+
30
+ def test_listen
31
+ @ssdp.socket = UPnPSavon::FakeSocket.new util_notify
32
+
33
+ @ssdp.listen
34
+
35
+ notification = @ssdp.queue.pop
36
+
37
+ assert_equal 'upnp:rootdevice', notification.type
38
+ end
39
+
40
+ def test_new_socket
41
+ SSDP.send :const_set, :UDPSocket, UPnPSavon::FakeSocket
42
+
43
+ socket = @ssdp.new_socket
44
+
45
+ ttl = [@ssdp.ttl].pack 'i'
46
+ expected = [
47
+ [Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, "\357\377\377\372\000\000\000\000"],
48
+ [Socket::IPPROTO_IP, Socket::IP_MULTICAST_LOOP, "\000"],
49
+ [Socket::IPPROTO_IP, Socket::IP_MULTICAST_TTL, ttl],
50
+ [Socket::IPPROTO_IP, Socket::IP_TTL, ttl],
51
+ ]
52
+
53
+ assert_equal expected, socket.socket_options
54
+ ensure
55
+ SSDP.send :remove_const, :UDPSocket
56
+ end
57
+
58
+ def test_parse_bad
59
+ assert_raise SSDP::Error do
60
+ @ssdp.parse ''
61
+ end
62
+ end
63
+
64
+ def test_parse_notification
65
+ notification = @ssdp.parse util_notify
66
+
67
+ assert_equal 'upnp:rootdevice', notification.type
68
+ end
69
+
70
+ def test_parse_notification_byebye
71
+ notification = @ssdp.parse util_notify
72
+
73
+ assert_equal 'upnp:rootdevice', notification.type
74
+ end
75
+
76
+ def test_parse_search
77
+ response = @ssdp.parse util_search
78
+
79
+ assert_equal 'upnp:rootdevice', response.target
80
+ end
81
+
82
+ def test_parse_search_response
83
+ response = @ssdp.parse util_search_response
84
+
85
+ assert_equal 'upnp:rootdevice', response.target
86
+ end
87
+
88
+ def test_search
89
+ socket = UPnPSavon::FakeSocket.new util_search_response
90
+ @ssdp.socket = socket
91
+
92
+ responses = @ssdp.search
93
+
94
+ m_search = <<-M_SEARCH
95
+ M-SEARCH * HTTP/1.1\r
96
+ HOST: 239.255.255.250:1900\r
97
+ MAN: \"ssdp:discover\"\r
98
+ MX: 0\r
99
+ ST: ssdp:all\r
100
+ \r
101
+ M_SEARCH
102
+
103
+ assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
104
+
105
+ assert_equal 1, responses.length
106
+ assert_equal 'upnp:rootdevice', responses.first.target
107
+ end
108
+
109
+ def test_search_device
110
+ socket = UPnPSavon::FakeSocket.new util_search_response
111
+ @ssdp.socket = socket
112
+
113
+ responses = @ssdp.search [:device, 'MyDevice.1']
114
+
115
+ m_search = <<-M_SEARCH
116
+ M-SEARCH * HTTP/1.1\r
117
+ HOST: 239.255.255.250:1900\r
118
+ MAN: \"ssdp:discover\"\r
119
+ MX: 0\r
120
+ ST: urn:schemas-upnp-org:device:MyDevice.1\r
121
+ \r
122
+ M_SEARCH
123
+
124
+ assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
125
+ end
126
+
127
+ def test_search_root
128
+ socket = UPnPSavon::FakeSocket.new util_search_response
129
+ @ssdp.socket = socket
130
+
131
+ responses = @ssdp.search :root
132
+
133
+ m_search = <<-M_SEARCH
134
+ M-SEARCH * HTTP/1.1\r
135
+ HOST: 239.255.255.250:1900\r
136
+ MAN: \"ssdp:discover\"\r
137
+ MX: 0\r
138
+ ST: upnp:rootdevice\r
139
+ \r
140
+ M_SEARCH
141
+
142
+ assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
143
+ end
144
+
145
+ def test_search_service
146
+ socket = UPnPSavon::FakeSocket.new util_search_response
147
+ @ssdp.socket = socket
148
+
149
+ responses = @ssdp.search [:service, 'MyService.1']
150
+
151
+ m_search = <<-M_SEARCH
152
+ M-SEARCH * HTTP/1.1\r
153
+ HOST: 239.255.255.250:1900\r
154
+ MAN: \"ssdp:discover\"\r
155
+ MX: 0\r
156
+ ST: urn:schemas-upnp-org:service:MyService.1\r
157
+ \r
158
+ M_SEARCH
159
+
160
+ assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
161
+ end
162
+
163
+ def test_search_ssdp
164
+ socket = UPnPSavon::FakeSocket.new util_search_response
165
+ @ssdp.socket = socket
166
+
167
+ responses = @ssdp.search 'ssdp:foo'
168
+
169
+ m_search = <<-M_SEARCH
170
+ M-SEARCH * HTTP/1.1\r
171
+ HOST: 239.255.255.250:1900\r
172
+ MAN: \"ssdp:discover\"\r
173
+ MX: 0\r
174
+ ST: ssdp:foo\r
175
+ \r
176
+ M_SEARCH
177
+
178
+ assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
179
+ end
180
+
181
+ def test_search_urn
182
+ socket = UPnPSavon::FakeSocket.new util_search_response
183
+ @ssdp.socket = socket
184
+
185
+ responses = @ssdp.search 'urn:foo'
186
+
187
+ m_search = <<-M_SEARCH
188
+ M-SEARCH * HTTP/1.1\r
189
+ HOST: 239.255.255.250:1900\r
190
+ MAN: \"ssdp:discover\"\r
191
+ MX: 0\r
192
+ ST: urn:foo\r
193
+ \r
194
+ M_SEARCH
195
+
196
+ assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
197
+ end
198
+
199
+ def test_search_uuid
200
+ socket = UPnPSavon::FakeSocket.new util_search_response
201
+ @ssdp.socket = socket
202
+
203
+ responses = @ssdp.search 'uuid:foo'
204
+
205
+ m_search = <<-M_SEARCH
206
+ M-SEARCH * HTTP/1.1\r
207
+ HOST: 239.255.255.250:1900\r
208
+ MAN: \"ssdp:discover\"\r
209
+ MX: 0\r
210
+ ST: uuid:foo\r
211
+ \r
212
+ M_SEARCH
213
+
214
+ assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
215
+ end
216
+
217
+ def test_send_notify
218
+ socket = UPnPSavon::FakeSocket.new
219
+ @ssdp.socket = socket
220
+
221
+ uri = 'http://127.255.255.255:65536/description'
222
+ device = UPnPSavon::Device.new 'TestDevice', 'test device'
223
+
224
+ @ssdp.send_notify uri, 'upnp:rootdevice', device
225
+
226
+ search = <<-SEARCH
227
+ NOTIFY * HTTP/1.1\r
228
+ HOST: 239.255.255.250:1900\r
229
+ CACHE-CONTROL: max-age=120\r
230
+ LOCATION: #{uri}\r
231
+ NT: upnp:rootdevice\r
232
+ NTS: ssdp:alive\r
233
+ SERVER: Ruby SSDP/#{SSDP::VERSION} UPnP/1.0 #{util_device_version}\r
234
+ USN: #{device.name}::upnp:rootdevice\r
235
+ \r
236
+ SEARCH
237
+
238
+ assert_equal [[search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
239
+ end
240
+
241
+ def test_send_response
242
+ socket = UPnPSavon::FakeSocket.new
243
+ @ssdp.socket = socket
244
+
245
+ uri = 'http://127.255.255.255:65536/description'
246
+ device = UPnPSavon::Device.new 'TestDevice', 'test device'
247
+
248
+ @ssdp.send_response uri, 'upnp:rootdevice', device.name, device
249
+
250
+ search = <<-SEARCH
251
+ HTTP/1.1 200 OK\r
252
+ CACHE-CONTROL: max-age=120\r
253
+ EXT:\r
254
+ LOCATION: #{uri}\r
255
+ SERVER: Ruby SSDP/#{SSDP::VERSION} UPnP/1.0 #{util_device_version}\r
256
+ ST: upnp:rootdevice\r
257
+ NTS: ssdp:alive\r
258
+ USN: #{device.name}\r
259
+ Content-Length: 0\r
260
+ \r
261
+ SEARCH
262
+
263
+ assert_equal [[search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
264
+ end
265
+
266
+ def test_send_search
267
+ socket = UPnPSavon::FakeSocket.new
268
+ @ssdp.socket = socket
269
+
270
+ @ssdp.send_search 'bunnies'
271
+
272
+ search = <<-SEARCH
273
+ M-SEARCH * HTTP/1.1\r
274
+ HOST: 239.255.255.250:1900\r
275
+ MAN: \"ssdp:discover\"\r
276
+ MX: 0\r
277
+ ST: bunnies\r
278
+ \r
279
+ SEARCH
280
+
281
+ assert_equal [[search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
282
+ end
283
+
284
+ def test_stop_listening
285
+ thread = Thread.new do sleep end
286
+ @ssdp.listener = thread
287
+
288
+ @ssdp.stop_listening
289
+
290
+ assert_equal false, thread.alive?
291
+ assert_equal nil, @ssdp.listener
292
+ end
293
+
294
+ def util_device_version
295
+ "UPnPSavon::Device::TestDevice/#{UPnPSavon::Device::TestDevice::VERSION}"
296
+ end
297
+ end
298
+
@@ -0,0 +1,74 @@
1
+ require 'test/unit'
2
+ require 'test/utilities'
3
+ require 'ssdp'
4
+
5
+ class TestSSDPNotification < SSDP::TestCase
6
+
7
+ def test_self_parse_notify
8
+ notification = SSDP::Notification.parse util_notify
9
+
10
+ assert_equal Time, notification.date.class
11
+ assert_equal '239.255.255.250', notification.host
12
+ assert_equal '1900', notification.port
13
+ assert_equal URI.parse('http://example.com/root_device.xml'),
14
+ notification.location
15
+ assert_equal 10, notification.max_age
16
+ assert_equal 'uuid:BOGUS::upnp:rootdevice', notification.name
17
+ assert_equal 'upnp:rootdevice', notification.type
18
+ assert_equal 'OS/5 SSDP/1.0 product/7', notification.server
19
+ assert_equal 'ssdp:alive', notification.sub_type
20
+ end
21
+
22
+ def test_self_parse_notify_byebye
23
+ notification = SSDP::Notification.parse util_notify_byebye
24
+
25
+ assert_equal Time, notification.date.class
26
+ assert_equal '239.255.255.250', notification.host
27
+ assert_equal '1900', notification.port
28
+ assert_equal nil, notification.location
29
+ assert_equal nil, notification.max_age
30
+ assert_equal 'uuid:BOGUS::upnp:rootdevice', notification.name
31
+ assert_equal 'upnp:rootdevice', notification.type
32
+ assert_equal 'ssdp:byebye', notification.sub_type
33
+ end
34
+
35
+ def test_alive_eh
36
+ notification = SSDP::Notification.parse util_notify
37
+
38
+ assert notification.alive?
39
+
40
+ notification = SSDP::Notification.parse util_notify_byebye
41
+
42
+ assert !notification.alive?
43
+ end
44
+
45
+ def test_byebye_eh
46
+ notification = SSDP::Notification.parse util_notify_byebye
47
+
48
+ assert notification.byebye?
49
+
50
+ notification = SSDP::Notification.parse util_notify
51
+
52
+ assert !notification.byebye?
53
+ end
54
+
55
+ def test_inspect
56
+ notification = SSDP::Notification.parse util_notify
57
+
58
+ id = notification.object_id.to_s 16
59
+ expected = "#<SSDP::Notification:0x#{id} upnp:rootdevice ssdp:alive http://example.com/root_device.xml>"
60
+
61
+ assert_equal expected, notification.inspect
62
+ end
63
+
64
+ def test_inspect_byebye
65
+ notification = SSDP::Notification.parse util_notify_byebye
66
+
67
+ id = notification.object_id.to_s 16
68
+ expected = "#<SSDP::Notification:0x#{id} upnp:rootdevice ssdp:byebye>"
69
+
70
+ assert_equal expected, notification.inspect
71
+ end
72
+
73
+ end
74
+
@@ -0,0 +1,31 @@
1
+ require 'test/unit'
2
+ require 'test/utilities'
3
+ require 'SSDP'
4
+
5
+ class TestSSDPResponse < SSDP::TestCase
6
+
7
+ def setup
8
+ super
9
+
10
+ @response = SSDP::Response.parse util_search_response
11
+ end
12
+
13
+ def test_self_parse_notify
14
+ assert_equal Time, @response.date.class
15
+ assert_equal true, @response.ext
16
+ assert_equal URI.parse('http://example.com/root_device.xml'),
17
+ @response.location
18
+ assert_equal 10, @response.max_age
19
+ assert_equal 'uuid:BOGUS::upnp:rootdevice', @response.name
20
+ assert_equal 'OS/5 UPnP/1.0 product/7', @response.server
21
+ assert_equal 'upnp:rootdevice', @response.target
22
+ end
23
+
24
+ def test_inspect
25
+ id = @response.object_id.to_s 16
26
+ expected = "#<SSDP::Response:0x#{id} upnp:rootdevice http://example.com/root_device.xml>"
27
+
28
+ assert_equal expected, @response.inspect
29
+ end
30
+
31
+ end
@@ -0,0 +1,23 @@
1
+ require 'test/unit'
2
+ require 'test/utilities'
3
+ require 'ssdp'
4
+
5
+ class TestSSDPSearch < SSDP::TestCase
6
+
7
+ def test_self_parse_search
8
+ search = SSDP::Search.parse util_search
9
+
10
+ assert_equal Time, search.date.class
11
+ assert_equal 'upnp:rootdevice', search.target
12
+ assert_equal 2, search.wait_time
13
+ end
14
+
15
+ def test_inspect
16
+ search = SSDP::Search.parse util_search
17
+
18
+ id = search.object_id.to_s 16
19
+ expected = "#<SSDP::Search:0x#{id} upnp:rootdevice>"
20
+
21
+ assert_equal expected, search.inspect
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,339 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: playful
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.alpha.1
5
+ platform: ruby
6
+ authors:
7
+ - turboladen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eventmachine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: em-http-request
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: em-synchrony
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nori
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.0.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 2.0.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: log_switch
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.4.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.4.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: savon
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bundler
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: cucumber
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 1.0.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: em-websocket
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 0.3.6
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 0.3.6
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
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: rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 3.0.0.beta
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: 3.0.0.beta
167
+ - !ruby/object:Gem::Dependency
168
+ name: simplecov
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: 0.4.2
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: 0.4.2
181
+ - !ruby/object:Gem::Dependency
182
+ name: thin
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: thor
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: 0.1.6
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: 0.1.6
209
+ - !ruby/object:Gem::Dependency
210
+ name: yard
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: 0.7.0
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 0.7.0
223
+ description: |-
224
+ playful provides the tools you need to build an app that runs
225
+ in a UPnP environment.
226
+ email: steve.loveless@gmail.com
227
+ executables: []
228
+ extensions: []
229
+ extra_rdoc_files:
230
+ - History.rdoc
231
+ - README.rdoc
232
+ files:
233
+ - ".gemtest"
234
+ - ".gitignore"
235
+ - ".rspec"
236
+ - ".travis.yml"
237
+ - Gemfile
238
+ - History.rdoc
239
+ - LICENSE.rdoc
240
+ - README.rdoc
241
+ - Rakefile
242
+ - features/control_point.feature
243
+ - features/device.feature
244
+ - features/device_discovery.feature
245
+ - features/step_definitions/control_point_steps.rb
246
+ - features/step_definitions/device_discovery_steps.rb
247
+ - features/step_definitions/device_steps.rb
248
+ - features/support/common.rb
249
+ - features/support/env.rb
250
+ - features/support/fake_upnp_device_collection.rb
251
+ - features/support/world_extensions.rb
252
+ - lib/core_ext/hash_patch.rb
253
+ - lib/core_ext/socket_patch.rb
254
+ - lib/core_ext/to_upnp_s.rb
255
+ - lib/playful.rb
256
+ - lib/playful/control_point.rb
257
+ - lib/playful/control_point/base.rb
258
+ - lib/playful/control_point/device.rb
259
+ - lib/playful/control_point/error.rb
260
+ - lib/playful/control_point/service.rb
261
+ - lib/playful/device.rb
262
+ - lib/playful/logger.rb
263
+ - lib/playful/ssdp.rb
264
+ - lib/playful/ssdp/broadcast_searcher.rb
265
+ - lib/playful/ssdp/error.rb
266
+ - lib/playful/ssdp/listener.rb
267
+ - lib/playful/ssdp/multicast_connection.rb
268
+ - lib/playful/ssdp/network_constants.rb
269
+ - lib/playful/ssdp/notifier.rb
270
+ - lib/playful/ssdp/searcher.rb
271
+ - lib/playful/version.rb
272
+ - lib/rack/upnp_control_point.rb
273
+ - playful.gemspec
274
+ - spec/spec_helper.rb
275
+ - spec/support/search_responses.rb
276
+ - spec/unit/core_ext/to_upnp_s_spec.rb
277
+ - spec/unit/playful/control_point/device_spec.rb
278
+ - spec/unit/playful/control_point_spec.rb
279
+ - spec/unit/playful/ssdp/listener_spec.rb
280
+ - spec/unit/playful/ssdp/multicast_connection_spec.rb
281
+ - spec/unit/playful/ssdp/notifier_spec.rb
282
+ - spec/unit/playful/ssdp/searcher_spec.rb
283
+ - spec/unit/playful/ssdp_spec.rb
284
+ - tasks/control_point.html
285
+ - tasks/control_point.thor
286
+ - tasks/search.thor
287
+ - tasks/test_js/FABridge.js
288
+ - tasks/test_js/WebSocketMain.swf
289
+ - tasks/test_js/swfobject.js
290
+ - tasks/test_js/web_socket.js
291
+ - test/test_ssdp.rb
292
+ - test/test_ssdp_notification.rb
293
+ - test/test_ssdp_response.rb
294
+ - test/test_ssdp_search.rb
295
+ homepage: http://github.com/turboladen/playful
296
+ licenses: []
297
+ metadata: {}
298
+ post_install_message:
299
+ rdoc_options: []
300
+ require_paths:
301
+ - lib
302
+ required_ruby_version: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - ">="
305
+ - !ruby/object:Gem::Version
306
+ version: 1.9.1
307
+ required_rubygems_version: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - ">"
310
+ - !ruby/object:Gem::Version
311
+ version: 1.3.1
312
+ requirements: []
313
+ rubyforge_project:
314
+ rubygems_version: 2.2.0
315
+ signing_key:
316
+ specification_version: 4
317
+ summary: Use me to build a UPnP app!
318
+ test_files:
319
+ - features/control_point.feature
320
+ - features/device.feature
321
+ - features/device_discovery.feature
322
+ - features/step_definitions/control_point_steps.rb
323
+ - features/step_definitions/device_discovery_steps.rb
324
+ - features/step_definitions/device_steps.rb
325
+ - features/support/common.rb
326
+ - features/support/env.rb
327
+ - features/support/fake_upnp_device_collection.rb
328
+ - features/support/world_extensions.rb
329
+ - spec/spec_helper.rb
330
+ - spec/support/search_responses.rb
331
+ - spec/unit/core_ext/to_upnp_s_spec.rb
332
+ - spec/unit/playful/control_point/device_spec.rb
333
+ - spec/unit/playful/control_point_spec.rb
334
+ - spec/unit/playful/ssdp/listener_spec.rb
335
+ - spec/unit/playful/ssdp/multicast_connection_spec.rb
336
+ - spec/unit/playful/ssdp/notifier_spec.rb
337
+ - spec/unit/playful/ssdp/searcher_spec.rb
338
+ - spec/unit/playful/ssdp_spec.rb
339
+ has_rdoc: