lurker 0.5.3 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.gitignore +1 -0
- data/.travis.yml +4 -4
- data/README.md +4 -2
- data/Rakefile +13 -1
- data/features/controller_specs/nested_schema_scaffolding.feature +4 -4
- data/features/controller_specs/test_endpoint.feature +36 -15
- data/features/request_specs/nested_schema_scaffolding.feature +4 -4
- data/features/request_specs/schema_suffixes.feature +173 -0
- data/features/support/env.rb +7 -1
- data/gemfiles/Gemfile32.ci +6 -0
- data/{Gemfile.ci → gemfiles/Gemfile40.ci} +3 -1
- data/gemfiles/Gemfile41.ci +6 -0
- data/lib/lurker.rb +0 -2
- data/lib/lurker/cli.rb +10 -55
- data/lib/lurker/controller_spec_watcher.rb +12 -6
- data/lib/lurker/endpoint.rb +1 -1
- data/lib/lurker/presenters/base_presenter.rb +0 -13
- data/lib/lurker/presenters/endpoint_presenter.rb +7 -6
- data/lib/lurker/presenters/json_presenter.rb +0 -9
- data/lib/lurker/presenters/response_code_presenter.rb +0 -9
- data/lib/lurker/presenters/schema_presenter.rb +1 -33
- data/lib/lurker/presenters/service_presenter.rb +2 -24
- data/lib/lurker/request_spec_watcher.rb +11 -6
- data/lib/lurker/service.rb +1 -1
- data/lib/lurker/templates/javascripts/application.js +0 -2
- data/lib/lurker/templates/public/application.css +0 -148
- data/lib/lurker/templates/public/application.js +2 -1904
- data/lib/lurker/templates/stylesheets/application.css +0 -2
- data/lib/lurker/version.rb +1 -1
- data/lurker.gemspec +2 -1
- data/templates/generate_stuff.rb +111 -22
- data/templates/lurker_app.rb +0 -5
- metadata +31 -32
- metadata.gz.asc +7 -7
- data/lib/lurker/meta_service.rb +0 -46
- data/lib/lurker/presenters/meta_service_presenter.rb +0 -85
- data/lib/lurker/templates/endpoint.html.erb +0 -62
- data/lib/lurker/templates/endpoint.md.erb +0 -40
- data/lib/lurker/templates/javascripts/demo/dashboard-demo.js +0 -117
- data/lib/lurker/templates/javascripts/demo/flot-demo.js +0 -1242
- data/lib/lurker/templates/javascripts/demo/morris-demo.js +0 -155
- data/lib/lurker/templates/javascripts/plugins/dataTables/dataTables.bootstrap.js +0 -245
- data/lib/lurker/templates/javascripts/plugins/dataTables/jquery.dataTables.js +0 -14013
- data/lib/lurker/templates/javascripts/plugins/flot/excanvas.min.js +0 -1
- data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.js +0 -2599
- data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.pie.js +0 -750
- data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.resize.js +0 -60
- data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.tooltip.min.js +0 -12
- data/lib/lurker/templates/javascripts/plugins/morris/morris.js +0 -1888
- data/lib/lurker/templates/javascripts/plugins/morris/raphael-2.1.0.min.js +0 -10
- data/lib/lurker/templates/lurker/rendering/_endpoint.html.erb +0 -65
- data/lib/lurker/templates/meta_service.html.erb +0 -54
- data/lib/lurker/templates/service.html.erb +0 -50
- data/lib/lurker/templates/service.md.erb +0 -18
- data/lib/lurker/templates/styles.css +0 -75
- data/lib/lurker/templates/stylesheets/plugins/dataTables/dataTables.bootstrap.css +0 -233
- data/lib/lurker/templates/stylesheets/plugins/morris/morris-0.4.3.min.css +0 -2
- data/lib/lurker/templates/stylesheets/plugins/social-buttons/social-buttons.css +0 -68
- data/lib/lurker/templates/stylesheets/plugins/timeline/timeline.css +0 -144
data/features/support/env.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'simplecov'
|
2
2
|
SimpleCov.start do
|
3
|
-
|
3
|
+
filters.clear # This will remove the :root_filter that comes via simplecov's defaults
|
4
|
+
add_filter do |src|
|
5
|
+
!(src.filename =~ /^#{SimpleCov.root}\/lib\/lurker/)
|
6
|
+
end
|
4
7
|
end
|
5
8
|
|
6
9
|
require 'fileutils'
|
@@ -38,10 +41,13 @@ Before do
|
|
38
41
|
system "bin/spring stop"
|
39
42
|
FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/lurker', __FILE__)
|
40
43
|
FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/html', __FILE__)
|
44
|
+
FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/spec/request', __FILE__)
|
45
|
+
FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/spec/controllers', __FILE__)
|
41
46
|
end
|
42
47
|
end
|
43
48
|
|
44
49
|
After do |scenario|
|
50
|
+
ActiveRecord::Base.connection.reconnect!
|
45
51
|
DatabaseCleaner.clean
|
46
52
|
end
|
47
53
|
|
data/lib/lurker.rb
CHANGED
@@ -38,7 +38,6 @@ require 'lurker/schema'
|
|
38
38
|
require 'lurker/ref_object'
|
39
39
|
require 'lurker/erb_schema_context'
|
40
40
|
require 'lurker/service'
|
41
|
-
require 'lurker/meta_service'
|
42
41
|
require 'lurker/jaml_descriptor'
|
43
42
|
require 'lurker/validator'
|
44
43
|
require 'lurker/validation_error'
|
@@ -49,7 +48,6 @@ require 'lurker/form_builder'
|
|
49
48
|
require 'lurker/presenters/json_presenter'
|
50
49
|
require 'lurker/presenters/base_presenter'
|
51
50
|
require 'lurker/presenters/service_presenter'
|
52
|
-
require 'lurker/presenters/meta_service_presenter'
|
53
51
|
require 'lurker/presenters/endpoint_presenter'
|
54
52
|
require 'lurker/presenters/schema_presenter'
|
55
53
|
require 'lurker/presenters/response_code_presenter'
|
data/lib/lurker/cli.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'digest/sha1'
|
3
3
|
require 'lurker/service'
|
4
|
-
require 'lurker/meta_service'
|
5
4
|
|
6
5
|
module Lurker
|
7
6
|
# A Thor::Error to be thrown when an lurker directory is not found
|
@@ -24,13 +23,13 @@ module Lurker
|
|
24
23
|
File.expand_path("../templates/public", __FILE__)
|
25
24
|
end
|
26
25
|
|
27
|
-
desc "convert [LURKER_PATH]", "Convert lurker to HTML
|
26
|
+
desc "convert [LURKER_PATH]", "Convert lurker to HTML"
|
28
27
|
method_option :rails, :type => :boolean, :desc => "Includes Rails environment"
|
29
28
|
method_option :exclude, :aliases => "-e", :desc => "Select endpoints by given regexp, if NOT matching prefix"
|
30
29
|
method_option :select, :aliases => "-s", :desc => "Select endpoints by given regexp, matching prefix"
|
31
30
|
method_option :output, :aliases => "-o", :desc => "Output path"
|
32
31
|
method_option :url_base_path, :aliases => "-u", :desc => "URL base path"
|
33
|
-
method_option :format, :aliases => "-f", :desc => "Format in html or
|
32
|
+
method_option :format, :aliases => "-f", :desc => "Format in html or pdf, defaults to html", :default => "html"
|
34
33
|
method_option :templates, :aliases => "-t", :desc => "Template overrides path"
|
35
34
|
method_option :content, :aliases => "-c", :desc => "Content to be rendered into html-docs main page"
|
36
35
|
def convert(lurker_path=Lurker::DEFAULT_SERVICE_PATH)
|
@@ -49,14 +48,18 @@ module Lurker
|
|
49
48
|
require "#{Dir.pwd}/config/environment"
|
50
49
|
end
|
51
50
|
|
52
|
-
if options[:format] == '
|
53
|
-
|
51
|
+
if options[:format] == 'pdf'
|
52
|
+
convert_to_pdf
|
54
53
|
else
|
55
54
|
convert_to_html
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
59
58
|
no_tasks do
|
59
|
+
def convert_to_pdf
|
60
|
+
# TODO
|
61
|
+
end
|
62
|
+
|
60
63
|
def convert_to_html
|
61
64
|
in_root do
|
62
65
|
# js, css, fonts
|
@@ -71,12 +74,10 @@ module Lurker
|
|
71
74
|
FileUtils.cp_r fname, destination.to_s
|
72
75
|
end
|
73
76
|
end
|
74
|
-
|
75
|
-
create_file("index.html", meta_presenter.to_html) if has_meta_service?
|
76
77
|
end
|
77
78
|
|
78
79
|
service_presenters.each do |service_presenter|
|
79
|
-
|
80
|
+
in_root do
|
80
81
|
create_file("index.html", service_presenter.to_html, force: true)
|
81
82
|
|
82
83
|
service_presenter.endpoints.each do |endpoint_prefix_group|
|
@@ -88,32 +89,6 @@ module Lurker
|
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
91
|
-
def convert_to_markdown
|
92
|
-
in_root do
|
93
|
-
create_file("index.md", meta_presenter.to_markdown) if has_meta_service?
|
94
|
-
end
|
95
|
-
|
96
|
-
service_presenters.each do |service_presenter|
|
97
|
-
inside_service_presenter(service_presenter) do
|
98
|
-
create_file("index.md", service_presenter.to_markdown)
|
99
|
-
|
100
|
-
service_presenter.endpoints.each do |endpoint_prefix_group|
|
101
|
-
endpoint_prefix_group.each do |endpoint|
|
102
|
-
create_file(endpoint.url('.md'), endpoint.to_markdown)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def inside_service_presenter(service, &block)
|
110
|
-
if has_meta_service?
|
111
|
-
inside(service.slug_name, {:verbose => true}, &block)
|
112
|
-
else
|
113
|
-
in_root(&block)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
92
|
def output_path
|
118
93
|
@output_path ||=
|
119
94
|
if options[:output]
|
@@ -140,10 +115,6 @@ module Lurker
|
|
140
115
|
!destination.exist? || destination.directory?
|
141
116
|
end
|
142
117
|
|
143
|
-
def has_meta_service?
|
144
|
-
!meta_service.empty?
|
145
|
-
end
|
146
|
-
|
147
118
|
def service_presenters
|
148
119
|
@service_presenters ||= services.map do |service|
|
149
120
|
Lurker::ServicePresenter.new(service, html_options, &filtering_block)
|
@@ -194,23 +165,7 @@ module Lurker
|
|
194
165
|
end
|
195
166
|
|
196
167
|
def services
|
197
|
-
@services ||=
|
198
|
-
if has_meta_service?
|
199
|
-
meta_service.services
|
200
|
-
else
|
201
|
-
[Lurker::Service.new(origin_path)]
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
def meta_presenter
|
206
|
-
@meta_presenter ||= Lurker::MetaServicePresenter.new(
|
207
|
-
meta_service,
|
208
|
-
html_options
|
209
|
-
)
|
210
|
-
end
|
211
|
-
|
212
|
-
def meta_service
|
213
|
-
@meta_service ||= Lurker::MetaService.new(origin_path)
|
168
|
+
@services ||= [Lurker::Service.new(origin_path)]
|
214
169
|
end
|
215
170
|
|
216
171
|
def origin
|
@@ -8,10 +8,7 @@ module Lurker
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
# _describe = self # RSpec::ExampleGroups::... # class
|
11
|
-
actions = [:get, :post, :put, :delete]
|
12
|
-
if defined?(ActionDispatch::Request::HTTP_METHODS) && ActionDispatch::Request::HTTP_METHODS.include?('PATCH')
|
13
|
-
actions << :patch
|
14
|
-
end
|
11
|
+
actions = [:get, :post, :put, :delete, :patch]
|
15
12
|
actions.each do |verb|
|
16
13
|
send(:define_method, "#{verb}_with_lurker") do |*params|
|
17
14
|
@__action, @__request_params = params
|
@@ -19,7 +16,7 @@ module Lurker
|
|
19
16
|
|
20
17
|
send("#{verb}_without_lurker", @__action, @__request_params)
|
21
18
|
|
22
|
-
@__query_params = Hash[@__request_params.
|
19
|
+
@__query_params = Hash[@__request_params.reject { |k,_| path_params.keys.include? k } .map do |k,v|
|
23
20
|
[k.to_s, v.to_s]
|
24
21
|
end]
|
25
22
|
endpoint_path = explicit_path(@__example)
|
@@ -47,7 +44,16 @@ module Lurker
|
|
47
44
|
verify(verb, endpoint_path)
|
48
45
|
end
|
49
46
|
|
50
|
-
|
47
|
+
begin
|
48
|
+
send :alias_method_chain, verb, :lurker
|
49
|
+
rescue NameError
|
50
|
+
if verb == :patch
|
51
|
+
alias_method :patch_without_lurker, :put_without_lurker
|
52
|
+
alias_method :patch, :patch_with_lurker
|
53
|
+
else
|
54
|
+
raise
|
55
|
+
end
|
56
|
+
end
|
51
57
|
end
|
52
58
|
|
53
59
|
around do |example|
|
data/lib/lurker/endpoint.rb
CHANGED
@@ -95,7 +95,7 @@ class Lurker::Endpoint
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def url_params
|
98
|
-
(schema.extensions['path_params'] || {}).
|
98
|
+
(schema.extensions['path_params'] || {}).reject { |k, _| ['action', 'controller', 'format'].include? k }
|
99
99
|
end
|
100
100
|
|
101
101
|
def query_params
|
@@ -1,12 +1,7 @@
|
|
1
1
|
require 'erb'
|
2
|
-
require 'kramdown'
|
3
2
|
require 'json'
|
4
3
|
require 'forwardable'
|
5
4
|
|
6
|
-
# BasePresenters assist in generating Html for lurker classes.
|
7
|
-
# BasePresenters is an abstract class with a lot of helper methods
|
8
|
-
# for URLs and common text styling tasks (like #render_markdown
|
9
|
-
# and #render_json)
|
10
5
|
class Lurker::BasePresenter
|
11
6
|
|
12
7
|
attr_reader :options
|
@@ -21,14 +16,6 @@ class Lurker::BasePresenter
|
|
21
16
|
template.result(binding)
|
22
17
|
end
|
23
18
|
|
24
|
-
def render_markdown(markdown_str)
|
25
|
-
if markdown_str
|
26
|
-
Kramdown::Document.new(markdown_str, :entity_output => :numeric).to_html
|
27
|
-
else
|
28
|
-
nil
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
19
|
def get_binding
|
33
20
|
binding
|
34
21
|
end
|
@@ -20,10 +20,6 @@ class Lurker::EndpointPresenter < Lurker::BasePresenter
|
|
20
20
|
render('show')
|
21
21
|
end
|
22
22
|
|
23
|
-
def to_markdown
|
24
|
-
render_erb('endpoint.md.erb')
|
25
|
-
end
|
26
|
-
|
27
23
|
def relative_path(extension = ".html")
|
28
24
|
'%s%s-%s%s' % [ options[:prefix], endpoint.path, endpoint.verb, extension ]
|
29
25
|
end
|
@@ -79,7 +75,7 @@ class Lurker::EndpointPresenter < Lurker::BasePresenter
|
|
79
75
|
return if endpoint.request_parameters.empty?
|
80
76
|
Lurker::JsonPresenter.new(
|
81
77
|
example_from_schema(endpoint.request_parameters, endpoint.schema)
|
82
|
-
.
|
78
|
+
.reject { |k,_| endpoint.url_params.keys.include? k }
|
83
79
|
)
|
84
80
|
end
|
85
81
|
|
@@ -110,7 +106,12 @@ class Lurker::EndpointPresenter < Lurker::BasePresenter
|
|
110
106
|
|
111
107
|
# for live form WITH :placeholders
|
112
108
|
def named_path
|
113
|
-
|
109
|
+
return @named_path if @named_path
|
110
|
+
@named_path = base_path.sub(/\/?$/, '/') + endpoint.path.gsub(/__/, ':')
|
111
|
+
if (suffix = endpoint.schema.extensions.try(:[], 'suffix')).present?
|
112
|
+
@named_path = @named_path.gsub(/-#{suffix}/, '')
|
113
|
+
end
|
114
|
+
@named_path
|
114
115
|
end
|
115
116
|
|
116
117
|
def verb
|
@@ -18,10 +18,6 @@ class Lurker::ResponseCodePresenter < Lurker::BasePresenter
|
|
18
18
|
EOS
|
19
19
|
end
|
20
20
|
|
21
|
-
def to_markdown
|
22
|
-
"__#{status}__: #{description_raw}"
|
23
|
-
end
|
24
|
-
|
25
21
|
def successful?
|
26
22
|
response_code["successful"]
|
27
23
|
end
|
@@ -31,11 +27,6 @@ class Lurker::ResponseCodePresenter < Lurker::BasePresenter
|
|
31
27
|
end
|
32
28
|
|
33
29
|
def description
|
34
|
-
render_markdown(description_raw)
|
35
|
-
end
|
36
|
-
|
37
|
-
def description_raw
|
38
30
|
response_code["description"]
|
39
31
|
end
|
40
|
-
|
41
32
|
end
|
@@ -34,7 +34,7 @@ class Lurker::SchemaPresenter < Lurker::BasePresenter
|
|
34
34
|
html << '<span class="deprecated">Deprecated</span>' if deprecated?
|
35
35
|
|
36
36
|
html << '<div class="schema">'
|
37
|
-
html <<
|
37
|
+
html << @schema["description"]
|
38
38
|
|
39
39
|
html << '<ul>'
|
40
40
|
begin
|
@@ -59,38 +59,6 @@ class Lurker::SchemaPresenter < Lurker::BasePresenter
|
|
59
59
|
html.string
|
60
60
|
end
|
61
61
|
|
62
|
-
def to_markdown(prefix = "")
|
63
|
-
md = StringIO.new
|
64
|
-
md << 'Deprecated' if deprecated?
|
65
|
-
md << "\n#{@schema["description"]}"
|
66
|
-
md << "\n#{prefix}* __Required__: #{required?}" if nested?
|
67
|
-
md << "\n#{prefix}* __Type__: #{type}" if type
|
68
|
-
md << "\n#{prefix}* __Format__: #{format}" if format
|
69
|
-
md << "\n#{prefix}* __Example__: <tt>#{example.to_markdown}</tt>" if example
|
70
|
-
md << "\n#{@schema['enum']}"
|
71
|
-
(@schema.keys - Lurker::SchemaPresenter::FORMATTED_KEYS).each do |key|
|
72
|
-
md << "\n#{prefix}* %{key} %{@schema[key]}"
|
73
|
-
end
|
74
|
-
if items = @schema["items"]
|
75
|
-
md << "\n#{prefix}* Items"
|
76
|
-
if items.kind_of? Array
|
77
|
-
item.compact.each do |item|
|
78
|
-
md << Lurker::SchemaPresenter.new(item, options.merge(:nested => true)).to_markdown(prefix + "\t")
|
79
|
-
end
|
80
|
-
else
|
81
|
-
md << Lurker::SchemaPresenter.new(@schema["items"], options.merge(:nested => true)).to_markdown(prefix + "\t")
|
82
|
-
end
|
83
|
-
end
|
84
|
-
if properties = @schema["properties"]
|
85
|
-
properties.each do |key, property|
|
86
|
-
next if property.nil?
|
87
|
-
md << "\n#{prefix}* __#{key}__:"
|
88
|
-
md << Lurker::SchemaPresenter.new(property, options.merge(:nested => true)).to_markdown(prefix + "\t")
|
89
|
-
end
|
90
|
-
end
|
91
|
-
md.string
|
92
|
-
end
|
93
|
-
|
94
62
|
def type
|
95
63
|
t = @schema["type"]
|
96
64
|
if t.kind_of? Array
|
@@ -3,7 +3,7 @@ class Lurker::ServicePresenter < Lurker::BasePresenter
|
|
3
3
|
attr_reader :service
|
4
4
|
|
5
5
|
extend Forwardable
|
6
|
-
def_delegators :service, :
|
6
|
+
def_delegators :service, :description, :discussion, :name, :service_dir
|
7
7
|
|
8
8
|
|
9
9
|
def initialize(service, options = {}, &block)
|
@@ -18,10 +18,6 @@ class Lurker::ServicePresenter < Lurker::BasePresenter
|
|
18
18
|
render('index')
|
19
19
|
end
|
20
20
|
|
21
|
-
def to_markdown
|
22
|
-
render_erb('service.md.erb')
|
23
|
-
end
|
24
|
-
|
25
21
|
def title
|
26
22
|
"Lurker | #{name}"
|
27
23
|
end
|
@@ -37,7 +33,7 @@ class Lurker::ServicePresenter < Lurker::BasePresenter
|
|
37
33
|
end
|
38
34
|
|
39
35
|
def name_as_link(options = {})
|
40
|
-
path =
|
36
|
+
path = index_path
|
41
37
|
'<a href="%s">%s %s</a>' % [ path, options[:prefix], service.name ]
|
42
38
|
end
|
43
39
|
|
@@ -92,22 +88,4 @@ class Lurker::ServicePresenter < Lurker::BasePresenter
|
|
92
88
|
hash
|
93
89
|
end
|
94
90
|
end
|
95
|
-
|
96
|
-
def description(options = {:render => true})
|
97
|
-
options[:render] ? render_markdown(service.description) : service.description
|
98
|
-
end
|
99
|
-
|
100
|
-
def discussion(options = {:render => true})
|
101
|
-
options[:render] ? render_markdown(service.discussion) : service.discussion
|
102
|
-
end
|
103
|
-
|
104
|
-
def relative_meta_service_path(file_name = nil)
|
105
|
-
service_path = service_dir.gsub(meta_service.meta_service_dir, "")
|
106
|
-
service_path = service_path.count("/").times.map { "../" }.join
|
107
|
-
if file_name
|
108
|
-
service_path = File.join(service_path, file_name)
|
109
|
-
end
|
110
|
-
service_path
|
111
|
-
end
|
112
|
-
|
113
91
|
end
|
@@ -8,11 +8,7 @@ module Lurker
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
# _describe = self # RSpec::ExampleGroups::... # class
|
11
|
-
actions = [:get, :post, :put, :delete]
|
12
|
-
if defined?(ActionDispatch::Request::HTTP_METHODS) && ActionDispatch::Request::HTTP_METHODS.include?('PATCH')
|
13
|
-
actions << :patch
|
14
|
-
end
|
15
|
-
|
11
|
+
actions = [:get, :post, :put, :delete, :patch]
|
16
12
|
actions.each do |verb|
|
17
13
|
send(:define_method, "#{verb}_with_lurker") do |*params|
|
18
14
|
@__action, @__request_params, @__env = params
|
@@ -58,7 +54,16 @@ module Lurker
|
|
58
54
|
verify(verb, endpoint_path)
|
59
55
|
end
|
60
56
|
|
61
|
-
|
57
|
+
begin
|
58
|
+
send :alias_method_chain, verb, :lurker
|
59
|
+
rescue NameError
|
60
|
+
if verb == :patch
|
61
|
+
alias_method :patch_without_lurker, :put_without_lurker
|
62
|
+
alias_method :patch, :patch_with_lurker
|
63
|
+
else
|
64
|
+
raise
|
65
|
+
end
|
66
|
+
end
|
62
67
|
end
|
63
68
|
|
64
69
|
around do |example|
|