jellyfish 0.5.3 → 0.6.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.
data/CHANGES.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # CHANGES
2
2
 
3
+ ## Jellyfish 0.6.0 -- 2012-11-02
4
+
5
+ ### Enhancements for Jellyfish core
6
+
7
+ * Extracted Jellyfish::Controller#call and Jellyfish::Controller#block_call
8
+ into Jellyfish::Controller::Call so that you can have modules which can
9
+ override call and block_call. See Jellyfish::Sinatra and Jellyfish::NewRelic
10
+ for an example.
11
+
12
+ * Now you can use `request` in the controller, which is essentially:
13
+ `@request ||= Rack::Request.new(env)`. This also means you would need
14
+ Rack installed and required to use it. Other than this, there's no
15
+ strict requirement for Rack.
16
+
17
+ ### Enhancements for NewRelic
18
+
19
+ * Added Jellyfish::NewRelic which makes you work easier with NewRelic.
20
+ Here's an example of how to use it: (extracted from README)
21
+
22
+ ``` ruby
23
+ require 'jellyfish'
24
+ class Tank
25
+ include Jellyfish
26
+ class MyController < Jellyfish::Controller
27
+ include Jellyfish::NewRelic
28
+ end
29
+ def controller; MyController; end
30
+ get '/' do
31
+ "OK\n"
32
+ end
33
+ end
34
+ use Rack::ContentLength
35
+ use Rack::ContentType, 'text/plain'
36
+ require 'cgi' # newrelic dev mode needs this and it won't require it itself
37
+ require 'new_relic/rack/developer_mode'
38
+ use NewRelic::Rack::DeveloperMode # GET /newrelic to read stats
39
+ run Tank.new
40
+ NewRelic::Agent.manual_start(:developer_mode => true)
41
+ ```
42
+
3
43
  ## Jellyfish 0.5.3 -- 2012-10-26
4
44
 
5
45
  ### Enhancements for Jellyfish core
data/README.md CHANGED
@@ -201,7 +201,10 @@ Currently support:
201
201
  require 'jellyfish'
202
202
  class Tank
203
203
  include Jellyfish
204
- def controller; Jellyfish::Sinatra; end
204
+ class MyController < Jellyfish::Controller
205
+ include Jellyfish::Sinatra
206
+ end
207
+ def controller; MyController; end
205
208
  get %r{^/(?<id>\d+)$} do
206
209
  "Jelly ##{params[:id]}\n"
207
210
  end
@@ -211,6 +214,29 @@ use Rack::ContentType, 'text/plain'
211
214
  run Tank.new
212
215
  ```
213
216
 
217
+ ### Using NewRelic?
218
+
219
+ ``` ruby
220
+ require 'jellyfish'
221
+ class Tank
222
+ include Jellyfish
223
+ class MyController < Jellyfish::Controller
224
+ include Jellyfish::NewRelic
225
+ end
226
+ def controller; MyController; end
227
+ get '/' do
228
+ "OK\n"
229
+ end
230
+ end
231
+ use Rack::ContentLength
232
+ use Rack::ContentType, 'text/plain'
233
+ require 'cgi' # newrelic dev mode needs this and it won't require it itself
234
+ require 'new_relic/rack/developer_mode'
235
+ use NewRelic::Rack::DeveloperMode # GET /newrelic to read stats
236
+ run Tank.new
237
+ NewRelic::Agent.manual_start(:developer_mode => true)
238
+ ```
239
+
214
240
  ### Jellyfish as a middleware
215
241
 
216
242
  ``` ruby
data/example/config.ru CHANGED
@@ -87,8 +87,14 @@ class Heater
87
87
  temperature
88
88
  end
89
89
 
90
+ get %r{^/sinatra/(?<id>\d+)$} do
91
+ "#{params[:id]}\n"
92
+ end
93
+
90
94
  def controller; Controller; end
91
95
  class Controller < Jellyfish::Controller
96
+ include Jellyfish::Sinatra
97
+ include Jellyfish::NewRelic
92
98
  def temperature
93
99
  "30\u{2103}\n"
94
100
  end
@@ -96,11 +102,17 @@ class Heater
96
102
  end
97
103
 
98
104
  HugeTank = Rack::Builder.new do
99
- use Rack::Chunked
105
+ use Rack::Chunked # order does matter, need to check Content-Length first
100
106
  use Rack::ContentLength
101
107
  use Rack::ContentType, 'text/plain'
102
108
  use Heater
103
109
  run Tank.new
104
110
  end
105
111
 
112
+ require 'cgi' # newrelic needs this
113
+ require 'new_relic/rack/developer_mode'
114
+ use NewRelic::Rack::DeveloperMode
115
+
106
116
  run HugeTank
117
+
118
+ NewRelic::Agent.manual_start(:developer_mode => true)
data/jellyfish.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "jellyfish"
5
- s.version = "0.5.3"
5
+ s.version = "0.6.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Lin Jen-Shin (godfat)"]
9
- s.date = "2012-10-26"
9
+ s.date = "2012-11-02"
10
10
  s.description = "Pico web framework for building API-centric web applications.\nFor Rack applications or Rack middlewares. Under 200 lines of code."
11
11
  s.email = ["godfat (XD) godfat.org"]
12
12
  s.files = [
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
25
25
  "jellyfish.gemspec",
26
26
  "jellyfish.png",
27
27
  "lib/jellyfish.rb",
28
+ "lib/jellyfish/newrelic.rb",
28
29
  "lib/jellyfish/public/302.html",
29
30
  "lib/jellyfish/public/404.html",
30
31
  "lib/jellyfish/public/500.html",
data/lib/jellyfish.rb CHANGED
@@ -1,9 +1,8 @@
1
1
 
2
2
  module Jellyfish
3
- autoload :VERSION, 'jellyfish/version'
4
- autoload :Sinatra, 'jellyfish/sinatra'
5
-
6
- # -----------------------------------------------------------------
3
+ autoload :VERSION , 'jellyfish/version'
4
+ autoload :Sinatra , 'jellyfish/sinatra'
5
+ autoload :NewRelic, 'jellyfish/newrelic'
7
6
 
8
7
  class Response < RuntimeError
9
8
  def headers
@@ -28,29 +27,32 @@ module Jellyfish
28
27
  # -----------------------------------------------------------------
29
28
 
30
29
  class Controller
30
+ module Call
31
+ def call env
32
+ @env = env
33
+ block_call(*dispatch)
34
+ end
35
+
36
+ def block_call argument, block
37
+ ret = instance_exec(argument, &block)
38
+ body ret if body.nil? # prefer explicitly set values
39
+ body '' if body.nil? # at least give an empty string
40
+ [status || 200, headers || {}, body]
41
+ rescue LocalJumpError
42
+ jellyfish.log("Use `next' if you're trying to `return' or" \
43
+ " `break' from the block.", env['rack.errors'])
44
+ raise
45
+ end
46
+ end
47
+ include Call
48
+
31
49
  attr_reader :routes, :jellyfish, :env
32
50
  def initialize routes, jellyfish
33
51
  @routes, @jellyfish = routes, jellyfish
34
52
  @status, @headers, @body = nil
35
53
  end
36
54
 
37
- def call env
38
- @env = env
39
- block_call(*dispatch)
40
- end
41
-
42
- def block_call argument, block
43
- ret = instance_exec(argument, &block)
44
- body ret if body.nil? # prefer explicitly set values
45
- body '' if body.nil? # at least give an empty string
46
- [status || 200, headers || {}, body]
47
- rescue LocalJumpError
48
- jellyfish.log(
49
- "Use `next' if you're trying to `return' or `break' from the block.",
50
- env['rack.errors'])
51
- raise
52
- end
53
-
55
+ def request ; @request ||= Rack::Request.new(env); end
54
56
  def forward ; raise(Jellyfish::NotFound.new) ; end
55
57
  def found url; raise(Jellyfish:: Found.new(url)); end
56
58
  alias_method :redirect, :found
@@ -0,0 +1,32 @@
1
+
2
+ require 'jellyfish'
3
+ require 'rack/request'
4
+
5
+ require 'new_relic/agent/instrumentation/controller_instrumentation'
6
+
7
+ module Jellyfish
8
+ module NewRelic
9
+ include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
10
+
11
+ def block_call argument, block
12
+ path = if argument.respond_to?(:regexp)
13
+ argument.regexp
14
+ else
15
+ argument
16
+ end.to_s[1..-1]
17
+ name = "#{env['REQUEST_METHOD']} #{path}"
18
+ # magic category: NewRelic::MetricParser::WebTransaction::Jellyfish
19
+ perform_action_with_newrelic_trace(:category => 'Controller/Jellyfish',
20
+ :path => path ,
21
+ :name => name ,
22
+ :request => request ,
23
+ :params => request.params){super}
24
+ end
25
+ end
26
+ end
27
+
28
+ module NewRelic::MetricParser::WebTransaction::Jellyfish
29
+ include NewRelic::MetricParser::WebTransaction::Pattern
30
+ def is_web_transaction?; true; end
31
+ def category ; 'Jellyfish'; end
32
+ end
@@ -3,8 +3,8 @@ require 'jellyfish'
3
3
  require 'rack/request'
4
4
 
5
5
  module Jellyfish
6
- class Sinatra < Controller
7
- attr_reader :request, :params
6
+ module Sinatra
7
+ attr_reader :params
8
8
  def block_call argument, block
9
9
  initialize_params(argument)
10
10
  super
@@ -12,8 +12,7 @@ module Jellyfish
12
12
 
13
13
  private
14
14
  def initialize_params argument
15
- @request ||= Rack::Request.new(env)
16
- @params ||= force_encoding(indifferent_params(
15
+ @params ||= force_encoding(indifferent_params(
17
16
  if argument.kind_of?(MatchData)
18
17
  # merge captured data from matcher into params as sinatra
19
18
  request.params.merge(Hash[argument.names.zip(argument.captures)])
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Jellyfish
3
- VERSION = '0.5.3'
3
+ VERSION = '0.6.0'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jellyfish
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-26 00:00:00.000000000 Z
12
+ date: 2012-11-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -67,6 +67,7 @@ files:
67
67
  - jellyfish.gemspec
68
68
  - jellyfish.png
69
69
  - lib/jellyfish.rb
70
+ - lib/jellyfish/newrelic.rb
70
71
  - lib/jellyfish/public/302.html
71
72
  - lib/jellyfish/public/404.html
72
73
  - lib/jellyfish/public/500.html