strelka-presenters 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +4 -0
- data/.document +5 -0
- data/.rdoc_options +16 -0
- data/.simplecov +9 -0
- data/ChangeLog +42 -0
- data/History.md +4 -0
- data/LICENSE.txt +20 -0
- data/Manifest.txt +24 -0
- data/README.md +107 -0
- data/Rakefile +100 -0
- data/lib/strelka/app/presenters.rb +85 -0
- data/lib/strelka/httpresponse/presenters.rb +45 -0
- data/lib/strelka/presenters.rb +21 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/strelka/app/presenters_spec.rb +260 -0
- data/spec/strelka/httpresponse/presenters_spec.rb +22 -0
- data/spec/strelka/presenters_spec.rb +17 -0
- data/spec/testlib.rb +20 -0
- data/spec/testlib/base.rb +57 -0
- data/spec/testlib/fixtures.rb +22 -0
- data/spec/testlib/fixtures/groups.rb +12 -0
- data/spec/testlib/fixtures/users.rb +28 -0
- data/spec/testlib/group.rb +19 -0
- data/spec/testlib/presenters.rb +20 -0
- data/spec/testlib/user.rb +24 -0
- metadata +262 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bde111f87ede9477a436d489cf6b8675ab93031fb3231a08965c227389c59aa3
|
4
|
+
data.tar.gz: b64413df84cec398d8f5c45a22fca13c09deb5caa73238ca360ca5fd68d88869
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bb85149d0e58a0ed2fc38b6b675a955315933d4d67885044c5e07a785621b80e0f818f766aa30bbadf13c511dd5baf640bd77588c96ce0456076e5719369e1d5
|
7
|
+
data.tar.gz: 0304763de7b1e4f01b2f64cfb618e968af67780843038d28b876ba671777d44d354a914dee477b750e1866726a969bc28ec665126c6cdb561ce222e9251a6052
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
��Cʥ�Fe؈��|�����znk��vwn3����!��
|
2
|
+
zG+HA��Pi���Ѝhewu�T�l���vX`&��^�d32])�?J(� ��s�!x�cS�+vٳ,,O
|
3
|
+
���w0�q�*N�w�8{�n{5w�3�Aޑ����5op/�6�摰qZ&��lv屹�[��u�0&>�$W_Z�G4^#�y,��St&^0�b=B���7P}[;6��DZ!MD��<�G1�M4i��e��j~�P��2�%����]Z6�6?V���B(wq����y�h٩�s�������!Ѽ��N���G�5��O����w{89X��vbfyGm�?#:Չ;��)
|
4
|
+
�g���"hk%���K�0����9����G]Nеi������
|
data/.document
ADDED
data/.rdoc_options
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
--- !ruby/object:RDoc::Options
|
2
|
+
encoding: UTF-8
|
3
|
+
static_path: []
|
4
|
+
rdoc_include:
|
5
|
+
- .
|
6
|
+
charset: UTF-8
|
7
|
+
exclude:
|
8
|
+
hyperlink_all: false
|
9
|
+
line_numbers: false
|
10
|
+
main_page: README.md
|
11
|
+
markup: markdown
|
12
|
+
show_hash: false
|
13
|
+
tab_width: 8
|
14
|
+
title: strelka-Presenters Documentation
|
15
|
+
visibility: :protected
|
16
|
+
webcvs:
|
data/.simplecov
ADDED
data/ChangeLog
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
2019-08-13 Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
@ * README.md:
|
4
|
+
| Fix URLs and title in the README
|
5
|
+
| [6ac7de9075da] [tip]
|
6
|
+
|
|
7
|
+
2019-08-12 Michael Granger <ged@FaerieMUD.org>
|
8
|
+
|
9
|
+
o * Rakefile, strelka-presenters.gemspec:
|
10
|
+
| Add URLs to the gemspec.
|
11
|
+
| [720bbedd3323]
|
12
|
+
|
|
13
|
+
o * strelka-presenters.gemspec:
|
14
|
+
| Commit the pre-release gemspec
|
15
|
+
| [7193b0e574d3]
|
16
|
+
|
|
17
|
+
2019-08-11 Michael Granger <ged@FaerieMUD.org>
|
18
|
+
|
19
|
+
o * .hgignore, Manifest.txt:
|
20
|
+
| Update the manifest
|
21
|
+
| [dfa3077cfaeb]
|
22
|
+
|
|
23
|
+
o * Rakefile:
|
24
|
+
| Remove the publishing guard
|
25
|
+
| [3d2b12a06693]
|
26
|
+
|
|
27
|
+
2019-08-07 Michael Granger <ged@FaerieMUD.org>
|
28
|
+
|
29
|
+
o * .document, .editorconfig, .gems, .hgignore, .pryrc, .rdoc_options,
|
30
|
+
.ruby-gemset, .ruby-version, .simplecov, Gemfile, History.md,
|
31
|
+
LICENSE.txt, Manifest.txt, README.md, Rakefile, certs/ged.pem,
|
32
|
+
lib/strelka/app/presenters.rb,
|
33
|
+
lib/strelka/httpresponse/presenters.rb, lib/strelka/presenters.rb,
|
34
|
+
spec/spec_helper.rb, spec/strelka/app/presenters_spec.rb,
|
35
|
+
spec/strelka/httpresponse/presenters_spec.rb,
|
36
|
+
spec/strelka/presenters_spec.rb, spec/testlib.rb,
|
37
|
+
spec/testlib/base.rb, spec/testlib/fixtures.rb,
|
38
|
+
spec/testlib/fixtures/groups.rb, spec/testlib/fixtures/users.rb,
|
39
|
+
spec/testlib/group.rb, spec/testlib/presenters.rb,
|
40
|
+
spec/testlib/user.rb:
|
41
|
+
Initial commit.
|
42
|
+
[83ab22adf1b7]
|
data/History.md
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2019 Michael Granger
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
.document
|
2
|
+
.rdoc_options
|
3
|
+
.simplecov
|
4
|
+
ChangeLog
|
5
|
+
History.md
|
6
|
+
LICENSE.txt
|
7
|
+
Manifest.txt
|
8
|
+
README.md
|
9
|
+
Rakefile
|
10
|
+
lib/strelka/app/presenters.rb
|
11
|
+
lib/strelka/httpresponse/presenters.rb
|
12
|
+
lib/strelka/presenters.rb
|
13
|
+
spec/spec_helper.rb
|
14
|
+
spec/strelka/app/presenters_spec.rb
|
15
|
+
spec/strelka/httpresponse/presenters_spec.rb
|
16
|
+
spec/strelka/presenters_spec.rb
|
17
|
+
spec/testlib.rb
|
18
|
+
spec/testlib/base.rb
|
19
|
+
spec/testlib/fixtures.rb
|
20
|
+
spec/testlib/fixtures/groups.rb
|
21
|
+
spec/testlib/fixtures/users.rb
|
22
|
+
spec/testlib/group.rb
|
23
|
+
spec/testlib/presenters.rb
|
24
|
+
spec/testlib/user.rb
|
data/README.md
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
# Strelka-Presenters
|
2
|
+
|
3
|
+
home
|
4
|
+
: http://deveiate.org/projects/strelka-presenters
|
5
|
+
|
6
|
+
code
|
7
|
+
: http://bitbucket.org/ged/strelka-presenters
|
8
|
+
|
9
|
+
github
|
10
|
+
: https://github.com/ged/strelka-presenters
|
11
|
+
|
12
|
+
docs
|
13
|
+
: http://deveiate.org/code/strelka-presenters
|
14
|
+
|
15
|
+
|
16
|
+
## Description
|
17
|
+
|
18
|
+
Strelka-Presenters is a plugin for the Strelka web framework that adds
|
19
|
+
integration with the [Yaks hypermedia library][Yaks].
|
20
|
+
|
21
|
+
### Usage
|
22
|
+
|
23
|
+
Load the plugin in your Strelka app, passing the Yaks configuration block:
|
24
|
+
|
25
|
+
class Example::App < Strelka::App
|
26
|
+
|
27
|
+
plugin :presenters do
|
28
|
+
default_format :hal
|
29
|
+
rel_template 'https://example.com/rels/{rel}'
|
30
|
+
mapper_namespace Example::Service::Presenters
|
31
|
+
end
|
32
|
+
|
33
|
+
plugin :router
|
34
|
+
|
35
|
+
get 'users' do |request|
|
36
|
+
users = Example::Users.all
|
37
|
+
response = request.response
|
38
|
+
response.present( users )
|
39
|
+
return response
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
Your app will automatically load the `negotiation` plugin, and responses will have a #present method that will map objects passed to it using Yaks into an acceptable response format using HTTP content negotiation.
|
45
|
+
|
46
|
+
See the documentation for [Yaks][] for more info.
|
47
|
+
|
48
|
+
## Prerequisites
|
49
|
+
|
50
|
+
* Ruby
|
51
|
+
|
52
|
+
|
53
|
+
## Installation
|
54
|
+
|
55
|
+
$ gem install strelka-presenters
|
56
|
+
|
57
|
+
|
58
|
+
## Contributing
|
59
|
+
|
60
|
+
You can check out the current development source with Mercurial via its
|
61
|
+
[project page][project]. Or if you prefer Git, via
|
62
|
+
[its Github mirror][gitmirror].
|
63
|
+
|
64
|
+
After checking out the source, run:
|
65
|
+
|
66
|
+
$ rake newb
|
67
|
+
|
68
|
+
This task will install any missing dependencies, run the tests/specs,
|
69
|
+
and generate the API documentation.
|
70
|
+
|
71
|
+
|
72
|
+
## License
|
73
|
+
|
74
|
+
Copyright (c) 2019, Michael Granger
|
75
|
+
All rights reserved.
|
76
|
+
|
77
|
+
Redistribution and use in source and binary forms, with or without
|
78
|
+
modification, are permitted provided that the following conditions are met:
|
79
|
+
|
80
|
+
* Redistributions of source code must retain the above copyright notice,
|
81
|
+
this list of conditions and the following disclaimer.
|
82
|
+
|
83
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
84
|
+
this list of conditions and the following disclaimer in the documentation
|
85
|
+
and/or other materials provided with the distribution.
|
86
|
+
|
87
|
+
* Neither the name of the author/s, nor the names of the project's
|
88
|
+
contributors may be used to endorse or promote products derived from this
|
89
|
+
software without specific prior written permission.
|
90
|
+
|
91
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
92
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
93
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
94
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
95
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
96
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
97
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
98
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
99
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
100
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
[project]: http://bitbucket.org/ged/strelka-presenters
|
105
|
+
[Yaks]: https://github.com/plexus/yaks/blob/master/yaks/README.md
|
106
|
+
[gitmirror]: https://github.com/ged/strelka-presenters
|
107
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'hoe'
|
5
|
+
rescue LoadError
|
6
|
+
abort "This Rakefile requires hoe (gem install hoe)"
|
7
|
+
end
|
8
|
+
|
9
|
+
GEMSPEC = 'strelka-presenters.gemspec'
|
10
|
+
|
11
|
+
|
12
|
+
Hoe.plugin :mercurial
|
13
|
+
Hoe.plugin :signing
|
14
|
+
Hoe.plugin :deveiate
|
15
|
+
|
16
|
+
Hoe.plugins.delete :rubyforge
|
17
|
+
|
18
|
+
hoespec = Hoe.spec 'strelka-presenters' do |spec|
|
19
|
+
|
20
|
+
spec.readme_file = 'README.md'
|
21
|
+
spec.history_file = 'History.md'
|
22
|
+
|
23
|
+
spec.extra_rdoc_files = FileList[ '*.rdoc', '*.md' ]
|
24
|
+
spec.license 'BSD-3-Clause'
|
25
|
+
spec.urls = {
|
26
|
+
home: 'https://bitbucket.org/ged/strelka-presenters',
|
27
|
+
code: 'https://bitbucket.org/ged/strelka-presenters/src',
|
28
|
+
docs: 'https://deveiate.org/code/strelka-presenters',
|
29
|
+
github: 'https://github.com/ged/strelka-presenters',
|
30
|
+
}
|
31
|
+
|
32
|
+
spec.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
33
|
+
|
34
|
+
spec.dependency 'strelka', '~> 0.16'
|
35
|
+
spec.dependency 'yaks', '~> 0.13'
|
36
|
+
|
37
|
+
spec.dependency 'faker', '~> 2.1'
|
38
|
+
spec.dependency 'fluent_fixtures', '~> 0.8'
|
39
|
+
spec.dependency 'hoe-deveiate', '~> 0.10', :developer
|
40
|
+
spec.dependency 'simplecov', '~> 0.17', :developer
|
41
|
+
spec.dependency 'rdoc-generator-fivefish', '~> 0.1', :developer
|
42
|
+
|
43
|
+
spec.require_ruby_version( '>=2.5.0' )
|
44
|
+
spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
|
45
|
+
spec.check_history_on_release = true if spec.respond_to?( :check_history_on_release= )
|
46
|
+
|
47
|
+
self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
ENV['VERSION'] ||= hoespec.spec.version.to_s
|
52
|
+
|
53
|
+
# Run the tests before checking in
|
54
|
+
task 'hg:precheckin' => [ :check_history, :check_manifest, :gemspec, :spec ]
|
55
|
+
|
56
|
+
task :test => :spec
|
57
|
+
|
58
|
+
# Rebuild the ChangeLog immediately before release
|
59
|
+
task :prerelease => 'ChangeLog'
|
60
|
+
CLOBBER.include( 'ChangeLog' )
|
61
|
+
|
62
|
+
desc "Build a coverage report"
|
63
|
+
task :coverage do
|
64
|
+
ENV["COVERAGE"] = 'yes'
|
65
|
+
Rake::Task[:spec].invoke
|
66
|
+
end
|
67
|
+
CLOBBER.include( 'coverage' )
|
68
|
+
|
69
|
+
|
70
|
+
# Use the fivefish formatter for docs generated from development checkout
|
71
|
+
if File.directory?( '.hg' )
|
72
|
+
require 'rdoc/task'
|
73
|
+
|
74
|
+
Rake::Task[ 'docs' ].clear
|
75
|
+
RDoc::Task.new( 'docs' ) do |rdoc|
|
76
|
+
rdoc.main = "README.md"
|
77
|
+
rdoc.markup = 'markdown'
|
78
|
+
rdoc.rdoc_files.include( "*.md", "ChangeLog", "lib/**/*.rb" )
|
79
|
+
rdoc.generator = :fivefish
|
80
|
+
rdoc.title = 'Strelka Presenters Plugin'
|
81
|
+
rdoc.rdoc_dir = 'doc'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
task :gemspec => GEMSPEC
|
86
|
+
file GEMSPEC => __FILE__
|
87
|
+
task GEMSPEC do |task|
|
88
|
+
spec = $hoespec.spec
|
89
|
+
spec.files.delete( '.gemtest' )
|
90
|
+
spec.signing_key = nil
|
91
|
+
spec.cert_chain = ['certs/ged.pem']
|
92
|
+
spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
93
|
+
File.open( task.name, 'w' ) do |fh|
|
94
|
+
fh.write( spec.to_ruby )
|
95
|
+
end
|
96
|
+
end
|
97
|
+
CLOBBER.include( GEMSPEC.to_s )
|
98
|
+
|
99
|
+
task :default => :gemspec
|
100
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'yaks'
|
5
|
+
|
6
|
+
require 'strelka/app' unless defined?( Strelka::App )
|
7
|
+
require 'strelka/plugins'
|
8
|
+
require 'strelka/mixins'
|
9
|
+
|
10
|
+
require 'strelka/httpresponse/presenters'
|
11
|
+
|
12
|
+
|
13
|
+
# Presentation layer plugin for Strelka service apps.
|
14
|
+
module Strelka::App::Presenters
|
15
|
+
include Strelka::Constants
|
16
|
+
extend Strelka::Plugin
|
17
|
+
|
18
|
+
run_outside :routing, :filters
|
19
|
+
run_inside :templating, :parameters, :negotiation
|
20
|
+
|
21
|
+
|
22
|
+
# Class methods to add to classes with presenters
|
23
|
+
module ClassMethods
|
24
|
+
|
25
|
+
##
|
26
|
+
# The block given to Yaks when it's configured
|
27
|
+
attr_accessor :presenter_config_block
|
28
|
+
|
29
|
+
end # module ClassMethods
|
30
|
+
|
31
|
+
|
32
|
+
### Extension callback -- extend the HTTPResponse classes with presenter logic
|
33
|
+
### when the plugin is loaded.
|
34
|
+
def self::included( object )
|
35
|
+
Strelka::HTTPResponse.include( Strelka::HTTPResponse::Presenters )
|
36
|
+
super
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
### Set a block passed to `plugin` to the presenter library when it's
|
41
|
+
### configured.
|
42
|
+
def self::configure_block( app, &block )
|
43
|
+
app.plugin( :negotiation )
|
44
|
+
app.presenter_config_block = block
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
### Set up the presenters when the app is created.
|
49
|
+
def initialize( * )
|
50
|
+
super
|
51
|
+
@presenter = self.setup_presentation_layer
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
######
|
56
|
+
public
|
57
|
+
######
|
58
|
+
|
59
|
+
##
|
60
|
+
# The configured Yaks presenter object
|
61
|
+
attr_reader :presenter
|
62
|
+
|
63
|
+
|
64
|
+
### Set up the presenter when the response has returned.
|
65
|
+
def handle_request( req )
|
66
|
+
self.log.debug "[:negotiation] Wrapping response with hypermedia presentation."
|
67
|
+
|
68
|
+
response = super
|
69
|
+
response.presenter = self.presenter
|
70
|
+
|
71
|
+
return response
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
### Configure and return the presenter.
|
76
|
+
def setup_presentation_layer
|
77
|
+
self.log.debug "Setting up presenters using %s" %
|
78
|
+
[ self.class.presenter_config_block&.inspect || 'defaults' ]
|
79
|
+
config_block = self.class.presenter_config_block || Proc.new {}
|
80
|
+
return Yaks.new( &config_block )
|
81
|
+
end
|
82
|
+
|
83
|
+
end # module Strelka::App::Presenters
|
84
|
+
|
85
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'yaks'
|
5
|
+
|
6
|
+
require 'strelka/httpresponse' unless defined?( Strelka::HTTPResponse )
|
7
|
+
|
8
|
+
|
9
|
+
# Hypermedia presentation logic for Strelka HTTP responses
|
10
|
+
module Strelka::HTTPResponse::Presenters
|
11
|
+
|
12
|
+
### Initialize some instance variables when a new response is created.
|
13
|
+
def initialize( * )
|
14
|
+
@presenter = nil
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
######
|
20
|
+
public
|
21
|
+
######
|
22
|
+
|
23
|
+
##
|
24
|
+
# The presenter to use when negotiating the response
|
25
|
+
attr_accessor :presenter
|
26
|
+
|
27
|
+
|
28
|
+
### Added so we can pass the response object to the presenters as the `env`.
|
29
|
+
def []( * ) # :nodoc:
|
30
|
+
return nil
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
### Set the entity that should be rendered to form the response body.
|
35
|
+
def present( entity, **options )
|
36
|
+
Yaks::Format.all.each do |format|
|
37
|
+
self.for( format.media_type ) do
|
38
|
+
opts = options.merge( format: format.format_name, env: self )
|
39
|
+
self.presenter.call( entity, opts )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end # module Strelka::HTTPResponse::Presenters
|
45
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'strelka' unless defined?( Strelka )
|
5
|
+
|
6
|
+
|
7
|
+
# Toplevel namespace
|
8
|
+
module Strelka::Presenters
|
9
|
+
|
10
|
+
# Package version
|
11
|
+
VERSION = '0.1.0'
|
12
|
+
|
13
|
+
# Version control revision
|
14
|
+
REVISION = %q$Revision$
|
15
|
+
|
16
|
+
|
17
|
+
require 'strelka/app/presenters'
|
18
|
+
require 'strelka/httpresponse/presenters'
|
19
|
+
|
20
|
+
end # module Strelka::Presenters
|
21
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
BEGIN {
|
5
|
+
$LOAD_PATH.unshift( '../Strelka/lib' )
|
6
|
+
}
|
7
|
+
|
8
|
+
require 'simplecov' if ENV['COVERAGE']
|
9
|
+
|
10
|
+
require 'rspec'
|
11
|
+
|
12
|
+
require 'loggability/spechelpers'
|
13
|
+
require 'mongrel2'
|
14
|
+
require 'mongrel2/testing'
|
15
|
+
require 'strelka'
|
16
|
+
require 'strelka/testing'
|
17
|
+
|
18
|
+
|
19
|
+
### Mock with RSpec
|
20
|
+
RSpec.configure do |config|
|
21
|
+
config.mock_with( :rspec ) do |mock|
|
22
|
+
mock.syntax = :expect
|
23
|
+
end
|
24
|
+
|
25
|
+
config.disable_monkey_patching!
|
26
|
+
config.example_status_persistence_file_path = "spec/.status"
|
27
|
+
config.filter_run :focus
|
28
|
+
config.filter_run_when_matching :focus
|
29
|
+
config.order = :random
|
30
|
+
config.profile_examples = 5
|
31
|
+
config.run_all_when_everything_filtered = true
|
32
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
33
|
+
# config.warnings = true
|
34
|
+
|
35
|
+
config.include( Loggability::SpecHelpers )
|
36
|
+
config.include( Mongrel2::SpecHelpers )
|
37
|
+
config.include( Mongrel2::Constants )
|
38
|
+
config.include( Strelka::Constants )
|
39
|
+
config.include( Strelka::Testing )
|
40
|
+
end
|
41
|
+
|
42
|
+
|
@@ -0,0 +1,260 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative '../../spec_helper'
|
5
|
+
|
6
|
+
require 'strelka'
|
7
|
+
require 'mongrel2/testing'
|
8
|
+
require 'strelka/testing'
|
9
|
+
require 'strelka/constants'
|
10
|
+
require 'strelka/behavior/plugin'
|
11
|
+
|
12
|
+
require 'testlib'
|
13
|
+
|
14
|
+
require 'strelka/app/presenters'
|
15
|
+
|
16
|
+
|
17
|
+
RSpec.describe( Strelka::App::Presenters ) do
|
18
|
+
|
19
|
+
TEST_SEND_SPEC = 'tcp://127.0.0.1:12012'
|
20
|
+
TEST_RECV_SPEC = 'tcp://127.0.0.1:12013'
|
21
|
+
|
22
|
+
|
23
|
+
before( :all ) do
|
24
|
+
Testlib::Fixtures.load( :users, :groups )
|
25
|
+
|
26
|
+
@request_factory = Mongrel2::RequestFactory.new(
|
27
|
+
route: '/api/v1',
|
28
|
+
host: 'acme.com',
|
29
|
+
port: 80
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
it_should_behave_like( "A Strelka Plugin" )
|
35
|
+
|
36
|
+
|
37
|
+
describe "an including App" do
|
38
|
+
|
39
|
+
before( :each ) do
|
40
|
+
Testlib.reset
|
41
|
+
|
42
|
+
@app = Class.new( Strelka::App ) do
|
43
|
+
def initialize( appid='presenters-test', sspec=TEST_SEND_SPEC, rspec=TEST_RECV_SPEC )
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
plugins :routing
|
48
|
+
router :exclusive
|
49
|
+
|
50
|
+
plugin :parameters
|
51
|
+
param :id, :integer
|
52
|
+
|
53
|
+
plugin :presenters do
|
54
|
+
default_format :hal
|
55
|
+
rel_template 'https://acme.com/rels/{rel}'
|
56
|
+
format_options( :hal, plural_links: [:copyright] )
|
57
|
+
mapper_namespace Testlib::Presenters
|
58
|
+
end
|
59
|
+
|
60
|
+
get '/users' do |req|
|
61
|
+
res = req.response
|
62
|
+
res.present( Testlib::User.all )
|
63
|
+
return res
|
64
|
+
end
|
65
|
+
|
66
|
+
get '/users/:id' do |req|
|
67
|
+
id = req.params[:id]
|
68
|
+
|
69
|
+
user = Testlib::User[ id ] or finish_with HTTP::NOT_FOUND, "no such user"
|
70
|
+
res = req.response
|
71
|
+
res.present( user )
|
72
|
+
|
73
|
+
return res
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
let( :user_factory ) { Testlib::Fixtures.user.full }
|
80
|
+
let( :user_generator ) { user_factory.generator(create: true) }
|
81
|
+
|
82
|
+
|
83
|
+
it "can render a singleton HAL response" do
|
84
|
+
user = user_factory.create
|
85
|
+
|
86
|
+
req = @request_factory.get( "/api/v1/users/#{user.id}", accept: 'application/hal+json' )
|
87
|
+
res = @app.new.handle( req )
|
88
|
+
|
89
|
+
expect( res.status ).to eq( 200 )
|
90
|
+
expect( res.content_type ).to eq( 'application/hal+json' )
|
91
|
+
expect( res ).to have_json_body( Object ).
|
92
|
+
that_includes(
|
93
|
+
id: user.id,
|
94
|
+
name: user.name,
|
95
|
+
email: user.email,
|
96
|
+
login: user.login,
|
97
|
+
_links: a_hash_including(
|
98
|
+
self: {
|
99
|
+
href: "/api/v1/users/#{user.id}"
|
100
|
+
}
|
101
|
+
)
|
102
|
+
)
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
it "can render a collection HAL response" do
|
107
|
+
users = user_generator.take( 10 )
|
108
|
+
|
109
|
+
req = @request_factory.get( "/api/v1/users", accept: 'application/hal+json' )
|
110
|
+
res = @app.new.handle( req )
|
111
|
+
|
112
|
+
expect( res.status ).to eq( 200 )
|
113
|
+
expect( res.content_type ).to eq( 'application/hal+json' )
|
114
|
+
expect( res ).to have_json_body( Object ).
|
115
|
+
that_includes(
|
116
|
+
_embedded: {
|
117
|
+
"https://acme.com/rels/users": a_collection_containing_exactly(
|
118
|
+
*users.map {|u| a_hash_including(id: u.id) }
|
119
|
+
)
|
120
|
+
}
|
121
|
+
)
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
it "can render a singleton HALO response" do
|
126
|
+
user = user_factory.create
|
127
|
+
|
128
|
+
req = @request_factory.get( "/api/v1/users/#{user.id}", accept: 'application/halo+json' )
|
129
|
+
res = @app.new.handle( req )
|
130
|
+
|
131
|
+
expect( res.status ).to eq( 200 )
|
132
|
+
expect( res.content_type ).to eq( 'application/halo+json' )
|
133
|
+
expect( res ).to have_json_body( Object ).
|
134
|
+
that_includes(
|
135
|
+
id: user.id,
|
136
|
+
name: user.name,
|
137
|
+
email: user.email,
|
138
|
+
login: user.login,
|
139
|
+
_links: a_hash_including(
|
140
|
+
self: {
|
141
|
+
href: "/api/v1/users/#{user.id}"
|
142
|
+
}
|
143
|
+
)
|
144
|
+
)
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
it "can render a collection HALO response" do
|
149
|
+
users = user_generator.take( 10 )
|
150
|
+
|
151
|
+
req = @request_factory.get( "/api/v1/users", accept: 'application/halo+json' )
|
152
|
+
res = @app.new.handle( req )
|
153
|
+
|
154
|
+
expect( res.status ).to eq( 200 )
|
155
|
+
expect( res.content_type ).to eq( 'application/halo+json' )
|
156
|
+
expect( res ).to have_json_body( Object ).
|
157
|
+
that_includes(
|
158
|
+
_embedded: {
|
159
|
+
"https://acme.com/rels/users": a_collection_containing_exactly(
|
160
|
+
*users.map {|u| a_hash_including(id: u.id) }
|
161
|
+
)
|
162
|
+
}
|
163
|
+
)
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
it "can render a singleton JSON-API response" do
|
168
|
+
user = user_factory.create
|
169
|
+
|
170
|
+
req = @request_factory.get( "/api/v1/users/#{user.id}", accept: 'application/vnd.api+json' )
|
171
|
+
res = @app.new.handle( req )
|
172
|
+
|
173
|
+
expect( res.status ).to eq( 200 )
|
174
|
+
expect( res.content_type ).to eq( 'application/vnd.api+json' )
|
175
|
+
expect( res ).to have_json_body( Object ).
|
176
|
+
that_includes(
|
177
|
+
data: {
|
178
|
+
attributes: {
|
179
|
+
name: user.name,
|
180
|
+
email: user.email,
|
181
|
+
login: user.login,
|
182
|
+
},
|
183
|
+
id: user.id.to_s,
|
184
|
+
links: {
|
185
|
+
self: "/api/v1/users/#{user.id}"
|
186
|
+
},
|
187
|
+
type: "users"
|
188
|
+
}
|
189
|
+
)
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
it "can render a collection JSON-API response" do
|
194
|
+
users = user_generator.take( 10 )
|
195
|
+
|
196
|
+
req = @request_factory.get( "/api/v1/users", accept: 'application/vnd.api+json' )
|
197
|
+
res = @app.new.handle( req )
|
198
|
+
|
199
|
+
expect( res.status ).to eq( 200 )
|
200
|
+
expect( res.content_type ).to eq( 'application/vnd.api+json' )
|
201
|
+
expect( res ).to have_json_body( Object ).
|
202
|
+
that_includes(
|
203
|
+
data: a_collection_containing_exactly(
|
204
|
+
*users.map {|u| a_hash_including(id: u.id.to_s) }
|
205
|
+
)
|
206
|
+
)
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
it "can render a singleton Collection+JSON response" do
|
211
|
+
user = user_factory.create
|
212
|
+
|
213
|
+
req = @request_factory.get(
|
214
|
+
"/api/v1/users/#{user.id}",
|
215
|
+
accept: 'application/vnd.collection+json'
|
216
|
+
)
|
217
|
+
res = @app.new.handle( req )
|
218
|
+
|
219
|
+
expect( res.status ).to eq( 200 )
|
220
|
+
expect( res.content_type ).to eq( 'application/vnd.collection+json' )
|
221
|
+
expect( res ).to have_json_body( Object ).
|
222
|
+
that_includes(
|
223
|
+
collection: {
|
224
|
+
version: '1.0',
|
225
|
+
items: [
|
226
|
+
{
|
227
|
+
data: a_collection_containing_exactly(
|
228
|
+
{ name: "name", value: user.name},
|
229
|
+
{ name: "email", value: user.email},
|
230
|
+
{ name: "login", value: user.login},
|
231
|
+
{ name: "id", value: user.id},
|
232
|
+
),
|
233
|
+
href: "/api/v1/users/#{user.id}"
|
234
|
+
}
|
235
|
+
],
|
236
|
+
href: "/api/v1/users/#{user.id}"
|
237
|
+
}
|
238
|
+
)
|
239
|
+
end
|
240
|
+
|
241
|
+
|
242
|
+
it "can render a collection Collection+JSON response" do
|
243
|
+
users = user_generator.take( 10 )
|
244
|
+
|
245
|
+
req = @request_factory.get(
|
246
|
+
"/api/v1/users",
|
247
|
+
accept: 'application/vnd.collection+json'
|
248
|
+
)
|
249
|
+
res = @app.new.handle( req )
|
250
|
+
|
251
|
+
expect( res.status ).to eq( 200 )
|
252
|
+
expect( res.content_type ).to eq( 'application/vnd.collection+json' )
|
253
|
+
expect( res ).to have_json_body( Object ).
|
254
|
+
that_includes( :collection )
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative '../../spec_helper'
|
5
|
+
|
6
|
+
require 'strelka/httpresponse/presenters'
|
7
|
+
|
8
|
+
|
9
|
+
RSpec.describe Strelka::HTTPResponse::Presenters do
|
10
|
+
|
11
|
+
it "adds an index operator to the response to allow it to quack like a Rack ENV" do
|
12
|
+
dummy_response_class = Class.new
|
13
|
+
dummy_response_class.include( described_class )
|
14
|
+
dummy_response = dummy_response_class.new
|
15
|
+
|
16
|
+
expect {
|
17
|
+
dummy_response[ 'HTTP_ACCEPT' ]
|
18
|
+
}.to_not raise_error()
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative '../spec_helper'
|
5
|
+
|
6
|
+
require 'rspec'
|
7
|
+
require 'strelka/presenters'
|
8
|
+
|
9
|
+
|
10
|
+
RSpec.describe( Strelka::Presenters ) do
|
11
|
+
|
12
|
+
it "knows what version of the library it is" do
|
13
|
+
expect( described_class::VERSION ).to be_a( String ).and( match(/\A\d+\.\d+\.\d+\z/) )
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
data/spec/testlib.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Testlib
|
5
|
+
|
6
|
+
autoload :Base, 'testlib/base'
|
7
|
+
autoload :Group, 'testlib/group'
|
8
|
+
autoload :User, 'testlib/user'
|
9
|
+
autoload :Fixtures, 'testlib/fixtures'
|
10
|
+
autoload :Presenters, 'testlib/presenters'
|
11
|
+
|
12
|
+
|
13
|
+
def self::reset
|
14
|
+
Testlib::Base::DATASTORE.clear
|
15
|
+
Testlib::Base::SERIAL_GENERATOR.clear
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'testlib' unless defined?( Testlib )
|
5
|
+
|
6
|
+
|
7
|
+
class Testlib::Base
|
8
|
+
|
9
|
+
# Fancy database simulator
|
10
|
+
DATASTORE = Hash.new do |h, modelclass|
|
11
|
+
h[ modelclass ] = {}
|
12
|
+
end
|
13
|
+
SERIAL_GENERATOR = Hash.new do |h, modelclass|
|
14
|
+
h[ modelclass ] = Enumerator.new do |yielder|
|
15
|
+
i = 0
|
16
|
+
loop { i += 1; yielder.yield(i) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def self::[]( id )
|
22
|
+
return DATASTORE[ self ][ id ]
|
23
|
+
end
|
24
|
+
|
25
|
+
def self::all
|
26
|
+
return DATASTORE[ self ].values
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def initialize( params={} )
|
31
|
+
params.each do |name, value|
|
32
|
+
self.send( "#{name}=", value )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
attr_accessor :id
|
38
|
+
alias_method :pk, :id
|
39
|
+
|
40
|
+
|
41
|
+
def []( attr_name )
|
42
|
+
return self.public_send( param )
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def save
|
47
|
+
self.id ||= SERIAL_GENERATOR[ self.class ].next
|
48
|
+
DATASTORE[ self.class ][ self.id ] = self.dup
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def saved?
|
53
|
+
return self.id && DATASTORE[ self.class ].key?( self.id )
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'fluent_fixtures'
|
5
|
+
require 'testlib' unless defined?( Testlib )
|
6
|
+
|
7
|
+
module Testlib::Fixtures
|
8
|
+
extend FluentFixtures::Collection
|
9
|
+
|
10
|
+
fixture_path_prefix 'testlib/fixtures'
|
11
|
+
|
12
|
+
|
13
|
+
def self::describe
|
14
|
+
desc = "%p: %d fixtures loaded" % [ self, self.modules.length ]
|
15
|
+
unless self.modules.empty?
|
16
|
+
desc << ": %s" % [ self.modules.keys.map(&:to_s).join(', ') ]
|
17
|
+
end
|
18
|
+
return desc
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'faker'
|
5
|
+
require 'testlib/fixtures'
|
6
|
+
require 'testlib/user'
|
7
|
+
|
8
|
+
module Testlib::Fixtures::Users
|
9
|
+
extend Testlib::Fixtures
|
10
|
+
fixtured_class Testlib::User
|
11
|
+
|
12
|
+
decorator :with_random_first_name do
|
13
|
+
self.first_name = Faker::Name.first_name
|
14
|
+
end
|
15
|
+
|
16
|
+
decorator :with_random_last_name do
|
17
|
+
self.last_name = Faker::Name.last_name
|
18
|
+
end
|
19
|
+
|
20
|
+
compose :with_random_name => [ :with_random_first_name, :with_random_last_name ]
|
21
|
+
|
22
|
+
compose :full => :with_random_name do
|
23
|
+
self.login = "%s%s" % [ self.first_name[0,1].downcase, self.last_name.downcase ]
|
24
|
+
self.email = "%s@example.com" % [ self.first_name.downcase ]
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'set'
|
5
|
+
require 'testlib' unless defined?( Testlib )
|
6
|
+
require 'testlib/base'
|
7
|
+
|
8
|
+
|
9
|
+
class Testlib::Group < Testlib::Base
|
10
|
+
|
11
|
+
def initialize( * )
|
12
|
+
super
|
13
|
+
@members ||= Set.new
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :name, :members
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'yaks'
|
5
|
+
|
6
|
+
require 'testlib' unless defined?( Testlib )
|
7
|
+
|
8
|
+
|
9
|
+
# Presentation entities
|
10
|
+
module Testlib::Presenters
|
11
|
+
|
12
|
+
class UserMapper < Yaks::Mapper
|
13
|
+
link :self, '/api/v1/users/{id}'
|
14
|
+
|
15
|
+
attributes :id, :name, :email, :login
|
16
|
+
|
17
|
+
end # class PersonaMapper
|
18
|
+
|
19
|
+
end # module Prestigio::Service::Presenters
|
20
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'set'
|
5
|
+
require 'testlib' unless defined?( Testlib )
|
6
|
+
require 'testlib/base'
|
7
|
+
|
8
|
+
|
9
|
+
class Testlib::User < Testlib::Base
|
10
|
+
|
11
|
+
def initialize( * )
|
12
|
+
super
|
13
|
+
@roles ||= Set.new
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :first_name, :last_name, :email, :login, :groups
|
17
|
+
|
18
|
+
|
19
|
+
def name
|
20
|
+
return [ self.first_name, self.last_name ].compact.join( ' ' )
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
metadata
ADDED
@@ -0,0 +1,262 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: strelka-presenters
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Granger
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
|
14
|
+
REM9RmFlcmllTVVEL0RDPW9yZzAeFw0xODExMjAxODI5NTlaFw0xOTExMjAxODI5
|
15
|
+
NTlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
|
16
|
+
hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
|
17
|
+
L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
|
18
|
+
M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
|
19
|
+
5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
|
20
|
+
Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
|
21
|
+
vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
|
22
|
+
dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
|
23
|
+
ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
|
24
|
+
N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
|
25
|
+
VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DAcBgNVHREE
|
26
|
+
FTATgRFnZWRARmFlcmllTVVELm9yZzAcBgNVHRIEFTATgRFnZWRARmFlcmllTVVE
|
27
|
+
Lm9yZzANBgkqhkiG9w0BAQsFAAOCAYEAP9Ffkvg4e8CjIWi8SykQ8oJSS8jbmbgF
|
28
|
+
abke3vXWLG6V9kFiObuJd5wZRBluJANu7bEtjgc3fFaGVP2XxVdCpVjNbmMDg4Qp
|
29
|
+
ovvczP53X6pQP2RSZgxF6Lblvy8y11RziUTVRG/Z2aJHsElo6gI7vQznE/OSDrhC
|
30
|
+
gEhr8uaIUt7D+HZWRbU0+MkKPpL5uMqaFuJbqXEvSwPTuUuYkDfNfsjQO7ruWBac
|
31
|
+
bxHCrvpZ6Tijc0nrlyXi6gPOCLeaqhau2xFnlvKgELwsGYSoKBJyDwqtQ5kwrOlU
|
32
|
+
tkSyLrfZ+RZcH535Hyvif7ZxB0v5OxXXoec+N2vrUsEUMRDL9dg4/WFdN8hIOixF
|
33
|
+
3IPKpZ1ho0Ya5q7yhygtBK9/NBFHw+nbJjcltfPDBXleRe8u73gnQo8AZIhStYSP
|
34
|
+
v4qqqa27Bs468d6SoPxjSm8a2mM9HZ4OdWhq4tFsbTeXDVquCfi64OTEaTt2xQdR
|
35
|
+
JnC4lpJfCP6aCXa5h2XAQfPSH636cQap
|
36
|
+
-----END CERTIFICATE-----
|
37
|
+
date: 2019-08-25 00:00:00.000000000 Z
|
38
|
+
dependencies:
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: strelka
|
41
|
+
requirement: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - "~>"
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.16'
|
46
|
+
type: :runtime
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - "~>"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0.16'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: yaks
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0.13'
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0.13'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: faker
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '2.1'
|
74
|
+
type: :runtime
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '2.1'
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: fluent_fixtures
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0.8'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0.8'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: hoe-mercurial
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.4'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '1.4'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: hoe-deveiate
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0.10'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0.10'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: hoe-highline
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0.2'
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0.2'
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: simplecov
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - "~>"
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0.17'
|
144
|
+
type: :development
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - "~>"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0.17'
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
name: rdoc-generator-fivefish
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - "~>"
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0.1'
|
158
|
+
type: :development
|
159
|
+
prerelease: false
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - "~>"
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '0.1'
|
165
|
+
- !ruby/object:Gem::Dependency
|
166
|
+
name: rdoc
|
167
|
+
requirement: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '4.0'
|
172
|
+
- - "<"
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '7'
|
175
|
+
type: :development
|
176
|
+
prerelease: false
|
177
|
+
version_requirements: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - ">="
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '4.0'
|
182
|
+
- - "<"
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '7'
|
185
|
+
- !ruby/object:Gem::Dependency
|
186
|
+
name: hoe
|
187
|
+
requirement: !ruby/object:Gem::Requirement
|
188
|
+
requirements:
|
189
|
+
- - "~>"
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '3.18'
|
192
|
+
type: :development
|
193
|
+
prerelease: false
|
194
|
+
version_requirements: !ruby/object:Gem::Requirement
|
195
|
+
requirements:
|
196
|
+
- - "~>"
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '3.18'
|
199
|
+
description: |-
|
200
|
+
Strelka-Presenters is a plugin for the Strelka web framework that adds
|
201
|
+
integration with the [Yaks hypermedia library][Yaks].
|
202
|
+
email:
|
203
|
+
- ged@FaerieMUD.org
|
204
|
+
executables: []
|
205
|
+
extensions: []
|
206
|
+
extra_rdoc_files:
|
207
|
+
- History.md
|
208
|
+
- LICENSE.txt
|
209
|
+
- Manifest.txt
|
210
|
+
- README.md
|
211
|
+
files:
|
212
|
+
- ".document"
|
213
|
+
- ".rdoc_options"
|
214
|
+
- ".simplecov"
|
215
|
+
- ChangeLog
|
216
|
+
- History.md
|
217
|
+
- LICENSE.txt
|
218
|
+
- Manifest.txt
|
219
|
+
- README.md
|
220
|
+
- Rakefile
|
221
|
+
- lib/strelka/app/presenters.rb
|
222
|
+
- lib/strelka/httpresponse/presenters.rb
|
223
|
+
- lib/strelka/presenters.rb
|
224
|
+
- spec/spec_helper.rb
|
225
|
+
- spec/strelka/app/presenters_spec.rb
|
226
|
+
- spec/strelka/httpresponse/presenters_spec.rb
|
227
|
+
- spec/strelka/presenters_spec.rb
|
228
|
+
- spec/testlib.rb
|
229
|
+
- spec/testlib/base.rb
|
230
|
+
- spec/testlib/fixtures.rb
|
231
|
+
- spec/testlib/fixtures/groups.rb
|
232
|
+
- spec/testlib/fixtures/users.rb
|
233
|
+
- spec/testlib/group.rb
|
234
|
+
- spec/testlib/presenters.rb
|
235
|
+
- spec/testlib/user.rb
|
236
|
+
homepage: https://bitbucket.org/ged/strelka-presenters
|
237
|
+
licenses:
|
238
|
+
- BSD-3-Clause
|
239
|
+
metadata: {}
|
240
|
+
post_install_message:
|
241
|
+
rdoc_options:
|
242
|
+
- "--main"
|
243
|
+
- README.md
|
244
|
+
require_paths:
|
245
|
+
- lib
|
246
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: 2.5.0
|
251
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
252
|
+
requirements:
|
253
|
+
- - ">="
|
254
|
+
- !ruby/object:Gem::Version
|
255
|
+
version: '0'
|
256
|
+
requirements: []
|
257
|
+
rubygems_version: 3.0.3
|
258
|
+
signing_key:
|
259
|
+
specification_version: 4
|
260
|
+
summary: Strelka-Presenters is a plugin for the Strelka web framework that adds integration
|
261
|
+
with the [Yaks hypermedia library][Yaks].
|
262
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|