metafusion-thor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/metafusion/thor.rb +11 -0
- data/lib/metafusion/thor/core.rb +27 -0
- data/lib/metafusion/thor/meta.rb +57 -0
- data/lib/metafusion/thor/version.rb +19 -0
- data/spec/metafusion/thor/core_spec.rb +59 -0
- data/spec/metafusion/thor/meta_spec.rb +90 -0
- data/spec/metafusion/thor/version_spec.rb +19 -0
- metadata +59 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
# File that includes extensions to the Ruby standard library and core APIs
|
2
|
+
# in the Metafusion::Thor library.
|
3
|
+
module Metafusion
|
4
|
+
module Thor
|
5
|
+
# Module that contains core reusable features
|
6
|
+
module Core
|
7
|
+
class ThorUndefinedProjectName < Exception; end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require('thor')
|
13
|
+
|
14
|
+
class Thor
|
15
|
+
def project_name
|
16
|
+
raise ::Metafusion::Thor::Core::ThorUndefinedProjectName, "Please define a project_name methods in your Thor subclass that returns the name of your project"
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "gem", "Build gem from .gemspec file"
|
20
|
+
def gem
|
21
|
+
path = project_name + ".gemspec"
|
22
|
+
gemspec = eval(File.read(path))
|
23
|
+
builder = Gem::Builder.new(gemspec)
|
24
|
+
builder.build
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# meta.rb contains <tt>Metafusion::Thor::Meta</tt> and related classes that
|
2
|
+
# help define the metadata of the <tt>metafusion-thor</tt> project.
|
3
|
+
|
4
|
+
require('rubygems')
|
5
|
+
require('erb')
|
6
|
+
|
7
|
+
class Metafusion::Thor::Meta #:nodoc:
|
8
|
+
attr_accessor :root_dir
|
9
|
+
attr_reader :gem_spec, :project_files, :spec_files
|
10
|
+
|
11
|
+
# Initializer for Metafusion::Thor::Meta class. Takes <tt>root_dir</tt> as parameter.
|
12
|
+
def initialize(root_dir)
|
13
|
+
@root_dir = root_dir
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns package information defined in <tt>root_dir</tt>/pkg-info.yml
|
17
|
+
def pkg_info
|
18
|
+
yaml_file = File.join(@root_dir, 'pkg-info.yml')
|
19
|
+
ryaml = ERB.new(File.read(yaml_file), 0)
|
20
|
+
s = ryaml.result(binding)
|
21
|
+
YAML.load(s)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns RubyGems spec information
|
25
|
+
def spec_info
|
26
|
+
self.pkg_info['spec'] if self.pkg_info
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns list of project files
|
30
|
+
def project_files
|
31
|
+
@project_files ||= Dir.glob(File.join(@root_dir, 'lib/**/*.rb'))
|
32
|
+
@project_files
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns list of specification files
|
36
|
+
def spec_files
|
37
|
+
@spec_files ||= Dir.glob(File.join(@root_dir, 'spec/**/*_spec.rb'))
|
38
|
+
@spec_files
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns RubyGem specification for Metafusion::Thor project
|
42
|
+
def gem_spec
|
43
|
+
@gem_spec ||= Gem::Specification.new do |spec|
|
44
|
+
self.spec_info.each do |key, val|
|
45
|
+
# if val.is_a?(Hash)
|
46
|
+
# puts val.inspect
|
47
|
+
# val.each do |k, v|
|
48
|
+
# spec.send(key, k, v)
|
49
|
+
# end
|
50
|
+
# else
|
51
|
+
spec.send("#{key}=", val)
|
52
|
+
# end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
@gem_spec
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# version.rb contains <tt>Metafusion::Thor::Version</tt> that provides helper
|
2
|
+
# methods related to versioning of the <tt>metafusion-thor</tt> project.
|
3
|
+
|
4
|
+
module Metafusion::Thor::Version #:nodoc:
|
5
|
+
MAJOR = 0
|
6
|
+
MINOR = 1
|
7
|
+
REVISION = 0
|
8
|
+
class << self
|
9
|
+
# Returns X.Y.Z formatted version string
|
10
|
+
def to_version
|
11
|
+
"#{MAJOR}.#{MINOR}.#{REVISION}"
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns X-Y-Z formatted version name
|
15
|
+
def to_name
|
16
|
+
"#{MAJOR}_#{MINOR}_#{REVISION}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
|
2
|
+
|
3
|
+
require('metafusion/thor/core')
|
4
|
+
|
5
|
+
describe Metafusion::Thor::Core do
|
6
|
+
include Metafusion::Thor::Core
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Metafusion::Thor::Core::ThorUndefinedProjectName do
|
10
|
+
before(:all) do
|
11
|
+
@class = Metafusion::Thor::Core::ThorUndefinedProjectName
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should have superclass Exception" do
|
15
|
+
@class.superclass.should be(Exception)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe Thor do
|
20
|
+
before(:each) do
|
21
|
+
@thor = Thor.new
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#project_name" do
|
25
|
+
it "should raise PersonalLife::Core::ThorUndefinedProjectName exception when calling default project_name instance method" do
|
26
|
+
lambda {
|
27
|
+
@thor.project_name
|
28
|
+
}.should raise_error(Metafusion::Thor::Core::ThorUndefinedProjectName)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#gem" do
|
33
|
+
before(:each) do
|
34
|
+
@project_name = "test"
|
35
|
+
@gemspec_contents = ""
|
36
|
+
@thor.stub!(:project_name).and_return(@project_name)
|
37
|
+
File.stub!(:read).and_return(@gemspec_contents)
|
38
|
+
@builder = mock(Gem::Builder)
|
39
|
+
@builder.stub!(:build)
|
40
|
+
Gem::Builder.stub!(:new).and_return(@builder)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should read [project_name].gemspec file" do
|
44
|
+
File.should_receive(:read).with(@project_name + ".gemspec").and_return(@gemspec_contents)
|
45
|
+
@thor.gem
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should create a Gem::Builder object" do
|
49
|
+
Gem::Builder.should_receive(:new).and_return(@builder)
|
50
|
+
@thor.gem
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should build the Gem::Builder object" do
|
54
|
+
@builder.should_receive(:build)
|
55
|
+
@thor.gem
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
|
2
|
+
|
3
|
+
def glob_files(*path_elements)
|
4
|
+
Dir.glob(File.join(*path_elements))
|
5
|
+
end
|
6
|
+
|
7
|
+
def load_erb_yaml(path, context)
|
8
|
+
ryaml = ERB.new(File.read(path), 0)
|
9
|
+
YAML.load(ryaml.result(context))
|
10
|
+
end
|
11
|
+
|
12
|
+
module ERBMetaMixin
|
13
|
+
# Needed to make the YAML load work...
|
14
|
+
def project_files
|
15
|
+
glob_files(@root_dir, 'lib', '**/*.rb')
|
16
|
+
end
|
17
|
+
|
18
|
+
# Needed to make the YAML load work...
|
19
|
+
def spec_files
|
20
|
+
glob_files(@root_dir, 'spec', '**/*_spec.rb')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "Metafusion::Thor::Meta cache policy" do
|
25
|
+
include ERBMetaMixin
|
26
|
+
before(:each) do
|
27
|
+
@root_dir = project_root_dir
|
28
|
+
@meta = Metafusion::Thor::Meta.new(@root_dir)
|
29
|
+
@expected_pkg_info = load_erb_yaml(File.join(@root_dir, 'pkg-info.yml'), binding)
|
30
|
+
@expected_project_files = project_files
|
31
|
+
@expected_spec_files = spec_files
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should store value returned from project_files in @project_files after first glob" do
|
35
|
+
@meta.instance_eval("@project_files").should eql(nil)
|
36
|
+
@meta.project_files
|
37
|
+
@meta.instance_eval("@project_files").should eql(@expected_project_files)
|
38
|
+
@meta.project_files
|
39
|
+
@meta.instance_eval("@project_files").should eql(@expected_project_files)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should store value returned from spec_files in @spec_files after first glob" do
|
43
|
+
@meta.instance_eval("@spec_files").should eql(nil)
|
44
|
+
@meta.spec_files
|
45
|
+
@meta.instance_eval("@spec_files").should eql(@expected_spec_files)
|
46
|
+
@meta.spec_files
|
47
|
+
@meta.instance_eval("@spec_files").should eql(@expected_spec_files)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "Metafusion::Thor::Meta" do
|
52
|
+
include ERBMetaMixin
|
53
|
+
before(:each) do
|
54
|
+
@root_dir = project_root_dir
|
55
|
+
@meta = Metafusion::Thor::Meta.new(@root_dir)
|
56
|
+
@expected_yaml_hash = load_erb_yaml(File.join(@root_dir, 'pkg-info.yml'), binding)
|
57
|
+
@expected_project_files = project_files
|
58
|
+
@expected_spec_files = spec_files
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should load and return YAML file into Hash object upon #pkg_info call" do
|
62
|
+
yaml_hash = @meta.pkg_info
|
63
|
+
yaml_hash.should.eql? @expected_yaml_hash
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should return the embedded hash responding to key 'spec' of #pkg_info call upon #spec_info call" do
|
67
|
+
yaml_hash = @meta.spec_info
|
68
|
+
yaml_hash.should.eql? @expected_yaml_hash['spec']
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should return list of files matching ROOT_DIR/lib/**/*.rb upon #project_files call" do
|
72
|
+
project_files = @meta.project_files
|
73
|
+
project_files.should.eql? @expected_project_files
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should return list of files matching ROOT_DIR/spec/**/*.rb upon #spec_files call" do
|
77
|
+
spec_files = @meta.spec_files
|
78
|
+
spec_files.should.eql? @expected_spec_files
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should return Gem specification based on YAML file contents and #project_files and #spec_files return values" do
|
82
|
+
spec = @meta.gem_spec
|
83
|
+
expected_spec_hash = @expected_yaml_hash['spec']
|
84
|
+
expected_spec_hash.each do |key, val|
|
85
|
+
unless val.is_a?(Hash)
|
86
|
+
spec.send(key).to_s.should eql(expected_spec_hash[key].to_s)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
|
2
|
+
|
3
|
+
VERSION_LIST = [Metafusion::Thor::Version::MAJOR, Metafusion::Thor::Version::MINOR, Metafusion::Thor::Version::REVISION]
|
4
|
+
|
5
|
+
EXPECTED_VERSION = VERSION_LIST.join('.')
|
6
|
+
EXPECTED_NAME = VERSION_LIST.join('_')
|
7
|
+
|
8
|
+
describe Metafusion::Thor::Version, ".to_version" do
|
9
|
+
it "should return #{EXPECTED_VERSION}" do
|
10
|
+
Metafusion::Thor::Version.to_version.should eql(EXPECTED_VERSION)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe Metafusion::Thor::Version, ".to_name" do
|
15
|
+
it "should return #{EXPECTED_NAME}" do
|
16
|
+
Metafusion::Thor::Version.to_name.should eql(EXPECTED_NAME)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: metafusion-thor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Susan Potter
|
8
|
+
autorequire: metafusion/thor
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-12-02 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: metafusion@googlegroups.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- lib/metafusion/thor/meta.rb
|
26
|
+
- lib/metafusion/thor/version.rb
|
27
|
+
- lib/metafusion/thor/core.rb
|
28
|
+
- lib/metafusion/thor.rb
|
29
|
+
- spec/metafusion/thor/meta_spec.rb
|
30
|
+
- spec/metafusion/thor/core_spec.rb
|
31
|
+
- spec/metafusion/thor/version_spec.rb
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: http://metafusion.rubyforge.org
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.8.6
|
44
|
+
version:
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: "0"
|
50
|
+
version:
|
51
|
+
requirements:
|
52
|
+
- Ruby 1.8.6+
|
53
|
+
rubyforge_project: metafusion
|
54
|
+
rubygems_version: 1.3.1
|
55
|
+
signing_key:
|
56
|
+
specification_version: 2
|
57
|
+
summary: Provides Thor extensions for any type of Ruby project.
|
58
|
+
test_files: []
|
59
|
+
|