reck 0.0.1
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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +170 -0
- data/lib/reck/application.rb +70 -0
- data/lib/reck/version.rb +3 -0
- data/lib/reck.rb +7 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e42763c73766c0f37b6d11774d0ae7d4c090e933142a293ab4fa8020fbc115c3
|
4
|
+
data.tar.gz: 0b34320493ef0739d2bbe5c6c21ae2bd28b02c823de789172f302f5bd930f884
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 605e3033cafec280edff30012a1214ed09df89c012488f7a762ce63014410a668a7f20742899898681b538ae84a84d52207965fcdc12996720d187fe1078f5d1
|
7
|
+
data.tar.gz: 70bcdc64891926d594082827225d43bf29c3490cb095478b5b1656784a73d4f0da64382073ac3ad43c13800fcd165eff707b6d71c0d253de80204ba7befeedd2
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Honeybadger Industries LLC
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
# Reck
|
2
|
+
|
3
|
+
An exception-based web framework for Ruby.
|
4
|
+
|
5
|
+
# Why another framework?
|
6
|
+
|
7
|
+
If you've ever programmed in Ruby on Rails, you know that it prefers convention
|
8
|
+
over configuration. We believe this approach works well as a design paradigm but
|
9
|
+
falls down over time (just ask anyone who has maintained a Rails application
|
10
|
+
since version 1). In order to remain competitive with newer high-level (and
|
11
|
+
often concurrent) programming languages like Node and Elixir, Ruby needs a
|
12
|
+
strong component-based framework which let's you use the *right* tool for the
|
13
|
+
job.
|
14
|
+
|
15
|
+
Reck is very light-weight compared to other web frameworks such as Rails
|
16
|
+
or even Sinatra. We handle the routing and controller layer using a very simple
|
17
|
+
exception-based DSL and then get out of the way so that any existing model or
|
18
|
+
view components may be used.
|
19
|
+
|
20
|
+
## Installation
|
21
|
+
|
22
|
+
```sh
|
23
|
+
$ gem install reck
|
24
|
+
```
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
To respond to the defined route with rendered content, simply raise an
|
29
|
+
exception. The message of the exception will be evaluated as ERB before being
|
30
|
+
added to the response. If the exception is raised without a message, a
|
31
|
+
no-content response will be sent. This exception-based DSL is dead-simple and
|
32
|
+
great for controlling the flow of your application.
|
33
|
+
|
34
|
+
Routing code to a controller is as simple as:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
Reck.route '/' do |request|
|
38
|
+
raise Reck::Ok, 'Hello World'
|
39
|
+
end
|
40
|
+
```
|
41
|
+
|
42
|
+
Want to add authentication? No problem. (Actually, with a single-page app, this *really is* all you need!)
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
Reck.route '/admin' do |request|
|
46
|
+
raise Reck::Forbidden unless request.params['username'] == 'admin'
|
47
|
+
raise Reck::Forbidden unless request.params['password'] == 'secret'
|
48
|
+
raise Reck::Ok, 'Super secret admin page'
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
Since the message of each exception is actually a template, use ERB tags to
|
53
|
+
interpolate Ruby values in your views:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
Reck.route '/version' do |request|
|
57
|
+
raise Reck::Ok, 'Reck version: <%= Reck::VERSION %>'
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
Since Reck depends on Rack, you also have access to helper methods
|
62
|
+
derived from the keys in Rack's env hash:
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
Reck.route '/method' do |request|
|
66
|
+
raise Reck::Ok, 'Requested via: <%= request_method %>'
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
To run the application server:
|
71
|
+
|
72
|
+
```sh
|
73
|
+
$ ruby -r reck application.rb
|
74
|
+
```
|
75
|
+
|
76
|
+
## Supported Responses
|
77
|
+
|
78
|
+
Each response inherits from the exception `Reck::Response`.
|
79
|
+
|
80
|
+
| Exception Class | Status code |
|
81
|
+
| --------------------- | ----------- |
|
82
|
+
| Reck::Ok | 200 |
|
83
|
+
| Reck::Created | 201 |
|
84
|
+
| Reck::Forbidden | 403 |
|
85
|
+
| Reck::NotFound | 404 |
|
86
|
+
|
87
|
+
## Handling exceptions
|
88
|
+
|
89
|
+
While responses should always be raised, you may wish to handle other types of
|
90
|
+
unexpected exceptions, or "exceptional exceptions", if you will. In these cases,
|
91
|
+
we recommend using Honeybadger. Honeybadger provides middleware (and a bunch of
|
92
|
+
other cool features) to catch exceptions in Ruby applications -- whether you're
|
93
|
+
using Reck, Rails, Sinatra, Rack, or rolling your own Ruby web-framework.
|
94
|
+
|
95
|
+
There are two ways you can get Honeybadger to monitor Reck:
|
96
|
+
|
97
|
+
1. Reporting errors inside a controller
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
require 'reck'
|
101
|
+
require 'honeybadger'
|
102
|
+
|
103
|
+
Honeybadger.configure do |config|
|
104
|
+
config.api_key = 'your_api_key'
|
105
|
+
end
|
106
|
+
|
107
|
+
Reck.route '/oops' do |request|
|
108
|
+
begin
|
109
|
+
fail 'oops!'
|
110
|
+
rescue Reck::Response
|
111
|
+
raise # Raise the response to the router
|
112
|
+
rescue => e
|
113
|
+
# Exceptional Reck exception: report it with Honeybadger!
|
114
|
+
Honeybadger.notify(e)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
```
|
118
|
+
|
119
|
+
```sh
|
120
|
+
ruby application.rb
|
121
|
+
```
|
122
|
+
|
123
|
+
2. Automatically catching all errors which aren't responses
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
require 'reck/application'
|
127
|
+
require 'honeybadger'
|
128
|
+
|
129
|
+
Honeybadger.configure do |config|
|
130
|
+
config.api_key = 'your_api_key'
|
131
|
+
config.exceptions.ignore << Reck::Response
|
132
|
+
end
|
133
|
+
|
134
|
+
Reck.route '/oops' do |request|
|
135
|
+
fail 'oops!'
|
136
|
+
end
|
137
|
+
|
138
|
+
use Honeybadger::Rack::ErrorNotifier
|
139
|
+
|
140
|
+
run Reck::Application
|
141
|
+
```
|
142
|
+
|
143
|
+
```sh
|
144
|
+
rackup application.ru
|
145
|
+
```
|
146
|
+
|
147
|
+
Don't forget to replace `'your_api_key'` with the API key from your [project
|
148
|
+
settings page](https://www.honeybadger.io/) on Honeybadger.
|
149
|
+
|
150
|
+
## TODO
|
151
|
+
|
152
|
+
- [ ] Handle all HTTP 1.1 status codes
|
153
|
+
- [ ] Access to response headers
|
154
|
+
- [ ] Custom response formats
|
155
|
+
|
156
|
+
## Contributing
|
157
|
+
|
158
|
+
1. Fork it.
|
159
|
+
2. Create a topic branch `git checkout -b my_branch`
|
160
|
+
3. Commit your changes `git commit -am "Boom"`
|
161
|
+
3. Push to your branch `git push origin my_branch`
|
162
|
+
4. Send a [pull request](https://github.com/honeybadger-io/reck/pulls)
|
163
|
+
|
164
|
+
## License
|
165
|
+
|
166
|
+
Reck is Copyright 2015 © Honeybadger Industries LLC. It is free software, and
|
167
|
+
may be redistributed under the terms specified in the LICENSE file.
|
168
|
+
|
169
|
+
Brought to you by :zap: **Honeybadger.io**: our kick-ass exception tracking is no joke. :trollface:
|
170
|
+
[Start exterminating errors in your Ruby apps today](https://www.honeybadger.io/)!
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require 'forwardable'
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
require 'reck/version'
|
6
|
+
|
7
|
+
module Reck
|
8
|
+
class Response < RuntimeError
|
9
|
+
NOT_BLANK = Regexp.new('\S').freeze
|
10
|
+
|
11
|
+
def head?
|
12
|
+
message == self.class.name || message !~ NOT_BLANK
|
13
|
+
end
|
14
|
+
|
15
|
+
def render
|
16
|
+
erb = ERB.new(message)
|
17
|
+
erb.result
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Ok < Response; end
|
22
|
+
class Created < Response; end
|
23
|
+
class Forbidden < Response; end
|
24
|
+
class NotFound < Response; end
|
25
|
+
|
26
|
+
STATUS = {
|
27
|
+
Ok => 200,
|
28
|
+
Created => 201,
|
29
|
+
Forbidden => 403,
|
30
|
+
NotFound => 404
|
31
|
+
}.freeze
|
32
|
+
|
33
|
+
class Application
|
34
|
+
def self.call(env)
|
35
|
+
req = Rack::Request.new(env)
|
36
|
+
if route = routes.find {|r| r.path.chomp('/') == req.path_info.chomp('/') }
|
37
|
+
route.call(req)
|
38
|
+
fail 'invalid response'
|
39
|
+
else
|
40
|
+
[404, {}, ['Not Found']]
|
41
|
+
end
|
42
|
+
rescue Reck::Response => e
|
43
|
+
[STATUS[e.class], {}, [e.head? ? nil : e.render].compact]
|
44
|
+
rescue => e
|
45
|
+
env['rack.exception'] = e
|
46
|
+
[500, {}, ['Internal Server Error']]
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.routes
|
50
|
+
@@routes ||= []
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Route
|
55
|
+
extend Forwardable
|
56
|
+
attr_reader :path
|
57
|
+
def_delegator :@block, :call
|
58
|
+
|
59
|
+
def initialize(path, block)
|
60
|
+
@path = path
|
61
|
+
@block = block
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def route(path, &block)
|
66
|
+
Application.routes.unshift(Route.new(path, block))
|
67
|
+
end
|
68
|
+
|
69
|
+
extend self
|
70
|
+
end
|
data/lib/reck/version.rb
ADDED
data/lib/reck.rb
ADDED
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: reck
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Honeybadger Industries LLC
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-05-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- support@honeybadger.io
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- LICENSE
|
35
|
+
- README.md
|
36
|
+
- lib/reck.rb
|
37
|
+
- lib/reck/application.rb
|
38
|
+
- lib/reck/version.rb
|
39
|
+
homepage: https://github.com/honeybadger-io/reck
|
40
|
+
licenses:
|
41
|
+
- MIT
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 2.1.0
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.7.3
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: An exception-based web framework for Ruby.
|
63
|
+
test_files: []
|