Skip to content

Commit

Permalink
New system for specifying gem versions, gemspec info, activating gems
Browse files Browse the repository at this point in the history
  • Loading branch information
winton committed Dec 29, 2010
1 parent a888bdb commit eca33a4
Show file tree
Hide file tree
Showing 16 changed files with 362 additions and 64 deletions.
2 changes: 1 addition & 1 deletion LICENSE
@@ -1,4 +1,4 @@
Copyright (c) 2010 Winton Welsh
Copyright (c) 2010

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
Expand Down
2 changes: 1 addition & 1 deletion Rakefile
@@ -1,6 +1,6 @@
require File.dirname(__FILE__) + '/lib/gem_template/gems'

GemTemplate::Gems.require(:rake)
GemTemplate::Gems.activate %w(rake rspec)

require 'rake'
require 'rake/gempackagetask'
Expand Down
3 changes: 3 additions & 0 deletions config/gemsets.yml
@@ -0,0 +1,3 @@
gem_template:
rake: =0.8.7
rspec: =1.3.1
12 changes: 12 additions & 0 deletions config/gemspec.yml
@@ -0,0 +1,12 @@
name: gem_template
version: 0.1.0
authors:
-
email:
homepage:
summary:
description:
dependencies:
-
development_dependencies:
-
34 changes: 13 additions & 21 deletions gem_template.gemspec
@@ -1,29 +1,21 @@
# -*- encoding: utf-8 -*-
lib = File.expand_path('../lib/', __FILE__)
$:.unshift lib unless $:.include?(lib)

require 'gem_template/gems'
require 'gem_template/version'

Gem::Specification.new do |s|
s.name = "gem_template"
s.version = GemTemplate::VERSION
s.platform = Gem::Platform::RUBY
s.authors = ["Winton Welsh"]
s.email = ["mail@wintoni.us"]
s.homepage = "http://github.com/winton/gem_template"
s.summary = ""
s.description = ""
GemTemplate::Gemspec.data.each do |key, value|
unless %w(dependencies development_dependencies).include?(key)
s.send "#{key}=", value
end
end

GemTemplate::Gems::TYPES[:gemspec].each do |g|
s.add_dependency g.to_s, GemTemplate::Gems::VERSIONS[g]
GemTemplate::Gemspec.dependencies.each do |g|
s.add_dependency g.to_s, GemTemplate::Gems.versions[g]
end

GemTemplate::Gems::TYPES[:gemspec_dev].each do |g|
s.add_development_dependency g.to_s, GemTemplate::Gems::VERSIONS[g]
GemTemplate::Gemspec.development_dependencies.each do |g|
s.add_development_dependency g.to_s, GemTemplate::Gems.versions[g]
end

s.files = Dir.glob("{bin,lib}/**/*") + %w(LICENSE README.md)
s.executables = Dir.glob("{bin}/*").collect { |f| File.basename(f) }
s.require_path = 'lib'
s.executables = `git ls-files -- {bin}/*`.split("\n").collect { |f| File.basename(f) }
s.files = `git ls-files`.split("\n")
s.require_paths = %w(lib)
s.test_files = `git ls-files -- {features,test,spec}/*`.split("\n")
end
4 changes: 1 addition & 3 deletions lib/gem_template.rb
@@ -1,10 +1,8 @@
require File.dirname(__FILE__) + '/gem_template/gems'

GemTemplate::Gems.require(:lib)
GemTemplate::Gems.activate %w()

$:.unshift File.dirname(__FILE__)

require 'gem_template/version'

module GemTemplate
end
49 changes: 21 additions & 28 deletions lib/gem_template/gems.rb
@@ -1,39 +1,32 @@
unless defined?(GemTemplate::Gems)

require 'rubygems'
require "#{File.dirname(__FILE__)}/gemsets"

module GemTemplate
class Gems

VERSIONS = {
:rake => '=0.8.7',
:rspec => '=1.3.1'
}

TYPES = {
:gemspec => [],
:gemspec_dev => [ :rspec ],
:lib => [],
:rake => [ :rake, :rspec ],
:spec => [ :rspec ]
}

class <<self

def lockfile
file = File.expand_path('../../../gems', __FILE__)
unless File.exists?(file)
File.open(file, 'w') do |f|
Gem.loaded_specs.each do |key, value|
f.puts "#{key} #{value.version.version}"
end
end
end
end
attr_accessor :testing, :versions, :warn

def require(type=nil)
(TYPES[type] || TYPES.values.flatten.compact).each do |name|
gem name.to_s, VERSIONS[name]
Gems.testing = false
Gems.warn = true

def activate(*gems)
begin
require 'rubygems' if !defined?(::Gem) || @testing
rescue LoadError
puts "rubygems library could not be required" if @warn
end

Gemsets.gemset = :default unless defined?(@gemset)

gems.flatten.collect(&:to_sym).each do |name|
version = @versions[name]
if defined?(gem)
gem name.to_s, version
else
puts "#{name} #{"(#{version})" if version} failed to activate" if @warn
end
end
end
end
Expand Down
65 changes: 65 additions & 0 deletions lib/gem_template/gemsets.rb
@@ -0,0 +1,65 @@
unless defined?(GemTemplate::Gemsets)

require "#{File.dirname(__FILE__)}/gems"
require "#{File.dirname(__FILE__)}/gemspec"

require 'yaml'

module GemTemplate
class Gemsets
class <<self

attr_accessor :configs, :gemset, :gemsets

Gemsets.configs = [ "#{File.expand_path('../../../', __FILE__)}/config/gemsets.yml" ]

def gemset=(gemset)
if gemset
@gemset = gemset.to_sym

@gemsets = @configs.reverse.collect { |config|
if config.is_a?(::String)
YAML::load(File.read(config)) rescue {}
elsif config.is_a?(::Hash)
config
end
}.inject({}) do |hash, config|
deep_merge(hash, symbolize_keys(config))
end

Gems.versions = @gemsets[Gemspec.name.to_sym].inject({}) do |hash, (key, value)|
if value.is_a?(::String)
hash[key] = value
elsif value.is_a?(::Hash) && key == @gemset
value.each { |k, v| hash[k] = v }
end
hash
end
else
@gemset = nil
@gemsets = nil
Gems.versions = nil
end
end

private

def deep_merge(first, second)
merger = lambda do |key, v1, v2|
Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2
end
first.merge(second, &merger)
end

def symbolize_keys(hash)
return {} unless hash.is_a?(::Hash)
hash.inject({}) do |options, (key, value)|
value = symbolize_keys(value) if value.is_a?(::Hash)
options[(key.to_sym rescue key) || key] = value
options
end
end
end
end
end
end
32 changes: 32 additions & 0 deletions lib/gem_template/gemspec.rb
@@ -0,0 +1,32 @@
unless defined?(GemTemplate::Gemspec)

require 'yaml'

module GemTemplate
class Gemspec
class <<self

attr_accessor :data

def reload
Gemspec.data =
YAML::load(
File.read(
"#{File.expand_path('../../../', __FILE__)}/config/gemspec.yml"
)
) rescue {}

Gemspec.data.each do |key, value|
self.send :eval, <<-EVAL
def #{key}
#{value.inspect}
end
EVAL
end
end

Gemspec.reload
end
end
end
end
3 changes: 0 additions & 3 deletions lib/gem_template/version.rb

This file was deleted.

6 changes: 6 additions & 0 deletions spec/fixtures/gemsets.yml
@@ -0,0 +1,6 @@
gem_template:
rake: =0.8.7
default:
rspec: =1.3.1
rspec2:
rspec: =2.3.0
12 changes: 12 additions & 0 deletions spec/fixtures/gemspec.yml
@@ -0,0 +1,12 @@
name: name
version: 0.1.0
authors:
- Author
email: email@email.com
homepage: http://github.com/author/name
summary: Summary
description: Description
dependencies:
- rake
development_dependencies:
- rspec
31 changes: 31 additions & 0 deletions spec/gem_template/gems_spec.rb
@@ -0,0 +1,31 @@
require 'spec_helper'

describe GemTemplate::Gems do

before(:each) do
GemTemplate::Gemsets.configs = [
"#{$root}/spec/fixtures/gemsets.yml"
]
GemTemplate::Gemsets.gemset = nil
GemTemplate::Gems.testing = true
end

describe :activate do
it "should warn if unable to require rubygems" do
GemTemplate::Gems.stub!(:require)
GemTemplate::Gems.should_receive(:require).with('rubygems').and_raise(LoadError)
GemTemplate::Gems.stub!(:gem)
out = capture_stdout do
GemTemplate::Gems.activate :rspec
end
out.should =~ /rubygems library could not be required/
end

it "should activate gems" do
GemTemplate::Gems.stub!(:gem)
GemTemplate::Gems.should_receive(:gem).with('rspec', '=1.3.1')
GemTemplate::Gems.should_receive(:gem).with('rake', '=0.8.7')
GemTemplate::Gems.activate :rspec, 'rake'
end
end
end

0 comments on commit eca33a4

Please sign in to comment.