david 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.travis.yml +2 -2
  4. data/Gemfile +8 -2
  5. data/Gemfile.lock +84 -44
  6. data/README.md +87 -5
  7. data/benchmarks/Gemfile +1 -0
  8. data/benchmarks/Gemfile.lock +3 -1
  9. data/benchmarks/coapbench.sh +20 -0
  10. data/benchmarks/quick.sh +2 -0
  11. data/benchmarks/rackup/Gemfile +10 -0
  12. data/benchmarks/rackup/Gemfile.lock +159 -0
  13. data/benchmarks/rackup/grape.ru +18 -0
  14. data/benchmarks/rackup/rack.ru +7 -0
  15. data/benchmarks/rackup/rails.ru +14 -0
  16. data/benchmarks/rps.rb +14 -2
  17. data/benchmarks/stress.sh +17 -0
  18. data/david.gemspec +0 -3
  19. data/experiments/Gemfile +6 -0
  20. data/experiments/concurrency/Gemfile +3 -0
  21. data/experiments/concurrency/stub.rb +88 -0
  22. data/experiments/hash_key.rb +64 -0
  23. data/experiments/string_concat.rb +21 -0
  24. data/experiments/symbol_to_proc.rb +15 -0
  25. data/experiments/thread_safe.rb +40 -0
  26. data/lib/david.rb +8 -4
  27. data/lib/david/actor.rb +1 -11
  28. data/lib/david/app_config.rb +112 -0
  29. data/lib/david/exchange.rb +124 -0
  30. data/lib/david/fake_logger.rb +11 -0
  31. data/lib/david/garbage_collector.rb +9 -17
  32. data/lib/david/guerilla/rack/utils.rb +18 -0
  33. data/lib/david/interop.rb +4 -0
  34. data/lib/david/interop/mandatory_etsi.rb +4 -0
  35. data/lib/david/interop/mandatory_etsi/grape.rb +37 -0
  36. data/lib/david/interop/mandatory_etsi/hobbit.rb +30 -0
  37. data/lib/david/interop/mandatory_etsi/nyny.rb +36 -0
  38. data/lib/david/interop/mandatory_etsi/rack.rb +26 -0
  39. data/lib/david/interop/mandatory_etsi/sinatra.rb +36 -0
  40. data/lib/david/observe.rb +24 -29
  41. data/lib/david/rails/action_controller/base.rb +9 -7
  42. data/lib/david/railties/config.rb +4 -4
  43. data/lib/david/registry.rb +22 -0
  44. data/lib/david/server.rb +56 -56
  45. data/lib/david/server/constants.rb +1 -0
  46. data/lib/david/server/mapping.rb +43 -11
  47. data/lib/david/server/mid_cache.rb +29 -0
  48. data/lib/david/server/multicast.rb +7 -5
  49. data/lib/david/server/respond.rb +53 -43
  50. data/lib/david/server/utility.rb +2 -1
  51. data/lib/david/show_exceptions.rb +12 -8
  52. data/lib/david/transmitter.rb +44 -0
  53. data/lib/david/trap.rb +10 -0
  54. data/lib/david/version.rb +1 -1
  55. data/lib/rack/handler/david.rb +6 -10
  56. data/lib/rack/hello_world.rb +25 -0
  57. data/spec/app_config_spec.rb +56 -0
  58. data/spec/dummy/app/controllers/etsis_controller.rb +26 -0
  59. data/spec/dummy/app/controllers/tests_controller.rb +9 -0
  60. data/spec/dummy/config/application.rb +4 -6
  61. data/spec/dummy/config/environments/development.rb +2 -2
  62. data/spec/dummy/config/environments/test.rb +2 -2
  63. data/spec/dummy/config/routes.rb +13 -53
  64. data/spec/interop/mandatory_spec.rb +100 -0
  65. data/spec/observe_spec.rb +8 -7
  66. data/spec/resource_discovery_spec.rb +3 -3
  67. data/spec/server_spec.rb +60 -15
  68. data/spec/spec_helper.rb +21 -2
  69. metadata +40 -33
  70. data/lib/david/request.rb +0 -80
  71. data/lib/david/server/deduplication.rb +0 -21
  72. data/lib/david/server/options.rb +0 -79
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf99b7a04f88ad84fc39ae748528fc0555d340a4
4
- data.tar.gz: db0a00feed99717987b4b5e72e399e0c85d2accb
3
+ metadata.gz: b97cbebfb17845f2a5fa678fa026b40c2a843c40
4
+ data.tar.gz: 8cee683c847e3ea1f1a93a501904dcdcb7be2312
5
5
  SHA512:
6
- metadata.gz: 17f584e9e2d9f2000a20eb0a22a963b42b8b4e82b9438c99e46d04be2e37c7670e35d739bd13850c45426a7c7e83837b74f266a76f4e30d117dc52a59ed08f9b
7
- data.tar.gz: ca6cc59e8fedfa63392b6b8edbbf15076a0809e11433b9dcdeaf80d212ba696ddd0a0bc0ee7d5dc4e593ce22b3e16d7ab3574d7970ece21a6ca932379724cbc6
6
+ metadata.gz: 43be48293b3b0c45eabfe106aadbb6dc120db4224d01b09d752dedddb7525e22f03289b1497d28aa5e3c2c5a0a6ea614e9f433df1789b14bda8c5183b904fa1b
7
+ data.tar.gz: fa3af2ac69c7a12c4f9d67c70c0f261ef4a7dc3a216e4b6054f719233b45d30877335679baaf664a1f3e4eee80cce67fd943871f2d33d5090d49b57963f94349
data/.gitignore CHANGED
@@ -1 +1,5 @@
1
1
  *.log
2
+ spec/dummy/db/*.sqlite3
3
+ coverage
4
+ benchmarks/coapbench
5
+ benchmarks/coapbench\(*
data/.travis.yml CHANGED
@@ -7,14 +7,14 @@ os:
7
7
  rvm:
8
8
  - 2.2
9
9
  - jruby
10
- - rbx-head
10
+ - rbx
11
11
 
12
12
  matrix:
13
13
  fast_finish: true
14
14
  allow_failures:
15
15
  - os: osx
16
16
  - rvm: jruby
17
- - rvm: rbx-head
17
+ - rvm: rbx
18
18
 
19
19
  notifications:
20
20
  email: false
data/Gemfile CHANGED
@@ -7,10 +7,16 @@ group :cbor do
7
7
  end
8
8
 
9
9
  group :development do
10
- gem 'sqlite3', platforms: :ruby
11
- gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
10
+ gem 'ruby-prof', platforms: :mri
12
11
  end
13
12
 
14
13
  group :test do
15
14
  gem 'coveralls', require: false
15
+
16
+ gem 'grape'
17
+ gem 'hobbit'
18
+ gem 'nyny'
19
+ gem 'rails', '~> 4.2.0'
20
+ gem 'rspec-rails', '~> 3.2.0'
21
+ gem 'sinatra'
16
22
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- david (0.3.0.pre)
4
+ david (0.4.0)
5
5
  celluloid-io (~> 0.16, >= 0.16.1)
6
6
  coap (~> 0.1)
7
7
  rack (~> 1.5)
@@ -38,11 +38,6 @@ GEM
38
38
  activemodel (= 4.2.0)
39
39
  activesupport (= 4.2.0)
40
40
  arel (~> 6.0)
41
- activerecord-jdbc-adapter (1.3.13)
42
- activerecord (>= 2.2)
43
- activerecord-jdbcsqlite3-adapter (1.3.13)
44
- activerecord-jdbc-adapter (~> 1.3.13)
45
- jdbc-sqlite3 (>= 3.7.2, < 3.9)
46
41
  activesupport (4.2.0)
47
42
  i18n (~> 0.7)
48
43
  json (~> 1.7, >= 1.7.7)
@@ -50,32 +45,54 @@ GEM
50
45
  thread_safe (~> 0.3, >= 0.3.4)
51
46
  tzinfo (~> 1.1)
52
47
  arel (6.0.0)
48
+ axiom-types (0.1.1)
49
+ descendants_tracker (~> 0.0.4)
50
+ ice_nine (~> 0.11.0)
51
+ thread_safe (~> 0.3, >= 0.3.1)
53
52
  builder (3.2.2)
54
53
  cbor (0.5.9.0)
55
54
  celluloid (0.16.0)
56
55
  timers (~> 4.0.0)
57
- celluloid-io (0.16.1)
56
+ celluloid-io (0.16.2)
58
57
  celluloid (>= 0.16.0)
59
- nio4r (>= 1.0.0)
60
- coap (0.1.0)
58
+ nio4r (>= 1.1.0)
59
+ coap (0.1.1)
61
60
  celluloid-io (~> 0.16, >= 0.16.1)
62
61
  resolv-ipv6favor (~> 0)
63
- coveralls (0.7.1)
64
- multi_json (~> 1.3)
65
- rest-client
66
- simplecov (>= 0.7)
67
- term-ansicolor
68
- thor
62
+ coercible (1.0.0)
63
+ descendants_tracker (~> 0.0.1)
64
+ coveralls (0.7.9)
65
+ multi_json (~> 1.10)
66
+ rest-client (~> 1.7)
67
+ simplecov (~> 0.9.1)
68
+ term-ansicolor (~> 1.3)
69
+ thor (~> 0.19.1)
70
+ descendants_tracker (0.0.4)
71
+ thread_safe (~> 0.3, >= 0.3.1)
69
72
  diff-lcs (1.2.5)
70
73
  docile (1.1.5)
74
+ equalizer (0.0.9)
71
75
  erubis (2.7.0)
72
76
  globalid (0.3.0)
73
77
  activesupport (>= 4.1.0)
78
+ grape (0.10.1)
79
+ activesupport
80
+ builder
81
+ hashie (>= 2.1.0)
82
+ multi_json (>= 1.3.2)
83
+ multi_xml (>= 0.5.2)
84
+ rack (>= 1.3.0)
85
+ rack-accept
86
+ rack-mount
87
+ virtus (>= 1.0.0)
88
+ hashie (3.4.0)
74
89
  hike (1.2.3)
75
90
  hitimes (1.2.2)
76
91
  hitimes (1.2.2-java)
92
+ hobbit (0.6.0)
93
+ rack
77
94
  i18n (0.7.0)
78
- jdbc-sqlite3 (3.8.7)
95
+ ice_nine (0.11.1)
79
96
  json (1.8.2)
80
97
  json (1.8.2-java)
81
98
  loofah (2.0.1)
@@ -86,13 +103,23 @@ GEM
86
103
  mini_portile (0.6.2)
87
104
  minitest (5.5.1)
88
105
  multi_json (1.10.1)
106
+ multi_xml (0.5.5)
89
107
  netrc (0.10.2)
90
108
  nio4r (1.1.0)
91
109
  nio4r (1.1.0-java)
92
- nokogiri (1.6.5)
110
+ nokogiri (1.6.6.2)
93
111
  mini_portile (~> 0.6.0)
94
- nokogiri (1.6.5-java)
112
+ nokogiri (1.6.6.2-java)
113
+ nyny (2.2.1)
114
+ rack
115
+ tilt
95
116
  rack (1.6.0)
117
+ rack-accept (0.4.5)
118
+ rack (>= 0.4)
119
+ rack-mount (0.8.3)
120
+ rack (>= 1.0.0)
121
+ rack-protection (1.5.3)
122
+ rack
96
123
  rack-test (0.6.3)
97
124
  rack (>= 1.0)
98
125
  rails (4.2.0)
@@ -124,41 +151,46 @@ GEM
124
151
  rest-client (1.7.2)
125
152
  mime-types (>= 1.16, < 3.0)
126
153
  netrc (~> 0.7)
127
- rspec (3.1.0)
128
- rspec-core (~> 3.1.0)
129
- rspec-expectations (~> 3.1.0)
130
- rspec-mocks (~> 3.1.0)
131
- rspec-core (3.1.7)
132
- rspec-support (~> 3.1.0)
133
- rspec-expectations (3.1.2)
154
+ rspec (3.2.0)
155
+ rspec-core (~> 3.2.0)
156
+ rspec-expectations (~> 3.2.0)
157
+ rspec-mocks (~> 3.2.0)
158
+ rspec-core (3.2.0)
159
+ rspec-support (~> 3.2.0)
160
+ rspec-expectations (3.2.0)
134
161
  diff-lcs (>= 1.2.0, < 2.0)
135
- rspec-support (~> 3.1.0)
136
- rspec-mocks (3.1.3)
137
- rspec-support (~> 3.1.0)
138
- rspec-rails (3.1.0)
139
- actionpack (>= 3.0)
140
- activesupport (>= 3.0)
141
- railties (>= 3.0)
142
- rspec-core (~> 3.1.0)
143
- rspec-expectations (~> 3.1.0)
144
- rspec-mocks (~> 3.1.0)
145
- rspec-support (~> 3.1.0)
146
- rspec-support (3.1.2)
162
+ rspec-support (~> 3.2.0)
163
+ rspec-mocks (3.2.0)
164
+ diff-lcs (>= 1.2.0, < 2.0)
165
+ rspec-support (~> 3.2.0)
166
+ rspec-rails (3.2.0)
167
+ actionpack (>= 3.0, <= 4.2)
168
+ activesupport (>= 3.0, <= 4.2)
169
+ railties (>= 3.0, <= 4.2)
170
+ rspec-core (~> 3.2.0)
171
+ rspec-expectations (~> 3.2.0)
172
+ rspec-mocks (~> 3.2.0)
173
+ rspec-support (~> 3.2.0)
174
+ rspec-support (3.2.0)
175
+ ruby-prof (0.15.3)
147
176
  simplecov (0.9.1)
148
177
  docile (~> 1.1.0)
149
178
  multi_json (~> 1.0)
150
179
  simplecov-html (~> 0.8.0)
151
180
  simplecov-html (0.8.0)
181
+ sinatra (1.4.5)
182
+ rack (~> 1.4)
183
+ rack-protection (~> 1.4)
184
+ tilt (~> 1.3, >= 1.3.4)
152
185
  sprockets (2.12.3)
153
186
  hike (~> 1.2)
154
187
  multi_json (~> 1.0)
155
188
  rack (~> 1.0)
156
189
  tilt (~> 1.1, != 1.3.0)
157
- sprockets-rails (2.2.2)
190
+ sprockets-rails (2.2.4)
158
191
  actionpack (>= 3.0)
159
192
  activesupport (>= 3.0)
160
193
  sprockets (>= 2.8, < 4.0)
161
- sqlite3 (1.3.10)
162
194
  term-ansicolor (1.3.0)
163
195
  tins (~> 1.0)
164
196
  thor (0.19.1)
@@ -167,21 +199,29 @@ GEM
167
199
  tilt (1.4.1)
168
200
  timers (4.0.1)
169
201
  hitimes
170
- tins (1.3.3)
202
+ tins (1.3.4)
171
203
  tzinfo (1.2.2)
172
204
  thread_safe (~> 0.1)
205
+ virtus (1.0.4)
206
+ axiom-types (~> 0.1)
207
+ coercible (~> 1.0)
208
+ descendants_tracker (~> 0.0, >= 0.0.3)
209
+ equalizer (~> 0.0, >= 0.0.9)
173
210
 
174
211
  PLATFORMS
175
212
  java
176
213
  ruby
177
214
 
178
215
  DEPENDENCIES
179
- activerecord-jdbcsqlite3-adapter
180
216
  cbor
181
217
  coveralls
182
218
  david!
183
- rails (~> 4.2)
219
+ grape
220
+ hobbit
221
+ nyny
222
+ rails (~> 4.2.0)
184
223
  rake
185
224
  rspec (~> 3.1)
186
- rspec-rails (~> 3.1)
187
- sqlite3
225
+ rspec-rails (~> 3.2.0)
226
+ ruby-prof
227
+ sinatra
data/README.md CHANGED
@@ -1,18 +1,100 @@
1
+ # David
2
+
1
3
  [![Gem Version](https://img.shields.io/gem/v/david.svg)](http://badge.fury.io/rb/david)
2
4
  [![Dependency Status](https://img.shields.io/gemnasium/nning/david.svg)](https://gemnasium.com/nning/david)
3
5
  [![Build Status](https://img.shields.io/travis/nning/david.svg)](https://travis-ci.org/nning/david)
4
6
  [![Coverage Status](https://img.shields.io/coveralls/nning/david.svg)](https://coveralls.io/r/nning/david)
5
7
  [![Code Climate](https://img.shields.io/codeclimate/github/nning/david.svg)](https://codeclimate.com/github/nning/david)
6
8
 
7
- # David
8
-
9
9
  David is a CoAP server with Rack interface to bring the illustrious family of
10
10
  Rack compatible web frameworks into the Internet of Things. **Currently, it is
11
- in a development state on not ready for use in production.**
11
+ in a development state and probably not ready for use in production.**
12
+
13
+ ## Usage
14
+
15
+ Just include David in your Gemfile!
16
+
17
+ gem 'david'
18
+
19
+ It will hook into Rack and make itself the default handler, so running `rails
20
+ s` starts David. If you want to start WEBrick for example, you can do so by
21
+ executing `rails s webrick`.
22
+
23
+ As [CoAP](https://tools.ietf.org/html/rfc7252) is a protocol for constrained
24
+ environments and machine to machine communications, returning HTML from your
25
+ controllers will not be of much use. JSON for example is more suitable in that
26
+ context. You can also utilize [JBuilder
27
+ templates](https://github.com/rails/jbuilder) for easy JSON generation.
28
+
29
+ [CBOR](https://tools.ietf.org/html/rfc7049) can be used to compress your JSON.
30
+ You can activate automatic transcoding between JSON and CBOR by setting the
31
+ Rack environment option `CBOR` or `config.coap.cbor` in your Rails application
32
+ config to `true`.
33
+
34
+ ## Tested Rack Frameworks
35
+
36
+ * [Grape](https://github.com/intridea/grape)
37
+ * [Hobbit](https://github.com/patriciomacadden/hobbit)
38
+ * [NYNY](https://github.com/alisnic/nyny)
39
+ * Plain Rack
40
+ * [Sinatra](https://github.com/sinatra/sinatra)
41
+ * [Rails](https://github.com/rails/rails)
42
+
43
+ ## Configuration
44
+
45
+ | Rack key | Rails key | Default | Semantics |
46
+ |--- |--- |--- |--- |
47
+ | Block | coap.block | true | Blockwise transfers |
48
+ | CBOR | coap.cbor | false | JSON/CBOR transcoding |
49
+ | DefaultFormat | coap.default_format | | Default Content-Type |
50
+ | Host | | ::1 / :: | Server listening host |
51
+ | Log | | info | Log level (none or debug) |
52
+ | MinimalMapping | | false | Minimal HTTP status codes mapping |
53
+ | Multicast | coap.multicast | true | Multicast support |
54
+ | Observe | coap.observe | true | Observe support |
55
+ | | coap.only | true | Removes (HTTP) middleware |
56
+ | Port | | 5683 | Server listening port |
57
+ | | coap.resource_discovery | true | Provision of `.well-known/core` |
58
+
59
+ ## Discovery
60
+
61
+ The [CoAP Discovery](https://tools.ietf.org/html/rfc7252#section-7) will be
62
+ activated by default. A `.well-known/core` resource automatically returns the
63
+ resources you defined in Rails. You can annotate this resources with attributes
64
+ like an interface description (`if`) or the content type (`ct`). (See
65
+ [RFC6690](https://tools.ietf.org/html/rfc6690) or [the
66
+ code](https://github.com/nning/coap/blob/master/lib/core/link.rb#L8) for
67
+ further documentation.)
68
+
69
+ class ThingsController < ApplicationController
70
+ discoverable \
71
+ default: { if: 'urn:things', ct: 'application/cbor' },
72
+ index: { if: 'urn:index' }
73
+
74
+ def show
75
+ render json: Thing.find(params[:id])
76
+ end
77
+
78
+ def index
79
+ render json: Thing.all
80
+ end
81
+ end
82
+
83
+ ## Rack environment
84
+
85
+ | Key | Value class | Semantics |
86
+ |--- |--- |--- |
87
+ | coap.version | Integer | Protocol version of CoAP request |
88
+ | coap.multicast | Boolean | Marks whether request was received via multicast |
89
+ | coap.dtls | String | DTLS mode (as defined in [section 9 of RFC7252](https://tools.ietf.org/html/rfc7252#section-9)) |
90
+ | coap.dtls.id | String | DTLS identity |
91
+ | coap.cbor | Object | Ruby object deserialized from CBOR |
12
92
 
13
- A fork of the CoAP gem on rubygems.org is needed:
93
+ ## Benchmarks
14
94
 
15
- https://github.com/nning/coap
95
+ David handles about 10.000 requests per second (tested in MRI 2.2.0 with up to
96
+ 10.000 concurrent clients on a single core of a Core i7-3520M CPU running Linux
97
+ 3.18.5).
16
98
 
17
99
  ## Copyright
18
100
 
data/benchmarks/Gemfile CHANGED
@@ -2,3 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'benchmark-ips'
4
4
  gem 'coap', path: '../../coap'
5
+ gem 'rack'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../../coap
3
3
  specs:
4
- coap (0.0.17.dev)
4
+ coap (0.1.0)
5
5
  celluloid-io (~> 0.16, >= 0.16.1)
6
6
  resolv-ipv6favor (~> 0)
7
7
 
@@ -18,6 +18,7 @@ GEM
18
18
  hitimes (1.2.2-java)
19
19
  nio4r (1.1.0)
20
20
  nio4r (1.1.0-java)
21
+ rack (1.6.0)
21
22
  resolv-ipv6favor (0.0.0)
22
23
  timers (4.0.1)
23
24
  hitimes
@@ -29,3 +30,4 @@ PLATFORMS
29
30
  DEPENDENCIES
30
31
  benchmark-ips
31
32
  coap!
33
+ rack
@@ -0,0 +1,20 @@
1
+ #!/bin/sh
2
+
3
+ [ ! -d coapbench ] && {
4
+ mkdir -p coapbench
5
+ cd coapbench
6
+
7
+ git clone https://github.com/eclipse/californium.git
8
+ cd californium
9
+ mvn clean install
10
+ cd -
11
+
12
+ git clone https://github.com/eclipse/californium.tools.git
13
+ cd californium.tools
14
+ mvn clean install
15
+ cd -
16
+
17
+ cd ..
18
+ }
19
+
20
+ java -jar coapbench/californium.tools/run/cf-coapbench-*.jar $@
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ ./coapbench.sh -c 1000 -t 15 "coap://[::1]:5683/hello"
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'david', path: '../..'
4
+ gem 'rack'
5
+
6
+ # Rails
7
+ gem 'rails', '~> 4.2.0'
8
+
9
+ # Grape
10
+ gem 'grape'
@@ -0,0 +1,159 @@
1
+ PATH
2
+ remote: ../..
3
+ specs:
4
+ david (0.4.0.pre)
5
+ celluloid-io (~> 0.16, >= 0.16.1)
6
+ coap (~> 0.1)
7
+ rack (~> 1.5)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actionmailer (4.2.0)
13
+ actionpack (= 4.2.0)
14
+ actionview (= 4.2.0)
15
+ activejob (= 4.2.0)
16
+ mail (~> 2.5, >= 2.5.4)
17
+ rails-dom-testing (~> 1.0, >= 1.0.5)
18
+ actionpack (4.2.0)
19
+ actionview (= 4.2.0)
20
+ activesupport (= 4.2.0)
21
+ rack (~> 1.6.0)
22
+ rack-test (~> 0.6.2)
23
+ rails-dom-testing (~> 1.0, >= 1.0.5)
24
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
25
+ actionview (4.2.0)
26
+ activesupport (= 4.2.0)
27
+ builder (~> 3.1)
28
+ erubis (~> 2.7.0)
29
+ rails-dom-testing (~> 1.0, >= 1.0.5)
30
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
31
+ activejob (4.2.0)
32
+ activesupport (= 4.2.0)
33
+ globalid (>= 0.3.0)
34
+ activemodel (4.2.0)
35
+ activesupport (= 4.2.0)
36
+ builder (~> 3.1)
37
+ activerecord (4.2.0)
38
+ activemodel (= 4.2.0)
39
+ activesupport (= 4.2.0)
40
+ arel (~> 6.0)
41
+ activesupport (4.2.0)
42
+ i18n (~> 0.7)
43
+ json (~> 1.7, >= 1.7.7)
44
+ minitest (~> 5.1)
45
+ thread_safe (~> 0.3, >= 0.3.4)
46
+ tzinfo (~> 1.1)
47
+ arel (6.0.0)
48
+ axiom-types (0.1.1)
49
+ descendants_tracker (~> 0.0.4)
50
+ ice_nine (~> 0.11.0)
51
+ thread_safe (~> 0.3, >= 0.3.1)
52
+ builder (3.2.2)
53
+ celluloid (0.16.0)
54
+ timers (~> 4.0.0)
55
+ celluloid-io (0.16.2)
56
+ celluloid (>= 0.16.0)
57
+ nio4r (>= 1.1.0)
58
+ coap (0.1.0)
59
+ celluloid-io (~> 0.16, >= 0.16.1)
60
+ resolv-ipv6favor (~> 0)
61
+ coercible (1.0.0)
62
+ descendants_tracker (~> 0.0.1)
63
+ descendants_tracker (0.0.4)
64
+ thread_safe (~> 0.3, >= 0.3.1)
65
+ equalizer (0.0.9)
66
+ erubis (2.7.0)
67
+ globalid (0.3.0)
68
+ activesupport (>= 4.1.0)
69
+ grape (0.10.1)
70
+ activesupport
71
+ builder
72
+ hashie (>= 2.1.0)
73
+ multi_json (>= 1.3.2)
74
+ multi_xml (>= 0.5.2)
75
+ rack (>= 1.3.0)
76
+ rack-accept
77
+ rack-mount
78
+ virtus (>= 1.0.0)
79
+ hashie (3.4.0)
80
+ hike (1.2.3)
81
+ hitimes (1.2.2)
82
+ i18n (0.7.0)
83
+ ice_nine (0.11.1)
84
+ json (1.8.2)
85
+ loofah (2.0.1)
86
+ nokogiri (>= 1.5.9)
87
+ mail (2.6.3)
88
+ mime-types (>= 1.16, < 3)
89
+ mime-types (2.4.3)
90
+ mini_portile (0.6.2)
91
+ minitest (5.5.1)
92
+ multi_json (1.10.1)
93
+ multi_xml (0.5.5)
94
+ nio4r (1.1.0)
95
+ nokogiri (1.6.6.2)
96
+ mini_portile (~> 0.6.0)
97
+ rack (1.6.0)
98
+ rack-accept (0.4.5)
99
+ rack (>= 0.4)
100
+ rack-mount (0.8.3)
101
+ rack (>= 1.0.0)
102
+ rack-test (0.6.3)
103
+ rack (>= 1.0)
104
+ rails (4.2.0)
105
+ actionmailer (= 4.2.0)
106
+ actionpack (= 4.2.0)
107
+ actionview (= 4.2.0)
108
+ activejob (= 4.2.0)
109
+ activemodel (= 4.2.0)
110
+ activerecord (= 4.2.0)
111
+ activesupport (= 4.2.0)
112
+ bundler (>= 1.3.0, < 2.0)
113
+ railties (= 4.2.0)
114
+ sprockets-rails
115
+ rails-deprecated_sanitizer (1.0.3)
116
+ activesupport (>= 4.2.0.alpha)
117
+ rails-dom-testing (1.0.5)
118
+ activesupport (>= 4.2.0.beta, < 5.0)
119
+ nokogiri (~> 1.6.0)
120
+ rails-deprecated_sanitizer (>= 1.0.1)
121
+ rails-html-sanitizer (1.0.1)
122
+ loofah (~> 2.0)
123
+ railties (4.2.0)
124
+ actionpack (= 4.2.0)
125
+ activesupport (= 4.2.0)
126
+ rake (>= 0.8.7)
127
+ thor (>= 0.18.1, < 2.0)
128
+ rake (10.4.2)
129
+ resolv-ipv6favor (0.0.0)
130
+ sprockets (2.12.3)
131
+ hike (~> 1.2)
132
+ multi_json (~> 1.0)
133
+ rack (~> 1.0)
134
+ tilt (~> 1.1, != 1.3.0)
135
+ sprockets-rails (2.2.4)
136
+ actionpack (>= 3.0)
137
+ activesupport (>= 3.0)
138
+ sprockets (>= 2.8, < 4.0)
139
+ thor (0.19.1)
140
+ thread_safe (0.3.4)
141
+ tilt (1.4.1)
142
+ timers (4.0.1)
143
+ hitimes
144
+ tzinfo (1.2.2)
145
+ thread_safe (~> 0.1)
146
+ virtus (1.0.4)
147
+ axiom-types (~> 0.1)
148
+ coercible (~> 1.0)
149
+ descendants_tracker (~> 0.0, >= 0.0.3)
150
+ equalizer (~> 0.0, >= 0.0.9)
151
+
152
+ PLATFORMS
153
+ ruby
154
+
155
+ DEPENDENCIES
156
+ david!
157
+ grape
158
+ rack
159
+ rails (~> 4.2.0)