Narnach-gems 0.2.2 → 0.3.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/bin/gems CHANGED
@@ -4,42 +4,48 @@ require 'gems'
4
4
  action = ARGV.shift.to_s.strip
5
5
  project = ARGV.shift.to_s.strip
6
6
 
7
+ def guess_file_name!(project)
8
+ gems_file = ARGV.shift.to_s.strip
9
+ return gems_file unless gems_file.empty?
10
+ project + '.gems'
11
+ end
12
+
7
13
  case action
8
14
  when 'install'
9
- gems = Gems.new([project] + ARGV)
15
+ gems = Gems::Base.new([project] + ARGV)
10
16
  gems.install
11
17
  when 'uninstall'
12
- gems = Gems.new([project] + ARGV)
18
+ gems = Gems::Base.new([project] + ARGV)
13
19
  gems.uninstall
14
20
  when 'list'
15
- gems = Gems.new([project] + ARGV)
21
+ gems = Gems::Base.new([project] + ARGV)
16
22
  gems.list
17
23
  when 'import'
18
- gems_config = GemsConfig.new(project)
19
- gems_file = ARGV.shift.to_s.strip
24
+ gems_file = guess_file_name!(project)
25
+ gems_config = Gems::Config.new(project)
20
26
  gems_config.import_gems(gems_file)
21
27
  when 'export'
22
- gems_config = GemsConfig.new(project)
23
- gems_file = ARGV.shift.to_s.strip
28
+ gems_file = guess_file_name!(project)
29
+ gems_config = Gems::Config.new(project)
24
30
  gems_config.export_gems(gems_file)
25
31
  when 'projects'
26
- gems_config = GemsConfig.new(nil)
32
+ gems_config = Gems::Config.new(nil)
27
33
  gems_config.project_names.each do |project|
28
34
  puts project
29
35
  end
30
36
  when 'configure'
31
- gems_config = GemsConfig.new(project)
37
+ gems_config = Gems::Config.new(project)
32
38
  gemname = ARGV.shift
33
39
  gems_config.set_gem_options(gemname, ARGV)
34
40
  when 'add'
35
- gems_config = GemsConfig.new(project)
41
+ gems_config = Gems::Config.new(project)
36
42
  gems_file = ARGV.shift.to_s.strip
37
43
  gems_config.add_gems(gems_file)
38
44
  when 'diff'
39
- gems = Gems.new([project] + ARGV)
45
+ gems = Gems::Base.new([project] + ARGV)
40
46
  gems.diff_current
41
47
  when 'switch'
42
- gems = Gems.new([project] + ARGV)
48
+ gems = Gems::Base.new([project] + ARGV)
43
49
  gems.switch_from_current
44
50
  else 'help'
45
51
  puts <<-EOS
@@ -59,13 +65,15 @@ Actions and arguments:
59
65
  only installing and uninstalling what is needed.
60
66
  list <name1> [name2 .. nameN]
61
67
  List all gems in union of projects name1..nameN.
62
- import <name> <file>
63
- Import all gems in <file> into project <name>.
68
+ import <name> [file]
69
+ Import all gems in [file] into project <name>.
64
70
  This will overwrite the gems currently in this project.
65
71
  The special file 'current' will use the output of `gems list` instead of a file.
66
- export <name> <file>
67
- Export all gems in project <name> to <file>.
72
+ If no [file] is provided, it is guessed by appending '.gems' to <name>.
73
+ export <name> [file]
74
+ Export all gems in project <name> to [file].
68
75
  The file will be overwritten and can be parsed by the import action.
76
+ If no [file] is provided, it is guessed by appending '.gems' to <name>.
69
77
  add <name> <file>
70
78
  Add the gems <file> to project <name>.
71
79
  projects
@@ -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.2.2'
7
- s.date = '2009-01-13'
6
+ s.version = '0.3.0'
7
+ s.date = '2009-09-07'
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Wes Oldenbeuving"]
10
10
  s.email = "narnach@gmail.com"
@@ -16,7 +16,8 @@ Gem::Specification.new do |s|
16
16
  s.require_path = "lib"
17
17
  root_files = %w[MIT-LICENSE README.rdoc Rakefile gems.gemspec]
18
18
  bin_files = %w[gems]
19
- lib_files = %w[gems gems_config gems_parser gems_list]
19
+ gems_files = %w[base config list parser updater]
20
+ lib_files = %w[gems] + gems_files.map {|f| "gems/#{f}"}
20
21
  test_files = %w[]
21
22
  spec_files = %w[]
22
23
  s.test_files = test_files.map {|f| 'test/%s_test.rb' % f} + spec_files.map {|f| 'spec/%s_spec.rb' % f}
@@ -1,120 +1,4 @@
1
- require 'gems_config'
2
- require 'gems_parser'
3
- require 'gems_list'
1
+ require 'gems/base'
4
2
 
5
- class Gems
6
- attr_reader :project, :projects, :gems, :gems_config
7
-
8
- def initialize(*projects)
9
- @projects = projects.flatten
10
- @project = projects.first
11
- @gems_config = GemsConfig.new(@project)
12
- @gems = @gems_config.gems
13
- end
14
-
15
- def diff_current
16
- not_in_current = projects_gems - current_gems_list
17
- in_current = current_gems_list - projects_gems
18
-
19
- puts 'Gems unique to "%s":' % projects.join(", ")
20
- print_gem_list(not_in_current)
21
- puts
22
- puts 'Gems unique to the current gems list:'
23
- print_gem_list(in_current)
24
- end
25
-
26
- def list
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)
31
- end
32
-
33
- def install
34
- puts "Installing all gems and versions in '%s'" % projects.join(", ")
35
- install_gems_list(projects_gems - current_gems_list)
36
- end
37
-
38
- def switch_from_current
39
- puts 'Switching to %s...' % projects.join(", ")
40
- to_install = projects_gems - current_gems_list
41
- to_uninstall = current_gems_list - projects_gems
42
-
43
- puts
44
- puts '%s to be installed...' % (to_install.size == 1 ? '1 gem needs' : '%i gems need' % to_install.size)
45
- install_gems_list(to_install) if to_install.size > 0
46
-
47
- puts
48
- puts '%s to be uninstalled...' % (to_uninstall.size == 1 ? '1 gem needs' : '%i gems need' % to_uninstall.size)
49
- uninstall_gems_list(to_uninstall) if to_uninstall.size > 0
50
- end
51
-
52
- def uninstall
53
- puts "Uninstalling all gems and versions in '%s'" % projects.join(", ")
54
- uninstall_gems_list(projects_gems)
55
- end
56
-
57
- private
58
-
59
- def current_gems_list
60
- @current_gems_list ||= GemsParser.new('current').gems
61
- end
62
-
63
- def install_gems_list(gems)
64
- results = {}
65
- gems.each_gem_with_version do |gemname, versions|
66
- versions.each do |version|
67
- cmd = "sudo gem install --ignore-dependencies --no-rdoc --no-ri -v %s %s > /dev/null" % [version, gemname]
68
- if gems_config.options_for(gemname).size > 0
69
- cmd << ' -- %s' % gems_config.options_for(gemname).join(" ")
70
- end
71
- puts ' ' << cmd
72
- result = system(cmd)
73
- results['%s-%s' % [gemname, version]] = result
74
- end
75
- end
76
- successful = results.select {|gemname, success| success}
77
- unsuccessful = results.select {|gemname, success| !success}
78
- if successful.size > 0
79
- puts "Successfully installed: %s" % successful.map{|ary| ary[0]}.sort.join(", ")
80
- end
81
- if unsuccessful.size > 0
82
- puts "Failed to install: %s" % unsuccessful.map{|ary| ary[0]}.sort.join(", ")
83
- end
84
- end
85
-
86
- def print_gem_list(gems)
87
- gems.keys.sort.each do |gemname|
88
- versions = gems[gemname].sort
89
- line = "%#{gems.longest_key_length}s %s" % [gemname, versions.join(", ")]
90
- if gems_config.options_for(gemname).size > 0
91
- line << ' [%s]' % gems_config.options_for(gemname).join(" ")
92
- end
93
- puts line
94
- end
95
- end
96
-
97
- def projects_gems
98
- @projects_gems ||= projects.inject(GemsList.new) do |gems_list, project|
99
- gems_list + GemsConfig.new(project).gems
100
- end
101
- end
102
-
103
- def uninstall_gems_list(gems)
104
- results = {}
105
- gems.each_gem_with_version do |gemname, version|
106
- cmd = "sudo gem uninstall --ignore-dependencies --executables -v %s %s > /dev/null" % [version, gemname]
107
- puts ' ' << cmd
108
- result = system(cmd)
109
- results['%s-%s' % [gemname, version]] = result
110
- end
111
- successful = results.select {|gemname, success| success}
112
- unsuccessful = results.select {|gemname, success| !success}
113
- if successful.size > 0
114
- puts "Successfully uninstalled: %s" % successful.map{|ary| ary[0]}.sort.join(", ")
115
- end
116
- if unsuccessful.size > 0
117
- puts "Failed to uninstall: %s" % unsuccessful.map{|ary| ary[0]}.sort.join(", ")
118
- end
119
- end
3
+ module Gems
120
4
  end
@@ -0,0 +1,122 @@
1
+ require 'gems/config'
2
+ require 'gems/parser'
3
+ require 'gems/list'
4
+
5
+ module Gems
6
+ class Base
7
+ attr_reader :project, :projects, :gems, :gems_config
8
+
9
+ def initialize(*projects)
10
+ @projects = projects.flatten
11
+ @project = projects.first
12
+ @gems_config = Gems::Config.new(@project)
13
+ @gems = @gems_config.gems
14
+ end
15
+
16
+ def diff_current
17
+ not_in_current = projects_gems - current_gems_list
18
+ in_current = current_gems_list - projects_gems
19
+
20
+ puts 'Gems unique to "%s":' % projects.join(", ")
21
+ print_gem_list(not_in_current)
22
+ puts
23
+ puts 'Gems unique to the current gems list:'
24
+ print_gem_list(in_current)
25
+ end
26
+
27
+ def list
28
+ list_name = projects.size == 1 ? 'Gems in' : 'Union of all gems in'
29
+ projects_list = projects.join(", ")
30
+ puts '%s %s:' % [list_name, projects_list]
31
+ print_gem_list(projects_gems)
32
+ end
33
+
34
+ def install
35
+ puts "Installing all gems and versions in '%s'" % projects.join(", ")
36
+ install_gems_list(projects_gems - current_gems_list)
37
+ end
38
+
39
+ def switch_from_current
40
+ puts 'Switching to %s...' % projects.join(", ")
41
+ to_install = projects_gems - current_gems_list
42
+ to_uninstall = current_gems_list - projects_gems
43
+
44
+ puts
45
+ puts '%s to be installed...' % (to_install.size == 1 ? '1 gem needs' : '%i gems need' % to_install.size)
46
+ install_gems_list(to_install) if to_install.size > 0
47
+
48
+ puts
49
+ puts '%s to be uninstalled...' % (to_uninstall.size == 1 ? '1 gem needs' : '%i gems need' % to_uninstall.size)
50
+ uninstall_gems_list(to_uninstall) if to_uninstall.size > 0
51
+ end
52
+
53
+ def uninstall
54
+ puts "Uninstalling all gems and versions in '%s'" % projects.join(", ")
55
+ uninstall_gems_list(projects_gems)
56
+ end
57
+
58
+ private
59
+
60
+ def current_gems_list
61
+ @current_gems_list ||= Gems::Parser.new('current').gems
62
+ end
63
+
64
+ def install_gems_list(gems)
65
+ results = {}
66
+ gems.each_gem_with_version do |gemname, versions|
67
+ versions.each do |version|
68
+ cmd = "sudo gem install --ignore-dependencies --no-rdoc --no-ri -v %s %s > /dev/null" % [version, gemname]
69
+ if gems_config.options_for(gemname).size > 0
70
+ cmd << ' -- %s' % gems_config.options_for(gemname).join(" ")
71
+ end
72
+ puts ' ' << cmd
73
+ result = system(cmd)
74
+ results['%s-%s' % [gemname, version]] = result
75
+ end
76
+ end
77
+ successful = results.select {|gemname, success| success}
78
+ unsuccessful = results.select {|gemname, success| !success}
79
+ if successful.size > 0
80
+ puts "Successfully installed: %s" % successful.map{|ary| ary[0]}.sort.join(", ")
81
+ end
82
+ if unsuccessful.size > 0
83
+ puts "Failed to install: %s" % unsuccessful.map{|ary| ary[0]}.sort.join(", ")
84
+ end
85
+ end
86
+
87
+ def print_gem_list(gems)
88
+ gems.keys.sort.each do |gemname|
89
+ versions = gems[gemname].sort
90
+ line = "%#{gems.longest_key_length}s %s" % [gemname, versions.join(", ")]
91
+ if gems_config.options_for(gemname).size > 0
92
+ line << ' [%s]' % gems_config.options_for(gemname).join(" ")
93
+ end
94
+ puts line
95
+ end
96
+ end
97
+
98
+ def projects_gems
99
+ @projects_gems ||= projects.inject(Gems::List.new) do |gems_list, project|
100
+ gems_list + Gems::Config.new(project).gems
101
+ end
102
+ end
103
+
104
+ def uninstall_gems_list(gems)
105
+ results = {}
106
+ gems.each_gem_with_version do |gemname, version|
107
+ cmd = "sudo gem uninstall --ignore-dependencies --executables -v %s %s > /dev/null" % [version, gemname]
108
+ puts ' ' << cmd
109
+ result = system(cmd)
110
+ results['%s-%s' % [gemname, version]] = result
111
+ end
112
+ successful = results.select {|gemname, success| success}
113
+ unsuccessful = results.select {|gemname, success| !success}
114
+ if successful.size > 0
115
+ puts "Successfully uninstalled: %s" % successful.map{|ary| ary[0]}.sort.join(", ")
116
+ end
117
+ if unsuccessful.size > 0
118
+ puts "Failed to uninstall: %s" % unsuccessful.map{|ary| ary[0]}.sort.join(", ")
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,123 @@
1
+ require 'yaml'
2
+ require 'gems/parser'
3
+
4
+ module Gems
5
+ class Config
6
+ attr_reader :name
7
+
8
+ def initialize(name)
9
+ @name = name
10
+ end
11
+
12
+ def add_gems(file)
13
+ new_gems = Gems::Parser.new(file).gems
14
+ new_gems.each do |gemname, versions|
15
+ versions.each do |version|
16
+ add_gem(gemname, version)
17
+ end
18
+ end
19
+ save_config
20
+ end
21
+
22
+ def export_gems(file)
23
+ File.open(file,'wb') do |f|
24
+ gems.sort_by{|gemname, versions| gemname}.each do |gemname, versions|
25
+ f.puts "%s (%s)" % [gemname, versions.join(", ")]
26
+ end
27
+ end
28
+ end
29
+
30
+ def import_gems(file)
31
+ new_gems = Gems::Parser.new(file).gems
32
+ self.gems = new_gems
33
+ save_config
34
+ end
35
+
36
+ def options_for(gemname)
37
+ gem_options[gemname] || []
38
+ end
39
+
40
+ def set_gem_options(gemname, options)
41
+ gem_options[gemname] = options
42
+ save_config
43
+ end
44
+
45
+ # Load gems.
46
+ #
47
+ # Returns a Gems::List.
48
+ #
49
+ # Old data structures are automatically converted to new data structures.
50
+ def gems
51
+ gem_data = (project['gems'] ||= Gems::List.new)
52
+ return gem_data if gem_data.kind_of? Gems::List
53
+ if gem_data.kind_of? Hash
54
+ project['gems'] = Gems::List.new(gem_data)
55
+ save_config
56
+ return gems
57
+ end
58
+ new_gems = Gems::List.new
59
+ gem_data.each do |gem_ary|
60
+ new_gems[gem_ary[0]] = gem_ary[1]
61
+ end
62
+ project['gems'] = new_gems
63
+ save_config
64
+ return gems
65
+ end
66
+
67
+ def project_names
68
+ projects.keys.sort
69
+ end
70
+
71
+ protected
72
+
73
+ def add_gem(gemname, version)
74
+ gems[gemname] ||= []
75
+ gems[gemname] << version
76
+ gems[gemname].uniq!
77
+ gems[gemname].sort!
78
+ end
79
+
80
+ def config
81
+ @config ||= config_content
82
+ end
83
+ alias_method :load_config, :config
84
+
85
+ def gem_options
86
+ project['gems_options'] ||= {}
87
+ end
88
+
89
+ def gems=(new_gems)
90
+ project['gems'] = new_gems
91
+ end
92
+
93
+ def project
94
+ projects[name] ||= {}
95
+ end
96
+
97
+ def projects
98
+ config['projects'] ||= {}
99
+ end
100
+
101
+ def save_config
102
+ File.open(config_file, 'wb') {|f| f.puts(config.to_yaml)}
103
+ end
104
+
105
+ private
106
+
107
+ def config_file
108
+ File.expand_path('~/.gems.yml')
109
+ end
110
+
111
+ def config_content
112
+ YAML.load_file(config_file)
113
+ rescue SystemCallError, ArgumentError => e
114
+ {}
115
+ rescue TypeError => e
116
+ $stderr.puts "Upgrading #{config_file}"
117
+ require 'gems/updater'
118
+ updater = Gems::Updater.new(name)
119
+ updater.update
120
+ retry
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,49 @@
1
+ module Gems
2
+ class List < Hash
3
+ def initialize(hsh={})
4
+ hsh.each do |key, value|
5
+ self[key] = value
6
+ end
7
+ end
8
+
9
+ def -(other)
10
+ diff = Gems::List.new
11
+ self.each do |gem, versions|
12
+ if other.has_key?(gem)
13
+ other_versions = other[gem]
14
+ versions_unique_to_current = versions - other_versions
15
+ diff[gem] = versions_unique_to_current if versions_unique_to_current.size > 0
16
+ else
17
+ diff[gem] = versions
18
+ end
19
+ end
20
+ diff
21
+ end
22
+
23
+ # Returns a new Gemlist which is the union of both GemLists.
24
+ def +(other)
25
+ union = self.dup
26
+ other.each do |gem, versions|
27
+ if union.has_key? gem
28
+ union[gem] = (union[gem] + versions).uniq.sort
29
+ else
30
+ union[gem] = versions
31
+ end
32
+ end
33
+ union
34
+ end
35
+
36
+ def each_gem_with_version(&block)
37
+ raise ArgumentError, 'No block provided' unless block
38
+ self.each do |gemname, versions|
39
+ versions.each do |version|
40
+ block.call(gemname, version)
41
+ end
42
+ end
43
+ end
44
+
45
+ def longest_key_length
46
+ map{|key, value| key.to_s.size}.max || 0
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,46 @@
1
+ module Gems
2
+ class Parser
3
+ attr_reader :file
4
+
5
+ def initialize(file)
6
+ @file = file
7
+ end
8
+
9
+ def gems
10
+ @gems ||= parse_gems
11
+ end
12
+
13
+ protected
14
+
15
+ def str
16
+ @str ||= read_file
17
+ end
18
+
19
+ private
20
+
21
+ def parse_gems
22
+ parsed_gems = Gems::List.new
23
+ str.each do |line|
24
+ gemname, *versions = line.split(" ")
25
+ next if gemname.to_s.size == 0
26
+ versions.each {|v| v.gsub!(/[^\d.]/,'')}
27
+ versions = versions.select {|v| v =~ /(\d+\.)+\d+/}
28
+ versions.flatten!
29
+ versions.compact!
30
+ versions.uniq!
31
+ next if versions.size == 0
32
+ parsed_gems[gemname] = versions
33
+ end
34
+ return parsed_gems
35
+ end
36
+
37
+ def read_file
38
+ if file == 'current'
39
+ return `gem list`
40
+ else
41
+ raise 'File does not exist: "%s"' % file unless File.exist?(file)
42
+ return File.read(file)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,12 @@
1
+ require 'gems/config'
2
+
3
+ module Gems
4
+ class Updater < Gems::Config
5
+ def update
6
+ load_config
7
+ save_config
8
+ end
9
+ end
10
+ end
11
+
12
+ GemsList = Gems::List
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.2.2
4
+ version: 0.3.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: 2009-01-13 00:00:00 -08:00
12
+ date: 2009-09-07 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -29,11 +29,14 @@ files:
29
29
  - gems.gemspec
30
30
  - bin/gems
31
31
  - lib/gems.rb
32
- - lib/gems_config.rb
33
- - lib/gems_parser.rb
34
- - lib/gems_list.rb
32
+ - lib/gems/base.rb
33
+ - lib/gems/config.rb
34
+ - lib/gems/list.rb
35
+ - lib/gems/parser.rb
36
+ - lib/gems/updater.rb
35
37
  has_rdoc: true
36
38
  homepage: http://www.github.com/Narnach/gems
39
+ licenses:
37
40
  post_install_message:
38
41
  rdoc_options:
39
42
  - --inline-source
@@ -57,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
60
  requirements: []
58
61
 
59
62
  rubyforge_project:
60
- rubygems_version: 1.2.0
63
+ rubygems_version: 1.3.5
61
64
  signing_key:
62
65
  specification_version: 2
63
66
  summary: Gems is a simple tool to manage sets of RubyGems.
@@ -1,114 +0,0 @@
1
- require 'yaml'
2
- require 'gems_parser'
3
-
4
- class GemsConfig
5
- attr_reader :name
6
-
7
- def initialize(name)
8
- @name = name
9
- end
10
-
11
- def add_gems(file)
12
- new_gems = GemsParser.new(file).gems
13
- new_gems.each do |gemname, versions|
14
- versions.each do |version|
15
- add_gem(gemname, version)
16
- end
17
- end
18
- save_config
19
- end
20
-
21
- def export_gems(file)
22
- File.open(file,'wb') do |f|
23
- gems.sort_by{|gemname, versions| gemname}.each do |gemname, versions|
24
- f.puts "%s (%s)" % [gemname, versions.join(", ")]
25
- end
26
- end
27
- end
28
-
29
- def import_gems(file)
30
- new_gems = GemsParser.new(file).gems
31
- self.gems = new_gems
32
- save_config
33
- end
34
-
35
- def options_for(gemname)
36
- gem_options[gemname] || []
37
- end
38
-
39
- def set_gem_options(gemname, options)
40
- gem_options[gemname] = options
41
- save_config
42
- end
43
-
44
- # Load gems.
45
- #
46
- # Returns a GemsList.
47
- #
48
- # Old data structures are automatically converted to new data structures.
49
- def 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
58
- gem_data.each do |gem_ary|
59
- new_gems[gem_ary[0]] = gem_ary[1]
60
- end
61
- project['gems'] = new_gems
62
- save_config
63
- return gems
64
- end
65
-
66
- def project_names
67
- projects.keys.sort
68
- end
69
-
70
- protected
71
-
72
- def add_gem(gemname, version)
73
- gems[gemname] ||= []
74
- gems[gemname] << version
75
- gems[gemname].uniq!
76
- gems[gemname].sort!
77
- end
78
-
79
- def config
80
- @config ||= load_config
81
- end
82
-
83
- def gem_options
84
- project['gems_options'] ||= {}
85
- end
86
-
87
- def gems=(new_gems)
88
- project['gems'] = new_gems
89
- end
90
-
91
- def project
92
- projects[name] ||= {}
93
- end
94
-
95
- def projects
96
- config['projects'] ||= {}
97
- end
98
-
99
- private
100
-
101
- def config_file
102
- File.expand_path('~/.gems.yml')
103
- end
104
-
105
- def load_config
106
- YAML.load_file(config_file)
107
- rescue SystemCallError, ArgumentError
108
- {}
109
- end
110
-
111
- def save_config
112
- File.open(config_file, 'wb') {|f| f.puts(config.to_yaml)}
113
- end
114
- end
@@ -1,47 +0,0 @@
1
- class GemsList < Hash
2
- def initialize(hsh={})
3
- hsh.each do |key, value|
4
- self[key] = value
5
- end
6
- end
7
-
8
- def -(other)
9
- diff = GemsList.new
10
- self.each do |gem, versions|
11
- if other.has_key?(gem)
12
- other_versions = other[gem]
13
- versions_unique_to_current = versions - other_versions
14
- diff[gem] = versions_unique_to_current if versions_unique_to_current.size > 0
15
- else
16
- diff[gem] = versions
17
- end
18
- end
19
- diff
20
- end
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
-
35
- def each_gem_with_version(&block)
36
- raise ArgumentError, 'No block provided' unless block
37
- self.each do |gemname, versions|
38
- versions.each do |version|
39
- block.call(gemname, version)
40
- end
41
- end
42
- end
43
-
44
- def longest_key_length
45
- map{|key, value| key.to_s.size}.max || 0
46
- end
47
- end
@@ -1,44 +0,0 @@
1
- class GemsParser
2
- attr_reader :file
3
-
4
- def initialize(file)
5
- @file = file
6
- end
7
-
8
- def gems
9
- @gems ||= parse_gems
10
- end
11
-
12
- protected
13
-
14
- def str
15
- @str ||= read_file
16
- end
17
-
18
- private
19
-
20
- def parse_gems
21
- parsed_gems = GemsList.new
22
- str.each do |line|
23
- gemname, *versions = line.split(" ")
24
- next if gemname.to_s.size == 0
25
- versions.each {|v| v.gsub!(/[^\d.]/,'')}
26
- versions = versions.select {|v| v =~ /(\d+\.)+\d+/}
27
- versions.flatten!
28
- versions.compact!
29
- versions.uniq!
30
- next if versions.size == 0
31
- parsed_gems[gemname] = versions
32
- end
33
- return parsed_gems
34
- end
35
-
36
- def read_file
37
- if file == 'current'
38
- return `gem list`
39
- else
40
- raise 'File does not exist: "%s"' % file unless File.exist?(file)
41
- return File.read(file)
42
- end
43
- end
44
- end