From b839376a507e37a048ea2df53127ed0884310f60 Mon Sep 17 00:00:00 2001 From: elijah Date: Mon, 24 Nov 2014 22:45:27 -0800 Subject: moved core_ext and lib_ext under leap_cli --- lib/leap_cli/core_ext/boolean.rb | 14 ++++++++++++++ lib/leap_cli/core_ext/hash.rb | 35 +++++++++++++++++++++++++++++++++ lib/leap_cli/core_ext/json.rb | 42 ++++++++++++++++++++++++++++++++++++++++ lib/leap_cli/core_ext/nil.rb | 5 +++++ lib/leap_cli/core_ext/string.rb | 14 ++++++++++++++ lib/leap_cli/core_ext/yaml.rb | 29 +++++++++++++++++++++++++++ 6 files changed, 139 insertions(+) create mode 100644 lib/leap_cli/core_ext/boolean.rb create mode 100644 lib/leap_cli/core_ext/hash.rb create mode 100644 lib/leap_cli/core_ext/json.rb create mode 100644 lib/leap_cli/core_ext/nil.rb create mode 100644 lib/leap_cli/core_ext/string.rb create mode 100644 lib/leap_cli/core_ext/yaml.rb (limited to 'lib/leap_cli/core_ext') 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 -- cgit v1.2.3