gemist 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,3 +1,9 @@
1
+ v0.1.0 - May 28, 2011
2
+ ---------------------
3
+
4
+ ### Added:
5
+ * Gemfile.lock support
6
+
1
7
  v0.0.5 - May 15, 2011
2
8
  ---------------------
3
9
 
data/README.md CHANGED
@@ -1,18 +1,25 @@
1
1
  # Gemist
2
2
  #### An extremely minimal solution to gem isolation
3
3
 
4
- **Bundler + faster + smaller (<4kb) = Gemist**
4
+ Gemist is a solution to load the correct gems for a project based on a Gemfile
5
+ manifest.
5
6
 
6
- You don't need Bundler for gem management. Rubygems can do it already. Let me
7
- show you what I mean:
7
+ Gemist is a leaner (4kb), faster runtime that is Bundler-compatible. It does not
8
+ actually require Bundler.
8
9
 
9
10
  ## Getting started
10
11
 
12
+ Install it:
13
+
14
+ $ gem install gemist
15
+
11
16
  Make a file in your project called `Gemfile`.
12
17
 
13
18
  ``` ruby
14
19
  # Gemfile
15
20
  gem "sinatra"
21
+ gem "haml"
22
+ gem "sass"
16
23
  gem "ohm", "0.1.3"
17
24
 
18
25
  # These will only be for the development environment
@@ -22,10 +29,13 @@ end
22
29
 
23
30
  # You may specify multiple files to be required
24
31
  gem "rails", ">= 3.0", require: ['rails', 'action_controller']
32
+
33
+ # You can also specify more than one version requirement
34
+ gem "compass", "~> 0.11.1", "<= 0.11.5"
25
35
  ```
26
36
 
27
37
  In your project file, do this.
28
- This `require`s the gems defined in the Gemfile.
38
+ This `require`s the gems defined in the Gemfile based on the `RACK_ENV`.
29
39
 
30
40
  ``` ruby
31
41
  require 'gemist'
@@ -77,18 +87,18 @@ handle.
77
87
 
78
88
  ### Freezing gem versions
79
89
 
80
- Gemist doesn't care about your `Gemfile.lock`.
90
+ If your project has a Bundler-generated `Gemfile.lock` file, Gemist will use it.
91
+ This file can be generated using `bundle update --local`. Note that this is
92
+ completely optional!
81
93
 
82
- This means that to ensure your app will work with future gem releases, you
83
- should add versions like so (using `~>` is highly recommended):
94
+ Also, to ensure your app will work with future gem releases, you should add
95
+ versions like so (using `~>` is highly recommended):
84
96
 
85
97
  ``` ruby
86
98
  # Gemfile
87
99
  gem "sinatra", "~> 1.1"
88
100
  ```
89
101
 
90
- If you need a Gemfile.lock for whatever reason, use `bundle update --local`.
91
-
92
102
  ### Vendoring gems
93
103
 
94
104
  Gemist does NOT vendor gems for you. Rubygems helps you with that already!
@@ -148,14 +158,6 @@ Benchmark.measure { require 'bundler'; Bundler.require } #=> 2.5s average
148
158
  Benchmark.measure { require 'gemist'; Gemist.require } #=> 1.6s average
149
159
  ```
150
160
 
151
- ## Don't use this
152
-
153
- This is merely a proof-of-concept. It works (very well), but:
154
-
155
- 1. The world has enough gem management tools, it doesn't need another.
156
-
157
- 2. Bundler is better (though it's more bloated and does more things).
158
-
159
161
  ## Not going to happen
160
162
 
161
163
  Gemist will never have:
@@ -2,7 +2,7 @@ require 'ostruct'
2
2
 
3
3
  # Gem environment manager.
4
4
  module Gemist
5
- VERSION = "0.0.5"
5
+ VERSION = "0.1.0"
6
6
 
7
7
  def self.version
8
8
  VERSION
@@ -72,6 +72,10 @@ class Gemist::Gemfile
72
72
  Dir["./{Gemistfile,Gemfile,Isolate}"].first
73
73
  end
74
74
 
75
+ def self.lockfile_path
76
+ Dir["./{Gemistfile,Gemfile,Isolate}.lock"].first
77
+ end
78
+
75
79
  # Checks if the project has a Gemfile manifest.
76
80
  def self.exists?
77
81
  !!path
@@ -79,11 +83,25 @@ class Gemist::Gemfile
79
83
 
80
84
  # Returns a Gemfile instance made from the project's manifest.
81
85
  def self.load
82
- new File.read(path) if exists?
86
+ new(File.read(path), lockfile_contents) if exists?
83
87
  end
84
88
 
85
- def initialize(contents)
89
+ def initialize(contents, lockfile)
86
90
  instance_eval contents
91
+
92
+ # Parse the lockfile
93
+ if lockfile
94
+ lockfile.split("\n").each { |s|
95
+ name, version = s.scan(/^ ([^ ]+) \(([0-9].*?)\)$/).first
96
+ gem = self[name]
97
+ gem.versions = [version] if gem
98
+ }
99
+ end
100
+ end
101
+
102
+ # Returns a gem
103
+ def [](name)
104
+ gems.select { |gem| gem.name == name }.first
87
105
  end
88
106
 
89
107
  # The list of gems the Gemfile. Returns an array of Gem instances.
@@ -96,7 +114,11 @@ class Gemist::Gemfile
96
114
  gems.select { |g| g.group == nil || g.group.include?(env.to_s.to_sym) }
97
115
  end
98
116
 
99
- private
117
+ protected
118
+ def self.lockfile_contents
119
+ File.read(lockfile_path) if lockfile_path
120
+ end
121
+
100
122
  # (DSL) Adds a gem.
101
123
  #
102
124
  # == Example
@@ -113,7 +135,13 @@ private
113
135
  options[:version] ||= args
114
136
  options[:group] ||= @group
115
137
 
116
- self.gems << Gemist::Gem.new(options)
138
+ gem = self[name]
139
+
140
+ if gem
141
+ gem.update options
142
+ else
143
+ self.gems << Gemist::Gem.new(options)
144
+ end
117
145
  end
118
146
 
119
147
  # (DSL) Defines a group.
@@ -144,11 +172,15 @@ class Gemist::Gem
144
172
  attr_accessor :group
145
173
  attr_reader :error
146
174
 
147
- def initialize(options)
148
- self.name ||= options[:name]
149
- self.versions ||= options[:version]
150
- self.group ||= options[:group]
151
- self.require ||= options[:require]
175
+ def initialize(options={})
176
+ update options
177
+ end
178
+
179
+ def update(options={})
180
+ self.name = options[:name] unless options[:name].nil?
181
+ self.versions = options[:version] unless options[:version].nil?
182
+ self.group = options[:group] unless options[:group].nil?
183
+ self.require = options[:require] unless options[:require].nil?
152
184
  self.require = self.name if self.require.nil?
153
185
  end
154
186
 
@@ -0,0 +1 @@
1
+ gem "sinatra", "~> 1.2.6"
@@ -0,0 +1,15 @@
1
+ GEM
2
+ specs:
3
+ contest (0.1.2)
4
+ rack (1.2.1)
5
+ sinatra (1.2.6)
6
+ rack (~> 1.1)
7
+ tilt (< 2.0, >= 1.2.2)
8
+ tilt (1.3)
9
+
10
+ PLATFORMS
11
+ ruby
12
+
13
+ DEPENDENCIES
14
+ contest
15
+ sinatra (~> 1.2.6)
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class LockTest < Test::Unit::TestCase
4
+ setup do
5
+ Dir.chdir fx('lock/')
6
+ use_gemfile nil
7
+ end
8
+
9
+ teardown do
10
+ Dir.chdir fx
11
+ end
12
+
13
+ test "Gemfile.lock" do
14
+ Gem.expects(:activate).with('sinatra', '1.2.6').returns(true)
15
+
16
+ Gemist.setup
17
+ end
18
+ end
@@ -20,11 +20,16 @@ class Test::Unit::TestCase
20
20
  end
21
21
 
22
22
  def fixture(path)
23
- File.expand_path("../fixtures/#{path}", __FILE__)
23
+ fx path
24
24
  end
25
25
 
26
26
  def use_gemfile(what)
27
- ENV['GEMFILE'] = fixture(what)
27
+ ENV['GEMFILE'] = what.nil? ? nil : fixture(what)
28
28
  Gemist.class_variable_set :@@gemfile, nil
29
29
  end
30
30
  end
31
+
32
+ def fx(path='')
33
+ File.expand_path("../fixtures/#{path}", __FILE__)
34
+ end
35
+
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: gemist
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.5
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Rico Sta. Cruz
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-15 00:00:00 +08:00
13
+ date: 2011-05-28 00:00:00 +08:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -29,9 +29,12 @@ files:
29
29
  - lib/gemist.rb
30
30
  - test/bogus_test.rb
31
31
  - test/fixtures/bogus.gemfile
32
+ - test/fixtures/lock/Gemfile
33
+ - test/fixtures/lock/Gemfile.lock
32
34
  - test/fixtures/require.gemfile
33
35
  - test/fixtures/sample.gemfile
34
36
  - test/gemist_test.rb
37
+ - test/lock_test.rb
35
38
  - test/require_test.rb
36
39
  - test/test_helper.rb
37
40
  - HISTORY.md