yaks-sinatra 0.10.0 → 0.11.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.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/README.md +21 -1
- data/Rakefile +1 -1
- data/lib/yaks-sinatra.rb +23 -11
- data/spec/integration/classic_app.rb +16 -0
- data/spec/integration/classic_spec.rb +25 -0
- data/spec/integration/modular_spec.rb +24 -0
- data/spec/integration_helper.rb +116 -0
- data/spec/spec_helper.rb +1 -0
- data/yaks-sinatra.gemspec +1 -0
- metadata +31 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dc7bd3869510736d87c46e96be148a9ca257968
|
4
|
+
data.tar.gz: ea5bf1fd71db1dbfaa0332b4154087b0b4e606ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 752a4c4f33aaf9117c1fd08f6724584f74100fd09e0d1fe1ad0a8507ed65cfb532f50e32e963ad6cf13107df56be4c4813bcc4cd8b7dc1050f9d9c8db3fd1869
|
7
|
+
data.tar.gz: 1fce79637a67ac4d2006c663bbcc2b7b2ed9e4547bca7052fd4edf5490320ccd83c3c55880728a4238675f3ef130f469f312e1d6412034d26ff20e0c9739451e
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-r spec_helper
|
data/README.md
CHANGED
@@ -3,7 +3,10 @@ Provide basic integration for using Yaks in sinatra. It gives you a top level `c
|
|
3
3
|
This will register all media types known to Yaks, make sure the right one is picked based on the `Accept` header, and it will put the correct `Content-Type` header on the response.
|
4
4
|
|
5
5
|
|
6
|
-
|
6
|
+
In a classic Sinatra app, you use it like so:
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
require 'sinatra'
|
7
10
|
require 'yaks-sinatra'
|
8
11
|
|
9
12
|
configure_yaks do
|
@@ -28,3 +31,20 @@ get '/posts' do
|
|
28
31
|
yaks Post.all
|
29
32
|
end
|
30
33
|
```
|
34
|
+
|
35
|
+
In a modular Sinatra app, you need to register the extension explicitly:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
require 'sinatra/base'
|
39
|
+
require 'yaks-sinatra'
|
40
|
+
|
41
|
+
class MyApp < Sinatra::Base
|
42
|
+
register Yaks::Sinatra
|
43
|
+
|
44
|
+
configure_yaks do
|
45
|
+
# ...
|
46
|
+
end
|
47
|
+
|
48
|
+
# ...
|
49
|
+
end
|
50
|
+
```
|
data/Rakefile
CHANGED
data/lib/yaks-sinatra.rb
CHANGED
@@ -1,14 +1,22 @@
|
|
1
1
|
require 'sinatra/base'
|
2
2
|
require 'yaks'
|
3
3
|
|
4
|
-
module
|
5
|
-
module
|
4
|
+
module Yaks
|
5
|
+
module Sinatra
|
6
6
|
class << self
|
7
7
|
attr_accessor :yaks_config
|
8
8
|
end
|
9
9
|
|
10
|
+
module Helpers
|
11
|
+
def yaks(object, opts = {})
|
12
|
+
runner = Yaks::Sinatra.yaks_config.runner(object, {env: env}.merge(opts))
|
13
|
+
content_type runner.format_name
|
14
|
+
runner.call
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
10
18
|
def configure_yaks(&block)
|
11
|
-
Yaks.yaks_config = ::Yaks.new(&block)
|
19
|
+
Yaks::Sinatra.yaks_config = ::Yaks.new(&block)
|
12
20
|
|
13
21
|
configure do
|
14
22
|
::Yaks::Format.all.each do |format|
|
@@ -16,16 +24,20 @@ module Sinatra
|
|
16
24
|
end
|
17
25
|
end
|
18
26
|
end
|
19
|
-
end
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
28
|
+
def self.registered(app)
|
29
|
+
app.helpers(Yaks::Sinatra::Helpers)
|
30
|
+
|
31
|
+
::Yaks::Format.all.each do |format|
|
32
|
+
app.settings.add_charset << format.media_type
|
33
|
+
end
|
34
|
+
|
35
|
+
# app.configure_yaks
|
26
36
|
end
|
27
37
|
end
|
38
|
+
end
|
28
39
|
|
29
|
-
|
30
|
-
|
40
|
+
# For classic apps
|
41
|
+
module Sinatra
|
42
|
+
register Yaks::Sinatra
|
31
43
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'yaks-sinatra'
|
3
|
+
|
4
|
+
Root = Class.new(Struct.new(:name))
|
5
|
+
|
6
|
+
class RootMapper < Yaks::Mapper
|
7
|
+
link :self, '/'
|
8
|
+
end
|
9
|
+
|
10
|
+
set :default_charset, 'utf-8'
|
11
|
+
|
12
|
+
configure_yaks
|
13
|
+
|
14
|
+
get '/' do
|
15
|
+
yaks Root.new('root'), mapper: RootMapper
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'integration_helper'
|
2
|
+
require_relative 'classic_app.rb'
|
3
|
+
|
4
|
+
RSpec.describe 'Sinatra Classic app integration', type: :integration do
|
5
|
+
include Yaks::Sinatra::Test::ClassicApp::Helpers
|
6
|
+
|
7
|
+
::Yaks::Format.all.each do |format|
|
8
|
+
context "For #{format.format_name}" do
|
9
|
+
it "returns 200" do
|
10
|
+
make_req(format.media_type)
|
11
|
+
expect(last_response).to be_ok
|
12
|
+
end
|
13
|
+
|
14
|
+
it "respects the Accept header" do
|
15
|
+
make_req(format.media_type)
|
16
|
+
expect(last_content_type.type).to eq(format.media_type)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns an explicit charset" do
|
20
|
+
make_req(format.media_type)
|
21
|
+
expect(last_content_type.charset).to eq('utf-8')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'integration_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'Sinatra Modular app integration', type: :integration do
|
4
|
+
include Yaks::Sinatra::Test::ModularApp::Helpers
|
5
|
+
|
6
|
+
::Yaks::Format.all.each do |format|
|
7
|
+
context "For #{format.format_name}" do
|
8
|
+
it "returns 200" do
|
9
|
+
make_req(format.media_type)
|
10
|
+
expect(last_response).to be_ok
|
11
|
+
end
|
12
|
+
|
13
|
+
it "respects the Accept header" do
|
14
|
+
make_req(format.media_type)
|
15
|
+
expect(last_content_type.type).to eq(format.media_type)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns an explicit charset" do
|
19
|
+
make_req(format.media_type)
|
20
|
+
expect(last_content_type.charset).to eq('utf-8')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'yaks-sinatra'
|
5
|
+
require 'rack/test'
|
6
|
+
|
7
|
+
ENV['RACK_ENV'] = 'test'
|
8
|
+
|
9
|
+
class MediaType
|
10
|
+
QUOTED_STRING = '[\w!#$%&\'()*+,-./:;<=>?@\[\]\\\\^`{|}~ \t\r\n]+'
|
11
|
+
TOKEN = '[\w!\#$%&\'*+-.^`|~]+'
|
12
|
+
TYPE_AND_SUBTYPE = "(?<maintype>#{TOKEN})/(?<subtype>#{TOKEN})"
|
13
|
+
PARAMETER_VALUE = "(?:(?<value>#{TOKEN})|\"(?<q_value>#{QUOTED_STRING})\")"
|
14
|
+
PARAMETER_RE = /\s*;\s*(?<name>#{TOKEN})\s*=\s*#{PARAMETER_VALUE}/m
|
15
|
+
MEDIA_TYPE_RE = /^#{TYPE_AND_SUBTYPE}/
|
16
|
+
|
17
|
+
def initialize(header_string)
|
18
|
+
@header_string = header_string
|
19
|
+
end
|
20
|
+
|
21
|
+
def type_and_rest
|
22
|
+
@type_and_rest ||= begin
|
23
|
+
type_match = MEDIA_TYPE_RE.match(@header_string)
|
24
|
+
return ["", ""] if type_match.nil?
|
25
|
+
@main_type = type_match['maintype']
|
26
|
+
@sub_type = type_match['subtype']
|
27
|
+
type = type_match.to_s
|
28
|
+
rest = @header_string[type.length..-1]
|
29
|
+
[type, rest]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def parameters
|
34
|
+
@parameters ||= begin
|
35
|
+
_, rest = type_and_rest
|
36
|
+
parameters = {}
|
37
|
+
rest.scan(PARAMETER_RE) do |name, value, q_value|
|
38
|
+
parameters[name] = value || q_value
|
39
|
+
end
|
40
|
+
parameters
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def type
|
45
|
+
@type ||= type_and_rest[0]
|
46
|
+
end
|
47
|
+
|
48
|
+
def main_type
|
49
|
+
@main_type || type_and_rest && @main_type
|
50
|
+
end
|
51
|
+
|
52
|
+
def sub_type
|
53
|
+
@sub_type || type_and_rest && @sub_type
|
54
|
+
end
|
55
|
+
|
56
|
+
def charset
|
57
|
+
parameters['charset']
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
module Yaks
|
62
|
+
module Sinatra
|
63
|
+
module Test
|
64
|
+
module Helpers
|
65
|
+
def make_req(mime_type = 'application/hal+json')
|
66
|
+
header 'Accept', mime_type
|
67
|
+
get '/'
|
68
|
+
end
|
69
|
+
|
70
|
+
def last_content_type
|
71
|
+
MediaType.new(last_response.content_type)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class ModularApp < ::Sinatra::Base
|
76
|
+
module Helpers
|
77
|
+
include Yaks::Sinatra::Test::Helpers
|
78
|
+
|
79
|
+
def app
|
80
|
+
Yaks::Sinatra::Test::ModularApp
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
Root = Class.new(Struct.new(:name))
|
85
|
+
|
86
|
+
class RootMapper < Yaks::Mapper
|
87
|
+
link :self, '/'
|
88
|
+
end
|
89
|
+
|
90
|
+
register Yaks::Sinatra
|
91
|
+
|
92
|
+
set :default_charset, 'utf-8'
|
93
|
+
|
94
|
+
configure_yaks
|
95
|
+
|
96
|
+
get '/' do
|
97
|
+
yaks Root.new('root'), mapper: RootMapper
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
module ClassicApp
|
102
|
+
module Helpers
|
103
|
+
include Yaks::Sinatra::Test::Helpers
|
104
|
+
|
105
|
+
def app
|
106
|
+
::Sinatra::Application
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
RSpec.configure do |config|
|
115
|
+
config.include Rack::Test::Methods, type: :integration
|
116
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '../../shared/rspec_config'
|
data/yaks-sinatra.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yaks-sinatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arne Brasseur
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yaks
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.11.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.11.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sinatra
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rack-test
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.6'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.6'
|
41
55
|
description: Sinatra integration for Yaks
|
42
56
|
email:
|
43
57
|
- arne@arnebrasseur.net
|
@@ -46,9 +60,15 @@ extensions: []
|
|
46
60
|
extra_rdoc_files:
|
47
61
|
- README.md
|
48
62
|
files:
|
63
|
+
- ".rspec"
|
49
64
|
- README.md
|
50
65
|
- Rakefile
|
51
66
|
- lib/yaks-sinatra.rb
|
67
|
+
- spec/integration/classic_app.rb
|
68
|
+
- spec/integration/classic_spec.rb
|
69
|
+
- spec/integration/modular_spec.rb
|
70
|
+
- spec/integration_helper.rb
|
71
|
+
- spec/spec_helper.rb
|
52
72
|
- yaks-sinatra.gemspec
|
53
73
|
homepage: https://github.com/plexus/yaks
|
54
74
|
licenses:
|
@@ -70,8 +90,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
90
|
version: '0'
|
71
91
|
requirements: []
|
72
92
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.
|
93
|
+
rubygems_version: 2.2.3
|
74
94
|
signing_key:
|
75
95
|
specification_version: 4
|
76
96
|
summary: Sinatra integration for Yaks
|
77
|
-
test_files:
|
97
|
+
test_files:
|
98
|
+
- spec/integration/classic_app.rb
|
99
|
+
- spec/integration/classic_spec.rb
|
100
|
+
- spec/integration/modular_spec.rb
|
101
|
+
- spec/integration_helper.rb
|
102
|
+
- spec/spec_helper.rb
|