rprogram 0.1.5 → 0.1.6

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.
Binary file
@@ -1,3 +1,17 @@
1
+ === 0.1.6 / 2009-06-30
2
+
3
+ * Use Hoe 2.2.0.
4
+ * Removed requirement for 'open3'.
5
+ * Renamed Compat.PATHS to Compat.paths.
6
+ * Refactored Option#arguments.
7
+ * Removed Option#format.
8
+ * Refactored NonOption#arguments.
9
+ * Renamed NonOption#leading to NonOption#leading?.
10
+ * Removed NonOption#tailing.
11
+ * Added NonOption#tailing?.
12
+ * Added specs.
13
+ * All specs pass on Ruby 1.9.1-p0 and 1.8.6-p287.
14
+
1
15
  === 0.1.5 / 2009-01-14
2
16
 
3
17
  * Use Kernel.system in RProgram::Program#run, instead of Open3.popen3:
@@ -0,0 +1,23 @@
1
+
2
+
3
+ The MIT License
4
+
5
+ Copyright (c) 2007-2008 Hal Brodigan
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in
15
+ all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ THE SOFTWARE.
@@ -1,16 +1,14 @@
1
1
  History.txt
2
2
  Manifest.txt
3
+ LICENSE.txt
3
4
  README.txt
4
5
  Rakefile
5
6
  lib/rprogram.rb
6
- lib/rprogram/version.rb
7
7
  lib/rprogram/compat.rb
8
8
  lib/rprogram/exceptions/program_not_found.rb
9
9
  lib/rprogram/exceptions.rb
10
10
  lib/rprogram/extensions/meta/object.rb
11
11
  lib/rprogram/extensions/meta.rb
12
- lib/rprogram/extensions/array.rb
13
- lib/rprogram/extensions/hash.rb
14
12
  lib/rprogram/extensions.rb
15
13
  lib/rprogram/option_list.rb
16
14
  lib/rprogram/option.rb
@@ -20,4 +18,19 @@ lib/rprogram/task.rb
20
18
  lib/rprogram/nameable.rb
21
19
  lib/rprogram/program.rb
22
20
  lib/rprogram/rprogram.rb
23
- test/test_rprogram.rb
21
+ lib/rprogram/version.rb
22
+ spec/spec_helper.rb
23
+ spec/classes/named_program.rb
24
+ spec/classes/aliased_program.rb
25
+ spec/classes/ls_program.rb
26
+ spec/classes/ls_task.rb
27
+ spec/classes/ls_selinux_task.rb
28
+ spec/rprogram_spec.rb
29
+ spec/compat_spec.rb
30
+ spec/option_examples.rb
31
+ spec/option_spec.rb
32
+ spec/non_option_spec.rb
33
+ spec/option_list_spec.rb
34
+ spec/nameable_spec.rb
35
+ spec/program_spec.rb
36
+ spec/task_spec.rb
data/README.txt CHANGED
@@ -1,6 +1,7 @@
1
1
  = RProgram
2
2
 
3
3
  * http://rprogram.rubyforge.org/
4
+ * http://github.com/postmodern/rprogram/
4
5
  * Postmodern (postmodern.mod3 at gmail.com)
5
6
 
6
7
  == DESCRIPTION:
data/Rakefile CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'hoe'
5
- require './lib/rprogram/version.rb'
5
+ require 'hoe/signing'
6
+ require './tasks/spec.rb'
6
7
 
7
- Hoe.new('rprogram', RProgram::VERSION) do |p|
8
- p.rubyforge_name = 'rprogram'
9
- p.developer('Postmodern', 'postmodern.mod3@gmail.com')
10
- p.remote_rdoc_dir = ''
8
+ Hoe.spec('rprogram') do
9
+ self.rubyforge_name = 'rprogram'
10
+ self.developer('Postmodern', 'postmodern.mod3@gmail.com')
11
+ self.remote_rdoc_dir = ''
11
12
  end
12
13
 
13
14
  # vim: syntax=Ruby
@@ -5,7 +5,7 @@ module RProgram
5
5
  #
6
6
  # Compat.arch #=> "linux"
7
7
  #
8
- def self.platform
8
+ def Compat.platform
9
9
  RUBY_PLATFORM.split('-').last
10
10
  end
11
11
 
@@ -14,14 +14,14 @@ module RProgram
14
14
  # If the +PATH+ environment variable is not setup, an empty array will
15
15
  # be returned.
16
16
  #
17
- # Compat.PATH #=> ["/bin", "/usr/bin"]
17
+ # Compat.paths #=> ["/bin", "/usr/bin"]
18
18
  #
19
- def self.PATH
19
+ def Compat.paths
20
20
  # return an empty array in case
21
21
  # the PATH variable does not exist
22
22
  return [] unless ENV['PATH']
23
23
 
24
- if self.platform =~ /mswin32/
24
+ if Compat.platform =~ /mswin(32|64)/
25
25
  return ENV['PATH'].split(';')
26
26
  else
27
27
  return ENV['PATH'].split(':')
@@ -34,8 +34,8 @@ module RProgram
34
34
  #
35
35
  # Compat.find_program('as') #=> "/usr/bin/as"
36
36
  #
37
- def self.find_program(name)
38
- self.PATH.each do |dir|
37
+ def Compat.find_program(name)
38
+ Compat.paths.each do |dir|
39
39
  full_path = File.expand_path(File.join(dir,name))
40
40
 
41
41
  return full_path if File.file?(full_path)
@@ -51,8 +51,8 @@ module RProgram
51
51
  #
52
52
  # Compat.find_program_by_names("gas","as") #=> "/usr/bin/as"
53
53
  #
54
- def self.find_program_by_names(*names)
55
- names.map { |name| self.find_program(name) }.compact.first
54
+ def Compat.find_program_by_names(*names)
55
+ names.map { |name| Compat.find_program(name) }.compact.first
56
56
  end
57
57
  end
58
58
  end
@@ -1,3 +1 @@
1
1
  require 'rprogram/extensions/meta'
2
- require 'rprogram/extensions/array'
3
- require 'rprogram/extensions/hash'
@@ -3,7 +3,7 @@ require 'rprogram/compat'
3
3
 
4
4
  module RProgram
5
5
  module Nameable
6
- def self.included(base)
6
+ def self.included(base) # :nodoc:
7
7
  base.metaclass_eval do
8
8
  #
9
9
  # Returns the name of the program.
@@ -60,5 +60,12 @@ module RProgram
60
60
  def program_aliases
61
61
  self.class.program_aliases
62
62
  end
63
+
64
+ #
65
+ # Returns the program names.
66
+ #
67
+ def program_names
68
+ self.class.program_names
69
+ end
63
70
  end
64
71
  end
@@ -4,12 +4,6 @@ module RProgram
4
4
  # Name of the argument(s)
5
5
  attr_reader :name
6
6
 
7
- # Is the argument a leading argument(s)
8
- attr_reader :leading
9
-
10
- # Is the argument a tailing argument(s)
11
- attr_reader :tailing
12
-
13
7
  # Can the argument be specified multiple times
14
8
  attr_reader :multiple
15
9
 
@@ -28,9 +22,31 @@ module RProgram
28
22
  def initialize(options={})
29
23
  @name = options[:name]
30
24
 
31
- @leading = options[:leading] || false
32
- @tailing = options[:tailing] || true
33
- @multiple = options[:multiple] || false
25
+ @tailing = if options[:leading]
26
+ !(options[:leading])
27
+ elsif options[:tailing]
28
+ options[:tailing]
29
+ else
30
+ true
31
+ end
32
+
33
+ @multiple = (options[:multiple] || false)
34
+ end
35
+
36
+ #
37
+ # Returns +true+ if the non-options arguments are tailing, returns
38
+ # +false+ otherwise.
39
+ #
40
+ def tailing?
41
+ @tailing == true
42
+ end
43
+
44
+ #
45
+ # Returns +true+ if the non-options arguments are leading, returns
46
+ # +false+ otherwise.
47
+ #
48
+ def leading?
49
+ !(@tailing)
34
50
  end
35
51
 
36
52
  #
@@ -38,19 +54,23 @@ module RProgram
38
54
  # specified _value_.
39
55
  #
40
56
  def arguments(value)
41
- return [] if (value==nil || value==false)
57
+ return [] unless value
42
58
 
43
59
  if value.kind_of?(Hash)
44
- return value.map { |name,value| "#{name}=#{value}" }
45
- elsif value.kind_of?(Array)
46
- if @multiple
47
- return value.compact
48
- else
49
- return value.join
60
+ value = value.map do |key,sub_value|
61
+ if sub_value == true
62
+ key.to_s
63
+ elsif sub_value
64
+ "#{key}=#{sub_value}"
65
+ end
50
66
  end
67
+ elsif value.kind_of?(Array)
68
+ value = value.flatten
51
69
  else
52
- return [value]
70
+ value = [value]
53
71
  end
72
+
73
+ return value.compact
54
74
  end
55
75
 
56
76
  end
@@ -1,5 +1,3 @@
1
- require 'rprogram/extensions'
2
-
3
1
  module RProgram
4
2
  class Option
5
3
 
@@ -43,12 +41,26 @@ module RProgram
43
41
  def initialize(options={},&block)
44
42
  @flag = options[:flag]
45
43
 
46
- @equals = options[:equals] || false
47
- @multiple = options[:multiple] || false
48
- @separator = options[:separator]
49
- @sub_options = options[:sub_options] || false
50
-
51
- @formating = block
44
+ @equals = (options[:equals] || false)
45
+ @multiple = (options[:multiple] || false)
46
+ @separator = if options[:separator]
47
+ options[:separator]
48
+ elsif options[:equals]
49
+ ' '
50
+ end
51
+ @sub_options = (options[:sub_options] || false)
52
+
53
+ @formatter = if block
54
+ block
55
+ else
56
+ Proc.new do |opt,value|
57
+ if opt.equals
58
+ ["#{opt.flag}=#{value.first}"]
59
+ else
60
+ [opt.flag] + value
61
+ end
62
+ end
63
+ end
52
64
  end
53
65
 
54
66
  #
@@ -56,47 +68,35 @@ module RProgram
56
68
  # _value_.
57
69
  #
58
70
  def arguments(value)
59
- return [@flag] if value==true
60
- return [] if (value==nil || value==false)
61
-
62
- if value.respond_to?(:arguments)
63
- value = value.arguments
71
+ return [@flag] if value == true
72
+ return [] unless value
73
+
74
+ value = value.arguments if value.respond_to?(:arguments)
75
+
76
+ if value.kind_of?(Hash)
77
+ value = value.map { |key,sub_value|
78
+ if sub_value == true
79
+ key.to_s
80
+ elsif sub_value
81
+ "#{key}=#{sub_value}"
82
+ end
83
+ }
84
+ elsif value.kind_of?(Array)
85
+ value.flatten!
86
+ else
87
+ value = [value]
64
88
  end
65
89
 
90
+ value.compact!
91
+
66
92
  if @multiple
67
- if value.respond_to?(:map)
68
- return value.map { |arg| format(arg) }
93
+ return value.inject([]) do |args,value|
94
+ args + @formatter.call(self,[value])
69
95
  end
70
- end
71
-
72
- if (value.kind_of?(Array) && @separator)
73
- value = value.join(@separator)
74
- end
75
-
76
- return format(value)
77
- end
78
-
79
- protected
80
-
81
- #
82
- # Returns an Array of the flag and the specified _value_ in argument
83
- # form.
84
- #
85
- def default_format(value)
86
- return [@flag] + value if value.kind_of?(Array)
87
- return ["#{flag}=#{value}"] if @equals
88
- return [@flag, value]
89
- end
90
-
91
- #
92
- # Formats specified _value_ with the option flag using
93
- # either the custom formating or the default_format.
94
- #
95
- def format(value)
96
- if @formating
97
- return @formating.call(@flag,value).to_a
98
96
  else
99
- return default_format(value)
97
+ value = [value.join(@separator)] if @separator
98
+
99
+ return @formatter.call(self,value)
100
100
  end
101
101
  end
102
102
 
@@ -1,5 +1,3 @@
1
- require 'rprogram/extensions/hash'
2
-
3
1
  module RProgram
4
2
  class OptionList < Hash
5
3
 
@@ -23,14 +21,14 @@ module RProgram
23
21
  name = sym.to_s
24
22
 
25
23
  unless block
26
- if (name =~ /=$/ && args.length==1)
27
- return self[name.chop.to_sym] = args[0]
28
- elsif args.length==0
24
+ if (name =~ /=$/ && args.length == 1)
25
+ return self[name.chop.to_sym] = args.first
26
+ elsif args.empty?
29
27
  return self[sym]
30
28
  end
31
29
  end
32
30
 
33
- super(sym,*args,&block)
31
+ return super(sym,*args,&block)
34
32
  end
35
33
 
36
34
  end
@@ -4,7 +4,7 @@ require 'rprogram/option'
4
4
 
5
5
  module RProgram
6
6
  module Options
7
- def self.included(base)
7
+ def self.included(base) # :nodoc:
8
8
  base.metaclass_eval do
9
9
  #
10
10
  # Returns a Hash of all defined non-options.
@@ -21,7 +21,7 @@ module RProgram
21
21
  name = name.to_sym
22
22
 
23
23
  ancestors.each do |base|
24
- if base.include?(Options)
24
+ if base.include?(RProgram::Options)
25
25
  return true if base.non_options.include?(name)
26
26
  end
27
27
  end
@@ -36,7 +36,7 @@ module RProgram
36
36
  name = name.to_sym
37
37
 
38
38
  ancestors.each do |base|
39
- if base.include?(Options)
39
+ if base.include?(RProgram::Options)
40
40
  if base.non_options.has_key?(name)
41
41
  return base.non_options[name]
42
42
  end
@@ -61,7 +61,7 @@ module RProgram
61
61
  name = name.to_sym
62
62
 
63
63
  ancestors.each do |base|
64
- if base.include?(Options)
64
+ if base.include?(RProgram::Options)
65
65
  return true if base.options.has_key?(name)
66
66
  end
67
67
  end
@@ -77,7 +77,7 @@ module RProgram
77
77
  name = name.to_sym
78
78
 
79
79
  ancestors.each do |base|
80
- if base.include?(Options)
80
+ if base.include?(RProgram::Options)
81
81
  return base.options[name] if base.options.has_key?(name)
82
82
  end
83
83
  end
@@ -4,8 +4,6 @@ require 'rprogram/task'
4
4
  require 'rprogram/nameable'
5
5
  require 'rprogram/exceptions/program_not_found'
6
6
 
7
- require 'open3'
8
-
9
7
  module RProgram
10
8
  class Program
11
9
 
@@ -39,29 +37,29 @@ module RProgram
39
37
 
40
38
  #
41
39
  # Creates a new program object with the specified _path_, if _path_
42
- # is a valid file. Any given _args_ or a given _block_ will be used
40
+ # is a valid file. Any given _arguments_ or a given _block_ will be used
43
41
  # in creating the new program.
44
42
  #
45
43
  # Program.find_with_path('/bin/cd') # => Program
46
44
  #
47
45
  # Program.find_with_path('/obviously/fake') # => nil
48
46
  #
49
- def self.find_with_path(path,*args,&block)
50
- return self.new(path,*args,&block) if File.file?(path)
47
+ def self.find_with_path(path,*arguments,&block)
48
+ return self.new(path,*arguments,&block) if File.file?(path)
51
49
  end
52
50
 
53
51
  #
54
52
  # Creates a new program object with the specified _paths_,
55
- # if a path within _paths_ is a valid file. Any given _args_ or
53
+ # if a path within _paths_ is a valid file. Any given _arguments_ or
56
54
  # a given _block_ will be used in creating the new program.
57
55
  #
58
56
  # Program.find_with_paths(['/bin/cd','/usr/bin/cd']) # => Program
59
57
  #
60
58
  # Program.find_with_paths(['/obviously/fake','/bla']) # => nil
61
59
  #
62
- def self.find_with_paths(paths,*args,&block)
60
+ def self.find_with_paths(paths,*arguments,&block)
63
61
  paths.each do |path|
64
- return self.new(path,*args,&block) if File.file?(path)
62
+ return self.new(path,*arguments,&block) if File.file?(path)
65
63
  end
66
64
  end
67
65
 
@@ -69,7 +67,7 @@ module RProgram
69
67
  # Finds and creates the program using it's +program_names+ and returns
70
68
  # a new Program object. If the program cannot be found by any of it's
71
69
  # +program_names+, a ProramNotFound exception will be raised. Any given
72
- # _args_ or a given _block_ will be used in creating the new program.
70
+ # _arguments_ or a given _block_ will be used in creating the new program.
73
71
  #
74
72
  # Program.find # => Program
75
73
  #
@@ -77,19 +75,20 @@ module RProgram
77
75
  # ...
78
76
  # end
79
77
  #
80
- def self.find(*args,&block)
81
- path = Compat.find_program_by_names(program_names)
78
+ def self.find(*arguments,&block)
79
+ path = Compat.find_program_by_names(*self.program_names)
80
+
82
81
  unless path
83
- names = program_names.map { |name| name.dump }.join(', ')
82
+ names = self.program_names.map { |name| name.dump }.join(', ')
84
83
 
85
84
  raise(ProgramNotFound,"programs #{names} were not found",caller)
86
85
  end
87
86
 
88
- return self.new(path,*args,&block)
87
+ return self.new(path,*arguments,&block)
89
88
  end
90
89
 
91
90
  #
92
- # Runs the program with the specified _args_ and returns
91
+ # Runs the program with the specified _arguments_ and returns
93
92
  # either +true+ or +false+, depending on the exit status of the
94
93
  # program.
95
94
  #