Class: JSON::TruffleRuby::Generator::State

Inherits:
Object
  • Object
show all
Defined in:
lib/json/truffle_ruby/generator.rb

Overview

This class is used to create State instances, that are use to hold data while generating a JSON text from a Ruby data structure.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = nil) ⇒ State

Instantiates a new State object, configured by opts.

opts can have the following keys:

  • indent: a string used to indent levels (default: ”),

  • space: a string that is put after, a : or , delimiter (default: ”),

  • space_before: a string that is put before a : pair delimiter (default: ”),

  • object_nl: a string that is put at the end of a JSON object (default: ”),

  • array_nl: a string that is put at the end of a JSON array (default: ”),

  • script_safe: true if U+2028, U+2029 and forward slash (/) should be escaped as to make the JSON object safe to interpolate in a script tag (default: false).

  • check_circular: is deprecated now, use the :max_nesting option instead,

  • max_nesting: sets the maximum level of data structure nesting in the generated JSON, max_nesting = 0 if no maximum should be checked.

  • allow_nan: true if NaN, Infinity, and -Infinity should be generated, otherwise an exception is thrown, if these values are encountered. This options defaults to false.



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/json/truffle_ruby/generator.rb', line 137

def initialize(opts = nil)
  @indent                = ''
  @space                 = ''
  @space_before          = ''
  @object_nl             = ''
  @array_nl              = ''
  @allow_nan             = false
  @ascii_only            = false
  @depth                 = 0
  @buffer_initial_length = 1024
  @script_safe           = false
  @strict                = false
  @max_nesting           = 100
  configure(opts) if opts
end

Instance Attribute Details

#array_nlObject

This string is put at the end of a line that holds a JSON array.



168
169
170
# File 'lib/json/truffle_ruby/generator.rb', line 168

def array_nl
  @array_nl
end

#buffer_initial_lengthObject

:stopdoc:



183
184
185
# File 'lib/json/truffle_ruby/generator.rb', line 183

def buffer_initial_length
  @buffer_initial_length
end

#depthObject

This integer returns the current depth data structure nesting in the generated JSON.



194
195
196
# File 'lib/json/truffle_ruby/generator.rb', line 194

def depth
  @depth
end

#indentObject

This string is used to indent levels in the JSON text.



154
155
156
# File 'lib/json/truffle_ruby/generator.rb', line 154

def indent
  @indent
end

#max_nestingObject

This integer returns the maximum level of data structure nesting in the generated JSON, max_nesting = 0 if no maximum is checked.



172
173
174
# File 'lib/json/truffle_ruby/generator.rb', line 172

def max_nesting
  @max_nesting
end

#object_nlObject

This string is put at the end of a line that holds a JSON object (or Hash).



165
166
167
# File 'lib/json/truffle_ruby/generator.rb', line 165

def object_nl
  @object_nl
end

#script_safeObject

If this attribute is set to true, forward slashes will be escaped in all json strings.



176
177
178
# File 'lib/json/truffle_ruby/generator.rb', line 176

def script_safe
  @script_safe
end

#spaceObject

This string is used to insert a space between the tokens in a JSON string.



158
159
160
# File 'lib/json/truffle_ruby/generator.rb', line 158

def space
  @space
end

#space_beforeObject

This string is used to insert a space before the ‘:’ in JSON objects.



161
162
163
# File 'lib/json/truffle_ruby/generator.rb', line 161

def space_before
  @space_before
end

#strictObject

If this attribute is set to true, attempting to serialize types not supported by the JSON spec will raise a JSON::GeneratorError



180
181
182
# File 'lib/json/truffle_ruby/generator.rb', line 180

def strict
  @strict
end

Class Method Details

.from_state(opts) ⇒ Object

Creates a State object from opts, which ought to be Hash to create a new State instance configured by opts, something else to create an unconfigured instance. If opts is a State object, it is just returned.



107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/json/truffle_ruby/generator.rb', line 107

def self.from_state(opts)
  case
  when self === opts
    opts
  when opts.respond_to?(:to_hash)
    new(opts.to_hash)
  when opts.respond_to?(:to_h)
    new(opts.to_h)
  else
    SAFE_STATE_PROTOTYPE.dup
  end
end

.generate(obj, opts = nil) ⇒ Object



99
100
101
# File 'lib/json/truffle_ruby/generator.rb', line 99

def self.generate(obj, opts = nil)
  new(opts).generate(obj)
end

Instance Method Details

#[](name) ⇒ Object

Return the value returned by method name.



375
376
377
378
379
380
381
382
# File 'lib/json/truffle_ruby/generator.rb', line 375

def [](name)
  if respond_to?(name)
    __send__(name)
  else
    instance_variable_get("@#{name}") if
      instance_variables.include?("@#{name}".to_sym) # avoid warning
  end
end

#[]=(name, value) ⇒ Object



384
385
386
387
388
389
390
# File 'lib/json/truffle_ruby/generator.rb', line 384

def []=(name, value)
  if respond_to?(name_writer = "#{name}=")
    __send__ name_writer, value
  else
    instance_variable_set "@#{name}", value
  end
end

#allow_nan?Boolean

Returns true if NaN, Infinity, and -Infinity should be considered as valid JSON and output.

Returns:

  • (Boolean)


211
212
213
# File 'lib/json/truffle_ruby/generator.rb', line 211

def allow_nan?
  @allow_nan
end

#ascii_only?Boolean

Returns true, if only ASCII characters should be generated. Otherwise returns false.

Returns:

  • (Boolean)


217
218
219
# File 'lib/json/truffle_ruby/generator.rb', line 217

def ascii_only?
  @ascii_only
end

#check_circular?Boolean

Returns true, if circular data structures are checked, otherwise returns false.

Returns:

  • (Boolean)


205
206
207
# File 'lib/json/truffle_ruby/generator.rb', line 205

def check_circular?
  !@max_nesting.zero?
end

#check_max_nestingObject

:nodoc:



196
197
198
199
200
201
# File 'lib/json/truffle_ruby/generator.rb', line 196

def check_max_nesting # :nodoc:
  return if @max_nesting.zero?
  current_nesting = depth + 1
  current_nesting > @max_nesting and
    raise NestingError, "nesting of #{current_nesting} is too deep"
end

#configure(opts) ⇒ Object Also known as: merge

Configure this State instance with the Hash opts, and return itself.



235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
# File 'lib/json/truffle_ruby/generator.rb', line 235

def configure(opts)
  if opts.respond_to?(:to_hash)
    opts = opts.to_hash
  elsif opts.respond_to?(:to_h)
    opts = opts.to_h
  else
    raise TypeError, "can't convert #{opts.class} into Hash"
  end
  opts.each do |key, value|
    instance_variable_set "@#{key}", value
  end

  # NOTE: If adding new instance variables here, check whether #generate should check them for #generate_json
  @indent                = opts[:indent]        || '' if opts.key?(:indent)
  @space                 = opts[:space]         || '' if opts.key?(:space)
  @space_before          = opts[:space_before]  || '' if opts.key?(:space_before)
  @object_nl             = opts[:object_nl]     || '' if opts.key?(:object_nl)
  @array_nl              = opts[:array_nl]      || '' if opts.key?(:array_nl)
  @allow_nan             = !!opts[:allow_nan]         if opts.key?(:allow_nan)
  @ascii_only            = opts[:ascii_only]          if opts.key?(:ascii_only)
  @depth                 = opts[:depth] || 0
  @buffer_initial_length ||= opts[:buffer_initial_length]

  @script_safe = if opts.key?(:script_safe)
    !!opts[:script_safe]
  elsif opts.key?(:escape_slash)
    !!opts[:escape_slash]
  else
    false
  end

  @strict                = !!opts[:strict] if opts.key?(:strict)

  if !opts.key?(:max_nesting) # defaults to 100
    @max_nesting = 100
  elsif opts[:max_nesting]
    @max_nesting = opts[:max_nesting]
  else
    @max_nesting = 0
  end
  self
end

#generate(obj) ⇒ Object

Generates a valid JSON document from object obj and returns the result. If no valid JSON document can be created this method raises a GeneratorError exception.



296
297
298
299
300
301
302
303
304
305
306
# File 'lib/json/truffle_ruby/generator.rb', line 296

def generate(obj)
  if @indent.empty? and @space.empty? and @space_before.empty? and @object_nl.empty? and @array_nl.empty? and
      !@ascii_only and !@script_safe and @max_nesting == 0 and !@strict
    result = generate_json(obj, ''.dup)
  else
    result = obj.to_json(self)
  end
  JSON::TruffleRuby::Generator.valid_utf8?(result) or raise GeneratorError,
    "source sequence #{result.inspect} is illegal/malformed utf-8"
  result
end

#script_safe?Boolean

Returns true, if forward slashes are escaped. Otherwise returns false.

Returns:

  • (Boolean)


222
223
224
# File 'lib/json/truffle_ruby/generator.rb', line 222

def script_safe?
  @script_safe
end

#strict?Boolean

Returns true, if strict mode is enabled. Otherwise returns false. Strict mode only allow serializing JSON native types: Hash, Array, String, Integer, Float, true, false and nil.

Returns:

  • (Boolean)


229
230
231
# File 'lib/json/truffle_ruby/generator.rb', line 229

def strict?
  @strict
end

#to_hObject Also known as: to_hash

Returns the configuration instance variables as a hash, that can be passed to the configure method.



281
282
283
284
285
286
287
288
# File 'lib/json/truffle_ruby/generator.rb', line 281

def to_h
  result = {}
  instance_variables.each do |iv|
    iv = iv.to_s[1..-1]
    result[iv.to_sym] = self[iv]
  end
  result
end