Class: JSON::Ext::Generator::State

Inherits:
Object
  • Object
show all
Defined in:
lib/oj/state.rb

Overview

This class exists for json gem compatibility only. While it can be used as the options for other than compatibility a simple Hash is recommended as it is simpler and performs better. The only bit missing by not using a state object is the depth availability which may be the depth during dumping or maybe not since it can be set and the docs for depth= is the same as max_nesting. Note: Had to make this a subclass of Object instead of Hash like EashyHash due to conflicts with the json gem.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ State

Returns a new instance of State.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/oj/state.rb', line 23

def initialize(opts = {})
  @attrs = {}

  # Populate with all vars then merge in opts. This class deviates from
  # the json gem in that any of the options can be set with the opts
  # argument. The json gem limits the opts use to 7 of the options.
  @attrs[:indent] = ''
  @attrs[:space] = ''
  @attrs[:space_before] = ''
  @attrs[:array_nl] = ''
  @attrs[:object_nl] = ''
  @attrs[:allow_nan] = false
  @attrs[:buffer_initial_length] = 1024 # completely ignored by Oj
  @attrs[:depth] = 0
  @attrs[:max_nesting] = 100
  @attrs[:check_circular?] = true
  @attrs[:ascii_only] = false

  @attrs.merge!(opts)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(m, *args, &block) ⇒ Boolean

Handles requests for Hash values. Others cause an Exception to be raised.

Parameters:

  • m (Symbol|String)

    method symbol

Returns:

  • (Boolean)

    the value of the specified instance variable.

Raises:

  • (ArgumentError)

    if an argument is given. Zero arguments expected.

  • (NoMethodError)

    if the instance variable is not defined.



113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/oj/state.rb', line 113

def method_missing(m, *args, &block)
  if m.to_s.end_with?('=')
    raise ArgumentError.new("wrong number of arguments (#{args.size} for 1 with #{m}) to method #{m}") if args.nil? or 1 != args.length
    m = m.to_s[0..-2]
    m = m.to_sym
    return @attrs.store(m, args[0])
  else
    raise ArgumentError.new("wrong number of arguments (#{args.size} for 0 with #{m}) to method #{m}") unless args.nil? or args.empty?
    return @attrs[m.to_sym]
  end
  raise NoMethodError.new("undefined method #{m}", m)
end

Class Method Details

.from_state(opts) ⇒ Object



16
17
18
19
20
21
# File 'lib/oj/state.rb', line 16

def self.from_state(opts)
  s = self.new()
  s.clear()
  s.merge(opts)
  s
end

Instance Method Details

#[](key) ⇒ Object



90
91
92
93
# File 'lib/oj/state.rb', line 90

def [](key)
  key = key.to_sym
  @attrs.fetch(key, nil)
end

#[]=(key, value) ⇒ Object



95
96
97
98
# File 'lib/oj/state.rb', line 95

def []=(key, value)
  key = key.to_sym
  @attrs[key] = value
end

#allow_nan?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/oj/state.rb', line 52

def allow_nan?()
  @attrs[:allow_nan]
end

#ascii_only?Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/oj/state.rb', line 56

def ascii_only?()
  @attrs[:ascii_only]
end

#buffer_initial_length=(len) ⇒ Object

special rule for this.



74
75
76
77
# File 'lib/oj/state.rb', line 74

def buffer_initial_length=(len)
  len = 1024 if 0 >= len
  @attrs[:buffer_initial_length] = len
end

#clearObject



100
101
102
# File 'lib/oj/state.rb', line 100

def clear()
  @attrs.clear()
end

#configure(opts) ⇒ Object

Raises:

  • (TypeError)


60
61
62
63
# File 'lib/oj/state.rb', line 60

def configure(opts)
  raise TypeError.new('expected a Hash') unless opts.respond_to?(:to_h)
  @attrs.merge!(opts.to_h)
end

#generate(obj) ⇒ Object



65
66
67
# File 'lib/oj/state.rb', line 65

def generate(obj)
  JSON.generate(obj)
end

#has_key?(k) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/oj/state.rb', line 104

def has_key?(k)
  @attrs.has_key?(key.to_sym)
end

#merge(opts) ⇒ Object



69
70
71
# File 'lib/oj/state.rb', line 69

def merge(opts)
  @attrs.merge!(opts)
end

#respond_to?(m) ⇒ Boolean

Replaces the Object.respond_to?() method.

Parameters:

  • m (Symbol)

    method symbol

Returns:

  • (Boolean)

    true for any method that matches an instance variable reader, otherwise false.



83
84
85
86
87
88
# File 'lib/oj/state.rb', line 83

def respond_to?(m)
  return true if super
  return true if has_key?(key)
  return true if has_key?(key.to_s)
  has_key?(key.to_sym)
end

#to_hObject



44
45
46
# File 'lib/oj/state.rb', line 44

def to_h()
  return @attrs.dup
end

#to_hashObject



48
49
50
# File 'lib/oj/state.rb', line 48

def to_hash()
  return @attrs.dup
end