oop_rails_server 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +5 -0
- data/lib/oop_rails_server/gemfile.rb +89 -0
- data/lib/oop_rails_server/helpers.rb +10 -5
- data/lib/oop_rails_server/rails_server.rb +92 -54
- data/lib/oop_rails_server/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f07bd13a4e1384b5c4aaead8af1b980892fa6de8
|
4
|
+
data.tar.gz: 2d8a3a3a3af8fd99a6247bafcf9d4af731a1c583
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96d680a1199a5aa1eb124e1ea2bbc2efbec0c7ccd85a0e76f6e10d79ec4c1fb2a3f32f0e4a769eb96274700fe4a8040a0052c48d01b364bdb716e27737f0eb61
|
7
|
+
data.tar.gz: f9302281fcb1216edaf939e2dab8c6341f468f0272130ab1c9817ec5c5e8c2ad7e32055a5fccb3083be0a92fe9e6c956f2e1ba273d1522c2ef79b5072a995a0d
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# `oop_rails_server` Releases
|
2
2
|
|
3
|
+
## 0.0.19, 20 September 2016
|
4
|
+
|
5
|
+
* Significant internal refactor to how Gemfiles get modified that's much more reliable; changes
|
6
|
+
`:additional_gemfile_lines` into `:gemfile_modifier`, and from an array of `String`s to a `Proc`.
|
7
|
+
|
3
8
|
## 0.0.18, 20 September 2016
|
4
9
|
|
5
10
|
* Replicate the workaround for `mime-types` into not just the Rails bootstrap Gemfile, but the Rails gemfile, too.
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module OopRailsServer
|
2
|
+
# This is not intended to be anything even close to a real Gemfile parser -- it is just enough to create/parse
|
3
|
+
# the simple Gemfiles we create or that are generated by 'rails new'.
|
4
|
+
class Gemfile
|
5
|
+
def initialize(file_path)
|
6
|
+
@file_path = File.expand_path(file_path)
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_version_constraints!(gem_name, *version_specs)
|
10
|
+
additional_version_constraints = version_specs.map { |vs| ", '#{vs}'" }.join
|
11
|
+
|
12
|
+
update_gemfile_line!(gem_name) do |gemdecl, specs|
|
13
|
+
"#{gemdecl}#{additional_version_constraints}#{specs}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_specs!(gem_name, new_specs)
|
18
|
+
new_specs_line = new_specs.inspect
|
19
|
+
if new_specs_line =~ /^\s*\{\s*(.*?)\s*\}\s*$/
|
20
|
+
new_specs_line = $1
|
21
|
+
else
|
22
|
+
raise "Object doesn't seem to #inspect into a Hash string: #{new_specs.inspect}"
|
23
|
+
end
|
24
|
+
|
25
|
+
update_gemfile_line!(gem_name) do |gemdecl, specs|
|
26
|
+
"#{gemdecl}, #{new_specs_line}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def ensure_gem!(gem_name)
|
31
|
+
update_gemfile_line!(gem_name) do |gemdecl, specs|
|
32
|
+
"#{gemdecl}#{specs}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def write!
|
37
|
+
File.open(file_path, "w") do |f|
|
38
|
+
contents.each { |l| f.puts l }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
attr_reader :file_path
|
44
|
+
|
45
|
+
GEM_LINE_REGEXP = /^(\s*gem\s+['"])([^"']+)(['"])(.*)$/
|
46
|
+
|
47
|
+
def update_gemfile_line!(gem_name)
|
48
|
+
found = nil
|
49
|
+
|
50
|
+
contents.each_with_index do |line, index|
|
51
|
+
if line =~ GEM_LINE_REGEXP && $2.strip.downcase == gem_name.strip.downcase
|
52
|
+
if found
|
53
|
+
raise "Multiple lines in '#{file_path}' seem to specify gem '#{gem_name}':\n #{found[0]}: #{found[1]}\nand #{index}: #{line}"
|
54
|
+
end
|
55
|
+
|
56
|
+
found = [ index, line ]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
unless found
|
61
|
+
new_line = "gem '#{gem_name}'"
|
62
|
+
contents << new_line
|
63
|
+
found = [ (contents.length - 1), new_line ]
|
64
|
+
end
|
65
|
+
|
66
|
+
matchdata = GEM_LINE_REGEXP.match(found[1])
|
67
|
+
gemdecl = [ matchdata[1], matchdata[2], matchdata[3] ].join
|
68
|
+
|
69
|
+
modified_line = yield gemdecl, matchdata[4]
|
70
|
+
contents[found[0]] = modified_line
|
71
|
+
end
|
72
|
+
|
73
|
+
def contents
|
74
|
+
@contents ||= begin
|
75
|
+
c = if File.exist?(file_path)
|
76
|
+
File.read(file_path)
|
77
|
+
else
|
78
|
+
empty_gemfile_contents
|
79
|
+
end
|
80
|
+
|
81
|
+
c.split(/\n/)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def empty_gemfile_contents
|
86
|
+
"source 'https://rubygems.org'\n\n"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -77,8 +77,8 @@ it should return the fully-qualified path to the root of your project (gem, appl
|
|
77
77
|
@rails_server_runtime_base_directory ||= File.join(rails_server_project_root, "tmp/spec/rails")
|
78
78
|
end
|
79
79
|
|
80
|
-
def
|
81
|
-
|
80
|
+
def rails_server_gemfile_modifier
|
81
|
+
Proc.new { |gemfile| }
|
82
82
|
end
|
83
83
|
|
84
84
|
def rails_server_default_version
|
@@ -184,14 +184,19 @@ it should return the fully-qualified path to the root of your project (gem, appl
|
|
184
184
|
|
185
185
|
template_paths = rails_server_template_paths(templates)
|
186
186
|
|
187
|
-
|
188
|
-
|
187
|
+
rsgm = rails_server_gemfile_modifier
|
188
|
+
agm = options[:additional_gemfile_modifier] || (Proc.new { |gemfile| })
|
189
|
+
|
190
|
+
gemfile_modifier = Proc.new do |gemfile|
|
191
|
+
rsgm.call(gemfile)
|
192
|
+
agm.call(gemfile)
|
193
|
+
end
|
189
194
|
|
190
195
|
server = ::OopRailsServer::RailsServer.new(
|
191
196
|
:name => name, :template_paths => template_paths,
|
192
197
|
:runtime_base_directory => rails_server_runtime_base_directory,
|
193
198
|
:rails_version => (options[:rails_version] || rails_server_default_version),
|
194
|
-
:rails_env => options[:rails_env], :
|
199
|
+
:rails_env => options[:rails_env], :gemfile_modifier => gemfile_modifier)
|
195
200
|
|
196
201
|
rails_servers[name] = server
|
197
202
|
|
@@ -3,6 +3,7 @@ require 'find'
|
|
3
3
|
require 'net/http'
|
4
4
|
require 'uri'
|
5
5
|
require 'file/tail'
|
6
|
+
require 'oop_rails_server/gemfile'
|
6
7
|
|
7
8
|
module OopRailsServer
|
8
9
|
class RailsServer
|
@@ -11,7 +12,7 @@ module OopRailsServer
|
|
11
12
|
def initialize(options)
|
12
13
|
options.assert_valid_keys(
|
13
14
|
:name, :template_paths, :runtime_base_directory,
|
14
|
-
:rails_version, :rails_env, :
|
15
|
+
:rails_version, :rails_env, :gemfile_modifier,
|
15
16
|
:log, :verbose
|
16
17
|
)
|
17
18
|
|
@@ -30,7 +31,7 @@ module OopRailsServer
|
|
30
31
|
@log = options[:log] || $stderr
|
31
32
|
@verbose = options.fetch(:verbose, true)
|
32
33
|
|
33
|
-
@
|
34
|
+
@gemfile_modifier = options[:gemfile_modifier] || (Proc.new { |gemfile| })
|
34
35
|
|
35
36
|
|
36
37
|
@rails_root = File.expand_path(File.join(@runtime_base_directory, rails_version.to_s, name.to_s))
|
@@ -122,7 +123,7 @@ module OopRailsServer
|
|
122
123
|
end
|
123
124
|
|
124
125
|
private
|
125
|
-
attr_reader :template_paths, :runtime_base_directory, :rails_env, :
|
126
|
+
attr_reader :template_paths, :runtime_base_directory, :rails_env, :gemfile_modifier, :port, :server_pid
|
126
127
|
|
127
128
|
def base_template_directories
|
128
129
|
[
|
@@ -192,22 +193,14 @@ module OopRailsServer
|
|
192
193
|
end
|
193
194
|
|
194
195
|
def splat_bootstrap_gemfile!
|
195
|
-
|
196
|
-
rails_version_spec = if rails_version == :default then "" else ", \"= #{rails_version}\"" end
|
197
|
-
f << <<-EOS
|
198
|
-
source 'https://rubygems.org'
|
196
|
+
rails_version_specs = if rails_version == :default then [ ] else [ "= #{rails_version}" ] end
|
199
197
|
|
200
|
-
|
201
|
-
|
198
|
+
gemfile = ::OopRailsServer::Gemfile.new("Gemfile")
|
199
|
+
gemfile.add_version_constraints!("rails", *rails_version_specs)
|
202
200
|
|
203
|
-
|
204
|
-
f.puts "gem 'rack-cache', '< 1.3.0'" if RUBY_VERSION =~ /^1\./
|
205
|
-
f.puts "gem 'rake', '< 11.0.0'" if RUBY_VERSION =~ /^1\.8\./
|
206
|
-
|
207
|
-
# mime-types 3.x depends on mime-types-data, which is incompatible with Ruby < 1.x
|
208
|
-
f.puts "gem 'mime-types', '< 3.0.0'" if RUBY_VERSION =~ /^1\./
|
209
|
-
end
|
201
|
+
backcompat_bootstrap_gems!(gemfile)
|
210
202
|
|
203
|
+
gemfile.write!
|
211
204
|
run_bundle_install!(:bootstrap)
|
212
205
|
end
|
213
206
|
|
@@ -220,48 +213,16 @@ EOS
|
|
220
213
|
end
|
221
214
|
|
222
215
|
def update_gemfile!
|
223
|
-
gemfile = File.join(rails_root, 'Gemfile')
|
224
|
-
gemfile_contents = File.read(gemfile)
|
225
|
-
|
226
|
-
# Since Rails 3.0.20 was released, a new version of the I18n gem, 0.5.2, was released that moves a constant
|
227
|
-
# into a different namespace. (See https://github.com/mislav/will_paginate/issues/347 for more details.)
|
228
|
-
# So, if we're running Rails 3.0.x, we lock the 'i18n' gem to an earlier version.
|
229
|
-
if rails_version && rails_version =~ /^3\.0\./
|
230
|
-
gemfile_contents << "\ngem 'i18n', '= 0.5.0'\n"
|
231
|
-
elsif RUBY_VERSION =~ /^1\.8\./
|
232
|
-
# Since Rails 3.x was released, a new version of the I18n gem, 0.7.0, was released that is incompatible
|
233
|
-
# with Ruby 1.8.7. So, if we're running with Ruby 1.8.7, we lock the 'i18n' gem to an earlier version.
|
234
|
-
gemfile_contents << "\ngem 'i18n', '< 0.7.0'\n"
|
235
|
-
end
|
216
|
+
gemfile = ::OopRailsServer::Gemfile.new(File.join(rails_root, 'Gemfile'))
|
236
217
|
|
237
|
-
|
238
|
-
# Ruby 2.0 or above. So, if we're running Rails 3.1.x or 3.2.x on Ruby 1.8.x, we lock the 'rack-cache' gem
|
239
|
-
# to an earlier version.
|
240
|
-
if rails_version && rails_version =~ /^3\.[12]\./ && RUBY_VERSION =~ /^1\./
|
241
|
-
gemfile_contents << "\ngem 'rack-cache', '< 1.3.0'\n"
|
242
|
-
end
|
218
|
+
backcompat_bootstrap_gems!(gemfile)
|
243
219
|
|
244
|
-
|
245
|
-
|
246
|
-
# new-style hash syntax. As a result, we pin the version backwards in this one specific case.
|
247
|
-
gemfile_contents << "\ngem 'execjs', '~> 2.0.0'\n"
|
248
|
-
|
249
|
-
# Rake 11 is incompatible with Ruby 1.8
|
250
|
-
gemfile_contents << "\ngem 'rake', '< 11.0.0'\n"
|
220
|
+
backcompat_execjs!(gemfile)
|
221
|
+
backcompat_uglifier!(gemfile)
|
251
222
|
|
252
|
-
|
253
|
-
gemfile_contents.gsub!(/^(.*['"]uglifier['"].*)$/, "\\1, '< 3.0.0'")
|
254
|
-
end
|
255
|
-
|
256
|
-
if RUBY_VERSION =~ /^1\./
|
257
|
-
# mime-types 3.x depends on mime-types-data, which is incompatible with Ruby < 1.x
|
258
|
-
gemfile_contents << "\ngem 'mime-types', '< 3.0.0'\n"
|
259
|
-
end
|
223
|
+
gemfile_modifier.call(gemfile)
|
260
224
|
|
261
|
-
|
262
|
-
gemfile_contents << "\n"
|
263
|
-
|
264
|
-
File.open(gemfile, 'w') { |f| f << gemfile_contents }
|
225
|
+
gemfile.write!
|
265
226
|
end
|
266
227
|
|
267
228
|
def with_env(new_env)
|
@@ -562,5 +523,82 @@ and output:
|
|
562
523
|
|
563
524
|
output
|
564
525
|
end
|
526
|
+
|
527
|
+
|
528
|
+
def is_ruby_18
|
529
|
+
!! (RUBY_VERSION =~ /^1\.8\./)
|
530
|
+
end
|
531
|
+
|
532
|
+
def is_ruby_1
|
533
|
+
!! (RUBY_VERSION =~ /^1\./)
|
534
|
+
end
|
535
|
+
|
536
|
+
def is_rails_30
|
537
|
+
rails_version && rails_version =~ /^3\.0\./
|
538
|
+
end
|
539
|
+
|
540
|
+
def is_rails_31
|
541
|
+
rails_version && rails_version =~ /^3\.1\./
|
542
|
+
end
|
543
|
+
|
544
|
+
def is_rails_32
|
545
|
+
rails_version && rails_version =~ /^3\.2\./
|
546
|
+
end
|
547
|
+
|
548
|
+
def backcompat_i18n!(gemfile)
|
549
|
+
if is_rails_30
|
550
|
+
# Since Rails 3.0.20 was released, a new version of the I18n gem, 0.5.2, was released that moves a constant
|
551
|
+
# into a different namespace. (See https://github.com/mislav/will_paginate/issues/347 for more details.)
|
552
|
+
# So, if we're running Rails 3.0.x, we lock the 'i18n' gem to an earlier version.
|
553
|
+
gemfile.add_version_constraints!('i18n', '= 0.5.0')
|
554
|
+
elsif is_ruby_18
|
555
|
+
# Since Rails 3.x was released, a new version of the I18n gem, 0.7.0, was released that is incompatible
|
556
|
+
# with Ruby 1.8.7. So, if we're running with Ruby 1.8.7, we lock the 'i18n' gem to an earlier version.
|
557
|
+
gemfile.add_version_constraints!('i18n', '< 0.7.0')
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
def backcompat_rake!(gemfile)
|
562
|
+
if is_ruby_18
|
563
|
+
# Rake 11 is incompatible with Ruby 1.8
|
564
|
+
gemfile.add_version_constraints!('rake', '< 11.0.0')
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
568
|
+
def backcompat_rack_cache!(gemfile)
|
569
|
+
if is_ruby_1 && (is_rails_31 || is_rails_32)
|
570
|
+
# Since Rails 3.1.12 was released, a new version of the rack-cache gem, 1.3.0, was released that requires
|
571
|
+
# Ruby 2.0 or above. So, if we're running Rails 3.1.x or 3.2.x on Ruby 1.x, we lock the 'rack-cache' gem
|
572
|
+
# to an earlier version.
|
573
|
+
gemfile.add_version_constraints!('rack-cache', '< 1.3.0')
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
def backcompat_mime_types!(gemfile)
|
578
|
+
if is_ruby_1
|
579
|
+
# mime-types 3.x depends on mime-types-data, which is not compatible with ruby < 2.x
|
580
|
+
gemfile.add_version_constraints!('mime-types', '< 3.0.0')
|
581
|
+
end
|
582
|
+
end
|
583
|
+
|
584
|
+
def backcompat_execjs!(gemfile)
|
585
|
+
if is_ruby_18
|
586
|
+
# Apparently execjs released a version 2.2.0 that will happily install on Ruby 1.8.7, but which contains some
|
587
|
+
# new-style hash syntax. As a result, we pin the version backwards in this one specific case.
|
588
|
+
gemfile.add_version_constraints!('execjs', '~> 2.0.0')
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
592
|
+
def backcompat_uglifier!(gemfile)
|
593
|
+
# Uglifier 3 is incompatible with Ruby 1.8
|
594
|
+
gemfile.add_version_constraints!('uglifier', '< 3.0.0')
|
595
|
+
end
|
596
|
+
|
597
|
+
def backcompat_bootstrap_gems!(gemfile)
|
598
|
+
backcompat_i18n!(gemfile)
|
599
|
+
backcompat_rake!(gemfile)
|
600
|
+
backcompat_rack_cache!(gemfile)
|
601
|
+
backcompat_mime_types!(gemfile)
|
602
|
+
end
|
565
603
|
end
|
566
604
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oop_rails_server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Geweke
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- README.md
|
81
81
|
- Rakefile
|
82
82
|
- lib/oop_rails_server.rb
|
83
|
+
- lib/oop_rails_server/gemfile.rb
|
83
84
|
- lib/oop_rails_server/helpers.rb
|
84
85
|
- lib/oop_rails_server/rails_server.rb
|
85
86
|
- lib/oop_rails_server/version.rb
|