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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +9 -0
  3. data/Gemfile +5 -0
  4. data/README.md +64 -0
  5. data/Rakefile +21 -0
  6. data/SPEC_SUPPORT.md +183 -0
  7. data/TODO.md +1 -0
  8. data/lib/brujula.rb +71 -0
  9. data/lib/brujula/basic_type.rb +46 -0
  10. data/lib/brujula/data_transformers/body_declaration.rb +39 -0
  11. data/lib/brujula/data_transformers/property_declaration.rb +28 -0
  12. data/lib/brujula/data_transformers/security_scheme_settings_declaration.rb +23 -0
  13. data/lib/brujula/initializers/inflecto_ramelize.rb +9 -0
  14. data/lib/brujula/initializers/yaml_include.rb +42 -0
  15. data/lib/brujula/key.rb +45 -0
  16. data/lib/brujula/map_object.rb +99 -0
  17. data/lib/brujula/mergers/map_object_merger.rb +78 -0
  18. data/lib/brujula/mergers/merger.rb +27 -0
  19. data/lib/brujula/mergers/object_merger.rb +41 -0
  20. data/lib/brujula/object.rb +40 -0
  21. data/lib/brujula/object_builder.rb +114 -0
  22. data/lib/brujula/object_parser.rb +65 -0
  23. data/lib/brujula/raml.rb +5 -0
  24. data/lib/brujula/raml/definition.rb +45 -0
  25. data/lib/brujula/raml/exceptions.rb +6 -0
  26. data/lib/brujula/raml/v1_0/array.rb +8 -0
  27. data/lib/brujula/raml/v1_0/base_uri_parameters.rb +9 -0
  28. data/lib/brujula/raml/v1_0/body.rb +9 -0
  29. data/lib/brujula/raml/v1_0/body_type.rb +9 -0
  30. data/lib/brujula/raml/v1_0/header.rb +9 -0
  31. data/lib/brujula/raml/v1_0/markdown.rb +8 -0
  32. data/lib/brujula/raml/v1_0/media_type.rb +8 -0
  33. data/lib/brujula/raml/v1_0/method.rb +22 -0
  34. data/lib/brujula/raml/v1_0/null_security_scheme.rb +8 -0
  35. data/lib/brujula/raml/v1_0/property.rb +34 -0
  36. data/lib/brujula/raml/v1_0/query_parameter.rb +9 -0
  37. data/lib/brujula/raml/v1_0/raml_type.rb +37 -0
  38. data/lib/brujula/raml/v1_0/resource.rb +19 -0
  39. data/lib/brujula/raml/v1_0/resource_type.rb +15 -0
  40. data/lib/brujula/raml/v1_0/response.rb +16 -0
  41. data/lib/brujula/raml/v1_0/root.rb +30 -0
  42. data/lib/brujula/raml/v1_0/security_scheme.rb +15 -0
  43. data/lib/brujula/raml/v1_0/security_scheme_part.rb +18 -0
  44. data/lib/brujula/raml/v1_0/security_scheme_settings.rb +24 -0
  45. data/lib/brujula/raml/v1_0/string.rb +8 -0
  46. data/lib/brujula/raml/v1_0/trait.rb +17 -0
  47. data/lib/brujula/raml/v1_0/uri_parameter.rb +9 -0
  48. data/lib/brujula/raml/v1_0/uri_template.rb +8 -0
  49. data/lib/brujula/scheme.rb +77 -0
  50. data/lib/brujula/type_extender/method.rb +29 -0
  51. data/lib/brujula/type_extender/resource.rb +52 -0
  52. data/lib/brujula/type_extender/resource_type.rb +36 -0
  53. data/lib/brujula/version.rb +3 -0
  54. data/lib/brujula/yaml_parser.rb +67 -0
  55. 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
@@ -0,0 +1,5 @@
1
+ module Brujula
2
+ module Raml
3
+
4
+ end
5
+ end
@@ -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,6 @@
1
+ module Brujula
2
+ module Raml
3
+ class RequiredProperty < StandardError; end
4
+ class ObjectTypeNotFound < StandardError; end
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class Array < ::Array
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class BaseUriParameters < Brujula::Object
5
+ scheme as: :query_parameters
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class Body < Brujula::Object
5
+ scheme as: :raml_type
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class BodyType < Brujula::Object
5
+ scheme as: :raml_type, allow_any: true
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class Header < Brujula::Object
5
+ scheme as: :property
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class Markdown < ::String
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class MediaType < ::String
5
+ end
6
+ end
7
+ end
8
+ 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,8 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class NullSecuritySchema
5
+ end
6
+ end
7
+ end
8
+ 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,9 @@
1
+ module Brujula
2
+ module Raml
3
+ module V1_0
4
+ class QueryParameter < Brujula::Object
5
+ scheme as: :property
6
+ end
7
+ end
8
+ end
9
+ 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