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

Inherits:
Object
  • Object
show all
Defined in:
lib/extensions/json/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 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: true if checking for circular data structures should be done (the default), false otherwise.

  • check_circular: true if checking for circular data structures should be done, false (the default) otherwise.

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



98
99
100
101
102
103
104
105
106
107
108
# File 'lib/extensions/json/json/pure/generator.rb', line 98

def initialize(opts = {})
  @seen = {}
  @indent         = ''
  @space          = ''
  @space_before   = ''
  @object_nl      = ''
  @array_nl       = ''
  @check_circular = false #true
  @allow_nan      = false
  configure opts
end

Instance Attribute Details

#array_nlObject

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



125
126
127
# File 'lib/extensions/json/json/pure/generator.rb', line 125

def array_nl
  @array_nl
end

#indentObject

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



111
112
113
# File 'lib/extensions/json/json/pure/generator.rb', line 111

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.



129
130
131
# File 'lib/extensions/json/json/pure/generator.rb', line 129

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



122
123
124
# File 'lib/extensions/json/json/pure/generator.rb', line 122

def object_nl
  @object_nl
end

#spaceObject

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



115
116
117
# File 'lib/extensions/json/json/pure/generator.rb', line 115

def space
  @space
end

#space_beforeObject

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



118
119
120
# File 'lib/extensions/json/json/pure/generator.rb', line 118

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.



71
72
73
74
75
76
77
78
79
80
# File 'lib/extensions/json/json/pure/generator.rb', line 71

def self.from_state(opts)
  case opts
  when self
    opts
  when Hash
    new(opts)
  else
    new
  end
end

Instance Method Details

#allow_nan?Boolean

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

Returns:

  • (Boolean)


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

def allow_nan?
  @allow_nan
end

#check_circular?Boolean

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

Returns:

  • (Boolean)


140
141
142
# File 'lib/extensions/json/json/pure/generator.rb', line 140

def check_circular?
  @check_circular
end

#check_max_nesting(depth) ⇒ Object

:nodoc:



131
132
133
134
135
136
# File 'lib/extensions/json/json/pure/generator.rb', line 131

def check_max_nesting(depth) # :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

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



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/extensions/json/json/pure/generator.rb', line 169

def configure(opts)
  @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)
  @check_circular = !!opts[:check_circular] if opts.key?(:check_circular)
  @allow_nan      = !!opts[:allow_nan] if opts.key?(:allow_nan)
  if !opts.key?(:max_nesting) # defaults to 19
    @max_nesting = 19
  elsif opts[:max_nesting]
    @max_nesting = opts[:max_nesting]
  else
    @max_nesting = 0
  end
  self
end

#forget(object) ⇒ Object

Forget object for this generating run.



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

def forget(object)
  @seen.delete object.__id__
end

#remember(object) ⇒ Object

Remember object, to find out if it was already encountered (if a cyclic data structure is if a cyclic data structure is rendered).



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

def remember(object)
  @seen[object.__id__] = true
end

#seen?(object) ⇒ Boolean

Returns true, if object was already seen during this generating run.

Returns:

  • (Boolean)


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

def seen?(object)
  @seen.key?(object.__id__)
end

#to_hObject

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



189
190
191
192
193
194
195
# File 'lib/extensions/json/json/pure/generator.rb', line 189

def to_h
  result = {}
  for iv in %w[indent space space_before object_nl array_nl check_circular allow_nan max_nesting]
    result[iv.intern] = instance_variable_get("@#{iv}")
  end
  result
end