raml_ruby 0.1.1 → 0.1.2
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 +4 -4
- data/.travis.yml +2 -0
- data/README.md +1 -9
- data/Rakefile +7 -0
- data/lib/raml.rb +6 -26
- data/lib/raml/exceptions.rb +1 -0
- data/lib/raml/mixin/bodies.rb +3 -3
- data/lib/raml/mixin/documentable.rb +3 -8
- data/lib/raml/mixin/global.rb +14 -10
- data/lib/raml/mixin/headers.rb +1 -1
- data/lib/raml/mixin/merge.rb +4 -4
- data/lib/raml/mixin/secured_by.rb +27 -0
- data/lib/raml/mixin/validation.rb +27 -27
- data/lib/raml/node.rb +22 -80
- data/lib/raml/node/abstract_method.rb +7 -7
- data/lib/raml/node/abstract_resource.rb +17 -7
- data/lib/raml/node/body.rb +12 -10
- data/lib/raml/node/documentation.rb +0 -8
- data/lib/raml/node/method.rb +5 -7
- data/lib/raml/node/parameter/abstract_parameter.rb +22 -24
- data/lib/raml/node/parametized_reference.rb +3 -3
- data/lib/raml/node/resource.rb +0 -2
- data/lib/raml/node/resource_type.rb +9 -9
- data/lib/raml/node/resource_type_reference.rb +2 -2
- data/lib/raml/node/response.rb +0 -2
- data/lib/raml/node/root.rb +66 -57
- data/lib/raml/node/schema.rb +3 -9
- data/lib/raml/node/schema_reference.rb +2 -2
- data/lib/raml/node/security_scheme.rb +47 -0
- data/lib/raml/node/security_scheme_reference.rb +5 -0
- data/lib/raml/node/trait.rb +8 -8
- data/lib/raml/node/trait_reference.rb +2 -2
- data/lib/raml/parser.rb +25 -16
- data/lib/raml/version.rb +1 -1
- data/raml_ruby.gemspec +3 -7
- data/test/apis/box-api.raml +1447 -1447
- data/test/apis/instagram-api.raml +48 -48
- data/test/apis/stripe-api.raml +4266 -4266
- data/test/apis/twilio-rest-api.raml +47 -47
- data/test/apis/twitter-rest-api.raml +1883 -1883
- data/test/raml/body_spec.rb +22 -39
- data/test/raml/documentation_spec.rb +2 -12
- data/test/raml/method_spec.rb +112 -93
- data/test/raml/parameter/abstract_parameter_spec.rb +9 -34
- data/test/raml/parameter/query_parameter_spec.rb +0 -15
- data/test/raml/parameter/uri_parameter_spec.rb +1 -16
- data/test/raml/resource_spec.rb +59 -41
- data/test/raml/resource_type_spec.rb +13 -13
- data/test/raml/response_spec.rb +23 -36
- data/test/raml/root_spec.rb +85 -18
- data/test/raml/security_scheme_spec.rb +71 -0
- data/test/raml/spec_helper.rb +2 -1
- data/test/raml/template_spec.rb +92 -92
- data/test/raml/trait_spec.rb +7 -7
- metadata +14 -74
- data/templates/abstract_parameter.slim +0 -68
- data/templates/body.slim +0 -15
- data/templates/collapse.slim +0 -10
- data/templates/documentation.slim +0 -2
- data/templates/method.slim +0 -38
- data/templates/resource.slim +0 -33
- data/templates/response.slim +0 -13
- data/templates/root.slim +0 -39
- data/templates/style.sass +0 -119
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d78e661c19f75dc28745e0c8fb4daf4573ac2e00
|
4
|
+
data.tar.gz: 05f13dc760016c4f85e02236207ff6961eb77a21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b36dcd3894306113f8f67944fd033b8df6d6133f95e01c98fc816cd9913c1d7784da4759beaa07c3a9bb09067f2281ae5356db0e65d9b3458322b5d1a400b686
|
7
|
+
data.tar.gz: 3ae125b1d5f0c03910050a2080bdff605314a0c8cce7d6360bf5194a88caddaee6133ae5c61e23752bf3c4260d7dae1ae686bd0018a87780689a986d0de35385
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# RAML ruby
|
2
2
|
|
3
|
-
[](https://travis-ci.org/coub/raml_ruby)
|
4
4
|
|
5
5
|
Implementation of a RAML parser in Ruby. It uses the stdlib YAML parser
|
6
6
|
(Psych). It can also generate HTML documentation.
|
@@ -40,14 +40,6 @@ To parse the file:
|
|
40
40
|
|
41
41
|
Raml.parse_file("path/to/your/file.raml")
|
42
42
|
|
43
|
-
To generate HTML documentation:
|
44
|
-
|
45
|
-
# write to file
|
46
|
-
Raml.document("/path/to/your/file.raml", "path/to/output/file.html")
|
47
|
-
|
48
|
-
# or just on screen
|
49
|
-
Raml.document("/path/to/your/file.raml")
|
50
|
-
|
51
43
|
## To Do
|
52
44
|
|
53
45
|
- Align mergin strategy of conflicting properties of resource types and traits with official Javascript and Java parsers.
|
data/Rakefile
CHANGED
data/lib/raml.rb
CHANGED
@@ -38,6 +38,10 @@ require_relative 'raml/node/resource_type_reference'
|
|
38
38
|
|
39
39
|
require_relative 'raml/node/template'
|
40
40
|
|
41
|
+
require_relative 'raml/node/security_scheme'
|
42
|
+
require_relative 'raml/node/security_scheme_reference'
|
43
|
+
require_relative 'raml/mixin/secured_by'
|
44
|
+
|
41
45
|
require_relative 'raml/node/abstract_method'
|
42
46
|
require_relative 'raml/node/trait'
|
43
47
|
require_relative 'raml/node/method'
|
@@ -71,34 +75,10 @@ module Raml
|
|
71
75
|
def self.parse_file(filepath)
|
72
76
|
file = File.new filepath
|
73
77
|
raise UnsupportedRamlVersion unless file.readline =~ /\A#%RAML 0.8\s*\z/
|
74
|
-
|
78
|
+
|
75
79
|
path = File.dirname filepath
|
76
80
|
path = nil if path == ''
|
77
|
-
|
78
|
-
Raml::Parser.parse file.read, path
|
79
|
-
end
|
80
81
|
|
81
|
-
|
82
|
-
# output filename argument is given, the HTML is returned as a string. If
|
83
|
-
# an output filename argument is given, the HTML is stored to a file at
|
84
|
-
# that location.
|
85
|
-
#
|
86
|
-
# @param filepath [String] the file path of the file containing RAML.
|
87
|
-
# @param out_file [String] the file path of the file to write the documentation to. Defaults to nil.
|
88
|
-
# @return [String] the HTML documentation, if out_file is nil.
|
89
|
-
# @raise [Errno::ENOENT] if the file can't be found.
|
90
|
-
# @raise [Errno::EACCES] if the files can't be read or written.
|
91
|
-
# @raise [RamlError] if the RAML is invalid.
|
92
|
-
def self.document(filepath, out_file=nil)
|
93
|
-
root = parse_file filepath
|
94
|
-
root.expand
|
95
|
-
|
96
|
-
if out_file
|
97
|
-
File.open(out_file, 'w') do |file|
|
98
|
-
file.write root.document
|
99
|
-
end
|
100
|
-
else
|
101
|
-
root.document
|
102
|
-
end
|
82
|
+
Raml::Parser.parse file.read, path
|
103
83
|
end
|
104
84
|
end
|
data/lib/raml/exceptions.rb
CHANGED
@@ -21,6 +21,7 @@ module Raml
|
|
21
21
|
|
22
22
|
class UnknownTraitReference < RamlError; end
|
23
23
|
class UnknownResourceTypeReference < RamlError; end
|
24
|
+
class UnknownSecuritySchemeReference < RamlError; end
|
24
25
|
class MergeError < RamlError; end
|
25
26
|
class UnknownTypeOrTraitParameter < RamlError; end
|
26
27
|
class UnknownTypeOrTraitParamFunction < RamlError; end
|
data/lib/raml/mixin/bodies.rb
CHANGED
@@ -9,11 +9,11 @@ module Raml
|
|
9
9
|
|
10
10
|
def self.included(base)
|
11
11
|
base.instance_eval do
|
12
|
-
|
13
|
-
|
12
|
+
non_scalar_property :body
|
13
|
+
children_by :bodies, :media_type , Body
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def parse_body(value)
|
18
18
|
if value.is_a? Hash and value.keys.all? {|k| k.is_a? String and k =~ /.+\/.+/ }
|
19
19
|
# If all keys looks like media types, its not a default media type body.
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'kramdown'
|
2
|
-
|
3
1
|
module Raml
|
4
2
|
module Documentable
|
5
3
|
# @!attribute [rw] display_name
|
@@ -9,9 +7,6 @@ module Raml
|
|
9
7
|
# @return [String, nil] the node's description.
|
10
8
|
|
11
9
|
# @private
|
12
|
-
def html_description
|
13
|
-
Kramdown::Document.new(description, input: :GFM).to_html
|
14
|
-
end
|
15
10
|
|
16
11
|
private
|
17
12
|
|
@@ -22,11 +17,11 @@ module Raml
|
|
22
17
|
end
|
23
18
|
|
24
19
|
def validate_display_name
|
25
|
-
raise InvalidProperty, "displayName property
|
20
|
+
raise InvalidProperty, "displayName property must be a string." unless display_name.is_a? String
|
26
21
|
end
|
27
22
|
|
28
23
|
def validate_description
|
29
|
-
raise InvalidProperty, "description property
|
24
|
+
raise InvalidProperty, "description property must be a string." unless description.is_a? String
|
30
25
|
end
|
31
26
|
end
|
32
|
-
end
|
27
|
+
end
|
data/lib/raml/mixin/global.rb
CHANGED
@@ -5,16 +5,20 @@ module Raml
|
|
5
5
|
@parent.default_media_type
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
def trait_declarations
|
9
|
+
@parent.trait_declarations
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
def resource_type_declarations
|
13
|
+
@parent.resource_type_declarations
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def schema_declarations
|
17
|
+
@parent.schema_declarations
|
18
|
+
end
|
19
|
+
|
20
|
+
def security_scheme_declarations
|
21
|
+
@parent.security_scheme_declarations
|
22
|
+
end
|
19
23
|
end
|
20
|
-
end
|
24
|
+
end
|
data/lib/raml/mixin/headers.rb
CHANGED
data/lib/raml/mixin/merge.rb
CHANGED
@@ -10,15 +10,15 @@ module Raml
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def merge_properties(other, type)
|
13
|
-
|
13
|
+
match, no_match = other.send(type).values.partition { |param| self.send(type).has_key? param.name }
|
14
14
|
|
15
|
-
|
15
|
+
match.each { |param| self.send(type)[param.name].merge param }
|
16
16
|
|
17
17
|
# if its an optional property, and there is no match in self, don't merge it.
|
18
18
|
no_match.reject! { |node| node.optional }
|
19
19
|
no_match.map! { |node| node.clone }
|
20
20
|
no_match.each { |node| node.parent = self }
|
21
|
-
|
21
|
+
@children += no_match
|
22
22
|
end
|
23
23
|
end
|
24
|
-
end
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Raml
|
2
|
+
# @private
|
3
|
+
module SecuredBy
|
4
|
+
def parse_secured_by(data)
|
5
|
+
validate_array :secured_by, data, [String, Hash]
|
6
|
+
|
7
|
+
data.map do |security_scheme|
|
8
|
+
if security_scheme.is_a? Hash
|
9
|
+
raise InvalidProperty, 'is property with map with more than one key' if security_scheme.size > 1
|
10
|
+
raise InvalidProperty, 'is property with map of security_scheme name but params are not a map' unless
|
11
|
+
security_scheme.values[0].is_a? Hash
|
12
|
+
SecuritySchemeReference.new( security_scheme.keys[0], security_scheme.values[0], self )
|
13
|
+
else
|
14
|
+
SecuritySchemeReference.new security_scheme, {}, self
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def _validate_secured_by
|
20
|
+
valid_security_schemes = security_scheme_declarations.keys + ["null"]
|
21
|
+
secured_by.keys.each do |security_scheme_reference|
|
22
|
+
raise UnknownSecuritySchemeReference.new(security_scheme_reference) unless
|
23
|
+
valid_security_schemes.include?(security_scheme_reference)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,49 +1,49 @@
|
|
1
1
|
module Raml
|
2
2
|
# @private
|
3
|
-
|
3
|
+
module Validation
|
4
4
|
def validate_property(name, value, classes)
|
5
5
|
classes = [ classes ] unless classes.is_a? Array
|
6
6
|
raise InvalidProperty, "#{camel_case name} property must be an #{classes_to_s classes}" unless classes.include? value.class
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
def validate_string(name, string)
|
10
|
+
validate_property name, string, String
|
11
11
|
raise InvalidProperty, "#{camel_case name} property must be a non-empty string." if string.empty?
|
12
|
-
|
12
|
+
end
|
13
13
|
|
14
|
-
|
14
|
+
def validate_array(name, array, element_classes=nil)
|
15
15
|
raise InvalidProperty, "#{camel_case name} property must be an array" unless
|
16
|
-
|
16
|
+
array.is_a? Array
|
17
17
|
|
18
18
|
if element_classes
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
element_classes = [ element_classes ] unless element_classes.is_a? Array
|
20
|
+
raise InvalidProperty, "#{camel_case name} property must be an array of #{classes_to_s element_classes}" unless
|
21
|
+
array.all? { |element| element_classes.include? element.class }
|
22
22
|
end
|
23
|
-
|
23
|
+
end
|
24
24
|
|
25
|
-
|
26
|
-
raise InvalidProperty, "#{camel_case name} property must be a map" unless
|
25
|
+
def validate_hash(name, hash, key_class=nil, value_class=nil)
|
26
|
+
raise InvalidProperty, "#{camel_case name} property must be a map" unless
|
27
27
|
hash.is_a? Hash
|
28
28
|
|
29
29
|
if key_class
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
if key_class.is_a? Array
|
31
|
+
raise InvalidProperty, "#{camel_case name} property must be a map with #{key_class} keys" unless
|
32
|
+
hash.keys.all? {|key| key_class.any? { |kc| key.is_a? kc } }
|
33
|
+
else
|
34
|
+
raise InvalidProperty, "#{camel_case name} property must be a map with #{key_class} keys" unless
|
35
|
+
hash.keys.all? {|key| key.is_a? key_class }
|
36
|
+
end
|
37
37
|
end
|
38
38
|
|
39
39
|
if value_class
|
40
|
-
|
41
|
-
|
40
|
+
raise InvalidProperty, "#{camel_case name} property must be a map with map values: #{hash}" unless
|
41
|
+
hash.values.all? {|value| value.is_a?(Hash) || value.nil? }
|
42
42
|
end
|
43
|
-
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
45
|
+
def classes_to_s(classes)
|
46
|
+
classes.join(', ').gsub(/, (\w)\z/, ' or \1')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/raml/node.rb
CHANGED
@@ -1,34 +1,14 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
require 'active_support/core_ext/class/attribute'
|
3
|
-
require 'rouge'
|
4
|
-
require 'slim'
|
5
3
|
|
6
4
|
module Raml
|
7
5
|
class Node
|
8
|
-
class_attribute :doc_template, :doc_template_compiled
|
9
|
-
|
10
|
-
class << self
|
11
|
-
# @private
|
12
|
-
def relative_path(file)
|
13
|
-
File.join(
|
14
|
-
*File.dirname(__FILE__).
|
15
|
-
split(File::SEPARATOR).
|
16
|
-
reverse.
|
17
|
-
drop_while { |p| p != 'lib' }.
|
18
|
-
drop(1).
|
19
|
-
reverse,
|
20
|
-
'templates',
|
21
|
-
file
|
22
|
-
)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
6
|
# @!attribute [r] name
|
27
|
-
# @return [String,Integer] the node name (e.g. resource path, header name, etc). Usually a
|
7
|
+
# @return [String,Integer] the node name (e.g. resource path, header name, etc). Usually a
|
28
8
|
# String. Can be an Integer for methods.
|
29
9
|
attr_reader :name
|
30
10
|
# @!attribute [rw] parent
|
31
|
-
# @return [Raml::Node] the node's parent.
|
11
|
+
# @return [Raml::Node] the node's parent.
|
32
12
|
attr_accessor :parent
|
33
13
|
|
34
14
|
def initialize(name, parent)
|
@@ -36,17 +16,6 @@ module Raml
|
|
36
16
|
@parent = parent
|
37
17
|
end
|
38
18
|
|
39
|
-
# Returns HTML documenting the node and child nodes.
|
40
|
-
# @return [String] HTML documentation.
|
41
|
-
def document
|
42
|
-
if doc_template
|
43
|
-
self.doc_template_compiled ||= Slim::Template.new(doc_template, format: :html5, pretty: true)
|
44
|
-
doc_template_compiled.render self
|
45
|
-
else
|
46
|
-
nil
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
19
|
private
|
51
20
|
|
52
21
|
def underscore(camel_cased_word)
|
@@ -61,35 +30,6 @@ module Raml
|
|
61
30
|
w = underscored_word.to_s.split('_')
|
62
31
|
(w[0...1] + w[1..-1].map(&:capitalize)).join
|
63
32
|
end
|
64
|
-
|
65
|
-
def collapse(level, title, display_name=nil, &block)
|
66
|
-
@@cid ||= 0
|
67
|
-
@@cid += 1
|
68
|
-
|
69
|
-
@@context_class ||= Struct.new(:cid, :title, :level, :display_name, :content) do
|
70
|
-
def highlight_url_params(url)
|
71
|
-
url.gsub(/({[^}]+})/, '<span class="url_param">\1</span>')
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
context = @@context_class.new @@cid, title, level, display_name, yield
|
76
|
-
|
77
|
-
@@collapse ||= Slim::Template.new(self.class.relative_path('collapse.slim'), format: :html5, pretty: true)
|
78
|
-
@@collapse.render context
|
79
|
-
end
|
80
|
-
|
81
|
-
def highlight_url_params(url)
|
82
|
-
url.gsub(/({[^}]+})/, '<span class="url_param">\1</span>')
|
83
|
-
end
|
84
|
-
|
85
|
-
def highlight(source, mimetype=nil)
|
86
|
-
opts = { source: source }
|
87
|
-
opts[:mimetype] = mimetype if mimetype
|
88
|
-
|
89
|
-
formatter = Rouge::Formatters::HTML.new css_class: 'highlight'
|
90
|
-
lexer = Rouge::Lexer.guess(opts).new
|
91
|
-
formatter.format lexer.lex source
|
92
|
-
end
|
93
33
|
end
|
94
34
|
|
95
35
|
class ValueNode < Node
|
@@ -139,14 +79,14 @@ module Raml
|
|
139
79
|
# @private
|
140
80
|
def non_scalar_properties; self.class.non_scalar_properties; end
|
141
81
|
# @private
|
142
|
-
def _regexp_property ; self.class._regexp_property ; end
|
82
|
+
def _regexp_property ; self.class._regexp_property ; end
|
143
83
|
|
144
84
|
# @!attribute [rw] optional
|
145
85
|
# @return [Boolean] whether the property is optional. Only valid
|
146
86
|
# for decendant nodes a {Trait::Instance} or {ResourceType::Instance}.
|
147
87
|
# Indicated by a trailing "?" on the property name in the RAML source.
|
148
88
|
attr_accessor :optional
|
149
|
-
|
89
|
+
|
150
90
|
def initialize(name, properties, parent)
|
151
91
|
if name.is_a? String and name.end_with? '?'
|
152
92
|
allow_optional? parent
|
@@ -176,26 +116,28 @@ module Raml
|
|
176
116
|
maybe_exec :validate_name
|
177
117
|
maybe_exec :validate_parent
|
178
118
|
|
179
|
-
properties.
|
180
|
-
prop_name
|
181
|
-
|
119
|
+
if !properties.nil?
|
120
|
+
properties.each do |prop_name, prop_value|
|
121
|
+
prop_name = prop_name.to_s
|
122
|
+
under_prop_name = underscore prop_name
|
182
123
|
|
183
|
-
|
184
|
-
|
185
|
-
|
124
|
+
if scalar_properties.include? under_prop_name
|
125
|
+
send "#{under_prop_name}=", prop_value
|
126
|
+
maybe_exec "validate_#{under_prop_name}"
|
186
127
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
128
|
+
elsif non_scalar_properties.include? under_prop_name
|
129
|
+
parsed = send "parse_#{under_prop_name}", prop_value
|
130
|
+
parsed = [ parsed ] unless parsed.is_a? Array
|
131
|
+
@children += parsed
|
191
132
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
133
|
+
elsif _regexp_property and _regexp_property[0].match prop_name
|
134
|
+
parsed = self.instance_exec(prop_name, prop_value, &_regexp_property[1])
|
135
|
+
parsed = [ parsed ] unless parsed.is_a? Array
|
136
|
+
@children += parsed
|
196
137
|
|
197
|
-
|
198
|
-
|
138
|
+
else
|
139
|
+
raise UnknownProperty, "#{prop_name} is an unknown property with value of #{prop_value}."
|
140
|
+
end
|
199
141
|
end
|
200
142
|
end
|
201
143
|
|