fake_gem 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -4,6 +4,10 @@ project(
4
4
  name: "fake_gem",
5
5
  gem: true,
6
6
  summary: "Makes any directory looks like Ruby Gem",
7
+
8
+ bin: 'bin',
9
+ executables: ['fake_gem'],
10
+ dirs: %w(bin),
7
11
 
8
12
  author: "Alexey Petrushin",
9
13
  homepage: "http://github.com/alexeypetrushin/fake_gem"
data/bin/fake_gem ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if ARGV.empty? or %w(-h --help help).any?{|k| ARGV.include? k}
4
+ puts <<-TEXT
5
+ fake_gem makes any directory looks like ruby gem.
6
+
7
+ Usage:
8
+ $ fake_gem ~/projects ~/other_projects
9
+
10
+ Details:
11
+ Let's suppose Your projects are located
12
+ in the /my_projects dir, and there is 3 folders:
13
+ ~/my_projects
14
+ /app
15
+ /lib1
16
+ /lib2
17
+
18
+ You want lib1 and lib2 to be available as a gems
19
+ while You are developing Your app, do following steps:
20
+ 1. mark lib1 as fake_gem:
21
+ create /projects/lib/fake_gem file
22
+ and add there following lines:
23
+ name: lib1
24
+ libs: lib
25
+ 2. do the same for lib2
26
+ 3. enable fake_gem in current bash session, type:
27
+ $ fake_gem ~/projects
28
+
29
+ All done, now lib1 and lib2 will be
30
+ availiable as real gems in ruby scripts.
31
+ TEXT
32
+ exit
33
+ end
34
+
35
+ dir = File.expand_path("#{__FILE__}/../..")
36
+
37
+ rubyopt = ENV['RUBYOPT'] || ""
38
+ rubyopt = "#{rubyopt} -r#{dir}/lib/fake_gem.rb" unless rubyopt =~ /fake_gem/
39
+
40
+ fake_gem_paths = (ENV['FAKE_GEM_PATHS'] || "").split(':')
41
+ fake_gem_paths = (fake_gem_paths + ARGV).uniq.join(':')
42
+
43
+ puts <<-TEXT
44
+ Please execute following commands or add it to Your bash profile:
45
+ RUBYOPT=#{rubyopt}
46
+ FAKE_GEM_PATHS=#{fake_gem_paths}
47
+ TEXT
data/lib/fake_gem.rb CHANGED
@@ -7,6 +7,21 @@ unless defined?(FakeGem) or defined?(JRuby)
7
7
 
8
8
  $indent = -1
9
9
  Kernel.class_eval do
10
+ alias :gem_without_fgem :gem
11
+ def gem name, *version_requirements
12
+ gem_without_fgem name, *version_requirements
13
+ rescue Gem::LoadError => e
14
+
15
+ # need this check to prevent very tricky bug caused by recursive retry and resulting in
16
+ # files will be required multiple times and strange error messages will be produced
17
+ raise e if e.raised_in_fake_gem
18
+
19
+ unless FakeGem.activate_gem(name)
20
+ e.raised_in_fake_gem = true
21
+ raise e
22
+ end
23
+ end
24
+
10
25
  alias :require_without_fgem :require
11
26
  def require path
12
27
  require_without_fgem path
@@ -44,28 +59,15 @@ unless defined?(FakeGem) or defined?(JRuby)
44
59
 
45
60
  module FakeGem
46
61
  class FakeGemSpec
47
- attr_accessor :dir
48
- def initialize file
62
+ attr_reader :dir, :name, :libs
63
+ def initialize file
49
64
  should_exist file
50
65
  @dir, @libs = File.expand_path(File.dirname(file)), []
51
- instance_eval File.read(file), __FILE__, __LINE__
52
- end
53
-
54
- def libs *args
55
- if args.empty?
56
- @libs
57
- else
58
- args = args.first if args.first.is_a? Array
59
- args = args.collect do |d|
60
- d = d.to_s
61
- d = (d =~ /^\//) ? d : "#{dir}/#{d}"
62
- should_exist d, "file '%{file}' not exist (folder '#{dir}' is false_gem but the folder declared as :lib not exist)!"
63
- d
64
- end
65
- @libs.push(*args)
66
- end
66
+
67
+ require 'yaml'
68
+ spec = YAML.load_file file
69
+ self.name, self.libs = spec['name'], Array(spec['libs'])
67
70
  end
68
- attr_writer :libs
69
71
 
70
72
  def inspect
71
73
  relative_libs = @libs.collect{|l| l.sub("#{@dir}/", '')}
@@ -79,6 +81,18 @@ unless defined?(FakeGem) or defined?(JRuby)
79
81
  raise msg.sub('%{file}', file) unless File.exist? file
80
82
  file
81
83
  end
84
+
85
+ def libs= libs
86
+ libs = libs.collect do |d|
87
+ d = d.to_s
88
+ d = (d =~ /^\//) ? d : "#{dir}/#{d}"
89
+ should_exist d, "file '%{file}' not exist (folder '#{dir}' is false_gem but the folder declared as :lib not exist)!"
90
+ d
91
+ end
92
+ @libs = libs
93
+ end
94
+
95
+ attr_writer :name
82
96
  end
83
97
 
84
98
  class << self
@@ -128,6 +142,22 @@ unless defined?(FakeGem) or defined?(JRuby)
128
142
  false
129
143
  end
130
144
  end
145
+
146
+ # searches for that path in all libs inside of registered fake_gems and
147
+ # updates $LOAD_PATH if found.
148
+ def activate_gem name
149
+ found = gems.find{|gem_spec| gem_spec.name && (gem_spec.name == name)}
150
+
151
+ if found
152
+ gems.delete found
153
+ found.libs.each do |lib_path|
154
+ $LOAD_PATH << lib_path unless $LOAD_PATH.include? lib_path
155
+ end
156
+ true
157
+ else
158
+ false
159
+ end
160
+ end
131
161
 
132
162
  # list of found false-gems
133
163
  def gems
data/readme.md CHANGED
@@ -1,61 +1,35 @@
1
- # Makes any directory looks like Ruby Gem
1
+ FakeGem - very handy hack that makes any directory looks like gem and greatly simplifies gem development. Forget about compiling & pushing Your gems or changing the Bundler's Gemfile file.
2
+ Yes, there's the :path opion in Bundler, but it doesn't solve the problem - if You have multiple projects depending on multiple gems - then You have to change multiple paths in multiple Gemfiles, that's boing. And the FakeGem solves this problem very easily.
2
3
 
3
- ## Overview
4
+ ## Usage
4
5
 
5
- Why? Because I want some of 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.
6
+ ``` bash
7
+ fake_gem ~/my_projects
8
+ ```
7
9
 
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
+ Let's suppose Your projects are located in the /my_projects dir, and because You respect the 'divide and rule' principle Your app divided into 3 modules - the app itself and 2 gems:
10
11
 
11
- ## Usage
12
+ ```
13
+ ~/my_projects
14
+ /app
15
+ /lib1
16
+ /lib2
17
+ ```
18
+
19
+ You want lib1 and lib2 to be available as a gems while You are developing Your app, do following steps:
12
20
 
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 # libs :lib
24
-
25
- /billing
26
- /lib
27
- billing.rb
28
- fake_gem # 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' 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' 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 FAKE_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).
21
+ 1. mark lib1 as fake_gem: create /projects/lib/fake_gem file and add there following lines:
22
+ name: lib1
23
+ libs: lib
24
+ 2. do the same for lib2
25
+ 3. enable fake_gem in current bash session, type:
26
+ $ fake_gem ~/projects
27
+
28
+ All done, now lib1 and lib2 will be availiable as real gems in ruby scripts.
29
+ No changes needed to source code, You can use real gems or fake gems - the application knows nothing about it.
58
30
 
59
31
  ## Installation
60
32
 
61
- $ sudo gem install fake_gem
33
+ ```
34
+ gem install fake_gem
35
+ ```
@@ -1 +1,2 @@
1
- libs :lib
1
+ name: project_a
2
+ libs: lib
@@ -1 +1 @@
1
- libs :lib
1
+ libs: lib
@@ -1 +1 @@
1
- libs :lib
1
+ libs: lib
@@ -41,6 +41,15 @@ describe FakeGem do
41
41
  $LOAD_PATH.should_not include("#{spec_dir}/common/project_b/lib")
42
42
  end
43
43
 
44
+ it "hould load directories with fake_gem as gems" do
45
+ FakeGem.paths "#{spec_dir}/common"
46
+ FakeGem.gems.size.should == 1
47
+
48
+ gem 'project_a'
49
+
50
+ $LOAD_PATH.should include("#{spec_dir}/common/project_a/lib")
51
+ end
52
+
44
53
  it "should load directories with fake_gem as gems" do
45
54
  FakeGem.paths "#{spec_dir}/common"
46
55
  FakeGem.gems.size.should == 1
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fake_gem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.12
4
+ version: 0.1.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,14 +10,14 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-30 00:00:00 +04:00
13
+ date: 2011-08-06 00:00:00 +04:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
17
17
  description:
18
18
  email:
19
- executables: []
20
-
19
+ executables:
20
+ - fake_gem
21
21
  extensions: []
22
22
 
23
23
  extra_rdoc_files: []
@@ -35,6 +35,7 @@ files:
35
35
  - spec/fake_gem_spec/twice/saas/fake_gem
36
36
  - spec/fake_gem_spec/twice/saas/lib/the_saas.rb
37
37
  - spec/fake_gem_spec.rb
38
+ - bin/fake_gem
38
39
  has_rdoc: true
39
40
  homepage: http://github.com/alexeypetrushin/fake_gem
40
41
  licenses: []