From e44e2085f1e186264692096db1b7d426849ab7d7 Mon Sep 17 00:00:00 2001 From: elijah Date: Wed, 22 Oct 2014 01:27:08 -0700 Subject: json bugfix: upgrading CertificateAuthority gem broke everything, since it depends on ActiveSupport, which in turn badly modifies how JSON works. This commit does some hacky stuff to prevent ActiveSupport from messing with JSON and allows us to mess with JSON. --- lib/leap_cli.rb | 4 ++++ lib/override/json.rb | 11 +++++++++++ lib/override/to_json.rb | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 lib/override/json.rb create mode 100644 lib/override/to_json.rb diff --git a/lib/leap_cli.rb b/lib/leap_cli.rb index 6cd625e..baff32f 100644 --- a/lib/leap_cli.rb +++ b/lib/leap_cli.rb @@ -5,6 +5,10 @@ end $ruby_version = RUBY_VERSION.split('.').collect{ |i| i.to_i }.extend(Comparable) +# ensure leap_cli/lib/overrides has the highest priority +# (these files override bad behavior in gems that overrides JSON) +$:.unshift(File.expand_path('../override',__FILE__)) + require 'leap/platform' require 'leap_cli/version' diff --git a/lib/override/json.rb b/lib/override/json.rb new file mode 100644 index 0000000..8857a22 --- /dev/null +++ b/lib/override/json.rb @@ -0,0 +1,11 @@ +# +# This exists solely to prevent other gems we depend on from +# importing json/ext (e.g. require 'json'). +# +# If json/ext is imported, json/pure cannot work, and we heavily +# rely on the specific behavior of json/pure. +# +# This trick only works if this directory is early in the +# include path. +# +require 'json/pure' diff --git a/lib/override/to_json.rb b/lib/override/to_json.rb new file mode 100644 index 0000000..73fbe5c --- /dev/null +++ b/lib/override/to_json.rb @@ -0,0 +1,20 @@ +# +# activesupport/lib/core_ext/object/to_json.rb overrides to_json for +# most core objects like so: +# +# [Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass].each do |klass| +# klass.class_eval do +# # Dumps object in JSON (JavaScript Object Notation). See www.json.org for more info. +# def to_json(options = nil) +# ActiveSupport::JSON.encode(self, options) +# end +# end +# end +# +# We cannot tolerate this. We need the normal to_json to be called, not +# ActiveSupport's custom version. +# +# This file exists to override the behavior of ActiveSupport. This file will get included +# instead of the normal to_json.rb. +# + -- cgit v1.2.3