aboutsummaryrefslogtreecommitdiff
path: root/lib/leap_cli/core_ext
diff options
context:
space:
mode:
Diffstat (limited to 'lib/leap_cli/core_ext')
-rw-r--r--lib/leap_cli/core_ext/boolean.rb14
-rw-r--r--lib/leap_cli/core_ext/hash.rb35
-rw-r--r--lib/leap_cli/core_ext/json.rb42
-rw-r--r--lib/leap_cli/core_ext/nil.rb5
-rw-r--r--lib/leap_cli/core_ext/string.rb14
-rw-r--r--lib/leap_cli/core_ext/yaml.rb29
6 files changed, 139 insertions, 0 deletions
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