jersey 0.0.3
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/.gitignore +14 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +22 -0
- data/README.md +233 -0
- data/Rakefile +10 -0
- data/examples/readme.ru +15 -0
- data/jersey.gemspec +27 -0
- data/lib/jersey.rb +10 -0
- data/lib/jersey/api.rb +12 -0
- data/lib/jersey/base.rb +31 -0
- data/lib/jersey/extensions/error_handler.rb +30 -0
- data/lib/jersey/extensions/route_signature.rb +16 -0
- data/lib/jersey/helpers/log.rb +7 -0
- data/lib/jersey/http_errors.rb +62 -0
- data/lib/jersey/log.rb +25 -0
- data/lib/jersey/logging/base_logger.rb +58 -0
- data/lib/jersey/logging/json_logger.rb +8 -0
- data/lib/jersey/logging/logfmt_logger.rb +37 -0
- data/lib/jersey/logging/mixins.rb +31 -0
- data/lib/jersey/middleware/request_id.rb +46 -0
- data/lib/jersey/middleware/request_logger.rb +38 -0
- data/lib/jersey/setup.rb +40 -0
- data/lib/jersey/time.rb +29 -0
- data/lib/jersey/version.rb +3 -0
- data/test/errors_test.rb +48 -0
- data/test/helper.rb +39 -0
- data/test/log_test.rb +55 -0
- data/test/request_logger_test.rb +161 -0
- data/test/setup_test.rb +13 -0
- metadata +162 -0
data/test/helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Need this so we load up .env.test
|
2
|
+
ENV['RACK_ENV'] = 'test'
|
3
|
+
|
4
|
+
# Requies all the Gems
|
5
|
+
require_relative '../lib/jersey'
|
6
|
+
Jersey.setup
|
7
|
+
|
8
|
+
# require test runner
|
9
|
+
require 'minitest/autorun'
|
10
|
+
require 'minitest/pride' # :)
|
11
|
+
|
12
|
+
# load the test helpers
|
13
|
+
# Dir["./test/helpers/**/*.rb"].sort.each { |f| require f }
|
14
|
+
|
15
|
+
module JsonHelpers
|
16
|
+
def json; JSON.parse(last_response.body); end
|
17
|
+
end
|
18
|
+
|
19
|
+
class UnitTest < Minitest::Test
|
20
|
+
def setup
|
21
|
+
super
|
22
|
+
Jersey.logger.reset!
|
23
|
+
Jersey.logger.stream = StringIO.new unless ENV['LOG']
|
24
|
+
end
|
25
|
+
|
26
|
+
def logs
|
27
|
+
Jersey.logger.stream.string
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class ApiTest < UnitTest
|
32
|
+
include Rack::Test::Methods
|
33
|
+
include JsonHelpers
|
34
|
+
|
35
|
+
# default app method to return an app named `App`
|
36
|
+
def app
|
37
|
+
self.class.const_get(:App)
|
38
|
+
end
|
39
|
+
end
|
data/test/log_test.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class LogTest < UnitTest
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
Jersey.logger.stream = StringIO.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_log_json
|
10
|
+
logger = Jersey::JSONLogger.new(stream: StringIO.new)
|
11
|
+
logger.log(foo: "bar")
|
12
|
+
logdata = JSON.parse(logger.stream.string)
|
13
|
+
assert_equal('bar', logdata['foo'])
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_log_nothing_logs_time
|
17
|
+
Jersey.log()
|
18
|
+
logdata = Logfmt.parse(logs)
|
19
|
+
assert(logdata['now'], 'must log time')
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_log_hash
|
23
|
+
Jersey.log(foo: 'bar')
|
24
|
+
logdata = Logfmt.parse(logs)
|
25
|
+
assert_equal('bar', logdata['foo'])
|
26
|
+
assert(logdata['now'], 'must log time')
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_log_error
|
30
|
+
begin
|
31
|
+
raise "boom!"
|
32
|
+
rescue => e
|
33
|
+
Jersey.log(e)
|
34
|
+
loglines = logs.lines
|
35
|
+
logdata = Logfmt.parse(loglines[0])
|
36
|
+
assert_equal('boom!', logdata['message'])
|
37
|
+
assert_equal(e.object_id, logdata['id'])
|
38
|
+
assert(logdata['now'], 'must log time')
|
39
|
+
|
40
|
+
logdata = Logfmt.parse(loglines[1])
|
41
|
+
assert_equal(1, logdata['line_number'])
|
42
|
+
assert_equal(e.object_id, logdata['id'])
|
43
|
+
|
44
|
+
logdata = Logfmt.parse(loglines[2])
|
45
|
+
assert_equal(2, logdata['line_number'])
|
46
|
+
assert_equal(e.object_id, logdata['id'])
|
47
|
+
|
48
|
+
logdata = Logfmt.parse(loglines.last)
|
49
|
+
assert_equal(10, logdata['line_number'])
|
50
|
+
assert_equal(e.object_id, logdata['id'])
|
51
|
+
|
52
|
+
assert_equal(11, loglines.size)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class RequestLoggerTest < ApiTest
|
4
|
+
class App < Sinatra::Base
|
5
|
+
use Jersey::Middleware::RequestLogger
|
6
|
+
|
7
|
+
get('/get') { 'OK' }
|
8
|
+
post('/') { 'OK' }
|
9
|
+
put('/') { status(201); 'OK' }
|
10
|
+
delete('/') { 'OK' }
|
11
|
+
end
|
12
|
+
|
13
|
+
def setup
|
14
|
+
super
|
15
|
+
Jersey.logger.stream = StringIO.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_logs_GET_request_method_path_and_time
|
19
|
+
get '/get'
|
20
|
+
loglines = logs.lines
|
21
|
+
logdata = Logfmt.parse(loglines[0])
|
22
|
+
assert_equal('start', logdata['at'])
|
23
|
+
assert_equal('GET', logdata['method'])
|
24
|
+
assert_equal('/get', logdata['path'])
|
25
|
+
assert(logdata['now'], 'must log time')
|
26
|
+
|
27
|
+
logdata = Logfmt.parse(loglines[1])
|
28
|
+
assert_equal('finish', logdata['at'])
|
29
|
+
assert_equal('GET', logdata['method'])
|
30
|
+
assert_equal('/get', logdata['path'])
|
31
|
+
assert_equal(200, logdata['status'])
|
32
|
+
assert_equal(2, logdata['content_length'])
|
33
|
+
assert(logdata['now'], 'must log time')
|
34
|
+
assert(logdata['elapsed'], 'must log duration')
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_logs_POST_request_method_path_and_time
|
38
|
+
post '/'
|
39
|
+
logdata = Logfmt.parse(logs.lines[0])
|
40
|
+
assert_equal('POST', logdata['method'])
|
41
|
+
assert_equal('/', logdata['path'])
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_logs_PUT_request_method_path_and_time
|
45
|
+
put '/'
|
46
|
+
logdata = Logfmt.parse(logs.lines[0])
|
47
|
+
assert_equal('PUT', logdata['method'])
|
48
|
+
|
49
|
+
logdata = Logfmt.parse(logs.lines[1])
|
50
|
+
assert_equal('PUT', logdata['method'])
|
51
|
+
assert_equal(201, logdata['status'])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class RequestLoggerWithRequestIDsTest < ApiTest
|
56
|
+
class App < Sinatra::Base
|
57
|
+
use RequestStore::Middleware
|
58
|
+
use Jersey::Middleware::RequestID
|
59
|
+
use Jersey::Middleware::RequestLogger
|
60
|
+
|
61
|
+
get('/') do
|
62
|
+
Jersey.log(at: 'mid-request')
|
63
|
+
'OK'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def setup
|
68
|
+
super
|
69
|
+
Jersey.logger.stream = StringIO.new
|
70
|
+
end
|
71
|
+
|
72
|
+
# Testing a few things here
|
73
|
+
def test_logs_request_id
|
74
|
+
get '/'
|
75
|
+
loglines = logs.lines
|
76
|
+
|
77
|
+
logdata = Logfmt.parse(loglines[0])
|
78
|
+
request_id = logdata['request_id']
|
79
|
+
assert_equal('start', logdata['at'])
|
80
|
+
assert(request_id, 'must log request id')
|
81
|
+
|
82
|
+
logdata = Logfmt.parse(loglines[1])
|
83
|
+
assert_equal('mid-request', logdata['at'])
|
84
|
+
assert_equal(request_id, logdata['request_id'])
|
85
|
+
|
86
|
+
logdata = Logfmt.parse(loglines[2])
|
87
|
+
assert_equal('finish', logdata['at'])
|
88
|
+
assert_equal(request_id, logdata['request_id'])
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
def test_doesnt_persist_request_id
|
94
|
+
get '/'
|
95
|
+
logdata = Logfmt.parse(logs.lines[0])
|
96
|
+
request_id = logdata['request_id']
|
97
|
+
|
98
|
+
Jersey.log(foo: 'bar')
|
99
|
+
logdata = Logfmt.parse(logs.lines.last)
|
100
|
+
assert_equal('bar', logdata['foo'])
|
101
|
+
refute(logdata['request_id'], 'should not have request id')
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_doesnt_clear_everything
|
105
|
+
Jersey.logger << {app_name: 'hotness'}
|
106
|
+
get '/'
|
107
|
+
logdata = Logfmt.parse(logs.lines[0])
|
108
|
+
assert_equal('hotness', logdata['app_name'])
|
109
|
+
|
110
|
+
get '/'
|
111
|
+
logdata = Logfmt.parse(logs.lines[3])
|
112
|
+
assert_equal('hotness', logdata['app_name'])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class RequestLoggerNoRequestStore < ApiTest
|
117
|
+
class App < Sinatra::Base
|
118
|
+
use Jersey::Middleware::RequestID
|
119
|
+
use Jersey::Middleware::RequestLogger
|
120
|
+
|
121
|
+
get('/') do
|
122
|
+
Jersey.log(at: 'mid-request')
|
123
|
+
'OK'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def setup
|
128
|
+
super
|
129
|
+
Jersey.logger.stream = StringIO.new
|
130
|
+
end
|
131
|
+
|
132
|
+
# Testing a few things here
|
133
|
+
def test_logs_request_id
|
134
|
+
get '/'
|
135
|
+
loglines = logs.lines
|
136
|
+
|
137
|
+
logdata = Logfmt.parse(loglines[0])
|
138
|
+
request_id = logdata['request_id']
|
139
|
+
assert_equal('start', logdata['at'])
|
140
|
+
assert(request_id, 'must log request id')
|
141
|
+
|
142
|
+
logdata = Logfmt.parse(loglines[1])
|
143
|
+
assert_equal('mid-request', logdata['at'])
|
144
|
+
assert_equal(request_id, logdata['request_id'])
|
145
|
+
|
146
|
+
logdata = Logfmt.parse(loglines[2])
|
147
|
+
assert_equal('finish', logdata['at'])
|
148
|
+
assert_equal(request_id, logdata['request_id'])
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_doesnt_persist_request_id
|
152
|
+
get '/'
|
153
|
+
logdata = Logfmt.parse(logs.lines[0])
|
154
|
+
request_id = logdata['request_id']
|
155
|
+
|
156
|
+
Jersey.log(foo: 'bar')
|
157
|
+
logdata = Logfmt.parse(logs.lines.last)
|
158
|
+
assert_equal('bar', logdata['foo'])
|
159
|
+
refute(logdata['request_id'], 'should not have request id')
|
160
|
+
end
|
161
|
+
end
|
data/test/setup_test.rb
ADDED
metadata
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jersey
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- csquared
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sinatra
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sinatra-contrib
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: env-conf
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: request_store
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.0'
|
97
|
+
description: Set of composable middleware and helpers for production sinatra APIs
|
98
|
+
email:
|
99
|
+
- christopher.continanza@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- Gemfile
|
106
|
+
- LICENSE.txt
|
107
|
+
- README.md
|
108
|
+
- Rakefile
|
109
|
+
- examples/readme.ru
|
110
|
+
- jersey.gemspec
|
111
|
+
- lib/jersey.rb
|
112
|
+
- lib/jersey/api.rb
|
113
|
+
- lib/jersey/base.rb
|
114
|
+
- lib/jersey/extensions/error_handler.rb
|
115
|
+
- lib/jersey/extensions/route_signature.rb
|
116
|
+
- lib/jersey/helpers/log.rb
|
117
|
+
- lib/jersey/http_errors.rb
|
118
|
+
- lib/jersey/log.rb
|
119
|
+
- lib/jersey/logging/base_logger.rb
|
120
|
+
- lib/jersey/logging/json_logger.rb
|
121
|
+
- lib/jersey/logging/logfmt_logger.rb
|
122
|
+
- lib/jersey/logging/mixins.rb
|
123
|
+
- lib/jersey/middleware/request_id.rb
|
124
|
+
- lib/jersey/middleware/request_logger.rb
|
125
|
+
- lib/jersey/setup.rb
|
126
|
+
- lib/jersey/time.rb
|
127
|
+
- lib/jersey/version.rb
|
128
|
+
- test/errors_test.rb
|
129
|
+
- test/helper.rb
|
130
|
+
- test/log_test.rb
|
131
|
+
- test/request_logger_test.rb
|
132
|
+
- test/setup_test.rb
|
133
|
+
homepage: ''
|
134
|
+
licenses:
|
135
|
+
- MIT
|
136
|
+
metadata: {}
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
require_paths:
|
140
|
+
- lib
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
151
|
+
requirements: []
|
152
|
+
rubyforge_project:
|
153
|
+
rubygems_version: 2.2.0
|
154
|
+
signing_key:
|
155
|
+
specification_version: 4
|
156
|
+
summary: Write APIs in the New Jersey Style
|
157
|
+
test_files:
|
158
|
+
- test/errors_test.rb
|
159
|
+
- test/helper.rb
|
160
|
+
- test/log_test.rb
|
161
|
+
- test/request_logger_test.rb
|
162
|
+
- test/setup_test.rb
|