Class: JSON::Pure::Generator::State

Inherits:
Object
  • Object
show all
Defined in:
lib/json/pure/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 = {}) ⇒ 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: ”),

  • 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.



118
119
120
121
122
123
124
125
126
127
128
# File 'lib/json/pure/generator.rb', line 118

def initialize(opts = {})
  @indent                = ''
  @space                 = ''
  @space_before          = ''
  @object_nl             = ''
  @array_nl              = ''
  @allow_nan             = false
  @ascii_only            = false
  @buffer_initial_length = 1024
  configure opts
end

Instance Attribute Details

#array_nlObject

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



145
146
147
# File 'lib/json/pure/generator.rb', line 145

def array_nl
  @array_nl
end

#buffer_initial_lengthObject

:stopdoc:



152
153
154
# File 'lib/json/pure/generator.rb', line 152

def buffer_initial_length
  @buffer_initial_length
end

#depthObject

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



163
164
165
# File 'lib/json/pure/generator.rb', line 163

def depth
  @depth
end

#indentObject

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



131
132
133
# File 'lib/json/pure/generator.rb', line 131

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.



149
150
151
# File 'lib/json/pure/generator.rb', line 149

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).



142
143
144
# File 'lib/json/pure/generator.rb', line 142

def object_nl
  @object_nl
end

#spaceObject

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



135
136
137
# File 'lib/json/pure/generator.rb', line 135

def space
  @space
end

#space_beforeObject

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



138
139
140
# File 'lib/json/pure/generator.rb', line 138

def space_before
  @space_before
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.



90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/json/pure/generator.rb', line 90

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

Instance Method Details

#[](name) ⇒ Object

Return the value returned by method name.



249
250
251
252
253
254
255
# File 'lib/json/pure/generator.rb', line 249

def [](name)
  if respond_to?(name)
    __send__(name)
  else
    instance_variable_get("@#{name}")
  end
end

#[]=(name, value) ⇒ Object



257
258
259
260
261
262
263
# File 'lib/json/pure/generator.rb', line 257

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)


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

def allow_nan?
  @allow_nan
end

#ascii_only?Boolean

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

Returns:

  • (Boolean)


186
187
188
# File 'lib/json/pure/generator.rb', line 186

def ascii_only?
  @ascii_only
end

#check_circular?Boolean

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

Returns:

  • (Boolean)


174
175
176
# File 'lib/json/pure/generator.rb', line 174

def check_circular?
  !@max_nesting.zero?
end

#check_max_nestingObject

:nodoc:



165
166
167
168
169
170
# File 'lib/json/pure/generator.rb', line 165

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.



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/json/pure/generator.rb', line 192

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
  for key, value in opts
    instance_variable_set "@#{key}", value
  end
  @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]

  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.



241
242
243
244
245
246
# File 'lib/json/pure/generator.rb', line 241

def generate(obj)
  result = obj.to_json(self)
  JSON.valid_utf8?(result) or raise GeneratorError,
    "source sequence #{result.inspect} is illegal/malformed utf-8"
  result
end

#to_hObject Also known as: to_hash

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



226
227
228
229
230
231
232
233
# File 'lib/json/pure/generator.rb', line 226

def to_h
  result = {}
  for iv in instance_variables
    iv = iv.to_s[1..-1]
    result[iv.to_sym] = self[iv]
  end
  result
end