jellyfish 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,12 +1,14 @@
1
1
 
2
2
  require 'jellyfish/test'
3
3
  require 'uri'
4
+ require 'stringio'
4
5
 
5
6
  describe 'from README.md' do
6
7
  after do
7
8
  [:Tank, :Heater, :Protector].each do |const|
8
9
  Object.send(:remove_const, const) if Object.const_defined?(const)
9
10
  end
11
+ Muack.verify
10
12
  end
11
13
 
12
14
  readme = File.read(
@@ -15,22 +17,26 @@ describe 'from README.md' do
15
17
  /### ([^\n]+).+?``` ruby\n(.+?)\n```\n\n<!---(.+?)-->/m)
16
18
 
17
19
  codes.each.with_index do |(title, code, test), index|
18
- if title =~ /NewRelic/i
19
- warn "Skip NewRelic Test" unless Bacon.kind_of?(Bacon::TestUnitOutput)
20
- next
21
- end
20
+ next if title =~ /NewRelic/i
22
21
 
23
- should "pass from README.md #%02d #{title}" % index do
22
+ would "pass from README.md #%02d #{title}" % index do
24
23
  method_path, expect = test.strip.split("\n", 2)
25
24
  method, path = method_path.split(' ')
26
25
  uri = URI.parse(path)
27
26
  pinfo, query = uri.path, uri.query
28
27
 
28
+ sock = nil
29
29
  status, headers, body = File.open(File::NULL) do |input|
30
30
  Rack::Builder.app{ eval(code) }.call(
31
31
  'REQUEST_METHOD' => method, 'PATH_INFO' => pinfo,
32
- 'QUERY_STRING' => query , 'rack.input' => input,
33
- 'SCRIPT_NAME' => '')
32
+ 'QUERY_STRING' => query , 'SCRIPT_NAME'=> '' ,
33
+ 'rack.input' => input ,
34
+ 'rack.hijack' => lambda{
35
+ sock = StringIO.new
36
+ # or TypeError: no implicit conversion of StringIO into IO
37
+ mock(IO).select([sock]){ [[sock], [], []] }
38
+ sock
39
+ })
34
40
  end
35
41
 
36
42
  body.extend(Enumerable)
@@ -2,9 +2,9 @@
2
2
  require 'jellyfish/test'
3
3
 
4
4
  describe 'Inheritance' do
5
- behaves_like :jellyfish
5
+ paste :jellyfish
6
6
 
7
- should 'inherit routes' do
7
+ would 'inherit routes' do
8
8
  sup = Class.new{
9
9
  include Jellyfish
10
10
  get('/0'){ 'a' }
@@ -27,7 +27,7 @@ describe 'Inheritance' do
27
27
  app.class.routes['get'].size.should.eq 2
28
28
  end
29
29
 
30
- should 'inherit handlers' do
30
+ would 'inherit handlers' do
31
31
  sup = Class.new{
32
32
  include Jellyfish
33
33
  handle(TypeError){ 'a' }
@@ -47,7 +47,7 @@ describe 'Inheritance' do
47
47
  app.class.handlers.size.should.eq 2
48
48
  end
49
49
 
50
- should 'inherit controller' do
50
+ would 'inherit controller' do
51
51
  sup = Class.new{
52
52
  include Jellyfish
53
53
  controller_include Module.new{ def f; 'a'; end }
@@ -66,7 +66,7 @@ describe 'Inheritance' do
66
66
  app.class.controller_include.size.should.eq 1
67
67
  end
68
68
 
69
- should 'inherit handle_exceptions' do
69
+ would 'inherit handle_exceptions' do
70
70
  sup = Class.new{
71
71
  include Jellyfish
72
72
  handle_exceptions false
data/test/test_log.rb CHANGED
@@ -1,11 +1,8 @@
1
1
 
2
2
  require 'jellyfish/test'
3
- require 'muack'
4
-
5
- include Muack::API
6
3
 
7
4
  describe Jellyfish do
8
- behaves_like :jellyfish
5
+ paste :jellyfish
9
6
 
10
7
  after do
11
8
  Muack.verify
@@ -15,7 +12,8 @@ describe Jellyfish do
15
12
  include Jellyfish
16
13
  get('/log') { log('hi') }
17
14
  get('/log_error'){
18
- log_error(stub(RuntimeError.new).backtrace{ ['backtrace'] }.object)
15
+ log_error(
16
+ Muack::API.stub(RuntimeError.new).backtrace{ ['backtrace'] }.object)
19
17
  }
20
18
  def self.name
21
19
  'Name'
@@ -28,13 +26,13 @@ describe Jellyfish do
28
26
  log
29
27
  end
30
28
 
31
- should "log to env['rack.errors']" do
29
+ would "log to env['rack.errors']" do
32
30
  log = mock_log
33
31
  get('/log', app, 'rack.errors' => log)
34
32
  log.should.eq ['[Name] hi']
35
33
  end
36
34
 
37
- should "log_error to env['rack.errors']" do
35
+ would "log_error to env['rack.errors']" do
38
36
  log = mock_log
39
37
  get('/log_error', app, 'rack.errors' => log)
40
38
  log.should.eq ['[Name] #<RuntimeError: RuntimeError> ["backtrace"]']
data/test/test_misc.rb CHANGED
@@ -2,23 +2,33 @@
2
2
  require 'jellyfish/test'
3
3
 
4
4
  describe Jellyfish do
5
- behaves_like :jellyfish
5
+ paste :jellyfish
6
6
 
7
7
  app = Class.new{
8
8
  include Jellyfish
9
+ handle_exceptions false
10
+ get('/boom'){ halt 'string' }
9
11
  get
10
12
  }.new
11
13
 
12
- should 'match wildcard' do
14
+ would 'match wildcard' do
13
15
  get('/a', app).should.eq [200, {}, ['']]
14
16
  get('/b', app).should.eq [200, {}, ['']]
15
17
  end
16
18
 
17
- should 'accept to_path body' do
19
+ would 'accept to_path body' do
18
20
  a = Class.new{
19
21
  include Jellyfish
20
22
  get{ File.open(__FILE__) }
21
23
  }.new
22
24
  get('/', a).last.to_path.should.eq __FILE__
23
25
  end
26
+
27
+ would 'raise TypeError if we try to respond non-Response or non-Rack' do
28
+ begin
29
+ get('/boom', app)
30
+ rescue TypeError => e
31
+ e.message.should.include? '"string"'
32
+ end
33
+ end
24
34
  end
data/test/test_swagger.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  require 'jellyfish/test'
3
3
 
4
4
  describe Jellyfish do
5
- behaves_like :jellyfish
5
+ paste :jellyfish
6
6
 
7
7
  app = Rack::Builder.app do
8
8
  eval File.read("#{File.dirname(__FILE__)}/../config.ru")
@@ -12,7 +12,7 @@ describe Jellyfish do
12
12
  hash.inject({}){ |r, (k, v)| r[k.to_s] = v; r }
13
13
  end
14
14
 
15
- should '/swagger' do
15
+ would '/swagger' do
16
16
  status, headers, body = get('/swagger', app)
17
17
  status .should.eq 200
18
18
  headers['Content-Type'].should.eq 'application/json; charset=utf-8'
@@ -24,7 +24,7 @@ describe Jellyfish do
24
24
  [{'path' => '/users'}, {'path' => '/posts'}]
25
25
  end
26
26
 
27
- should '/swagger/users' do
27
+ would '/swagger/users' do
28
28
  status, headers, body = get('/swagger/users', app)
29
29
  status .should.eq 200
30
30
  res = Jellyfish::Json.decode(body.to_a.join)
@@ -87,12 +87,12 @@ describe Jellyfish do
87
87
 
88
88
  swagger = Jellyfish::Swagger.new(Class.new{include Jellyfish})
89
89
 
90
- should 'swagger_path' do
90
+ would 'swagger_path' do
91
91
  swagger.send(:swagger_path, '/') .should.eq '/'
92
92
  swagger.send(:swagger_path, '/users/{id}').should.eq '/users'
93
93
  end
94
94
 
95
- should 'nickname' do
95
+ would 'nickname' do
96
96
  swagger.send(:nickname, '/') .should.eq '/'
97
97
  swagger.send(:nickname, '/users/{id}') .should.eq '/users/{id}'
98
98
  swagger.send(:nickname, %r{\A/users/(?<id>\d+)}).should.eq '/users/{id}'
@@ -100,14 +100,14 @@ describe Jellyfish do
100
100
  swagger.send(:nickname, %r{/(?<a>\d)/(?<b>\w)$}).should.eq '/{a}/{b}'
101
101
  end
102
102
 
103
- should 'notes' do
103
+ would 'notes' do
104
104
  swagger.send(:notes, :summary => 'summary', :notes => 'notes').
105
105
  should.eq 'summary<br>notes'
106
106
  swagger.send(:notes, :summary => 'summary').
107
107
  should.eq 'summary'
108
108
  end
109
109
 
110
- should 'path_parameters' do
110
+ would 'path_parameters' do
111
111
  swagger.send(:path_parameters, %r{/(?<a>\d)/(?<b>\w)/(?<c>\d)$},
112
112
  :parameters => {:c => {:type => 'hash'}}).
113
113
  should.eq([{:name => 'a', :type => 'integer',
@@ -118,7 +118,7 @@ describe Jellyfish do
118
118
  :required => true, :paramType => 'path'}])
119
119
  end
120
120
 
121
- should 'query_parameters' do
121
+ would 'query_parameters' do
122
122
  swagger.send(:query_parameters,
123
123
  :parameters => {:c => {:type => 'hash'}}).
124
124
  should.eq([:name => 'c', :type => 'hash',
data/test/test_threads.rb CHANGED
@@ -1,8 +1,5 @@
1
1
 
2
2
  require 'jellyfish/test'
3
- require 'muack'
4
-
5
- include Muack::API
6
3
 
7
4
  describe Jellyfish do
8
5
  after do
@@ -16,7 +13,7 @@ describe Jellyfish do
16
13
 
17
14
  exp = RuntimeError.new
18
15
 
19
- should "no RuntimeError: can't add a new key into hash during iteration" do
16
+ would "no RuntimeError: can't add a new key into hash during iteration" do
20
17
  # make static ancestors so that we could stub it
21
18
  ancestors = RuntimeError.ancestors
22
19
  stub(RuntimeError).ancestors{ancestors}
@@ -0,0 +1,44 @@
1
+
2
+ require 'jellyfish/test'
3
+ require 'stringio'
4
+
5
+ describe Jellyfish do
6
+ after do
7
+ Muack.verify
8
+ end
9
+
10
+ app = Class.new do
11
+ include Jellyfish
12
+ controller_include Jellyfish::WebSocket
13
+ get '/echo' do
14
+ switch_protocol do |msg|
15
+ ws_write(msg)
16
+ end
17
+ ws_write('ping')
18
+ ws_start
19
+ end
20
+ end.new
21
+
22
+ def create_env
23
+ sock = StringIO.new
24
+ mock(IO).select([sock]) do # or EOFError, not sure why?
25
+ sock << WebSocket::Message.new('pong').to_data * 2
26
+ [[sock], [], []]
27
+ end
28
+ [{'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/echo',
29
+ 'rack.hijack' => lambda{ sock }}, sock]
30
+ end
31
+
32
+ would 'ping pong' do
33
+ env, sock = create_env
34
+ app.call(env)
35
+ sock.string.should.eq <<-HTTP.chomp
36
+ HTTP/1.1 101 Switching Protocols\r
37
+ Upgrade: websocket\r
38
+ Connection: Upgrade\r
39
+ Sec-WebSocket-Accept: Kfh9QIsMVZcl6xEPYxPHzW8SZ8w=\r
40
+ \r
41
+ \x81\u0004ping\x81\u0004pong\x81\u0004pong
42
+ HTTP
43
+ end
44
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jellyfish
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-17 00:00:00.000000000 Z
11
+ date: 2014-11-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  Pico web framework for building API-centric web applications.
@@ -45,6 +45,7 @@ files:
45
45
  - lib/jellyfish/swagger.rb
46
46
  - lib/jellyfish/test.rb
47
47
  - lib/jellyfish/version.rb
48
+ - lib/jellyfish/websocket.rb
48
49
  - public/css/screen.css
49
50
  - public/index.html
50
51
  - public/js/shred.bundle.js
@@ -64,6 +65,7 @@ files:
64
65
  - test/test_misc.rb
65
66
  - test/test_swagger.rb
66
67
  - test/test_threads.rb
68
+ - test/test_websocket.rb
67
69
  homepage: https://github.com/godfat/jellyfish
68
70
  licenses:
69
71
  - Apache License 2.0
@@ -84,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
86
  version: '0'
85
87
  requirements: []
86
88
  rubyforge_project:
87
- rubygems_version: 2.2.2
89
+ rubygems_version: 2.4.2
88
90
  signing_key:
89
91
  specification_version: 4
90
92
  summary: Pico web framework for building API-centric web applications.
@@ -100,3 +102,4 @@ test_files:
100
102
  - test/test_misc.rb
101
103
  - test/test_swagger.rb
102
104
  - test/test_threads.rb
105
+ - test/test_websocket.rb