rapt 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ = 0.2.0
2
+
3
+ * Added search
4
+ * Added --force-http option to force http download method [LR]
5
+ * Added --svn option to add installed files to subversion with svn add [LR]
1
6
 
2
7
  = 0.1.0
3
8
 
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ $:.unshift(File.dirname(__FILE__) + "/lib/commands")
10
10
  require 'plugin'
11
11
 
12
12
  PKG_NAME = 'rapt'
13
- PKG_VERSION = '0.1.0'
13
+ PKG_VERSION = '0.2.0'
14
14
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
15
15
 
16
16
  RELEASE_NAME = "REL #{PKG_VERSION}"
@@ -30,7 +30,7 @@ end
30
30
  # Genereate the RDoc documentation
31
31
  Rake::RDocTask.new { |rdoc|
32
32
  rdoc.rdoc_dir = 'doc'
33
- rdoc.title = "Rapt -- Rails plugin manager"
33
+ rdoc.title = "RaPT -- Rails Plugin Tool"
34
34
  rdoc.template = "#{ENV['template']}.rb" if ENV['template']
35
35
  rdoc.rdoc_files.include('README', 'CHANGELOG')
36
36
  rdoc.rdoc_files.include('lib/plugin.rb')
@@ -41,14 +41,14 @@ Rake::RDocTask.new { |rdoc|
41
41
  spec = Gem::Specification.new do |s|
42
42
  s.platform = Gem::Platform::RUBY
43
43
  s.name = PKG_NAME
44
- s.summary = "Rails plugin manager."
44
+ s.summary = "Rails Plugin Tool."
45
45
  s.description = %q{Install, remove, and discover new plugins for your Ruby on Rails app.}
46
46
  s.version = PKG_VERSION
47
47
 
48
48
  s.authors = ["Ryan Tomayko", "Geoffrey Grosenbach"]
49
49
  s.email = "boss@topfunky.com"
50
50
  s.rubyforge_project = RUBY_FORGE_PROJECT
51
- s.homepage = "http://nubyonrails.com/pages/rapt"
51
+ s.homepage = "http://rapt.rubyforge.org"
52
52
 
53
53
  s.has_rdoc = false
54
54
  s.requirements << 'none'
data/bin/rapt CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  require "commands/plugin"
4
4
 
@@ -60,6 +60,7 @@ require File.dirname(__FILE__) + '/plugin/repositories'
60
60
  require File.dirname(__FILE__) + '/plugin/repository'
61
61
  require File.dirname(__FILE__) + '/plugin/commands'
62
62
  require File.dirname(__FILE__) + '/plugin/recursive_http_fetcher'
63
+ require File.dirname(__FILE__) + '/plugin/plugin_pack'
63
64
 
64
65
 
65
66
 
@@ -38,15 +38,19 @@ module Commands
38
38
  o.separator ""
39
39
  o.separator "COMMANDS"
40
40
 
41
- o.separator " discover Discover plugin repositories."
42
- o.separator " list List available plugins."
43
- o.separator " about Show basic info about a plugin."
44
- o.separator " install Install plugin(s) from known repositories or URLs."
45
- o.separator " update Update installed plugins."
46
- o.separator " remove Uninstall plugins."
47
- o.separator " source Add a plugin source repository."
48
- o.separator " unsource Remove a plugin repository."
49
- o.separator " sources List currently configured plugin repositories."
41
+ o.separator " discover Discover plugin repositories."
42
+ o.separator " list List available plugins."
43
+ o.separator " search Search for available plugins."
44
+ o.separator " about Show basic info about a plugin."
45
+ o.separator " install Install plugin(s) from known repositories or URLs."
46
+ o.separator " update Update installed plugins."
47
+ o.separator " remove Uninstall plugins."
48
+ o.separator " source Add a plugin source repository."
49
+ o.separator " unsource Remove a plugin repository."
50
+ o.separator " sources List currently configured plugin repositories."
51
+ o.separator " pack:install Install plugins from plugin pack file or URL"
52
+ o.separator " pack:uninstall Uninstall plugins from plugin pack file or URL"
53
+ o.separator " pack:about Display plugin pack information"
50
54
 
51
55
  o.separator ""
52
56
  o.separator "EXAMPLES"
@@ -62,6 +66,8 @@ module Commands
62
66
  o.separator " #{@script_name} list\n"
63
67
  o.separator " List plugins in the specified repository:"
64
68
  o.separator " #{@script_name} list --source=http://dev.rubyonrails.com/svn/rails/plugins/\n"
69
+ o.separator " Search available plugins:"
70
+ o.separator " #{@script_name} search \"authentication\"\n"
65
71
  o.separator " Discover and prompt to add new repositories:"
66
72
  o.separator " #{@script_name} discover\n"
67
73
  o.separator " Discover new repositories but just list them, don't add anything:"
@@ -74,6 +80,10 @@ module Commands
74
80
  o.separator " #{@script_name} sources\n"
75
81
  o.separator " Show the options for the list command:"
76
82
  o.separator " #{@script_name} list -h\n"
83
+ o.separator " Install a plugin pack:"
84
+ o.separator " #{@script_name} pack:install http://opensource.agileevolved.com/pluginpacks/standard.pluginpack\n"
85
+ o.separator " View plugin pack meta data:"
86
+ o.separator " #{@script_name} pack:about http://opensource.agileevolved.com/pluginpacks/standard.pluginpack\n"
77
87
  end
78
88
  end
79
89
 
@@ -82,9 +92,13 @@ module Commands
82
92
  options.parse!(general)
83
93
 
84
94
  command = general.shift
85
- if command =~ /^(list|discover|install|source|unsource|sources|remove|update|about)$/
95
+ if command =~ /^(list|discover|install|source|unsource|sources|remove|update|about|search)$/
86
96
  command = Commands.const_get(command.capitalize).new(self)
87
97
  command.parse!(sub)
98
+ elsif command =~ /^(pack:install|pack:uninstall|pack:about)$/
99
+ command_name = command.split(':')[1]
100
+ command = Commands::Pack.const_get(command_name.capitalize).new(self)
101
+ command.parse!(sub)
88
102
  else
89
103
  puts "Unknown command: #{command}"
90
104
  puts options
@@ -332,10 +346,12 @@ module Commands
332
346
  end
333
347
 
334
348
  class Install
349
+ @@default_method = :http
350
+
335
351
  def initialize(base_command)
336
352
  @base_command = base_command
337
- @method = :http
338
- @options = { :quiet => false, :revision => nil, :force => false }
353
+ @method = @@default_method
354
+ @options = { :quiet => false, :revision => nil, :force => false, :force_http => false }
339
355
  end
340
356
 
341
357
  def options
@@ -359,6 +375,12 @@ module Commands
359
375
  "Ignored if subversion is not used.") { |v| @options[:revision] = v }
360
376
  o.on( "-f", "--force",
361
377
  "Reinstalls a plugin if it's already installed.") { |v| @options[:force] = true }
378
+ o.on( "-c", "--svn",
379
+ "Modify files with subversion. (Note: svn must be in path)") { |v| @options[:svn] = true }
380
+ o.on( "-h", "--force-http",
381
+ "Forces download in HTTP mode") { |v| @options[:force_http] = true }
382
+ o.on( "--version",
383
+ "Install a specific version of a plugin") { |v| @options[:version] = v }
362
384
  o.separator ""
363
385
  o.separator "You can specify plugin names as given in 'plugin list' output or absolute URLs to "
364
386
  o.separator "a plugin repository."
@@ -366,8 +388,9 @@ module Commands
366
388
  end
367
389
 
368
390
  def determine_install_method
391
+ return :http if @options[:force_http]
369
392
  best = @base_command.environment.best_install_method?
370
- @method = :http if best == :http and @method == :export
393
+ @method = @@default_method if best == :http and @method == :export
371
394
  case
372
395
  when (best == :http and @method != :http)
373
396
  msg = "Cannot install using subversion because `svn' cannot be found in your PATH"
@@ -389,11 +412,48 @@ module Commands
389
412
  install_method = determine_install_method
390
413
  puts "Plugins will be installed using #{install_method}" if $verbose
391
414
  args.each do |name|
392
- ::Plugin.find(name).install(install_method, @options)
415
+ plugin = ::Plugin.find(name)
416
+ if @options[:version]
417
+ if plugin.versions[@options[:version]].nil?
418
+ puts "Invalid plugin version."
419
+ exit 1
420
+ end
421
+ else
422
+ set_chosen_version(plugin)
423
+ end
424
+ plugin.install(install_method, @options)
425
+ environment.add_plugin_to_svn(plugin.name) if @options[:svn]
426
+ end
427
+ #rescue
428
+ # puts "Plugin not found: #{args.inspect}"
429
+ # exit 1
430
+ end
431
+
432
+ def get_version(versions)
433
+ prompt = "Multiple versions found, which version would you like to install?\n"
434
+ index = 1
435
+ versions.keys.sort.reverse.each{ |version| prompt << "#{index.to_s}. #{version}\n"; index = index.next }
436
+ selected_version = nil
437
+ while selected_version.nil?
438
+ puts prompt
439
+ print "> "
440
+ selected_version = prompt_for_version
441
+ selected_version = nil unless (1..versions.size).include?(selected_version.to_i)
442
+ end
443
+ return versions.keys.sort.reverse[selected_version-1]
444
+ end
445
+
446
+ def prompt_for_version
447
+ ARGV.pop
448
+ gets.strip.to_i
449
+ end
450
+
451
+ def set_chosen_version(plugin)
452
+ if plugin.versions.size > 1
453
+ @options[:version] = get_version(plugin.versions)
454
+ else
455
+ @options[:version] = plugin.versions.keys.first
393
456
  end
394
- rescue
395
- puts "Plugin not found: #{args.inspect}"
396
- exit 1
397
457
  end
398
458
  end
399
459
 
@@ -482,5 +542,126 @@ module Commands
482
542
  end
483
543
  end
484
544
  end
545
+
546
+ class Search
547
+ require 'net/http'
548
+ require 'rexml/document'
549
+
550
+ def initialize(base_command)
551
+ @base_command = base_command
552
+ @directory = "http://www.agilewebdevelopment.com/plugins/search?search=%s"
553
+ end
554
+
555
+ def options
556
+ OptionParser.new do |o|
557
+ o.set_summary_indent(' ')
558
+ o.banner = "Usage: #{@base_command.script_name} search \"search string\""
559
+ o.on( "-d DIRECTORY", "--directory DIRECTORY",
560
+ "Queries the URL specified by DIRECTORY.") { |v| @directory = v }
561
+ o.define_head "Search plugins."
562
+ end
563
+ end
564
+
565
+ def parse!(args)
566
+ options.parse!(args)
567
+ uri = URI.parse(@directory % URI.escape(args.first))
568
+ request = Net::HTTP.new(uri.host, uri.port)
569
+ root = REXML::Document.new(request.send_request('GET', uri.request_uri, nil, 'Accept' => 'application/xml').body).root
570
+ root.elements.each('plugin') do |p|
571
+ puts p.elements['name'].text
572
+ puts " Info: #{p.elements['link'].text}"
573
+ puts " Install: #{p.elements['repository'].text}"
574
+ end
575
+ rescue
576
+ nil
577
+ end
578
+ end
579
+
580
+ module Pack
581
+ class Install
582
+ def initialize(base_command)
583
+ @base_command = base_command
584
+ end
585
+
586
+ def options
587
+ OptionParser.new do |o|
588
+ o.set_summary_indent(' ')
589
+ o.banner = "Usage: #{@base_command.script_name} pack:install pack_file_or_url"
590
+ o.define_head "Installs plugin pack at pack_file_or_url"
591
+ end
592
+ end
593
+
594
+ def parse!(args)
595
+ uri = args.first
596
+ plugin_pack = PluginPackParser.parse_spec_file(uri)
597
+ plugin_pack.plugins.each do |plugin|
598
+ puts "+ [Adding] #{plugin.name}"
599
+ plugin.install
600
+ end
601
+ end
602
+ end
603
+
604
+ class Uninstall
605
+ def initialize(base_command)
606
+ @base_command = base_command
607
+ end
608
+
609
+ def options
610
+ OptionParser.new do |o|
611
+ o.set_summary_indent(' ')
612
+ o.banner = "Usage: #{@base_command.script_name} pack:uninstall pack_file_or_url"
613
+ o.define_head "Uninstalls plugin pack at pack_file_or_url"
614
+ end
615
+ end
616
+
617
+ def parse!(args)
618
+ uri = args.first
619
+ plugin_pack = PluginPackParser.parse_spec_file(uri)
620
+ plugin_pack.plugins.each do |plugin|
621
+ puts "+ [Removing] #{plugin.name}"
622
+ plugin.uninstall
623
+ end
624
+ end
625
+ end
626
+
627
+ class About
628
+ def initialize(base_command)
629
+ @base_command = base_command
630
+ end
631
+
632
+ def options
633
+ OptionParser.new do |o|
634
+ o.set_summary_indent(' ')
635
+ o.banner = "Usage: #{@base_command.script_name} pack:about pack_file_or_url"
636
+ o.define_head "Shows meta-data and plugin list for plugin pack at pack_file_or_url"
637
+ end
638
+ end
639
+
640
+ def parse!(args)
641
+ uri = args.first
642
+ plugin_pack = PluginPackParser.parse_spec_file(uri)
643
+ display_meta(plugin_pack)
644
+ display_plugins(plugin_pack)
645
+ end
646
+
647
+ protected
648
+ def display_meta(plugin_pack)
649
+ puts "Retrieving information for plugin pack #{plugin_pack.name}"
650
+ [:description, :author, :email, :website].each do |info_attr|
651
+ info = plugin_pack.send(info_attr)
652
+ unless info.nil? or info.empty?
653
+ puts "* #{info_attr.to_s.capitalize}: #{info}"
654
+ end
655
+ end
656
+ end
657
+
658
+ def display_plugins(plugin_pack)
659
+ puts "Pack contents:"
660
+ plugin_pack.plugins.each do |plugin|
661
+ puts "* #{plugin.name}"
662
+ end
663
+ end
664
+ end
665
+ end
485
666
  end
486
667
 
@@ -1,12 +1,12 @@
1
1
  require 'open-uri'
2
2
 
3
3
  class Plugin
4
-
5
- attr_reader :name, :uri
4
+ attr_reader :name, :uri, :versions
6
5
 
7
6
  def initialize(uri, name=nil)
8
- @uri = uri
9
- guess_name(uri)
7
+ @uri = normalise_uri(uri)
8
+ name.nil? ? guess_name(uri) : @name = name
9
+ check_for_versions
10
10
  end
11
11
 
12
12
  def self.find(name)
@@ -27,6 +27,8 @@ class Plugin
27
27
  end
28
28
 
29
29
  def install(method=nil, options = {})
30
+ options = {:version => "bleeding_edge"}.merge(options)
31
+
30
32
  method ||= rails_env.best_install_method?
31
33
  method = :export if method == :http and svn_url?
32
34
 
@@ -110,7 +112,7 @@ class Plugin
110
112
 
111
113
  def install_using_externals(options = {})
112
114
  externals = rails_env.externals
113
- externals.push([@name, uri])
115
+ externals.push([@name, version_uri(options[:version])])
114
116
  rails_env.externals = externals
115
117
  install_using_checkout(options)
116
118
  end
@@ -119,18 +121,18 @@ class Plugin
119
121
  root = rails_env.root
120
122
  mkdir_p "#{root}/vendor/plugins"
121
123
  Dir.chdir "#{root}/vendor/plugins"
122
- puts "fetching from '#{uri}'" if $verbose
123
- fetcher = RecursiveHTTPFetcher.new(uri)
124
- fetcher.quiet = true if options[:quiet]
125
- fetcher.fetch
124
+ puts "fetching from '#{version_uri(options[:version])}'" if $verbose
125
+ fetcher = get_http_fetcher(version_uri(options[:version]), options[:quiet])
126
+ fetcher.fetch(version_uri(options[:version]))
127
+ rename_version_to_name(options[:version], options[:quiet])
126
128
  end
127
129
 
128
130
  def svn_command(cmd, options = {})
129
131
  root = rails_env.root
130
132
  mkdir_p "#{root}/vendor/plugins"
131
- base_cmd = "svn #{cmd} #{uri} \"#{root}/vendor/plugins/#{name}\""
133
+ base_cmd = "svn #{cmd} #{version_uri(options[:version])} \"#{root}/vendor/plugins/#{name}\""
132
134
  base_cmd += ' -q' if options[:quiet] and not $verbose
133
- base_cmd += " -r #{options[:revision]}" if options[:revision]
135
+ base_cmd += " -r #{options[:revision]}" if options[:revision] and (options[:version] == "bleeding_edge")
134
136
  puts base_cmd if $verbose
135
137
  system(base_cmd)
136
138
  end
@@ -145,4 +147,63 @@ class Plugin
145
147
  def rails_env
146
148
  @rails_env || RailsEnvironment.default
147
149
  end
150
+
151
+ def get_http_fetcher(uri, quiet=true)
152
+ fetcher = RecursiveHTTPFetcher.new(uri)
153
+ fetcher.quiet = quiet
154
+ return fetcher
155
+ end
156
+
157
+ def check_for_versions
158
+ if svn_url?
159
+ check_svn_versions
160
+ else
161
+ check_http_versions
162
+ end
163
+ end
164
+
165
+ # TODO
166
+ def check_svn_versions
167
+ @versions = {"bleeding_edge" => ""}
168
+ end
169
+
170
+ def check_http_versions
171
+ fetcher = get_http_fetcher(@uri)
172
+ folders = fetcher.ls
173
+ if has_trunk?(folders)
174
+ @versions = {"bleeding_edge" => "trunk/"}
175
+ if has_tags?(folders)
176
+ tag_fetcher = get_http_fetcher("#{@uri}tags/")
177
+ available_tags = tag_fetcher.ls.collect { |tag| tag.gsub("/", "") }
178
+ available_tags.each { |tag| @versions[tag] = "tags/#{tag}/" }
179
+ end
180
+ else
181
+ @versions = {"bleeding_edge" => ""}
182
+ end
183
+ end
184
+
185
+ def version_uri(version)
186
+ @uri + @versions[version]
187
+ end
188
+
189
+ def has_trunk?(plugin_root_list)
190
+ plugin_root_list.grep(/trunk/).size == 1
191
+ end
192
+
193
+ def has_tags?(plugin_root_list)
194
+ plugin_root_list.grep(/tags/).size == 1
195
+ end
196
+
197
+ # make sure uris always have a trailing slash
198
+ def normalise_uri(uri)
199
+ return (uri[-1, 1] == "/" ? uri : uri + '/')
200
+ end
201
+
202
+ def rename_version_to_name(version, quiet=false)
203
+ return if @versions[version].empty?
204
+ installed_folder = (version == "bleeding_edge") ? "trunk" : version
205
+ puts "+ Renaming #{installed_folder} to #{name}" unless quiet and not $verbose
206
+ FileUtils.mv("#{rails_env.root}/vendor/plugins/#{installed_folder}",
207
+ "#{rails_env.root}/vendor/plugins/#{name}")
208
+ end
148
209
  end
@@ -0,0 +1,73 @@
1
+ require 'open-uri'
2
+ require 'yaml'
3
+
4
+ class PluginPack
5
+ attr_reader :plugins, :name
6
+ attr_accessor :description, :author, :email, :website
7
+
8
+ def initialize(name)
9
+ @name = name
10
+ @plugins = []
11
+ @description = ''
12
+ @author = ''
13
+ @email = ''
14
+ @website = ''
15
+ end
16
+
17
+ def add_plugin(name, source)
18
+ @plugins << Plugin.new(source, name)
19
+ end
20
+ end
21
+
22
+ class PluginPackPlugin
23
+ attr_reader :name, :source
24
+
25
+ def initialize(name, source)
26
+ @name, @source = name, source
27
+ end
28
+
29
+ def to_svn_external
30
+ "#{@name} #{@source}"
31
+ end
32
+ end
33
+
34
+ class PluginPackParser
35
+ def self.parse_spec(spec)
36
+ pack_spec = YAML.parse(spec)
37
+ pack_meta = self.parse_pack_meta(pack_spec)
38
+ pack_plugins = self.parse_pack_plugins(pack_spec)
39
+ return nil if pack_plugins.empty?
40
+ pack_name = pack_meta.delete('name') || 'Untitled Pack'
41
+ pack = PluginPack.new(pack_name)
42
+ pack_meta.each_pair { |key, value| pack.send("#{key}=", value) if pack.respond_to?(key) }
43
+ pack_plugins.each_pair { |name, source| pack.add_plugin(name, source) }
44
+ pack
45
+ end
46
+
47
+ def self.parse_spec_file(spec_file_or_url)
48
+ self.parse_spec(open(spec_file_or_url))
49
+ end
50
+
51
+ def self.parse_pack_meta(pack_spec)
52
+ pack_meta = {}
53
+ return pack_meta if pack_spec['about'].nil?
54
+ pack_spec['about'].children_with_index.each do |meta|
55
+ key = meta[1].value
56
+ value = pack_spec['about'][key].value
57
+ pack_meta[key] = value
58
+ end
59
+ pack_meta
60
+ end
61
+
62
+ def self.parse_pack_plugins(pack_spec)
63
+ plugins = {}
64
+ return plugins if pack_spec['plugins'].nil? or pack_spec['plugins'].children.nil?
65
+ pack_spec['plugins'].children_with_index.each do |p|
66
+ name = p[1].value
67
+ next if pack_spec['plugins'][name].nil?
68
+ source = pack_spec['plugins'][name].value
69
+ plugins[name] = source
70
+ end
71
+ plugins
72
+ end
73
+ end
@@ -84,4 +84,7 @@ class RailsEnvironment
84
84
  end
85
85
  end
86
86
 
87
+ def add_plugin_to_svn(plugin_name)
88
+ system("svn add #{root}/vendor/plugins/#{plugin_name}")
89
+ end
87
90
  end
@@ -1,4 +1,5 @@
1
1
  require 'open-uri'
2
+ require 'fileutils'
2
3
 
3
4
  class RecursiveHTTPFetcher
4
5
  attr_accessor :quiet
@@ -1,4 +1,3 @@
1
-
2
1
  class Repository
3
2
  include Enumerable
4
3
  attr_reader :uri, :plugins
@@ -16,7 +15,7 @@ class Repository
16
15
  end
17
16
 
18
17
  @plugins = index.reject{ |line| line !~ /\/$/ }
19
- @plugins.map! { |name| Plugin.new(File.join(@uri, name), name) }
18
+ @plugins.map! { |name| name.gsub!("/", ""); Plugin.new(File.join(@uri, name), name) }
20
19
  end
21
20
 
22
21
  @plugins
@@ -18,8 +18,13 @@ class Commands::Plugin::PluginTest < Test::Unit::TestCase
18
18
  assert_equal @uri, @plugin.uri
19
19
  end
20
20
 
21
+ def test_versions
22
+ assert_equal 1, @plugin.versions.size
23
+ assert_equal "bleeding_edge", @plugin.versions.keys.first
24
+ end
25
+
21
26
  def test_to_s
22
- assert_equal 'exception_notification http://dev.rubyonrails.org/svn/rails/plugins/exception_notification', @plugin.to_s
27
+ assert_equal 'exception_notification http://dev.rubyonrails.org/svn/rails/plugins/exception_notification/', @plugin.to_s
23
28
  end
24
29
 
25
30
  def test_find
@@ -56,3 +61,39 @@ class Commands::Plugin::PluginTest < Test::Unit::TestCase
56
61
  end
57
62
 
58
63
  end
64
+
65
+ class Commands::Plugin::PluginWithSubversionRepoStructureTest < Test::Unit::TestCase
66
+ def setup
67
+ @uri = "http://opensource.agileevolved.com/svn/root/rails_plugins/unobtrusive_javascript/"
68
+ @name = "unobtrusive_javascript"
69
+ @plugin = Plugin.new @uri, @name
70
+ end
71
+
72
+ def test_url_should_have_subversion_repo_structure
73
+ fetcher = RecursiveHTTPFetcher.new(@uri)
74
+ links = fetcher.ls
75
+ assert !links.grep(/trunk/).empty?
76
+ assert !links.grep(/tags/).empty?
77
+ assert !links.grep(/branches/).empty?
78
+ end
79
+
80
+ def test_plugin_should_have_at_least_an_bleeding_edge_version
81
+ # bleeding edge version == trunk
82
+ assert @plugin.versions.keys.include?("bleeding_edge")
83
+ assert_equal "trunk/", @plugin.versions["bleeding_edge"]
84
+ end
85
+
86
+ def test_should_have_tagged_versions
87
+ assert @plugin.versions.keys.include?("rel-0.1")
88
+ assert_equal "tags/rel-0.1/", @plugin.versions["rel-0.1"]
89
+ end
90
+
91
+ def test_installing_tagged_version
92
+ $verbose = true
93
+ @plugin.install :http, :version => "rel-0.1"
94
+ assert @plugin.installed?
95
+
96
+ @plugin.uninstall
97
+ assert !@plugin.installed?
98
+ end
99
+ end
@@ -5,6 +5,14 @@ require File.dirname(__FILE__) + "/../../../lib/commands/plugin"
5
5
  require File.dirname(__FILE__) + "/../../mocks/rails_environment"
6
6
 
7
7
  # TODO Mock the remote repository so we don't have to hit an actual server for the plugins.
8
+ # LR: heres one way of sorting this out with a stub for the http fetcher
9
+ class RecursiveHTTPFetcher
10
+ def ls
11
+ ['/meta_tags/']
12
+ end
13
+ end
14
+
15
+
8
16
  class Commands::Plugin::RepositoryTest < Test::Unit::TestCase
9
17
 
10
18
  def setup
@@ -1,16 +1,36 @@
1
1
  require 'test/unit'
2
2
  require 'rubygems'
3
3
  require 'fileutils'
4
+ require 'stringio'
4
5
  $testing = true
5
6
  require File.dirname(__FILE__) + "/../../lib/commands/plugin"
6
7
  require File.dirname(__FILE__) + "/../mocks/rails_environment"
7
8
 
9
+ class Commands::Install
10
+ def self.default_method=(method)
11
+ @@default_method = method
12
+ end
13
+
14
+ # dont want to use gets in test
15
+ def prompt_for_version
16
+ $selected_version
17
+ end
18
+ end
19
+
8
20
  # TODO Mock the remote repository so we don't have to hit an actual server for the plugins.
9
21
  class Commands::PluginTest < Test::Unit::TestCase
10
22
 
11
23
  def setup
12
24
  @plugin_name = 'meta_tags'
13
25
  @remote_source = 'http://topfunky.net/svn/plugins'
26
+ @captured_output = StringIO.new("")
27
+ end
28
+
29
+ def teardown
30
+ $stdout = STDOUT
31
+ Commands::Install.default_method = :http
32
+ `svn revert #{plugin_directory} `
33
+ `svn cleanup`
14
34
  end
15
35
 
16
36
  def test_list
@@ -34,7 +54,7 @@ class Commands::PluginTest < Test::Unit::TestCase
34
54
  }
35
55
  end
36
56
 
37
- def test_install
57
+ def xtest_install
38
58
  run_command('install', File.join(@remote_source, @plugin_name))
39
59
  assert File.exists?(path_to_plugin(@plugin_name) + "/lib"),
40
60
  "Plugin should have been installed at #{path_to_plugin(@plugin_name)}"
@@ -48,6 +68,54 @@ class Commands::PluginTest < Test::Unit::TestCase
48
68
  ensure
49
69
  FileUtils.rm_rf path_to_plugin(@plugin_name)
50
70
  end
71
+
72
+ def test_install_with_svn_add
73
+ run_command('install', "--svn", File.join(@remote_source, @plugin_name))
74
+ assert File.exists?(path_to_plugin(@plugin_name) + "/lib"),
75
+ "Plugin should have been installed at #{path_to_plugin(@plugin_name)}"
76
+ output = `svn stat`.strip.split("\n")
77
+ scan_directory(path_to_plugin(@plugin_name)) do |plugin_file|
78
+ plugin_file.slice!(plugin_directory)
79
+ assert_equal 1, output.grep(/^A[ ]+#{plugin_file}/).size
80
+ end
81
+ ensure
82
+ FileUtils.rm_rf path_to_plugin(@plugin_name)
83
+ `svn rm #{path_to_plugin(@plugin_name)}`
84
+ end
85
+
86
+ def test_install_with_forced_http
87
+ $stdout = @captured_output
88
+ $verbose = true
89
+ Commands::Install.default_method = :externals # anything but http
90
+ output = run_command('install', "--force-http", File.join(@remote_source, @plugin_name))
91
+ assert File.exists?(path_to_plugin(@plugin_name) + "/lib"),
92
+ "Plugin should have been installed at #{path_to_plugin(@plugin_name)}"
93
+ assert @captured_output.string.include?("Plugins will be installed using http")
94
+ $stdout = STDOUT
95
+ ensure
96
+ FileUtils.rm_rf path_to_plugin(@plugin_name)
97
+ end
98
+
99
+ def test_install_with_multiple_versions
100
+ $selected_version = 1
101
+ $verbose = true
102
+ output = run_command("install", "http://opensource.agileevolved.com/svn/root/rails_plugins/unobtrusive_javascript")
103
+ assert File.exists?(path_to_plugin("unobtrusive_javascript") + "/lib")
104
+ ensure
105
+ FileUtils.rm_rf path_to_plugin("unobtrusive_javascript")
106
+ end
107
+
108
+ def test_install_with_specifc_version
109
+ $stdout = @captured_output
110
+ $selected_version = 1
111
+ $verbose = true
112
+ output = run_command("install", "--version=rel-0.1", "http://opensource.agileevolved.com/svn/root/rails_plugins/unobtrusive_javascript")
113
+ assert File.exists?(path_to_plugin("unobtrusive_javascript") + "/lib")
114
+ assert @captured_output.string.include?("Renaming rel-0.1 to unobtrusive_javascript")
115
+ $stdout = STDOUT
116
+ ensure
117
+ FileUtils.rm_rf path_to_plugin("unobtrusive_javascript")
118
+ end
51
119
 
52
120
  # TODO Takes too long...find a way to speed it up
53
121
  # def test_sources
@@ -57,6 +125,18 @@ class Commands::PluginTest < Test::Unit::TestCase
57
125
  # end
58
126
 
59
127
  protected
128
+ def scan_directory(dirname, &block)
129
+ Dir.new(dirname).each do |entry|
130
+ full_path = File.join(dirname, entry)
131
+ if File.directory?(full_path)
132
+ unless %w(.svn . ..).include?(entry)
133
+ scan_directory(full_path, &block)
134
+ end
135
+ else
136
+ yield full_path
137
+ end
138
+ end
139
+ end
60
140
 
61
141
  def deny(condition, message=nil)
62
142
  assert !condition, message
@@ -68,8 +148,11 @@ protected
68
148
 
69
149
  # Returns the full path to a locally installed plugin
70
150
  def path_to_plugin(name)
71
- RailsEnvironment.default.root + "/vendor/plugins/#{name}"
151
+ "#{plugin_directory}#{name}"
72
152
  end
73
153
 
154
+ def plugin_directory
155
+ RailsEnvironment.default.root + "/vendor/plugins/"
156
+ end
74
157
  end
75
158
 
metadata CHANGED
@@ -3,13 +3,13 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: rapt
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2006-07-06 00:00:00 -07:00
8
- summary: Rails plugin manager.
6
+ version: 0.2.0
7
+ date: 2006-10-26 00:00:00 -07:00
8
+ summary: Rails Plugin Tool.
9
9
  require_paths:
10
10
  - lib
11
11
  email: boss@topfunky.com
12
- homepage: http://nubyonrails.com/pages/rapt
12
+ homepage: http://rapt.rubyforge.org
13
13
  rubyforge_project: rapt
14
14
  description: Install, remove, and discover new plugins for your Ruby on Rails app.
15
15
  autorequire:
@@ -39,6 +39,7 @@ files:
39
39
  - lib/commands/plugin.rb
40
40
  - lib/commands/plugin/commands.rb
41
41
  - lib/commands/plugin/plugin.rb
42
+ - lib/commands/plugin/plugin_pack.rb
42
43
  - lib/commands/plugin/rails_environment.rb
43
44
  - lib/commands/plugin/recursive_http_fetcher.rb
44
45
  - lib/commands/plugin/repositories.rb