Narnach-gems 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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