david 0.3.0.pre → 0.3.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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +24 -0
  4. data/Gemfile +11 -7
  5. data/Gemfile.lock +155 -19
  6. data/README.md +21 -3
  7. data/Rakefile +5 -0
  8. data/TODO.md +73 -0
  9. data/benchmarks/Gemfile +4 -0
  10. data/benchmarks/Gemfile.lock +31 -0
  11. data/benchmarks/rps.rb +20 -0
  12. data/bin/david +9 -4
  13. data/config.ru +4 -0
  14. data/david.gemspec +10 -4
  15. data/experiments/mcast.rb +37 -0
  16. data/experiments/structs.rb +45 -0
  17. data/{test.rb → experiments/test.rb} +0 -0
  18. data/lib/david.rb +15 -4
  19. data/lib/david/actor.rb +18 -0
  20. data/lib/david/garbage_collector.rb +35 -0
  21. data/lib/david/observe.rb +102 -0
  22. data/lib/david/rails/action_controller/base.rb +11 -0
  23. data/lib/david/railties/config.rb +20 -1
  24. data/lib/david/railties/middleware.rb +18 -6
  25. data/lib/david/request.rb +80 -0
  26. data/lib/david/resource_discovery.rb +92 -0
  27. data/lib/david/resource_discovery_proxy.rb +13 -0
  28. data/lib/david/server.rb +72 -27
  29. data/lib/david/server/constants.rb +48 -0
  30. data/lib/david/server/deduplication.rb +21 -0
  31. data/lib/david/server/mapping.rb +64 -12
  32. data/lib/david/server/multicast.rb +54 -0
  33. data/lib/david/server/options.rb +32 -0
  34. data/lib/david/server/respond.rb +146 -0
  35. data/lib/david/server/utility.rb +1 -6
  36. data/lib/david/show_exceptions.rb +52 -0
  37. data/lib/david/version.rb +2 -1
  38. data/lib/rack/handler/david.rb +16 -6
  39. data/lib/rack/hello_world.rb +23 -0
  40. data/spec/dummy/Rakefile +6 -0
  41. data/spec/dummy/app/assets/images/.keep +0 -0
  42. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  43. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  44. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  45. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  46. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  47. data/spec/dummy/app/mailers/.keep +0 -0
  48. data/spec/dummy/app/models/.keep +0 -0
  49. data/spec/dummy/app/models/concerns/.keep +0 -0
  50. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  51. data/spec/dummy/bin/bundle +3 -0
  52. data/spec/dummy/bin/rails +4 -0
  53. data/spec/dummy/bin/rake +4 -0
  54. data/spec/dummy/config.ru +4 -0
  55. data/spec/dummy/config/application.rb +29 -0
  56. data/spec/dummy/config/boot.rb +5 -0
  57. data/spec/dummy/config/database.yml +25 -0
  58. data/spec/dummy/config/environment.rb +5 -0
  59. data/spec/dummy/config/environments/development.rb +37 -0
  60. data/spec/dummy/config/environments/production.rb +78 -0
  61. data/spec/dummy/config/environments/test.rb +39 -0
  62. data/spec/dummy/config/initializers/assets.rb +8 -0
  63. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  64. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  65. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  66. data/spec/dummy/config/initializers/inflections.rb +16 -0
  67. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  68. data/spec/dummy/config/initializers/session_store.rb +3 -0
  69. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  70. data/spec/dummy/config/locales/en.yml +23 -0
  71. data/spec/dummy/config/routes.rb +58 -0
  72. data/spec/dummy/config/secrets.yml +22 -0
  73. data/spec/dummy/db/test.sqlite3 +0 -0
  74. data/spec/dummy/lib/assets/.keep +0 -0
  75. data/spec/dummy/log/.keep +0 -0
  76. data/spec/dummy/public/404.html +67 -0
  77. data/spec/dummy/public/422.html +67 -0
  78. data/spec/dummy/public/500.html +66 -0
  79. data/spec/dummy/public/favicon.ico +0 -0
  80. data/spec/guerilla_rack_handler_spec.rb +16 -0
  81. data/spec/mapping_spec.rb +56 -0
  82. data/spec/observe_spec.rb +111 -0
  83. data/spec/perf/server_perf_spec.rb +15 -9
  84. data/spec/resource_discovery_spec.rb +65 -0
  85. data/spec/server_spec.rb +306 -0
  86. data/spec/spec_helper.rb +43 -1
  87. data/spec/utility_spec.rb +8 -0
  88. metadata +195 -38
  89. data/lib/david/server/response.rb +0 -124
  90. data/lib/david/well_known.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 280affbab7d4c07b1168b215bb7b09dc1ef0a71f
4
- data.tar.gz: 1e402e8168e273189df223a71eb18785cd5218be
3
+ metadata.gz: bf99b7a04f88ad84fc39ae748528fc0555d340a4
4
+ data.tar.gz: db0a00feed99717987b4b5e72e399e0c85d2accb
5
5
  SHA512:
6
- metadata.gz: feca1e49965391c84a48601b36c270b92f16b98ceea97bfb7b85a22bce016415032712fd1794139b51dcf04394649fa2e59409b920f16f6bfb8fd096565377fe
7
- data.tar.gz: 165f1c7d5238d946c1a533df8dfba4a3a65387b86ca1bec7c5428d6d76d7ef1b4c9c3ffc05b534d8302fc149d616a29aa907ee2af0b2a017d0665cd73906851c
6
+ metadata.gz: 17f584e9e2d9f2000a20eb0a22a963b42b8b4e82b9438c99e46d04be2e37c7670e35d739bd13850c45426a7c7e83837b74f266a76f4e30d117dc52a59ed08f9b
7
+ data.tar.gz: ca6cc59e8fedfa63392b6b8edbbf15076a0809e11433b9dcdeaf80d212ba696ddd0a0bc0ee7d5dc4e593ce22b3e16d7ab3574d7970ece21a6ca932379724cbc6
@@ -0,0 +1 @@
1
+ *.log
@@ -0,0 +1,24 @@
1
+ language: ruby
2
+
3
+ os:
4
+ - linux
5
+ - osx
6
+
7
+ rvm:
8
+ - 2.2
9
+ - jruby
10
+ - rbx-head
11
+
12
+ matrix:
13
+ fast_finish: true
14
+ allow_failures:
15
+ - os: osx
16
+ - rvm: jruby
17
+ - rvm: rbx-head
18
+
19
+ notifications:
20
+ email: false
21
+
22
+ script:
23
+ - bundle exec rake build
24
+ - DEBUG=1 bundle exec rspec -t ~multicast:ipv6 -t ~performance
data/Gemfile CHANGED
@@ -1,12 +1,16 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'cbor', platform: :ruby
4
- gem 'celluloid'
5
- gem 'celluloid-io'
6
- gem 'coap', '~> 0.0.16.dev', path: '../coap'
7
- gem 'rack'
3
+ gemspec
4
+
5
+ group :cbor do
6
+ gem 'cbor', platforms: :ruby
7
+ end
8
+
9
+ group :development do
10
+ gem 'sqlite3', platforms: :ruby
11
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
12
+ end
8
13
 
9
14
  group :test do
10
- gem 'rake'
11
- gem 'rspec'
15
+ gem 'coveralls', require: false
12
16
  end
@@ -1,51 +1,187 @@
1
1
  PATH
2
- remote: ../coap
2
+ remote: .
3
3
  specs:
4
- coap (0.0.16.dev)
5
- celluloid-io (~> 0.16)
6
- resolv-ipv6favor (~> 0)
4
+ david (0.3.0.pre)
5
+ celluloid-io (~> 0.16, >= 0.16.1)
6
+ coap (~> 0.1)
7
+ rack (~> 1.5)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
11
- cbor (0.5.6.4)
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
+ 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
+ activesupport (4.2.0)
47
+ i18n (~> 0.7)
48
+ json (~> 1.7, >= 1.7.7)
49
+ minitest (~> 5.1)
50
+ thread_safe (~> 0.3, >= 0.3.4)
51
+ tzinfo (~> 1.1)
52
+ arel (6.0.0)
53
+ builder (3.2.2)
54
+ cbor (0.5.9.0)
12
55
  celluloid (0.16.0)
13
56
  timers (~> 4.0.0)
14
- celluloid-io (0.16.0)
57
+ celluloid-io (0.16.1)
15
58
  celluloid (>= 0.16.0)
16
59
  nio4r (>= 1.0.0)
60
+ coap (0.1.0)
61
+ celluloid-io (~> 0.16, >= 0.16.1)
62
+ 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
17
69
  diff-lcs (1.2.5)
70
+ docile (1.1.5)
71
+ erubis (2.7.0)
72
+ globalid (0.3.0)
73
+ activesupport (>= 4.1.0)
74
+ hike (1.2.3)
18
75
  hitimes (1.2.2)
19
76
  hitimes (1.2.2-java)
20
- nio4r (1.0.1)
21
- nio4r (1.0.1-java)
22
- rack (1.5.2)
23
- rake (10.3.2)
77
+ i18n (0.7.0)
78
+ jdbc-sqlite3 (3.8.7)
79
+ json (1.8.2)
80
+ json (1.8.2-java)
81
+ loofah (2.0.1)
82
+ nokogiri (>= 1.5.9)
83
+ mail (2.6.3)
84
+ mime-types (>= 1.16, < 3)
85
+ mime-types (2.4.3)
86
+ mini_portile (0.6.2)
87
+ minitest (5.5.1)
88
+ multi_json (1.10.1)
89
+ netrc (0.10.2)
90
+ nio4r (1.1.0)
91
+ nio4r (1.1.0-java)
92
+ nokogiri (1.6.5)
93
+ mini_portile (~> 0.6.0)
94
+ nokogiri (1.6.5-java)
95
+ rack (1.6.0)
96
+ rack-test (0.6.3)
97
+ rack (>= 1.0)
98
+ rails (4.2.0)
99
+ actionmailer (= 4.2.0)
100
+ actionpack (= 4.2.0)
101
+ actionview (= 4.2.0)
102
+ activejob (= 4.2.0)
103
+ activemodel (= 4.2.0)
104
+ activerecord (= 4.2.0)
105
+ activesupport (= 4.2.0)
106
+ bundler (>= 1.3.0, < 2.0)
107
+ railties (= 4.2.0)
108
+ sprockets-rails
109
+ rails-deprecated_sanitizer (1.0.3)
110
+ activesupport (>= 4.2.0.alpha)
111
+ rails-dom-testing (1.0.5)
112
+ activesupport (>= 4.2.0.beta, < 5.0)
113
+ nokogiri (~> 1.6.0)
114
+ rails-deprecated_sanitizer (>= 1.0.1)
115
+ rails-html-sanitizer (1.0.1)
116
+ loofah (~> 2.0)
117
+ railties (4.2.0)
118
+ actionpack (= 4.2.0)
119
+ activesupport (= 4.2.0)
120
+ rake (>= 0.8.7)
121
+ thor (>= 0.18.1, < 2.0)
122
+ rake (10.4.2)
24
123
  resolv-ipv6favor (0.0.0)
124
+ rest-client (1.7.2)
125
+ mime-types (>= 1.16, < 3.0)
126
+ netrc (~> 0.7)
25
127
  rspec (3.1.0)
26
128
  rspec-core (~> 3.1.0)
27
129
  rspec-expectations (~> 3.1.0)
28
130
  rspec-mocks (~> 3.1.0)
29
- rspec-core (3.1.2)
131
+ rspec-core (3.1.7)
30
132
  rspec-support (~> 3.1.0)
31
- rspec-expectations (3.1.0)
133
+ rspec-expectations (3.1.2)
32
134
  diff-lcs (>= 1.2.0, < 2.0)
33
135
  rspec-support (~> 3.1.0)
34
- rspec-mocks (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)
35
145
  rspec-support (~> 3.1.0)
36
- rspec-support (3.1.0)
146
+ rspec-support (3.1.2)
147
+ simplecov (0.9.1)
148
+ docile (~> 1.1.0)
149
+ multi_json (~> 1.0)
150
+ simplecov-html (~> 0.8.0)
151
+ simplecov-html (0.8.0)
152
+ sprockets (2.12.3)
153
+ hike (~> 1.2)
154
+ multi_json (~> 1.0)
155
+ rack (~> 1.0)
156
+ tilt (~> 1.1, != 1.3.0)
157
+ sprockets-rails (2.2.2)
158
+ actionpack (>= 3.0)
159
+ activesupport (>= 3.0)
160
+ sprockets (>= 2.8, < 4.0)
161
+ sqlite3 (1.3.10)
162
+ term-ansicolor (1.3.0)
163
+ tins (~> 1.0)
164
+ thor (0.19.1)
165
+ thread_safe (0.3.4)
166
+ thread_safe (0.3.4-java)
167
+ tilt (1.4.1)
37
168
  timers (4.0.1)
38
169
  hitimes
170
+ tins (1.3.3)
171
+ tzinfo (1.2.2)
172
+ thread_safe (~> 0.1)
39
173
 
40
174
  PLATFORMS
41
175
  java
42
176
  ruby
43
177
 
44
178
  DEPENDENCIES
179
+ activerecord-jdbcsqlite3-adapter
45
180
  cbor
46
- celluloid
47
- celluloid-io
48
- coap (~> 0.0.16.dev)!
49
- rack
181
+ coveralls
182
+ david!
183
+ rails (~> 4.2)
50
184
  rake
51
- rspec
185
+ rspec (~> 3.1)
186
+ rspec-rails (~> 3.1)
187
+ sqlite3
data/README.md CHANGED
@@ -1,5 +1,23 @@
1
- David
2
- =====
1
+ [![Gem Version](https://img.shields.io/gem/v/david.svg)](http://badge.fury.io/rb/david)
2
+ [![Dependency Status](https://img.shields.io/gemnasium/nning/david.svg)](https://gemnasium.com/nning/david)
3
+ [![Build Status](https://img.shields.io/travis/nning/david.svg)](https://travis-ci.org/nning/david)
4
+ [![Coverage Status](https://img.shields.io/coveralls/nning/david.svg)](https://coveralls.io/r/nning/david)
5
+ [![Code Climate](https://img.shields.io/codeclimate/github/nning/david.svg)](https://codeclimate.com/github/nning/david)
6
+
7
+ # David
3
8
 
4
9
  David is a CoAP server with Rack interface to bring the illustrious family of
5
- Rack compatible web frameworks into the Internet of Things.
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.**
12
+
13
+ A fork of the CoAP gem on rubygems.org is needed:
14
+
15
+ https://github.com/nning/coap
16
+
17
+ ## Copyright
18
+
19
+ The code is published under the GPLv3 license (see the LICENSE file).
20
+
21
+ ### Authors
22
+
23
+ * [henning mueller](https://nning.io)
data/Rakefile CHANGED
@@ -1,6 +1,11 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
 
4
+ # APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
5
+ # load 'rails/tasks/engine.rake'
6
+
7
+ Bundler::GemHelper.install_tasks
8
+
4
9
  RSpec::Core::RakeTask.new(:spec)
5
10
 
6
11
  task default: :spec
data/TODO.md ADDED
@@ -0,0 +1,73 @@
1
+ TODO
2
+ ====
3
+
4
+ Solid, platform independent multicast
5
+ -------------------------------------
6
+
7
+ ### Current implementation state:
8
+
9
+ * SO_REUSEADDR=1 to allow different servers simultaneously.
10
+ * 0.0.0.0 (IPv4) and interface index 0 (IPv6) as interface for membership
11
+ should select OS default interface.
12
+ * On OSX, ifindex 0 does not work:
13
+ * http://lists.apple.com/archives/darwin-kernel/2014/Mar/msg00012.html
14
+ * Therefore, set ifindex explicitly to en1 (or en0).
15
+ * Join 224.0.1.187, ff02::fd, and ff05::fd.
16
+ * OSX needs ff02::1 joined explicitly.
17
+
18
+ (Remember configuring firewall accordingly.)
19
+
20
+ ### Tests:
21
+
22
+ Desktop (Arch Linux) ok
23
+ Notebook (Arch Linux) ok
24
+ Debian (7.7, KVM) IPv6 fail (timeout)
25
+ Ubuntu (12.04, Travis CI) IPv6 fail (timeout)
26
+ OSX (10.9.5, KVM) ok
27
+
28
+
29
+ Better blockwise transfer support
30
+ ---------------------------------
31
+
32
+ ### Current implementation state:
33
+
34
+ * The server supports control usage of block messages, so block only works for
35
+ outbound documents.
36
+
37
+ ### Features to be implemented:
38
+
39
+ * Handling of blockwise PUT or POST.
40
+ * Caching of documents so that a Rack app call is not necessary for every
41
+ block.
42
+
43
+
44
+ More detailed CoAP implementation
45
+ ---------------------------------
46
+
47
+ ### Examples for missing or unsufficient features:
48
+
49
+ * Message Deduplication (4.5.)
50
+ * Transmission Parameters (4.8.)
51
+ * Request/Response Matching (5.3.2.) (became transparent in connection to
52
+ observe transmissions)
53
+ * "For a new Confirmable message, the initial timeout is set to a random
54
+ duration (often not an integral number of seconds) between ACK_TIMEOUT and
55
+ (ACK_TIMEOUT * ACK_RANDOM_FACTOR) (see Section 4.8)"
56
+ * Validation of ETag (conditional requests)
57
+ * Request validations and error responses
58
+ * Follow redirects
59
+
60
+
61
+ Non-blocking I/O
62
+ ----------------
63
+
64
+ * Check if I/O in Rack environment blocks or can block and what possibilities
65
+ exist to make it non-blocking.
66
+
67
+
68
+ Observe
69
+ -------
70
+
71
+ * Garbage collection.
72
+ * Observe on .well-known/core returns "Resource not observable" but Observe
73
+ actor still calls Rails in tick.
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'benchmark-ips'
4
+ gem 'coap', path: '../../coap'
@@ -0,0 +1,31 @@
1
+ PATH
2
+ remote: ../../coap
3
+ specs:
4
+ coap (0.0.17.dev)
5
+ celluloid-io (~> 0.16, >= 0.16.1)
6
+ resolv-ipv6favor (~> 0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ benchmark-ips (2.1.1)
12
+ celluloid (0.16.0)
13
+ timers (~> 4.0.0)
14
+ celluloid-io (0.16.1)
15
+ celluloid (>= 0.16.0)
16
+ nio4r (>= 1.0.0)
17
+ hitimes (1.2.2)
18
+ hitimes (1.2.2-java)
19
+ nio4r (1.1.0)
20
+ nio4r (1.1.0-java)
21
+ resolv-ipv6favor (0.0.0)
22
+ timers (4.0.1)
23
+ hitimes
24
+
25
+ PLATFORMS
26
+ java
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ benchmark-ips
31
+ coap!
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'benchmark/ips'
4
+
5
+ require 'coap'
6
+ include CoRE
7
+
8
+ uri = ARGV[0] || 'coap://[::1]/hello'
9
+
10
+ Benchmark.ips do |x|
11
+ x.warmup = 30
12
+ x.time = 30
13
+
14
+ x.report(uri) do
15
+ response = CoAP::Client.new.get_by_uri(uri)
16
+ raise unless response.mcode == [2, 5]
17
+ end
18
+
19
+ x.compare!
20
+ end
data/bin/david CHANGED
@@ -1,11 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require_relative '../lib/david'
4
- require_relative '../lib/rack/hello_world'
3
+ $:.unshift(File.expand_path(File.join('..', '..', 'lib'), __FILE__))
5
4
 
6
- debug = true if ARGV.include?('-d')
5
+ require 'david'
6
+ require 'rack/hello_world'
7
+
8
+ options = {}
9
+ options[:Log] = 'debug' if ARGV.include?('-d')
10
+ options[:Multicast] = false if defined?(JRuby)
7
11
 
8
12
  klass = Rack::HelloWorld.new
13
+ klass = Rack::ETag.new(klass)
9
14
  klass = Rack::Lint.new(klass) if ARGV.include?('-l')
10
15
 
11
- Rack::Handler::David.run(klass, :Debug => debug)
16
+ Rack::Handler::David.run(klass, options)