Class: Spring::Test::Application
- Inherits:
-
Object
- Object
- Spring::Test::Application
- Defined in:
- lib/spring/test/application.rb
Constant Summary collapse
- DEFAULT_TIMEOUT =
ENV['CI'] ? 30 : 10
Instance Attribute Summary collapse
-
#root ⇒ Object
readonly
Returns the value of attribute root.
-
#spring_env ⇒ Object
readonly
Returns the value of attribute spring_env.
Instance Method Summary collapse
- #application_config ⇒ Object
- #await_reload ⇒ Object
- #bundle ⇒ Object
- #controller ⇒ Object
- #debug(artifacts) ⇒ Object
- #dump_streams(command, streams) ⇒ Object
- #env ⇒ Object
- #exists? ⇒ Boolean
- #first_time ⇒ Object
- #gem_home ⇒ Object
- #gemfile ⇒ Object
-
#initialize(root) ⇒ Application
constructor
A new instance of Application.
- #last_time ⇒ Object
- #log_file ⇒ Object
- #path(addition) ⇒ Object
- #rails_version ⇒ Object
- #read_stream(stream) ⇒ Object
- #read_streams ⇒ Object
- #run(command, opts = {}) ⇒ Object
- #run!(command, options = {}) ⇒ Object
- #spring ⇒ Object
- #spring_config ⇒ Object
- #spring_test_command ⇒ Object
- #stderr ⇒ Object
- #stdout ⇒ Object
- #stop_spring ⇒ Object
- #test ⇒ Object
- #timing_ratio ⇒ Object
- #user_home ⇒ Object
- #with_timing ⇒ Object
Constructor Details
Instance Attribute Details
#root ⇒ Object (readonly)
Returns the value of attribute root.
8 9 10 |
# File 'lib/spring/test/application.rb', line 8 def root @root end |
#spring_env ⇒ Object (readonly)
Returns the value of attribute spring_env.
8 9 10 |
# File 'lib/spring/test/application.rb', line 8 def spring_env @spring_env end |
Instance Method Details
#application_config ⇒ Object
83 84 85 |
# File 'lib/spring/test/application.rb', line 83 def application_config path "config/application.rb" end |
#await_reload ⇒ Object
178 179 180 181 182 183 184 |
# File 'lib/spring/test/application.rb', line 178 def await_reload raise "no pid" if @application_pids.nil? || @application_pids.empty? Timeout.timeout(DEFAULT_TIMEOUT) do sleep 0.1 while @application_pids.any? { |p| process_alive?(p) } end end |
#bundle ⇒ Object
202 203 204 205 |
# File 'lib/spring/test/application.rb', line 202 def bundle run! "(gem list bundler | grep bundler) || gem install bundler", timeout: nil, retry: 2 run! "bundle check || bundle update --retry=2", timeout: nil end |
#controller ⇒ Object
79 80 81 |
# File 'lib/spring/test/application.rb', line 79 def controller path "app/controllers/posts_controller.rb" end |
#debug(artifacts) ⇒ Object
172 173 174 175 176 |
# File 'lib/spring/test/application.rb', line 172 def debug(artifacts) artifacts = artifacts.dup artifacts.delete :status dump_streams(artifacts.delete(:command), artifacts) end |
#dump_streams(command, streams) ⇒ Object
158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/spring/test/application.rb', line 158 def dump_streams(command, streams) output = "$ #{command}\n" streams.each do |name, stream| unless stream.chomp.empty? output << "--- #{name} ---\n" output << "#{stream.chomp}\n" end end output << "\n" output end |
#env ⇒ Object
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/spring/test/application.rb', line 31 def env @env ||= { "GEM_HOME" => gem_home.to_s, "GEM_PATH" => gem_home.to_s, "HOME" => user_home.to_s, "RAILS_ENV" => nil, "RACK_ENV" => nil, "SPRING_LOG" => log_file.path } end |
#exists? ⇒ Boolean
15 16 17 |
# File 'lib/spring/test/application.rb', line 15 def exists? root.exist? end |
#first_time ⇒ Object
134 135 136 |
# File 'lib/spring/test/application.rb', line 134 def first_time @times.first end |
#gem_home ⇒ Object
50 51 52 |
# File 'lib/spring/test/application.rb', line 50 def gem_home path "vendor/gems/#{RUBY_VERSION}" end |
#gemfile ⇒ Object
46 47 48 |
# File 'lib/spring/test/application.rb', line 46 def gemfile path "Gemfile" end |
#last_time ⇒ Object
130 131 132 |
# File 'lib/spring/test/application.rb', line 130 def last_time @times.last end |
#log_file ⇒ Object
27 28 29 |
# File 'lib/spring/test/application.rb', line 27 def log_file @log_file ||= path("tmp/spring.log").open("w+") end |
#path(addition) ⇒ Object
42 43 44 |
# File 'lib/spring/test/application.rb', line 42 def path(addition) root.join addition end |
#rails_version ⇒ Object
62 63 64 |
# File 'lib/spring/test/application.rb', line 62 def rails_version @rails_version ||= RailsVersion.new(gemfile.read.match(/gem 'rails', '(.*)'/)[1]) end |
#read_stream(stream) ⇒ Object
150 151 152 153 154 155 156 |
# File 'lib/spring/test/application.rb', line 150 def read_stream(stream) output = "" while IO.select([stream], [], [], 0.5) && !stream.eof? output << stream.readpartial(10240) end output end |
#read_streams ⇒ Object
142 143 144 145 146 147 148 |
# File 'lib/spring/test/application.rb', line 142 def read_streams { stdout: read_stream(stdout.first), stderr: read_stream(stderr.first), log: read_stream(log_file) } end |
#run(command, opts = {}) ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/spring/test/application.rb', line 91 def run(command, opts = {}) start_time = Time.now Bundler.with_clean_env do Process.spawn( env, command.to_s, out: stdout.last, err: stderr.last, in: :close, chdir: root.to_s, ) end _, status = Timeout.timeout(opts.fetch(:timeout, DEFAULT_TIMEOUT)) { Process.wait2 } if pid = spring_env.pid @server_pid = pid lines = `ps -A -o ppid= -o pid= | egrep '^\\s*#{@server_pid}'`.lines @application_pids = lines.map { |l| l.split.last.to_i } end output = read_streams puts dump_streams(command, output) if ENV["SPRING_DEBUG"] @times << (Time.now - start_time) if @times output.merge(status: status, command: command) rescue Timeout::Error => e raise e, "Output:\n\n#{dump_streams(command, read_streams)}" end |
#run!(command, options = {}) ⇒ Object
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/spring/test/application.rb', line 186 def run!(command, = {}) attempts = (.delete(:retry) || 0) + 1 artifacts = nil until attempts == 0 || artifacts && artifacts[:status].success? artifacts = run(command, ) attempts -= 1 end if artifacts[:status].success? artifacts else raise "command failed\n\n#{debug(artifacts)}" end end |
#spring ⇒ Object
58 59 60 |
# File 'lib/spring/test/application.rb', line 58 def spring gem_home.join "bin/spring" end |
#spring_config ⇒ Object
87 88 89 |
# File 'lib/spring/test/application.rb', line 87 def spring_config path "config/spring.rb" end |
#spring_test_command ⇒ Object
66 67 68 |
# File 'lib/spring/test/application.rb', line 66 def spring_test_command "#{rails_version.test_command} #{test}" end |
#stderr ⇒ Object
23 24 25 |
# File 'lib/spring/test/application.rb', line 23 def stderr @stderr ||= IO.pipe end |
#stdout ⇒ Object
19 20 21 |
# File 'lib/spring/test/application.rb', line 19 def stdout @stdout ||= IO.pipe end |
#stop_spring ⇒ Object
70 71 72 73 |
# File 'lib/spring/test/application.rb', line 70 def stop_spring run "#{spring} stop" rescue Errno::ENOENT end |
#test ⇒ Object
75 76 77 |
# File 'lib/spring/test/application.rb', line 75 def test path "test/#{rails_version.controller_tests_dir}/posts_controller_test.rb" end |
#timing_ratio ⇒ Object
138 139 140 |
# File 'lib/spring/test/application.rb', line 138 def timing_ratio last_time / first_time end |
#user_home ⇒ Object
54 55 56 |
# File 'lib/spring/test/application.rb', line 54 def user_home path "user_home" end |
#with_timing ⇒ Object
123 124 125 126 127 128 |
# File 'lib/spring/test/application.rb', line 123 def with_timing @times = [] yield ensure @times = nil end |