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 
     | 
    
         |