mirror of
https://github.com/sinatra/sinatra
synced 2023-03-27 23:18:01 -04:00
8ae87a87f3
* Initialize rubocop * Style/StringLiterals: prefer single quotes * Style/AndOr: use `&&` and `||`, instead of `and` and `or` * Style/HashSyntax: use new hash syntax * Layout/EmptyLineAfterGuardClause: add empty lines after guard clause * Style/SingleLineMethods: temporary disable It breaks layout of the code, it is better to fix it manually * Style/Proc: prefer `proc` vs `Proc.new` * Disable Lint/AmbiguousBlockAssociation It affects proc definitions for sinatra DSL * Disable Style/CaseEquality * Lint/UnusedBlockArgument: put underscore in front of it * Style/Alias: prefer alias vs alias_method in a class body * Layout/EmptyLineBetweenDefs: add empty lines between defs * Style/ParallelAssignment: don't use parallel assigment * Style/RegexpLiteral: prefer %r for regular expressions * Naming/UncommunicativeMethodParamName: fix abbrevs * Style/PerlBackrefs: disable cop * Layout/SpaceAfterComma: add missing spaces * Style/Documentation: disable cop * Style/FrozenStringLiteralComment: add frozen_string_literal * Layout/AlignHash: align hash * Layout/ExtraSpacing: allow for alignment * Layout/SpaceAroundOperators: add missing spaces * Style/Not: prefer `!` instead of `not` * Style/GuardClause: add guard conditions * Style/MutableConstant: freeze contants * Lint/IneffectiveAccessModifier: disable cop * Lint/RescueException: disable cop * Style/SpecialGlobalVars: disable cop * Layout/DotPosition: fix position of dot for multiline method chains * Layout/SpaceInsideArrayLiteralBrackets: don't use spaces inside arrays * Layout/SpaceInsideBlockBraces: add space for blocks * Layout/SpaceInsideHashLiteralBraces: add spaces for hashes * Style/FormatString: use format string syntax * Style/StderrPuts: `warn` is preferable to `$stderr.puts` * Bundler/DuplicatedGem: disable cop * Layout/AlignArray: fix warning * Lint/AssignmentInCondition: remove assignments from conditions * Layout/IndentHeredoc: disable cop * Layout/SpaceInsideParens: remove extra spaces * Lint/UnusedMethodArgument: put underscore in front of unused arg * Naming/RescuedExceptionsVariableName: use `e` for exceptions * Style/CommentedKeyword: put comments before the method * Style/FormatStringToken: disable cop * Style/MultilineIfModifier: move condition before the method * Style/SignalException: prefer `raise` to `fail` * Style/SymbolArray: prefer %i for array of symbols * Gemspec/OrderedDependencies: Use alphabetical order for dependencies * Lint/UselessAccessModifier: disable cop * Naming/HeredocDelimiterNaming: change delimiter's name * Style/ClassCheck: prefer `is_a?` to `kind_of?` * Style/ClassVars: disable cop * Style/Encoding: remove coding comment * Style/RedundantParentheses: remove extra parentheses * Style/StringLiteralsInInterpolation: prefer singl quotes * Layout/AlignArguments: fix alignment * Layout/ClosingHeredocIndentation: align heredoc * Layout/EmptyLineAfterMagicComment: add empty line * Set RubyVersion for rubocop * Lint/UselessAssignment: disable cop * Style/EmptyLiteral: disable cop Causes test failures * Minor code-style fixes with --safe-auto-correct option * Disable the rest of the cops that cause warnings It would be easier to re-enable them in separate PRs * Add rubocop check to the default Rake task * Update to rubocop 1.32.0 * Rubocop updates for rack-protection and sinatra-contrib * Disable Style/SlicingWithRange cop * Make suggested updates Co-authored-by: Jordan Owens <jkowens@gmail.com>
164 lines
3.5 KiB
Ruby
164 lines
3.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'open-uri'
|
|
require 'net/http'
|
|
require 'timeout'
|
|
|
|
module Sinatra
|
|
# NOTE: This feature is experimental, and missing tests!
|
|
#
|
|
# Helps you spinning up and shutting down your own sinatra app. This is especially helpful for running
|
|
# real network tests against a sinatra backend.
|
|
#
|
|
# The backend server could look like the following (in test/server.rb).
|
|
#
|
|
# require "sinatra"
|
|
#
|
|
# get "/" do
|
|
# "Cheers from test server"
|
|
# end
|
|
#
|
|
# get "/ping" do
|
|
# "1"
|
|
# end
|
|
#
|
|
# Note that you need to implement a ping action for internal use.
|
|
#
|
|
# Next, you need to write your runner.
|
|
#
|
|
# require 'sinatra/runner'
|
|
#
|
|
# class Runner < Sinatra::Runner
|
|
# def app_file
|
|
# File.expand_path("server.rb", __dir__)
|
|
# end
|
|
# end
|
|
#
|
|
# Override Runner#app_file, #command, #port, #protocol and #ping_path for customization.
|
|
#
|
|
# **Don't forget to override #app_file specific to your application!**
|
|
#
|
|
# Wherever you need this test backend, here's how you manage it. The following example assumes you
|
|
# have a test in your app that needs to be run against your test backend.
|
|
#
|
|
# runner = ServerRunner.new
|
|
# runner.run
|
|
#
|
|
# # ..tests against localhost:4567 here..
|
|
#
|
|
# runner.kill
|
|
#
|
|
# For an example, check https://github.com/apotonick/roar/blob/master/test/integration/runner.rb
|
|
class Runner
|
|
def app_file
|
|
File.expand_path('server.rb', __dir__)
|
|
end
|
|
|
|
def run
|
|
@pipe = start
|
|
@started = Time.now
|
|
warn "#{server} up and running on port #{port}" if ping
|
|
end
|
|
|
|
def kill
|
|
return unless pipe
|
|
|
|
Process.kill('KILL', pipe.pid)
|
|
rescue NotImplementedError
|
|
system "kill -9 #{pipe.pid}"
|
|
rescue Errno::ESRCH
|
|
end
|
|
|
|
def get(url)
|
|
Timeout.timeout(1) { get_url("#{protocol}://127.0.0.1:#{port}#{url}") }
|
|
end
|
|
|
|
def get_stream(url = '/stream', &block)
|
|
Net::HTTP.start '127.0.0.1', port do |http|
|
|
request = Net::HTTP::Get.new url
|
|
http.request request do |response|
|
|
response.read_body(&block)
|
|
end
|
|
end
|
|
end
|
|
|
|
def get_response(url)
|
|
Net::HTTP.start '127.0.0.1', port do |http|
|
|
request = Net::HTTP::Get.new url
|
|
http.request request do |response|
|
|
response
|
|
end
|
|
end
|
|
end
|
|
|
|
def log
|
|
@log ||= ''
|
|
loop { @log << pipe.read_nonblock(1) }
|
|
rescue Exception
|
|
@log
|
|
end
|
|
|
|
private
|
|
|
|
attr_accessor :pipe
|
|
|
|
def start
|
|
IO.popen(command)
|
|
end
|
|
|
|
# to be overwritten
|
|
def command
|
|
"bundle exec ruby #{app_file} -p #{port} -e production"
|
|
end
|
|
|
|
def ping(timeout = 30)
|
|
loop do
|
|
return if alive?
|
|
|
|
if Time.now - @started > timeout
|
|
warn command, log
|
|
raise 'timeout'
|
|
else
|
|
sleep 0.1
|
|
end
|
|
end
|
|
end
|
|
|
|
def alive?
|
|
3.times { get(ping_path) }
|
|
true
|
|
rescue EOFError, SystemCallError, OpenURI::HTTPError, Timeout::Error
|
|
false
|
|
end
|
|
|
|
# to be overwritten
|
|
def ping_path
|
|
'/ping'
|
|
end
|
|
|
|
# to be overwritten
|
|
def port
|
|
4567
|
|
end
|
|
|
|
def protocol
|
|
'http'
|
|
end
|
|
|
|
def get_url(url)
|
|
uri = URI.parse(url)
|
|
|
|
return uri.read unless protocol == 'https'
|
|
|
|
get_https_url(uri)
|
|
end
|
|
|
|
def get_https_url(uri)
|
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
http.use_ssl = true
|
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
request = Net::HTTP::Get.new(uri.request_uri)
|
|
http.request(request).body
|
|
end
|
|
end
|
|
end
|