playful 0.1.0.alpha.1

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.
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: