rswag3-specs 0.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: af82d2aa55de6fed3509c7dbba1a8ab7a02dae69
4
+ data.tar.gz: 27c9e640df0e6ed47c3b7c84028a5e39dae6967f
5
+ SHA512:
6
+ metadata.gz: b71e0a5918578b3e3fe61f1b8c3a318b8100958d273624082bbc80e0af40b2eb542354df82a9645241ed2bafc7ad061ac0563a21771374f8194cb1206c1ba31f
7
+ data.tar.gz: f9e97ca393d2679d6d1c83c8d65bb515665e2eff8c0e29e17300d1676934319204da359bd797224bbffbd8a53c0376d6729fd8b1dd36ba097ec94aaa36ec8ab5
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2015 domaindrivendev
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'rswag-specs'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Adds swagger_helper to enable Swagger DSL in integration specs
3
+
4
+ Example:
5
+ rails generate rswag:specs:install
6
+
7
+ This will create:
8
+ spec/swagger_helper.rb
@@ -0,0 +1,14 @@
1
+ require 'rails/generators'
2
+
3
+ module Rswag
4
+ module Specs
5
+
6
+ class InstallGenerator < Rails::Generators::Base
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ def add_swagger_helper
10
+ template('swagger_helper.rb', 'spec/swagger_helper.rb')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.configure do |config|
4
+ # Specify a root folder where Swagger JSON files are generated
5
+ # NOTE: If you're using the rswag-api to serve API descriptions, you'll need
6
+ # to ensure that it's configured to serve Swagger from the same folder
7
+ config.swagger_root = Rails.root.to_s + '/swagger'
8
+
9
+ # Define one or more Swagger documents and provide global metadata for each one
10
+ # When you run the 'rswag:specs:swaggerize' rake task, the complete Swagger will
11
+ # be generated at the provided relative path under swagger_root
12
+ # By default, the operations defined in spec files are added to the first
13
+ # document below. You can override this behavior by adding a swagger_doc tag to the
14
+ # the root example_group in your specs, e.g. describe '...', swagger_doc: 'v2/swagger.json'
15
+ config.swagger_docs = {
16
+ 'v1/swagger.json' => {
17
+ swagger: '2.0',
18
+ info: {
19
+ title: 'API V1',
20
+ version: 'v1'
21
+ },
22
+ paths: {}
23
+ }
24
+ }
25
+ end
@@ -0,0 +1,43 @@
1
+ module Rswag
2
+ module Specs
3
+
4
+ class Configuration
5
+
6
+ def initialize(rspec_config)
7
+ @rspec_config = rspec_config
8
+ end
9
+
10
+ def swagger_root
11
+ @swagger_root ||= begin
12
+ if @rspec_config.swagger_root.nil?
13
+ raise ConfigurationError, 'No swagger_root provided. See swagger_helper.rb'
14
+ end
15
+ @rspec_config.swagger_root
16
+ end
17
+ end
18
+
19
+ def swagger_docs
20
+ @swagger_docs ||= begin
21
+ if @rspec_config.swagger_docs.nil? || @rspec_config.swagger_docs.empty?
22
+ raise ConfigurationError, 'No swagger_docs defined. See swagger_helper.rb'
23
+ end
24
+ @rspec_config.swagger_docs
25
+ end
26
+ end
27
+
28
+ def swagger_dry_run
29
+ @swagger_dry_run ||= begin
30
+ @rspec_config.swagger_dry_run.nil? || @rspec_config.swagger_dry_run
31
+ end
32
+ end
33
+
34
+ def get_swagger_doc(name)
35
+ return swagger_docs.values.first if name.nil?
36
+ raise ConfigurationError, "Unknown swagger_doc '#{name}'" unless swagger_docs[name]
37
+ swagger_docs[name]
38
+ end
39
+ end
40
+
41
+ class ConfigurationError < StandardError; end
42
+ end
43
+ end
@@ -0,0 +1,102 @@
1
+ module Rswag
2
+ module Specs
3
+ module ExampleGroupHelpers
4
+
5
+ def path(template, metadata={}, &block)
6
+ metadata[:path_item] = { template: template }
7
+ describe(template, metadata, &block)
8
+ end
9
+
10
+ [ :get, :post, :patch, :put, :delete, :head ].each do |verb|
11
+ define_method(verb) do |summary, &block|
12
+ api_metadata = { operation: { verb: verb, summary: summary } }
13
+ describe(verb, api_metadata, &block)
14
+ end
15
+ end
16
+
17
+ [ :operationId, :deprecated, :security ].each do |attr_name|
18
+ define_method(attr_name) do |value|
19
+ metadata[:operation][attr_name] = value
20
+ end
21
+ end
22
+
23
+ # NOTE: 'description' requires special treatment because ExampleGroup already
24
+ # defines a method with that name. Provide an override that supports the existing
25
+ # functionality while also setting the appropriate metadata if applicable
26
+ def description(value=nil)
27
+ return super() if value.nil?
28
+ metadata[:operation][:description] = value
29
+ end
30
+
31
+ # These are array properties - note the splat operator
32
+ [ :tags, :consumes, :produces, :schemes ].each do |attr_name|
33
+ define_method(attr_name) do |*value|
34
+ metadata[:operation][attr_name] = value
35
+ end
36
+ end
37
+
38
+ def requestBody(value)
39
+ metadata[:operation][:requestBody] = value
40
+ end
41
+
42
+ def parameter(attributes)
43
+ if attributes[:in] && attributes[:in].to_sym == :path
44
+ attributes[:required] = true
45
+ end
46
+
47
+ if metadata.has_key?(:operation)
48
+ metadata[:operation][:parameters] ||= []
49
+ metadata[:operation][:parameters] << attributes
50
+ else
51
+ metadata[:path_item][:parameters] ||= []
52
+ metadata[:path_item][:parameters] << attributes
53
+ end
54
+ end
55
+
56
+ def response(code, description, metadata={}, &block)
57
+ metadata[:response] = { code: code, description: description }
58
+ context(description, metadata, &block)
59
+ end
60
+
61
+ def schema(value)
62
+ metadata[:response][:schema] = value
63
+ end
64
+
65
+ def header(name, attributes)
66
+ metadata[:response][:headers] ||= {}
67
+ metadata[:response][:headers][name] = attributes
68
+ end
69
+
70
+ # NOTE: Similar to 'description', 'examples' need to handle the case when
71
+ # being invoked with no params to avoid overriding 'examples' method of
72
+ # rspec-core ExampleGroup
73
+ def examples(example = nil)
74
+ return super() if example.nil?
75
+ metadata[:response][:examples] = example
76
+ end
77
+
78
+ def run_test!(&block)
79
+ # NOTE: rspec 2.x support
80
+ if RSPEC_VERSION < 3
81
+ before do
82
+ submit_request(example.metadata)
83
+ end
84
+
85
+ it "returns a #{metadata[:response][:code]} response" do
86
+ assert_response_matches_metadata(metadata)
87
+ block.call(response) if block_given?
88
+ end
89
+ else
90
+ before do |example|
91
+ submit_request(example.metadata)
92
+ end
93
+
94
+ it "returns a #{metadata[:response][:code]} response" do |example|
95
+ assert_response_matches_metadata(example.metadata, &block)
96
+ example.instance_exec(response, &block) if block_given?
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,35 @@
1
+ require 'rswag/specs/request_factory'
2
+ require 'rswag/specs/response_validator'
3
+
4
+ module Rswag
5
+ module Specs
6
+ module ExampleHelpers
7
+
8
+ def submit_request(metadata)
9
+ request = RequestFactory.new.build_request(metadata, self)
10
+
11
+ if RAILS_VERSION < 5
12
+ send(
13
+ request[:verb],
14
+ request[:path],
15
+ request[:payload],
16
+ request[:headers]
17
+ )
18
+ else
19
+ send(
20
+ request[:verb],
21
+ request[:path],
22
+ {
23
+ params: request[:payload],
24
+ headers: request[:headers]
25
+ }
26
+ )
27
+ end
28
+ end
29
+
30
+ def assert_response_matches_metadata(metadata)
31
+ ResponseValidator.new.validate!(metadata, response)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ require 'json-schema'
2
+
3
+ module Rswag
4
+ module Specs
5
+ class ExtendedSchema < JSON::Schema::Draft4
6
+
7
+ def initialize
8
+ super
9
+ @attributes['type'] = ExtendedTypeAttribute
10
+ @uri = URI.parse('http://tempuri.org/rswag/specs/extended_schema')
11
+ @names = ['http://tempuri.org/rswag/specs/extended_schema']
12
+ end
13
+ end
14
+
15
+ class ExtendedTypeAttribute < JSON::Schema::TypeV4Attribute
16
+
17
+ def self.validate(current_schema, data, fragments, processor, validator, options={})
18
+ return if data.nil? && current_schema.schema['x-nullable'] == true
19
+ super
20
+ end
21
+ end
22
+
23
+ JSON::Validator.register_validator(ExtendedSchema.new)
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ module Rswag
2
+ module Specs
3
+ class Railtie < ::Rails::Railtie
4
+
5
+ rake_tasks do
6
+ load File.expand_path('../../../tasks/rswag-specs_tasks.rake', __FILE__)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,161 @@
1
+ require 'active_support/core_ext/hash/slice'
2
+ require 'active_support/core_ext/hash/conversions'
3
+ require 'json'
4
+
5
+ module Rswag
6
+ module Specs
7
+ class RequestFactory
8
+
9
+ def initialize(config = ::Rswag::Specs.config)
10
+ @config = config
11
+ end
12
+
13
+ def build_request(metadata, example)
14
+ swagger_doc = @config.get_swagger_doc(metadata[:swagger_doc])
15
+ parameters = expand_parameters(metadata, swagger_doc, example)
16
+
17
+ {}.tap do |request|
18
+ add_verb(request, metadata)
19
+ add_path(request, metadata, swagger_doc, parameters, example)
20
+ add_headers(request, metadata, swagger_doc, parameters, example)
21
+ add_payload(request, parameters, example)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def expand_parameters(metadata, swagger_doc, example)
28
+ operation_params = metadata[:operation][:parameters] || []
29
+ path_item_params = metadata[:path_item][:parameters] || []
30
+ security_params = derive_security_params(metadata, swagger_doc)
31
+
32
+ # NOTE: Use of + instead of concat to avoid mutation of the metadata object
33
+ (operation_params + path_item_params + security_params)
34
+ .map { |p| p['$ref'] ? resolve_parameter(p['$ref'], swagger_doc) : p }
35
+ .uniq { |p| p[:name] }
36
+ .reject { |p|
37
+ p[:required] == false &&
38
+ (!example.respond_to?(p[:name])) ||
39
+ (example.respond_to?(p[:name]) && example.send(p[:name]).is_a?(RSpec::Matchers::BuiltIn::Include))
40
+ }
41
+ end
42
+
43
+ def derive_security_params(metadata, swagger_doc)
44
+ requirements = metadata[:operation][:security] || swagger_doc[:security] || []
45
+ scheme_names = requirements.flat_map { |r| r.keys }
46
+ schemes = (swagger_doc[:securityDefinitions] || {}).slice(*scheme_names).values
47
+
48
+ schemes.map do |scheme|
49
+ param = (scheme[:type] == :apiKey) ? scheme.slice(:name, :in) : { name: 'Authorization', in: :header }
50
+ param.merge(type: :string, required: requirements.one?)
51
+ end
52
+ end
53
+
54
+ def resolve_parameter(ref, swagger_doc)
55
+ key = ref.sub('#/parameters/', '').to_sym
56
+ definitions = swagger_doc[:parameters]
57
+ raise "Referenced parameter '#{ref}' must be defined" unless definitions && definitions[key]
58
+ definitions[key]
59
+ end
60
+
61
+ def add_verb(request, metadata)
62
+ request[:verb] = metadata[:operation][:verb]
63
+ end
64
+
65
+ def add_path(request, metadata, swagger_doc, parameters, example)
66
+ template = (swagger_doc[:basePath] || '') + metadata[:path_item][:template]
67
+
68
+ request[:path] = template.tap do |template|
69
+ parameters.select { |p| p[:in] == :path }.each do |p|
70
+ template.gsub!("{#{p[:name]}}", example.send(p[:name]).to_s)
71
+ end
72
+
73
+ parameters.select { |p| p[:in] == :query }.each_with_index do |p, i|
74
+ template.concat(i == 0 ? '?' : '&')
75
+ template.concat(build_query_string_part(p, example.send(p[:name])))
76
+ end
77
+ end
78
+ end
79
+
80
+ def build_query_string_part(param, value)
81
+ name = param[:name]
82
+ return "#{name}=#{value.to_s}" unless param[:type].to_sym == :array
83
+
84
+ case param[:collectionFormat]
85
+ when :ssv
86
+ "#{name}=#{value.join(' ')}"
87
+ when :tsv
88
+ "#{name}=#{value.join('\t')}"
89
+ when :pipes
90
+ "#{name}=#{value.join('|')}"
91
+ when :multi
92
+ value.map { |v| "#{name}=#{v}" }.join('&')
93
+ else
94
+ "#{name}=#{value.join(',')}" # csv is default
95
+ end
96
+ end
97
+
98
+ def add_headers(request, metadata, swagger_doc, parameters, example)
99
+ tuples = parameters
100
+ .select { |p| p[:in] == :header }
101
+ .map { |p| [ p[:name], example.send(p[:name]).to_s ] }
102
+
103
+ # Accept header
104
+ produces = metadata[:operation][:produces] || swagger_doc[:produces]
105
+ if produces
106
+ accept = example.respond_to?(:'Accept') ? example.send(:'Accept') : produces.first
107
+ tuples << [ 'Accept', accept ]
108
+ end
109
+
110
+ # Content-Type header
111
+ consumes = metadata[:operation][:consumes] || swagger_doc[:consumes]
112
+ if consumes
113
+ content_type = example.respond_to?(:'Content-Type') ? example.send(:'Content-Type') : consumes.first
114
+ tuples << [ 'Content-Type', content_type ]
115
+ end
116
+
117
+ # Rails test infrastructure requires rackified headers
118
+ rackified_tuples = tuples.map do |pair|
119
+ [
120
+ case pair[0]
121
+ when 'Accept' then 'HTTP_ACCEPT'
122
+ when 'Content-Type' then 'CONTENT_TYPE'
123
+ when 'Authorization' then 'HTTP_AUTHORIZATION'
124
+ else pair[0]
125
+ end,
126
+ pair[1]
127
+ ]
128
+ end
129
+
130
+ request[:headers] = Hash[ rackified_tuples ]
131
+ end
132
+
133
+ def add_payload(request, parameters, example)
134
+ content_type = request[:headers]['CONTENT_TYPE']
135
+ return if content_type.nil?
136
+
137
+ if [ 'application/x-www-form-urlencoded', 'multipart/form-data' ].include?(content_type)
138
+ request[:payload] = build_form_payload(parameters, example)
139
+ else
140
+ request[:payload] = build_json_payload(parameters, example)
141
+ end
142
+ end
143
+
144
+ def build_form_payload(parameters, example)
145
+ # See http://seejohncode.com/2012/04/29/quick-tip-testing-multipart-uploads-with-rspec/
146
+ # Rather that serializing with the appropriate encoding (e.g. multipart/form-data),
147
+ # Rails test infrastructure allows us to send the values directly as a hash
148
+ # PROS: simple to implement, CONS: serialization/deserialization is bypassed in test
149
+ tuples = parameters
150
+ .select { |p| p[:in] == :formData }
151
+ .map { |p| [ p[:name], example.send(p[:name]) ] }
152
+ Hash[ tuples ]
153
+ end
154
+
155
+ def build_json_payload(parameters, example)
156
+ body_param = parameters.select { |p| p[:in] == :body }.first
157
+ body_param ? example.send(body_param[:name]).to_json : nil
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,54 @@
1
+ require 'active_support/core_ext/hash/slice'
2
+ require 'json-schema'
3
+ require 'json'
4
+ require 'rswag/specs/extended_schema'
5
+
6
+ module Rswag
7
+ module Specs
8
+ class ResponseValidator
9
+
10
+ def initialize(config = ::Rswag::Specs.config)
11
+ @config = config
12
+ end
13
+
14
+ def validate!(metadata, response)
15
+ swagger_doc = @config.get_swagger_doc(metadata[:swagger_doc])
16
+
17
+ validate_code!(metadata, response)
18
+ validate_headers!(metadata, response.headers)
19
+ validate_body!(metadata, swagger_doc, response.body)
20
+ end
21
+
22
+ private
23
+
24
+ def validate_code!(metadata, response)
25
+ expected = metadata[:response][:code].to_s
26
+ if response.code != expected
27
+ raise UnexpectedResponse,
28
+ "Expected response code '#{response.code}' to match '#{expected}'\n" \
29
+ "Response body: #{response.body}"
30
+ end
31
+ end
32
+
33
+ def validate_headers!(metadata, headers)
34
+ expected = (metadata[:response][:headers] || {}).keys
35
+ expected.each do |name|
36
+ raise UnexpectedResponse, "Expected response header #{name} to be present" if headers[name.to_s].nil?
37
+ end
38
+ end
39
+
40
+ def validate_body!(metadata, swagger_doc, body)
41
+ response_schema = metadata[:response][:schema]
42
+ return if response_schema.nil?
43
+
44
+ validation_schema = response_schema
45
+ .merge('$schema' => 'http://tempuri.org/rswag/specs/extended_schema')
46
+ .merge(swagger_doc.slice(:definitions))
47
+ errors = JSON::Validator.fully_validate(validation_schema, body)
48
+ raise UnexpectedResponse, "Expected response body to match schema: #{errors[0]}" if errors.any?
49
+ end
50
+ end
51
+
52
+ class UnexpectedResponse < StandardError; end
53
+ end
54
+ end
@@ -0,0 +1,67 @@
1
+ require 'active_support/core_ext/hash/deep_merge'
2
+ require 'swagger_helper'
3
+
4
+ module Rswag
5
+ module Specs
6
+ class SwaggerFormatter
7
+
8
+ # NOTE: rspec 2.x support
9
+ if RSPEC_VERSION > 2
10
+ ::RSpec::Core::Formatters.register self, :example_group_finished, :stop
11
+ end
12
+
13
+ def initialize(output, config = Rswag::Specs.config)
14
+ @output = output
15
+ @config = config
16
+
17
+ @output.puts 'Generating Swagger docs ...'
18
+ end
19
+
20
+ def example_group_finished(notification)
21
+ # NOTE: rspec 2.x support
22
+ if RSPEC_VERSION > 2
23
+ metadata = notification.group.metadata
24
+ else
25
+ metadata = notification.metadata
26
+ end
27
+
28
+ return unless metadata.has_key?(:response)
29
+ swagger_doc = @config.get_swagger_doc(metadata[:swagger_doc])
30
+ swagger_doc.deep_merge!(metadata_to_swagger(metadata))
31
+ end
32
+
33
+ def stop(notification=nil)
34
+ @config.swagger_docs.each do |url_path, doc|
35
+ file_path = File.join(@config.swagger_root, url_path)
36
+ dirname = File.dirname(file_path)
37
+ FileUtils.mkdir_p dirname unless File.exists?(dirname)
38
+
39
+ File.open(file_path, 'w') do |file|
40
+ file.write(JSON.pretty_generate(doc))
41
+ end
42
+
43
+ @output.puts "Swagger doc generated at #{file_path}"
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def metadata_to_swagger(metadata)
50
+ response_code = metadata[:response][:code]
51
+ response = metadata[:response].reject { |k,v| k == :code }
52
+
53
+ verb = metadata[:operation][:verb]
54
+ operation = metadata[:operation]
55
+ .reject { |k,v| k == :verb }
56
+ .merge(responses: { response_code => response })
57
+
58
+ path_template = metadata[:path_item][:template]
59
+ path_item = metadata[:path_item]
60
+ .reject { |k,v| k == :template }
61
+ .merge(verb => operation)
62
+
63
+ { paths: { path_template => path_item } }
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,27 @@
1
+ require 'rspec/core'
2
+ require 'rswag/specs/example_group_helpers'
3
+ require 'rswag/specs/example_helpers'
4
+ require 'rswag/specs/configuration'
5
+ require 'rswag/specs/railtie' if defined?(Rails::Railtie)
6
+
7
+ module Rswag
8
+ module Specs
9
+
10
+ # Extend RSpec with a swagger-based DSL
11
+ ::RSpec.configure do |c|
12
+ c.add_setting :swagger_root
13
+ c.add_setting :swagger_docs
14
+ c.add_setting :swagger_dry_run
15
+ c.extend ExampleGroupHelpers, type: :request
16
+ c.include ExampleHelpers, type: :request
17
+ end
18
+
19
+ def self.config
20
+ @config ||= Configuration.new(RSpec.configuration)
21
+ end
22
+
23
+ # Support Rails 3+ and RSpec 2+ (sigh!)
24
+ RAILS_VERSION = Rails::VERSION::MAJOR
25
+ RSPEC_VERSION = RSpec::Core::Version::STRING.split('.').first.to_i
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ namespace :rswag do
4
+ namespace :specs do
5
+
6
+ desc 'Generate Swagger JSON files from integration specs'
7
+ RSpec::Core::RakeTask.new('swaggerize') do |t|
8
+ t.pattern = 'spec/requests/**/*_spec.rb, spec/api/**/*_spec.rb, spec/integration/**/*_spec.rb'
9
+
10
+ # NOTE: rspec 2.x support
11
+ if Rswag::Specs::RSPEC_VERSION > 2 && Rswag::Specs.config.swagger_dry_run
12
+ t.rspec_opts = [ '--format Rswag::Specs::SwaggerFormatter', '--dry-run', '--order defined' ]
13
+ else
14
+ t.rspec_opts = [ '--format Rswag::Specs::SwaggerFormatter', '--order defined' ]
15
+ end
16
+ end
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rswag3-specs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Evgeniy Koltsov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: railties
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '3.1'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '6.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '3.1'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '6.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: json-schema
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.2'
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2.2'
67
+ description: Simplify API integration testing with a succinct rspec DSL and generate
68
+ Swagger files directly from your rspecs
69
+ email:
70
+ - jetapahob@gmail.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - MIT-LICENSE
76
+ - Rakefile
77
+ - lib/generators/rswag/specs/install/USAGE
78
+ - lib/generators/rswag/specs/install/install_generator.rb
79
+ - lib/generators/rswag/specs/install/templates/swagger_helper.rb
80
+ - lib/rswag/specs.rb
81
+ - lib/rswag/specs/configuration.rb
82
+ - lib/rswag/specs/example_group_helpers.rb
83
+ - lib/rswag/specs/example_helpers.rb
84
+ - lib/rswag/specs/extended_schema.rb
85
+ - lib/rswag/specs/railtie.rb
86
+ - lib/rswag/specs/request_factory.rb
87
+ - lib/rswag/specs/response_validator.rb
88
+ - lib/rswag/specs/swagger_formatter.rb
89
+ - lib/tasks/rswag-specs_tasks.rake
90
+ homepage: https://github.com/Je33/rswag
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.5.1
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: A Swagger-based DSL for rspec-rails & accompanying rake task for generating
114
+ Swagger files
115
+ test_files: []