reqres_rspec 0.0.30 → 0.1.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 +4 -4
- data/README.md +74 -1
- data/lib/reqres_rspec/collector.rb +3 -3
- data/lib/reqres_rspec/configuration.rb +67 -0
- data/lib/reqres_rspec/formatters/base.rb +33 -0
- data/lib/reqres_rspec/formatters/html.rb +43 -0
- data/lib/reqres_rspec/formatters/json.rb +16 -0
- data/lib/reqres_rspec/formatters/pdf.rb +35 -0
- data/lib/reqres_rspec/formatters.rb +36 -0
- data/lib/reqres_rspec/{writers/templates → templates}/header.erb +2 -2
- data/lib/reqres_rspec/{writers/templates → templates}/index.erb +1 -1
- data/lib/reqres_rspec/{writers/templates → templates}/panel.erb +2 -2
- data/lib/reqres_rspec/{writers/templates → templates}/spec.erb +1 -1
- data/lib/reqres_rspec/uploaders/amazon_s3.rb +57 -0
- data/lib/reqres_rspec/uploaders.rb +27 -0
- data/lib/reqres_rspec/utils.rb +25 -0
- data/lib/reqres_rspec/version.rb +1 -1
- data/lib/reqres_rspec.rb +11 -31
- data/reqres_rspec.gemspec +1 -0
- metadata +29 -9
- data/lib/reqres_rspec/generators/pdf.rb +0 -29
- data/lib/reqres_rspec/writers/html.rb +0 -89
- data/lib/reqres_rspec/writers/json_formatter.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f574d33801a5576da4abaffffb99110a428a358
|
4
|
+
data.tar.gz: e303ce1d7e6ba81ce6fe00c21d6ba38e3056ff6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41ea72db92b4ba65ccdbf5623198e5282a05ab0229d14ff6ecf2ee9b0117b7e8ee3d023adc92e9ce74e6537d3690aef5bfe00349901c451bb62310d35cd60d68
|
7
|
+
data.tar.gz: c9aab7c397bdb1e6f642e7c9e89aadbe17b84b379bb51403574fd1947ddb156ab8dde99a52945621cd96455076ee746840413f4f7c14b410c90d2e12774069fc
|
data/README.md
CHANGED
@@ -37,6 +37,12 @@ by default `reqres_rspec` is not active (this may be configured!). To activate i
|
|
37
37
|
|
38
38
|
Documentation will be put into your application's `/doc` folder
|
39
39
|
|
40
|
+
## Upload to S3
|
41
|
+
|
42
|
+
By default ReqRes will use `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION` and `AWS_REQRES_BUCKET` environment variables. But you can alter that in configuration, see below.
|
43
|
+
|
44
|
+
`REQRES_UPLOAD=1 REQRES_RSPEC=1 bundle exec rspec --order=defined`
|
45
|
+
|
40
46
|
### Sample controller action
|
41
47
|
|
42
48
|
```ruby
|
@@ -79,6 +85,21 @@ Each param text is started with `@param` and first word will be param name, then
|
|
79
85
|
|
80
86
|
Doc will use full example description, as a title for each separate spec
|
81
87
|
|
88
|
+
If you want to group examples in another way, you can do something like:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
describe 'Something', reqres_section: 'Foo' do
|
92
|
+
context 'valid params', reqres_title: 'Bakes Pie' do
|
93
|
+
it 'works' do
|
94
|
+
...
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
In this case all the `reqres_sections` can be used for grouping colleced data into section, and `reqres_title` will become human readable titles:
|
101
|
+
[](http://i57.tinypic.com/2581lw9.jpg)
|
102
|
+
|
82
103
|
### Generates documentation example
|
83
104
|
|
84
105
|
[](http://i44.tinypic.com/kda1pw.png)
|
@@ -88,7 +109,59 @@ Documentation is written in HTML format, which then converted to PDF. PDF files
|
|
88
109
|
|
89
110
|
## Configuration
|
90
111
|
|
91
|
-
|
112
|
+
```ruby
|
113
|
+
ReqresRspec.configure do |c|
|
114
|
+
c.templates_path = Rails.root.join('spec/support/reqres/templates') # Path to custom templates
|
115
|
+
c.output_path = 'some path' # by default it will use doc/reqres
|
116
|
+
c.formatters = %w(MyCustomFormatter) # List of custom formatters, these can be inherited from ReqresRspec::Formatters::HTML
|
117
|
+
c.title = 'My API Documentation' # Title for your documentation
|
118
|
+
c.amazon_s3 = {
|
119
|
+
credentials: {
|
120
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'], # by default it will use AWS_ACCESS_KEY_ID env var
|
121
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], # by default it will use AWS_SECRET_ACCESS_KEY env var
|
122
|
+
region: (ENV['AWS_REGION'] || 'us-east-1'),
|
123
|
+
},
|
124
|
+
bucket: ENV['AWS_REQRES_BUCKET'], # by default it will use AWS_REQRES_BUCKET env for bucket name
|
125
|
+
enabled: false # Enable upload (only with REQRES_UPLOAD env var set)
|
126
|
+
}
|
127
|
+
end
|
128
|
+
```
|
129
|
+
|
130
|
+
## Custom Formatter example
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
class CustomAPIDoc < ReqresRspec::Formatters::HTML
|
134
|
+
private
|
135
|
+
def write
|
136
|
+
# Copy assets
|
137
|
+
%w(styles images components scripts).each do |folder|
|
138
|
+
FileUtils.cp_r(path(folder), output_path)
|
139
|
+
end
|
140
|
+
|
141
|
+
# Generate general pages
|
142
|
+
@pages = {
|
143
|
+
'index.html' => 'Introduction',
|
144
|
+
'authentication.html' => 'Authentication',
|
145
|
+
'filtering.html' => 'Filtering, Sorting and Pagination',
|
146
|
+
'locations.html' => 'Locations',
|
147
|
+
'files.html' => 'Files',
|
148
|
+
'external-ids.html' => 'External IDs',
|
149
|
+
}
|
150
|
+
|
151
|
+
@pages.each do |filename, _|
|
152
|
+
@current_page = filename
|
153
|
+
save filename, render("pages/#{filename}")
|
154
|
+
end
|
155
|
+
|
156
|
+
# Generate API pages
|
157
|
+
@records.each do |record|
|
158
|
+
@record = record
|
159
|
+
@current_page = @record[:filename]
|
160
|
+
save "#{record[:filename]}.html", render('spec.html.erb')
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
```
|
92
165
|
|
93
166
|
## Future plans
|
94
167
|
|
@@ -83,8 +83,8 @@ module ReqresRspec
|
|
83
83
|
|
84
84
|
self.records << {
|
85
85
|
filename: prepare_filename_for(spec.class.metadata),
|
86
|
-
group: section, # Top level example group
|
87
|
-
title: spec.class.example.full_description,
|
86
|
+
group: spec.class.metadata[:reqres_section] || section, # Top level example group
|
87
|
+
title: spec.class.metadata[:reqres_title] || spec.class.example.full_description,
|
88
88
|
description: description,
|
89
89
|
params: params,
|
90
90
|
request_path: get_symbolized_path(request),
|
@@ -181,7 +181,7 @@ module ReqresRspec
|
|
181
181
|
# returns action comments taken from controller file
|
182
182
|
# example TODO
|
183
183
|
def get_action_comments(controller, action)
|
184
|
-
lines = File.readlines(File.join(
|
184
|
+
lines = File.readlines(File.join(ReqresRspec.root, 'app', 'controllers', "#{controller}_controller.rb"))
|
185
185
|
|
186
186
|
action_line = nil
|
187
187
|
lines.each_with_index do |line, index|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module ReqresRspec
|
2
|
+
extend self
|
3
|
+
|
4
|
+
def configure
|
5
|
+
yield configuration
|
6
|
+
end
|
7
|
+
|
8
|
+
def configuration
|
9
|
+
@configuration ||= Configuration.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def logger
|
13
|
+
@logger ||= if defined?(Rails)
|
14
|
+
Rails.logger
|
15
|
+
else
|
16
|
+
Logger.new(STDOUT)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def root
|
21
|
+
configuration.root
|
22
|
+
end
|
23
|
+
|
24
|
+
class Configuration
|
25
|
+
DEFAULT_FORMATTERS = %w(html pdf json)
|
26
|
+
def initialize
|
27
|
+
ReqresRspec.logger.level = Logger::INFO
|
28
|
+
@root = if defined?(Rails)
|
29
|
+
Rails.root.to_s
|
30
|
+
else
|
31
|
+
raise 'REQRES_RSPEC_ROOT is not defined' if ENV['REQRES_RSPEC_ROOT'].blank?
|
32
|
+
ENV['REQRES_RSPEC_ROOT']
|
33
|
+
end
|
34
|
+
|
35
|
+
@templates_path = File.expand_path('../templates', __FILE__)
|
36
|
+
@output_path = File.join(@root, '/doc/reqres')
|
37
|
+
|
38
|
+
requested_formats = (ENV['REQRES_RSPEC_FORMATTERS'].to_s).split(',')
|
39
|
+
requested_formats.sort_by!{|fmt| [DEFAULT_FORMATTERS.index(fmt), fmt]}
|
40
|
+
@formatters = requested_formats.empty? ? %w(html) : requested_formats
|
41
|
+
|
42
|
+
@amazon_s3 = {
|
43
|
+
credentials: {
|
44
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
45
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
|
46
|
+
region: (ENV['AWS_REGION'] || 'us-east-1'),
|
47
|
+
},
|
48
|
+
bucket: ENV['AWS_REQRES_BUCKET'],
|
49
|
+
enabled: false
|
50
|
+
}
|
51
|
+
|
52
|
+
@title = 'API Docs'
|
53
|
+
end
|
54
|
+
|
55
|
+
attr_accessor :templates_path
|
56
|
+
attr_accessor :output_path
|
57
|
+
attr_accessor :title
|
58
|
+
attr_accessor :formatters
|
59
|
+
attr_reader :root
|
60
|
+
attr_reader :amazon_s3
|
61
|
+
|
62
|
+
def amazon_s3=(config={})
|
63
|
+
@amazon_s3.deep_merge!(config)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ReqresRspec
|
2
|
+
module Formatters
|
3
|
+
class Base
|
4
|
+
def initialize(records)
|
5
|
+
@records = records
|
6
|
+
@output_path = ReqresRspec.configuration.output_path
|
7
|
+
@logger = ReqresRspec.logger
|
8
|
+
end
|
9
|
+
attr_reader :logger, :output_path, :records
|
10
|
+
|
11
|
+
def process
|
12
|
+
cleanup
|
13
|
+
write
|
14
|
+
end
|
15
|
+
private
|
16
|
+
def write
|
17
|
+
raise 'Not Implemented'
|
18
|
+
end
|
19
|
+
|
20
|
+
def cleanup_pattern
|
21
|
+
'**/*'
|
22
|
+
end
|
23
|
+
|
24
|
+
def cleanup
|
25
|
+
unless Dir.exist?(output_path)
|
26
|
+
FileUtils.mkdir_p(output_path)
|
27
|
+
logger.info "#{output_path} was recreated"
|
28
|
+
end
|
29
|
+
FileUtils.rm_rf(Dir.glob("#{output_path}/#{cleanup_pattern}"), secure: true)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'coderay'
|
2
|
+
|
3
|
+
module ReqresRspec
|
4
|
+
module Formatters
|
5
|
+
class HTML < Base
|
6
|
+
private
|
7
|
+
def write
|
8
|
+
files = {
|
9
|
+
'rspec_doc_table_of_content.html' => 'header.erb',
|
10
|
+
'index.html' => 'index.erb',
|
11
|
+
'panel.html' => 'panel.erb'
|
12
|
+
}
|
13
|
+
|
14
|
+
files.each { |filename, template| save(filename, render(template)) }
|
15
|
+
|
16
|
+
@records.each do |record|
|
17
|
+
@record = record
|
18
|
+
save "rspec_doc_#{record[:filename]}.html", render('spec.erb')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def cleanup_pattern
|
23
|
+
'*.html'
|
24
|
+
end
|
25
|
+
|
26
|
+
def path(filename)
|
27
|
+
File.join(ReqresRspec.configuration.templates_path, filename)
|
28
|
+
end
|
29
|
+
|
30
|
+
def render(filename, arguments = {})
|
31
|
+
eval <<-RUBY
|
32
|
+
#{ arguments.map {|k, v| "#{k} = #{v}"}.join("\n") }
|
33
|
+
ERB.new(File.open(path(filename)).read).result(binding)
|
34
|
+
RUBY
|
35
|
+
end
|
36
|
+
|
37
|
+
def save(filename, data)
|
38
|
+
File.write(File.join(output_path, filename), data)
|
39
|
+
logger.info "Reqres::Formatters::HTML saved #{path(filename)}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ReqresRspec
|
2
|
+
module Formatters
|
3
|
+
class JSON < Base
|
4
|
+
private
|
5
|
+
def write
|
6
|
+
path = File.join(output_path, 'reqres_rspec.json')
|
7
|
+
File.write(path, ::JSON.pretty_generate(records))
|
8
|
+
logger.info "Reqres::Writers::#{self.class.name} saved doc spec to #{path}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def cleanup_pattern
|
12
|
+
'reqres_rspec.json'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ReqresRspec
|
2
|
+
module Formatters
|
3
|
+
class Pdf < Base
|
4
|
+
# generates PDF file from existing HTML docs
|
5
|
+
# TODO: more info
|
6
|
+
def write
|
7
|
+
# http://www.princexml.com/download/
|
8
|
+
pdf_tool_path = 'prince'
|
9
|
+
pdf_doc_path = File.join(output_path, 'reqres_rspec.pdf')
|
10
|
+
|
11
|
+
if `which #{pdf_tool_path}`.size > 0
|
12
|
+
files = Dir["#{output_path}/*.html"]
|
13
|
+
files.reject!{ |filename| filename.scan(/rspec_doc/).empty? }
|
14
|
+
files.delete("#{output_path}/rspec_doc_table_of_content.html")
|
15
|
+
files.unshift("#{output_path}/rspec_doc_table_of_content.html")
|
16
|
+
|
17
|
+
if files.size > 0
|
18
|
+
files_arg = files.join('" "')
|
19
|
+
`#{pdf_tool_path} "#{files_arg}" -o "#{pdf_doc_path}"`
|
20
|
+
|
21
|
+
logger.info "ReqresRspec::Formatters::Pdf saved doc to #{pdf_doc_path}" if File.exists? pdf_doc_path
|
22
|
+
else
|
23
|
+
logger.error 'No HTML files found'
|
24
|
+
end
|
25
|
+
else
|
26
|
+
logger.error "#{pdf_tool_path} is not installed! Check README.md for more info"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def cleanup_pattern
|
31
|
+
'reqres_rspec.pdf'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ReqresRspec
|
2
|
+
module Formatters
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def process(records)
|
6
|
+
formatters = ReqresRspec.configuration.formatters
|
7
|
+
raise 'No formatters defined' if formatters.empty?
|
8
|
+
|
9
|
+
formatters.each do |fmt|
|
10
|
+
case fmt
|
11
|
+
when 'html'
|
12
|
+
HTML.new(records).process
|
13
|
+
when 'pdf'
|
14
|
+
HTML.new(records).process unless formatters.include?('html')
|
15
|
+
Pdf.new(records).process
|
16
|
+
when 'json'
|
17
|
+
JSON.new(records).process
|
18
|
+
else
|
19
|
+
begin
|
20
|
+
klass = Object.const_get(fmt)
|
21
|
+
unless klass.public_instance_methods.include?(:process)
|
22
|
+
raise "Formatter #{fmt} should respond to `process` method"
|
23
|
+
end
|
24
|
+
klass.new(records).process
|
25
|
+
rescue NameError => e
|
26
|
+
if e.message =~ /(uninitialized constant|wrong constant name) #{fmt}$/
|
27
|
+
raise "Formatter #{fmt} does not exists"
|
28
|
+
else
|
29
|
+
raise e
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<html>
|
2
2
|
<head>
|
3
|
-
<title><%=
|
3
|
+
<title><%= ReqresRspec.configuration.title %></title>
|
4
4
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
|
5
5
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
|
6
6
|
<style>
|
@@ -58,7 +58,7 @@
|
|
58
58
|
</head>
|
59
59
|
<body>
|
60
60
|
<div class="container">
|
61
|
-
<h1><%=
|
61
|
+
<h1><%= ReqresRspec.configuration.title %></h1>
|
62
62
|
<p>Generated <%= Time.now.strftime('%d %B %Y at %H:%m:%S')%> with <a href="https://github.com/reqres-api/reqres_rspec">reqres_rspec</a></p>
|
63
63
|
<ul>
|
64
64
|
<% @records.each_with_index do |record, index| %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html>
|
3
3
|
<head>
|
4
|
-
<title><%=
|
4
|
+
<title><%= ReqresRspec.configuration.title %></title>
|
5
5
|
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
|
6
6
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
|
7
7
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html>
|
3
3
|
<head>
|
4
|
-
<title><%=
|
4
|
+
<title><%= ReqresRspec.configuration.title %></title>
|
5
5
|
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
|
6
6
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
|
7
7
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
|
@@ -86,7 +86,7 @@
|
|
86
86
|
</head>
|
87
87
|
<body>
|
88
88
|
<h1><a href="rspec_doc_table_of_content.html" target="specs">
|
89
|
-
<%=
|
89
|
+
<%= ReqresRspec.configuration.title %>
|
90
90
|
</a></h1>
|
91
91
|
<% @records.group_by{|h| h[:group]}.each do |group, items| %>
|
92
92
|
<h2><%= group %></h2>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<html>
|
2
2
|
<head>
|
3
|
-
<title><%=
|
3
|
+
<title><%= ReqresRspec.configuration.title %></title>
|
4
4
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
|
5
5
|
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
|
6
6
|
<style>
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'aws-sdk-core'
|
2
|
+
|
3
|
+
module ReqresRspec
|
4
|
+
module Uploaders
|
5
|
+
class AmazonS3
|
6
|
+
def initialize
|
7
|
+
@path = ReqresRspec.configuration.output_path
|
8
|
+
@logger = ReqresRspec.logger
|
9
|
+
@enabled = ReqresRspec.configuration.amazon_s3[:enabled] || false
|
10
|
+
@bucket = ReqresRspec.configuration.amazon_s3[:bucket]
|
11
|
+
|
12
|
+
::Aws.config = ReqresRspec.configuration.amazon_s3[:credentials]
|
13
|
+
@s3 = ::Aws::S3::Client.new
|
14
|
+
end
|
15
|
+
attr_reader :logger, :path
|
16
|
+
|
17
|
+
def self.upload
|
18
|
+
uploader = self.new
|
19
|
+
uploader.process if uploader.enabled?
|
20
|
+
end
|
21
|
+
|
22
|
+
def enabled?
|
23
|
+
!!@enabled
|
24
|
+
end
|
25
|
+
|
26
|
+
def process
|
27
|
+
prepare_bucket
|
28
|
+
|
29
|
+
for file in Dir["#{path}/**/*"]
|
30
|
+
next if File.directory?(file)
|
31
|
+
local_path = file.gsub("#{@path}/", '')
|
32
|
+
|
33
|
+
start = Time.now
|
34
|
+
@s3.put_object bucket: @bucket, key: local_path, body: File.open(file, 'rb'), acl: "public-read"
|
35
|
+
done = Time.now
|
36
|
+
|
37
|
+
puts "[#{local_path}] Uploaded in #{done.to_i - start.to_i}s"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def prepare_bucket
|
43
|
+
@s3.create_bucket(
|
44
|
+
acl: "public-read",
|
45
|
+
bucket: @bucket
|
46
|
+
)
|
47
|
+
|
48
|
+
@s3.put_bucket_website(
|
49
|
+
bucket: @bucket,
|
50
|
+
website_configuration: {
|
51
|
+
index_document: { suffix: 'index.html' }
|
52
|
+
}
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ReqresRspec
|
2
|
+
module Uploaders
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def upload
|
6
|
+
if defined?(WebMock)
|
7
|
+
WebMock.allow_net_connect!
|
8
|
+
end
|
9
|
+
|
10
|
+
if defined?(VCR)
|
11
|
+
VCR.configure do |c|
|
12
|
+
c.ignore_request do |request|
|
13
|
+
URI(request.uri).host == 's3.amazonaws.com'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
self.constants.each do |name|
|
19
|
+
klass = Object.const_get("ReqresRspec::Uploaders::#{name}")
|
20
|
+
if klass.public_instance_methods.include?(:upload)
|
21
|
+
klass.upload
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
unless String.respond_to?(:underscore)
|
2
|
+
class String
|
3
|
+
def underscore
|
4
|
+
self.gsub(/::/, '/').
|
5
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
6
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
7
|
+
tr("-", "_").
|
8
|
+
downcase
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
unless Hash.respond_to?(:deep_merge)
|
14
|
+
class ::Hash
|
15
|
+
def deep_merge(second)
|
16
|
+
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
|
17
|
+
self.merge(second, &merger)
|
18
|
+
end
|
19
|
+
|
20
|
+
def deep_merge!(second)
|
21
|
+
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
|
22
|
+
self.merge!(second, &merger)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/reqres_rspec/version.rb
CHANGED
data/lib/reqres_rspec.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
require 'reqres_rspec/version'
|
2
|
+
require 'reqres_rspec/utils'
|
3
|
+
require 'reqres_rspec/configuration'
|
2
4
|
require 'reqres_rspec/collector'
|
3
|
-
require 'reqres_rspec/
|
4
|
-
require 'reqres_rspec/
|
5
|
-
require 'reqres_rspec/
|
5
|
+
require 'reqres_rspec/formatters'
|
6
|
+
require 'reqres_rspec/formatters/base'
|
7
|
+
require 'reqres_rspec/formatters/html'
|
8
|
+
require 'reqres_rspec/formatters/json'
|
9
|
+
require 'reqres_rspec/formatters/pdf'
|
10
|
+
require 'reqres_rspec/uploaders'
|
11
|
+
require 'reqres_rspec/uploaders/amazon_s3'
|
6
12
|
|
7
13
|
if defined?(RSpec) && ENV['REQRES_RSPEC'] == '1'
|
8
14
|
collector = ReqresRspec::Collector.new
|
9
15
|
|
10
16
|
RSpec.configure do |config|
|
11
17
|
config.after(:each) do
|
12
|
-
# TODO: remove boilerplate code
|
13
|
-
# TODO: better options
|
14
|
-
|
15
18
|
if defined?(Rails)
|
16
|
-
ENV['REQRES_RSPEC_ROOT'] = Rails.root.to_s
|
17
|
-
ENV['REQRES_RSPEC_APP'] = Rails.application.class.to_s.sub('::Application', '')
|
18
|
-
|
19
19
|
meta_data = self.class.example.metadata
|
20
20
|
if meta_data[:type] == :request && !meta_data[:skip_reqres] == true
|
21
21
|
begin
|
@@ -25,9 +25,6 @@ if defined?(RSpec) && ENV['REQRES_RSPEC'] == '1'
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
elsif defined?(Sinatra)
|
28
|
-
raise 'REQRES_RSPEC_ROOT is not defined' if ENV['REQRES_RSPEC_ROOT'].blank?
|
29
|
-
raise 'REQRES_RSPEC_APP is not defined' if ENV['REQRES_RSPEC_APP'].blank?
|
30
|
-
|
31
28
|
begin
|
32
29
|
collector.collect(self, self.last_request, self.last_response)
|
33
30
|
rescue Rack::Test::Error
|
@@ -41,25 +38,8 @@ if defined?(RSpec) && ENV['REQRES_RSPEC'] == '1'
|
|
41
38
|
config.after(:suite) do
|
42
39
|
if collector.records.size > 0
|
43
40
|
collector.sort
|
44
|
-
|
45
|
-
|
46
|
-
requested_formats = (ENV['REQRES_RSPEC_FORMATTERS'] || 'html').split(',')
|
47
|
-
requested_formats.sort_by!{|fmt| [formatters.index(fmt), fmt]}
|
48
|
-
requested_formats.each do |fmt|
|
49
|
-
case fmt
|
50
|
-
when 'html'
|
51
|
-
ReqresRspec::Writers::Html.new(collector.records).write
|
52
|
-
when 'pdf'
|
53
|
-
ReqresRspec::Writers::Html.new(collector.records).write unless requested_formats.include?('html')
|
54
|
-
ReqresRspec::Generators::Pdf.new.generate
|
55
|
-
when 'json'
|
56
|
-
ReqresRspec::Writers::JSONFormatter.new(collector.records).write
|
57
|
-
else
|
58
|
-
puts "No formatters defined, define one of #{formatters} in REQRES_RSPEC_FORMATTERS"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
#
|
41
|
+
ReqresRspec::Formatters.process(collector.records)
|
42
|
+
ReqresRspec::Uploaders.upload if ENV['REQRES_UPLOAD'] == '1'
|
63
43
|
end
|
64
44
|
end
|
65
45
|
end
|
data/reqres_rspec.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reqres_rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rilian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coderay
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: aws-sdk-core
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -69,14 +83,20 @@ files:
|
|
69
83
|
- Rakefile
|
70
84
|
- lib/reqres_rspec.rb
|
71
85
|
- lib/reqres_rspec/collector.rb
|
72
|
-
- lib/reqres_rspec/
|
86
|
+
- lib/reqres_rspec/configuration.rb
|
87
|
+
- lib/reqres_rspec/formatters.rb
|
88
|
+
- lib/reqres_rspec/formatters/base.rb
|
89
|
+
- lib/reqres_rspec/formatters/html.rb
|
90
|
+
- lib/reqres_rspec/formatters/json.rb
|
91
|
+
- lib/reqres_rspec/formatters/pdf.rb
|
92
|
+
- lib/reqres_rspec/templates/header.erb
|
93
|
+
- lib/reqres_rspec/templates/index.erb
|
94
|
+
- lib/reqres_rspec/templates/panel.erb
|
95
|
+
- lib/reqres_rspec/templates/spec.erb
|
96
|
+
- lib/reqres_rspec/uploaders.rb
|
97
|
+
- lib/reqres_rspec/uploaders/amazon_s3.rb
|
98
|
+
- lib/reqres_rspec/utils.rb
|
73
99
|
- lib/reqres_rspec/version.rb
|
74
|
-
- lib/reqres_rspec/writers/html.rb
|
75
|
-
- lib/reqres_rspec/writers/json_formatter.rb
|
76
|
-
- lib/reqres_rspec/writers/templates/header.erb
|
77
|
-
- lib/reqres_rspec/writers/templates/index.erb
|
78
|
-
- lib/reqres_rspec/writers/templates/panel.erb
|
79
|
-
- lib/reqres_rspec/writers/templates/spec.erb
|
80
100
|
- reqres_rspec.gemspec
|
81
101
|
homepage: https://github.com/reqres-api/reqres_rspec
|
82
102
|
licenses:
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module ReqresRspec
|
2
|
-
module Generators
|
3
|
-
class Pdf
|
4
|
-
# generates PDF file from existing HTML docs
|
5
|
-
# TODO: more info
|
6
|
-
def generate
|
7
|
-
# http://www.princexml.com/download/
|
8
|
-
pdf_tool_path = 'prince'
|
9
|
-
html_docs_root = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc')
|
10
|
-
pdf_doc_path = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc', "rspec_doc_#{Time.now.strftime("%d-%h-%Y_%H-%M")}.pdf")
|
11
|
-
|
12
|
-
if `which #{pdf_tool_path}`.size > 0
|
13
|
-
files = Dir["#{html_docs_root}/rspec_doc_*.html"]
|
14
|
-
if files.size > 0
|
15
|
-
files_arg = files.map { |f| f if f =~ /\/rspec_doc_\d+\.html/ }.compact.sort.join('" "')
|
16
|
-
|
17
|
-
`#{pdf_tool_path} "#{files_arg}" -o "#{pdf_doc_path}"`
|
18
|
-
|
19
|
-
puts "ReqresRspec::Generators::Pdf saved doc to #{pdf_doc_path}" if File.exists? pdf_doc_path
|
20
|
-
else
|
21
|
-
puts 'No HTML files found'
|
22
|
-
end
|
23
|
-
else
|
24
|
-
puts "ERROR: #{pdf_tool_path} is not installed! Check README.md for more info"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'coderay'
|
2
|
-
|
3
|
-
module ReqresRspec
|
4
|
-
module Writers
|
5
|
-
class Html
|
6
|
-
def initialize(records)
|
7
|
-
@records = records
|
8
|
-
end
|
9
|
-
|
10
|
-
def write
|
11
|
-
recreate_doc_dir
|
12
|
-
cleanup
|
13
|
-
generate_header
|
14
|
-
generate_specs
|
15
|
-
|
16
|
-
append_index
|
17
|
-
append_panel
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
# recreates /doc dir if it does not exist
|
23
|
-
def recreate_doc_dir
|
24
|
-
doc_dir = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc')
|
25
|
-
unless Dir.exist?(doc_dir)
|
26
|
-
Dir.mkdir(doc_dir)
|
27
|
-
puts "#{doc_dir} was recreated"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# deletes previous version of HTML docs
|
32
|
-
# TODO: more info
|
33
|
-
def cleanup
|
34
|
-
FileUtils.rm_rf(Dir.glob("#{ENV['REQRES_RSPEC_ROOT']}/doc/rspec_doc_*.html"), secure: true)
|
35
|
-
FileUtils.rm_rf(Dir.glob("#{ENV['REQRES_RSPEC_ROOT']}/doc/index.html"), secure: true)
|
36
|
-
FileUtils.rm_rf(Dir.glob("#{ENV['REQRES_RSPEC_ROOT']}/doc/panel.html"), secure: true)
|
37
|
-
end
|
38
|
-
|
39
|
-
# generates contents of HTML docs
|
40
|
-
# TODO: more info
|
41
|
-
def generate_header
|
42
|
-
tpl_path = File.join(File.dirname(__FILE__), 'templates', 'header.erb')
|
43
|
-
rendered_doc = ERB.new(File.open(tpl_path).read).result(binding)
|
44
|
-
|
45
|
-
path = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc', 'rspec_doc_table_of_content.html')
|
46
|
-
file = File.open(path, 'w')
|
47
|
-
file.write(rendered_doc)
|
48
|
-
file.close
|
49
|
-
puts "Reqres::Writers::Html saved doc header to #{path}"
|
50
|
-
end
|
51
|
-
|
52
|
-
# generates each separate spec example doc
|
53
|
-
# TODO: more info
|
54
|
-
def generate_specs
|
55
|
-
tpl_path = File.join(File.dirname(__FILE__), 'templates', 'spec.erb')
|
56
|
-
|
57
|
-
@records.each do |record|
|
58
|
-
@record = record
|
59
|
-
rendered_doc = ERB.new(File.open(tpl_path).read).result(binding)
|
60
|
-
|
61
|
-
path = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc', "rspec_doc_#{record[:filename]}.html")
|
62
|
-
file = File.open(path, 'w')
|
63
|
-
file.write(rendered_doc)
|
64
|
-
file.close
|
65
|
-
puts "Reqres::Writers::Html saved doc spec to #{path}"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# creates an index file with iframes if does not exists
|
70
|
-
def append_index
|
71
|
-
index_file = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc', 'index.html')
|
72
|
-
unless File.exists?(index_file)
|
73
|
-
tpl_path = File.join(File.dirname(__FILE__), 'templates', 'index.erb')
|
74
|
-
rendered_doc = ERB.new(File.open(tpl_path).read).result(binding)
|
75
|
-
File.write index_file, rendered_doc
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def append_panel
|
80
|
-
index_file = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc', 'panel.html')
|
81
|
-
unless File.exists?(index_file)
|
82
|
-
tpl_path = File.join(File.dirname(__FILE__), 'templates', 'panel.erb')
|
83
|
-
rendered_doc = ERB.new(File.open(tpl_path).read).result(binding)
|
84
|
-
File.write index_file, rendered_doc
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'coderay'
|
2
|
-
|
3
|
-
module ReqresRspec
|
4
|
-
module Writers
|
5
|
-
class JSONFormatter
|
6
|
-
def initialize(records)
|
7
|
-
@records = records
|
8
|
-
end
|
9
|
-
|
10
|
-
def write
|
11
|
-
recreate_doc_dir
|
12
|
-
cleanup
|
13
|
-
|
14
|
-
path = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc', 'reqres_rspec.json')
|
15
|
-
File.write(path, JSON.pretty_generate(@records))
|
16
|
-
puts "Reqres::Writers::JSONFormatter saved doc spec to #{path}"
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
# recreates /doc dir if it does not exist
|
22
|
-
def recreate_doc_dir
|
23
|
-
doc_dir = File.join(ENV['REQRES_RSPEC_ROOT'], 'doc')
|
24
|
-
unless Dir.exist?(doc_dir)
|
25
|
-
Dir.mkdir(doc_dir)
|
26
|
-
puts "#{doc_dir} was recreated"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# deletes previous version of HTML docs
|
31
|
-
# TODO: more info
|
32
|
-
def cleanup
|
33
|
-
FileUtils.rm_rf(Dir.glob("#{ENV['REQRES_RSPEC_ROOT']}/doc/reqres_rspec.json"), secure: true)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|