swagger-parser 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +23 -0
  6. data/.travis.yml +6 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +5 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +114 -0
  11. data/Rakefile +11 -0
  12. data/lib/swagger.rb +56 -0
  13. data/lib/swagger/api.rb +26 -0
  14. data/lib/swagger/attachable.rb +39 -0
  15. data/lib/swagger/boolean.rb +13 -0
  16. data/lib/swagger/builder.rb +109 -0
  17. data/lib/swagger/mime_type.rb +46 -0
  18. data/lib/swagger/notes.md +35 -0
  19. data/lib/swagger/parsers.rb +36 -0
  20. data/lib/swagger/schema.rb +63 -0
  21. data/lib/swagger/swagger_object.rb +49 -0
  22. data/lib/swagger/uri.rb +11 -0
  23. data/lib/swagger/uri_template.rb +11 -0
  24. data/lib/swagger/v2/api.rb +90 -0
  25. data/lib/swagger/v2/deterministic_json_schema.rb +130 -0
  26. data/lib/swagger/v2/example.rb +32 -0
  27. data/lib/swagger/v2/header.rb +22 -0
  28. data/lib/swagger/v2/info.rb +33 -0
  29. data/lib/swagger/v2/operation.rb +66 -0
  30. data/lib/swagger/v2/parameter.rb +35 -0
  31. data/lib/swagger/v2/path.rb +47 -0
  32. data/lib/swagger/v2/response.rb +26 -0
  33. data/lib/swagger/v2/security_requirement.rb +12 -0
  34. data/lib/swagger/v2/security_scheme.rb +25 -0
  35. data/lib/swagger/v2/tag.rb +11 -0
  36. data/lib/swagger/version.rb +3 -0
  37. data/resources/schemas/json_schema/draft-04.json +150 -0
  38. data/resources/schemas/swagger/v2.0/schema.json +1483 -0
  39. data/spec/fixtures/custom-properties.yaml +61 -0
  40. data/spec/fixtures/petstore-full.yaml +245 -0
  41. data/spec/fixtures/swagger.yaml +100 -0
  42. data/spec/spec_helper.rb +2 -0
  43. data/spec/swagger/api_spec.rb +87 -0
  44. data/spec/swagger/builder_spec.rb +52 -0
  45. data/spec/swagger/custom_properties_spec.rb +22 -0
  46. data/spec/swagger/info_spec.rb +76 -0
  47. data/spec/swagger/operation_spec.rb +99 -0
  48. data/spec/swagger/swagger_spec.rb +74 -0
  49. data/swagger-parser.gemspec +32 -0
  50. metadata +250 -0
@@ -0,0 +1,32 @@
1
+ module Swagger
2
+ module V2
3
+ # A class to represent example objects in the Swagger schema.
4
+ # Usually used to represent example request or responses.
5
+ # Provides access to both the raw example or a parsed representation.
6
+ class Example
7
+ extend Forwardable
8
+ def_delegator :@raw, :to_s, :inspect
9
+
10
+ # The example as it appears in the Swagger document.
11
+ # @return Object the example
12
+ attr_reader :raw
13
+
14
+ def initialize(sample)
15
+ @raw = sample
16
+ end
17
+
18
+ # The example after it has been parsed to match the +media_type+.
19
+ # @param media_type [String] the target media_type
20
+ # @return [Object] an object according to the +media_type+
21
+ def parse(media_type = 'application/json')
22
+ return @raw unless @raw.is_a? String
23
+ parser = Swagger::MimeType.parser_for(media_type)
24
+ parser.parse(@raw)
25
+ end
26
+
27
+ def inspect
28
+ @raw.inspect
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,22 @@
1
+ require 'swagger/swagger_object'
2
+
3
+ module Swagger
4
+ module V2
5
+ # Class representing a Swagger "Header Object".
6
+ # @see https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#headerObject Header Object
7
+ class Header < SwaggerObject
8
+ # @!group Fixed Fields
9
+ field :description, String
10
+ field :required, Swagger::Boolean
11
+ alias_method :required?, :required
12
+ field :type, String
13
+ field :format, String
14
+ field :items, Hash # TODO: Items Object
15
+ field :collectionFormat, String
16
+ field :default, Object
17
+ # @!endgroup
18
+
19
+ include DeterministicJSONSchema
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,33 @@
1
+ require 'swagger/swagger_object'
2
+
3
+ module Swagger
4
+ module V2
5
+ # Class representing a Swagger "Info Object".
6
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#infoObject Info Object
7
+ class Info < SwaggerObject
8
+ # Class representing a Swagger "Contact Object".
9
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#contactObject Contact Object
10
+ class Contact < SwaggerObject
11
+ # @group Swagger Fields
12
+ field :name, String
13
+ field :url, Swagger::URI
14
+ field :email, String
15
+ # @endgroup
16
+ end
17
+
18
+ # Class representing a Swagger "License Object".
19
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#licenseObject License Object
20
+ class License < SwaggerObject
21
+ required_field :name, String
22
+ field :url, Swagger::URI
23
+ end
24
+
25
+ required_field :title, String
26
+ field :description, String
27
+ field :termsOfService, String
28
+ field :contact, Contact
29
+ field :license, License
30
+ required_field :version, String
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,66 @@
1
+ require 'swagger/swagger_object'
2
+ require 'swagger/v2/parameter'
3
+ require 'swagger/v2/response'
4
+ require 'swagger/v2/security_requirement'
5
+
6
+ module Swagger
7
+ module V2
8
+ # Class representing a Swagger "Operation Object".
9
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#operationObject Operation Object
10
+ class Operation < SwaggerObject
11
+ extend Forwardable
12
+ def_delegators :parent, :uri_template, :path, :host
13
+
14
+ field :summary, String
15
+ field :description, String
16
+ field :operationId, String
17
+ alias_method :operation_id, :operationId
18
+ field :produces, Array[String] # TODO: Need a lookup that merges w/ API-level field
19
+ field :consumes, Array[String] # TODO: Need a lookup that merges w/ API-level field
20
+ field :tags, Array[String] # TODO: This is an array of tag names, need to handle resolution name -> Tag object
21
+ field :parameters, Array[Parameter] # TODO: Can't decide if default: [] is useful or troublesome
22
+ field :responses, Hash[String => Response]
23
+ field :schemes, Array[String] # TODO: Need a lookup that merges w/ API-level field
24
+ field :security, Array[SecurityRequirement] # TODO: Need a lookup that merges w/ API-level field
25
+ field :externalDocs, Object # TODO: ExternalDocumentation class
26
+ field :deprecated, Swagger::Boolean
27
+
28
+ def api_title
29
+ root.info.title
30
+ end
31
+
32
+ def full_name
33
+ "#{api_title} - #{summary}"
34
+ end
35
+
36
+ # The HTTP verb for the operation.
37
+ def verb
38
+ parent.operations.key self
39
+ end
40
+
41
+ def signature
42
+ "#{verb.to_s.upcase} #{parent.uri_template}"
43
+ end
44
+
45
+ def default_response
46
+ return nil if responses.nil? || responses.values.nil?
47
+
48
+ # FIXME: Swagger isn't very clear on "normal response codes"
49
+ # In the examples, default is actually an error
50
+ responses['200'] || responses['201'] || responses['default'] || responses.values.first
51
+ end
52
+
53
+ # Iterates over each parameter defined directly on the operation, excluding parameters
54
+ # defined at the API level.
55
+ def each_parameter
56
+ return if parameters.nil?
57
+ parameters.each do |parameter|
58
+ yield parameter
59
+ end
60
+ end
61
+
62
+ # Iterates over all parameters defined on this operation or at the API level
63
+ # TODO: Implement all_parameters
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,35 @@
1
+ require 'swagger/swagger_object'
2
+
3
+ module Swagger
4
+ module V2
5
+ # Class representing a Swagger "Parameter Object".
6
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#parameterObject Parameter Object
7
+ class Parameter < SwaggerObject
8
+ # @!group Fixed Fields
9
+ #required_field :name, String
10
+ # required_field :in, String
11
+ field :name, String
12
+ field :in, String
13
+ field :description, String
14
+ field :required, Swagger::Boolean
15
+ alias_method :required?, :required
16
+ # @!endgroup
17
+
18
+ # @!group Body Fields
19
+ field :schema, Schema
20
+ # @!endgroup
21
+
22
+ # @!group Non-Body Fields
23
+ field :type, String
24
+ field :format, String
25
+ field :items, Hash # TODO: Items Object
26
+ field :collectionFormat, String
27
+ field :default, Object
28
+ field :allowEmptyValue, Swagger::Boolean
29
+ alias_method :allowEmptyValue?, :allowEmptyValue
30
+ # @!endgroup
31
+
32
+ include DeterministicJSONSchema
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,47 @@
1
+ require 'swagger/swagger_object'
2
+ require 'swagger/v2/operation'
3
+
4
+ module Swagger
5
+ module V2
6
+ # Class representing a Swagger "Path Item Object".
7
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#pathItemObject Path Item Object
8
+ class Path < SwaggerObject
9
+ extend Forwardable
10
+ def_delegator :parent, :host
11
+
12
+ VERBS = [:get, :put, :post, :delete, :options, :head, :patch]
13
+ VERBS.each do |verb|
14
+ field verb, Operation
15
+ end
16
+ field :parameters, Array[Parameter]
17
+
18
+ def initialize(hash)
19
+ hash[:parameters] ||= []
20
+ super
21
+ end
22
+
23
+ def operations
24
+ VERBS.each_with_object({}) do |v, h|
25
+ operation = send v
26
+ h[v] = operation if operation
27
+ end
28
+ end
29
+
30
+ def uri_template
31
+ "#{parent.host}#{parent.base_path}#{path}"
32
+ end
33
+
34
+ def path
35
+ parent.paths.key self
36
+ end
37
+
38
+ # Iterates over each Path level parameter.
39
+ def each_parameter
40
+ return if parameters.nil?
41
+ parameters.each do |parameter|
42
+ yield parameter
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ require 'swagger/swagger_object'
2
+ require 'swagger/v2/example'
3
+ require 'swagger/v2/header'
4
+
5
+ module Swagger
6
+ module V2
7
+ # Class representing a Swagger "Response Object".
8
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#responseObject Response Object
9
+ class Response < SwaggerObject
10
+ field :description, String
11
+ field :schema, Swagger::Schema
12
+ field :headers, Hash[String => Header] # TODO: Headers
13
+ field :examples, Hash[Swagger::MimeType => Example]
14
+
15
+ def status_code
16
+ # FIXME: swagger-spec needs a defined way to define codes
17
+ code = parent.responses.key self
18
+ code = '200' if code == 'default'
19
+ code.to_i
20
+ rescue
21
+ # TODO: Warning?
22
+ 200
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ require 'swagger/swagger_object'
2
+
3
+ module Swagger
4
+ module V2
5
+ # Class representing a Swagger "Security Requirement Object".
6
+ # @see https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#securityRequirementObject
7
+ # Security Requirement Object
8
+ class SecurityRequirement < Hashie::Mash
9
+ # TODO: Need proper constraints, but coercion is tricky
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ require 'swagger/swagger_object'
2
+
3
+ module Swagger
4
+ module V2
5
+ # Class representing a Swagger "Security Scheme Object".
6
+ # @see https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#securitySchemeObject
7
+ # Security Scheme Object
8
+ class SecurityScheme < SwaggerObject
9
+ # FIXME: Swagger documentation about what's required doesn't seem accurate - OSAuth2 centric?
10
+
11
+ # According to docs, all except description are required. Schema and samples don't match.
12
+
13
+ # @!group Fixed Fields
14
+ field :type, String
15
+ field :description, String
16
+ field :name, String
17
+ field :in, String
18
+ field :flow, String
19
+ field :authorizationUrl, String
20
+ field :tokenUrl, String
21
+ field :scopes, Hash
22
+ # @!endgroup
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ module Swagger
2
+ module V2
3
+ # Class representing a Swagger "Tag Object".
4
+ # @see https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md#tagObject Tag Object
5
+ class Tag < SwaggerObject
6
+ required_field :name, String
7
+ field :description, String
8
+ # TODO: Documentable
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Swagger
2
+ VERSION = '0.2.5'
3
+ end
@@ -0,0 +1,150 @@
1
+ {
2
+ "id": "http://json-schema.org/draft-04/schema#",
3
+ "$schema": "http://json-schema.org/draft-04/schema#",
4
+ "description": "Core schema meta-schema",
5
+ "definitions": {
6
+ "schemaArray": {
7
+ "type": "array",
8
+ "minItems": 1,
9
+ "items": { "$ref": "#" }
10
+ },
11
+ "positiveInteger": {
12
+ "type": "integer",
13
+ "minimum": 0
14
+ },
15
+ "positiveIntegerDefault0": {
16
+ "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
17
+ },
18
+ "simpleTypes": {
19
+ "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
20
+ },
21
+ "stringArray": {
22
+ "type": "array",
23
+ "items": { "type": "string" },
24
+ "minItems": 1,
25
+ "uniqueItems": true
26
+ }
27
+ },
28
+ "type": "object",
29
+ "properties": {
30
+ "id": {
31
+ "type": "string",
32
+ "format": "uri"
33
+ },
34
+ "$schema": {
35
+ "type": "string",
36
+ "format": "uri"
37
+ },
38
+ "title": {
39
+ "type": "string"
40
+ },
41
+ "description": {
42
+ "type": "string"
43
+ },
44
+ "default": {},
45
+ "multipleOf": {
46
+ "type": "number",
47
+ "minimum": 0,
48
+ "exclusiveMinimum": true
49
+ },
50
+ "maximum": {
51
+ "type": "number"
52
+ },
53
+ "exclusiveMaximum": {
54
+ "type": "boolean",
55
+ "default": false
56
+ },
57
+ "minimum": {
58
+ "type": "number"
59
+ },
60
+ "exclusiveMinimum": {
61
+ "type": "boolean",
62
+ "default": false
63
+ },
64
+ "maxLength": { "$ref": "#/definitions/positiveInteger" },
65
+ "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
66
+ "pattern": {
67
+ "type": "string",
68
+ "format": "regex"
69
+ },
70
+ "additionalItems": {
71
+ "anyOf": [
72
+ { "type": "boolean" },
73
+ { "$ref": "#" }
74
+ ],
75
+ "default": {}
76
+ },
77
+ "items": {
78
+ "anyOf": [
79
+ { "$ref": "#" },
80
+ { "$ref": "#/definitions/schemaArray" }
81
+ ],
82
+ "default": {}
83
+ },
84
+ "maxItems": { "$ref": "#/definitions/positiveInteger" },
85
+ "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
86
+ "uniqueItems": {
87
+ "type": "boolean",
88
+ "default": false
89
+ },
90
+ "maxProperties": { "$ref": "#/definitions/positiveInteger" },
91
+ "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
92
+ "required": { "$ref": "#/definitions/stringArray" },
93
+ "additionalProperties": {
94
+ "anyOf": [
95
+ { "type": "boolean" },
96
+ { "$ref": "#" }
97
+ ],
98
+ "default": {}
99
+ },
100
+ "definitions": {
101
+ "type": "object",
102
+ "additionalProperties": { "$ref": "#" },
103
+ "default": {}
104
+ },
105
+ "properties": {
106
+ "type": "object",
107
+ "additionalProperties": { "$ref": "#" },
108
+ "default": {}
109
+ },
110
+ "patternProperties": {
111
+ "type": "object",
112
+ "additionalProperties": { "$ref": "#" },
113
+ "default": {}
114
+ },
115
+ "dependencies": {
116
+ "type": "object",
117
+ "additionalProperties": {
118
+ "anyOf": [
119
+ { "$ref": "#" },
120
+ { "$ref": "#/definitions/stringArray" }
121
+ ]
122
+ }
123
+ },
124
+ "enum": {
125
+ "type": "array",
126
+ "minItems": 1,
127
+ "uniqueItems": true
128
+ },
129
+ "type": {
130
+ "anyOf": [
131
+ { "$ref": "#/definitions/simpleTypes" },
132
+ {
133
+ "type": "array",
134
+ "items": { "$ref": "#/definitions/simpleTypes" },
135
+ "minItems": 1,
136
+ "uniqueItems": true
137
+ }
138
+ ]
139
+ },
140
+ "allOf": { "$ref": "#/definitions/schemaArray" },
141
+ "anyOf": { "$ref": "#/definitions/schemaArray" },
142
+ "oneOf": { "$ref": "#/definitions/schemaArray" },
143
+ "not": { "$ref": "#" }
144
+ },
145
+ "dependencies": {
146
+ "exclusiveMaximum": [ "maximum" ],
147
+ "exclusiveMinimum": [ "minimum" ]
148
+ },
149
+ "default": {}
150
+ }