bundlemate 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/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +13 -0
- data/README.txt +26 -0
- data/Rakefile +34 -0
- data/bin/bundlemate +14 -0
- data/lib/bundle_mate.rb +29 -0
- data/lib/bundle_mate/application.rb +161 -0
- data/lib/bundle_mate/bundle.rb +87 -0
- data/spec/application_spec.rb +211 -0
- data/spec/bundle_spec.rb +91 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +6 -0
- metadata +89 -0
data/History.txt
ADDED
data/License.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2007 Luke Redpath
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
History.txt
|
2
|
+
License.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.txt
|
5
|
+
Rakefile
|
6
|
+
bin/bundlemate
|
7
|
+
lib/bundle_mate.rb
|
8
|
+
lib/bundle_mate/application.rb
|
9
|
+
lib/bundle_mate/bundle.rb
|
10
|
+
spec/application_spec.rb
|
11
|
+
spec/bundle_spec.rb
|
12
|
+
spec/spec.opts
|
13
|
+
spec/spec_helper.rb
|
data/README.txt
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
bundlemate
|
2
|
+
by Luke Redpath
|
3
|
+
|
4
|
+
== DESCRIPTION:
|
5
|
+
|
6
|
+
Bundlemate is a simple CLI bundle manager for TextMate.
|
7
|
+
|
8
|
+
== FEATURES/PROBLEMS:
|
9
|
+
|
10
|
+
* List bundles available in the Macromates repository
|
11
|
+
* Install, uninstall and update bundles
|
12
|
+
* Install bundles from third-party repositories
|
13
|
+
* Automatic reloading of TextMate bundles.
|
14
|
+
|
15
|
+
== SYNOPSIS:
|
16
|
+
|
17
|
+
Run 'bundlemate help' for instructions.
|
18
|
+
|
19
|
+
== REQUIREMENTS:
|
20
|
+
|
21
|
+
* simpleconsole >= 0.1.1
|
22
|
+
* plist >= 3.0.0
|
23
|
+
|
24
|
+
== INSTALL:
|
25
|
+
|
26
|
+
* sudo gem install bundlemate --include-dependencies
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'hoe'
|
3
|
+
require './lib/bundle_mate'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'spec/rake/spectask'
|
7
|
+
rescue LoadError
|
8
|
+
puts 'To use rspec for testing you must install rspec gem:'
|
9
|
+
puts '$ sudo gem install rspec'
|
10
|
+
exit
|
11
|
+
end
|
12
|
+
|
13
|
+
Hoe.new('bundlemate', BundleMate::VERSION::STRING) do |p|
|
14
|
+
p.rubyforge_name = 'ljr'
|
15
|
+
p.author = 'Luke Redpath'
|
16
|
+
p.email = 'contact@lukeredpath.co.uk'
|
17
|
+
p.summary = 'A command-line TextMate bundle manager.'
|
18
|
+
p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
|
19
|
+
p.url = '' # p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
|
20
|
+
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
21
|
+
p.extra_deps = [ ['plist', '>= 3.0.0'], ['simpleconsole', '>= 0.1.1'] ]
|
22
|
+
p.test_globs = ["spec/**/*_spec.rb"]
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Run the specs under spec/models"
|
26
|
+
Spec::Rake::SpecTask.new do |t|
|
27
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
28
|
+
t.spec_files = FileList['spec/*_spec.rb']
|
29
|
+
end
|
30
|
+
|
31
|
+
Rake::Task['default'].prerequisites.clear
|
32
|
+
|
33
|
+
desc "Default task is to run specs"
|
34
|
+
task :default => :spec
|
data/bin/bundlemate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
local_libs = [
|
4
|
+
File.join(File.dirname(__FILE__), *%w[../lib/bundle_mate])
|
5
|
+
]
|
6
|
+
|
7
|
+
if File.exist?(local_libs.first)
|
8
|
+
local_libs.each { |lib| require lib }
|
9
|
+
else
|
10
|
+
require 'rubygems'
|
11
|
+
require 'bundlemate'
|
12
|
+
end
|
13
|
+
|
14
|
+
BundleMate::Application.run(ARGV)
|
data/lib/bundle_mate.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module BundleMate
|
2
|
+
MACROMATES_REPOSITORY = 'http://macromates.com/svn/Bundles/trunk/Bundles/'
|
3
|
+
|
4
|
+
def self.reload_textmate_bundles!
|
5
|
+
system("osascript -e 'tell app \"TextMate\" to reload bundles'")
|
6
|
+
end
|
7
|
+
|
8
|
+
module VERSION #:nodoc:
|
9
|
+
MAJOR = 0
|
10
|
+
MINOR = 1
|
11
|
+
TINY = 0
|
12
|
+
|
13
|
+
STRING = [MAJOR, MINOR, TINY].join('.')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class String
|
18
|
+
def sanitize_html
|
19
|
+
gsub(/<\/?[^>]*>/, "")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
%w( bundle_mate/bundle
|
24
|
+
bundle_mate/application ).each { |lib|
|
25
|
+
|
26
|
+
require File.join(File.dirname(__FILE__), lib)
|
27
|
+
}
|
28
|
+
|
29
|
+
BundleMate::Bundle.local_bundle_path = File.expand_path("~/Library/Application Support/TextMate/Bundles")
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'simpleconsole'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module BundleMate #:nodoc:
|
5
|
+
class Application < SimpleConsole::Application #:nodoc:
|
6
|
+
|
7
|
+
def self.run(input)
|
8
|
+
super(input, Controller, View)
|
9
|
+
end
|
10
|
+
|
11
|
+
class Controller < SimpleConsole::Controller
|
12
|
+
params :string => {:u => :url},
|
13
|
+
:int => {:r => :revision},
|
14
|
+
:bool => {:y => :noprompt}
|
15
|
+
|
16
|
+
before_filter :prepare_environment
|
17
|
+
before_filter :create_local_repository, :only => [:install]
|
18
|
+
after_filter :reload_textmate_bundles, :only => [:install, :uninstall, :update]
|
19
|
+
|
20
|
+
def default
|
21
|
+
render :action => :help
|
22
|
+
end
|
23
|
+
|
24
|
+
def list
|
25
|
+
@bundle_list = Bundle.remote_bundle_list
|
26
|
+
end
|
27
|
+
|
28
|
+
def info
|
29
|
+
@bundle = Bundle.from_macromates(params[:id])
|
30
|
+
@description = @bundle.meta_data('description').sanitize_html
|
31
|
+
end
|
32
|
+
|
33
|
+
def install
|
34
|
+
if params[:url]
|
35
|
+
@bundle = Bundle.new(params[:url])
|
36
|
+
else
|
37
|
+
@bundle = Bundle.from_macromates(params[:id])
|
38
|
+
end
|
39
|
+
|
40
|
+
if @bundle.installed?
|
41
|
+
puts "\n** #{@bundle.name} bundle is already installed. Use 'update' command instead. **\n\n"
|
42
|
+
else
|
43
|
+
revision = params[:revision] || 'HEAD'
|
44
|
+
puts "\n** Installing #{@bundle.name} (revision: #{revision}) **\n\n"
|
45
|
+
@result = @bundle.install(revision)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def update
|
50
|
+
@bundle = Bundle.from_macromates(params[:id])
|
51
|
+
@result = @bundle.update
|
52
|
+
end
|
53
|
+
|
54
|
+
def update_all
|
55
|
+
Bundle.installed_bundles.each do |bundle|
|
56
|
+
puts "\n** Updating #{bundle.name} bundle. **"
|
57
|
+
bundle.update
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def uninstall
|
62
|
+
@bundle = Bundle.from_macromates(params[:id])
|
63
|
+
uninstall_method = params[:noprompt] ? :uninstall : :uninstall_with_confirmation
|
64
|
+
|
65
|
+
unless @bundle.installed?
|
66
|
+
@already_uninstalled = true
|
67
|
+
else
|
68
|
+
@result = @bundle.send(uninstall_method)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def prepare_environment
|
74
|
+
ENV['LC_CTYPE'] = 'en_US.UTF-8'
|
75
|
+
ENV['LC_ALL'] = nil
|
76
|
+
end
|
77
|
+
|
78
|
+
def create_local_repository
|
79
|
+
FileUtils.mkdir_p(BundleMate::Bundle.local_bundle_path)
|
80
|
+
end
|
81
|
+
|
82
|
+
def reload_textmate_bundles
|
83
|
+
BundleMate.reload_textmate_bundles!
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class View < SimpleConsole::View
|
88
|
+
def list
|
89
|
+
puts "\n** AVAILABLE BUNDLES **\n\n"
|
90
|
+
@bundle_list.each { |name| puts "- #{name}" }
|
91
|
+
puts "\nA total of #{@bundle_list.length} bundles were found."
|
92
|
+
end
|
93
|
+
|
94
|
+
def info
|
95
|
+
puts "\n** #{@bundle.name} Bundle **"
|
96
|
+
puts "#{@description}\n\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
def install
|
100
|
+
if @result
|
101
|
+
puts "\n** #{@bundle.name} bundle installed successfully. **"
|
102
|
+
else
|
103
|
+
puts "\n** AN ERROR OCCURRED INSTALLING #{@bundle.name} BUNDLE **"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def update
|
108
|
+
if @result
|
109
|
+
puts "\n** #{@bundle.name} bundle updated successfully. **"
|
110
|
+
else
|
111
|
+
puts "\n** AN ERROR OCCURRED UPDATING #{@bundle.name} BUNDLE **"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def uninstall
|
116
|
+
if @already_uninstalled
|
117
|
+
puts "\n** #{@bundle.name} bundle is not installed. **\n\n"
|
118
|
+
return
|
119
|
+
end
|
120
|
+
if @result
|
121
|
+
puts "\n** #{@bundle.name} bundle uninstalled successfully. **"
|
122
|
+
else
|
123
|
+
puts "\n** #{@bundle.name} could not be uninstalled. **"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def help
|
128
|
+
version = BundleMate::VERSION::STRING
|
129
|
+
|
130
|
+
puts %(
|
131
|
+
Bundlemate Utility #{version}
|
132
|
+
========================
|
133
|
+
|
134
|
+
Bundlemate is a command utility for managing TextMate bundles.
|
135
|
+
|
136
|
+
Usage:
|
137
|
+
bundlemate command [args] [options]
|
138
|
+
|
139
|
+
Available commands:
|
140
|
+
list # List available bundles in the remote repository.
|
141
|
+
info [name] # Display the bundle description.
|
142
|
+
install [name] # Install bundle [name]
|
143
|
+
update [name] # Download the latest updates for bundle [name]
|
144
|
+
uninstall [name] # Remove bundle [name] completely
|
145
|
+
update_all # Update all installed bundles
|
146
|
+
help # Displays this help text
|
147
|
+
|
148
|
+
Examples:
|
149
|
+
bundlemate install Ruby # install Ruby.tmbundle
|
150
|
+
bundlemate update Ruby # download the latest Ruby.rmbundle updates
|
151
|
+
bundlemate unisntall Ruby # remove the bundle completely
|
152
|
+
|
153
|
+
Note:
|
154
|
+
It is not necessary to reload TextMate's bundles manually, bundlemate
|
155
|
+
will do this automatically when installing/updating/uninstalling a bundle.
|
156
|
+
)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'plist'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module BundleMate
|
6
|
+
|
7
|
+
class Bundle
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
def initialize(bundle_url)
|
11
|
+
@url = bundle_url
|
12
|
+
@name = File.basename(bundle_url, '.tmbundle')
|
13
|
+
end
|
14
|
+
|
15
|
+
def installed?
|
16
|
+
File.exist?(local_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
def meta_data(key)
|
20
|
+
(@meta_data ||= remote_plist)[key]
|
21
|
+
end
|
22
|
+
|
23
|
+
def install(revision = 'HEAD')
|
24
|
+
system("cd '#{self.class.local_bundle_path}' && svn co -r#{revision} #{remote_url}")
|
25
|
+
end
|
26
|
+
|
27
|
+
def update
|
28
|
+
system("cd '#{local_path}' && svn up")
|
29
|
+
end
|
30
|
+
|
31
|
+
def uninstall_with_confirmation
|
32
|
+
with_confirmation("About to remove #{local_path}.") do
|
33
|
+
uninstall
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def uninstall
|
38
|
+
FileUtils.rm_rf(local_path)
|
39
|
+
end
|
40
|
+
|
41
|
+
class << self
|
42
|
+
attr_accessor :local_bundle_path
|
43
|
+
|
44
|
+
def from_macromates(bundle_name)
|
45
|
+
new(File.join(BundleMate::MACROMATES_REPOSITORY, bundle_name + '.tmbundle'))
|
46
|
+
end
|
47
|
+
|
48
|
+
def installed_bundles
|
49
|
+
Dir["#{local_bundle_path}/**/*.tmbundle"].map do |bundle_path|
|
50
|
+
new(File.basename(bundle_path, '.tmbundle'))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def remote_bundle_list(repository = BundleMate::MACROMATES_REPOSITORY)
|
55
|
+
`svn ls #{repository}`.split("\n").map do |bundle|
|
56
|
+
bundle_name = bundle.match(/(.*)\.tmbundle\/$/)[1]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def with_confirmation(confirmation_message, &block)
|
63
|
+
puts confirmation_message
|
64
|
+
print "Proceed? "
|
65
|
+
input = $stdin.gets.strip
|
66
|
+
yield if input =~ /^(yes|Yes|y|Y)/
|
67
|
+
end
|
68
|
+
|
69
|
+
def local_path
|
70
|
+
File.join(self.class.local_bundle_path, bundle_file_name)
|
71
|
+
end
|
72
|
+
|
73
|
+
def bundle_file_name
|
74
|
+
@name + '.tmbundle'
|
75
|
+
end
|
76
|
+
|
77
|
+
def remote_plist
|
78
|
+
plist_xml = open(File.join(remote_url, 'info.plist')).read
|
79
|
+
Plist.parse_xml(plist_xml)
|
80
|
+
end
|
81
|
+
|
82
|
+
def remote_url
|
83
|
+
URI.encode(@url)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), *%w[spec_helper])
|
2
|
+
|
3
|
+
module BundleMate
|
4
|
+
|
5
|
+
describe Application, " when invoking the list command" do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
$stdout = @recorder = StringIO.new
|
9
|
+
BundleMate.stubs(:reload_textmate_bundles!)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should print bundle list to STDOUT" do
|
13
|
+
Bundle.stubs(:remote_bundle_list).returns(%w(bundle_one bundle_two))
|
14
|
+
BundleMate::Application.run(%w(list))
|
15
|
+
|
16
|
+
@recorder.rewind
|
17
|
+
output = @recorder.read
|
18
|
+
output.should match(/bundle_one/)
|
19
|
+
output.should match(/bundle_two/)
|
20
|
+
end
|
21
|
+
|
22
|
+
after(:each) do
|
23
|
+
$stdout = STDOUT
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe Application, " when invoking the info command" do
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
$stdout = @recorder = StringIO.new
|
32
|
+
BundleMate.stubs(:reload_textmate_bundles!)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should download bundle information from repository and display its description" do
|
36
|
+
bundle = stub('bundle', :installed? => false, :name => 'Ruby')
|
37
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
38
|
+
bundle.stubs(:meta_data).with('description').returns('My awesome bundle')
|
39
|
+
BundleMate::Application.run(%w(info Ruby))
|
40
|
+
|
41
|
+
@recorder.rewind
|
42
|
+
output = @recorder.read
|
43
|
+
output.should match(/My awesome bundle/)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should sanitize bundle of html description before displaying" do
|
47
|
+
bundle = stub('bundle', :installed? => false, :name => 'Ruby')
|
48
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
49
|
+
bundle.stubs(:meta_data).with('description').returns(description = 'My <b>awesome</b> bundle')
|
50
|
+
BundleMate::Application.run(%w(info Ruby))
|
51
|
+
|
52
|
+
@recorder.rewind
|
53
|
+
output = @recorder.read
|
54
|
+
output.should match(/My awesome bundle/)
|
55
|
+
end
|
56
|
+
|
57
|
+
after(:each) do
|
58
|
+
$stdout = STDOUT
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
describe Application, " when invoking the install command" do
|
64
|
+
|
65
|
+
before(:each) do
|
66
|
+
$stdout = @recorder = StringIO.new
|
67
|
+
BundleMate.stubs(:reload_textmate_bundles!)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should install bundle from Macromates repository at HEAD revision" do
|
71
|
+
bundle = stub('bundle', :installed? => false, :name => 'Ruby')
|
72
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
73
|
+
bundle.expects(:install).with('HEAD')
|
74
|
+
BundleMate::Application.run(%w(install Ruby))
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should print error message and not try and install bundle if bundle is already installed" do
|
78
|
+
bundle = stub('bundle', :installed? => true, :name => 'Ruby')
|
79
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
80
|
+
bundle.expects(:install).never
|
81
|
+
BundleMate::Application.run(%w(install Ruby))
|
82
|
+
@recorder.rewind
|
83
|
+
output = @recorder.read
|
84
|
+
output.should match(/already installed/)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should print error message if bundle installation fails" do
|
88
|
+
bundle = stub('bundle', :installed? => false, :name => 'Ruby')
|
89
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
90
|
+
bundle.expects(:install).returns(false)
|
91
|
+
BundleMate::Application.run(%w(install Ruby))
|
92
|
+
@recorder.rewind
|
93
|
+
output = @recorder.read
|
94
|
+
output.should match(/ERROR OCCURRED INSTALLING/)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should install bundle from specific URL if specified" do
|
98
|
+
bundle = stub('bundle', :installed? => false, :name => 'Ruby')
|
99
|
+
Bundle.stubs(:new).with('svn://myrepo.org/Ruby.tmbundle').returns(bundle)
|
100
|
+
bundle.expects(:install).with(anything).returns(true)
|
101
|
+
BundleMate::Application.run(%w(install --url svn://myrepo.org/Ruby.tmbundle))
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should install bundle at specific revision if specified" do
|
105
|
+
bundle = stub('bundle', :installed? => false, :name => 'Ruby')
|
106
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
107
|
+
bundle.expects(:install).with(1234)
|
108
|
+
BundleMate::Application.run(%w(install Ruby --revision 1234))
|
109
|
+
end
|
110
|
+
|
111
|
+
after(:each) do
|
112
|
+
$stdout = STDOUT
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
describe Application, " when invoking the update command" do
|
118
|
+
|
119
|
+
before(:each) do
|
120
|
+
$stdout = @recorder = StringIO.new
|
121
|
+
BundleMate.stubs(:reload_textmate_bundles!)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should print bundle list to STDOUT" do
|
125
|
+
bundle = stub('bundle', :name => 'Ruby')
|
126
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
127
|
+
bundle.expects(:update).returns(true)
|
128
|
+
BundleMate::Application.run(%w(update Ruby))
|
129
|
+
|
130
|
+
@recorder.rewind
|
131
|
+
output = @recorder.read
|
132
|
+
output.should match(/updated successfully/)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should print an error message if update fails" do
|
136
|
+
bundle = stub('bundle', :name => 'Ruby')
|
137
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
138
|
+
bundle.expects(:update).returns(false)
|
139
|
+
BundleMate::Application.run(%w(update Ruby))
|
140
|
+
|
141
|
+
@recorder.rewind
|
142
|
+
output = @recorder.read
|
143
|
+
output.should match(/ERROR OCCURRED UPDATING/)
|
144
|
+
end
|
145
|
+
|
146
|
+
after(:each) do
|
147
|
+
$stdout = STDOUT
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
describe Application, " when invoking the update_all command" do
|
153
|
+
|
154
|
+
before(:each) do
|
155
|
+
$stdout = @recorder = StringIO.new
|
156
|
+
BundleMate.stubs(:reload_textmate_bundles!)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should update all installed bundles" do
|
160
|
+
bundle = stub('bundle', :name => 'Ruby')
|
161
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
162
|
+
Bundle.stubs(:installed_bundles).returns([
|
163
|
+
b1 = stub_everything('bundle'),
|
164
|
+
b2 = stub_everything('bundle'),
|
165
|
+
b3 = stub_everything('bundle')
|
166
|
+
])
|
167
|
+
[b1, b2, b3].each { |bundle| bundle.expects(:update) }
|
168
|
+
BundleMate::Application.run(%w(update_all))
|
169
|
+
end
|
170
|
+
|
171
|
+
after(:each) do
|
172
|
+
$stdout = STDOUT
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
describe Application, " when invoking the uninstall command" do
|
178
|
+
|
179
|
+
before(:each) do
|
180
|
+
$stdout = @recorder = StringIO.new
|
181
|
+
BundleMate.stubs(:reload_textmate_bundles!)
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should uninstall the specified bundle with confirmation" do
|
185
|
+
bundle = stub('bundle', :name => 'Ruby', :installed? => true)
|
186
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
187
|
+
bundle.expects(:uninstall_with_confirmation).returns(true)
|
188
|
+
BundleMate::Application.run(%w(uninstall Ruby))
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should uninstall the specified bundle without confirmation if the -y switch is set" do
|
192
|
+
bundle = stub('bundle', :name => 'Ruby', :installed? => true)
|
193
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
194
|
+
bundle.expects(:uninstall).returns(true)
|
195
|
+
BundleMate::Application.run(%w(uninstall Ruby -y))
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should display an error if the specified bundle is not installed" do
|
199
|
+
bundle = stub('bundle', :name => 'Ruby', :installed? => false)
|
200
|
+
Bundle.stubs(:from_macromates).with('Ruby').returns(bundle)
|
201
|
+
bundle.expects(:uninstall).never
|
202
|
+
BundleMate::Application.run(%w(uninstall Ruby))
|
203
|
+
end
|
204
|
+
|
205
|
+
after(:each) do
|
206
|
+
$stdout = STDOUT
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
data/spec/bundle_spec.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), *%w[spec_helper])
|
2
|
+
|
3
|
+
describe "Bundle" do
|
4
|
+
before(:all) do
|
5
|
+
BundleMate::Bundle.local_bundle_path = '/tmp/bundles'
|
6
|
+
end
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@bundle = BundleMate::Bundle.new('http://example.com/bundles/example_bundle.tmbundle')
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should report installed if bundle folder exists" do
|
13
|
+
File.stubs(:exist?).with("/tmp/bundles/example_bundle.tmbundle").returns(true)
|
14
|
+
@bundle.should be_installed
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should report not installed if bundle folder does not exist" do
|
18
|
+
File.stubs(:exist?).with("/tmp/bundles/example_bundle.tmbundle").returns(false)
|
19
|
+
@bundle.should_not be_installed
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return meta data from remote plist file" do
|
23
|
+
plist = stub('io', :read => 'plist data')
|
24
|
+
@bundle.stubs(:open).with("http://example.com/bundles/example_bundle.tmbundle/info.plist").returns(plist)
|
25
|
+
Plist.stubs(:parse_xml).with('plist data').returns({'description' => 'an example bundle'})
|
26
|
+
@bundle.meta_data('description').should == 'an example bundle'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "Bundle", " when installing" do
|
31
|
+
before(:all) do
|
32
|
+
BundleMate::Bundle.local_bundle_path = '/tmp/bundles'
|
33
|
+
end
|
34
|
+
|
35
|
+
before(:each) do
|
36
|
+
@bundle = BundleMate::Bundle.new('http://example.com/bundles/example_bundle.tmbundle')
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should checkout remote bundle at HEAD to local bundle path" do
|
40
|
+
@bundle.expects(:system).with("cd '/tmp/bundles' && svn co -rHEAD http://example.com/bundles/example_bundle.tmbundle")
|
41
|
+
@bundle.install
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should checkout specific revision if specified" do
|
45
|
+
@bundle.expects(:system).with("cd '/tmp/bundles' && svn co -r1234 http://example.com/bundles/example_bundle.tmbundle")
|
46
|
+
@bundle.install(1234)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "Bundle", " when updating" do
|
51
|
+
before(:all) do
|
52
|
+
BundleMate::Bundle.local_bundle_path = '/tmp/bundles'
|
53
|
+
end
|
54
|
+
|
55
|
+
before(:each) do
|
56
|
+
@bundle = BundleMate::Bundle.new('example_bundle')
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should run a subversion update against local path for bundle" do
|
60
|
+
@bundle.expects(:system).with("cd '/tmp/bundles/example_bundle.tmbundle' && svn up")
|
61
|
+
@bundle.update
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "Bundle", " when uninstalling" do
|
66
|
+
before(:all) do
|
67
|
+
BundleMate::Bundle.local_bundle_path = '/tmp/bundles'
|
68
|
+
end
|
69
|
+
|
70
|
+
before(:each) do
|
71
|
+
@bundle = BundleMate::Bundle.new('example_bundle')
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should delete bundle folder from system" do
|
75
|
+
FileUtils.expects(:rm_rf).with('/tmp/bundles/example_bundle.tmbundle')
|
76
|
+
@bundle.uninstall
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "Asking for all installed_bundles" do
|
81
|
+
it "should return a bundle for each locally installed bundle" do
|
82
|
+
Dir.stubs(:[]).with("/tmp/bundles/**/*.tmbundle").returns(%w(
|
83
|
+
bundle_one.tmbundle/ bundle_two.tmbundle/ bundle_three.tmbundle/
|
84
|
+
))
|
85
|
+
bundles = BundleMate::Bundle.installed_bundles
|
86
|
+
bundles.size.should == 3
|
87
|
+
bundles[0].name.should == 'bundle_one'
|
88
|
+
bundles[1].name.should == 'bundle_two'
|
89
|
+
bundles[2].name.should == 'bundle_three'
|
90
|
+
end
|
91
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.2
|
3
|
+
specification_version: 1
|
4
|
+
name: bundlemate
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2007-11-01 00:00:00 +00:00
|
8
|
+
summary: A command-line TextMate bundle manager.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: contact@lukeredpath.co.uk
|
12
|
+
homepage:
|
13
|
+
rubyforge_project: ljr
|
14
|
+
description: "== FEATURES/PROBLEMS: * List bundles available in the Macromates repository * Install, uninstall and update bundles * Install bundles from third-party repositories * Automatic reloading of TextMate bundles. == SYNOPSIS: Run 'bundlemate help' for instructions. == REQUIREMENTS:"
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Luke Redpath
|
31
|
+
files:
|
32
|
+
- History.txt
|
33
|
+
- License.txt
|
34
|
+
- Manifest.txt
|
35
|
+
- README.txt
|
36
|
+
- Rakefile
|
37
|
+
- bin/bundlemate
|
38
|
+
- lib/bundle_mate.rb
|
39
|
+
- lib/bundle_mate/application.rb
|
40
|
+
- lib/bundle_mate/bundle.rb
|
41
|
+
- spec/application_spec.rb
|
42
|
+
- spec/bundle_spec.rb
|
43
|
+
- spec/spec.opts
|
44
|
+
- spec/spec_helper.rb
|
45
|
+
test_files:
|
46
|
+
- spec/application_spec.rb
|
47
|
+
- spec/bundle_spec.rb
|
48
|
+
rdoc_options:
|
49
|
+
- --main
|
50
|
+
- README.txt
|
51
|
+
extra_rdoc_files:
|
52
|
+
- History.txt
|
53
|
+
- License.txt
|
54
|
+
- Manifest.txt
|
55
|
+
- README.txt
|
56
|
+
executables:
|
57
|
+
- bundlemate
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
requirements: []
|
61
|
+
|
62
|
+
dependencies:
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: plist
|
65
|
+
version_requirement:
|
66
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 3.0.0
|
71
|
+
version:
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: simpleconsole
|
74
|
+
version_requirement:
|
75
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 0.1.1
|
80
|
+
version:
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: hoe
|
83
|
+
version_requirement:
|
84
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 1.3.0
|
89
|
+
version:
|