gm 0.1.4
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/LICENSE.txt +22 -0
- data/README.textile +13 -0
- data/bin/gem-make +6 -0
- data/bin/gm +6 -0
- data/gm_behaviors/author_behavior.rb +29 -0
- data/gm_behaviors/bin_files_behavior.rb +10 -0
- data/gm_behaviors/dependencies_behavior.rb +22 -0
- data/gm_behaviors/executables_behavior.rb +13 -0
- data/gm_behaviors/general_behavior.rb +41 -0
- data/gm_behaviors/github_behavior.rb +11 -0
- data/gm_behaviors/gm_files_behavior.rb +13 -0
- data/gm_behaviors/lib_files_behavior.rb +10 -0
- data/gm_behaviors/rails_behavior.rb +11 -0
- data/gm_behaviors/rdoc_behavior.rb +34 -0
- data/gm_behaviors/rspec_behavior.rb +10 -0
- data/gm_behaviors/rubigen_behavior.rb +13 -0
- data/gm_behaviors/rubyforge_behavior.rb +12 -0
- data/gm_behaviors/test_behavior.rb +10 -0
- data/gm_behaviors/text_files_behavior.rb +10 -0
- data/gm_commands/build_command.rb +25 -0
- data/gm_commands/build_gemspec_command.rb +35 -0
- data/gm_commands/clean_command.rb +14 -0
- data/gm_commands/config_command.rb +42 -0
- data/gm_commands/create_command.rb +10 -0
- data/gm_commands/gen_command.rb +31 -0
- data/gm_commands/help_command.rb +246 -0
- data/gm_commands/install_command.rb +17 -0
- data/gm_commands/publish_command.rb +33 -0
- data/gm_commands/spec_command.rb +14 -0
- data/gm_generators/bin/bin_generator.rb +22 -0
- data/gm_generators/bin/templates/bin/bin.rb +3 -0
- data/gm_generators/gem/gem_generator.rb +38 -0
- data/gm_generators/gem/templates/Gmfile +4 -0
- data/gm_generators/gem/templates/README.textile +0 -0
- data/gm_generators/gem/templates/lib/module.rb +4 -0
- data/gm_generators/mit_license/mit_license_generator.rb +17 -0
- data/gm_generators/mit_license/templates/LICENSE.txt +22 -0
- data/gm_generators/rails/rails_generator.rb +18 -0
- data/gm_generators/rails/templates/rails/init.rb +1 -0
- data/gm_generators/test/templates/test_case.rb.erb +5 -0
- data/gm_generators/test/templates/test_helper.rb.erb +7 -0
- data/gm_generators/test/test_generator.rb +26 -0
- data/gm_networks/github_network.rb +72 -0
- data/gm_networks/rubyforge_network.rb +90 -0
- data/lib/autotest/discover.rb +3 -0
- data/lib/autotest/gm.rb +37 -0
- data/lib/extentions/gem.rb +27 -0
- data/lib/gm.rb +30 -0
- data/lib/gm/app.rb +108 -0
- data/lib/gm/behavior.rb +23 -0
- data/lib/gm/command.rb +70 -0
- data/lib/gm/configuration.rb +20 -0
- data/lib/gm/documentation.rb +38 -0
- data/lib/gm/helpers.rb +20 -0
- data/lib/gm/loader.rb +84 -0
- data/lib/gm/network.rb +29 -0
- data/lib/gm/system.rb +16 -0
- data/test/command_test.rb +106 -0
- data/test/gem_extentions_test.rb +31 -0
- data/test/system_test.rb +17 -0
- data/test/test_helper.rb +12 -0
- metadata +159 -0
data/lib/gm/behavior.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module GM
|
3
|
+
|
4
|
+
class Behavior
|
5
|
+
|
6
|
+
include GM::Documentation
|
7
|
+
include GM::Configuration
|
8
|
+
include GM::Helpers
|
9
|
+
include GM::System
|
10
|
+
include GM::Loader
|
11
|
+
|
12
|
+
desc ""
|
13
|
+
doc ""
|
14
|
+
|
15
|
+
loads :behaviors
|
16
|
+
|
17
|
+
def run
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/gm/command.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
module GM
|
3
|
+
|
4
|
+
class Command
|
5
|
+
|
6
|
+
attr_accessor :argv
|
7
|
+
attr_accessor :options
|
8
|
+
|
9
|
+
include GM::Documentation
|
10
|
+
include GM::Configuration
|
11
|
+
include GM::Helpers
|
12
|
+
include GM::System
|
13
|
+
include GM::Loader
|
14
|
+
|
15
|
+
desc ""
|
16
|
+
doc ""
|
17
|
+
banner ""
|
18
|
+
loads :commands
|
19
|
+
|
20
|
+
# build a command
|
21
|
+
def self.run(cmd_name=nil, argv=ARGV)
|
22
|
+
app = GM.app
|
23
|
+
if Array === cmd_name
|
24
|
+
argv = cmd_name
|
25
|
+
cmd_name = nil
|
26
|
+
end
|
27
|
+
cmd = self.build(cmd_name, argv)
|
28
|
+
clip = Clip(argv) do |p|
|
29
|
+
p.banner = cmd.banner_text
|
30
|
+
app.extra_options(p)
|
31
|
+
cmd.extra_options(p)
|
32
|
+
end
|
33
|
+
app.log_level = :verbose if clip.verbose?
|
34
|
+
app.log_level = :debug if clip.debug?
|
35
|
+
cmd.options = clip
|
36
|
+
argv.clear
|
37
|
+
argv.concat(clip.remainder)
|
38
|
+
cmd.argv = argv
|
39
|
+
cmd.run
|
40
|
+
argv
|
41
|
+
end
|
42
|
+
|
43
|
+
# build a command
|
44
|
+
def self.build(cmd_name=nil, argv=ARGV)
|
45
|
+
if Array === cmd_name
|
46
|
+
argv = cmd_name
|
47
|
+
cmd_name = nil
|
48
|
+
end
|
49
|
+
if cmd_name.nil?
|
50
|
+
cmd_name = (argv.detect {|i| i !~ /^--?/ } || 'help')
|
51
|
+
argv.delete(cmd_name)
|
52
|
+
end
|
53
|
+
app = GM.app
|
54
|
+
cmd_name = cmd_name.to_s.underscore.to_sym
|
55
|
+
cmd_class = GM::Command.commands[cmd_name]
|
56
|
+
cmd_class ||= GM::Command.commands[:help]
|
57
|
+
cmd_class.new
|
58
|
+
end
|
59
|
+
|
60
|
+
# A command can overwrite this method in order to add extra command line options.
|
61
|
+
def extra_options(options)
|
62
|
+
end
|
63
|
+
|
64
|
+
# A command must overwrite this method.
|
65
|
+
def run
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
module GM
|
3
|
+
|
4
|
+
module Documentation
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.extend GM::Documentation::ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def desc(text)
|
12
|
+
module_eval %{
|
13
|
+
def self.description
|
14
|
+
ERB.new(#{text.inspect}).result(binding)
|
15
|
+
end
|
16
|
+
}
|
17
|
+
end
|
18
|
+
def doc(text)
|
19
|
+
module_eval %{
|
20
|
+
def self.documentation
|
21
|
+
ERB.new(#{text.inspect}).result(binding)
|
22
|
+
end
|
23
|
+
}
|
24
|
+
end
|
25
|
+
def banner(text)
|
26
|
+
text = "#{File.basename($0)} #{text}" unless text.blank?
|
27
|
+
module_eval %{
|
28
|
+
def self.banner_text
|
29
|
+
#{text.inspect}
|
30
|
+
end
|
31
|
+
def banner_text; self.class.banner_text ; end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/lib/gm/helpers.rb
ADDED
data/lib/gm/loader.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
module GM
|
3
|
+
|
4
|
+
module Loader
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.extend GM::Loader::Macros
|
8
|
+
end
|
9
|
+
|
10
|
+
module Macros
|
11
|
+
|
12
|
+
def loads(name, options={})
|
13
|
+
options.reverse_merge!(
|
14
|
+
:name => name.to_s.singularize.underscore,
|
15
|
+
:includes => [],
|
16
|
+
:extends => [],
|
17
|
+
:extention => ".rb",
|
18
|
+
:collection => name.to_s.pluralize.underscore,
|
19
|
+
:only_eval => false
|
20
|
+
)
|
21
|
+
options[:extends] = [options[:extends]].flatten
|
22
|
+
options[:includes] = [options[:includes]].flatten
|
23
|
+
unless options[:only_eval]
|
24
|
+
module_eval %{
|
25
|
+
extend GM::Loader::ClassMethods
|
26
|
+
def self.load_#{options[:name]}(path)
|
27
|
+
klass = load(path, #{options.inspect})
|
28
|
+
#{options[:collection]}[klass.name] = klass
|
29
|
+
klass
|
30
|
+
end
|
31
|
+
def self.name
|
32
|
+
return @name unless @name.nil?
|
33
|
+
regexp = /^(?:[#][<]Module[:]0x[0-9a-f]+[>][:]{2})?(.+)#{options[:name].camelize}$/
|
34
|
+
@name = self.to_s
|
35
|
+
@name.gsub!(regexp, '\\1')
|
36
|
+
@name = @name.underscore.to_sym
|
37
|
+
end
|
38
|
+
def self.#{options[:collection]}
|
39
|
+
@#{options[:collection]} ||= {}
|
40
|
+
end
|
41
|
+
}
|
42
|
+
else
|
43
|
+
module_eval %{
|
44
|
+
extend GM::Loader::ClassMethods
|
45
|
+
def self.load_#{options[:name]}(path)
|
46
|
+
load(path, #{options.inspect})
|
47
|
+
true
|
48
|
+
end
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
module ClassMethods
|
56
|
+
|
57
|
+
def load(path, options={})
|
58
|
+
raise LoadError, "file missing at path: #{path}" unless File.exist?(path)
|
59
|
+
cmd_name = File.basename(path, '.rb')
|
60
|
+
cmd_name = cmd_name.camelize
|
61
|
+
|
62
|
+
mod = Module.new
|
63
|
+
options[:includes].each do |mod|
|
64
|
+
mod.send :include, mod
|
65
|
+
end
|
66
|
+
options[:extends].each do |mod|
|
67
|
+
mod.send :extend, mod
|
68
|
+
end
|
69
|
+
mod.module_eval(IO.read(path), path)
|
70
|
+
|
71
|
+
unless options[:only_eval]
|
72
|
+
cmd_class = (mod.module_eval(cmd_name) rescue nil)
|
73
|
+
|
74
|
+
raise LoadError, "Expected file to define #{cmd_name} (#{path})" if cmd_class.nil?
|
75
|
+
|
76
|
+
cmd_class
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/lib/gm/network.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
module GM
|
3
|
+
|
4
|
+
class Network
|
5
|
+
|
6
|
+
include GM::Documentation
|
7
|
+
include GM::Configuration
|
8
|
+
include GM::Helpers
|
9
|
+
include GM::System
|
10
|
+
include GM::Loader
|
11
|
+
|
12
|
+
desc ""
|
13
|
+
doc ""
|
14
|
+
|
15
|
+
loads :networks
|
16
|
+
|
17
|
+
def publish
|
18
|
+
end
|
19
|
+
|
20
|
+
def published_versions
|
21
|
+
end
|
22
|
+
|
23
|
+
def has_version?(version)
|
24
|
+
published_versions.include? version
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/lib/gm/system.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class CommandTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
before do
|
6
|
+
GM.app.reset!
|
7
|
+
end
|
8
|
+
|
9
|
+
context "load_command" do
|
10
|
+
|
11
|
+
should "return klass" do
|
12
|
+
File.expects(:exist?).with('path/to/my_command.rb').returns(true)
|
13
|
+
IO.expects(:read).with('path/to/my_command.rb').returns(%{
|
14
|
+
class MyCommand ; end
|
15
|
+
})
|
16
|
+
klass = GM::Command.load_command('path/to/my_command.rb')
|
17
|
+
assert_equal "MyCommand", klass.to_s.split('::', 2).last
|
18
|
+
end
|
19
|
+
|
20
|
+
should "return false when file doen't exist" do
|
21
|
+
File.expects(:exist?).with('path/to/my_command.rb').returns(false)
|
22
|
+
assert_raise(LoadError) { GM::Command.load_command('path/to/my_command.rb') }
|
23
|
+
end
|
24
|
+
|
25
|
+
should "return false when file doen't contain command" do
|
26
|
+
File.expects(:exist?).with('path/to/my_command.rb').returns(true)
|
27
|
+
IO.expects(:read).with('path/to/my_command.rb').returns(%{})
|
28
|
+
assert_raise(LoadError) { GM::Command.load_command('path/to/my_command.rb') }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
context "build" do
|
34
|
+
|
35
|
+
should "return instance of HelpCommand not found" do
|
36
|
+
help_cmd = mock
|
37
|
+
help_cmd_class = mock
|
38
|
+
help_cmd_class.expects(:new).returns(help_cmd)
|
39
|
+
GM::Command.commands[:hello] = help_cmd_class
|
40
|
+
cmd = GM::Command.build(:hello)
|
41
|
+
assert_equal help_cmd, cmd
|
42
|
+
end
|
43
|
+
|
44
|
+
should "return new command" do
|
45
|
+
hello_cmd = mock
|
46
|
+
hello_cmd_class = mock
|
47
|
+
hello_cmd_class.expects(:new).returns(hello_cmd)
|
48
|
+
GM::Command.commands[:hello] = hello_cmd_class
|
49
|
+
cmd = GM::Command.build(:hello)
|
50
|
+
assert_equal hello_cmd, cmd
|
51
|
+
end
|
52
|
+
|
53
|
+
should "find command name in argv if name is nil" do
|
54
|
+
argv = %w( -v hello world )
|
55
|
+
hello_cmd = mock
|
56
|
+
hello_cmd_class = mock
|
57
|
+
hello_cmd_class.expects(:new).returns(hello_cmd)
|
58
|
+
GM::Command.commands[:hello] = hello_cmd_class
|
59
|
+
cmd = GM::Command.build(argv)
|
60
|
+
assert_equal hello_cmd, cmd
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
context "run" do
|
66
|
+
|
67
|
+
should "run command and return remaining argv" do
|
68
|
+
argv = %w( -v p )
|
69
|
+
hello_cmd = mock('hello_command') do
|
70
|
+
expects(:run)
|
71
|
+
expects(:banner_text).returns("")
|
72
|
+
expects(:extra_options).with() { |value| Clip::Parser === value }
|
73
|
+
expects(:options=).with() { |value| Clip::Parser === value }
|
74
|
+
expects(:argv=).with %w( p )
|
75
|
+
end
|
76
|
+
hello_cmd_class = mock('hello_command_class') do
|
77
|
+
expects(:new).returns(hello_cmd)
|
78
|
+
end
|
79
|
+
GM::Command.commands[:hello] = hello_cmd_class
|
80
|
+
assert_equal %w( p ), GM::Command.run(:hello, argv)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "find command name in argv if name is nil" do
|
84
|
+
argv = %w( -v hello p )
|
85
|
+
hello_cmd = mock('hello_command') do
|
86
|
+
expects(:run)
|
87
|
+
expects(:banner_text).returns("")
|
88
|
+
expects(:extra_options).with() { |value| Clip::Parser === value }
|
89
|
+
expects(:options=).with() { |value| Clip::Parser === value }
|
90
|
+
expects(:argv=).with %w( p )
|
91
|
+
end
|
92
|
+
hello_cmd_class = mock('hello_command_class') do
|
93
|
+
expects(:new).returns(hello_cmd)
|
94
|
+
end
|
95
|
+
GM::Command.commands[:hello] = hello_cmd_class
|
96
|
+
assert_equal %w( p ), GM::Command.run(argv)
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
should "retrun GM.app for #app" do
|
103
|
+
assert_equal GM.app, GM::Command.new.send(:app)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class GemExtentionsTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
should "find recent files" do
|
6
|
+
gems = Gem.searcher.find_all('autotest/discover.rb')
|
7
|
+
gems = gems.inject({}) do |specs, spec|
|
8
|
+
specs[spec.name] = spec if specs[spec.name].nil? or (spec <=> specs[spec.name]) == 1
|
9
|
+
specs
|
10
|
+
end.values
|
11
|
+
paths = gems.collect do |gem|
|
12
|
+
Gem.searcher.matching_files gem, 'autotest/discover.rb'
|
13
|
+
end.flatten.compact
|
14
|
+
|
15
|
+
assert_equal paths, Gem.find_recent_files('autotest/discover.rb')
|
16
|
+
end
|
17
|
+
|
18
|
+
should "find_recent_resources" do
|
19
|
+
gems = Gem.searcher.find_all('autotest/discover.rb')
|
20
|
+
gems = gems.inject({}) do |specs, spec|
|
21
|
+
specs[spec.name] = spec if specs[spec.name].nil? or (spec <=> specs[spec.name]) == 1
|
22
|
+
specs
|
23
|
+
end.values
|
24
|
+
paths = gems.collect do |gem|
|
25
|
+
Gem.searcher.matching_files gem, 'autotest/discover.rb'
|
26
|
+
end.flatten.compact
|
27
|
+
|
28
|
+
assert_equal paths, Gem.find_recent_resources('lib/autotest/discover.rb')
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|