hanami-devtools 2023.02.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rubocop.yml +158 -0
  4. data/Gemfile +4 -0
  5. data/README.md +35 -0
  6. data/Rakefile +4 -0
  7. data/bin/console +15 -0
  8. data/bin/setup +8 -0
  9. data/hanami-devtools.gemspec +42 -0
  10. data/lib/hanami/devtools/integration/bundler.rb +174 -0
  11. data/lib/hanami/devtools/integration/capybara.rb +20 -0
  12. data/lib/hanami/devtools/integration/cli.rb +57 -0
  13. data/lib/hanami/devtools/integration/coverage.rb +55 -0
  14. data/lib/hanami/devtools/integration/dns.rb +26 -0
  15. data/lib/hanami/devtools/integration/env.rb +97 -0
  16. data/lib/hanami/devtools/integration/files.rb +108 -0
  17. data/lib/hanami/devtools/integration/gemfile.rb +38 -0
  18. data/lib/hanami/devtools/integration/hanami_commands.rb +169 -0
  19. data/lib/hanami/devtools/integration/platform/engine.rb +32 -0
  20. data/lib/hanami/devtools/integration/platform/matcher.rb +79 -0
  21. data/lib/hanami/devtools/integration/platform/os.rb +21 -0
  22. data/lib/hanami/devtools/integration/platform.rb +22 -0
  23. data/lib/hanami/devtools/integration/project_without_hanami_model.rb +26 -0
  24. data/lib/hanami/devtools/integration/rack_test.rb +87 -0
  25. data/lib/hanami/devtools/integration/random_port.rb +46 -0
  26. data/lib/hanami/devtools/integration/retry.rb +36 -0
  27. data/lib/hanami/devtools/integration/silently.rb +35 -0
  28. data/lib/hanami/devtools/integration/with_clean_env_project.rb +29 -0
  29. data/lib/hanami/devtools/integration/with_directory.rb +30 -0
  30. data/lib/hanami/devtools/integration/with_project.rb +77 -0
  31. data/lib/hanami/devtools/integration/with_system_tmp_directory.rb +24 -0
  32. data/lib/hanami/devtools/integration/with_tmp_directory.rb +48 -0
  33. data/lib/hanami/devtools/integration/within_project_directory.rb +37 -0
  34. data/lib/hanami/devtools/integration.rb +4 -0
  35. data/lib/hanami/devtools/rake_helper.rb +31 -0
  36. data/lib/hanami/devtools/rake_tasks.rb +4 -0
  37. data/lib/hanami/devtools/unit/support/coverage.rb +10 -0
  38. data/lib/hanami/devtools/unit/support/silence_deprecations.rb +12 -0
  39. data/lib/hanami/devtools/unit.rb +4 -0
  40. data/lib/hanami/devtools/version.rb +7 -0
  41. data/lib/hanami/devtools.rb +8 -0
  42. data/script/setup +36 -0
  43. metadata +266 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6b819306f2455421d0ee135fe9e402f4ad942c85107b1675fbd4b45cb8495a30
4
+ data.tar.gz: e1fd50d1cfc3f3be0097b5283a71a56d762a7f1118a0637ceb3ce079ef9a3557
5
+ SHA512:
6
+ metadata.gz: d01d8885c60495d028b09afc939e610db3bf1a1a00a377f925a542f1a4ed68807d8beded05bd08f9811541a39dc7df34cec5fb35b7a073ce88a53791bb565a9d
7
+ data.tar.gz: 192d367e36588f4be482b56c4c3aaa3839b3a9eec665f655e620877479a3ea4152d58b647e14c4d8d100452bbd9eb275df0c14165e991065abbdd2a56026f59b
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ Gemfile.lock
10
+ .rubocop-*
data/.rubocop.yml ADDED
@@ -0,0 +1,158 @@
1
+ # Please keep AllCops, Bundler, Layout, Style, Metrics groups and then order cops
2
+ # alphabetically
3
+ #
4
+ # References:
5
+ # * https://github.com/bbatsov/ruby-style-guide
6
+ # * https://rubocop.readthedocs.io/
7
+ #
8
+ # This configuration is for Hanami 2.x and Rubocop ~> 1.0
9
+ AllCops:
10
+ TargetRubyVersion: 3.0
11
+ DisplayCopNames: true
12
+ DisplayStyleGuide: true
13
+ ExtraDetails: false
14
+ SuggestExtensions: false
15
+ NewCops: enable
16
+ Exclude:
17
+ - "vendor/**/*"
18
+ - "vendor/**/.*" # See https://github.com/bbatsov/rubocop/issues/4832
19
+ Bundler/OrderedGems:
20
+ Enabled: false
21
+ Gemspec/DevelopmentDependencies:
22
+ Enabled: false
23
+ Gemspec/OrderedDependencies:
24
+ Enabled: false
25
+ Layout/FirstArrayElementIndentation:
26
+ EnforcedStyle: consistent
27
+ Layout/LineLength:
28
+ Max: 120
29
+ Exclude:
30
+ - "spec/**/*_spec.rb"
31
+ Layout/SpaceInLambdaLiteral:
32
+ Enabled: false
33
+ Layout/MultilineMethodCallIndentation:
34
+ Enabled: true
35
+ EnforcedStyle: indented
36
+ Layout/SpaceInsideHashLiteralBraces:
37
+ Enabled: true
38
+ EnforcedStyle: no_space
39
+ EnforcedStyleForEmptyBraces: no_space
40
+ Lint/AssignmentInCondition:
41
+ Enabled: false
42
+ Lint/ConstantDefinitionInBlock:
43
+ Enabled: false
44
+ Lint/EmptyClass:
45
+ Enabled: false
46
+ Lint/RaiseException:
47
+ Enabled: false
48
+ Lint/StructNewOverride:
49
+ Enabled: true
50
+ Metrics/AbcSize:
51
+ Max: 25
52
+ Metrics/CyclomaticComplexity:
53
+ Enabled: true
54
+ Max: 12
55
+ Metrics/MethodLength:
56
+ Enabled: false
57
+ Metrics/BlockLength:
58
+ Enabled: false
59
+ Metrics/ClassLength:
60
+ Enabled: false
61
+ Naming/FileName:
62
+ Enabled: false
63
+ Naming/HeredocDelimiterNaming:
64
+ Enabled: false
65
+ Naming/MemoizedInstanceVariableName:
66
+ Enabled: false
67
+ Naming/MethodName:
68
+ Enabled: false
69
+ Naming/MethodParameterName:
70
+ Enabled: false
71
+ Naming/PredicateName:
72
+ Enabled: false
73
+ Naming/RescuedExceptionsVariableName:
74
+ PreferredName: exception
75
+ Style/Alias:
76
+ Enabled: true
77
+ EnforcedStyle: prefer_alias_method
78
+ Style/AndOr:
79
+ Enabled: false
80
+ Style/AsciiComments:
81
+ Enabled: false
82
+ Style/BisectedAttrAccessor:
83
+ Enabled: false
84
+ Style/BlockDelimiters:
85
+ Enabled: false
86
+ Style/ClassAndModuleChildren:
87
+ Exclude:
88
+ - "spec/**/*_spec.rb"
89
+ Style/ConditionalAssignment:
90
+ Enabled: false
91
+ Style/DateTime:
92
+ Enabled: false
93
+ Style/Documentation:
94
+ Enabled: false
95
+ Style/DoubleNegation:
96
+ Enabled: false
97
+ Style/EachWithObject:
98
+ Enabled: false
99
+ Style/EmptyMethod:
100
+ Enabled: false
101
+ Style/ExpandPathArguments:
102
+ Enabled: false
103
+ Style/FormatString:
104
+ Enabled: false
105
+ Style/FrozenStringLiteralComment:
106
+ Enabled: true
107
+ Style/GuardClause:
108
+ Enabled: false
109
+ Style/HashConversion:
110
+ Enabled: false
111
+ Style/HashEachMethods:
112
+ Enabled: false
113
+ Style/HashTransformKeys:
114
+ Enabled: true
115
+ Style/HashTransformValues:
116
+ Enabled: true
117
+ Style/IfUnlessModifier:
118
+ Enabled: false
119
+ Style/Lambda:
120
+ Enabled: false
121
+ Style/LambdaCall:
122
+ Enabled: false
123
+ Style/MultilineBlockChain:
124
+ Enabled: false
125
+ Style/OptionalBooleanParameter:
126
+ Enabled: false
127
+ Style/ParallelAssignment:
128
+ Enabled: false
129
+ Style/RaiseArgs:
130
+ Enabled: false
131
+ Style/RedundantAssignment:
132
+ Enabled: true
133
+ Style/RedundantConstantBase:
134
+ Enabled: false
135
+ Style/RedundantFetchBlock:
136
+ Enabled: true
137
+ Style/RedundantRegexpCharacterClass:
138
+ Enabled: true
139
+ Style/RedundantRegexpEscape:
140
+ Enabled: true
141
+ Style/RegexpLiteral:
142
+ Enabled: false
143
+ Style/SlicingWithRange:
144
+ Enabled: true
145
+ Style/SpecialGlobalVars:
146
+ Enabled: false
147
+ Style/StringLiterals:
148
+ Enabled: true
149
+ EnforcedStyle: double_quotes
150
+ ConsistentQuotesInMultiline: false
151
+ Style/StringLiteralsInInterpolation:
152
+ Enabled: true
153
+ EnforcedStyle: single_quotes
154
+ Style/SymbolArray:
155
+ Exclude:
156
+ - "spec/**/*_spec.rb"
157
+ Style/TrailingUnderscoreVariable:
158
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Hanami::Devtools
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/hanami/devtools`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'hanami-devtools'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install hanami-devtools
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/hanami/devtools.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "hanami/devtools"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "hanami/devtools/version"
6
+
7
+ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
8
+ spec.name = "hanami-devtools"
9
+ spec.version = Hanami::Devtools::VERSION
10
+ spec.authors = ["Luca Guidi"]
11
+ spec.email = ["me@lucaguidi.com"]
12
+
13
+ spec.summary = "Development tools for Hanami"
14
+ spec.description = "Development tools for Hanami. This gem is designed for the Hanami core team."
15
+ spec.homepage = "http://hanamirb.org"
16
+ spec.license = "MIT"
17
+
18
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
19
+ spec.required_ruby_version = ">= 3.0"
20
+
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(test|spec|features)/})
27
+ end
28
+
29
+ spec.add_dependency "aruba", "~> 0.14"
30
+ spec.add_dependency "bundler", ">= 1.6", "< 3"
31
+ spec.add_dependency "dotenv", "~> 2.0"
32
+ spec.add_dependency "capybara", "~> 3.34"
33
+ spec.add_dependency "codecov", "~> 0.1"
34
+ spec.add_dependency "excon", "~> 0.60"
35
+ spec.add_dependency "poltergeist", "~> 1.17"
36
+ spec.add_dependency "rack", "~> 2.0"
37
+ spec.add_dependency "rspec", "~> 3.7"
38
+ spec.add_dependency "dry-core", ">= 0.9", "< 2"
39
+ spec.add_dependency "hanami-utils"
40
+
41
+ spec.add_development_dependency "rake", "~> 13.0"
42
+ end
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require "pathname"
5
+ require "hanami/devtools/integration/env"
6
+ require "hanami/devtools/integration/gemfile"
7
+ require "hanami/devtools/integration/silently"
8
+ require "hanami/devtools/integration/files"
9
+
10
+ module RSpec
11
+ module Support
12
+ # Support for Bundler
13
+ #
14
+ # @since 0.2.0
15
+ module Bundler
16
+ HANAMI_GEMS_PREFIX = "hanami-"
17
+ HANAMI_GEMS = %w[utils validations router controller view helpers mailer assets model webconsole].freeze
18
+
19
+ def self.root
20
+ @_root
21
+ end
22
+
23
+ def self.root=(value)
24
+ @_root = Pathname.new(value).realpath
25
+ end
26
+
27
+ self.root = Dir.pwd
28
+
29
+ def self.cache
30
+ root.join("vendor", "cache")
31
+ end
32
+
33
+ def self.setup
34
+ return unless setup?
35
+
36
+ with_clean_env do
37
+ RSpec::Support.silently(setup_script)
38
+ Gemfile.write_checksum
39
+ end
40
+ end
41
+
42
+ def self.setup?
43
+ return true if Platform.ci?
44
+
45
+ Gemfile.changed?
46
+ end
47
+
48
+ def self.setup_script
49
+ result = root.join("script", "setup")
50
+ return result.to_s if result.exist?
51
+
52
+ Pathname.new(__dir__).join("..", "..", "..", "..", "script", "setup").realpath.to_s
53
+ end
54
+
55
+ def self.with_clean_env(&blk)
56
+ ::Bundler.with_clean_env(&blk)
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :out, :err, :exitstatus
62
+
63
+ # rubocop:disable Metrics/MethodLength
64
+ # rubocop:disable Metrics/AbcSize
65
+ def setup_gemfile(gems: [], exclude_gems: [], path: "Gemfile")
66
+ @current_gemfile_path = RSpec::Support::Env["BUNDLE_GEMFILE"]
67
+ RSpec::Support::Env["BUNDLE_GEMFILE"] = ::File.join(Dir.pwd, path)
68
+
69
+ content = ::File.readlines(path)
70
+ content = inject_gemfile_sources(content, cache)
71
+
72
+ unless gems.empty?
73
+ gems = gems.map do |g|
74
+ case g
75
+ when String
76
+ "gem '#{g}'\n"
77
+ when Array
78
+ "gem '#{g.first}', #{g.last}\n"
79
+ end
80
+ end
81
+
82
+ content.concat(gems)
83
+ end
84
+
85
+ exclude_gems.each do |g|
86
+ content.reject! { |line| line.include?(g) }
87
+ end
88
+
89
+ rewrite(path, content)
90
+ end
91
+ # rubocop:enable Metrics/AbcSize
92
+ # rubocop:enable Metrics/MethodLength
93
+
94
+ def restore_gemfile
95
+ RSpec::Support::Env["BUNDLE_GEMFILE"] = @current_gemfile_path if defined?(@current_gemfile_path)
96
+ end
97
+
98
+ def bundle_install
99
+ bundle "install --local --no-cache --retry 0 --no-color"
100
+ end
101
+
102
+ def bundle_exec(cmd, env: nil, &blk)
103
+ bundle("exec #{cmd}", env: env, &blk)
104
+ end
105
+
106
+ def bundle(cmd, env: nil, &blk)
107
+ # ruby_bin = which("ruby")
108
+ bundle_bin = which("bundle")
109
+ hanami_env = "HANAMI_ENV=#{env} " unless env.nil?
110
+
111
+ # system_exec("#{hanami_env}#{ruby_bin} -I#{load_paths} #{bundle_bin} #{cmd}", &blk)
112
+ system_exec("#{hanami_env}#{bundle_bin} #{cmd}", &blk)
113
+ end
114
+
115
+ def inject_gemfile_sources(contents, vendor_cache_path)
116
+ sources = ["source 'file://#{vendor_cache_path}'\n"]
117
+ sources + contents[1..-1]
118
+ end
119
+
120
+ # Adapted from Bundler source code
121
+ #
122
+ # Bundler is released under MIT license
123
+ # https://github.com/bundler/bundler/blob/master/LICENSE.md
124
+ #
125
+ # A special "thank you" goes to Bundler maintainers and contributors.
126
+ #
127
+ # rubocop:disable Metrics/AbcSize
128
+ # rubocop:disable Metrics/MethodLength
129
+ def system_exec(cmd)
130
+ Open3.popen3(RSpec::Support::Env.env, cmd) do |stdin, stdout, stderr, wait_thr|
131
+ yield stdin, stdout, wait_thr if block_given?
132
+ stdin.close
133
+
134
+ @exitstatus = wait_thr&.value&.exitstatus
135
+ @out = Thread.new { stdout.read }.value.strip
136
+ @err = Thread.new { stderr.read }.value.strip
137
+ end
138
+
139
+ @all_output ||= ""
140
+ @all_output += [
141
+ "$ #{cmd.to_s.strip}",
142
+ out,
143
+ err,
144
+ @exitstatus ? "# $? => #{@exitstatus}" : "",
145
+ "\n"
146
+ ].reject(&:empty?).join("\n")
147
+
148
+ @out
149
+ end
150
+ # rubocop:enable Metrics/MethodLength
151
+ # rubocop:enable Metrics/AbcSize
152
+
153
+ def load_paths
154
+ [root.join("lib"), root.join("spec")].join(":")
155
+ end
156
+
157
+ def root
158
+ RSpec::Support::Bundler.root
159
+ end
160
+
161
+ def cache
162
+ RSpec::Support::Bundler.cache
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ RSpec.configure do |config|
169
+ config.include RSpec::Support::Bundler, type: :integration
170
+
171
+ config.before(:all, type: :integration) do
172
+ RSpec::Support::Bundler.setup
173
+ end
174
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "capybara"
4
+ require "capybara/rspec"
5
+ require "capybara/dsl"
6
+ require "hanami/devtools/integration/platform"
7
+ require "capybara/poltergeist"
8
+
9
+ RSpec.configure do |config|
10
+ config.include Capybara::DSL, type: :integration
11
+ end
12
+
13
+ Capybara.register_driver :poltergeist do |app|
14
+ Capybara::Poltergeist::Driver.new(app, {js_errors: false})
15
+ end
16
+
17
+ Capybara.configure do |config|
18
+ config.run_server = false
19
+ config.default_driver = :poltergeist
20
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "aruba"
4
+ require "aruba/api"
5
+ require "pathname"
6
+
7
+ module RSpec
8
+ module Support
9
+ # Run Command Line Interface (CLI) programs
10
+ #
11
+ # @since 0.2.0
12
+ module CLI
13
+ def self.included(spec)
14
+ spec.before do
15
+ aruba = Pathname.new(Dir.pwd).join("tmp", "aruba")
16
+ aruba.rmtree if aruba.exist?
17
+
18
+ setup_aruba
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def run_cmd(cmd, output = nil, exit_status: 0)
25
+ run_command_and_stop "bundle exec #{cmd}", fail_on_error: false
26
+
27
+ match_output(output)
28
+ expect(last_command_started).to have_exit_status(exit_status)
29
+ end
30
+
31
+ def run_cmd_with_clean_env(cmd, successful: true)
32
+ result = ::Bundler.clean_system(cmd, out: File::NULL)
33
+ expect(result).to be(successful)
34
+ end
35
+
36
+ def match_output(output)
37
+ case output
38
+ when String
39
+ expect(all_output).to include(output)
40
+ when Regexp
41
+ expect(all_output).to match(output)
42
+ when Array
43
+ output.each { |o| match_output(o) }
44
+ end
45
+ end
46
+
47
+ def all_output
48
+ all_commands.map(&:output).join("\n")
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ RSpec.configure do |config|
55
+ config.include Aruba::Api, type: :integration
56
+ config.include RSpec::Support::CLI, type: :integration
57
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpec
4
+ module Support
5
+ # Code coverage support
6
+ #
7
+ # @since 0.2.0
8
+ module Coverage
9
+ def self.configure!
10
+ return unless enabled?
11
+
12
+ require "simplecov"
13
+ require "coveralls"
14
+
15
+ configure_simplecov!
16
+ end
17
+
18
+ def self.cover_as!(suite_name)
19
+ return unless enabled?
20
+
21
+ SimpleCov.command_name(suite_name)
22
+ end
23
+
24
+ private_class_method
25
+
26
+ def self.ci?
27
+ !ENV["TRAVIS"].nil?
28
+ end
29
+
30
+ def self.enabled?
31
+ # !ENV['COVERAGE'].nil?
32
+ false
33
+ end
34
+
35
+ def self.configure_simplecov!
36
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter if ci?
37
+
38
+ SimpleCov.start do
39
+ add_filter "spec/"
40
+ add_filter "script/"
41
+ add_filter "tmp/"
42
+ add_filter "vendor/"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ RSpec::Support::Coverage.configure!
50
+
51
+ RSpec.configure do |config|
52
+ config.before do |example|
53
+ RSpec::Support::Coverage.cover_as!(example.file_path)
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "resolv-replace"
4
+
5
+ module RSpec
6
+ module Support
7
+ # DNS stub utilities
8
+ module Dns
9
+ private
10
+
11
+ def stub_dns_hosts(hosts)
12
+ file = Pathname.new(Dir.pwd).join("tmp", "hosts-#{SecureRandom.uuid}")
13
+ write(file, hosts)
14
+
15
+ hosts_resolver = Resolv::Hosts.new(file.to_s)
16
+ dns_resolver = Resolv::DNS.new
17
+
18
+ Resolv::DefaultResolver.replace_resolvers([hosts_resolver, dns_resolver])
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ RSpec.configure do |config|
25
+ config.include RSpec::Support::Dns, type: :integration
26
+ end