Simplify the binary by moving all application specific code into a new
Facter::Application module. This module is then refactored to use
OptionParser and to simplify invocation logic, while maintaining
existing behavior.

Signed-off-by: Rein Henrichs <[email protected]>
---
 bin/facter                |  135 ++++-----------------------------------------
 lib/facter/application.rb |   99 +++++++++++++++++++++++++++++++++
 2 files changed, 111 insertions(+), 123 deletions(-)
 create mode 100644 lib/facter/application.rb

diff --git a/bin/facter b/bin/facter
index a6cb717..328d5fc 100755
--- a/bin/facter
+++ b/bin/facter
@@ -18,11 +18,8 @@
 #
 # = Options
 #
-# debug::
-#   Enable debugging.
-#
-# help::
-#   Print this help message
+# yaml::
+#   Emit facts in YAML format.
 #
 # puppet::
 #   Load the Puppet libraries, thus allowing Facter to load Puppet-specific 
facts.
@@ -30,8 +27,14 @@
 # version::
 #   Print the version and exit.
 #
-# yaml::
-#   Emit facts in YAML format.
+# help::
+#   Print this help message.
+#
+# debug::
+#   Enable debugging.
+#
+# trace::
+#   Enable backtraces.
 #
 # = Example
 #
@@ -46,120 +49,6 @@
 # Copyright (c) 2006 Reductive Labs, LLC
 # Licensed under the GNU Public License
 
-require 'getoptlong'
-require 'facter'
-
-$haveusage = true
-
-begin
-    require 'rdoc/ri/ri_paths'
-    require 'rdoc/usage'
-rescue Exception
-    $haveusage = false
-end
-
-def load_puppet
-    require 'puppet'
-    Puppet.parse_config
-
-    # If you've set 'vardir' but not 'libdir' in your
-    # puppet.conf, then the hook to add libdir to $:
-    # won't get triggered.  This makes sure that it's setup
-    # correctly.
-    unless $LOAD_PATH.include?(Puppet[:libdir])
-        $LOAD_PATH << Puppet[:libdir]
-    end
-end
-
-$debug = 0
-
-config = nil
-
-result = GetoptLong.new(
-    [ "--version", "-v", GetoptLong::NO_ARGUMENT       ],
-    [ "--help",    "-h", GetoptLong::NO_ARGUMENT       ],
-    [ "--debug",   "-d", GetoptLong::NO_ARGUMENT       ],
-    [ "--yaml",    "-y", GetoptLong::NO_ARGUMENT       ],
-    [ "--config",  "-c", GetoptLong::REQUIRED_ARGUMENT ],
-    [ "--puppet",  "-p", GetoptLong::NO_ARGUMENT       ]
-)
-
-options = {
-    :yaml => false
-}
-
-begin
-    result.each { |opt,arg|
-        case opt
-        when "--version"
-            puts "%s" % Facter.version
-            exit
-        when "--puppet"
-            begin
-                load_puppet()
-            rescue LoadError => detail
-                $stderr.puts "Could not load Puppet: %s" % detail
-            end
-        when "--yaml"
-            options[:yaml] = true
-        when "--debug"
-            Facter.debugging(1)
-        when "--help"
-            if $haveusage
-                RDoc::usage && exit
-            else
-                puts "No help available unless you have RDoc::usage installed"
-                exit
-            end
-        else
-            $stderr.puts "Invalid option '#{opt}'"
-            exit(12)
-        end
-    }
-rescue
-    exit(12)
-end
-
-names = []
-
-unless config.nil?
-    File.open(config) { |file|
-        names = file.readlines.collect { |line|
-            line.chomp
-        }
-    }
-end
-
-ARGV.each { |item|
-    names.push item
-}
-
-facts = Facter.to_hash
-
-unless names.empty?
-    facts = {}
-    names.each { |name|
-        begin
-            facts[name] = Facter.value(name)
-        rescue => error
-            STDERR.puts "Could not retrieve %s: #{error}" % name
-            exit 10
-        end
-    }
-end
-
-if options[:yaml]
-    require 'yaml'
-    puts YAML.dump(facts)
-    exit(0)
-end
+require 'facter/application'
 
-facts.sort { |a, b| a[0].to_s <=> b[0].to_s }.each { |name,value|
-    if facts.length == 1
-        unless value.nil?
-            puts value
-        end
-    else
-        puts "%s => %s" % [name,value]
-    end
-}
+Facter::Application.run(ARGV)
diff --git a/lib/facter/application.rb b/lib/facter/application.rb
new file mode 100644
index 0000000..51dbd14
--- /dev/null
+++ b/lib/facter/application.rb
@@ -0,0 +1,99 @@
+module Facter
+  module Application
+    def self.run(argv)
+      require 'optparse'
+      require 'facter'
+
+      options = parse(argv)
+
+      # Accept fact names to return from the command line
+      names = argv
+
+      # Create the facts hash that is printed to standard out
+      if names.empty?
+        facts = Facter.to_hash
+      else
+        facts = {}
+        names.each { |name|
+          begin
+            facts[name] = Facter.value(name)
+          rescue => error
+            $stderr.puts "Could not retrieve #{name}: #{error}"
+            exit 10
+          end
+        }
+      end
+
+      # Print the facts as YAML and exit
+      if options[:yaml]
+        require 'yaml'
+        puts YAML.dump(facts)
+        exit(0)
+      end
+
+      # Print the value of a single fact, otherwise print a list sorted by fact
+      # name and separated by "=>"
+      if facts.length == 1
+        if value = facts.values.first
+          puts value
+        end
+      else
+        facts.sort_by{ |fact| fact.first }.each do |name,value|
+          puts "#{name} => #{value}"
+        end
+      end
+
+    rescue => e
+      $stderr.puts "Error: #{e}"
+      exit(12)
+    end
+
+    private
+
+    def self.parse(argv)
+      options = {}
+      OptionParser.new do |opts|
+        opts.on("-y", "--yaml")   { |v| options[:yaml]   = v }
+
+        opts.on("-d", "--debug")  { |v| Facter.debugging(1) }
+        opts.on("-p", "--puppet") { |v| load_puppet }
+
+        opts.on_tail("-v", "--version") do
+          puts Facter.version
+          exit(0)
+        end
+
+        opts.on_tail("-h", "--help") do
+          begin
+            require 'rdoc/ri/ri_paths'
+            require 'rdoc/usage'
+            puts RDoc.usage
+          ensure
+            exit
+          end
+        end
+      end.parse!
+
+      options
+    rescue OptionParser::InvalidOption => e
+      $stderr.puts e.message
+      exit(12)
+    end
+
+    def self.load_puppet
+      require 'puppet'
+      Puppet.parse_config
+
+      # If you've set 'vardir' but not 'libdir' in your
+      # puppet.conf, then the hook to add libdir to $:
+      # won't get triggered.  This makes sure that it's setup
+      # correctly.
+      unless $LOAD_PATH.include?(Puppet[:libdir])
+        $LOAD_PATH << Puppet[:libdir]
+      end
+    rescue LoadError => detail
+      $stderr.puts "Could not load Puppet: #{detail}"
+    end
+
+  end
+end
-- 
1.7.0.4

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to