diff options
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' |