railsapp_factory 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +43 -0
- data/.travis.yml +36 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +168 -0
- data/Rakefile +8 -0
- data/lib/railsapp_factory/build_error.rb +7 -0
- data/lib/railsapp_factory/build_methods.rb +141 -0
- data/lib/railsapp_factory/class_methods.rb +155 -0
- data/lib/railsapp_factory/helper_methods.rb +118 -0
- data/lib/railsapp_factory/run_in_app_methods.rb +157 -0
- data/lib/railsapp_factory/server_methods.rb +82 -0
- data/lib/railsapp_factory/string_inquirer.rb +26 -0
- data/lib/railsapp_factory/template_methods.rb +54 -0
- data/lib/railsapp_factory/version.rb +3 -0
- data/lib/railsapp_factory.rb +50 -0
- data/railsapp_factory.gemspec +25 -0
- data/spec/railsapp_factory/class_methods_spec.rb +121 -0
- data/spec/railsapp_factory/helper_methods_spec.rb +124 -0
- data/spec/railsapp_factory/string_inquirer_spec.rb +24 -0
- data/spec/railsapp_factory/template_methods_spec.rb +98 -0
- data/spec/railsapp_factory_spec.rb +387 -0
- data/spec/spec_helper.rb +41 -0
- data/spec/templates/add-file.rb +6 -0
- data/spec/templates/add-ruby_version-controller.rb +9 -0
- data/spec/templates/add-yet-another-file.rb +6 -0
- data/templates/add_json_pure.rb +5 -0
- data/templates/add_necessary_gems.rb +55 -0
- data/templates/use_bundler_with_rails23.rb +187 -0
- metadata +157 -0
data/.gitignore
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
/vendor/bundle
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
|
8
|
+
config/initializers/secret_token.rb
|
9
|
+
.config
|
10
|
+
|
11
|
+
InstalledFiles
|
12
|
+
.yardoc
|
13
|
+
_yardoc
|
14
|
+
coverage
|
15
|
+
doc/
|
16
|
+
lib/bundler/man
|
17
|
+
pkg
|
18
|
+
rdoc
|
19
|
+
spec/reports
|
20
|
+
test/tmp
|
21
|
+
test/version_tmp
|
22
|
+
tmp
|
23
|
+
/coverage/
|
24
|
+
/public/system/*
|
25
|
+
/spec/tmp/*
|
26
|
+
|
27
|
+
*.sassc
|
28
|
+
.sass-cache
|
29
|
+
/log/*
|
30
|
+
/db/*.sqlite3
|
31
|
+
|
32
|
+
capybara-*.html
|
33
|
+
|
34
|
+
.rspec
|
35
|
+
.rvmrc
|
36
|
+
.ruby-version
|
37
|
+
|
38
|
+
.project
|
39
|
+
|
40
|
+
rerun.txt
|
41
|
+
pickle-email-*.html
|
42
|
+
|
43
|
+
/bin
|
data/.travis.yml
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
language: ruby
|
2
|
+
notifications:
|
3
|
+
email:
|
4
|
+
on_success: change
|
5
|
+
on_failure: always
|
6
|
+
|
7
|
+
before_install:
|
8
|
+
- gem update --system $RUBYGEMS_VERSION
|
9
|
+
|
10
|
+
- gem --version
|
11
|
+
- gem install bundler
|
12
|
+
- bundle --version
|
13
|
+
- mkdir -p tmp/bundle
|
14
|
+
|
15
|
+
bundler_args: "--binstubs"
|
16
|
+
|
17
|
+
rvm:
|
18
|
+
# - 1.8.7 - include below so RUBYGEMS version gets set
|
19
|
+
- 1.9.2
|
20
|
+
- 1.9.3
|
21
|
+
- 2.0.0
|
22
|
+
- 2.1.0
|
23
|
+
- jruby-head
|
24
|
+
- rbx
|
25
|
+
|
26
|
+
script: bin/rake build spec install
|
27
|
+
|
28
|
+
matrix:
|
29
|
+
allow_failures:
|
30
|
+
# error: sqlite3-1.3.9/lib/sqlite3/sqlite3_native.so: undefined symbol: RBIGNUM_DIGITS
|
31
|
+
- rvm: rbx
|
32
|
+
include:
|
33
|
+
# set RUBYGEMS_VERSION=1.8.25 for ruby 1.8.7 to avoid "undefined method `source_index' for Gem:Module" errors
|
34
|
+
- rvm: 1.8.7
|
35
|
+
env: RUBYGEMS_VERSION=1.8.25
|
36
|
+
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Ian Heggie
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
# RailsappFactory
|
2
|
+
|
3
|
+
Rails application factory to make testing gems against multiple versions easier
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'railsapp_factory'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install railsapp_factory
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
To get the list of available versions (that can be run with the ruby version you are currently running):
|
22
|
+
|
23
|
+
RailsappFactory.versions
|
24
|
+
|
25
|
+
Depending on the ruby version in use, it will suggest versions '2.3', '3.0', '3.1', '3.2' and '4.0'. The latest in each series will be downloaded. You can also specify a specific version, eg '3.2.8' or 'edge' (edge has to be selected manually as unforsean changes may break the standard build process).
|
26
|
+
|
27
|
+
The INTENT is to end up with:
|
28
|
+
|
29
|
+
To test a gem (health_check in this case), run:
|
30
|
+
|
31
|
+
RailsappFactory.versions.each do |version|
|
32
|
+
railsapp = RailsappFactory.new(version) # also accepts "edge"
|
33
|
+
railsapp.timeout = 300 # timeout operations after 300 seconds
|
34
|
+
railsapp.db = 'mysql2' # database gem to use
|
35
|
+
railsapp.template = File.expand_path('templates/add-file.rb', File.dirname(__FILE__)) # ie full path name
|
36
|
+
# OR
|
37
|
+
railsapp.template = "http://example.com/example.rb"
|
38
|
+
|
39
|
+
# you can also append to the template defined above, or start a custom template from scratch by using append_to_template
|
40
|
+
# A temp file is created containing the combined template information
|
41
|
+
|
42
|
+
railsapp.append_to_template <<-EOF
|
43
|
+
gem "my_gem_name", :path => '#{File.expand_path('templates/add-file.rb', '..')}'
|
44
|
+
bundle install
|
45
|
+
generate(:scaffold, "person name:string")
|
46
|
+
route "root to: 'people#index'"
|
47
|
+
rake("db:migrate")
|
48
|
+
EOF
|
49
|
+
|
50
|
+
# following commands return a struct with stdout, stderr and exit_status
|
51
|
+
# and an exception is raised if build fails
|
52
|
+
|
53
|
+
puts "Latest version in #{railsapp.release} series is #{railsapp.version}"
|
54
|
+
|
55
|
+
railsapp.build # run,rake,runner,console will all trigger this if you forget
|
56
|
+
|
57
|
+
railsapp.append_to_template 'gem "halo"'
|
58
|
+
|
59
|
+
railsapp.process_template # apply template with rake command
|
60
|
+
|
61
|
+
# runs an expression in runner and ruby respectively, and uses to_json to return the result.
|
62
|
+
# exceptions are passed through, except for syntax errors
|
63
|
+
|
64
|
+
railsapp.rails_eval 'Some.rails(code)' # with rails loaded
|
65
|
+
railsapp.ruby_eval 'Some.ruby(code)' # without rails (except for 2.3* which requires rails to pass results back)
|
66
|
+
|
67
|
+
railsapp.run
|
68
|
+
|
69
|
+
# check server is actually running
|
70
|
+
railsapp.alive?.should be_true
|
71
|
+
|
72
|
+
# some helpers for constructing urls (strings)
|
73
|
+
puts "home url: #{railsapp.url}"
|
74
|
+
puts "url: #{railsapp.url('/search', {:author => {:name => 'fred'}})"
|
75
|
+
|
76
|
+
puts "Instance of URI: #{railsapp.uri('/some/path', :name => 'value')}"
|
77
|
+
|
78
|
+
puts "port: #{railsapp.port}"
|
79
|
+
|
80
|
+
railsapp.stop
|
81
|
+
|
82
|
+
# override ENV passed to rails app processes
|
83
|
+
railsapp.override_ENV['EDITOR'] = 'vi'
|
84
|
+
|
85
|
+
railsapp.in_app do
|
86
|
+
# runs command in rails root dir without the extra environment variables bundler exec sets"
|
87
|
+
system 'some shell command'
|
88
|
+
end
|
89
|
+
|
90
|
+
railsapp.system_in_app 'another shell command'
|
91
|
+
|
92
|
+
railsapp.destroy
|
93
|
+
end
|
94
|
+
|
95
|
+
# removes all temp directories - TODO: stop any running servers
|
96
|
+
RailsappFactory.cleanup
|
97
|
+
|
98
|
+
If you use rvm (eg travis.ci) or rbenv (like I do), then you also go the other way,
|
99
|
+
and run you tests in a specific version of ruby (eg to use the later syntax), but build and/or run the rails app
|
100
|
+
with the various ruby versions you have installed.
|
101
|
+
|
102
|
+
It will attempt to find rvm / rbenv through environment variables first, the check the PATH, and lastly check the standard install directories under $HOME.
|
103
|
+
This handles RubyMine's clearing of environment variables, running rbenv or rvm in command mode only whilst running the system ruby.
|
104
|
+
|
105
|
+
RailsappFactory.rubies # lists all ruby versions available (in the format the version manager prefers)
|
106
|
+
RailsappFactory.rvm? # is RVM available
|
107
|
+
RailsappFactory.rbenv? # is rbenv available
|
108
|
+
RailsappFactory.has_ruby_version_manager? # either available?
|
109
|
+
RailsappFactory.using_system_ruby? # simple check that there are no rvm or rbenv specific directories in PATH
|
110
|
+
|
111
|
+
# example without having to build the actual rails app (run ruby commands)
|
112
|
+
|
113
|
+
RailsappFactory.rubies.each do |ruby_v|
|
114
|
+
it "provides a command prefix that will run ruby #{ruby_v}" do
|
115
|
+
prefix = RailsappFactory.ruby_command_prefix(ruby_v)
|
116
|
+
actual_ruby_v=`#{prefix} ruby -v`
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
### Future Development
|
121
|
+
|
122
|
+
At the moment the rubies system isn't smart enough to work out which ruby works with which rails versions,
|
123
|
+
nor know the jruby and rbx switches that change the language modes. I intend to develop that area further.
|
124
|
+
Suggestions welcome if checking RUBY_VERSION is sufficient, along with checking if the ruby_version changes
|
125
|
+
from the default with `JRUBY_OPTS=--1.9, --1.8, --2.0` as well as `RBXOPT=-X18, -X19, -X20, -X21`,
|
126
|
+
or if I need to do more.
|
127
|
+
|
128
|
+
I am thinking of adding multiple entries in the rubies list for rbx / jruby if the env variables trigger a change in
|
129
|
+
RUBY_VERSION, eg:
|
130
|
+
* jruby-1.7.9
|
131
|
+
* jruby-1.7.9/18mode
|
132
|
+
* jruby-1.7.9/19mode
|
133
|
+
* jruby-1.7.9/20mode
|
134
|
+
|
135
|
+
# example for a rail application
|
136
|
+
|
137
|
+
@factory = RailsappFactory.new # chooses the most recent rails version compatible with RUBY_VERSION
|
138
|
+
|
139
|
+
@factory.rubies.each do |ruby_v|
|
140
|
+
@factory.use(ruby_v)
|
141
|
+
actual_ruby_v = @factory.rails_eval('RUBY_VERSION')
|
142
|
+
puts "Using #{@factory.using} ruby"
|
143
|
+
end
|
144
|
+
@factory.use(nil) # revert to the default ruby (in PATH)
|
145
|
+
|
146
|
+
# You can also pass use a block, and it will revert the ruby version afterwards
|
147
|
+
@factory.use(ruby_v)
|
148
|
+
actual_ruby_v = @factory.rails_eval('RUBY_VERSION')
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
I am considering get/put like integration tests have, but requires some thought first to be non rails version specific
|
153
|
+
|
154
|
+
#TODO: railsapp.get("/some/path") - returns status same as get in tests
|
155
|
+
#TODO: railsapp.post("/another/path", :author => { :name => 'fred' } ) - returns status same as post in tests
|
156
|
+
|
157
|
+
|
158
|
+
## Contributing
|
159
|
+
|
160
|
+
1. Fork it
|
161
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
162
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
163
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
164
|
+
5. Create new Pull Request
|
165
|
+
|
166
|
+
## License
|
167
|
+
|
168
|
+
MIT - See LICENSE.txt
|
data/Rakefile
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tmpdir'
|
3
|
+
require 'railsapp_factory'
|
4
|
+
|
5
|
+
class RailsappFactory
|
6
|
+
module BuildMethods
|
7
|
+
|
8
|
+
# class variables used in module:
|
9
|
+
# @base_dir
|
10
|
+
# @built
|
11
|
+
# @bundled
|
12
|
+
# @root
|
13
|
+
# @release
|
14
|
+
|
15
|
+
def destroy
|
16
|
+
if @base_dir
|
17
|
+
stop
|
18
|
+
# keep last built example in last.VERSION
|
19
|
+
FileUtils.rm_rf "#{TMPDIR}/last.#{@version}"
|
20
|
+
FileUtils.mv @base_dir, "#{TMPDIR}/last.#{@version}" if File.directory?(@base_dir)
|
21
|
+
FileUtils.rm_rf @base_dir # to be sure, to be sure!
|
22
|
+
end
|
23
|
+
@base_dir = nil
|
24
|
+
@built = false
|
25
|
+
@bundled = false
|
26
|
+
@root = nil
|
27
|
+
@release = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def build
|
31
|
+
if built?
|
32
|
+
self.logger.info "Already built Rails #{@version} app in directory #{root}"
|
33
|
+
process_template
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
self.use_template 'templates/add_json_pure.rb'
|
37
|
+
if self.version =~ /^2/
|
38
|
+
self.use_template 'templates/use_bundler_with_rails23.rb'
|
39
|
+
else
|
40
|
+
self.use_template 'templates/add_necessary_gems.rb'
|
41
|
+
end
|
42
|
+
new_arg = @version =~ /^2/ ? '' : ' new'
|
43
|
+
other_args = @version =~ /^2/ ? '' : '--no-rc --skip-bundle --force'
|
44
|
+
other_args <<= ' --edge' if @version == 'edge'
|
45
|
+
other_args <<= " -m #{self.template}" if self.template
|
46
|
+
|
47
|
+
self.logger.info "Creating Rails #{@version} app in directory #{root}"
|
48
|
+
unless in_app('.') { Kernel.system "sh -xc '#{rails_command} #{new_arg} #{root} -d #{db} #{other_args}' #{append_log 'rails_new.log'}" }
|
49
|
+
@built = true # avoid repeated build attempts
|
50
|
+
raise BuildError.new("rails #{new_arg}railsapp failed #{see_log 'rails_new.log'}")
|
51
|
+
end
|
52
|
+
@built = true
|
53
|
+
clear_template
|
54
|
+
expected_file = File.join(root, 'config', 'environment.rb')
|
55
|
+
raise BuildError.new("error building railsapp - missing #{expected_file}") unless File.exists?(expected_file)
|
56
|
+
|
57
|
+
command = "sh -xc 'bundle install --binstubs .bundle/bin' #{append_log 'bundle.log'}"
|
58
|
+
self.logger.info "Installing gems with binstubs using command: #{command}"
|
59
|
+
unless system_in_app command
|
60
|
+
raise BuildError.new("bundle install returned exit status #{$?} #{see_log 'bundle.log'}")
|
61
|
+
end
|
62
|
+
@bundled = true
|
63
|
+
raise BuildError.new("error installing gems - Gemfile.lock missing #{see_log 'bundle.log'}") unless File.exists?(File.join(root, 'Gemfile.lock'))
|
64
|
+
true
|
65
|
+
end
|
66
|
+
|
67
|
+
def built?
|
68
|
+
@built
|
69
|
+
end
|
70
|
+
|
71
|
+
def bundled?
|
72
|
+
@bundled
|
73
|
+
end
|
74
|
+
|
75
|
+
# release installed as reported by the rails command itself
|
76
|
+
def release
|
77
|
+
@release ||= begin
|
78
|
+
cmd = rails_command
|
79
|
+
self.logger.debug "Getting release using command: #{cmd} '-v'"
|
80
|
+
r = in_app(RailsappFactory::TMPDIR) { `#{cmd} '-v'` }.chomp.sub(/^Rails */, '')
|
81
|
+
self.logger.debug "Release: #{r}"
|
82
|
+
r
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def root
|
87
|
+
@root = File.join(base_dir, 'railsapp')
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def rails_command
|
93
|
+
rails_cmd_dir = "#{RailsappFactory::TMPDIR}/rails-#{@version}"
|
94
|
+
rails_path = "#{rails_cmd_dir}/bin/rails"
|
95
|
+
#command = '"%s" "%s"' % [Gem.ruby, rails_path]
|
96
|
+
command = rails_path
|
97
|
+
unless File.exists?(rails_path)
|
98
|
+
self.logger.info "Creating bootstrap Rails #{@version} as #{rails_path}"
|
99
|
+
FileUtils.rm_rf rails_cmd_dir
|
100
|
+
FileUtils.mkdir_p rails_cmd_dir
|
101
|
+
Dir.chdir(rails_cmd_dir) do
|
102
|
+
create_Gemfile
|
103
|
+
Bundler.with_clean_env do
|
104
|
+
Kernel.system "sh -xc '#{bundle_command} install --binstubs' #{append_log 'bundle.log'}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
unless File.exists?(rails_path)
|
108
|
+
raise BuildError.new("Error getting rails_command: (#{rails_path})")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
command
|
112
|
+
end
|
113
|
+
|
114
|
+
def create_Gemfile
|
115
|
+
version_spec = if @version == 'edge'
|
116
|
+
"github: 'rails/rails'"
|
117
|
+
elsif @version == '2.3-lts'
|
118
|
+
":git => 'git://github.com/makandra/rails.git', :branch => '2-3-lts'"
|
119
|
+
elsif @version =~ /\.\d+\./
|
120
|
+
"'#{@version}'"
|
121
|
+
else
|
122
|
+
"'~> #{@version}.0'"
|
123
|
+
end
|
124
|
+
gemfile_content = <<-EOF
|
125
|
+
source '#{@gem_source}'
|
126
|
+
gem 'rails', #{version_spec}
|
127
|
+
EOF
|
128
|
+
|
129
|
+
File.open('Gemfile', 'w') { |f| f.puts gemfile_content }
|
130
|
+
self.logger.debug "Created Gemfile with: <<\n#{gemfile_content}>>"
|
131
|
+
end
|
132
|
+
|
133
|
+
def base_dir
|
134
|
+
@base_dir ||= begin
|
135
|
+
FileUtils.mkdir_p RailsappFactory::TMPDIR
|
136
|
+
Dir.mktmpdir("app-#{self.version.gsub(/\W/, '_')}-", RailsappFactory::TMPDIR)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class RailsappFactory
|
5
|
+
module ClassMethods
|
6
|
+
# encodes url query arguments, incl nested
|
7
|
+
def encode_query(args, prefix = '', suffix = '')
|
8
|
+
query = ''
|
9
|
+
args.each do |key, value|
|
10
|
+
if value.is_a?(Hash)
|
11
|
+
query <<= encode_query(value, "#{prefix}#{key}[", "]#{suffix}")
|
12
|
+
else
|
13
|
+
query <<= '&' << CGI::escape(prefix + key.to_s + suffix) << '=' << CGI::escape(value.to_s)
|
14
|
+
end
|
15
|
+
end if args
|
16
|
+
if prefix == ''
|
17
|
+
query.sub(/^&/, '?')
|
18
|
+
else
|
19
|
+
query
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def cleanup
|
24
|
+
FileUtils.rm_rf RailsappFactory::TMPDIR
|
25
|
+
end
|
26
|
+
|
27
|
+
def versions(ruby_v = RUBY_VERSION)
|
28
|
+
case (ruby_v.to_s)
|
29
|
+
when /^1\.8\.6/
|
30
|
+
%w{2.3}
|
31
|
+
when /^1\.8\.7/
|
32
|
+
%w{2.3 2.3-lts 3.0 3.1 3.2}
|
33
|
+
when /^1\.9\.1/
|
34
|
+
%w{2.3}
|
35
|
+
when /^1\.9\.2/
|
36
|
+
%w{3.0 3.1 3.2}
|
37
|
+
when /^1\.9\.3/
|
38
|
+
%w{3.0 3.1 3.2 4.0}
|
39
|
+
when /^2\.[01]/
|
40
|
+
%w{4.0}
|
41
|
+
when /^1\./
|
42
|
+
[]
|
43
|
+
when ''
|
44
|
+
# all
|
45
|
+
%w{2.3 2.3-lts 3.0 3.1 3.2 4.0}
|
46
|
+
else
|
47
|
+
%w{4.0} # a guess!
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def rubies # (rails_v = nil)
|
52
|
+
find_ruby_version_manager
|
53
|
+
ruby_command_prefix_template
|
54
|
+
result = if @@rbenv_path
|
55
|
+
`#{@@rbenv_path} versions --bare`
|
56
|
+
elsif @@rvm_path
|
57
|
+
`#{@@rvm_path} list strings`
|
58
|
+
else
|
59
|
+
''
|
60
|
+
end.split(/\r?\n/)
|
61
|
+
# TODO: rework this to run each one and extract the RUBY_VERSION to work out what is compatible
|
62
|
+
# TODO: extend this with JRUBY_OPTS=--1.9, --1.8, --2.0 as well as RBXOPT=-X18, -X19, -X20, -X21 and check which ones actually change the RUBY_VERSION value
|
63
|
+
# TODO: rbx is outputting an extra nil as it is running as irb sometimes .. test this
|
64
|
+
# if rails_v.nil?
|
65
|
+
# result
|
66
|
+
#else
|
67
|
+
# rails_v_compare = rails_v.sub(/^(\d+\.\d+).*?(-lts)?$/, '\1\2')
|
68
|
+
# result.select do |ruby_v|
|
69
|
+
# rails_v.nil? || versions(ruby_v).include?(rails_v_compare)
|
70
|
+
# end
|
71
|
+
#end
|
72
|
+
end
|
73
|
+
|
74
|
+
def ruby_command_prefix(ruby_v = nil)
|
75
|
+
if ruby_v.to_s == ''
|
76
|
+
''
|
77
|
+
else
|
78
|
+
ruby_command_prefix_template % ruby_v.to_s
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def rbenv?
|
83
|
+
find_ruby_version_manager
|
84
|
+
@@rbenv_path
|
85
|
+
end
|
86
|
+
|
87
|
+
def rvm?
|
88
|
+
find_ruby_version_manager
|
89
|
+
@@rvm_path
|
90
|
+
end
|
91
|
+
|
92
|
+
def has_ruby_version_manager?
|
93
|
+
find_ruby_version_manager != ''
|
94
|
+
end
|
95
|
+
|
96
|
+
def using_system_ruby?
|
97
|
+
ENV['PATH'] !~ /\/\.?rbenv\/versions\// && ENV['PATH'] !~ /\/\.?rvm\/rubies\//
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def list_rubies
|
103
|
+
find_ruby_version_manager
|
104
|
+
if @@rbenv_path
|
105
|
+
`#{@@rbenv_path} versions --bare`
|
106
|
+
elsif @@rvm_path
|
107
|
+
`#{@@rvm_path} list strings`
|
108
|
+
else
|
109
|
+
''
|
110
|
+
end.split(/\r?\n/)
|
111
|
+
end
|
112
|
+
|
113
|
+
def ruby_command_prefix_template
|
114
|
+
@@ruby_command_prefix_template ||= begin
|
115
|
+
find_ruby_version_manager
|
116
|
+
if @@rbenv_path
|
117
|
+
"env 'RBENV_VERSION=%s' #{@@rbenv_path} exec"
|
118
|
+
elsif @@rvm_path
|
119
|
+
"#{@@rvm_path} '%s' do"
|
120
|
+
else
|
121
|
+
''
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
def find_ruby_version_manager
|
128
|
+
@@found_ruby_version_manager ||= begin
|
129
|
+
@@rbenv_path = ENV['RBENV_ROOT'] ? "#{ENV['RBENV_ROOT']}/bin/rbenv" : nil
|
130
|
+
@@rvm_path = ENV['rvm_path'] ? "#{ENV['rvm_path']}/bin/rvm" : nil
|
131
|
+
unless @@rbenv_path || @@rvm_path
|
132
|
+
# RubyMine removes RBENV_PATH when a rbenv environment is selected
|
133
|
+
ENV['PATH'].split(':').each do |exec_path|
|
134
|
+
@@rbenv_path = "#{$1}/bin/rbenv" if exec_path =~ /^(.*\/\.?rbenv)\/(bin|versions)/
|
135
|
+
@@rvm_path = "#{$1}/bin/rbenv" if exec_path =~ /^(.*\/\.?rvm)\/(bin|rubies)/
|
136
|
+
break if @@rbenv_path || @@rvm_path
|
137
|
+
end
|
138
|
+
# In case we are running from system ruby and the shell environment is not set
|
139
|
+
unless @@rbenv_path || @@rvm_path
|
140
|
+
if File.exists? "#{ENV['HOME']}/.rbenv/bin/rbenv"
|
141
|
+
@@rbenv_path = "#{ENV['HOME']}/.rbenv/bin/rbenv"
|
142
|
+
elsif File.exists? "#{ENV['HOME']}/.rvm/bin/rvm"
|
143
|
+
@@rvm_path = "#{ENV['HOME']}/.rvm/bin/rvm"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
@@rbenv_path = nil unless @@rbenv_path && File.exists?(@@rbenv_path)
|
148
|
+
@@rvm_path = nil if @@rbenv_path || !@@rvm_path || !File.exists?(@@rvm_path)
|
149
|
+
@@rbenv_path || @@rvm_path || ''
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|