module Pact::ActiveSupportSupport

Public Instance Methods

fix_all_the_things(thing) click to toggle source
# File lib/pact/shared/active_support_support.rb, line 7
def fix_all_the_things thing
  if defined?(ActiveSupport)
    if thing.is_a?(Regexp)
      fix_regexp(thing)
    elsif thing.is_a?(Array)
      thing.collect{ | it | fix_all_the_things it }
    elsif thing.is_a?(Hash)
      thing.each_with_object({}) { | (k, v), new_hash | new_hash[k] = fix_all_the_things(v) }
    elsif thing.is_a?(Pact::Term)
      # matcher Regexp is fixed in its own as_json method
      thing
    elsif thing.class.name.start_with?("Pact")
      warn_about_regexp(thing)
      thing
    else
      thing
    end
  else
    thing
  end
end
fix_json_formatting(json) click to toggle source

Having Active Support JSON loaded somehow kills the formatting of pretty_generate for objects. Don’t ask me why, but it still seems to work for hashes, so the hacky work around is to reparse the generated JSON into a hash and pretty_generate that… sigh… Oh ActiveSupport, why.…

# File lib/pact/shared/active_support_support.rb, line 43
def fix_json_formatting json
  if json =~ /\{".*?":"/
    JSON.pretty_generate(JSON.parse(json, create_additions: false))
  else
    json
  end
end
fix_regexp(regexp) click to toggle source

ActiveSupport JSON overwrites (i.e. TRAMPLES) the json methods of the Regexp class directly (beneath its destructive hooves of destruction). This does not seem to be able to be undone without affecting the JSON serialisation in the calling project, so the best way I’ve found to fix this issue is to reattach the original as_json to the Regexp instances in the ConsumerContract before we write them to the pact file. If anyone can find a better way, please submit a pull request ASAP!

# File lib/pact/shared/active_support_support.rb, line 35
def fix_regexp regexp
  {:json_class => 'Regexp', "o" => regexp.options, "s" => regexp.source }
end
remove_unicode(json) click to toggle source
# File lib/pact/shared/active_support_support.rb, line 51
def remove_unicode json
  json.gsub(/\\u([0-9A-Za-z]{4})/) {|s| [$1.to_i(16)].pack("U")}
end
warn_about_regexp(thing) click to toggle source
# File lib/pact/shared/active_support_support.rb, line 55
def warn_about_regexp(thing)
  thing.instance_variables.each do | iv_name |
    iv = thing.instance_variable_get(iv_name)
    if iv.is_a?(Regexp)
      require 'pact/configuration'
      Pact.configuration.error_stream.puts("WARN: Instance variable #{iv_name} for class #{thing.class.name} is a Regexp and isn't been serialized properly. Please raise an issue at https://github.com/pact-foundation/pact-support/issues/new.")
    end
  end
end