rubygems-bundler 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2011 Michal Papis
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
data/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # About
2
+
3
+ Rubygems and Bundler integration, makes executable wrappers
4
+ generated by rubygems aware of bundler.
5
+
6
+ # Installation
7
+
8
+ gem install rubygems-bundler
9
+ gem regenerate_binstubs [-V]
10
+
11
+ # Description
12
+
13
+ This gem is intended to fill in the integration gap between
14
+ Bundler and Rubygems
15
+
16
+ With this gem rubygems generated wrappers will allow to
17
+ use bundler when asked for.
18
+
19
+ Using this gem solves problem of calling `bundle exec ...`
20
+ with your every command.
21
+
22
+ <h3 style="color: red; letter-spacing: 3px;">NOTE</h3>
23
+
24
+ Please note that method introduced by this gem is not approved
25
+ by rubygems neither bundler teams becouse of the following problem:
26
+
27
+ Beware, it is important you understand that this gem can make
28
+ your gem executables load in versions specified in Gemfile!
29
+
30
+ The problem with Gemfile is that you can have few of them,
31
+ so expect that gem version for executable will be taken from
32
+ `~/Gemfile` when your project is in `~/projects/my_project`
33
+ and does not contain `Gemfile`
34
+
35
+ Last note is that bundler handling can be used only when bundler is installed.
36
+
37
+ # Controlling the wrapper
38
+
39
+ Wrappers generated by this gem will replace original rubygems wrapper,
40
+ but it will not change wrapper behavior unless explicitly asked for.
41
+
42
+ To allow using bundler when available, but fallback to rubygems when not:
43
+
44
+ export USE_BUNDLER=try
45
+
46
+ To force usage of bundler:
47
+
48
+ export USE_BUNDLER=force
49
+
50
+ To make your choice persistent put this into `~/.rvmrc` or `~/.bashrc`.
51
+
52
+ # How it works
53
+
54
+ Installation of gem will make any new installed gem use new bundler
55
+ aware wrapper:
56
+
57
+ gem install rubygems-bundler
58
+
59
+ To make gems already installed aware of bundler call the following command,
60
+ it will detect gems with executables and regenerate those executables:
61
+
62
+ gem regenerate_binstubs [-V]
63
+
64
+ Now for running haml can be controlled if it will using bundler code or not:
65
+
66
+ mpapis@niczsoft:~/test> USE_BUNDLER=no haml -v
67
+ Haml 3.1.1 (Separated Sally)
68
+
69
+ mpapis@niczsoft:~/test> USE_BUNDLER=try haml -v
70
+ Haml/Sass 3.0.0 (Classy Cassidy)
71
+
72
+ mpapis@niczsoft:~/test> gem uninstall bundler
73
+ Remove executables:
74
+ bundle
75
+ in addition to the gem? [Yn] y
76
+ Removing bundle
77
+ Successfully uninstalled bundler-1.0.14
78
+
79
+ mpapis@niczsoft:~/test> USE_BUNDLER=force haml -v
80
+ /home/mpapis/.rvm/gems/ruby-1.9.2-p180@test-bundler/bin/haml:25:in `rescue in <main>': (RuntimeError)
81
+
82
+ Please install bundler first.
83
+
84
+ from /home/mpapis/.rvm/gems/ruby-1.9.2-p180@test-bundler/bin/haml:18:in `<main>'
85
+
86
+ mpapis@niczsoft:~/test> USE_BUNDLER=try haml -v
87
+ Haml 3.1.1 (Separated Sally)
88
+
89
+ # Author
90
+
91
+ - Michal Papis <mpapis@gmail.com>
92
+
93
+ # Thanks
94
+
95
+ - Yehuda Katz : the initial patch code
96
+ - Wayne E. Seguin : support in writing good code
97
+ - Evan Phoenix : support on rubygems internalls
98
+ - Andre Arko : claryfications how rubygems/bundler works
@@ -0,0 +1,5 @@
1
+ module Gem
2
+ post_install do |inst|
3
+ RubyGemsBundlerInstaller.bundler_generate_bin(inst)
4
+ end
5
+ end
@@ -0,0 +1,63 @@
1
+ require 'rubygems/installer'
2
+
3
+ class RegenerateBinstubsCommand < Gem::Command
4
+ def initialize
5
+ super 'regenerate_binstubs', 'Re run generation of executable wrappers for gems.'
6
+ end
7
+
8
+ def arguments # :nodoc:
9
+ "STRING start of gem name to regenerate binstubs"
10
+ end
11
+
12
+ def usage # :nodoc:
13
+ "#{program_name} [STRING]"
14
+ end
15
+
16
+ def defaults_str # :nodoc:
17
+ ""
18
+ end
19
+
20
+ def description # :nodoc:
21
+ 'Re run generation of executable wrappers for all gems. '+
22
+ 'Wrappers will be compatible with both rubygems and bundler. '+
23
+ 'The switcher is BUNDLE_GEMFILE environment variable, '+
24
+ 'when set it switches to bundler mode, when not set, '+
25
+ 'then the command will work as it was with pure rubygems.'
26
+ end
27
+
28
+ def execute
29
+ name = get_one_optional_argument || ''
30
+ specs = installed_gems.select{|spec| spec.name =~ /^#{name}/i }
31
+ specs.each do |spec|
32
+ unless spec.executables.empty?
33
+ org_gem_path = Gem.path.find{|path|
34
+ File.exists? File.join path, 'gems', spec.full_name
35
+ } || Gem.dir
36
+ cache_gem = File.join(org_gem_path, 'cache', spec.file_name)
37
+ if File.exist? cache_gem
38
+ puts "#{spec.name} #{spec.version}"
39
+ inst = Gem::Installer.new Dir[cache_gem].first, :wrappers => true, :force => true
40
+ org_gem_path = File.join org_gem_path, 'gems'
41
+ inst.spec.instance_variable_set :@gems_dir, org_gem_path
42
+ inst.spec.instance_variable_set :@gem_dir, nil
43
+ inst.spec.loaded_from = org_gem_path
44
+ RubyGemsBundlerInstaller.bundler_generate_bin(inst)
45
+ else
46
+ puts "##{spec.name} #{spec.version} not found in GEM_HOME"
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ private
53
+ def installed_gems
54
+ if Gem::VERSION > '1.8' then
55
+ Gem::Specification.to_a
56
+ else
57
+ Gem.source_index.map{|name,spec| spec}
58
+ end
59
+
60
+ Gem::VERSION > '1.8' ? Gem::Specification._all : Gem.source_index.map{|name,spec| spec}
61
+
62
+ end
63
+ end
@@ -0,0 +1,64 @@
1
+ module RubyGemsBundlerInstaller
2
+ # Iterate through executables and generate wrapper for each one,
3
+ # extract of rubygems code
4
+ def self.bundler_generate_bin(inst)
5
+ return if inst.spec.executables.nil? or inst.spec.executables.empty?
6
+ bindir = inst.bin_dir ? inst.bin_dir : Gem.bindir(inst.gem_home)
7
+ inst.spec.executables.each do |filename|
8
+ filename.untaint
9
+ original = File.join inst.gem_dir, inst.spec.bindir, filename
10
+ if File.exists?( original )
11
+ bin_script_path = File.join bindir, inst.formatted_program_filename(filename)
12
+ FileUtils.rm_f bin_script_path
13
+ File.open bin_script_path, 'wb', 0755 do |file|
14
+ file.print bundler_app_script_text(inst, filename)
15
+ end
16
+ inst.say bin_script_path if Gem.configuration.really_verbose
17
+ else
18
+ inst.say "Can not find #{inst.spec.name} in GEM_PATH"
19
+ break
20
+ end
21
+ end
22
+ end
23
+
24
+ # Return the text for an application file.
25
+ def self.bundler_app_script_text(inst, bin_file_name)
26
+ <<-TEXT
27
+ #{inst.shebang bin_file_name}
28
+ #
29
+ # This file was generated by RubyGems extended wrapper.
30
+ #
31
+ # The application '#{inst.spec.name}' is installed as part of a gem, and
32
+ # this file is here to facilitate running it.
33
+ #
34
+
35
+ require 'rubygems'
36
+
37
+ use_bundler = (ENV['USE_BUNDLER']||'').downcase
38
+
39
+ try_bundler = %w{try check possibly}.include? use_bundler
40
+ force_bundler = %w{force require yes true on}.include? use_bundler
41
+ version = "#{Gem::Requirement.default}"
42
+
43
+ if try_bundler || force_bundler
44
+ begin
45
+ require 'bundler/setup'
46
+ rescue LoadError
47
+ raise '\n\nPlease \\\'gem install bundler\\\' first.\n\n' if force_bundler
48
+ try_bundler = false
49
+ end
50
+ end
51
+
52
+ unless try_bundler
53
+ if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
54
+ version = $1
55
+ ARGV.shift
56
+ end
57
+ gem '#{inst.spec.name}', version
58
+ end
59
+
60
+ load Gem.bin_path('#{inst.spec.name}', '#{bin_file_name}', version)
61
+ TEXT
62
+ end
63
+
64
+ end
@@ -0,0 +1,6 @@
1
+ require 'rubygems/command_manager'
2
+ require 'rubygems_bundler/rubygems_bundler_installer'
3
+ require 'rubygems_bundler/fix_wrapper'
4
+ require 'rubygems_bundler/regenerate_binstubs_command'
5
+
6
+ Gem::CommandManager.instance.register_command :regenerate_binstubs
@@ -0,0 +1,46 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "rubygems-bundler"
3
+ s.version = "0.1.5"
4
+ s.date = "2011-06-08"
5
+ s.summary = "Make rubygems generate bundler aware executable wrappers"
6
+ s.email = "mpapis@gmail.com"
7
+ s.homepage = "https://github.com/mpapis/rubygems-bundler"
8
+ s.description = "Integrate Rubygems, Bundler and RVM"
9
+ s.has_rdoc = false
10
+ s.authors = ["Michal Papis"]
11
+ s.files = [
12
+ "lib/rubygems_bundler/regenerate_binstubs_command.rb",
13
+ "lib/rubygems_bundler/rubygems_bundler_installer.rb",
14
+ "lib/rubygems_bundler/fix_wrapper.rb",
15
+ "lib/rubygems_plugin.rb",
16
+ "README.md",
17
+ "rubygems-bundler.gemspec",
18
+ "LICENSE",
19
+ ]
20
+ s.post_install_message = <<-TEXT
21
+ ========================================================================
22
+
23
+ Thanks for installing rubygems-bundler!
24
+
25
+ It is important you understand that this gem can make your gem
26
+ executables load in versions specified in Gemfile!
27
+
28
+ To make all the executables bundler compatible run:
29
+
30
+ gem regenerate_binstubs # only once
31
+
32
+ To always use bundler add the following line to ~/.rvmrc or ~/.bashrc
33
+
34
+ export USE_BUNDLER=force
35
+
36
+ now relogin or call in every open shell:
37
+
38
+ export USE_BUNDLER=force
39
+
40
+ For more information read:
41
+
42
+ https://github.com/mpapis/rubygems-bundler
43
+
44
+ ========================================================================
45
+ TEXT
46
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubygems-bundler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michal Papis
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-06-08 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Integrate Rubygems, Bundler and RVM
15
+ email: mpapis@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/rubygems_bundler/regenerate_binstubs_command.rb
21
+ - lib/rubygems_bundler/rubygems_bundler_installer.rb
22
+ - lib/rubygems_bundler/fix_wrapper.rb
23
+ - lib/rubygems_plugin.rb
24
+ - README.md
25
+ - rubygems-bundler.gemspec
26
+ - LICENSE
27
+ homepage: https://github.com/mpapis/rubygems-bundler
28
+ licenses: []
29
+ post_install_message: ! "========================================================================\n\nThanks
30
+ for installing rubygems-bundler!\n\nIt is important you understand that this gem
31
+ can make your gem \nexecutables load in versions specified in Gemfile!\n\nTo make
32
+ all the executables bundler compatible run:\n\n gem regenerate_binstubs # only
33
+ once\n\nTo always use bundler add the following line to ~/.rvmrc or ~/.bashrc\n\n
34
+ \ export USE_BUNDLER=force\n\nnow relogin or call in every open shell:\n\n export
35
+ USE_BUNDLER=force\n\nFor more information read:\n\n https://github.com/mpapis/rubygems-bundler\n\n========================================================================\n"
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ requirements: []
52
+ rubyforge_project:
53
+ rubygems_version: 1.8.5
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: Make rubygems generate bundler aware executable wrappers
57
+ test_files: []