angelo 0.3.3 → 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.
@@ -1,5 +1,4 @@
1
1
  require_relative '../spec_helper'
2
- require 'angelo/tilt/erb'
3
2
 
4
3
  describe Angelo::Base do
5
4
  describe Angelo::Tilt::ERB do
@@ -54,8 +53,6 @@ JS
54
53
 
55
54
  define_app do
56
55
 
57
- include Angelo::Tilt::ERB
58
-
59
56
  @root = TEST_APP_ROOT
60
57
 
61
58
  def set_vars
@@ -218,6 +215,71 @@ HTML
218
215
  last_response.body.must_equal expected_json
219
216
  last_response.headers['Content-Type'].must_equal 'application/json'
220
217
  end
218
+ end
219
+
220
+ describe 'reload_templates!' do
221
+
222
+ expected_html = <<HTML
223
+ <!doctype html>
224
+ <html>
225
+ <head>
226
+ <title>test</title>
227
+ </head>
228
+ <body>
229
+ foo - asdf
230
+ locals :bar - bat
231
+
232
+ </body>
233
+ </html>
234
+ HTML
235
+
236
+ reloaded_expected_html = <<HTML
237
+ <!doctype html>
238
+ <html>
239
+ <head>
240
+ <title>test</title>
241
+ </head>
242
+ <body>
243
+ foo - asdf
244
+ locals :bar - bat
245
+ hi
246
+
247
+ </body>
248
+ </html>
249
+ HTML
250
+
251
+ define_app do
252
+ @root = TEST_APP_ROOT
253
+
254
+ def set_vars
255
+ @title = 'test'
256
+ @foo = params[:foo]
257
+ end
258
+
259
+ reload_templates!
260
+
261
+ get '/' do
262
+ set_vars
263
+ erb :index, locals: {bar: 'bat'}
264
+ end
265
+ end
266
+
267
+ it 'reloads templates' do
268
+ original_index = File.read TEST_APP_ROOT + '/views/index.html.erb'
269
+ begin
270
+ get '/', foo: 'asdf'
271
+ last_response_must_be_html expected_html
272
+ File.open TEST_APP_ROOT + '/views/index.html.erb', 'a' do |f|
273
+ f.puts 'hi'
274
+ end
275
+ get '/', foo: 'asdf'
276
+ last_response_must_be_html reloaded_expected_html
277
+ ensure
278
+ File.open TEST_APP_ROOT + '/views/index.html.erb', 'w' do |f|
279
+ f.write original_index
280
+ end
281
+ end
282
+ end
221
283
 
222
284
  end
223
285
  end
@@ -1,10 +1,8 @@
1
1
  if RUBY_VERSION =~ /^2\.(\d)/ and $1.to_i > 0 and RUBY_PLATFORM != 'java'
2
2
 
3
3
  require_relative '../spec_helper'
4
- require 'angelo/mustermann'
5
- require 'angelo/tilt/erb'
6
4
 
7
- describe Angelo::Mustermann do
5
+ describe 'mustermann integration' do
8
6
 
9
7
  describe 'pattern matching' do
10
8
 
@@ -12,7 +10,6 @@ if RUBY_VERSION =~ /^2\.(\d)/ and $1.to_i > 0 and RUBY_PLATFORM != 'java'
12
10
  let(:mm_pattern){ ::Mustermann.new(pattern) }
13
11
 
14
12
  define_app do
15
- include Angelo::Mustermann
16
13
  content_type :json
17
14
 
18
15
  get pattern do
@@ -59,8 +56,6 @@ if RUBY_VERSION =~ /^2\.(\d)/ and $1.to_i > 0 and RUBY_PLATFORM != 'java'
59
56
  describe 'tilt/erb integration' do
60
57
 
61
58
  define_app do
62
- include Angelo::Tilt::ERB
63
- include Angelo::Mustermann
64
59
 
65
60
  @root = TEST_APP_ROOT
66
61
 
@@ -99,7 +94,6 @@ HTML
99
94
  describe 'params in route blocks' do
100
95
 
101
96
  define_app do
102
- include Angelo::Mustermann
103
97
 
104
98
  before '/before/:foo' do
105
99
  @foo = params[:foo]
@@ -127,7 +121,6 @@ HTML
127
121
  describe 'wildcard' do
128
122
 
129
123
  define_app do
130
- include Angelo::Mustermann
131
124
 
132
125
  before do
133
126
  @foo = params[:foo]
@@ -0,0 +1,19 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "parse_options" do
4
+ describe "parses" do
5
+ it "-p port" do
6
+ Class.new(Angelo::Base) do
7
+ parse_options("-p 12345".split)
8
+ port.must_equal 12345
9
+ end
10
+ end
11
+
12
+ it "-o addr" do
13
+ Class.new(Angelo::Base) do
14
+ parse_options("-o 3.2.1.0".split)
15
+ addr.must_equal "3.2.1.0"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -60,6 +60,13 @@ describe Angelo::ParamsParser do
60
60
  parser.parse_post_body.must_equal post_params
61
61
  end
62
62
 
63
+ it "doesn't choke on empty JSON POST bodies" do
64
+ parser.form_encoded = false
65
+ parser.json = true
66
+ parser.body = ""
67
+ parser.parse_post_body.must_equal({})
68
+ end
69
+
63
70
  it 'recursively symhashes JSON POST bodies params' do
64
71
  nested = {
65
72
  foo: {
@@ -84,7 +91,7 @@ describe Angelo::ParamsParser do
84
91
  parser.json = true
85
92
  parser.query_string = get_params
86
93
  parser.body = json_params
87
- parser.parse_post_body.must_equal post_params
94
+ parser.parse_query_string_and_post_body.must_equal post_params
88
95
  end
89
96
 
90
97
  it 'does not parse POST bodies if no Content-Type' do
@@ -92,8 +99,26 @@ describe Angelo::ParamsParser do
92
99
  parser.json = false
93
100
  parser.query_string = get_params
94
101
  parser.body = nil
95
- parser.parse_post_body.must_equal params_s
96
102
  parser.parse_query_string.must_equal params_s
103
+ parser.parse_post_body.must_equal({})
104
+ parser.parse_query_string_and_post_body.must_equal params_s
105
+ end
106
+
107
+ end
108
+
109
+ describe Angelo::SymHash do
110
+
111
+ describe ".new" do
112
+ it "returns a Hash" do
113
+ Angelo::SymHash.new.must_be_kind_of Hash
114
+ end
115
+ end
116
+
117
+ it "fetches values for Symbols that were inserted with Strings" do
118
+ symhash = Angelo::SymHash.new
119
+ symhash["x"] = "y"
120
+ symhash["x"].must_equal "y"
121
+ symhash[:x].must_equal "y"
97
122
  end
98
123
 
99
124
  end
@@ -442,6 +442,24 @@ describe Angelo::Base do
442
442
 
443
443
  end
444
444
 
445
+ describe 'test Angelo::Base subclasses' do
446
+
447
+ class MyWebApp < Angelo::Base
448
+ get '/up_and_running' do
449
+ content_type :html
450
+ 'ok'
451
+ end
452
+ end
453
+
454
+ define_app MyWebApp
455
+
456
+ it 'answers to up_and_running' do
457
+ get '/up_and_running'
458
+ assert_equal(last_response.body, 'ok')
459
+ end
460
+
461
+ end
462
+
445
463
  describe 'dsl configs' do
446
464
 
447
465
  describe 'addr' do
@@ -0,0 +1,38 @@
1
+ # This file is run by main_test.rb. It starts a separate server
2
+ # process that main_spec.rb queries to make sure things get set up and
3
+ # work correctly with require "angelo/main" which we don't want to
4
+ # require in the test process because it wants to take over: parse
5
+ # args, add methods to main, and run a server. So we isolate it in
6
+ # its own process here.
7
+
8
+ require "rubygems"
9
+ require "bundler/setup"
10
+
11
+ $:.unshift File.expand_path "../../../lib", __FILE__
12
+ require "angelo/main"
13
+
14
+ # Use top-level DSL to make sure it works. And the server should
15
+ # auto-run at exit.
16
+
17
+ helpers do
18
+ def help_me
19
+ "help me!"
20
+ end
21
+ end
22
+
23
+ get "/app_file" do
24
+ self.class.app_file
25
+ end
26
+
27
+ get "/mainonly" do
28
+ begin
29
+ Object.new.send(:get, "/spud") {}
30
+ "false"
31
+ rescue NameError
32
+ "true"
33
+ end
34
+ end
35
+
36
+ get "/help" do
37
+ help_me
38
+ end
@@ -0,0 +1,101 @@
1
+ # These tests start a real server and talk to it over TCP so we can
2
+ # isolate the effects of require "angelo/main" in a separate process
3
+ # but still test them.
4
+ #
5
+ # See test/main/app.rb for the code of the app we test against.
6
+
7
+ require_relative '../spec_helper'
8
+
9
+ class MainSpec < Minitest::Spec
10
+
11
+ # Info for starting the server.
12
+
13
+ app_file = File.expand_path("../app.rb", __FILE__)
14
+ address = "127.0.0.1"
15
+ port = 14410
16
+
17
+ server_command = "#{RbConfig.ruby} #{app_file} -o #{address} -p #{port}"
18
+
19
+ # Start the server.
20
+
21
+ pid = spawn server_command, out: "/dev/null", err: "/dev/null"
22
+
23
+ # Prepare to shut it down.
24
+
25
+ MiniTest.after_run do
26
+ begin
27
+ Process.kill("KILL", pid)
28
+ rescue Errno::ESRCH
29
+ end
30
+ end
31
+
32
+ # Client for talking to the server.
33
+
34
+ client = HTTPClient.new
35
+ client.connect_timeout = 1
36
+ client.send_timeout = 1
37
+ client.receive_timeout = 1
38
+
39
+ # Use define method so client_get's body is a closure that captures
40
+ # the lovely variables we just set up. Nevermind all the hoops we
41
+ # have to jump through to do that. Define this on the class because
42
+ # we're going to need it in a bit to check that the server is alive.
43
+
44
+ self.singleton_class.class_eval do
45
+ define_method :client_get do |url|
46
+ client.get("http://#{address}:#{port}#{url}").body
47
+ end
48
+ end
49
+
50
+ def client_get(url)
51
+ self.class.client_get(url)
52
+ end
53
+
54
+ # Wait for the server to start up. If it doesn't start, the
55
+ # cleanest thing to do seems ot be to let the tests run anyway and
56
+ # fail to connect.
57
+
58
+ def self.wait_for_server(timeout)
59
+ started = Time.now
60
+ while !(alive = alive?) && Time.now - started < timeout
61
+ sleep 0.1
62
+ end
63
+ alive
64
+ end
65
+
66
+ def self.alive?
67
+ # This will 404 but that's good enough.
68
+ 3.times { client_get("/ping") }
69
+ true
70
+ rescue Errno::ECONNREFUSED, Errno::ECONNRESET, EOFError, SystemCallError
71
+ # No doubt that's not an exhaustive list of exceptions we should
72
+ # rescue.
73
+ false
74
+ end
75
+
76
+ if !self.wait_for_server(2)
77
+ # Write this out after the tests finish, where it's likely to be seen.
78
+ MiniTest.after_run do
79
+ STDERR.puts
80
+ STDERR.puts "The server for main_spec.rb failed to start."
81
+ STDERR.puts "Try running it manually for debugging like this:"
82
+ STDERR.puts " #{server_command}"
83
+ STDERR.puts
84
+ end
85
+ end
86
+
87
+ describe 'require "angelo/main"' do
88
+ it "sets app_file to the file being run" do
89
+ client_get("/app_file").must_equal app_file
90
+ end
91
+
92
+ it "only extends main" do
93
+ client_get("/mainonly").must_equal "true"
94
+ end
95
+
96
+ it "makes helpers accessible" do
97
+ client_get("/help").must_equal "help me!"
98
+ end
99
+ end
100
+
101
+ end
@@ -1,5 +1,12 @@
1
1
  $:.unshift File.expand_path '../../lib', __FILE__
2
2
 
3
+ if RUBY_ENGINE == "ruby" && ENV['TRAVIS'] != 'true'
4
+ require 'simplecov'
5
+ SimpleCov.coverage_dir File.join('test', 'coverage')
6
+ SimpleCov.start
7
+ SimpleCov.command_name 'minitest'
8
+ end
9
+
3
10
  require 'bundler'
4
11
  Bundler.require :default, :development, :test
5
12
  require 'minitest/pride'
@@ -42,47 +49,8 @@ class CountDownLatch
42
49
 
43
50
  end
44
51
 
45
- module Cellper
46
-
47
- @@stop = false
48
- @@testers = {}
49
-
50
- def define_action sym, &block
51
- define_method sym, &block
52
- end
53
-
54
- def remove_action sym
55
- remove_method sym
56
- end
57
-
58
- def unstop!
59
- @@stop = false
60
- end
61
-
62
- def stop!
63
- @@stop = true
64
- end
65
-
66
- def stop?
67
- @@stop
68
- end
69
-
70
- def testers; @@testers; end
71
-
72
- end
73
-
74
- class Reactor
75
- include Celluloid::IO
76
- extend Cellper
77
- end
78
-
79
52
  $reactor = Reactor.new
80
53
 
81
- class ActorPool
82
- include Celluloid
83
- extend Cellper
84
- end
85
-
86
54
  $pool = ActorPool.pool size: CONCURRENCY
87
55
 
88
56
  def obj
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: angelo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenichi Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-16 00:00:00.000000000 Z
11
+ date: 2015-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: reel
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tilt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mustermann
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.4'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.4'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: mime-types
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -38,7 +66,7 @@ dependencies:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
68
  version: '2.4'
41
- description: A Sinatra-esque DSL for Reel
69
+ description: A Sinatra-like DSL for Reel
42
70
  email:
43
71
  - kenichi.nakamura@gmail.com
44
72
  executables: []
@@ -55,8 +83,8 @@ files:
55
83
  - angelo.gemspec
56
84
  - lib/angelo.rb
57
85
  - lib/angelo/base.rb
86
+ - lib/angelo/main.rb
58
87
  - lib/angelo/minitest/helpers.rb
59
- - lib/angelo/mustermann.rb
60
88
  - lib/angelo/params_parser.rb
61
89
  - lib/angelo/responder.rb
62
90
  - lib/angelo/responder/eventsource.rb
@@ -70,11 +98,14 @@ files:
70
98
  - test/angelo/eventsource_spec.rb
71
99
  - test/angelo/filter_spec.rb
72
100
  - test/angelo/mustermann_spec.rb
101
+ - test/angelo/options_spec.rb
73
102
  - test/angelo/params_spec.rb
74
103
  - test/angelo/stash_spec.rb
75
104
  - test/angelo/static_spec.rb
76
105
  - test/angelo/websocket_spec.rb
77
106
  - test/angelo_spec.rb
107
+ - test/main/app.rb
108
+ - test/main/main_spec.rb
78
109
  - test/spec_helper.rb
79
110
  - test/test_app_root/public/jquery-1.7.1.min.js
80
111
  - test/test_app_root/public/test.css
@@ -99,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
130
  requirements:
100
131
  - - ">="
101
132
  - !ruby/object:Gem::Version
102
- version: '0'
133
+ version: 2.1.0
103
134
  required_rubygems_version: !ruby/object:Gem::Requirement
104
135
  requirements:
105
136
  - - ">="
@@ -110,5 +141,5 @@ rubyforge_project:
110
141
  rubygems_version: 2.4.5
111
142
  signing_key:
112
143
  specification_version: 4
113
- summary: A Sinatra-esque DSL for Reel
144
+ summary: A Sinatra-like DSL for Reel
114
145
  test_files: []