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 +24 -16
- data/gems.gemspec +4 -3
- data/lib/gems.rb +2 -118
- data/lib/gems/base.rb +122 -0
- data/lib/gems/config.rb +123 -0
- data/lib/gems/list.rb +49 -0
- data/lib/gems/parser.rb +46 -0
- data/lib/gems/updater.rb +12 -0
- metadata +9 -6
- data/lib/gems_config.rb +0 -114
- data/lib/gems_list.rb +0 -47
- data/lib/gems_parser.rb +0 -44
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
|
-
|
19
|
-
|
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
|
-
|
23
|
-
|
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 =
|
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 =
|
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 =
|
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>
|
63
|
-
Import all gems in
|
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
|
-
|
67
|
-
|
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
|
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.
|
7
|
-
s.date = '2009-
|
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
|
-
|
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}
|
data/lib/gems.rb
CHANGED
@@ -1,120 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'gems_parser'
|
3
|
-
require 'gems_list'
|
1
|
+
require 'gems/base'
|
4
2
|
|
5
|
-
|
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
|
data/lib/gems/base.rb
ADDED
@@ -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
|
data/lib/gems/config.rb
ADDED
@@ -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
|
data/lib/gems/list.rb
ADDED
@@ -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
|
data/lib/gems/parser.rb
ADDED
@@ -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
|
data/lib/gems/updater.rb
ADDED
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.
|
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-
|
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/
|
33
|
-
- lib/
|
34
|
-
- lib/
|
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.
|
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.
|
data/lib/gems_config.rb
DELETED
@@ -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
|
data/lib/gems_list.rb
DELETED
@@ -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
|
data/lib/gems_parser.rb
DELETED
@@ -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
|