manman 0.1.0 → 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/Manifest.txt +1 -0
- data/README.markdown +65 -1
- data/Rakefile +1 -1
- data/lib/manman.rb +1 -4
- data/lib/manman/opts.rb +39 -8
- data/lib/manman/runner.rb +16 -123
- data/lib/manman/version.rb +1 -1
- data/lib/manman/worker.rb +189 -0
- metadata +38 -61
data/Manifest.txt
CHANGED
data/README.markdown
CHANGED
@@ -4,10 +4,26 @@ Manifest Manager in Ruby
|
|
4
4
|
|
5
5
|
* [geraldb.github.com/manman](http://geraldb.github.com/manman)
|
6
6
|
|
7
|
+
`manman` calculates MD5 digests/hashes for files listed in manifest template.
|
7
8
|
|
8
9
|
## Usage
|
9
10
|
|
10
|
-
|
11
|
+
manman - Manifest Manager
|
12
|
+
|
13
|
+
Usage: manman [options]
|
14
|
+
-r, --release RELEASE Release Version (e.g. 2013.08)
|
15
|
+
-e, --env ENV Environment (e.g. TEST)
|
16
|
+
-u, --valid_until VALID Valid until (e.g. 2014.01.31)
|
17
|
+
-d, --dir PATH Path to Packages (default is ./paket)
|
18
|
+
-t, --template FILE Input Template (default is paket.txt.erb)
|
19
|
+
-o, --out FILE Output File (default is paket.txt)
|
20
|
+
-v, --version Show version
|
21
|
+
--verbose Show debug trace
|
22
|
+
-h, --help Show this message
|
23
|
+
|
24
|
+
Examples:
|
25
|
+
manman -r 2013.08 -e TEST
|
26
|
+
manman -r 2013.08 -e TEST -u 2014.12.31
|
11
27
|
|
12
28
|
|
13
29
|
## Install
|
@@ -17,6 +33,54 @@ Just install the gem:
|
|
17
33
|
$ gem install manman
|
18
34
|
|
19
35
|
|
36
|
+
|
37
|
+
|
38
|
+
## MD5 Digest Samples/Notes
|
39
|
+
|
40
|
+
### What is MD5?
|
41
|
+
|
42
|
+
MD5 is a one-way hashing algorithm for 128 bit (16 byte) digest "signatures" or checksums
|
43
|
+
(e.g. `bd2e45b8fde5af0ead14ceb80ce3256a`).
|
44
|
+
|
45
|
+
### MD5 Digest for Strings
|
46
|
+
|
47
|
+
require 'digest/md5'
|
48
|
+
|
49
|
+
digest = Digest::MD5.hexdigest( "Hello MD5 Digest!\n" )
|
50
|
+
puts digest
|
51
|
+
|
52
|
+
# => bd2e45b8fde5af0ead14ceb80ce3256a
|
53
|
+
|
54
|
+
|
55
|
+
### MD5 Digest for Files
|
56
|
+
|
57
|
+
require 'digest/md5'
|
58
|
+
|
59
|
+
digest = Digest::MD5.hexdigest( File.read( ARGV[0] ) )
|
60
|
+
puts digest
|
61
|
+
|
62
|
+
# => fc2f4ec029715550401c99a188b904b1
|
63
|
+
|
64
|
+
### MD5 Digest Calculation in Steps/Chunks
|
65
|
+
|
66
|
+
require 'digest/md5'
|
67
|
+
|
68
|
+
all_digest = Digest::MD5.hexdigest( File.read( ARGV[0] ) )
|
69
|
+
|
70
|
+
inc_digest = Digest::MD5.new
|
71
|
+
file = File.open( ARGV[0], 'r' )
|
72
|
+
file.each_line do |line|
|
73
|
+
inc_digest.update( line ) # or use <<-alias e.g. inc_digest << line
|
74
|
+
end
|
75
|
+
|
76
|
+
puts inc_digest.hexdigest
|
77
|
+
puts all_digest
|
78
|
+
|
79
|
+
# => fc2f4ec029715550401c99a188b904b1
|
80
|
+
# => fc2f4ec029715550401c99a188b904b1
|
81
|
+
|
82
|
+
|
83
|
+
|
20
84
|
## License
|
21
85
|
|
22
86
|
The `manman` scripts are dedicated to the public domain.
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ Hoe.spec 'manman' do
|
|
11
11
|
self.urls = ['http://geraldb.github.com/manman']
|
12
12
|
|
13
13
|
self.author = 'Gerald Bauer'
|
14
|
-
self.email = '
|
14
|
+
self.email = 'gerald.bauer@example.com'
|
15
15
|
|
16
16
|
# switch extension to .markdown for gihub formatting
|
17
17
|
self.readme_file = 'README.markdown'
|
data/lib/manman.rb
CHANGED
@@ -18,6 +18,7 @@ require 'digest/md5'
|
|
18
18
|
require 'manman/version'
|
19
19
|
require 'manman/opts'
|
20
20
|
require 'manman/runner'
|
21
|
+
require 'manman/worker'
|
21
22
|
|
22
23
|
module Manman
|
23
24
|
|
@@ -25,10 +26,6 @@ module Manman
|
|
25
26
|
"manman #{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
26
27
|
end
|
27
28
|
|
28
|
-
def self.root
|
29
|
-
"#{File.expand_path( File.dirname(File.dirname(__FILE__)) )}"
|
30
|
-
end
|
31
|
-
|
32
29
|
def self.main
|
33
30
|
Runner.new.run(ARGV)
|
34
31
|
end
|
data/lib/manman/opts.rb
CHANGED
@@ -2,6 +2,45 @@ module Manman
|
|
2
2
|
|
3
3
|
class Opts
|
4
4
|
|
5
|
+
# extra headers for manifest
|
6
|
+
# - headers get ignored (assumed NOT to be files that get md5 checksum/digest/hash calculated)
|
7
|
+
def headers=(value)
|
8
|
+
# NB: value is supposed to be an array of strings
|
9
|
+
@headers = value
|
10
|
+
end
|
11
|
+
|
12
|
+
## fix/todo:
|
13
|
+
## also make it into a command line option!!
|
14
|
+
|
15
|
+
def headers
|
16
|
+
# NB: return value is supposed to be an array of strings
|
17
|
+
@headers || []
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
## NB: for now pass in an obj, that is, self
|
22
|
+
## in the future pass in proc? or something else?? to make it more configurable??
|
23
|
+
|
24
|
+
def filter_callback=(value)
|
25
|
+
@filter = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def filter_callback
|
29
|
+
@filter # NB: has no default; returns nil if not set
|
30
|
+
end
|
31
|
+
|
32
|
+
def encrypt_callback=(value)
|
33
|
+
@encrypt = value
|
34
|
+
end
|
35
|
+
|
36
|
+
def encrypt_callback
|
37
|
+
@encrypt # NB: has no default; returns nil if not set
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
|
5
44
|
def base=(value)
|
6
45
|
@base = value
|
7
46
|
end
|
@@ -54,15 +93,7 @@ class Opts
|
|
54
93
|
def valid
|
55
94
|
@valid # NB: has no default; required arg
|
56
95
|
end
|
57
|
-
|
58
96
|
|
59
|
-
def config_path=(value)
|
60
|
-
@config_path = value
|
61
|
-
end
|
62
|
-
|
63
|
-
def config_path
|
64
|
-
@config_path || '~/.manman'
|
65
|
-
end
|
66
97
|
|
67
98
|
end # class Opts
|
68
99
|
|
data/lib/manman/runner.rb
CHANGED
@@ -2,9 +2,13 @@ module Manman
|
|
2
2
|
|
3
3
|
class Runner
|
4
4
|
|
5
|
-
def initialize
|
6
|
-
|
7
|
-
|
5
|
+
def initialize( logger=nil )
|
6
|
+
if logger.nil?
|
7
|
+
@logger = Logger.new(STDOUT)
|
8
|
+
@logger.level = Logger::INFO
|
9
|
+
else
|
10
|
+
@logger = logger
|
11
|
+
end
|
8
12
|
|
9
13
|
@opts = Opts.new
|
10
14
|
end
|
@@ -42,11 +46,6 @@ class Runner
|
|
42
46
|
end
|
43
47
|
|
44
48
|
|
45
|
-
|
46
|
-
cmd.on( '-c', '--config PATH', "Configuration Path (default is #{opts.config_path})" ) do |path|
|
47
|
-
opts.config_path = path
|
48
|
-
end
|
49
|
-
|
50
49
|
cmd.on( '-v', '--version', "Show version" ) do
|
51
50
|
puts Manman.banner
|
52
51
|
exit
|
@@ -79,130 +78,24 @@ EOS
|
|
79
78
|
|
80
79
|
# check for required args
|
81
80
|
|
82
|
-
puts "*** Missing Argument: Release Argument Required"
|
83
|
-
puts "*** Missing Argument:
|
84
|
-
puts "*** Missing Argument: Environment Argument Required" if opts.valid.nil?
|
81
|
+
puts "*** Missing Argument: -r/--release Release Argument Required" if opts.release.nil?
|
82
|
+
puts "*** Missing Argument: -e/--env Argument Required" if opts.env.nil?
|
85
83
|
|
86
|
-
if opts.release.nil? || opts.env.nil?
|
84
|
+
if opts.release.nil? || opts.env.nil?
|
87
85
|
puts
|
88
86
|
puts "Use -h/--help for usage options."
|
89
87
|
return ## exit ??
|
90
88
|
end
|
91
89
|
|
92
|
-
puts "Using settings:"
|
93
|
-
pp opts
|
94
|
-
|
95
|
-
|
96
|
-
generate_manifest()
|
97
|
-
|
98
|
-
puts 'Done.'
|
99
|
-
|
100
|
-
end # method run
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
def generate_manifest
|
105
|
-
|
106
|
-
puts " working folder is: #{Dir.pwd}"
|
107
|
-
|
108
|
-
puts "Loading template #{opts.template}..."
|
109
|
-
|
110
|
-
old_lines = File.read( opts.template )
|
111
|
-
|
112
|
-
new_lines = []
|
113
|
-
|
114
|
-
header_lines = []
|
115
|
-
|
90
|
+
# puts "Using settings:"
|
91
|
+
# pp opts
|
116
92
|
|
117
|
-
|
118
|
-
|
119
|
-
header_lines << "# generated on #{Time.now} using #{Manman.banner}\n"
|
120
|
-
header_lines << "# - version: #{opts.release}, env: #{opts.env}, valid until: #{opts.valid}\n"
|
121
|
-
|
122
|
-
old_lines.each_line do |line|
|
123
|
-
|
124
|
-
if line =~ /^\s*#/
|
125
|
-
# skip komments and do NOT copy to result (keep comments secret!)
|
126
|
-
logger.debug 'skipping comment line'
|
127
|
-
next
|
128
|
-
end
|
93
|
+
worker = Worker.new( logger, opts )
|
94
|
+
worker.run
|
129
95
|
|
130
|
-
|
131
|
-
# kommentar oder leerzeile überspringen
|
132
|
-
logger.debug 'skipping blank line'
|
133
|
-
new_lines << line
|
134
|
-
next
|
135
|
-
end
|
136
|
-
|
137
|
-
# split/process key value pair
|
138
|
-
|
139
|
-
tokens = line.split( ':' )
|
140
|
-
|
141
|
-
key = tokens[0]
|
142
|
-
values = tokens[1]
|
143
|
-
|
144
|
-
|
145
|
-
## special keys (NOT files; do NOT calculate md5 digest)
|
146
|
-
|
147
|
-
## todo: make headers configurable
|
148
|
-
|
149
|
-
if [ 'VERSION', 'UMGEBUNG', 'MANDANT', 'GUELTIG_BIS', 'CHECKSUM' ].include?( key )
|
150
|
-
if key == 'VERSION'
|
151
|
-
new_lines << "#{key}: #{opts.release}\n"
|
152
|
-
elsif key == 'UMGEBUNG'
|
153
|
-
new_lines << "#{key}: #{opts.env}\n"
|
154
|
-
elsif key == 'GUELTIG_BIS'
|
155
|
-
new_lines << "#{key}: #{opts.valid}\n"
|
156
|
-
else
|
157
|
-
new_lines << line ## just pass header line throug; not modified
|
158
|
-
end
|
159
|
-
next
|
160
|
-
end
|
161
|
-
|
162
|
-
### calculate md5 digests
|
163
|
-
|
164
|
-
md5 = ""
|
165
|
-
fn = "#{opts.base}/#{key}" # filename
|
166
|
-
|
167
|
-
if File.exists?( fn ) == false
|
168
|
-
md5 = "xxxxxxx"
|
169
|
-
msg = "*** ERROR: #{key} missing; using path #{fn}"
|
170
|
-
puts msg
|
171
|
-
header_lines << "# #{msg}\n" # add error to header in manifest
|
172
|
-
else
|
173
|
-
md5 = calc_digest_md5( fn )
|
174
|
-
puts "OK #{key} -> #{md5}"
|
175
|
-
end
|
176
|
-
|
177
|
-
new_lines << "#{key}: #{md5}, #{values}"
|
178
|
-
|
179
|
-
end # oldlines.each
|
180
|
-
|
181
|
-
|
182
|
-
header_lines << "#####################################\n"
|
183
|
-
header_lines << "\n"
|
184
|
-
|
185
|
-
new_lines = header_lines + new_lines
|
186
|
-
|
187
|
-
File.open( opts.output, 'w') do |f|
|
188
|
-
new_lines.each do |line|
|
189
|
-
f.write( line )
|
190
|
-
end
|
191
|
-
end
|
96
|
+
# puts 'Done.'
|
192
97
|
|
193
|
-
end
|
194
|
-
|
195
|
-
|
196
|
-
def calc_digest_md5( fn )
|
197
|
-
# digest/hash is a string of 20 hexadecimal 8-bit numbers
|
198
|
-
# example:
|
199
|
-
# 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
|
200
|
-
|
201
|
-
md5 = Digest::MD5.hexdigest( File.open( fn, 'rb') { |f| f.read } )
|
202
|
-
md5
|
203
|
-
end
|
204
|
-
|
205
|
-
|
98
|
+
end # method run
|
206
99
|
|
207
100
|
end # class Runner
|
208
101
|
end # module Manman
|
data/lib/manman/version.rb
CHANGED
@@ -0,0 +1,189 @@
|
|
1
|
+
module Manman
|
2
|
+
|
3
|
+
class Worker
|
4
|
+
|
5
|
+
def initialize( logger=nil, opts=nil )
|
6
|
+
if logger.nil?
|
7
|
+
@logger = Logger.new(STDOUT)
|
8
|
+
@logger.level = Logger::INFO
|
9
|
+
else
|
10
|
+
@logger = logger
|
11
|
+
end
|
12
|
+
|
13
|
+
if opts.nil?
|
14
|
+
@opts = Opts.new
|
15
|
+
else
|
16
|
+
@opts = opts
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :logger, :opts
|
21
|
+
|
22
|
+
|
23
|
+
def run
|
24
|
+
puts "Using settings:"
|
25
|
+
pp opts
|
26
|
+
|
27
|
+
generate_manifest()
|
28
|
+
|
29
|
+
puts 'Done.'
|
30
|
+
end # method run
|
31
|
+
|
32
|
+
|
33
|
+
def generate_manifest
|
34
|
+
|
35
|
+
puts " working folder is: #{Dir.pwd}"
|
36
|
+
|
37
|
+
puts "Loading template #{opts.template}..."
|
38
|
+
|
39
|
+
old_lines = File.read( opts.template )
|
40
|
+
|
41
|
+
new_lines = []
|
42
|
+
|
43
|
+
header_lines = []
|
44
|
+
|
45
|
+
|
46
|
+
### todo/fix: move to template ???
|
47
|
+
header_lines << "####################################################\n"
|
48
|
+
header_lines << "# generated on #{Time.now} using #{Manman.banner}\n"
|
49
|
+
header_lines << "# - version: #{opts.release}, env: #{opts.env}\n"
|
50
|
+
|
51
|
+
old_lines.each_line do |line|
|
52
|
+
|
53
|
+
if line =~ /^\s*#/
|
54
|
+
# skip komments and do NOT copy to result (keep comments secret!)
|
55
|
+
logger.debug 'skipping comment line'
|
56
|
+
next
|
57
|
+
end
|
58
|
+
|
59
|
+
if line =~ /^\s*$/
|
60
|
+
# kommentar oder leerzeile überspringen
|
61
|
+
logger.debug 'skipping blank line'
|
62
|
+
new_lines << line
|
63
|
+
next
|
64
|
+
end
|
65
|
+
|
66
|
+
# split/process key value pair
|
67
|
+
|
68
|
+
tokens = line.split( ':' )
|
69
|
+
|
70
|
+
key = tokens[0]
|
71
|
+
values = tokens[1]
|
72
|
+
|
73
|
+
## special keys (NOT files; do NOT calculate md5 digest)
|
74
|
+
|
75
|
+
headers_release = [ 'RELEASE', 'VERSION' ]
|
76
|
+
headers_env = [ 'ENV', 'UMGEBUNG' ]
|
77
|
+
headers_valid = [ 'VALID_UNTIL', 'GUELTIG_BIS' ]
|
78
|
+
headers_checksum = [ 'CHECKSUM' ]
|
79
|
+
|
80
|
+
headers = headers_release + headers_env + headers_valid + headers_checksum
|
81
|
+
headers += opts.headers # add possible user defined extra headers
|
82
|
+
|
83
|
+
if headers.include?( key )
|
84
|
+
if headers_release.include?( key )
|
85
|
+
new_lines << "#{key}: #{opts.release}\n"
|
86
|
+
elsif headers_env.include?( key )
|
87
|
+
new_lines << "#{key}: #{opts.env}\n"
|
88
|
+
elsif headers_valid.include?( key )
|
89
|
+
new_lines << "#{key}: #{opts.valid}\n"
|
90
|
+
else # assume extra headers or checksum
|
91
|
+
new_lines << line ## just pass header line throug; not modified
|
92
|
+
end
|
93
|
+
next
|
94
|
+
end
|
95
|
+
|
96
|
+
### calculate md5 digests
|
97
|
+
|
98
|
+
md5 = ""
|
99
|
+
fn = "#{opts.base}/#{key}" # filename
|
100
|
+
|
101
|
+
if File.exists?( fn ) == false
|
102
|
+
md5 = "xxxxxxx"
|
103
|
+
msg = "*** ERROR: #{key} missing; using path #{fn}"
|
104
|
+
puts msg
|
105
|
+
header_lines << "# #{msg}\n" # add error to header in manifest
|
106
|
+
else
|
107
|
+
md5 = calc_digest_md5( fn )
|
108
|
+
puts "OK #{key} -> #{md5}"
|
109
|
+
end
|
110
|
+
|
111
|
+
new_lines << "#{key}: #{md5}, #{values}"
|
112
|
+
|
113
|
+
end # oldlines.each
|
114
|
+
|
115
|
+
|
116
|
+
header_lines << "#####################################\n"
|
117
|
+
header_lines << "\n"
|
118
|
+
|
119
|
+
new_lines = header_lines + new_lines
|
120
|
+
|
121
|
+
# lines all in one string (no array/ary of lines)
|
122
|
+
new_lines_all_in_one = ""
|
123
|
+
new_lines.each do |line|
|
124
|
+
new_lines_all_in_one << line
|
125
|
+
end
|
126
|
+
|
127
|
+
puts "[debug] new_lines_all_in_one:"
|
128
|
+
puts new_lines_all_in_one
|
129
|
+
|
130
|
+
## allow custom filter (lets you add custom headers,checksums,etc.)
|
131
|
+
new_lines_all_in_one = filter_callback( new_lines_all_in_one )
|
132
|
+
|
133
|
+
## last step - calculate checksum
|
134
|
+
new_lines_all_in_one = generate_checksum( new_lines_all_in_one )
|
135
|
+
|
136
|
+
File.open( opts.output, 'w') do |f|
|
137
|
+
f.write( new_lines_all_in_one )
|
138
|
+
end
|
139
|
+
|
140
|
+
end # method generate_manifest
|
141
|
+
|
142
|
+
|
143
|
+
def encrypt_callback( text )
|
144
|
+
if opts.encrypt_callback.nil?
|
145
|
+
puts "[debug] no encrypt callback configured"
|
146
|
+
text # pass through; identity; do nothing
|
147
|
+
else
|
148
|
+
opts.encrypt_callback.encrypt_callback( text )
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def filter_callback( text )
|
153
|
+
if opts.filter_callback.nil?
|
154
|
+
puts "[debug] no filter callback configured"
|
155
|
+
text
|
156
|
+
else
|
157
|
+
opts.filter_callback.filter_callback( text )
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def generate_checksum( text )
|
162
|
+
|
163
|
+
# NB: remove possible old checksum in checksum line w/ empty line before md5 calculation
|
164
|
+
hash = Digest::MD5.hexdigest( text.gsub( /^CHECKSUM:.*/, '' ) )
|
165
|
+
puts "Paket-Hash >#{hash}<"
|
166
|
+
encrypted_hash = encrypt_callback( hash )
|
167
|
+
|
168
|
+
## use strip why? why not?
|
169
|
+
## was encrypted_hash.strip
|
170
|
+
|
171
|
+
text.gsub( /^CHECKSUM:.*/, "CHECKSUM: #{encrypted_hash}" )
|
172
|
+
end
|
173
|
+
|
174
|
+
def calc_digest_md5( fn )
|
175
|
+
# digest/hash is a string of 20 hexadecimal 8-bit numbers
|
176
|
+
# example:
|
177
|
+
# 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
|
178
|
+
|
179
|
+
## NB: use b - binary
|
180
|
+
# required for Windows-only (avoids changing of newlines \n to \n\r or similar)
|
181
|
+
|
182
|
+
md5 = Digest::MD5.hexdigest( File.open( fn, 'rb') { |f| f.read } )
|
183
|
+
md5
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
end # class Worker
|
189
|
+
end # module Manman
|
metadata
CHANGED
@@ -1,61 +1,46 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: manman
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 0.1.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Gerald Bauer
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-10-25 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rdoc
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &17647704 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 3
|
31
|
-
- 10
|
32
|
-
version: "3.10"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.10'
|
33
22
|
type: :development
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: hoe
|
37
23
|
prerelease: false
|
38
|
-
|
24
|
+
version_requirements: *17647704
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hoe
|
27
|
+
requirement: &17647416 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
|
-
requirements:
|
29
|
+
requirements:
|
41
30
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 3
|
46
|
-
- 0
|
47
|
-
version: "3.0"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.1'
|
48
33
|
type: :development
|
49
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *17647416
|
50
36
|
description: manman - Manifest Manager
|
51
|
-
email:
|
52
|
-
executables:
|
37
|
+
email: gerald.bauer@example.com
|
38
|
+
executables:
|
53
39
|
- manman
|
54
40
|
extensions: []
|
55
|
-
|
56
|
-
extra_rdoc_files:
|
41
|
+
extra_rdoc_files:
|
57
42
|
- Manifest.txt
|
58
|
-
files:
|
43
|
+
files:
|
59
44
|
- History.markdown
|
60
45
|
- Manifest.txt
|
61
46
|
- README.markdown
|
@@ -65,39 +50,31 @@ files:
|
|
65
50
|
- lib/manman/opts.rb
|
66
51
|
- lib/manman/runner.rb
|
67
52
|
- lib/manman/version.rb
|
53
|
+
- lib/manman/worker.rb
|
68
54
|
homepage: http://geraldb.github.com/manman
|
69
55
|
licenses: []
|
70
|
-
|
71
56
|
post_install_message:
|
72
|
-
rdoc_options:
|
57
|
+
rdoc_options:
|
73
58
|
- --main
|
74
59
|
- README.markdown
|
75
|
-
require_paths:
|
60
|
+
require_paths:
|
76
61
|
- lib
|
77
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
63
|
none: false
|
79
|
-
requirements:
|
80
|
-
- -
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
|
83
|
-
|
84
|
-
- 0
|
85
|
-
version: "0"
|
86
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
69
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
|
92
|
-
segments:
|
93
|
-
- 0
|
94
|
-
version: "0"
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
95
74
|
requirements: []
|
96
|
-
|
97
75
|
rubyforge_project: manman
|
98
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.7.2
|
99
77
|
signing_key:
|
100
78
|
specification_version: 3
|
101
79
|
summary: manman - Manifest Manager
|
102
80
|
test_files: []
|
103
|
-
|