Narnach-gems 0.1.7 → 0.2.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/README.rdoc CHANGED
@@ -5,6 +5,9 @@ Rails code would not get into dependency issues.
5
5
 
6
6
  == Recent changes
7
7
 
8
+ === Version 0.2.0
9
+ Most gems commands can now work on multiple projects at the same time. The 'gems help' command has been updated to reflect this.
10
+
8
11
  === Version 0.1.7
9
12
  Gem install only installs missing gems; it does not re-install gems.
10
13
 
@@ -50,36 +53,8 @@ From the project root, use rake to install:
50
53
  This will build the gem and install it for you.
51
54
 
52
55
  == Usage
53
- Output if 'gems help', with some changes to make them legible in RDoc:
54
- Syntax:
55
- gems 'action' 'arguments'
56
-
57
- Actions and arguments:
58
- install 'name'
59
- Install all missing gems in project 'name'.
60
- uninstall 'name'
61
- Uninstall all gems in project 'name'.
62
- diff 'name'
63
- See difference between the current gem configuration and that of project 'name'.
64
- switch 'name'
65
- Switch to the exact gem configuration in project 'name'.
66
- This will preserve all shared gems in the current state and in the target
67
- project, only installing and uninstalling what is needed.
68
- list 'name'
69
- List all gems in project 'name'.
70
- import 'name' 'file'
71
- Import all gems in 'file' into project 'name'.
72
- This will overwrite the gems currently in this project.
73
- The special file 'current' will use the output of `gems list` instead of a file.
74
- export 'name' 'file'
75
- Export all gems in project 'name' to 'file'.
76
- The file will be overwritten and can be parsed by the import action.
77
- add 'name' 'file'
78
- Add the gems 'file' to project 'name'.
79
- projects
80
- List all stored project names.
81
- configure 'name' 'gem' [option1 option2 option3]
82
- Configure a specific gem inside a project to use specific options when installing.
56
+ See the gems help for the syntax
57
+ gems help
83
58
 
84
59
  == Examples
85
60
  To store your current gems as project 'dev', do the following:
@@ -88,9 +63,13 @@ To store your current gems as project 'dev', do the following:
88
63
  To switch from project 'dev' to 'server', do the following:
89
64
  gems uninstall dev
90
65
  gems install server
66
+ It is also possible to directly switch to a project:
67
+ gems switch server
91
68
  To export project 'dev' to the file 'gems.dev', do the following:
92
69
  gems export dev gems.dev
93
70
 
71
+ == Ideas / plans / todo
72
+
94
73
  == About
95
74
  Author:: Wes 'Narnach' Oldenbeuving (http://github.com/Narnach)
96
75
  Website:: http://github.com/Narnach/gems
data/bin/gems CHANGED
@@ -6,13 +6,13 @@ project = ARGV.shift.to_s.strip
6
6
 
7
7
  case action
8
8
  when 'install'
9
- gems = Gems.new project
9
+ gems = Gems.new([project] + ARGV)
10
10
  gems.install
11
11
  when 'uninstall'
12
- gems = Gems.new project
12
+ gems = Gems.new([project] + ARGV)
13
13
  gems.uninstall
14
14
  when 'list'
15
- gems = Gems.new project
15
+ gems = Gems.new([project] + ARGV)
16
16
  gems.list
17
17
  when 'import'
18
18
  gems_config = GemsConfig.new(project)
@@ -36,10 +36,10 @@ when 'add'
36
36
  gems_file = ARGV.shift.to_s.strip
37
37
  gems_config.add_gems(gems_file)
38
38
  when 'diff'
39
- gems = Gems.new project
39
+ gems = Gems.new([project] + ARGV)
40
40
  gems.diff_current
41
41
  when 'switch'
42
- gems = Gems.new project
42
+ gems = Gems.new([project] + ARGV)
43
43
  gems.switch_from_current
44
44
  else 'help'
45
45
  puts <<-EOS
@@ -47,18 +47,18 @@ Syntax:
47
47
  gems <action> <arguments>
48
48
 
49
49
  Actions and arguments:
50
- install <name>
51
- Install all missing gems in project <name>.
52
- uninstall <name>
53
- Uninstall all gems in project <name>.
54
- diff <name>
55
- See difference between the current gem configuration and that of project <name>.
56
- switch <name>
57
- Switch to the exact gem configuration in project <name>.
58
- This will preserve all shared gems in the current state and in the target
59
- project, only installing and uninstalling what is needed.
60
- list <name>
61
- List all gems in project <name>.
50
+ install <name1> [name2 .. nameN]
51
+ Install all missing gems in project name1..nameN.
52
+ uninstall <name1> [name2 .. nameN]
53
+ Uninstall all gems in project name1..nameN.
54
+ diff <name1> [name2 .. nameN]
55
+ See difference between the current gem configuration and that of the union of projects name1..nameN.
56
+ switch <name1> [name2 .. nameN]
57
+ Switch to gem configuration in the union of projects name1..nameN.
58
+ This will preserve all shared gems in the current state and in the target state,
59
+ only installing and uninstalling what is needed.
60
+ list <name1> [name2 .. nameN]
61
+ List all gems in union of projects name1..nameN.
62
62
  import <name> <file>
63
63
  Import all gems in <file> into project <name>.
64
64
  This will overwrite the gems currently in this project.
data/gems.gemspec CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
3
3
  s.name = 'gems'
4
4
  s.summary = "Gems is a simple tool to manage sets of RubyGems."
5
5
  s.description = "Gems is a simple tool to manage sets of RubyGems. It can be used to install and uninstall large numbers of gems."
6
- s.version = '0.1.7'
7
- s.date = '2008-08-19'
6
+ s.version = '0.2.0'
7
+ s.date = '2008-08-26'
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Wes Oldenbeuving"]
10
10
  s.email = "narnach@gmail.com"
@@ -14,8 +14,13 @@ Gem::Specification.new do |s|
14
14
  s.bindir = "bin"
15
15
  s.executables = %w[gems]
16
16
  s.require_path = "lib"
17
- s.files = ['MIT-LICENSE', 'README.rdoc', 'Rakefile', 'bin/gems', 'lib/gems.rb', 'lib/gems_config.rb', 'lib/gems_parser.rb', 'gems.gemspec', 'lib/gems_list.rb']
18
- s.test_files = []
17
+ root_files = %w[MIT-LICENSE README.rdoc Rakefile gems.gemspec]
18
+ bin_files = %w[gems]
19
+ lib_files = %w[gems gems_config gems_parser gems_list]
20
+ test_files = %w[]
21
+ spec_files = %w[]
22
+ s.test_files = test_files.map {|f| 'test/%s_test.rb' % f} + spec_files.map {|f| 'spec/%s_spec.rb' % f}
23
+ s.files = root_files + s.test_files + bin_files.map {|f| 'bin/%s' % f} + lib_files.map {|f| 'lib/%s.rb' % f}
19
24
 
20
25
  # rdoc
21
26
  s.has_rdoc = true
data/lib/gems.rb CHANGED
@@ -2,28 +2,21 @@ require 'gems_config'
2
2
  require 'gems_parser'
3
3
  require 'gems_list'
4
4
 
5
- class Hash
6
- def longest_key_length
7
- map{|key, value| key.to_s.size}.max || 0
8
- end
9
- end
10
-
11
5
  class Gems
12
- attr_reader :project, :gems, :gems_config
6
+ attr_reader :project, :projects, :gems, :gems_config
13
7
 
14
- def initialize(project)
15
- @project = project
8
+ def initialize(*projects)
9
+ @projects = projects.flatten
10
+ @project = projects.first
16
11
  @gems_config = GemsConfig.new(@project)
17
12
  @gems = @gems_config.gems
18
13
  end
19
14
 
20
15
  def diff_current
21
- current_gems = GemsList.new(GemsParser.new('current').gems)
22
- project_gems = GemsList.new(gems)
23
- not_in_current = project_gems - current_gems
24
- in_current = current_gems - project_gems
16
+ not_in_current = projects_gems - current_gems_list
17
+ in_current = current_gems_list - projects_gems
25
18
 
26
- puts 'Gems unique to "%s":' % project
19
+ puts 'Gems unique to "%s":' % projects.join(", ")
27
20
  print_gem_list(not_in_current)
28
21
  puts
29
22
  puts 'Gems unique to the current gems list:'
@@ -31,29 +24,29 @@ class Gems
31
24
  end
32
25
 
33
26
  def list
34
- puts 'Gems in "%s":' % project
35
- print_gem_list(gems)
27
+ list_name = projects.size == 1 ? 'Gems in' : 'Union of all gems in'
28
+ projects_list = projects.join(", ")
29
+ puts '%s %s:' % [list_name, projects_list]
30
+ print_gem_list(projects_gems)
36
31
  end
37
32
 
38
33
  def install
39
- puts "Installing all gems and versions in '%s'" % project
40
- install_gems_list(GemsList.new(gems) - current_gems_list)
34
+ puts "Installing all gems and versions in '%s'" % projects.join(", ")
35
+ install_gems_list(projects_gems - current_gems_list)
41
36
  end
42
37
 
43
38
  def switch_from_current
44
- current_gems = current_gems_list
45
- project_gems = GemsList.new(gems)
46
-
47
- to_install = project_gems - current_gems
48
- to_uninstall = current_gems - project_gems
39
+ puts 'Switching to %s:' % projects.join(", ")
40
+ to_install = projects_gems - current_gems_list
41
+ to_uninstall = current_gems_list - projects_gems
49
42
 
50
43
  install_gems_list(to_install)
51
44
  uninstall_gems_list(to_uninstall)
52
45
  end
53
46
 
54
47
  def uninstall
55
- puts "Uninstalling all gems and versions in '%s'" % project
56
- uninstall_gems_list(GemsList.new(gems))
48
+ puts "Uninstalling all gems and versions in '%s'" % projects.join(", ")
49
+ uninstall_gems_list(projects_gems)
57
50
  end
58
51
 
59
52
  private
@@ -93,6 +86,12 @@ class Gems
93
86
  end
94
87
  end
95
88
 
89
+ def projects_gems
90
+ @projects_gems ||= projects.inject(GemsList.new) do |gems_list, project|
91
+ gems_list + GemsConfig.new(project).gems
92
+ end
93
+ end
94
+
96
95
  def uninstall_gems_list(gems)
97
96
  results = {}
98
97
  gems.each_gem_with_version do |gemname, version|
data/lib/gems_config.rb CHANGED
@@ -7,7 +7,7 @@ class GemsConfig
7
7
  def initialize(name)
8
8
  @name = name
9
9
  end
10
-
10
+
11
11
  def add_gems(file)
12
12
  new_gems = GemsParser.new(file).gems
13
13
  new_gems.each do |gemname, versions|
@@ -41,11 +41,20 @@ class GemsConfig
41
41
  save_config
42
42
  end
43
43
 
44
- # Load gems. Old data is automatically converted to new data.
44
+ # Load gems.
45
+ #
46
+ # Returns a GemsList.
47
+ #
48
+ # Old data structures are automatically converted to new data structures.
45
49
  def gems
46
- gem_data = (project['gems'] ||= {})
47
- return gem_data if gem_data.kind_of? Hash
48
- new_gems = {}
50
+ gem_data = (project['gems'] ||= GemsList.new)
51
+ return gem_data if gem_data.kind_of? GemsList
52
+ if gem_data.kind_of? Hash
53
+ project['gems'] = GemsList.new(gem_data)
54
+ save_config
55
+ return gems
56
+ end
57
+ new_gems = GemsList.new
49
58
  gem_data.each do |gem_ary|
50
59
  new_gems[gem_ary[0]] = gem_ary[1]
51
60
  end
@@ -59,7 +68,7 @@ class GemsConfig
59
68
  end
60
69
 
61
70
  protected
62
-
71
+
63
72
  def add_gem(gemname, version)
64
73
  gems[gemname] ||= []
65
74
  gems[gemname] << version
data/lib/gems_list.rb CHANGED
@@ -19,6 +19,19 @@ class GemsList < Hash
19
19
  diff
20
20
  end
21
21
 
22
+ # Returns a new Gemlist which is the union of both GemLists.
23
+ def +(other)
24
+ union = self.dup
25
+ other.each do |gem, versions|
26
+ if union.has_key? gem
27
+ union[gem] = (union[gem] + versions).uniq.sort
28
+ else
29
+ union[gem] = versions
30
+ end
31
+ end
32
+ union
33
+ end
34
+
22
35
  def each_gem_with_version(&block)
23
36
  raise ArgumentError, 'No block provided' unless block
24
37
  self.each do |gemname, versions|
@@ -27,4 +40,8 @@ class GemsList < Hash
27
40
  end
28
41
  end
29
42
  end
43
+
44
+ def longest_key_length
45
+ map{|key, value| key.to_s.size}.max || 0
46
+ end
30
47
  end
data/lib/gems_parser.rb CHANGED
@@ -18,7 +18,7 @@ class GemsParser
18
18
  private
19
19
 
20
20
  def parse_gems
21
- parsed_gems = {}
21
+ parsed_gems = GemsList.new
22
22
  str.each do |line|
23
23
  gemname, *versions = line.split(" ")
24
24
  next if gemname.to_s.size == 0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Narnach-gems
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wes Oldenbeuving
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-08-19 00:00:00 -07:00
12
+ date: 2008-08-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -26,11 +26,11 @@ files:
26
26
  - MIT-LICENSE
27
27
  - README.rdoc
28
28
  - Rakefile
29
+ - gems.gemspec
29
30
  - bin/gems
30
31
  - lib/gems.rb
31
32
  - lib/gems_config.rb
32
33
  - lib/gems_parser.rb
33
- - gems.gemspec
34
34
  - lib/gems_list.rb
35
35
  has_rdoc: true
36
36
  homepage: http://www.github.com/Narnach/gems