diff options
| author | elijah <elijah@riseup.net> | 2014-11-24 22:45:27 -0800 | 
|---|---|---|
| committer | elijah <elijah@riseup.net> | 2014-11-24 22:45:27 -0800 | 
| commit | b839376a507e37a048ea2df53127ed0884310f60 (patch) | |
| tree | 68ba30a77c51a3ee1a2c9ddd7187e6743cff08f1 /lib/leap_cli | |
| parent | 8450768268c2bdf82cd6d6bfa9972c70bc5cdcac (diff) | |
moved core_ext and lib_ext under leap_cli
Diffstat (limited to 'lib/leap_cli')
| -rw-r--r-- | lib/leap_cli/commands/deploy.rb | 4 | ||||
| -rw-r--r-- | lib/leap_cli/core_ext/boolean.rb | 14 | ||||
| -rw-r--r-- | lib/leap_cli/core_ext/hash.rb | 35 | ||||
| -rw-r--r-- | lib/leap_cli/core_ext/json.rb | 42 | ||||
| -rw-r--r-- | lib/leap_cli/core_ext/nil.rb | 5 | ||||
| -rw-r--r-- | lib/leap_cli/core_ext/string.rb | 14 | ||||
| -rw-r--r-- | lib/leap_cli/core_ext/yaml.rb | 29 | ||||
| -rw-r--r-- | lib/leap_cli/lib_ext/capistrano_connections.rb | 16 | ||||
| -rw-r--r-- | lib/leap_cli/lib_ext/gli.rb | 52 | ||||
| -rw-r--r-- | lib/leap_cli/override/json.rb | 11 | ||||
| -rw-r--r-- | lib/leap_cli/util/remote_command.rb | 2 | 
11 files changed, 222 insertions, 2 deletions
| diff --git a/lib/leap_cli/commands/deploy.rb b/lib/leap_cli/commands/deploy.rb index 6589837..90807db 100644 --- a/lib/leap_cli/commands/deploy.rb +++ b/lib/leap_cli/commands/deploy.rb @@ -73,7 +73,9 @@ module LeapCli              end            end          end - +        if !Util.exit_status.nil? && Util.exit_status != 0 +          log :warning, "puppet did not finish successfully." +        end        end      end diff --git a/lib/leap_cli/core_ext/boolean.rb b/lib/leap_cli/core_ext/boolean.rb new file mode 100644 index 0000000..9b617b2 --- /dev/null +++ b/lib/leap_cli/core_ext/boolean.rb @@ -0,0 +1,14 @@ +# +# make is_a?(Boolean) possible. +# + +module Boolean +end + +class TrueClass +  include Boolean +end + +class FalseClass +  include Boolean +end
\ No newline at end of file diff --git a/lib/leap_cli/core_ext/hash.rb b/lib/leap_cli/core_ext/hash.rb new file mode 100644 index 0000000..7df33b2 --- /dev/null +++ b/lib/leap_cli/core_ext/hash.rb @@ -0,0 +1,35 @@ +class Hash + +  ## +  ## CONVERTING +  ## + +  # +  # convert self into a hash, but only include the specified keys +  # +  def pick(*keys) +    keys.map(&:to_s).inject({}) do |hsh, key| +      if has_key?(key) +        hsh[key] = self[key] +      end +      hsh +    end +  end + +  # +  # recursive merging (aka deep merge) +  # taken from ActiveSupport::CoreExtensions::Hash::DeepMerge +  # +  def deep_merge(other_hash) +    self.merge(other_hash) do |key, oldval, newval| +      oldval = oldval.to_hash if oldval.respond_to?(:to_hash) +      newval = newval.to_hash if newval.respond_to?(:to_hash) +      oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? oldval.deep_merge(newval) : newval +    end +  end + +  def deep_merge!(other_hash) +    replace(deep_merge(other_hash)) +  end + +end diff --git a/lib/leap_cli/core_ext/json.rb b/lib/leap_cli/core_ext/json.rb new file mode 100644 index 0000000..1a82bd9 --- /dev/null +++ b/lib/leap_cli/core_ext/json.rb @@ -0,0 +1,42 @@ +module JSON +  # +  # Output JSON from ruby objects in such a manner that all the hashes and arrays are output in alphanumeric sorted order. +  # This is required so that our generated configs don't throw puppet or git for a tizzy fit. +  # +  # Beware: some hacky stuff ahead. +  # +  # This relies on the pure ruby implementation of JSON.generate (i.e. require 'json/pure') +  # see https://github.com/flori/json/blob/master/lib/json/pure/generator.rb +  # +  # The Oj way that we are not using: Oj.dump(obj, :mode => :compat, :indent => 2) +  # +  def self.sorted_generate(obj) +    # modify hash and array +    Array.class_eval do +      alias_method :each_without_sort, :each +      def each(&block) +        sorted = sort {|a,b| a.to_s <=> b.to_s } +        for i in 0..(sorted.length-1) do +          yield sorted[i] +        end +      end +    end +    Hash.class_eval do +      alias_method :each_without_sort, :each +      def each(&block) +        self.keys.each do |key| +          yield key, self.fetch(key) # fetch is used so we don't trigger Config::Object auto-eval +        end +      end +    end + +    # generate json +    json_str = JSON.pretty_generate(obj) + +    # restore hash and array +    Hash.class_eval  {alias_method :each, :each_without_sort} +    Array.class_eval {alias_method :each, :each_without_sort} + +    return json_str +  end +end diff --git a/lib/leap_cli/core_ext/nil.rb b/lib/leap_cli/core_ext/nil.rb new file mode 100644 index 0000000..05ca98f --- /dev/null +++ b/lib/leap_cli/core_ext/nil.rb @@ -0,0 +1,5 @@ +class NilClass +  def any? +    false +  end +end
\ No newline at end of file diff --git a/lib/leap_cli/core_ext/string.rb b/lib/leap_cli/core_ext/string.rb new file mode 100644 index 0000000..07af8e5 --- /dev/null +++ b/lib/leap_cli/core_ext/string.rb @@ -0,0 +1,14 @@ +# +# make ruby 1.9 act more like ruby 1.8 +# +unless String.method_defined?(:to_a) +  class String +    def to_a; [self]; end +  end +end + +unless String.method_defined?(:any?) +  class String +    def any?; self.chars.any?; end +  end +end diff --git a/lib/leap_cli/core_ext/yaml.rb b/lib/leap_cli/core_ext/yaml.rb new file mode 100644 index 0000000..bb0b5c9 --- /dev/null +++ b/lib/leap_cli/core_ext/yaml.rb @@ -0,0 +1,29 @@ +class Object +  # +  # ya2yaml will output hash keys in sorted order, but it outputs arrays +  # in natural order. This new method, sorted_ya2yaml(), is the same as +  # ya2yaml but ensures that arrays are sorted. +  # +  # This is important so that the .yaml files don't change each time you recompile. +  # +  # see https://github.com/afunai/ya2yaml/blob/master/lib/ya2yaml.rb +  # +  def sorted_ya2yaml(options = {}) +    # modify array +    Array.class_eval do +      alias_method :collect_without_sort, :collect +      def collect(&block) +        sorted = sort {|a,b| a.to_s <=> b.to_s} +        sorted.collect_without_sort(&block) +      end +    end + +    # generate yaml +    yaml_str = self.ya2yaml(options) + +    # restore array +    Array.class_eval {alias_method :collect, :collect_without_sort} + +    return yaml_str +  end +end diff --git a/lib/leap_cli/lib_ext/capistrano_connections.rb b/lib/leap_cli/lib_ext/capistrano_connections.rb new file mode 100644 index 0000000..c46455f --- /dev/null +++ b/lib/leap_cli/lib_ext/capistrano_connections.rb @@ -0,0 +1,16 @@ +module Capistrano +  class Configuration +    module Connections +      def failed!(server) +        @failure_callback.call(server) if @failure_callback +        Thread.current[:failed_sessions] << server +      end + +      def call_on_failure(&block) +        @failure_callback = block +      end +    end +  end +end + + diff --git a/lib/leap_cli/lib_ext/gli.rb b/lib/leap_cli/lib_ext/gli.rb new file mode 100644 index 0000000..f9b03be --- /dev/null +++ b/lib/leap_cli/lib_ext/gli.rb @@ -0,0 +1,52 @@ +# +# print subcommands indented in the main global help screen +# + +module GLI +  module Commands +    module HelpModules +      class GlobalHelpFormat +        SUB_CMD_INDENT = "  " +        def format +          program_desc = @app.program_desc +          program_long_desc = @app.program_long_desc +          if program_long_desc +            wrapper = @wrapper_class.new(Terminal.instance.size[0],4) +            program_long_desc = "\n    #{wrapper.wrap(program_long_desc)}\n\n" if program_long_desc +          else +            program_long_desc = "\n" +          end + +          # build a list of commands, sort them so the commands with subcommands are at the bottom +          commands = @sorter.call(@app.commands_declaration_order.reject(&:nodoc)).sort do |a,b| +            if a.commands.any? && b.commands.any?;  a.name.to_s <=> b.name.to_s +            elsif a.commands.any?;                  1 +            elsif b.commands.any?;                 -1 +            else;                                   a.name.to_s <=> b.name.to_s +            end +          end + +          # build a list of command info ([name, description]), including subcommands if appropriate +          command_info_list = [] +          commands.each do |command| +            name = [command.name, Array(command.aliases)].flatten.join(', ') +            command_info_list << [name, command.description] +            if command.commands.any? +              @sorter.call(command.commands_declaration_order).each do |cmd| +                command_info_list << [SUB_CMD_INDENT + command.name.to_s + " " + cmd.names, cmd.description + (command.get_default_command == cmd.name ? " (default)" : "")] +              end +            end +          end + +          # display +          command_formatter = ListFormatter.new(command_info_list, @wrapper_class) +          stringio = StringIO.new +          command_formatter.output(stringio) +          commands = stringio.string +          global_option_descriptions = OptionsFormatter.new(global_flags_and_switches, @sorter, @wrapper_class).format +          GLOBAL_HELP.result(binding) +        end +      end +    end +  end +end diff --git a/lib/leap_cli/override/json.rb b/lib/leap_cli/override/json.rb new file mode 100644 index 0000000..a7ae328 --- /dev/null +++ b/lib/leap_cli/override/json.rb @@ -0,0 +1,11 @@ +# +# This exists solely to prevent other gems we depend on from +# importing json/ext (e.g. require 'json'). +# +# If json/ext is imported, json/pure cannot work, and we heavily +# rely on the specific behavior of json/pure. +# +# This trick only works if this directory is early in the +# include path. +# +require 'json/pure'
\ No newline at end of file diff --git a/lib/leap_cli/util/remote_command.rb b/lib/leap_cli/util/remote_command.rb index 16d2b22..10a5ca8 100644 --- a/lib/leap_cli/util/remote_command.rb +++ b/lib/leap_cli/util/remote_command.rb @@ -120,7 +120,7 @@ module LeapCli; module Util; module RemoteCommand      @capistrano_enabled ||= begin        require 'capistrano'        require 'capistrano/cli' -      require 'lib_ext/capistrano_connections' +      require 'leap_cli/lib_ext/capistrano_connections'        require 'leap_cli/remote/leap_plugin'        require 'leap_cli/remote/puppet_plugin'        require 'leap_cli/remote/rsync_plugin' | 
