test_sinatra_app 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gemtest ADDED
File without changes
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.swp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in test_sinatra_app.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # Test Sinatra App
2
+ The purpose of this repo is to have, what I would consider, a standard standalone sinatra application that someone might want to package.
3
+
4
+ The goal is to have it work in the following configurations:
5
+
6
+ * With and without bundler
7
+ * With and without rvm
8
+ * MRI installable gem
9
+ * JRuby installable gem
10
+ * Standalone application via bin script
11
+ * rackable application via config.ru
12
+ * Warble-packaged deployable warfile (both jetty and tomcat)
13
+ * Warble standalone winstone warfile
14
+ * SSL works with JRuby
15
+
16
+ Additionally, it needs to be flexible in accepting a single configuration option: `sky_color`.
17
+
18
+ ## So what works?
19
+
20
+ * MRI and Jruby specific gem packages
21
+ * Standalone bin execution with and without the custom option (MRI and Jruby)
22
+ * Rackup with and without custom option (in config.ru) in MRI and Jruby (both rvm and downloaded)
23
+
24
+ ## What's not working?
25
+ Warbler. I'm just not having any luck no matter what options I try. I've attempted to make the war:
26
+
27
+ * With/without gemjar
28
+ * With/without executable
29
+ * With/without using bundler in warble.rb
30
+ * With/without requiring `rubygems` in the config.ru
31
+
32
+ I've seen every error under the sun in attempting to follow this same application style across three different codebases now:
33
+
34
+ * Winstone goes into infinite redirect
35
+ * LoadErrors on random gems
36
+ * Jetty 6 works but Jetty 7 doesn't. Or Tomcat works but no Jetty's work
37
+ * jruby-openssl/bouncy castle errors
38
+
39
+ # How to help
40
+ Fork it and fix it. Use it as a test case. Let me know if I'm just expecting to be able to do too much from a single codebase. Show me where I'm screwing up.
41
+
42
+ # Why?
43
+ I work in a cross-vm world. At my day job, we're primarily a java shop. I use Ruby (and especially sinatra) for various glue applications and it's much easier to be able to package and deploy those to a container. The developers need to have those applications available locally for testing, so a winstone self-executing war is a godsend (when it works).
44
+
45
+ In my personal projects (like Noah), I want to reach the biggest possible audience. I want to make it as easy as possible for someone to try out the application. That means supporting all of the use cases above.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ require 'rspec/core'
3
+ require 'rspec/core/rake_task'
4
+
5
+ Bundler::GemHelper.install_tasks
6
+ RSpec::Core::RakeTask.new(:spec) do |spec|
7
+ spec.pattern = FileList['spec/**/*_spec.rb']
8
+ end
9
+
10
+ task :default => [:spec]
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+ require 'rubygems'
4
+ require 'test_sinatra_app'
5
+ require 'vegas'
6
+
7
+ Vegas::Runner.new(TestSinatraApp::Service, 'test_sinatra_app') do |runner, opts, app|
8
+ opts.on("-m", "--sky-color color", "value for sky color") {|sky| app.set :sky_color, sky.to_sym}
9
+ end
data/config/warble.rb ADDED
@@ -0,0 +1,136 @@
1
+ # Disable automatic framework detection by uncommenting/setting to false
2
+ # Warbler.framework_detection = false
3
+
4
+ # Warbler web application assembly configuration file
5
+ Warbler::Config.new do |config|
6
+ # Features: additional options controlling how the jar is built.
7
+ # Currently the following features are supported:
8
+ # - gemjar: package the gem repository in a jar file in WEB-INF/lib
9
+ # config.features = %w(gemjar)
10
+
11
+ # Application directories to be included in the webapp.
12
+ config.dirs = %w(config lib views)
13
+
14
+ # Additional files/directories to include, above those in config.dirs
15
+ config.includes = FileList["config.ru"]
16
+
17
+ # Additional files/directories to exclude
18
+ # config.excludes = FileList["lib/tasks/*"]
19
+
20
+ # Additional Java .jar files to include. Note that if .jar files are placed
21
+ # in lib (and not otherwise excluded) then they need not be mentioned here.
22
+ # JRuby and JRuby-Rack are pre-loaded in this list. Be sure to include your
23
+ # own versions if you directly set the value
24
+ # config.java_libs += FileList["lib/java/*.jar"]
25
+
26
+ # Loose Java classes and miscellaneous files to be placed in WEB-INF/classes.
27
+ # config.java_classes = FileList["target/classes/**.*"]
28
+
29
+ # One or more pathmaps defining how the java classes should be copied into
30
+ # WEB-INF/classes. The example pathmap below accompanies the java_classes
31
+ # configuration above. See http://rake.rubyforge.org/classes/String.html#M000017
32
+ # for details of how to specify a pathmap.
33
+ # config.pathmaps.java_classes << "%{target/classes/,}p"
34
+
35
+ # Path to the pre-bundled gem directory inside the war file. Default
36
+ # is 'WEB-INF/gems'. Specify path if gems are already bundled
37
+ # before running Warbler. This also sets 'gem.path' inside web.xml.
38
+ # config.gem_path = "WEB-INF/vendor/bundler_gems"
39
+
40
+ # Bundler support is built-in. If Warbler finds a Gemfile in the
41
+ # project directory, it will be used to collect the gems to bundle
42
+ # in your application. If you wish to explicitly disable this
43
+ # functionality, uncomment here.
44
+ config.bundler = false
45
+
46
+ # An array of Bundler groups to avoid including in the war file.
47
+ # Defaults to ["development", "test"].
48
+ # config.bundle_without = []
49
+
50
+ # Files for WEB-INF directory (next to web.xml). This contains
51
+ # web.xml by default. If there is an .erb-File it will be processed
52
+ # with webxml-config. You may want to exclude this file via
53
+ # config.excludes.
54
+ # config.webinf_files += FileList["jboss-web.xml"]
55
+
56
+ # Other gems to be included. You need to tell Warbler which gems
57
+ # your application needs so that they can be packaged in the war
58
+ # file.
59
+ # The Rails gems are included by default unless the vendor/rails
60
+ # directory is present.
61
+ config.gems += ["jruby-openssl", "test_sinatra_app", "sinatra"]
62
+ # config.gems += ["activerecord-jdbcmysql-adapter", "jruby-openssl"]
63
+ # config.gems << "tzinfo"
64
+
65
+ # Uncomment this if you don't want to package rails gem.
66
+ # config.gems -= ["rails"]
67
+
68
+ # The most recent versions of gems are used.
69
+ # You can specify versions of gems by using a hash assignment:
70
+ # config.gems["rails"] = "2.0.2"
71
+
72
+ # You can also use regexps or Gem::Dependency objects for flexibility or
73
+ # fine-grained control.
74
+ # config.gems << /^merb-/
75
+ # config.gems << Gem::Dependency.new("merb-core", "= 0.9.3")
76
+
77
+ # Include gem dependencies not mentioned specifically. Default is
78
+ # true, uncomment to turn off.
79
+ # config.gem_dependencies = false
80
+
81
+ # Array of regular expressions matching relative paths in gems to be
82
+ # excluded from the war. Defaults to empty, but you can set it like
83
+ # below, which excludes test files.
84
+ # config.gem_excludes = [/^(test|spec)\//]
85
+
86
+ # Files to be included in the root of the webapp. Note that files in public
87
+ # will have the leading 'public/' part of the path stripped during staging.
88
+ # config.public_html = FileList["public/**/*", "doc/**/*"]
89
+
90
+ # Pathmaps for controlling how public HTML files are copied into the .war
91
+ # config.pathmaps.public_html = ["%{public/,}p"]
92
+
93
+ # Pathmaps for controlling how application files are copied into the .war
94
+ # config.pathmaps.application = ["WEB-INF/%p"]
95
+
96
+ # Name of the war file (without the .war) -- defaults to the basename
97
+ # of RAILS_ROOT
98
+ # config.war_name = "mywar"
99
+
100
+ # Name of the MANIFEST.MF template for the war file. Defaults to a simple
101
+ # MANIFEST.MF that contains the version of Warbler used to create the war file.
102
+ # config.manifest_file = "config/MANIFEST.MF"
103
+
104
+ # When using the 'compiled' feature and specified, only these Ruby
105
+ # files will be compiled. Default is to compile all \.rb files in
106
+ # the application.
107
+ # config.compiled_ruby_files = FileList['app/**/*.rb']
108
+
109
+ # Value of RAILS_ENV for the webapp -- default as shown below
110
+ # config.webxml.rails.env = ENV['RAILS_ENV'] || 'production'
111
+
112
+ # Application booter to use, one of :rack, :rails, or :merb (autodetected by default)
113
+ config.webxml.booter = :rack
114
+
115
+ # When using the :rack booter, "Rackup" script to use.
116
+ # - For 'rackup.path', the value points to the location of the rackup
117
+ # script in the web archive file. You need to make sure this file
118
+ # gets included in the war, possibly by adding it to config.includes
119
+ # or config.webinf_files above.
120
+ # - For 'rackup', the rackup script you provide as an inline string
121
+ # is simply embedded in web.xml.
122
+ # The script is evaluated in a Rack::Builder to load the application.
123
+ # Examples:
124
+ # config.webxml.rackup.path = 'WEB-INF/hello.ru'
125
+ # config.webxml.rackup = %{require './lib/demo'; run Rack::Adapter::Camping.new(Demo)}
126
+ # config.webxml.rackup = require 'cgi' && CGI::escapeHTML(File.read("config.ru"))
127
+
128
+ # Control the pool of Rails runtimes. Leaving unspecified means
129
+ # the pool will grow as needed to service requests. It is recommended
130
+ # that you fix these values when running a production server!
131
+ # config.webxml.jruby.min.runtimes = 2
132
+ # config.webxml.jruby.max.runtimes = 4
133
+
134
+ # JNDI data source name
135
+ # config.webxml.jndi = 'jdbc/rails'
136
+ end
data/config.ru ADDED
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'test_sinatra_app'
3
+
4
+ TestSinatraApp::Service.set :sky_color, :yellow
5
+ run TestSinatraApp::Service
@@ -0,0 +1,52 @@
1
+ require 'sinatra/base'
2
+ require 'openssl'
3
+ require 'net/https'
4
+ require 'uri'
5
+
6
+ module TestSinatraApp
7
+ class Service < Sinatra::Base
8
+
9
+ configure do
10
+ set :app_file, __FILE__
11
+ set :views, File.expand_path(File.join(File.dirname(__FILE__), "..","..","views"))
12
+ set :server, %w[thin mongrel webrick]
13
+ set :logging, true
14
+ set :raise_errors, false
15
+ set :show_exceptions, true
16
+ set :run, false
17
+ set :sky_color, ENV['SKY_COLOR'] || :blue
18
+ end
19
+
20
+ before do
21
+ content_type "text/plain"
22
+ end
23
+
24
+ get "/" do
25
+ "#{settings.sky_color}"
26
+ end
27
+
28
+ get "/ssltest/?" do
29
+ uri = URI.parse("https://gist.github.com/raw/833757/d21b2b095c459e62518f10eefa4654b589bfae80/test-gist.txt")
30
+ http = Net::HTTP.new(uri.host, uri.port)
31
+ http.use_ssl = true
32
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
33
+ request = Net::HTTP::Get.new(uri.request_uri)
34
+
35
+ response = http.request(request)
36
+ "#{response.body}"
37
+ end
38
+
39
+ get "/pemtest/?" do
40
+ cert = OpenSSL::X509::Certificate.new(TestSinatraApp::PEMFILE)
41
+ out=<<-EOL
42
+ Issuer: #{cert.issuer.to_s}
43
+ Version: #{cert.version.to_s}
44
+ Not Before: #{cert.not_before.to_s}
45
+ Not After: #{cert.not_after.to_s}
46
+ Subject: #{cert.subject.to_s}
47
+ Algorithm: #{cert.signature_algorithm}
48
+ EOL
49
+ "#{out}"
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,3 @@
1
+ module TestSinatraApp
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,29 @@
1
+ require File.join(File.dirname(__FILE__), 'test_sinatra_app','version')
2
+ require File.join(File.dirname(__FILE__), 'test_sinatra_app','app')
3
+ module TestSinatraApp
4
+ PEMFILE=<<EOC
5
+ -----BEGIN CERTIFICATE-----
6
+ MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx
7
+ HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh
8
+ IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0
9
+ aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1
10
+ MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg
11
+ SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M
12
+ IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw
13
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U
14
+ 0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI
15
+ TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf
16
+ RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF
17
+ zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh
18
+ BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA
19
+ AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY
20
+ PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/
21
+ BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn
22
+ 9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT
23
+ Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF
24
+ Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX
25
+ n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW
26
+ H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S
27
+ -----END CERTIFICATE-----
28
+ EOC
29
+ end
data/spec/rack_spec.rb ADDED
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Requesting" do
4
+ describe "/" do
5
+ it "should display 'blue'" do
6
+ get "/"
7
+ last_response.should be_ok
8
+ r = last_response.body
9
+ r.should == "blue"
10
+ end
11
+ end
12
+
13
+ describe "/ssltest" do
14
+ it "should work" do
15
+ get "/ssltest"
16
+ last_response.should be_ok
17
+ r = last_response.body
18
+ r.should == "If you can read this, SSL works!"
19
+ end
20
+ end
21
+
22
+ describe "/pemtest" do
23
+ it "should work" do
24
+ get "/pemtest"
25
+ last_response.should be_ok
26
+ r = last_response.body
27
+ r.should =~ /sha1WithRSAEncryption/
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,15 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'test_sinatra_app')
2
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'test_sinatra_app', 'app')
3
+
4
+ require 'rspec'
5
+ require 'rack/test'
6
+
7
+ RSpec.configure do |config|
8
+ config.color_enabled = true
9
+ config.formatter = "documentation"
10
+ config.include Rack::Test::Methods
11
+ end
12
+
13
+ def app
14
+ TestSinatraApp::Service
15
+ end
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "test_sinatra_app/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "test_sinatra_app"
7
+ s.version = TestSinatraApp::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["John E. Vincent"]
10
+ s.email = ["lusis.org+github.com@gmail.com"]
11
+ s.homepage = "https://github.com/lusis/test_sinatra_app"
12
+ s.summary = %q{Test Sinatra App}
13
+ s.description = %q{A Sinatra test application for validating various combinations of packaging and vm platforms}
14
+
15
+ s.rubyforge_project = "test_sinatra_app"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency("sinatra")
23
+ s.add_dependency("json")
24
+ s.add_dependency("vegas")
25
+
26
+ if RUBY_PLATFORM == "java"
27
+ s.add_dependency("jruby-openssl")
28
+ s.add_development_dependency("warbler")
29
+ else
30
+ s.add_dependency("thin")
31
+ end
32
+ s.add_development_dependency("rack-test")
33
+ s.add_development_dependency("rspec")
34
+ end
data/views/index.erb ADDED
File without changes
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: test_sinatra_app
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
11
+ platform: ruby
12
+ authors:
13
+ - John E. Vincent
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-02-18 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: sinatra
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: json
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: vegas
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: thin
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :runtime
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: rack-test
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :development
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: rspec
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :development
104
+ version_requirements: *id006
105
+ description: A Sinatra test application for validating various combinations of packaging and vm platforms
106
+ email:
107
+ - lusis.org+github.com@gmail.com
108
+ executables:
109
+ - test_sinatra_app
110
+ extensions: []
111
+
112
+ extra_rdoc_files: []
113
+
114
+ files:
115
+ - .gemtest
116
+ - .gitignore
117
+ - Gemfile
118
+ - README.md
119
+ - Rakefile
120
+ - bin/test_sinatra_app
121
+ - config.ru
122
+ - config/warble.rb
123
+ - lib/test_sinatra_app.rb
124
+ - lib/test_sinatra_app/app.rb
125
+ - lib/test_sinatra_app/version.rb
126
+ - spec/rack_spec.rb
127
+ - spec/spec_helper.rb
128
+ - test_sinatra_app.gemspec
129
+ - views/index.erb
130
+ has_rdoc: true
131
+ homepage: https://github.com/lusis/test_sinatra_app
132
+ licenses: []
133
+
134
+ post_install_message:
135
+ rdoc_options: []
136
+
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ hash: 3
145
+ segments:
146
+ - 0
147
+ version: "0"
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ hash: 3
154
+ segments:
155
+ - 0
156
+ version: "0"
157
+ requirements: []
158
+
159
+ rubyforge_project: test_sinatra_app
160
+ rubygems_version: 1.4.1
161
+ signing_key:
162
+ specification_version: 3
163
+ summary: Test Sinatra App
164
+ test_files: []
165
+