dry-web-roda 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +143 -64
- data/LICENSE +1 -1
- data/README.md +16 -41
- data/{exe → bin}/dry-web-roda +0 -0
- data/dry-web-roda.gemspec +21 -20
- data/lib/dry/web/roda/templates/subapp/container.rb.tt +3 -3
- data/lib/dry/web/roda/version.rb +1 -1
- metadata +18 -144
- data/.codeclimate.yml +0 -12
- data/.github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md +0 -10
- data/.github/ISSUE_TEMPLATE/---bug-report.md +0 -30
- data/.github/ISSUE_TEMPLATE/---feature-request.md +0 -18
- data/.github/workflows/custom_ci.yml +0 -50
- data/.github/workflows/docsite.yml +0 -34
- data/.github/workflows/sync_configs.yml +0 -34
- data/.gitignore +0 -37
- data/.rspec +0 -4
- data/.rubocop.yml +0 -95
- data/CODE_OF_CONDUCT.md +0 -13
- data/CONTRIBUTING.md +0 -29
- data/Gemfile +0 -32
- data/Rakefile +0 -6
- data/lib/dry/web/roda/templates/.gitignore +0 -11
- data/lib/dry/web/roda/templates/.keep +0 -0
- data/lib/dry/web/roda/templates/.rspec +0 -2
- data/script/ci +0 -67
- data/script/setup +0 -47
- data/script/teardown +0 -42
- data/spec/integration/new_app_spec.rb +0 -21
- data/spec/spec_helper.rb +0 -22
- data/spec/support/app.rb +0 -64
- data/spec/support/bundler.rb +0 -113
- data/spec/support/cli.rb +0 -47
- data/spec/support/directories.rb +0 -37
- data/spec/support/env.rb +0 -84
- data/spec/support/files.rb +0 -59
- data/spec/support/project.rb +0 -60
- data/spec/support/requests.rb +0 -5
- data/spec/support/silently.rb +0 -28
- data/spec/unit/generators/inflections_spec.rb +0 -33
data/spec/spec_helper.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require "pry-byebug"
|
2
|
-
|
3
|
-
SPEC_ROOT = Pathname(__dir__)
|
4
|
-
TEST_APP_NAME = "test_app".freeze
|
5
|
-
|
6
|
-
Dir[SPEC_ROOT.join("support/*.rb").to_s].each { |f| require f }
|
7
|
-
|
8
|
-
RSpec.configure do |config|
|
9
|
-
config.disable_monkey_patching!
|
10
|
-
|
11
|
-
config.example_status_persistence_file_path = "spec/examples.txt"
|
12
|
-
|
13
|
-
config.filter_run :focus
|
14
|
-
config.run_all_when_everything_filtered = true
|
15
|
-
|
16
|
-
config.default_formatter = "doc" if config.files_to_run.one?
|
17
|
-
|
18
|
-
config.profile_examples = 10
|
19
|
-
|
20
|
-
config.order = :random
|
21
|
-
Kernel.srand config.seed
|
22
|
-
end
|
data/spec/support/app.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require "net/http"
|
2
|
-
require "uri"
|
3
|
-
require "waitutil"
|
4
|
-
require_relative "silently"
|
5
|
-
|
6
|
-
module RSpec
|
7
|
-
module Support
|
8
|
-
module App
|
9
|
-
private
|
10
|
-
|
11
|
-
class RunningApp
|
12
|
-
attr_reader :port
|
13
|
-
|
14
|
-
def initialize(port)
|
15
|
-
@port = port
|
16
|
-
end
|
17
|
-
|
18
|
-
def get(path)
|
19
|
-
Net::HTTP.get(uri(path))
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def uri(path)
|
25
|
-
URI("http://0.0.0.0:#{port}#{path}")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def run_app(host: "0.0.0.0", port: "30333", timeout: 10)
|
30
|
-
cmd = "bundle exec rackup -o 0.0.0.0 -p #{port} config.ru"
|
31
|
-
out = Tempfile.new("dry-web-roda-out")
|
32
|
-
|
33
|
-
pid = fork {
|
34
|
-
Bundler.with_clean_env do
|
35
|
-
exec cmd, out: out.path, err: out.path
|
36
|
-
end
|
37
|
-
}
|
38
|
-
|
39
|
-
WaitUtil.wait_for_condition "app available on #{host}:#{port}", timeout_sec: timeout do
|
40
|
-
begin
|
41
|
-
result = WaitUtil.send(:is_tcp_port_open, host, port, WaitUtil::DEFAULT_DELAY_SEC)
|
42
|
-
|
43
|
-
result || begin
|
44
|
-
out.rewind
|
45
|
-
[false, "#{cmd} failed:\n#{out.read}"]
|
46
|
-
end
|
47
|
-
rescue SocketError
|
48
|
-
out.rewind
|
49
|
-
[false, "#{cmd} failed:\n#{out.read}"]
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
yield RunningApp.new(port)
|
54
|
-
ensure
|
55
|
-
Process.kill "TERM", pid
|
56
|
-
Process.wait pid
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
RSpec.configure do |config|
|
63
|
-
config.include RSpec::Support::App, type: :cli
|
64
|
-
end
|
data/spec/support/bundler.rb
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
require 'open3'
|
2
|
-
require 'pathname'
|
3
|
-
require_relative 'env'
|
4
|
-
require_relative 'silently'
|
5
|
-
require_relative 'files'
|
6
|
-
|
7
|
-
module RSpec
|
8
|
-
module Support
|
9
|
-
module Bundler
|
10
|
-
def self.root
|
11
|
-
Pathname.new(__dir__).join("..", "..")
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.cache
|
15
|
-
root.join("vendor", "cache")
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.setup
|
19
|
-
return if cache.exist?
|
20
|
-
|
21
|
-
with_clean_env do
|
22
|
-
RSpec::Support.silently "./script/setup"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.with_clean_env(&blk)
|
27
|
-
::Bundler.with_clean_env(&blk)
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
attr_reader :out, :err, :exitstatus
|
33
|
-
|
34
|
-
def setup_gemfile(gems: [], exclude_gems: [], path: "Gemfile")
|
35
|
-
filtered_content = ::File.readlines(path).
|
36
|
-
drop(1).
|
37
|
-
reject { |l| exclude_gems.any? { |g| l.include?(g) } }
|
38
|
-
|
39
|
-
content = ["source 'file://#{cache}'\n"] + filtered_content + gems.map { |g| "gem #{g}\n" }
|
40
|
-
|
41
|
-
rewrite(path, content)
|
42
|
-
end
|
43
|
-
|
44
|
-
def bundle_install
|
45
|
-
bundle "install --local --no-cache --retry 0 --no-color"
|
46
|
-
end
|
47
|
-
|
48
|
-
def bundle_exec(cmd, env: nil, &blk)
|
49
|
-
bundle("exec #{cmd}", env: env, &blk)
|
50
|
-
end
|
51
|
-
|
52
|
-
def bundle(cmd, env: nil, &blk)
|
53
|
-
ruby_bin = which("ruby")
|
54
|
-
bundle_bin = which("bundle")
|
55
|
-
rack_env = "RACK_ENV=#{env} " unless env.nil?
|
56
|
-
|
57
|
-
system_exec("#{rack_env}#{ruby_bin} -I#{load_paths} #{bundle_bin} #{cmd}", &blk)
|
58
|
-
end
|
59
|
-
|
60
|
-
# Adapted from Bundler source code
|
61
|
-
#
|
62
|
-
# Bundler is released under MIT license
|
63
|
-
# https://github.com/bundler/bundler/blob/master/LICENSE.md
|
64
|
-
#
|
65
|
-
# A special "thank you" goes to Bundler maintainers and contributors.
|
66
|
-
#
|
67
|
-
# rubocop:disable Metrics/AbcSize
|
68
|
-
# rubocop:disable Metrics/MethodLength
|
69
|
-
def system_exec(cmd)
|
70
|
-
Open3.popen3(RSpec::Support::Env.env, cmd) do |stdin, stdout, stderr, wait_thr|
|
71
|
-
yield stdin, stdout, wait_thr if block_given?
|
72
|
-
stdin.close
|
73
|
-
|
74
|
-
@exitstatus = wait_thr && wait_thr.value.exitstatus
|
75
|
-
@out = Thread.new { stdout.read }.value.strip
|
76
|
-
@err = Thread.new { stderr.read }.value.strip
|
77
|
-
end
|
78
|
-
|
79
|
-
(@all_output ||= "") << [
|
80
|
-
"$ #{cmd.to_s.strip}",
|
81
|
-
out,
|
82
|
-
err,
|
83
|
-
@exitstatus ? "# $? => #{@exitstatus}" : "",
|
84
|
-
"\n"
|
85
|
-
].reject(&:empty?).join("\n")
|
86
|
-
|
87
|
-
@out
|
88
|
-
end
|
89
|
-
# rubocop:enable Metrics/MethodLength
|
90
|
-
# rubocop:enable Metrics/AbcSize
|
91
|
-
|
92
|
-
def load_paths
|
93
|
-
[root.join('lib'), root.join('spec')].join(':')
|
94
|
-
end
|
95
|
-
|
96
|
-
def root
|
97
|
-
RSpec::Support::Bundler.root
|
98
|
-
end
|
99
|
-
|
100
|
-
def cache
|
101
|
-
RSpec::Support::Bundler.cache
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
RSpec.configure do |config|
|
108
|
-
config.include RSpec::Support::Bundler, type: :cli
|
109
|
-
|
110
|
-
config.before(:all, type: :cli) do
|
111
|
-
RSpec::Support::Bundler.setup
|
112
|
-
end
|
113
|
-
end
|
data/spec/support/cli.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require "aruba"
|
2
|
-
require "aruba/api"
|
3
|
-
require "pathname"
|
4
|
-
|
5
|
-
module RSpec
|
6
|
-
module Support
|
7
|
-
module Cli
|
8
|
-
def self.included(spec)
|
9
|
-
spec.before do
|
10
|
-
aruba = Pathname.new(Dir.pwd).join('tmp', 'aruba')
|
11
|
-
aruba.rmtree if aruba.exist?
|
12
|
-
|
13
|
-
setup_aruba
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def run_command(cmd, output = nil, exit_status: 0)
|
20
|
-
run_simple "bundle exec #{cmd}", fail_on_error: false
|
21
|
-
|
22
|
-
match_output(output)
|
23
|
-
expect(last_command_started).to have_exit_status(exit_status)
|
24
|
-
end
|
25
|
-
|
26
|
-
def match_output(output)
|
27
|
-
case output
|
28
|
-
when String
|
29
|
-
expect(all_output).to include(output)
|
30
|
-
when Regexp
|
31
|
-
expect(all_output).to match(output)
|
32
|
-
when Array
|
33
|
-
output.each { |o| match_output(o) }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def all_output
|
38
|
-
all_commands.map(&:output).join("\n")
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
RSpec.configure do |config|
|
45
|
-
config.include Aruba::Api, type: :cli
|
46
|
-
config.include RSpec::Support::Cli, type: :cli
|
47
|
-
end
|
data/spec/support/directories.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require "fileutils"
|
2
|
-
|
3
|
-
module RSpec
|
4
|
-
module Support
|
5
|
-
module Directory
|
6
|
-
private
|
7
|
-
|
8
|
-
def with_directory(directory)
|
9
|
-
current = Dir.pwd
|
10
|
-
target = Pathname.new(Dir.pwd).join(directory)
|
11
|
-
|
12
|
-
Dir.chdir(target)
|
13
|
-
yield
|
14
|
-
ensure
|
15
|
-
Dir.chdir(current)
|
16
|
-
end
|
17
|
-
|
18
|
-
def with_tmp_directory
|
19
|
-
dir = Pathname.new("tmp").join("aruba")
|
20
|
-
|
21
|
-
with_directory(dir) do
|
22
|
-
yield
|
23
|
-
end
|
24
|
-
ensure
|
25
|
-
FileUtils.rm_rf(dir)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
RSpec.configure do |config|
|
32
|
-
config.include RSpec::Support::Directory, type: :cli
|
33
|
-
|
34
|
-
config.before :suite do
|
35
|
-
Pathname.new(Dir.pwd).join("tmp").mkpath
|
36
|
-
end
|
37
|
-
end
|
data/spec/support/env.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
require 'thread'
|
3
|
-
|
4
|
-
module RSpec
|
5
|
-
module Support
|
6
|
-
class Env
|
7
|
-
include Singleton
|
8
|
-
|
9
|
-
def self.setup
|
10
|
-
instance.__send__(:setup)
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.reset
|
14
|
-
instance.__send__(:setup)
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.env
|
18
|
-
instance.to_h
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.[](key)
|
22
|
-
instance[key]
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.[]=(key, value)
|
26
|
-
instance[key] = value
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.fetch_from_original(key)
|
30
|
-
instance.__send__(:original).fetch(key)
|
31
|
-
end
|
32
|
-
|
33
|
-
def initialize
|
34
|
-
@original = ENV.to_hash
|
35
|
-
@mutex = Mutex.new
|
36
|
-
setup
|
37
|
-
end
|
38
|
-
|
39
|
-
def [](key)
|
40
|
-
synchronize do
|
41
|
-
env[key]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def []=(key, value)
|
46
|
-
synchronize do
|
47
|
-
env[key] = value
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def to_h
|
52
|
-
env.dup
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
attr_reader :original, :env
|
58
|
-
|
59
|
-
def setup
|
60
|
-
synchronize do
|
61
|
-
@env = {}
|
62
|
-
end
|
63
|
-
|
64
|
-
self["GEM_ROOT"] = original["GEM_ROOT"]
|
65
|
-
self["GEM_HOME"] = original["GEM_HOME"]
|
66
|
-
self["GEM_PATH"] = original["GEM_PATH"]
|
67
|
-
end
|
68
|
-
|
69
|
-
def synchronize(&blk)
|
70
|
-
@mutex.synchronize(&blk)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
RSpec.configure do |config|
|
77
|
-
config.before(:suite) do
|
78
|
-
RSpec::Support::Env.setup
|
79
|
-
end
|
80
|
-
|
81
|
-
config.after do
|
82
|
-
RSpec::Support::Env.reset
|
83
|
-
end
|
84
|
-
end
|
data/spec/support/files.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Support
|
3
|
-
module Files
|
4
|
-
private
|
5
|
-
|
6
|
-
def write(path, *content)
|
7
|
-
Pathname.new(path).dirname.mkpath
|
8
|
-
open(path, ::File::CREAT | ::File::WRONLY, *content)
|
9
|
-
end
|
10
|
-
|
11
|
-
def rewrite(path, *content)
|
12
|
-
open(path, ::File::TRUNC | ::File::WRONLY, *content)
|
13
|
-
end
|
14
|
-
|
15
|
-
def replace(path, target, replacement)
|
16
|
-
content = ::File.readlines(path)
|
17
|
-
content[index(content, path, target)] = "#{replacement}\n"
|
18
|
-
|
19
|
-
rewrite(path, content)
|
20
|
-
end
|
21
|
-
|
22
|
-
def replace_last(path, target, replacement)
|
23
|
-
content = ::File.readlines(path)
|
24
|
-
content[-index(content.reverse, path, target) - 1] = "#{replacement}\n"
|
25
|
-
|
26
|
-
rewrite(path, content)
|
27
|
-
end
|
28
|
-
|
29
|
-
def unshift(path, line)
|
30
|
-
content = ::File.readlines(path)
|
31
|
-
content.unshift("#{line}\n")
|
32
|
-
|
33
|
-
rewrite(path, content)
|
34
|
-
end
|
35
|
-
|
36
|
-
def append(path, contents)
|
37
|
-
content = ::File.readlines(path)
|
38
|
-
content << "#{contents}\n"
|
39
|
-
|
40
|
-
rewrite(path, content)
|
41
|
-
end
|
42
|
-
|
43
|
-
def open(path, mode, *content)
|
44
|
-
::File.open(path, mode) do |file|
|
45
|
-
file.write(Array(content).flatten.join)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def index(content, path, target)
|
50
|
-
content.index { |l| l.include?(target) } or
|
51
|
-
raise ArgumentError.new("Cannot find `#{target}' inside `#{path}'.")
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
RSpec.configure do |config|
|
58
|
-
config.include RSpec::Support::Files, type: :cli
|
59
|
-
end
|
data/spec/support/project.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require "waitutil"
|
2
|
-
require_relative 'env'
|
3
|
-
require_relative 'silently'
|
4
|
-
require_relative 'bundler'
|
5
|
-
require_relative 'directories'
|
6
|
-
|
7
|
-
module RSpec
|
8
|
-
module Support
|
9
|
-
module Project
|
10
|
-
private
|
11
|
-
|
12
|
-
KNOWN_ARGUMENTS = [:arch].freeze
|
13
|
-
|
14
|
-
def with_project(name = "sandbox", **args)
|
15
|
-
with_tmp_directory do
|
16
|
-
create_project name, args
|
17
|
-
|
18
|
-
within_project_directory(name) do
|
19
|
-
setup_gemfile gems: ["'dry-web-roda', path: '#{root}'"], exclude_gems: ['dry-web-roda']
|
20
|
-
bundle_install
|
21
|
-
yield
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def within_project_directory(project)
|
27
|
-
cd(project.to_s) do
|
28
|
-
# Aruba resets ENV and its API to set new env vars is broken.
|
29
|
-
#
|
30
|
-
# We need to manually setup the following env vars:
|
31
|
-
#
|
32
|
-
# ENV["PATH"] is required by Capybara's selenium/poltergeist drivers
|
33
|
-
ENV["PATH"] = RSpec::Support::Env.fetch_from_original("PATH")
|
34
|
-
# Bundler on CI can't find HOME and it fails to run Hanami commands
|
35
|
-
ENV["HOME"] = RSpec::Support::Env.fetch_from_original("HOME")
|
36
|
-
|
37
|
-
yield
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def create_project(name, args)
|
42
|
-
silently "dry-web-roda new #{name} #{_create_project_args(args)}"
|
43
|
-
end
|
44
|
-
|
45
|
-
def _create_project_args(args)
|
46
|
-
return if args.empty?
|
47
|
-
|
48
|
-
flags = args.dup.keep_if { |k, _| KNOWN_ARGUMENTS.include?(k) }
|
49
|
-
|
50
|
-
flags.map { |arg, value|
|
51
|
-
"--#{arg}=#{value}"
|
52
|
-
}.join(" ")
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
RSpec.configure do |config|
|
59
|
-
config.include RSpec::Support::Project, type: :cli
|
60
|
-
end
|