brujula 0.0.1
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.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +9 -0
- data/Gemfile +5 -0
- data/README.md +64 -0
- data/Rakefile +21 -0
- data/SPEC_SUPPORT.md +183 -0
- data/TODO.md +1 -0
- data/lib/brujula.rb +71 -0
- data/lib/brujula/basic_type.rb +46 -0
- data/lib/brujula/data_transformers/body_declaration.rb +39 -0
- data/lib/brujula/data_transformers/property_declaration.rb +28 -0
- data/lib/brujula/data_transformers/security_scheme_settings_declaration.rb +23 -0
- data/lib/brujula/initializers/inflecto_ramelize.rb +9 -0
- data/lib/brujula/initializers/yaml_include.rb +42 -0
- data/lib/brujula/key.rb +45 -0
- data/lib/brujula/map_object.rb +99 -0
- data/lib/brujula/mergers/map_object_merger.rb +78 -0
- data/lib/brujula/mergers/merger.rb +27 -0
- data/lib/brujula/mergers/object_merger.rb +41 -0
- data/lib/brujula/object.rb +40 -0
- data/lib/brujula/object_builder.rb +114 -0
- data/lib/brujula/object_parser.rb +65 -0
- data/lib/brujula/raml.rb +5 -0
- data/lib/brujula/raml/definition.rb +45 -0
- data/lib/brujula/raml/exceptions.rb +6 -0
- data/lib/brujula/raml/v1_0/array.rb +8 -0
- data/lib/brujula/raml/v1_0/base_uri_parameters.rb +9 -0
- data/lib/brujula/raml/v1_0/body.rb +9 -0
- data/lib/brujula/raml/v1_0/body_type.rb +9 -0
- data/lib/brujula/raml/v1_0/header.rb +9 -0
- data/lib/brujula/raml/v1_0/markdown.rb +8 -0
- data/lib/brujula/raml/v1_0/media_type.rb +8 -0
- data/lib/brujula/raml/v1_0/method.rb +22 -0
- data/lib/brujula/raml/v1_0/null_security_scheme.rb +8 -0
- data/lib/brujula/raml/v1_0/property.rb +34 -0
- data/lib/brujula/raml/v1_0/query_parameter.rb +9 -0
- data/lib/brujula/raml/v1_0/raml_type.rb +37 -0
- data/lib/brujula/raml/v1_0/resource.rb +19 -0
- data/lib/brujula/raml/v1_0/resource_type.rb +15 -0
- data/lib/brujula/raml/v1_0/response.rb +16 -0
- data/lib/brujula/raml/v1_0/root.rb +30 -0
- data/lib/brujula/raml/v1_0/security_scheme.rb +15 -0
- data/lib/brujula/raml/v1_0/security_scheme_part.rb +18 -0
- data/lib/brujula/raml/v1_0/security_scheme_settings.rb +24 -0
- data/lib/brujula/raml/v1_0/string.rb +8 -0
- data/lib/brujula/raml/v1_0/trait.rb +17 -0
- data/lib/brujula/raml/v1_0/uri_parameter.rb +9 -0
- data/lib/brujula/raml/v1_0/uri_template.rb +8 -0
- data/lib/brujula/scheme.rb +77 -0
- data/lib/brujula/type_extender/method.rb +29 -0
- data/lib/brujula/type_extender/resource.rb +52 -0
- data/lib/brujula/type_extender/resource_type.rb +36 -0
- data/lib/brujula/version.rb +3 -0
- data/lib/brujula/yaml_parser.rb +67 -0
- metadata +224 -0
@@ -0,0 +1,114 @@
|
|
1
|
+
module Brujula
|
2
|
+
class ObjectBuilder
|
3
|
+
attr_reader :definition, :data, :key, :key_data
|
4
|
+
|
5
|
+
def initialize(definition:, data:, key:)
|
6
|
+
@definition = definition
|
7
|
+
@data = data
|
8
|
+
@key = key
|
9
|
+
@key_data = extract_and_transform_data
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
return nil if key_data.nil?
|
14
|
+
return object_reference if is_object_reference?
|
15
|
+
return map_object_reference if is_map_object_reference?
|
16
|
+
|
17
|
+
object_class.new(new_object_arguments).expand
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def extract_and_transform_data
|
23
|
+
return if data.nil? || extracted_data.nil?
|
24
|
+
return extracted_data if key.data_transformer.nil?
|
25
|
+
|
26
|
+
data_transformer.call(definition, extracted_data)
|
27
|
+
end
|
28
|
+
|
29
|
+
def data_transformer
|
30
|
+
Brujula::DataTransformers.const_get(
|
31
|
+
Inflecto.camelize(key.data_transformer.to_s)
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def extracted_data
|
36
|
+
@extracted_data ||= case
|
37
|
+
when key.fixed?
|
38
|
+
data.fetch(ramelize_name, nil)
|
39
|
+
else
|
40
|
+
data.select { |name, value| key.matches?(name) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def ramelize_name
|
45
|
+
Inflecto.ramelize(key.expression.to_s)
|
46
|
+
end
|
47
|
+
|
48
|
+
def is_object_reference?
|
49
|
+
key.referrable? &&
|
50
|
+
key_data.is_a?(String) &&
|
51
|
+
object_class < Brujula::Object
|
52
|
+
end
|
53
|
+
|
54
|
+
def is_map_object_reference?
|
55
|
+
key.referrable? &&
|
56
|
+
key_data.is_a?(Array) &&
|
57
|
+
object_class == Brujula::MapObject
|
58
|
+
end
|
59
|
+
|
60
|
+
def object_reference
|
61
|
+
case
|
62
|
+
when object_class == Brujula::Raml::V1_0::ResourceType
|
63
|
+
definition.root.resource_types.fetch(key_data)
|
64
|
+
else
|
65
|
+
raise "Invalid reference"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def map_object_reference
|
70
|
+
case
|
71
|
+
when key.expression == :secured_by
|
72
|
+
key_data.map do |security_scheme_ref|
|
73
|
+
if security_scheme_ref.nil? # NullSecuritySchema
|
74
|
+
Brujula::Raml::V1_0::NullSecuritySchema.new
|
75
|
+
else
|
76
|
+
definition.root.security_schemes.fetch(security_scheme_ref)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
when key.expression == :is
|
80
|
+
key_data.map do |trait_ref|
|
81
|
+
definition.root.traits.fetch(trait_ref)
|
82
|
+
end
|
83
|
+
else
|
84
|
+
raise "Invalid reference"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def object_class
|
89
|
+
@object_class ||= if key.options[:as] == :map_object
|
90
|
+
Brujula::MapObject
|
91
|
+
elsif key.basic_type?
|
92
|
+
Brujula::BasicType
|
93
|
+
else
|
94
|
+
Brujula::Raml::V1_0.const_get(
|
95
|
+
Inflecto.camelize(key.options[:as].to_s)
|
96
|
+
)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def new_object_arguments
|
101
|
+
{
|
102
|
+
data: key_data,
|
103
|
+
name: key.name,
|
104
|
+
parent: definition
|
105
|
+
}.tap do |args|
|
106
|
+
if key.options[:as] == :map_object
|
107
|
+
args.merge!(child_class: key.options[:children])
|
108
|
+
elsif key.basic_type?
|
109
|
+
args.merge!(as: key.options[:as])
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Brujula
|
2
|
+
class ObjectParser
|
3
|
+
class << self
|
4
|
+
def call(definition:, data:, parent: :root)
|
5
|
+
new(definition: definition, data: data, parent: parent).call
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :definition, :args, :parent, :data
|
10
|
+
|
11
|
+
def initialize(definition:, data:, parent: :root)
|
12
|
+
@definition = definition
|
13
|
+
@parent = parent
|
14
|
+
@data = data
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
return data if not_processable_external_data?
|
19
|
+
|
20
|
+
scheme_keys.each do |key|
|
21
|
+
object_instance = object_builder(key).call
|
22
|
+
|
23
|
+
definition.instance_variable_set(
|
24
|
+
"@#{ key.accessor_name }", object_instance
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def not_processable_external_data?
|
32
|
+
external_data? && !data.parseable?
|
33
|
+
end
|
34
|
+
|
35
|
+
def normalized_data
|
36
|
+
return data unless external_data?
|
37
|
+
|
38
|
+
# TODO
|
39
|
+
data.load_external_data(definition.root.base_dir)
|
40
|
+
end
|
41
|
+
|
42
|
+
def external_data?
|
43
|
+
data.is_a?(Brujula::YamlInclude)
|
44
|
+
end
|
45
|
+
|
46
|
+
def scheme
|
47
|
+
@scheme ||= definition.class.scheme
|
48
|
+
end
|
49
|
+
|
50
|
+
# Typed schemas must provide a type
|
51
|
+
def data_type
|
52
|
+
normalized_data.fetch('type', scheme.default_type)
|
53
|
+
end
|
54
|
+
|
55
|
+
def scheme_keys
|
56
|
+
return scheme.key_collection unless scheme.typed?
|
57
|
+
|
58
|
+
scheme.typed_keys(data_type)
|
59
|
+
end
|
60
|
+
|
61
|
+
def object_builder(key)
|
62
|
+
ObjectBuilder.new(definition: definition, data: normalized_data, key: key)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/brujula/raml.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Brujula
|
2
|
+
module Raml
|
3
|
+
class Definition
|
4
|
+
class << self
|
5
|
+
def from_file(file)
|
6
|
+
new(content: File.read(file), base_dir: File.dirname(file))
|
7
|
+
rescue Errno::ENOENT => exception
|
8
|
+
$stderr.puts "** Invalid file path #{ file }"
|
9
|
+
raise exception
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_string(string)
|
13
|
+
new(content: string, base_dir: Dir.pwd)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :raw_content, :yaml_content, :base_dir
|
18
|
+
|
19
|
+
def initialize(content:, base_dir:)
|
20
|
+
@base_dir = Pathname.new(base_dir)
|
21
|
+
@raw_content = content
|
22
|
+
end
|
23
|
+
|
24
|
+
def root
|
25
|
+
@root ||= load_raml_objects
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# def validate_version! # TODO
|
31
|
+
# true
|
32
|
+
# end
|
33
|
+
|
34
|
+
def yaml_content
|
35
|
+
@yaml_content ||= YAML.load(raw_content)
|
36
|
+
end
|
37
|
+
|
38
|
+
def load_raml_objects
|
39
|
+
@raml_objects ||= Brujula::Raml::V1_0::Root.new(
|
40
|
+
data: yaml_content, name: :root, base_dir: base_dir
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Brujula
|
2
|
+
module Raml
|
3
|
+
module V1_0
|
4
|
+
class Method < Brujula::Object
|
5
|
+
scheme do
|
6
|
+
key :display_name, as: :string
|
7
|
+
key :description, as: :markdown
|
8
|
+
key :query_parameters, as: :map_object, children: :query_parameter
|
9
|
+
# key :query_string, as: :query_string TODO
|
10
|
+
key :headers, as: :map_object, children: :header,
|
11
|
+
data_transformer: :property_declaration
|
12
|
+
key :responses, as: :map_object, children: :response
|
13
|
+
key :body, as: :map_object, children: :body,
|
14
|
+
data_transformer: :body_declaration
|
15
|
+
key :protocols, as: :array
|
16
|
+
key :is, as: :map_object, children: :trait, referrable: true
|
17
|
+
key :secured_by, as: :map_object, referrable: true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Brujula
|
2
|
+
module Raml
|
3
|
+
module V1_0
|
4
|
+
class Property < Brujula::Object
|
5
|
+
scheme typed: true do
|
6
|
+
key :description, as: :string
|
7
|
+
key :display_name, as: :string
|
8
|
+
key :default, as: :any
|
9
|
+
key :required, as: :boolean
|
10
|
+
# key :scheme, as: :type
|
11
|
+
|
12
|
+
key :type, as: :string
|
13
|
+
key :example, as: :any
|
14
|
+
key :examples, as: :any
|
15
|
+
|
16
|
+
# when Property is not file
|
17
|
+
key :enum, as: :array, unless_type_is: %w( file )
|
18
|
+
|
19
|
+
# When Property is integer
|
20
|
+
key :minimum, as: :number, for_types: %( number integer )
|
21
|
+
key :maximum, as: :number, for_types: %( number integer )
|
22
|
+
key :format, as: :string,
|
23
|
+
in: %( int32 int64 int long float double int16 int8 )
|
24
|
+
|
25
|
+
# When Property is string
|
26
|
+
key :pattern, as: :regexp, for_types: %( string )
|
27
|
+
key :min_length, as: :number, for_types: %( string )
|
28
|
+
key :max_length, as: :number, for_types: %( string )
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Brujula
|
2
|
+
module Raml
|
3
|
+
module V1_0
|
4
|
+
class RamlType < Brujula::Object
|
5
|
+
scheme typed: true, default_type: :object do
|
6
|
+
key :type, as: :string
|
7
|
+
key :schema, as: :string, deprecated: true
|
8
|
+
|
9
|
+
key :properties, as: :map_object, children: :property,
|
10
|
+
data_transformer: :property_declaration
|
11
|
+
|
12
|
+
key :description, as: :string
|
13
|
+
key :display_name, as: :string
|
14
|
+
key :default, as: :any
|
15
|
+
key :required, as: :boolean
|
16
|
+
key :example, as: :any
|
17
|
+
key :examples, as: :any
|
18
|
+
|
19
|
+
# When Property is integer
|
20
|
+
key :minimum, as: :number, for_types: %( number integer )
|
21
|
+
key :maximum, as: :number, for_types: %( number integer )
|
22
|
+
key :format, as: :string,
|
23
|
+
in: %( int32 int64 int long float double int16 int8 )
|
24
|
+
|
25
|
+
# When Property is string
|
26
|
+
key :pattern, as: :regexp, for_types: %( string )
|
27
|
+
key :min_length, as: :number, for_types: %( string )
|
28
|
+
key :max_length, as: :number, for_types: %( string )
|
29
|
+
|
30
|
+
|
31
|
+
# include_type_keys
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Brujula
|
2
|
+
module Raml
|
3
|
+
module V1_0
|
4
|
+
class Resource < Brujula::Object
|
5
|
+
scheme do
|
6
|
+
key :display_name, as: :string
|
7
|
+
key :description, as: :markdown
|
8
|
+
key /^(get|patch|put|post|delete|options|header)$/,
|
9
|
+
as: :map_object, children: :method, accessor: :methods
|
10
|
+
key :is, as: :map_object, children: :trait, referrable: true
|
11
|
+
key :type, as: :resource_type, referrable: true
|
12
|
+
key :secured_by, as: :map_object, referrable: true
|
13
|
+
key :uri_parameters, as: :map_object, children: :uri_parameter
|
14
|
+
key /^\/(.*)/, as: :map_object, children: :resource, accessor: :resources
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|