Class: Megam::JSONCompat

Inherits:
Object
  • Object
show all
Defined in:
lib/megam/core/json_compat.rb

Constant Summary collapse

JSON_MAX_NESTING =
1000
JSON_CLAZ =
"json_claz".freeze
MEGAM_AUTH =
"Megam::Auth".freeze
MEGAM_ERROR =
"Megam::Error".freeze
MEGAM_ACCOUNT =
"Megam::Account".freeze
MEGAM_ASSEMBLIES =
"Megam::Assemblies".freeze
MEGAM_ASSEMBLIESCOLLECTION =
"Megam::AssembliesCollection".freeze
MEGAM_ASSEMBLY =
"Megam::Assembly".freeze
MEGAM_ASSEMBLYCOLLECTION =
"Megam::AssemblyCollection".freeze
MEGAM_COMPONENTS =
"Megam::Components".freeze
MEGAM_COMPONENTSCOLLECTION =
"Megam::ComponentsCollection".freeze
MEGAM_REQUEST =
"Megam::Request".freeze
MEGAM_REQUESTCOLLECTION =
"Megam::RequestCollection".freeze
MEGAM_ORGANIZATION =
"Megam::Organizations".freeze
MEGAM_DOMAIN =
"Megam::Domains".freeze
MEGAM_APPREQUEST =
"Megam::AppRequest".freeze
MEGAM_APPREQUESTCOLLECTION =
"Megam::AppRequestCollection".freeze
MEGAM_PREDEFCLOUD =
"Megam::PredefCloud".freeze
MEGAM_PREDEFCLOUDCOLLECTION =
"Megam::PredefCloudCollection".freeze
MEGAM_CLOUDTOOLSETTING =
"Megam::CloudToolSetting".freeze
MEGAM_CLOUDTOOLSETTINGCOLLECTION =
"Megam::CloudToolSettingCollection".freeze
MEGAM_SSHKEY =
"Megam::SshKey".freeze
MEGAM_SSHKEYCOLLECTION =
"Megam::SshKeyCollection".freeze
MEGAM_MARKETPLACE =
"Megam::MarketPlace".freeze
MEGAM_MARKETPLACECOLLECTION =
"Megam::MarketPlaceCollection".freeze
MEGAM_MARKETPLACEADDON =
"Megam::MarketPlaceAddons".freeze
MEGAM_MARKETPLACEADDONCOLLECTION =
"Megam::MarketPlaceAddonsCollection".freeze
MEGAM_CSAR =
"Megam::CSAR".freeze
MEGAM_CSARCOLLECTION =
"Megam::CSARCollection".freeze

Class Method Summary collapse

Class Method Details

.class_for_json_class(json_class) ⇒ Object

Map JSON_CLAZ to a Class object. We use a case instead of a Hash assigned to a constant because otherwise this file could not be loaded until all the constants were defined, which means you’d have to load the world to get json.



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/megam/core/json_compat.rb', line 128

def class_for_json_class(json_class)
  case json_class
  when MEGAM_ERROR
    Megam::Error
  when MEGAM_AUTH
    Megam::Auth
  when MEGAM_ACCOUNT
    Megam::Account
  when MEGAM_ASSEMBLIES
    Megam::Assemblies
  when MEGAM_ASSEMBLIESCOLLECTION
    Megam::AssembliesCollection
  when MEGAM_ASSEMBLY
    Megam::Assembly
  when MEGAM_ASSEMBLYCOLLECTION
    Megam::AssemblyCollection
  when MEGAM_COMPONENTS
    Megam::Components
  when MEGAM_COMPONENTSCOLLECTION
    Megam::ComponentsCollection
  when MEGAM_REQUEST
    Megam::Request
  when MEGAM_REQUESTCOLLECTION
    Megam::RequestCollection
  when MEGAM_PREDEFCLOUD
    Megam::PredefCloud
  when MEGAM_PREDEFCLOUDCOLLECTION
    Megam::PredefCloudCollection
  when MEGAM_SSHKEY
    Megam::SshKey
  when MEGAM_SSHKEYCOLLECTION
    Megam::SshKeyCollection
  when MEGAM_MARKETPLACE
    Megam::MarketPlace
  when MEGAM_MARKETPLACECOLLECTION
    Megam::MarketPlaceCollection
  when MEGAM_MARKETPLACEADDON
    Megam::MarketPlaceAddons
  when MEGAM_MARKETPLACEADDONCOLLECTION
    Megam::MarketPlaceAddonsCollection
  when MEGAM_ORGANIZATION
    Megam::Organizations
  when MEGAM_CSAR
    Megam::CSAR
  when MEGAM_CSARCOLLECTION
    Megam::CSARCollection
  when MEGAM_DOMAIN
    Megam::Domains
  when MEGAM_APPREQUEST
    Megam::AppRequest
  when MEGAM_APPREQUESTCOLLECTION
    Megam::AppRequestCollection
  else
  raise JSON::ParserError, "Unsupported `json_class` type '#{json_class}'"
  end
end

.from_json(source, opts = {}) ⇒ Object

Just call the JSON gem’s parse method with a modified :max_nesting field



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/megam/core/json_compat.rb', line 67

def from_json(source, opts = {})
  obj = ::Yajl::Parser.parse(source)

  # JSON gem requires top level object to be a Hash or Array (otherwise
  # you get the "must contain two octets" error). Yajl doesn't impose the
  # same limitation. For compatibility, we re-impose this condition.
  unless obj.kind_of?(Hash) or obj.kind_of?(Array)
    raise JSON::ParserError, "Top level JSON object must be a Hash or Array. (actual: #{obj.class})"
  end

  # The old default in the json gem (which we are mimicing because we
  # sadly rely on this misfeature) is to "create additions" i.e., convert
  # JSON objects into ruby objects. Explicit :create_additions => false
  # is required to turn it off.
  if opts[:create_additions].nil? || opts[:create_additions]
    map_to_rb_obj(obj)
  else
  obj
  end
end

.map_hash_to_rb_obj(json_hash) ⇒ Object



109
110
111
112
113
114
# File 'lib/megam/core/json_compat.rb', line 109

def map_hash_to_rb_obj(json_hash)
  json_hash.each do |key, value|
    json_hash[key] = map_to_rb_obj(value)
  end
  json_hash
end

.map_to_rb_obj(json_obj) ⇒ Object

Look at an object that’s a basic type (from json parse) and convert it to an instance of Megam classes if desired.



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/megam/core/json_compat.rb', line 90

def map_to_rb_obj(json_obj)

  case json_obj
  when Hash
    mapped_hash = map_hash_to_rb_obj(json_obj)

    if json_obj.has_key?(JSON_CLAZ) && (class_to_inflate = class_for_json_class(json_obj[JSON_CLAZ]))
    class_to_inflate.json_create(mapped_hash)

    else
    mapped_hash
    end
  when Array
    json_obj.map {|e| map_to_rb_obj(e)}
  else
  json_obj
  end
end

.opts_add_max_nesting(opts) ⇒ Object

Increase the max nesting for JSON, which defaults to 19, and isn’t enough for some (for example, a Node within a Node) structures.



58
59
60
61
62
63
64
# File 'lib/megam/core/json_compat.rb', line 58

def opts_add_max_nesting(opts)
  if opts.nil? || !opts.has_key?(:max_nesting)
    opts = opts.nil? ? Hash.new : opts.clone
    opts[:max_nesting] = JSON_MAX_NESTING
  end
  opts
end

.to_json(obj, opts = nil) ⇒ Object



116
117
118
# File 'lib/megam/core/json_compat.rb', line 116

def to_json(obj, opts = nil)
  obj.to_json(opts_add_max_nesting(opts))
end

.to_json_pretty(obj, opts = nil) ⇒ Object



120
121
122
# File 'lib/megam/core/json_compat.rb', line 120

def to_json_pretty(obj, opts = nil)
  ::JSON.pretty_generate(obj, opts_add_max_nesting(opts))
end