Class: Schemacop::V3::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/schemacop/v3/node.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**options, &block) ⇒ Node

Returns a new instance of Node.



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/schemacop/v3/node.rb', line 72

def initialize(**options, &block)
  # Check options #
  disallowed_options = options.keys - self.class.allowed_options

  if disallowed_options.any?
    fail Schemacop::Exceptions::InvalidSchemaError, "Options #{disallowed_options.inspect} are not allowed for this node."
  end

  # Assign attributes #
  @name = options.delete(:name)
  @name = @name.to_s unless @name.nil? || @name.is_a?(Regexp)
  @as = options.delete(:as)
  @required = !!options.delete(:required)
  @default = options.delete(:default)
  @title = options.delete(:title)
  @description = options.delete(:description)
  @examples = options.delete(:examples)
  @enum = options.delete(:enum)&.to_set
  @parent = options.delete(:parent)
  @options = options
  @schemas = {}

  # Run subclass init #
  init

  # Run DSL block #
  if block_given?
    unless self.class.supports_children_options
      fail Schemacop::Exceptions::InvalidSchemaError, "Node #{self.class} does not support blocks."
    end

    scope = DslScope.new(self)
    env = ScopedEnv.new(self, self.class.dsl_methods, scope, :dsl_)
    env.instance_exec(&block)
  end

  # Validate self #
  begin
    validate_self
  rescue StandardError => e
    fail Exceptions::InvalidSchemaError, e.message
  end
end

Instance Attribute Details

#asObject (readonly)

Returns the value of attribute as.



5
6
7
# File 'lib/schemacop/v3/node.rb', line 5

def as
  @as
end

#defaultObject (readonly)

Returns the value of attribute default.



6
7
8
# File 'lib/schemacop/v3/node.rb', line 6

def default
  @default
end

#descriptionObject (readonly)

Returns the value of attribute description.



8
9
10
# File 'lib/schemacop/v3/node.rb', line 8

def description
  @description
end

#nameObject (readonly)

Returns the value of attribute name.



4
5
6
# File 'lib/schemacop/v3/node.rb', line 4

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options.



9
10
11
# File 'lib/schemacop/v3/node.rb', line 9

def options
  @options
end

#parentObject (readonly)

Returns the value of attribute parent.



10
11
12
# File 'lib/schemacop/v3/node.rb', line 10

def parent
  @parent
end

#titleObject (readonly)

Returns the value of attribute title.



7
8
9
# File 'lib/schemacop/v3/node.rb', line 7

def title
  @title
end

Class Method Details

.allowed_optionsObject



52
53
54
# File 'lib/schemacop/v3/node.rb', line 52

def self.allowed_options
  %i[name required default description examples enum parent options title as]
end

.create(type = self, **options, &block) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/schemacop/v3/node.rb', line 27

def self.create(type = self, **options, &block)
  klass = resolve_class(type)
  fail "Could not find node for type #{type.inspect}." unless klass

  options = Schemacop.v3_default_options.slice(*klass.allowed_options).merge(options)
  node = klass.new(**options, &block)

  if options.delete(:cast_str)
    format = NodeRegistry.name(klass)
    one_of_options = {
      required:           options.delete(:required),
      treat_blank_as_nil: true,
      name:               options.delete(:name),
      as:                 options.delete(:as),
      description:        options.delete(:description)
    }
    node = create(:one_of, **one_of_options) do
      self.node node
      str format: format, format_options: options
    end
  end

  return node
end

.dsl_methodsObject



56
57
58
# File 'lib/schemacop/v3/node.rb', line 56

def self.dsl_methods
  %i[dsl_scm dsl_node]
end

.resolve_class(type) ⇒ Object



23
24
25
# File 'lib/schemacop/v3/node.rb', line 23

def self.resolve_class(type)
  NodeRegistry.find(type)
end

.supports_children(name: false) ⇒ Object



15
16
17
# File 'lib/schemacop/v3/node.rb', line 15

def self.supports_children(name: false)
  self._supports_children = { name: name }
end

.supports_children_optionsObject



19
20
21
# File 'lib/schemacop/v3/node.rb', line 19

def self.supports_children_options
  _supports_children
end

Instance Method Details

#allowed_typesObject



60
61
62
# File 'lib/schemacop/v3/node.rb', line 60

def allowed_types
  {}
end

#as_jsonObject



139
140
141
# File 'lib/schemacop/v3/node.rb', line 139

def as_json
  process_json([], {})
end

#cast(value) ⇒ Object



143
144
145
# File 'lib/schemacop/v3/node.rb', line 143

def cast(value)
  value || default
end

#childrenObject



68
69
70
# File 'lib/schemacop/v3/node.rb', line 68

def children
  []
end

#create(type, **options, &block) ⇒ Object



116
117
118
119
# File 'lib/schemacop/v3/node.rb', line 116

def create(type, **options, &block)
  options[:parent] = self
  return Node.create(type, **options, &block)
end

#dsl_node(node, *_args, **_kwargs) ⇒ Object



127
128
129
# File 'lib/schemacop/v3/node.rb', line 127

def dsl_node(node, *_args, **_kwargs)
  add_child node
end

#dsl_scm(name, type = :hash, **options, &block) ⇒ Object



123
124
125
# File 'lib/schemacop/v3/node.rb', line 123

def dsl_scm(name, type = :hash, **options, &block)
  @schemas[name] = create(type, **options, &block)
end

#initObject



121
# File 'lib/schemacop/v3/node.rb', line 121

def init; end

#required?Boolean

Returns:

  • (Boolean)


135
136
137
# File 'lib/schemacop/v3/node.rb', line 135

def required?
  @required
end

#schemasObject



131
132
133
# File 'lib/schemacop/v3/node.rb', line 131

def schemas
  (parent&.schemas || {}).merge(@schemas)
end

#used_external_schemasObject



64
65
66
# File 'lib/schemacop/v3/node.rb', line 64

def used_external_schemas
  children.map(&:used_external_schemas).flatten.uniq
end

#validate(data) ⇒ Object



147
148
149
150
151
# File 'lib/schemacop/v3/node.rb', line 147

def validate(data)
  result = Result.new(self, data)
  _validate(data, result: result)
  return result
end