diff options
author | elijah <elijah@riseup.net> | 2013-06-04 23:06:10 -0700 |
---|---|---|
committer | elijah <elijah@riseup.net> | 2013-06-04 23:06:10 -0700 |
commit | 8f79b632aeeee1111087dee6ebb6302aca700bbd (patch) | |
tree | 647b24bee28b28301de6c4a82a916222cde491e8 /lib/core_ext | |
parent | a46321a43318a9cd3e2dd645b64fe81b71e7f8ea (diff) | |
download | leap_cli-8f79b632aeeee1111087dee6ebb6302aca700bbd.tar.gz leap_cli-8f79b632aeeee1111087dee6ebb6302aca700bbd.tar.bz2 |
add support for `leap facts`. includes some fun new helpers, like run_with_progress(), capture(), and replace_file!().
Diffstat (limited to 'lib/core_ext')
-rw-r--r-- | lib/core_ext/json.rb | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/core_ext/json.rb b/lib/core_ext/json.rb new file mode 100644 index 0000000..3b08a04 --- /dev/null +++ b/lib/core_ext/json.rb @@ -0,0 +1,39 @@ +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 + Hash.class_eval do + alias_method :each_without_sort, :each + def each(&block) + keys.sort {|a,b| a.to_s <=> b.to_s }.each do |key| + yield key, self[key] + end + end + end + Array.class_eval do + alias_method :each_without_sort, :each + def each(&block) + sort {|a,b| a.to_s <=> b.to_s }.each_without_sort &block + 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 |