fake_gem 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,60 @@
1
+ require 'rake'
2
+ require 'spec/rake/spectask'
3
+
4
+ Dir.chdir File.dirname(__FILE__)
5
+
6
+ # Specs
7
+ task :default => :spec
8
+
9
+ Spec::Rake::SpecTask.new('spec') do |t|
10
+ t.spec_files = FileList["spec/**/*_spec.rb"].select{|f| f !~ /\/_/}
11
+ t.libs = ['lib'].collect{|f| "#{File.dirname __FILE__}/#{f}"}
12
+ # t.spec_opts = ["--backtrace"]
13
+ end
14
+
15
+ # Gem
16
+ require 'rake/clean'
17
+ require 'rake/gempackagetask'
18
+ require 'fileutils'
19
+
20
+ spec = Gem::Specification.new do |s|
21
+ s.name = "fake_gem"
22
+ s.version = "0.1.1"
23
+ s.summary = "Makes any directory looks like Ruby Gem"
24
+ s.description = "Makes any directory looks like Ruby Gem"
25
+ s.author = "Alexey Petrushin"
26
+ # s.email = ""
27
+ s.homepage = "http://github.com/alexeypetrushin/fake_gem"
28
+
29
+ s.platform = Gem::Platform::RUBY
30
+ s.has_rdoc = true
31
+
32
+ s.files = (['Rakefile', 'readme.md'] + Dir.glob("{lib,spec}/**/*"))
33
+
34
+ s.require_paths = ["lib"]
35
+ end
36
+
37
+ PACKAGE_DIR = "#{File.expand_path File.dirname(__FILE__)}/build"
38
+
39
+ Rake::GemPackageTask.new(spec) do |p|
40
+ package_dir = PACKAGE_DIR
41
+ # FileUtils.mkdir package_dir unless File.exist? package_dir
42
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
43
+ p.need_zip = true
44
+ p.package_dir = package_dir
45
+ end
46
+
47
+ # CLEAN.include [ 'pkg', '*.gem']
48
+
49
+ task :push do
50
+ dir = Dir.chdir PACKAGE_DIR do
51
+ gem_file = Dir.glob("fake_gem*.gem").first
52
+ system "gem push #{gem_file}"
53
+ end
54
+ end
55
+
56
+ task :clean do
57
+ system "rm -r #{PACKAGE_DIR}"
58
+ end
59
+
60
+ task :release => [:gem, :push, :clean]
data/lib/fake_gem.rb ADDED
@@ -0,0 +1,119 @@
1
+ # If you inject this module wia RUBYOPTS it may be already be processed,
2
+ # and include('fake_gem') will executes it one more time, so we check it manually.
3
+ unless defined? FakeGem
4
+ alias :require_without_fgem :require
5
+ def require path
6
+ require_without_fgem path
7
+ rescue LoadError => e
8
+ FakeGem.activate(path + '.rb') ? retry : raise(e)
9
+ end
10
+
11
+ alias :load_without_fgem :load
12
+ def load path, wrap = false
13
+ load_without_fgem path, wrap
14
+ rescue LoadError => e
15
+ FakeGem.activate(path) ? retry : raise(e)
16
+ end
17
+
18
+ module FakeGem
19
+ class FakeGemSpec
20
+ attr_accessor :dir
21
+ def initialize file
22
+ should_exist file
23
+ @dir, @libs = File.expand_path(File.dirname(file)), []
24
+ instance_eval File.read(file), __FILE__, __LINE__
25
+ end
26
+
27
+ def libs *args
28
+ if args.empty?
29
+ @libs
30
+ else
31
+ args = args.first if args.first.is_a? Array
32
+ args = args.collect do |d|
33
+ d = d.to_s
34
+ d = (d =~ /^\//) ? d : "#{dir}/#{d}"
35
+ should_exist d
36
+ d
37
+ end
38
+ @libs.push *args
39
+ end
40
+ end
41
+ attr_writer :libs
42
+
43
+ protected
44
+ def should_exist file
45
+ raise "File #{file} not exist!" unless File.exist? file
46
+ file
47
+ end
48
+ end
49
+
50
+ class << self
51
+ # Use it to set location for your fake_gems
52
+ def paths *paths
53
+ paths = paths.first if paths.first.is_a? Array
54
+ if paths.empty?
55
+ unless @paths
56
+ if env_paths = ENV['FALSE_GEM_PATH']
57
+ self.paths = env_paths.split(':')
58
+ else
59
+ self.paths = []
60
+ end
61
+ end
62
+ @paths
63
+ else
64
+ self.paths = paths
65
+ end
66
+ end
67
+
68
+ def paths= paths
69
+ @paths = paths.collect{|l| File.expand_path l}
70
+ end
71
+
72
+ # searches for that path in all libs inside of registered fake_gems and
73
+ # updates $LOAD_PATH if found.
74
+ def activate path
75
+ found = nil
76
+ catch :found do
77
+ gems.index do |gem_spec|
78
+ gem_spec.libs.each do |lib_path|
79
+ if File.exist? "#{lib_path}/#{path}"
80
+ found = gem_spec
81
+ throw :found
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ if found
88
+ gems.delete found
89
+ found.libs.each do |lib_path|
90
+ $LOAD_PATH << lib_path unless $LOAD_PATH.include? lib_path
91
+ end
92
+ true
93
+ else
94
+ false
95
+ end
96
+ end
97
+
98
+ # list of found false-gems
99
+ def gems
100
+ unless @gems
101
+ @gems = []
102
+ paths.each do |location|
103
+ Dir.glob("#{location}/*/fake_gem.rb").each do |gem_spec_file|
104
+ @gems << FakeGemSpec.new(gem_spec_file) unless gem_spec_file =~ /\/fake_gem\/fake_gem\.rb/
105
+ end
106
+ end
107
+ end
108
+ @gems
109
+ end
110
+ attr_writer :gems
111
+
112
+ def clear
113
+ @paths, @gems = nil
114
+ end
115
+
116
+ end
117
+ end
118
+
119
+ end
data/readme.md ADDED
@@ -0,0 +1,61 @@
1
+ # Makes any directory looks like Ruby Gem
2
+
3
+ ## Overview
4
+
5
+ Why? Becouse I want my projects be accessible as a gem, but without overhead like providing gem spec, rebuild and pushing it with every update.
6
+ I need only the most basic functional of gem system - automatic path resolving. And the **fake_gem** does exactly that.
7
+
8
+ **Note**: it's not a gem replacement, It's just a handy hack to simplify development in cases when you don't need all the gem power. At any time you
9
+ can add standard gem's specification and it become real gem, without any change for other code that uses it.
10
+
11
+ ## Usage
12
+
13
+ Let's say you have the 'application' project and want to use 'user-management' and 'billing' libraries in it.
14
+
15
+ ~/projects
16
+ /application
17
+ /lib
18
+ /app.rb
19
+
20
+ /user-management
21
+ /lib
22
+ user_management.rb
23
+ fake_gem.rb # libs :lib
24
+
25
+ /billing
26
+ /lib
27
+ billing.rb
28
+ fake_gem.rb # libs :lib
29
+
30
+ /some-other-app
31
+ /lib
32
+ /some_other_app.rb
33
+
34
+ You should do the following steps:
35
+
36
+ 1. create 2 files called 'fake_gem.rb' with the "libs :lib" content inside each of 'user-management' and 'billing' libraries.
37
+
38
+ 2. add the following lines to your 'app.rb' file:
39
+
40
+ require 'fake_gem'
41
+ FakeGem.paths '~/projects'
42
+
43
+ Now both of those libraries are available inside of your application, like that:
44
+
45
+ require 'user_management' # => true
46
+ require 'billing' # => true
47
+
48
+ FakeGem ignores and don't mess with your other projects don't marked with the 'fake_gem.rb' label.
49
+
50
+ require 'some_other_app' # => Error, no such file!
51
+
52
+ **Note**: there's a better way, without affecting the 'app.rb' file. Add following lines to your ~/.profile
53
+
54
+ export FALSE_GEM_PATH="~/projects"
55
+ export RUBYOPT="-rrubygems -r<your path to the 'fake_gem' gem dir>/lib/fake_gem.rb"
56
+
57
+ now you don't need the step 2 (don't forget to reload your .profile changes by executing $source ~/.profile).
58
+
59
+ ## Installation
60
+
61
+ $ sudo gem install fake_gem
@@ -0,0 +1 @@
1
+ libs :lib
@@ -0,0 +1,57 @@
1
+ dir = File.expand_path(File.dirname(__FILE__) + "/..")
2
+ $LOAD_PATH << "#{dir}/lib" unless $LOAD_PATH.include? "#{dir}/lib"
3
+
4
+ require 'spec'
5
+ require "fake_gem"
6
+
7
+ describe FakeGem do
8
+ before :each do
9
+ @old_load_path, @old_env = $LOAD_PATH.clone, ENV['FALSE_GEM_PATH']
10
+ ENV['FALSE_GEM_PATH'] = nil
11
+ FakeGem.clear
12
+
13
+ @data_dir = File.expand_path(__FILE__.sub(/\.rb$/, ''))
14
+ end
15
+
16
+ after :each do
17
+ ENV['FALSE_GEM_PATH'] = @old_env
18
+ $LOAD_PATH.replace @old_load_path
19
+ end
20
+
21
+ it "should use FALSE_GEM_PATH environment variable or paths assigned to FakeGem::paths attribute" do
22
+ FakeGem.paths.should == []
23
+
24
+ FakeGem.clear
25
+ ENV['FALSE_GEM_PATH'] = "/first_path:/second_path"
26
+ FakeGem.paths.should == %w(/first_path /second_path)
27
+
28
+ FakeGem.paths '.'
29
+ FakeGem.paths.should == [File.expand_path('.')]
30
+
31
+ FakeGem.clear
32
+ FakeGem.paths = ['.']
33
+ FakeGem.paths.should == [File.expand_path('.')]
34
+ end
35
+
36
+ it "should require directories with fake_gem.rb as gems" do
37
+ FakeGem.paths @data_dir
38
+ FakeGem.gems.size.should == 1
39
+
40
+ require 'project_a_file'
41
+ lambda{require 'project_b_file'}.should raise_error(/no such file to load/)
42
+
43
+ $LOAD_PATH.should include("#{@data_dir}/project_a/lib")
44
+ $LOAD_PATH.should_not include("#{@data_dir}/project_b/lib")
45
+ end
46
+
47
+ it "should load directories with fake_gem.rb as gems" do
48
+ FakeGem.paths @data_dir
49
+ FakeGem.gems.size.should == 1
50
+
51
+ load 'project_a_file.rb'
52
+ lambda{load 'project_b_file.rb'}.should raise_error(/no such file to load/)
53
+
54
+ $LOAD_PATH.should include("#{@data_dir}/project_a/lib")
55
+ $LOAD_PATH.should_not include("#{@data_dir}/project_b/lib")
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fake_gem
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
11
+ platform: ruby
12
+ authors:
13
+ - Alexey Petrushin
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-09 00:00:00 +04:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Makes any directory looks like Ruby Gem
23
+ email:
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - Rakefile
32
+ - readme.md
33
+ - lib/fake_gem.rb
34
+ - spec/fake_gem_spec/project_a/fake_gem.rb
35
+ - spec/fake_gem_spec/project_a/lib/project_a_file.rb
36
+ - spec/fake_gem_spec/project_b/lib/project_b_file.rb
37
+ - spec/fake_gem_spec.rb
38
+ has_rdoc: true
39
+ homepage: http://github.com/alexeypetrushin/fake_gem
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options: []
44
+
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ hash: 3
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ requirements: []
66
+
67
+ rubyforge_project:
68
+ rubygems_version: 1.3.7
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: Makes any directory looks like Ruby Gem
72
+ test_files: []
73
+