Sha256: 5aa42c89e29277a49d8931a6a01c1d300ce3048b4e4a0d506473cc1ccf2a44ec

Contents?: true

Size: 1.3 KB

Versions: 12

Compression:

Stored size: 1.3 KB

Contents

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

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
leap_cli-1.9.2 lib/leap_cli/core_ext/json.rb
leap_cli-1.9.1 lib/leap_cli/core_ext/json.rb
leap_cli-1.9 lib/leap_cli/core_ext/json.rb
leap_cli-1.8.1 lib/leap_cli/core_ext/json.rb
leap_cli-1.8 lib/leap_cli/core_ext/json.rb
leap_cli-1.7.4 lib/leap_cli/core_ext/json.rb
leap_cli-1.7.3 lib/leap_cli/core_ext/json.rb
leap_cli-1.6.2 lib/leap_cli/core_ext/json.rb
leap_cli-1.5.6 lib/core_ext/json.rb
leap_cli-1.5.1 lib/core_ext/json.rb
leap_cli-1.5.0 lib/core_ext/json.rb
leap_cli-1.2.5 lib/core_ext/json.rb