cldwalker-local_gem 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +22 -0
- data/README.rdoc +63 -0
- data/Rakefile +48 -0
- data/VERSION.yml +4 -0
- data/lib/config_struct.rb +18 -0
- data/lib/local_gem/override.rb +19 -0
- data/lib/local_gem.rb +65 -0
- data/test/local_gem_test.rb +70 -0
- data/test/override_test.rb +20 -0
- data/test/test_helper.rb +9 -0
- metadata +63 -0
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT LICENSE
|
2
|
+
|
3
|
+
Copyright (c) 2009 Gabriel Horner
|
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.rdoc
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
== Description
|
2
|
+
|
3
|
+
You have the beginnings of a ruby library and you want to access it quick.
|
4
|
+
You don't want to bother making a gemspec for it and uninstalling/reinstalling its gem
|
5
|
+
while you mess with it. Simply tell LocalGem what paths it should load for
|
6
|
+
your local gem and they will be loaded. Note that it doesn't matter how gem-like
|
7
|
+
your project is ie lib and bin directories etc. LocalGem *only* needs to know
|
8
|
+
the full path to your gem/library.
|
9
|
+
|
10
|
+
== Setup
|
11
|
+
|
12
|
+
Install the gem with:
|
13
|
+
|
14
|
+
sudo gem install cldwalker-local_gem -s http://gems.github.com
|
15
|
+
|
16
|
+
To setup your local gem paths, give LocalGem a hash of gem names pointing
|
17
|
+
to a path or an array of paths to load. You can do this with LocalGem.setup_config
|
18
|
+
|
19
|
+
LocalGem.setup_config do |c|
|
20
|
+
c.gems = {'gem1'=>"/gem1/path/lib", 'gem2'=> ["/gem2/path/lib", "/gem2/path/bin"] }
|
21
|
+
end
|
22
|
+
|
23
|
+
Or a config file at either a local local_gem.yml or ~/.local_gem.yml .
|
24
|
+
See local_gem.yml.example for an example config file.
|
25
|
+
|
26
|
+
== Usage
|
27
|
+
|
28
|
+
The two main methods that LocalGem provides are local_gem() and local_require()
|
29
|
+
which map to gem() and require() respectively. Both methods will attempt
|
30
|
+
to load local gems that you have defined. If no gem is found than they resort to default gem/require
|
31
|
+
behavior.
|
32
|
+
|
33
|
+
There are 3 ways to use this library:
|
34
|
+
|
35
|
+
1. Mild: Call LocalGem with its class methods.
|
36
|
+
|
37
|
+
require 'local_gem'
|
38
|
+
LocalGem.local_gem 'alias'
|
39
|
+
|
40
|
+
2. Hot: Call methods directly having included it into your Kernel namespace.
|
41
|
+
|
42
|
+
require 'local_gem'
|
43
|
+
include LocalGem
|
44
|
+
local_gem 'alias'
|
45
|
+
|
46
|
+
3. Spicy: Override require() and gem() with local_require() and local_gem() respectively.
|
47
|
+
|
48
|
+
require 'local_gem'
|
49
|
+
require 'local_gem/override'
|
50
|
+
gem 'alias'
|
51
|
+
|
52
|
+
All three ways would add my local alias library to $LOAD_PATH. These three ways
|
53
|
+
also apply to local_require().
|
54
|
+
|
55
|
+
|
56
|
+
== Motivation
|
57
|
+
|
58
|
+
Got tired of installing/uninstalling the latest version of a gem I'm actively working on. This
|
59
|
+
also makes it easy to treat any random directory of ruby files as a gem.
|
60
|
+
|
61
|
+
== Limitations
|
62
|
+
|
63
|
+
The override and rcov don't play nicely.
|
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
begin
|
5
|
+
require 'rcov/rcovtask'
|
6
|
+
|
7
|
+
Rcov::RcovTask.new do |t|
|
8
|
+
t.libs << 'test'
|
9
|
+
t.test_files = FileList['test/**/*_test.rb']
|
10
|
+
t.rcov_opts = ["-T -x '/Library/Ruby/*'"]
|
11
|
+
t.verbose = true
|
12
|
+
end
|
13
|
+
rescue LoadError
|
14
|
+
puts "Rcov not available. Install it for rcov-related tasks with: sudo gem install rcov"
|
15
|
+
end
|
16
|
+
|
17
|
+
begin
|
18
|
+
require 'jeweler'
|
19
|
+
Jeweler::Tasks.new do |s|
|
20
|
+
s.name = "local_gem"
|
21
|
+
s.description = "Loads any gem/library simply given its path. Great for nascent gems and/or for trying the latest code on a gem."
|
22
|
+
s.summary = s.description
|
23
|
+
s.email = "gabriel.horner@gmail.com"
|
24
|
+
s.homepage = "http://github.com/cldwalker/local_gem"
|
25
|
+
s.authors = ["Gabriel Horner"]
|
26
|
+
s.has_rdoc = true
|
27
|
+
s.files = FileList["VERSION.yml","Rakefile", "README.rdoc", "LICENSE.txt", "{bin,lib,test}/**/*"]
|
28
|
+
end
|
29
|
+
|
30
|
+
rescue LoadError
|
31
|
+
puts "Jeweler not available. Install it for jeweler-related tasks with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
32
|
+
end
|
33
|
+
|
34
|
+
Rake::TestTask.new do |t|
|
35
|
+
t.libs << 'lib'
|
36
|
+
t.pattern = 'test/**/*_test.rb'
|
37
|
+
t.verbose = false
|
38
|
+
end
|
39
|
+
|
40
|
+
Rake::RDocTask.new do |rdoc|
|
41
|
+
rdoc.rdoc_dir = 'rdoc'
|
42
|
+
rdoc.title = 'test'
|
43
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
44
|
+
rdoc.rdoc_files.include('README*')
|
45
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
46
|
+
end
|
47
|
+
|
48
|
+
task :default => :test
|
data/VERSION.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
class ConfigStruct < OpenStruct
|
4
|
+
# Converts the data within the given block to hash
|
5
|
+
def self.block_to_hash(block=nil)
|
6
|
+
config = self.new
|
7
|
+
if block
|
8
|
+
block.call(config)
|
9
|
+
config.to_hash
|
10
|
+
else
|
11
|
+
{}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_hash #:nodoc:
|
16
|
+
@table
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Kernel
|
2
|
+
alias_method :old_require, :require
|
3
|
+
alias_method :old_gem, :gem
|
4
|
+
|
5
|
+
# Overrides gem() to behave like LocalGem::Singleton.local_gem().
|
6
|
+
def gem(*args)
|
7
|
+
LocalGem::Singleton.load_local_gem(args[0]) || old_gem(*args)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Overrides require() to behave like LocalGem::Singleton.local_require().
|
11
|
+
def require(lib)
|
12
|
+
LocalGem::Singleton.load_local_gem(lib)
|
13
|
+
old_require(lib)
|
14
|
+
end
|
15
|
+
|
16
|
+
private :old_require, :old_gem
|
17
|
+
end
|
18
|
+
|
19
|
+
self.send :include, LocalGem
|
data/lib/local_gem.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
require 'config_struct'
|
4
|
+
|
5
|
+
module LocalGem
|
6
|
+
extend self
|
7
|
+
def local_require(path) #:nodoc:
|
8
|
+
Singleton.local_require(path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def local_gem(*args) #:nodoc:
|
12
|
+
Singleton.local_gem(*args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup_config(config, &block) #:nodoc:
|
16
|
+
Singleton.setup_config(config, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
module Singleton
|
20
|
+
extend self
|
21
|
+
attr_accessor :config, :config_file
|
22
|
+
|
23
|
+
# Holds the mapping of local gems and their paths to load.
|
24
|
+
def config
|
25
|
+
@config ||= read_config
|
26
|
+
end
|
27
|
+
|
28
|
+
# Reads config from @config_file and returns a hash.
|
29
|
+
# @config_file can be set via its accessor. Otherwise it defaults to a local local_gem.yml or
|
30
|
+
# ~/.local_gem.yml.
|
31
|
+
def read_config
|
32
|
+
@config_file ||= ['local_gem.yml', File.join("~", ".local_gem.yml")].detect {|e| File.exists?(File.expand_path(e)) }
|
33
|
+
@config_file ? YAML::load(File.new(File.expand_path(@config_file))) : {:gems=>{}}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Takes either a hash or a block and initializes config().
|
37
|
+
def setup_config(config=nil, &block)
|
38
|
+
@config = config || ConfigStruct.block_to_hash(block)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Loads the local gem if found or defaults to a normal gem call.
|
42
|
+
def local_gem(*args)
|
43
|
+
load_local_gem(args[0]) || gem(*args)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Loads the local gem if found and then does a normal require on it.
|
47
|
+
def local_require(lib)
|
48
|
+
load_local_gem(lib)
|
49
|
+
require(lib)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Adds a given library's path (specified in config) to the beginning of $LOAD_PATH.
|
53
|
+
def load_local_gem(library)
|
54
|
+
if path = config[:gems][library]
|
55
|
+
path = [path] unless path.is_a?(Array)
|
56
|
+
path.map {|e| File.expand_path(e) }.each do |f|
|
57
|
+
$:.unshift(f) unless $:.include?(f)
|
58
|
+
end
|
59
|
+
true
|
60
|
+
else
|
61
|
+
false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class LocalGem::Test < Test::Unit::TestCase
|
4
|
+
before(:each) {
|
5
|
+
LocalGem::Singleton.config = { :gems=>{
|
6
|
+
'gem1'=>'path1', 'gem2'=>['path2','path3']}
|
7
|
+
}
|
8
|
+
}
|
9
|
+
|
10
|
+
test "local_gem adds gem's one path to $:" do
|
11
|
+
full_gem_path = File.expand_path(LocalGem::Singleton.config[:gems]['gem1'])
|
12
|
+
assert !$:.include?(full_gem_path)
|
13
|
+
LocalGem.local_gem('gem1')
|
14
|
+
assert $:.include?(full_gem_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
test "local_gem adds gem's multiple paths to $:" do
|
18
|
+
full_gem_paths = LocalGem::Singleton.config[:gems]['gem2'].map {|e| File.expand_path(e) }
|
19
|
+
assert ($: & full_gem_paths).empty?
|
20
|
+
LocalGem.local_gem('gem2')
|
21
|
+
assert !($: & full_gem_paths).empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
test "local_gem defaults to gem if no local gem found" do
|
25
|
+
LocalGem::Singleton.expects(:gem).once
|
26
|
+
LocalGem.local_gem('invalid')
|
27
|
+
end
|
28
|
+
|
29
|
+
test "local_gem calls load_local_gem for a valid gem" do
|
30
|
+
LocalGem::Singleton.expects(:load_local_gem).once.returns(true)
|
31
|
+
LocalGem.local_gem('blah')
|
32
|
+
end
|
33
|
+
|
34
|
+
test "local_require calls load_local_gem and require" do
|
35
|
+
LocalGem::Singleton.expects(:require).once
|
36
|
+
LocalGem::Singleton.expects(:load_local_gem).once
|
37
|
+
LocalGem.local_require('blah')
|
38
|
+
end
|
39
|
+
|
40
|
+
test "setup_config with hash initializes config" do
|
41
|
+
config = {:gems=>{'blah_gem'=>'blah_path'}}
|
42
|
+
LocalGem::Singleton.setup_config(config)
|
43
|
+
assert_equal config, LocalGem::Singleton.config
|
44
|
+
end
|
45
|
+
|
46
|
+
test "setup_config with block initializes config" do
|
47
|
+
config = {:gems=>{'blah_gem'=>'blah_path'}}
|
48
|
+
LocalGem::Singleton.setup_config do |c|
|
49
|
+
c.gems = config[:gems]
|
50
|
+
end
|
51
|
+
assert_equal config, LocalGem::Singleton.config
|
52
|
+
end
|
53
|
+
|
54
|
+
test "read_config uses existing config_file" do
|
55
|
+
LocalGem::Singleton.config_file = 'blah'
|
56
|
+
File.expects(:new)
|
57
|
+
YAML::expects(:load)
|
58
|
+
LocalGem::Singleton.read_config
|
59
|
+
assert_equal 'blah', LocalGem::Singleton.config_file
|
60
|
+
end
|
61
|
+
|
62
|
+
test "read_config uses config_file it detects" do
|
63
|
+
LocalGem::Singleton.config_file = nil
|
64
|
+
File.expects(:new)
|
65
|
+
YAML::expects(:load)
|
66
|
+
File.expects(:exists?).times(2).returns(false, true)
|
67
|
+
LocalGem::Singleton.read_config
|
68
|
+
assert 'local_gem.yml', File.basename(LocalGem::Singleton.config_file)
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class LocalGem::OverrideTest < Test::Unit::TestCase
|
4
|
+
before(:all) { require 'local_gem/override' }
|
5
|
+
test "gem calls old_gem and load_local_gem" do
|
6
|
+
LocalGem::Singleton.expects(:load_local_gem).once
|
7
|
+
self.expects(:old_gem).once
|
8
|
+
gem('blah')
|
9
|
+
end
|
10
|
+
|
11
|
+
test "require calls old_require and load_local_gem" do
|
12
|
+
LocalGem::Singleton.expects(:load_local_gem).once
|
13
|
+
self.expects(:old_require).once
|
14
|
+
require('blah')
|
15
|
+
end
|
16
|
+
|
17
|
+
test "loading override should have included LocalGem in self" do
|
18
|
+
assert self.instance_eval("class<<self; self; end").ancestors.include?(LocalGem)
|
19
|
+
end
|
20
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'context' #gem install jeremymcanally-context -s http://gems.github.com
|
4
|
+
require 'mocha'
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
|
+
require 'local_gem'
|
7
|
+
|
8
|
+
class Test::Unit::TestCase
|
9
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cldwalker-local_gem
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gabriel Horner
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-01 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Loads any gem/library simply given its path. Great for nascent gems and/or for trying the latest code on a gem.
|
17
|
+
email: gabriel.horner@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- VERSION.yml
|
26
|
+
- Rakefile
|
27
|
+
- README.rdoc
|
28
|
+
- LICENSE.txt
|
29
|
+
- lib/config_struct.rb
|
30
|
+
- lib/local_gem
|
31
|
+
- lib/local_gem/override.rb
|
32
|
+
- lib/local_gem.rb
|
33
|
+
- test/local_gem_test.rb
|
34
|
+
- test/override_test.rb
|
35
|
+
- test/test_helper.rb
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://github.com/cldwalker/local_gem
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 1.2.0
|
59
|
+
signing_key:
|
60
|
+
specification_version: 2
|
61
|
+
summary: Loads any gem/library simply given its path. Great for nascent gems and/or for trying the latest code on a gem.
|
62
|
+
test_files: []
|
63
|
+
|