spring 0.0.11 → 0.9.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0824c6fabd2c8830c1a610f25821f746367cee6f
4
+ data.tar.gz: 108cf6e1bd07af03dfbfe9078727315eab78b39e
5
+ SHA512:
6
+ metadata.gz: c2ca57a02be596e85692d0b8e75f60bc28278f99d82bd5352e5f9ef283c49720b75cca34101061e897f692923d83e030d57da6796e90611c68c01dd3bf688813
7
+ data.tar.gz: ec4654a54e32ea00418c230ed1c159d6cc628309bb025292c109458140c5b6c41212106004c2b3c2546fc53b81027a3f70b3a58d8b1ad5d695afbad6c43c2f8b
@@ -1,3 +1,26 @@
1
+ ## 0.9.0
2
+
3
+ * Display spring version in the help message
4
+ * Remove workaround for Rubygems performance issue. This issue is solved
5
+ with Rubygems 2.1, so we no longer need to generate a "spring" binstub
6
+ file. We warn users if they are not taking advantage of the Rubygems
7
+ perf fix (e.g. if they are not on 2.1, or haven't run `gem pristine
8
+ --all`). To upgrade, delete your `bin/spring` and re-run `spring
9
+ binstub` for each of your binstubs.
10
+ * Binstubs now fall back to non-spring execution of a command if the
11
+ spring gem is not present. This might be useful for production
12
+ environments.
13
+ * The ENV will be replaced on each run to match the ENV which exists
14
+ when the spring command is actually run (rather than the ENV which
15
+ exists when spring first starts).
16
+ * Specifying the rails env after the rake command (e.g. `rake
17
+ RAILS_ENV=test db:migrate`) now works as expected.
18
+ * Provide an explicit way to set the environment to use when running
19
+ `rake` on its own.
20
+ * The `rspec` and `cucumber` commands are no longer shipped by default.
21
+ They've been moved to the `spring-commands-rspec` and
22
+ `spring-commands-cucumber` gems.
23
+
1
24
  ## 0.0.11
2
25
 
3
26
  * Added the `rails destroy` command.
data/README.md CHANGED
@@ -2,63 +2,42 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/jonleighton/spring.png?branch=master)](https://travis-ci.org/jonleighton/spring)
4
4
 
5
- Spring is a Rails application preloader. It's trying to solve the same
6
- problem as [spork](https://github.com/sporkrb/spork),
7
- [zeus](https://github.com/burke/zeus) and
8
- [commands](https://github.com/rails/commands).
5
+ Spring is a Rails application preloader. It speeds up development by
6
+ keeping your application running in the background so you don't need to
7
+ boot it every time you run a test, rake task or migration.
9
8
 
10
9
  ## Features
11
10
 
12
- Spring is most similar to Zeus, but it's implemented in pure Ruby, and
13
- is more tightly integrated with Rails (it makes use of Rails' built-in
14
- code reloader).
15
-
16
- Spring tries to be totally automatic.
17
- It boots up in the background the first time you run a
18
- command. Then it speeds up subsequent commands. If it detects that your
19
- pre-loaded environment has changed (maybe `config/application.rb` has
20
- been edited) then it will reload your environment in the background,
21
- ready for the next command. When you close your terminal session, Spring
22
- will automatically shut down. There's no "server" to manually start and
23
- stop.
24
-
25
- Spring operates via a command line interface. Other solutions (e.g.
26
- commands) take the approach of using a special console to run commands
27
- from. This means we will have to re-implement shell features such as
28
- history, completion, etc. Whilst it's not impossible to re-implement
29
- those features, it's unnecessary work and our re-implementation
30
- won't be as feature complete as a real shell. Using a real shell also
31
- prevents the user having to constantly jump between a terminal with a
32
- real shell and a terminal running the rails "commands console".
11
+ * Totally automatic; no need to explicitly start and stop the background process
12
+ * Reloads your application code on each run
13
+ * Restarts your application when configs / initializers / gem
14
+ dependencies are changed
33
15
 
34
16
  ## Compatibility
35
17
 
36
- Ruby versions supported:
18
+ * Ruby versions: MRI 1.9.3, MRI 2.0.0
19
+ * Rails versions: 3.2, 4.0
37
20
 
38
- * MRI 1.9.3
39
- * MRI 2.0.0
21
+ Spring makes extensive use of `Process#fork`, so won't be able to
22
+ provide a speed up on platforms which don't support forking (Windows, JRuby).
40
23
 
41
- Rails versions supported:
24
+ ## Walkthrough
42
25
 
43
- * 3.2
44
- * 4.0
26
+ Either `gem install spring` or add it to your Gemfile:
45
27
 
46
- Spring makes extensive use of `Process#fork`, so won't be able to run on
47
- any platform which doesn't support that (Windows, JRuby).
28
+ ``` ruby
29
+ group :development do
30
+ gem "spring"
31
+ end
32
+ ```
48
33
 
49
- ## Usage
34
+ Spring is designed to be used *without* bundle exec, so use `spring
35
+ [command]` rather than `bundle exec spring [command]`.
50
36
 
51
- Install the `spring` gem. You can add it to your Gemfile if you like but
52
- it's optional. You now have a `spring` command. Don't use it with
53
- `bundle exec` or it will be extremely slow.
37
+ For this walkthrough I've generated a new Rails application, and run
38
+ `rails generate scaffold posts name:string`.
54
39
 
55
- For this walkthrough, I'm using the test app in the Spring repository:
56
-
57
- ```
58
- cd /path/to/spring/test/apps/rails-3-2
59
- ```
60
-
61
- We can run a test:
40
+ Let's run a test:
62
41
 
63
42
  ```
64
43
  $ time spring testunit test/functional/posts_controller_test.rb
@@ -77,21 +56,18 @@ user 0m0.281s
77
56
  sys 0m0.066s
78
57
  ```
79
58
 
80
- That booted our app in the background:
59
+ That wasn't particularly fast because it was the first run, so spring
60
+ had to boot the application. It's now running:
81
61
 
82
62
  ```
83
63
  $ spring status
84
64
  Spring is running:
85
65
 
86
- 26150 spring server | rails-3-2 | started 3 secs ago
87
- 26155 spring app | rails-3-2 | started 3 secs ago | test mode
66
+ 26150 spring server | spring-demo-app | started 3 secs ago
67
+ 26155 spring app | spring-demo-app | started 3 secs ago | test mode
88
68
  ```
89
69
 
90
- We can see two processes, one is the Spring server, the other is the
91
- application running in the test environment. When we close the terminal,
92
- the processes will be killed automatically.
93
-
94
- Running the test is faster next time:
70
+ The next run is faster:
95
71
 
96
72
  ```
97
73
  $ time spring testunit test/functional/posts_controller_test.rb
@@ -110,79 +86,50 @@ user 0m0.276s
110
86
  sys 0m0.059s
111
87
  ```
112
88
 
113
- Running `spring testunit`, `spring rake`, `spring rails`, etc gets a bit
114
- tedious. It also suffers from a performance issue in Rubygems ([which I
115
- am actively working on](https://github.com/rubygems/rubygems/pull/435))
116
- which means the `spring` command takes a while to start up. The more
117
- gems you have, the longer it takes.
118
-
119
- Spring binstubs solve both of these problems. If you will be running the
120
- `testunit` command regularly, run:
89
+ Writing `spring` before every command gets a bit tedious. Spring binstubs solve this:
121
90
 
122
91
  ```
123
92
  $ spring binstub testunit
93
+ $ spring binstub rake
94
+ $ spring binstub rails
124
95
  ```
125
96
 
126
- This generates a `bin/spring` and a `bin/testunit`, which allows you to run
127
- `spring` and `spring testunit` in a way that doesn't trigger the Rubygems
128
- performance bug:
129
-
130
- ```
131
- $ time bin/testunit test/functional/posts_controller_test.rb
132
- Run options:
133
-
134
- # Running tests:
135
-
136
- .......
137
-
138
- Finished tests in 0.166585s, 42.0207 tests/s, 60.0296 assertions/s.
97
+ This will generate `bin/testunit`, `bin/rake` and `bin/rails`. They
98
+ replace any binstubs that you might already have in your `bin/`
99
+ directory. Check them in to source control.
139
100
 
140
- 7 tests, 10 assertions, 0 failures, 0 errors, 0 skips
141
-
142
- real 0m0.407s
143
- user 0m0.077s
144
- sys 0m0.059s
145
- ```
146
-
147
- You can add "./bin" to your `PATH` when in your application's directory
148
- [with direnv](https://github.com/zimbatm/direnv), but you should
149
- recognise and understand the security implications of using that.
101
+ If you don't want to prefix every command you type with `bin/`, you
102
+ can [use direnv](https://github.com/zimbatm/direnv) to automatically add
103
+ `./bin` to your `PATH` when you `cd` into your application.
150
104
 
151
- Note: Don't use spring binstubs with `bundle install --binstubs`. If
152
- you do this, spring and bundler will overwrite each other. If _you will_
153
- not be using a command with spring, use `bundle binstub [GEM]` to
154
- generate a bundler binstub for that specific gem. If you _will_ be
155
- using a command with spring, generate a spring binstub _instead of_ a
156
- bundler binstub; spring will run your command inside the bundle anyway.
105
+ If we edit any of the application files, or test files, the changes will
106
+ be picked up on the next run without the background process having to
107
+ restart. This works in exactly the same way as the code reloading
108
+ which allows you to refresh your browser and instantly see changes during
109
+ development.
157
110
 
158
- If we edit any of the application files, or test files, the change will
159
- be picked up on the next run, without the background process
160
- having to be restarted.
111
+ But if we edit any of the files which were used to start the application
112
+ (configs, initializers, your gemfile), the application needs to be fully
113
+ restarted. This happens automatically.
161
114
 
162
- If we edit any of the preloaded files, the application needs to restart
163
- automatically. Let's "edit" `config/application.rb`:
115
+ Let's "edit" `config/application.rb`:
164
116
 
165
117
  ```
166
118
  $ touch config/application.rb
167
119
  $ spring status
168
120
  Spring is running:
169
121
 
170
- 26150 spring server | rails-3-2 | started 36 secs ago
171
- 26556 spring app | rails-3-2 | started 1 sec ago | test mode
122
+ 26150 spring server | spring-demo-app | started 36 secs ago
123
+ 26556 spring app | spring-demo-app | started 1 sec ago | test mode
172
124
  ```
173
125
 
174
- The application process detected the change and exited. The server process
175
- then detected that the application process exited, so it started a new application.
176
- All of this happened automatically. Next time we run a
177
- command we'll be running against a fresh application. We can see that
178
- the start time and PID of the app process has changed.
126
+ The application detected that `config/application.rb` changed and
127
+ automatically restarted itself.
179
128
 
180
- If we run a command that uses a different environment, then it gets
181
- booted up. For example, the `rake` command uses the `development`
182
- environment by default:
129
+ If we run a command that uses a different environment, then that
130
+ environment gets booted up:
183
131
 
184
132
  ```
185
- $ spring binstub rake
186
133
  $ bin/rake routes
187
134
  posts GET /posts(.:format) posts#index
188
135
  POST /posts(.:format) posts#create
@@ -191,24 +138,21 @@ edit_post GET /posts/:id/edit(.:format) posts#edit
191
138
  post GET /posts/:id(.:format) posts#show
192
139
  PUT /posts/:id(.:format) posts#update
193
140
  DELETE /posts/:id(.:format) posts#destroy
194
- ```
195
141
 
196
- We now have 3 processes: the server, and application in test mode and
197
- the application in development mode.
198
-
199
- ```
200
- $ bin/spring status
142
+ $ spring status
201
143
  Spring is running:
202
144
 
203
- 26150 spring server | rails-3-2 | started 1 min ago
204
- 26556 spring app | rails-3-2 | started 42 secs ago | test mode
205
- 26707 spring app | rails-3-2 | started 2 secs ago | development mode
145
+ 26150 spring server | spring-demo-app | started 1 min ago
146
+ 26556 spring app | spring-demo-app | started 42 secs ago | test mode
147
+ 26707 spring app | spring-demo-app | started 2 secs ago | development mode
206
148
  ```
207
149
 
208
- To stop the background processes:
150
+ There's no need to "shut down" spring. This will happen automatically
151
+ when you close your terminal. However if you do want to do a manual shut
152
+ down, use the `stop` command:
209
153
 
210
154
  ```
211
- $ bin/spring stop
155
+ $ spring stop
212
156
  Spring stopped.
213
157
  ```
214
158
 
@@ -217,13 +161,13 @@ Spring stopped.
217
161
  The following commands are shipped by default.
218
162
 
219
163
  Custom commands can be specified in the Spring config file. See
220
- [`lib/spring/commands.rb`](https://github.com/jonleighton/spring/blob/master/lib/spring/commands.rb)
164
+ [`lib/spring/commands/`](https://github.com/jonleighton/spring/blob/master/lib/spring/commands/)
221
165
  for examples.
222
166
 
223
- A bunch of different test frameworks are supported at the moment in
224
- order to make it easy for people to try spring. However in the future
225
- the code to use a specific test framework should not be contained in the
226
- spring repository.
167
+ You can also install the following gems for additional commands:
168
+
169
+ * [spring-commands-rspec](https://github.com/jonleighton/spring-commands-rspec)
170
+ * [spring-commands-cucumber](https://github.com/jonleighton/spring-commands-cucumber)
227
171
 
228
172
  ### `testunit`
229
173
 
@@ -235,17 +179,6 @@ This command can also recursively run a directory of tests. For example,
235
179
  If your test helper file takes a while to load, consider preloading it
236
180
  (see "Running code before forking" below).
237
181
 
238
- ### `rspec`
239
-
240
- Runs an rspec spec, exactly the same as the `rspec` executable.
241
-
242
- If your spec helper file takes a while to load, consider preloading it
243
- (see "Running code before forking" below).
244
-
245
- ### `cucumber`
246
-
247
- Runs a cucumber feature.
248
-
249
182
  ### `rake`
250
183
 
251
184
  Runs a rake task. Rake tasks run in the `development` environment by
@@ -258,6 +191,9 @@ environment, you'd do it like this:
258
191
  ``` ruby
259
192
  Spring::Commands::Rake.environment_matchers["perf_test"] = "test"
260
193
  Spring::Commands::Rake.environment_matchers[/^perf/] = "test"
194
+
195
+ # To change the environment when you run `rake` with no arguments
196
+ Spring::Commands::Rake.environment_matchers[:default] = "development"
261
197
  ```
262
198
 
263
199
  ### `rails console`, `rails generate`, `rails runner`
data/bin/spring CHANGED
@@ -1,9 +1,31 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if Process.respond_to?(:fork)
4
- $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
5
- require 'spring/client'
6
- Spring::Client.run(ARGV)
7
- else
8
- exec "bundle", "exec", *ARGV
3
+ if defined?(Gem)
4
+ if Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.1.0")
5
+ warn "Warning: You're using Rubygems #{Gem::VERSION} with Spring. " \
6
+ "Upgrade to at least Rubygems 2.1.0 and run `gem pristine --all` for better " \
7
+ "startup performance."
8
+ else
9
+ stubs = Gem::Specification.stubs.grep(Gem::StubSpecification)
10
+
11
+ # stubbed? method added in https://github.com/rubygems/rubygems/pull/694
12
+ if Gem::Specification.stubs.first.respond_to?(:stubbed?)
13
+ unstubbed = stubs.reject(&:stubbed?)
14
+ else
15
+ unstubbed = stubs.reject { |s| s.send(:data).is_a?(Gem::StubSpecification::StubLine) }
16
+ end
17
+
18
+ # `gem pristine --all` ignores default gems. it doesn't really matter,
19
+ # as there are probably not many of them on the system.
20
+ unstubbed.reject!(&:default_gem?)
21
+
22
+ if unstubbed.any?
23
+ warn "Warning: Running `gem pristine --all` to regenerate your installed gemspecs " \
24
+ "will improve the startup performance of Spring."
25
+ end
26
+ end
9
27
  end
28
+
29
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
30
+ require 'spring/client'
31
+ Spring::Client.run(ARGV)
@@ -98,8 +98,8 @@ module Spring
98
98
 
99
99
  preload unless preloaded?
100
100
 
101
- args = JSON.load(client.read(client.gets.to_i))
102
- command = Spring.command(args.shift)
101
+ args, env = JSON.load(client.read(client.gets.to_i)).values_at("args", "env")
102
+ command = Spring.command(args.shift)
103
103
 
104
104
  connect_database
105
105
  setup command
@@ -112,8 +112,10 @@ module Spring
112
112
  STDIN.reopen(streams.last)
113
113
  IGNORE_SIGNALS.each { |sig| trap(sig, "DEFAULT") }
114
114
 
115
- connect_database
116
115
  ARGV.replace(args)
116
+ ENV.replace(env)
117
+
118
+ connect_database
117
119
  srand
118
120
 
119
121
  invoke_after_fork_callbacks
@@ -1,7 +1,7 @@
1
1
  module Spring
2
2
  module Client
3
3
  class Binstub < Command
4
- attr_reader :bindir, :name
4
+ attr_reader :bindir, :name, :command
5
5
 
6
6
  def self.description
7
7
  "Generate spring based binstubs."
@@ -15,61 +15,52 @@ module Spring
15
15
  def initialize(args)
16
16
  super
17
17
 
18
- @bindir = env.root.join("bin")
19
- @name = args[1]
18
+ @bindir = env.root.join("bin")
19
+ @name = args[1]
20
+ @command = Spring.commands[name]
20
21
  end
21
22
 
22
23
  def call
23
- if Spring.command?(name) || name == "rails"
24
+ if command || name == "rails"
24
25
  bindir.mkdir unless bindir.exist?
25
- generate_spring_binstub
26
- generate_command_binstub
26
+ generate_binstub
27
27
  else
28
28
  $stderr.puts "The '#{name}' command is not known to spring."
29
29
  exit 1
30
30
  end
31
31
  end
32
32
 
33
- def spring_binstub
34
- bindir.join("spring")
35
- end
36
-
37
- def command_binstub
33
+ def binstub
38
34
  bindir.join(name)
39
35
  end
40
36
 
41
- def generate_spring_binstub
42
- File.write(spring_binstub, <<'CODE')
37
+ def generate_binstub
38
+ File.write(binstub, <<CODE)
43
39
  #!/usr/bin/env ruby
44
40
 
45
- # This is a special way of invoking the spring gem in order to
46
- # work around the performance issue discussed in
47
- # https://github.com/rubygems/rubygems/pull/435
48
-
49
- glob = "{#{Gem::Specification.dirs.join(",")}}/spring-*.gemspec"
50
- candidates = Dir[glob].to_a.sort_by { |c| Gem::Version.new(File.basename(c).split(/[-\.]/)[1...-1].join(".")) }
51
-
52
- spec = Gem::Specification.load(candidates.last)
53
-
54
- if spec
55
- spec.activate
56
- load spec.bin_file("spring")
41
+ if !Process.respond_to?(:fork) || Gem::Specification.find_all_by_name("spring").empty?
42
+ #{fallback.strip.gsub(/^/, " ")}
57
43
  else
58
- $stderr.puts "Could not find spring gem in #{Gem::Specification.dirs.join(", ")}."
59
- exit 1
44
+ ARGV.unshift "#{name}"
45
+ load Gem.bin_path("spring", "spring")
60
46
  end
61
47
  CODE
62
48
 
63
- spring_binstub.chmod 0755
49
+ binstub.chmod 0755
64
50
  end
65
51
 
66
- def generate_command_binstub
67
- File.write(command_binstub, <<CODE)
68
- #!/usr/bin/env bash
69
- exec $(dirname $0)/spring #{name} "$@"
52
+ def fallback
53
+ if command.respond_to?(:fallback)
54
+ command.fallback
55
+ elsif name == "rails"
56
+ <<CODE
57
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
58
+ require_relative '../config/boot'
59
+ require 'rails/commands'
70
60
  CODE
71
-
72
- command_binstub.chmod 0755
61
+ else
62
+ %{exec "bundle", "exec", "#{name}", *ARGV}
63
+ end
73
64
  end
74
65
  end
75
66
  end
@@ -28,7 +28,8 @@ module Spring
28
28
  end
29
29
 
30
30
  def formatted_help
31
- ["Usage: spring COMMAND [ARGS]\n",
31
+ ["Version: #{env.version}\n",
32
+ "Usage: spring COMMAND [ARGS]\n",
32
33
  *command_help("spring itself", spring_commands),
33
34
  '',
34
35
  *command_help("your application", application_commands)].join("\n")
@@ -69,7 +69,7 @@ ERROR
69
69
  application.send_io STDERR
70
70
  application.send_io STDIN
71
71
 
72
- send_json application, args
72
+ send_json application, "args" => args, "env" => ENV.to_hash
73
73
 
74
74
  pid = server.gets
75
75
  pid = pid.chomp if pid
@@ -22,8 +22,6 @@ module Spring
22
22
  require "spring/commands/rails"
23
23
  require "spring/commands/rake"
24
24
  require "spring/commands/testunit"
25
- require "spring/commands/rspec"
26
- require "spring/commands/cucumber"
27
25
 
28
26
  # If the config/spring.rb contains requires for commands from other gems,
29
27
  # then we need to be under bundler.
@@ -6,13 +6,21 @@ module Spring
6
6
  end
7
7
 
8
8
  self.environment_matchers = {
9
+ :default => "test",
9
10
  /^(test|spec|cucumber)($|:)/ => "test"
10
11
  }
11
12
 
12
13
  def env(args)
14
+ # This is an adaption of the matching that Rake itself does.
15
+ # See: https://github.com/jimweirich/rake/blob/3754a7639b3f42c2347857a0878beb3523542aee/lib/rake/application.rb#L691-L692
16
+ if env = args.grep(/^(RAILS|RACK)_ENV=(.*)$/m).last
17
+ return env.split("=").last
18
+ end
19
+
13
20
  self.class.environment_matchers.each do |matcher, environment|
14
- return environment if matcher === args.first
21
+ return environment if matcher === (args.first || :default)
15
22
  end
23
+
16
24
  nil
17
25
  end
18
26
 
@@ -25,6 +25,10 @@ module Spring
25
25
  def description
26
26
  "Execute a Test::Unit test."
27
27
  end
28
+
29
+ def fallback
30
+ %{exec "bundle", "exec", "ruby", "-Itest", *ARGV}
31
+ end
28
32
  end
29
33
 
30
34
  Spring.register_command "testunit", TestUnit.new
@@ -53,7 +53,7 @@ require 'stringio'
53
53
  # http://golang.org/src/pkg/utf8/utf8.go
54
54
  module Spring
55
55
  module OkJson
56
- Upstream = '42'
56
+ Upstream = '43'
57
57
  extend self
58
58
 
59
59
 
@@ -486,11 +486,16 @@ private
486
486
  # In ruby >= 1.9, s[r] is a codepoint, not a byte.
487
487
  if rubydoesenc?
488
488
  begin
489
- c.ord # will raise an error if c is invalid UTF-8
489
+ # c.ord will raise an error if c is invalid UTF-8
490
+ if c.ord < Spc.ord
491
+ c = "\\u%04x" % [c.ord]
492
+ end
490
493
  t.write(c)
491
494
  rescue
492
495
  t.write(Ustrerr)
493
496
  end
497
+ elsif c < Spc
498
+ t.write("\\u%04x" % c)
494
499
  elsif Spc <= c && c <= ?~
495
500
  t.putc(c)
496
501
  else
@@ -1,3 +1,3 @@
1
1
  module Spring
2
- VERSION = "0.0.11"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -179,8 +179,10 @@ class AppTest < ActiveSupport::TestCase
179
179
 
180
180
  def generate_app
181
181
  Bundler.with_clean_env do
182
+ # Sporadic SSL errors keep causing test failures so there are anti-SSL workarounds here
183
+
182
184
  assert system("(gem list rails --installed --version '#{rails_version}' || " \
183
- "gem install rails --version '#{rails_version}') > /dev/null")
185
+ "gem install rails --clear-sources --source http://rubygems.org --version '#{rails_version}') > /dev/null")
184
186
 
185
187
  # Have to shell out otherwise bundler prevents us finding the gem
186
188
  version = `ruby -e 'puts Gem::Specification.find_by_name("rails", "#{rails_version}").version'`.chomp
@@ -190,6 +192,11 @@ class AppTest < ActiveSupport::TestCase
190
192
  FileUtils.mkdir_p(gem_home)
191
193
  FileUtils.mkdir_p(user_home)
192
194
  FileUtils.rm_rf("#{app_root}/test/performance/")
195
+
196
+ File.write(
197
+ "#{app_root}/Gemfile",
198
+ File.read("#{app_root}/Gemfile").sub("https://rubygems.org", "http://rubygems.org")
199
+ )
193
200
  end
194
201
  end
195
202
 
@@ -198,7 +205,7 @@ class AppTest < ActiveSupport::TestCase
198
205
 
199
206
  assert system("gem build spring.gemspec 2>/dev/null 1>/dev/null")
200
207
 
201
- assert_success "gem install ../../../spring-#{Spring::VERSION}.gem"
208
+ assert_success ["gem install ../../../spring-#{Spring::VERSION}.gem", timeout: nil]
202
209
  assert_success ["(gem list bundler | grep bundler) || gem install bundler", timeout: nil]
203
210
  assert_success ["bundle check || bundle update", timeout: nil]
204
211
 
@@ -367,7 +374,7 @@ class AppTest < ActiveSupport::TestCase
367
374
 
368
375
  app_run "#{spring} binstub rake"
369
376
  app_run "#{spring} binstub rails"
370
- assert_success "bin/spring help"
377
+
371
378
  assert_success "bin/rake -T", stdout: "rake db:migrate"
372
379
  assert_success "bin/rails runner 'puts %(omg)'", stdout: "omg"
373
380
  assert_success "bin/rails server --help", stdout: "Usage: rails server"
@@ -423,6 +430,28 @@ class AppTest < ActiveSupport::TestCase
423
430
  assert_success "#{spring} rake -p 'Rails.env'", stdout: "production"
424
431
  end
425
432
 
433
+ test "setting env vars with rake" do
434
+ begin
435
+ File.write("#{app_root}/lib/tasks/env.rake", <<-'CODE')
436
+ task :print_rails_env => :environment do
437
+ puts Rails.env
438
+ end
439
+
440
+ task :print_env do
441
+ ENV.each { |k, v| puts "#{k}=#{v}" }
442
+ end
443
+
444
+ task(:default).clear.enhance [:print_rails_env]
445
+ CODE
446
+
447
+ assert_success "#{spring} rake RAILS_ENV=test print_rails_env", stdout: "test"
448
+ assert_success "#{spring} rake FOO=bar print_env", stdout: "FOO=bar"
449
+ assert_success "#{spring} rake", stdout: "test"
450
+ ensure
451
+ FileUtils.rm_f("#{app_root}/lib/tasks/env.rake")
452
+ end
453
+ end
454
+
426
455
  test "changing the Gemfile restarts the server" do
427
456
  begin
428
457
  gemfile = app_root.join("Gemfile")
@@ -440,4 +469,17 @@ class AppTest < ActiveSupport::TestCase
440
469
  assert_success "bundle check"
441
470
  end
442
471
  end
472
+
473
+ test "changing the environment between runs" do
474
+ env["OMG"] = "1"
475
+ env["FOO"] = "1"
476
+
477
+ assert_success %(#{spring} rails runner 'p ENV["OMG"]'), stdout: "1"
478
+
479
+ env["OMG"] = "2"
480
+ env.delete "FOO"
481
+
482
+ assert_success %(#{spring} rails runner 'p ENV["OMG"]'), stdout: "2"
483
+ assert_success %(#{spring} rails runner 'p ENV.key?("FOO")'), stdout: "false"
484
+ end
443
485
  end
@@ -41,6 +41,8 @@ class HelpTest < ActiveSupport::TestCase
41
41
 
42
42
  test "formatted_help generates expected output" do
43
43
  expected_output = <<-EOF
44
+ Version: #{Spring::VERSION}
45
+
44
46
  Usage: spring COMMAND [ARGS]
45
47
 
46
48
  Commands for spring itself:
@@ -127,12 +127,14 @@ module WatcherTests
127
127
  watcher.add file
128
128
  watcher.start
129
129
 
130
+ io = watcher.to_io
131
+
130
132
  Thread.new {
131
133
  sleep LATENCY * 3
132
134
  touch file, Time.now
133
135
  }
134
136
 
135
- assert IO.select([watcher], [], [], 1), "IO.select timed out before watcher was readable"
137
+ assert IO.select([io], [], [], 1), "IO.select timed out before watcher was readable"
136
138
  assert watcher.stale?
137
139
  end
138
140
 
metadata CHANGED
@@ -1,46 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
5
- prerelease:
4
+ version: 0.9.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jon Leighton
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-09 00:00:00.000000000 Z
11
+ date: 2013-10-27 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  description: Rails application preloader
@@ -70,10 +65,8 @@ files:
70
65
  - lib/spring/client/status.rb
71
66
  - lib/spring/client/stop.rb
72
67
  - lib/spring/commands.rb
73
- - lib/spring/commands/cucumber.rb
74
68
  - lib/spring/commands/rails.rb
75
69
  - lib/spring/commands/rake.rb
76
- - lib/spring/commands/rspec.rb
77
70
  - lib/spring/commands/testunit.rb
78
71
  - lib/spring/configuration.rb
79
72
  - lib/spring/env.rb
@@ -97,27 +90,26 @@ files:
97
90
  - test/unit/watcher_test.rb
98
91
  homepage: http://github.com/jonleighton/spring
99
92
  licenses: []
93
+ metadata: {}
100
94
  post_install_message:
101
95
  rdoc_options: []
102
96
  require_paths:
103
97
  - lib
104
98
  required_ruby_version: !ruby/object:Gem::Requirement
105
- none: false
106
99
  requirements:
107
- - - ! '>='
100
+ - - '>='
108
101
  - !ruby/object:Gem::Version
109
102
  version: '0'
110
103
  required_rubygems_version: !ruby/object:Gem::Requirement
111
- none: false
112
104
  requirements:
113
- - - ! '>='
105
+ - - '>='
114
106
  - !ruby/object:Gem::Version
115
107
  version: '0'
116
108
  requirements: []
117
109
  rubyforge_project:
118
- rubygems_version: 1.8.24
110
+ rubygems_version: 2.1.9
119
111
  signing_key:
120
- specification_version: 3
112
+ specification_version: 4
121
113
  summary: Rails application preloader
122
114
  test_files:
123
115
  - test/acceptance/app_test.rb
@@ -127,3 +119,4 @@ test_files:
127
119
  - test/unit/commands_test.rb
128
120
  - test/unit/process_title_updater_test.rb
129
121
  - test/unit/watcher_test.rb
122
+ has_rdoc:
@@ -1,15 +0,0 @@
1
- module Spring
2
- module Commands
3
- class Cucumber
4
- def env(*)
5
- "test"
6
- end
7
-
8
- def exec_name
9
- "cucumber"
10
- end
11
- end
12
-
13
- Spring.register_command "cucumber", Cucumber.new
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- module Spring
2
- module Commands
3
- class RSpec
4
- def env(*)
5
- "test"
6
- end
7
-
8
- def exec_name
9
- "rspec"
10
- end
11
- end
12
-
13
- Spring.register_command "rspec", RSpec.new
14
- end
15
- end