render 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +3 -3
- data/lib/render/array_attribute.rb +52 -0
- data/lib/render/attribute.rb +22 -60
- data/lib/render/dottable_hash.rb +1 -2
- data/lib/render/errors.rb +22 -10
- data/lib/render/generator.rb +3 -3
- data/lib/render/graph.rb +64 -43
- data/lib/render/hash_attribute.rb +38 -0
- data/lib/render/schema.rb +63 -77
- data/lib/render/version.rb +1 -1
- data/lib/render.rb +40 -18
- data/readme.md +6 -0
- data/spec/functional/representation/attribute_spec.rb +2 -2
- data/spec/functional/representation/graph_spec.rb +9 -0
- data/spec/functional/representation/nested_schemas_spec.rb +8 -8
- data/spec/functional/representation/schema_spec.rb +36 -65
- data/spec/integration/nested_graph_spec.rb +28 -20
- data/spec/integration/single_graph_spec.rb +12 -11
- data/spec/schemas/film.json +2 -1
- data/spec/schemas/films.json +3 -2
- data/spec/support.rb +3 -0
- data/spec/unit/array_attribute_spec.rb +48 -0
- data/spec/unit/render/dottable_hash_spec.rb +3 -6
- data/spec/unit/render/generator_spec.rb +2 -2
- data/spec/unit/render/graph_spec.rb +105 -109
- data/spec/unit/render/hash_attribute_spec.rb +130 -0
- data/spec/unit/render/schema_spec.rb +128 -184
- data/spec/unit/render_spec.rb +112 -18
- metadata +12 -6
- data/spec/unit/render/attribute_spec.rb +0 -128
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
render (0.0.
|
4
|
+
render (0.0.3)
|
5
5
|
uuid (= 2.3.7)
|
6
6
|
|
7
7
|
GEM
|
@@ -11,10 +11,10 @@ GEM
|
|
11
11
|
columnize (0.3.6)
|
12
12
|
crack (0.4.1)
|
13
13
|
safe_yaml (~> 0.9.0)
|
14
|
-
debugger (1.
|
14
|
+
debugger (1.6.1)
|
15
15
|
columnize (>= 0.3.1)
|
16
16
|
debugger-linecache (~> 1.2.0)
|
17
|
-
debugger-ruby_core_source (~> 1.2.
|
17
|
+
debugger-ruby_core_source (~> 1.2.3)
|
18
18
|
debugger-linecache (1.2.0)
|
19
19
|
debugger-ruby_core_source (1.2.3)
|
20
20
|
diff-lcs (1.2.4)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "render/attribute"
|
2
|
+
|
3
|
+
module Render
|
4
|
+
class ArrayAttribute < Attribute
|
5
|
+
FAUX_DATA_UPPER_LIMIT = 5.freeze
|
6
|
+
|
7
|
+
attr_accessor :archetype
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
super
|
11
|
+
|
12
|
+
self.name = options.fetch(:title, :render_array_attribute_untitled).to_sym
|
13
|
+
options = options[:items]
|
14
|
+
self.type = Render.parse_type(options[:type])
|
15
|
+
self.format = Render.parse_type(options[:format]) rescue nil
|
16
|
+
self.enums = options[:enum]
|
17
|
+
|
18
|
+
if options.keys.include?(:properties)
|
19
|
+
self.schema = Schema.new(options)
|
20
|
+
else
|
21
|
+
self.archetype = true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def serialize(explicit_values = nil)
|
26
|
+
explicit_values = faux_array_data if (Render.live == false && explicit_values.nil?)
|
27
|
+
if archetype
|
28
|
+
explicit_values.collect do |value|
|
29
|
+
value || default_value
|
30
|
+
end
|
31
|
+
else
|
32
|
+
explicit_values.collect do |value|
|
33
|
+
schema.serialize!(value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def faux_array_data
|
41
|
+
rand(lower_limit..FAUX_DATA_UPPER_LIMIT).times.collect do
|
42
|
+
archetype ? nil : {}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def lower_limit
|
47
|
+
# lower_limit = (required ? 1 : 0)
|
48
|
+
1
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/render/attribute.rb
CHANGED
@@ -1,89 +1,52 @@
|
|
1
1
|
# An Attribute represents a specific key and value as part of a Schema.
|
2
|
-
# It is responsible for casting its value and generating sample
|
2
|
+
# It is responsible for casting its value and generating sample data.
|
3
3
|
|
4
4
|
require "uuid"
|
5
5
|
|
6
6
|
module Render
|
7
7
|
class Attribute
|
8
|
-
|
8
|
+
SCHEMA_IDENTIFIERS = [:properties, :items].freeze
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
if (options.keys.first == :type && !options[options.keys.first].is_a?(Hash)) # todo there has to be a better way to do this
|
17
|
-
initialize_as_archetype(options)
|
18
|
-
else
|
19
|
-
self.type = Render.parse_type(options[name][:type])
|
20
|
-
self.enums = options[name][:enum]
|
21
|
-
initialize_schema!(options) if schema_value?(options)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def initialize_as_archetype(options)
|
26
|
-
self.type = Render.parse_type(options[:type])
|
27
|
-
self.enums = options[:enum]
|
28
|
-
self.archetype = true
|
29
|
-
end
|
10
|
+
attr_accessor :name,
|
11
|
+
:type,
|
12
|
+
:schema,
|
13
|
+
:enums,
|
14
|
+
:format,
|
15
|
+
:required
|
30
16
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
type: type
|
35
|
-
}
|
36
|
-
|
37
|
-
definition = options[name]
|
38
|
-
if definition.keys.include?(:attributes)
|
39
|
-
schema_options.merge!({ attributes: definition[:attributes] })
|
40
|
-
else
|
41
|
-
schema_options.merge!({ elements: definition[:elements] })
|
42
|
-
end
|
43
|
-
|
44
|
-
self.schema = Schema.new(schema_options)
|
45
|
-
end
|
46
|
-
|
47
|
-
def serialize(explicit_value)
|
48
|
-
if archetype
|
49
|
-
explicit_value || default_value
|
50
|
-
else
|
51
|
-
to_hash(explicit_value)
|
52
|
-
end
|
17
|
+
def initialize(options = {})
|
18
|
+
Render.logger.debug("Initializing attribute #{options}")
|
19
|
+
self.required = false
|
53
20
|
end
|
54
21
|
|
55
|
-
def
|
56
|
-
|
57
|
-
schema.serialize(explicit_value)
|
58
|
-
else
|
59
|
-
# TODO guarantee type for explicit value
|
60
|
-
(explicit_value || default_value)
|
61
|
-
end
|
62
|
-
|
63
|
-
{ name.to_sym => value }
|
22
|
+
def bias_type
|
23
|
+
format || type
|
64
24
|
end
|
65
25
|
|
66
26
|
def default_value
|
67
27
|
Render.live ? nil : faux_value
|
68
28
|
end
|
69
29
|
|
70
|
-
def
|
71
|
-
|
72
|
-
options[name].is_a?(Hash) && (options[name][:attributes] || options[name][:elements])
|
30
|
+
def nested_schema?(options = {})
|
31
|
+
options.any? { |name, value| SCHEMA_IDENTIFIERS.include?(name) }
|
73
32
|
end
|
74
33
|
|
75
34
|
private
|
76
35
|
|
36
|
+
# TODO implement better #faux_value
|
77
37
|
def faux_value
|
78
|
-
# TODO implement better #faux_value
|
79
38
|
return enums.sample if enums
|
80
39
|
return generator_value if generator_value # todo optimize generator_value call
|
81
40
|
|
82
|
-
case(
|
41
|
+
case(bias_type.name)
|
83
42
|
when("String") then "A String"
|
84
43
|
when("Integer") then rand(1000)
|
85
44
|
when("UUID") then UUID.generate
|
86
45
|
when("Boolean") then [true, false].sample
|
46
|
+
when("Float") then rand(0.1..99)
|
47
|
+
when("Time")
|
48
|
+
time = Time.now
|
49
|
+
(type == String) ? time.to_s : time
|
87
50
|
end
|
88
51
|
end
|
89
52
|
|
@@ -93,7 +56,6 @@ module Render
|
|
93
56
|
end
|
94
57
|
generator.algorithm.call if generator
|
95
58
|
end
|
96
|
-
|
97
59
|
end
|
98
|
-
end
|
99
60
|
|
61
|
+
end
|
data/lib/render/dottable_hash.rb
CHANGED
data/lib/render/errors.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
module Render
|
2
2
|
module Errors
|
3
|
+
class InvalidType < StandardError
|
4
|
+
attr_accessor :name
|
5
|
+
|
6
|
+
def initialize(name)
|
7
|
+
self.name = name
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
"Cannot parse type: #{name}."
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
3
15
|
class Generator
|
4
16
|
class MalformedAlgorithm < StandardError
|
5
17
|
attr_accessor :algorithm
|
@@ -23,24 +35,24 @@ module Render
|
|
23
35
|
end
|
24
36
|
|
25
37
|
def to_s
|
26
|
-
"No value for key #{config_key} found in config or
|
38
|
+
"No value for key #{config_key} found in config or parental_properties."
|
27
39
|
end
|
28
40
|
end
|
29
41
|
end
|
30
42
|
|
31
|
-
class
|
32
|
-
|
33
|
-
attr_accessor :title
|
43
|
+
class DefinitionNotFound < StandardError
|
44
|
+
attr_accessor :title
|
34
45
|
|
35
|
-
|
36
|
-
|
37
|
-
|
46
|
+
def initialize(title)
|
47
|
+
self.title = title
|
48
|
+
end
|
38
49
|
|
39
|
-
|
40
|
-
|
41
|
-
end
|
50
|
+
def to_s
|
51
|
+
"Schema with title #{title} is not loaded"
|
42
52
|
end
|
53
|
+
end
|
43
54
|
|
55
|
+
class Schema
|
44
56
|
class RequestError < StandardError
|
45
57
|
attr_accessor :endpoint, :response
|
46
58
|
|
data/lib/render/generator.rb
CHANGED
@@ -4,9 +4,9 @@ module Render
|
|
4
4
|
class Generator
|
5
5
|
attr_accessor :type, :matcher, :algorithm
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
|
9
|
-
%w(type matcher algorithm).each { |attribute| self.__send__("#{attribute}=",
|
7
|
+
def initialize(properties = {})
|
8
|
+
properties.symbolize_keys!
|
9
|
+
%w(type matcher algorithm).each { |attribute| self.__send__("#{attribute}=", properties[attribute.to_sym]) }
|
10
10
|
raise Errors::Generator::MalformedAlgorithm.new(algorithm) if !algorithm.respond_to?(:call)
|
11
11
|
end
|
12
12
|
|
data/lib/render/graph.rb
CHANGED
@@ -17,24 +17,18 @@ module Render
|
|
17
17
|
:raw_endpoint,
|
18
18
|
:relationships,
|
19
19
|
:graphs,
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
|
24
|
-
def initialize(
|
25
|
-
self.schema =
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
self.
|
32
|
-
self.raw_endpoint = (attributes.delete(:endpoint) || "")
|
33
|
-
self.graphs = (attributes.delete(:graphs) || [])
|
34
|
-
self.config = attributes
|
35
|
-
self.parental_params = {}
|
36
|
-
|
37
|
-
initialize_params!
|
20
|
+
:inherited_data,
|
21
|
+
:config,
|
22
|
+
:rendered_data
|
23
|
+
|
24
|
+
def initialize(schema_or_definition, options = {})
|
25
|
+
self.schema = determine_schema(schema_or_definition)
|
26
|
+
self.relationships = (options.delete(:relationships) || {})
|
27
|
+
self.graphs = (options.delete(:graphs) || [])
|
28
|
+
self.raw_endpoint = options.delete(:endpoint).to_s
|
29
|
+
self.config = options
|
30
|
+
|
31
|
+
self.inherited_data = {}
|
38
32
|
end
|
39
33
|
|
40
34
|
def endpoint
|
@@ -55,44 +49,60 @@ module Render
|
|
55
49
|
uri.to_s
|
56
50
|
end
|
57
51
|
|
58
|
-
def render(
|
59
|
-
|
60
|
-
graph_attributes = schema.render(inherited_attributes.merge(parental_params.merge({ endpoint: endpoint })))
|
52
|
+
def render(inherited_properties = {})
|
53
|
+
self.inherited_data = inherited_properties
|
61
54
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
data = parent_data.collect do |element|
|
70
|
-
nested_graph.render(element)
|
55
|
+
graph_data = DottableHash.new
|
56
|
+
inherited_data = relationship_data_from_parent.merge({ endpoint: endpoint })
|
57
|
+
rendered_data = schema.render!(inherited_data) do |parent_data|
|
58
|
+
loop_with_configured_threading(graphs) do |graph|
|
59
|
+
if parent_data.is_a?(Array)
|
60
|
+
graph_data[graph.title] = parent_data.inject([]) do |nested_data, element|
|
61
|
+
nested_data << graph.render(element)[graph.title]
|
71
62
|
end
|
72
|
-
key = data.first.keys.first
|
73
|
-
attributes[title] = data.collect { |d| d[key] }
|
74
63
|
else
|
75
|
-
|
76
|
-
|
64
|
+
nested_data = graph.render(parent_data)
|
65
|
+
graph_data.merge!(nested_data)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
self.rendered_data = graph_data.merge!(rendered_data)
|
71
|
+
end
|
72
|
+
|
73
|
+
def loop_with_configured_threading(elements)
|
74
|
+
if Render.threading?
|
75
|
+
threads = []
|
76
|
+
elements.each do |element|
|
77
|
+
threads << Thread.new do
|
78
|
+
yield element
|
77
79
|
end
|
78
80
|
end
|
79
81
|
threads.collect(&:join)
|
80
|
-
|
82
|
+
else
|
83
|
+
elements.each do |element|
|
84
|
+
yield element
|
85
|
+
end
|
81
86
|
end
|
82
|
-
|
87
|
+
end
|
88
|
+
|
89
|
+
def title
|
90
|
+
schema.universal_title || schema.title
|
83
91
|
end
|
84
92
|
|
85
93
|
private
|
86
94
|
|
87
|
-
def
|
88
|
-
|
89
|
-
|
95
|
+
def determine_schema(schema_or_definition)
|
96
|
+
if schema_or_definition.is_a?(Schema)
|
97
|
+
schema_or_definition
|
98
|
+
else
|
99
|
+
Schema.new(schema_or_definition)
|
90
100
|
end
|
91
101
|
end
|
92
102
|
|
93
|
-
def
|
94
|
-
|
95
|
-
|
103
|
+
def relationship_data_from_parent
|
104
|
+
relationships.inject({}) do |data, (parent_key, child_key)|
|
105
|
+
data.merge({ child_key => value_from_inherited_data(child_key) })
|
96
106
|
end
|
97
107
|
end
|
98
108
|
|
@@ -101,7 +111,18 @@ module Render
|
|
101
111
|
end
|
102
112
|
|
103
113
|
def param_value(key)
|
104
|
-
|
114
|
+
value_from_inherited_data(key) || config[key] || raise(Errors::Graph::EndpointKeyNotFound.new(key))
|
115
|
+
end
|
116
|
+
|
117
|
+
def value_from_inherited_data(key)
|
118
|
+
relationships.each do |parent_key, child_key|
|
119
|
+
if !inherited_data.is_a?(Hash)
|
120
|
+
return inherited_data
|
121
|
+
elsif (child_key == key)
|
122
|
+
return inherited_data.fetch(parent_key)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
nil
|
105
126
|
end
|
106
127
|
|
107
128
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "render"
|
2
|
+
require "render/attribute"
|
3
|
+
|
4
|
+
module Render
|
5
|
+
class HashAttribute < Attribute
|
6
|
+
def initialize(options = {})
|
7
|
+
super
|
8
|
+
|
9
|
+
self.name = options.keys.first
|
10
|
+
options = options[name]
|
11
|
+
self.type = Render.parse_type(options[:type])
|
12
|
+
self.format = Render.parse_type(options[:format]) rescue nil
|
13
|
+
self.enums = options[:enum]
|
14
|
+
|
15
|
+
initialize_schema!(options) if nested_schema?(options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize_schema!(options)
|
19
|
+
schema_options = {
|
20
|
+
title: name,
|
21
|
+
type: bias_type
|
22
|
+
}
|
23
|
+
|
24
|
+
self.schema = Schema.new(schema_options.merge(options))
|
25
|
+
end
|
26
|
+
|
27
|
+
def serialize(explicit_value)
|
28
|
+
if !!schema
|
29
|
+
value = schema.serialize!(explicit_value)
|
30
|
+
{ name.to_sym => value }
|
31
|
+
else
|
32
|
+
value = (explicit_value || default_value)
|
33
|
+
{ name.to_sym => value }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/lib/render/schema.rb
CHANGED
@@ -1,114 +1,100 @@
|
|
1
|
-
# The Schema defines a collection of
|
2
|
-
# It is responsible for returning its
|
1
|
+
# The Schema defines a collection of properties.
|
2
|
+
# It is responsible for returning its properties' values back to its Graph.
|
3
3
|
|
4
4
|
require "net/http"
|
5
5
|
require "json"
|
6
6
|
require "render"
|
7
7
|
require "render/attribute"
|
8
|
+
require "render/array_attribute"
|
9
|
+
require "render/hash_attribute"
|
10
|
+
require "render/dottable_hash"
|
8
11
|
|
9
12
|
module Render
|
10
13
|
class Schema
|
14
|
+
DEFAULT_TITLE = "untitled".freeze
|
15
|
+
|
11
16
|
attr_accessor :title,
|
12
17
|
:type,
|
13
|
-
:
|
14
|
-
:
|
18
|
+
:definition,
|
19
|
+
:array_attribute,
|
20
|
+
:hash_attributes,
|
21
|
+
:universal_title,
|
22
|
+
:raw_data,
|
23
|
+
:serialized_data,
|
24
|
+
:rendered_data
|
25
|
+
|
26
|
+
# TODO When given { ids: [1,2] }, parental_mapping { ids: id } means to make 2 calls
|
27
|
+
def initialize(definition_or_title)
|
28
|
+
Render.logger.debug("Loading #{definition_or_title}")
|
15
29
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# and we need to identify when given { ids: [1,2] }, parental_mapping { ids: id } means to make 2 calls
|
22
|
-
def initialize(schema_or_title)
|
23
|
-
self.schema = schema_or_title.is_a?(Hash) ? schema_or_title : find_schema(schema_or_title)
|
24
|
-
self.title = schema[:title]
|
25
|
-
self.type = Render.parse_type(schema[:type])
|
30
|
+
self.definition = determine_definition(definition_or_title)
|
31
|
+
title_or_default = definition.fetch(:title, DEFAULT_TITLE)
|
32
|
+
self.title = title_or_default.to_sym
|
33
|
+
self.type = Render.parse_type(definition[:type])
|
34
|
+
self.universal_title = definition.fetch(:universal_title, nil)
|
26
35
|
|
27
|
-
if
|
28
|
-
self.
|
36
|
+
if definition.keys.include?(:items)
|
37
|
+
self.array_attribute = ArrayAttribute.new(definition)
|
29
38
|
else
|
30
|
-
|
31
|
-
|
32
|
-
Attribute.new({ key => value })
|
39
|
+
self.hash_attributes = definition.fetch(:properties).collect do |name, attribute_definition|
|
40
|
+
HashAttribute.new({ name => attribute_definition })
|
33
41
|
end
|
34
42
|
end
|
35
43
|
end
|
36
44
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
45
|
+
def serialize!(explicit_data = nil)
|
46
|
+
if (type == Array)
|
47
|
+
self.serialized_data = array_attribute.serialize(explicit_data)
|
48
|
+
else
|
49
|
+
self.serialized_data = hash_attributes.inject({}) do |processed_explicit_data, attribute|
|
50
|
+
explicit_data ||= {}
|
51
|
+
value = explicit_data.fetch(attribute.name, nil)
|
52
|
+
serialized_attribute = attribute.serialize(value)
|
53
|
+
processed_explicit_data.merge!(serialized_attribute)
|
54
|
+
end
|
55
|
+
end
|
46
56
|
end
|
47
57
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
58
|
+
def render!(options_and_explicit_data = nil)
|
59
|
+
endpoint = options_and_explicit_data.delete(:endpoint) if options_and_explicit_data.is_a?(Hash)
|
60
|
+
self.raw_data = Render.live ? request(endpoint) : options_and_explicit_data
|
61
|
+
serialize!(raw_data)
|
62
|
+
yield serialized_data if block_given?
|
63
|
+
self.rendered_data = DottableHash.new(hash_with_title_prefixes(serialized_data))
|
51
64
|
end
|
52
65
|
|
53
66
|
private
|
54
67
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
loaded_schema
|
59
|
-
end
|
60
|
-
|
61
|
-
def request(endpoint)
|
62
|
-
response = Net::HTTP.get_response(URI(endpoint))
|
63
|
-
if response.kind_of?(Net::HTTPSuccess)
|
64
|
-
response = JSON.parse(response.body).recursive_symbolize_keys!
|
65
|
-
if (response.is_a?(Array) || (response[title.to_sym] == nil))
|
66
|
-
response
|
67
|
-
else
|
68
|
-
response[title.to_sym]
|
69
|
-
end
|
68
|
+
def determine_definition(definition_or_title)
|
69
|
+
if (definition_or_title.is_a?(Hash) && !definition_or_title.empty?)
|
70
|
+
definition_or_title
|
70
71
|
else
|
71
|
-
|
72
|
+
Render.definition(definition_or_title)
|
72
73
|
end
|
73
|
-
rescue JSON::ParserError => error
|
74
|
-
raise Errors::Schema::InvalidResponse.new(endpoint, response.body)
|
75
|
-
end
|
76
|
-
|
77
|
-
def to_array(elements)
|
78
|
-
# elements.first.is_a?(Hash) ? to_array_of_schemas(elements) : to_array_of_elements(elements)
|
79
|
-
attributes.first.schema_value? ? to_array_of_schemas(elements) : to_array_of_elements(elements)
|
80
74
|
end
|
81
75
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
76
|
+
def hash_with_title_prefixes(data)
|
77
|
+
if universal_title
|
78
|
+
{ universal_title => { title => data } }
|
79
|
+
else
|
80
|
+
{ title => data }
|
87
81
|
end
|
88
82
|
end
|
89
83
|
|
90
|
-
def
|
91
|
-
(
|
92
|
-
elements.collect do |element|
|
93
|
-
attributes.inject({}) do |attributes, attribute|
|
94
|
-
attributes.merge(attribute.to_hash(element)).values.first
|
95
|
-
end
|
96
|
-
end
|
84
|
+
def request(endpoint)
|
85
|
+
default_request(endpoint)
|
97
86
|
end
|
98
87
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
88
|
+
def default_request(endpoint)
|
89
|
+
response = Net::HTTP.get_response(URI(endpoint))
|
90
|
+
if response.kind_of?(Net::HTTPSuccess)
|
91
|
+
JSON.parse(response.body).recursive_symbolize_keys!
|
92
|
+
else
|
93
|
+
raise Errors::Schema::RequestError.new(endpoint, response)
|
105
94
|
end
|
95
|
+
rescue JSON::ParserError => error
|
96
|
+
raise Errors::Schema::InvalidResponse.new(endpoint, response.body)
|
106
97
|
end
|
107
98
|
|
108
|
-
def stubbed_array
|
109
|
-
elements = []
|
110
|
-
rand(1..3).times { elements << nil }
|
111
|
-
elements
|
112
|
-
end
|
113
99
|
end
|
114
100
|
end
|
data/lib/render/version.rb
CHANGED