avocado-docs 3.0.10 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/app/assets/javascripts/avocado/app.coffee +1 -0
- data/app/assets/javascripts/avocado/application.js.coffee +1 -18
- data/app/assets/javascripts/avocado/avocado-ctrl.coffee +50 -0
- data/app/assets/javascripts/avocado/{services/request.js.coffee → factories/request.coffee} +5 -3
- data/app/assets/javascripts/avocado/factories/resource.coffee +6 -0
- data/app/assets/javascripts/avocado/factories/response.coffee +11 -0
- data/app/assets/javascripts/avocado/factories/spec.coffee +27 -0
- data/app/assets/javascripts/avocado/filters/request-method-filter.coffee +15 -0
- data/app/assets/javascripts/avocado/filters/response-status-filter.coffee +15 -0
- data/app/controllers/avocado/specs_controller.rb +32 -2
- data/app/views/avocado/specs/index.html.erb +51 -0
- data/app/views/layouts/avocado.html.erb +20 -0
- data/config/routes.rb +1 -1
- data/lib/avocado-docs.rb +33 -15
- data/lib/avocado/adapters/base_adapter.rb +36 -0
- data/lib/avocado/adapters/cucumber_adapter.rb +15 -0
- data/lib/avocado/adapters/minitest_adapter.rb +10 -0
- data/lib/avocado/adapters/rspec_adapter.rb +13 -0
- data/lib/avocado/controller_patch.rb +24 -0
- data/lib/avocado/controller_response.rb +22 -0
- data/lib/avocado/cucumber.rb +14 -0
- data/lib/avocado/logger.rb +13 -0
- data/lib/avocado/minitest.rb +10 -23
- data/lib/avocado/rspec.rb +9 -18
- data/lib/avocado/serializers/request_serializer.rb +43 -0
- data/lib/avocado/serializers/resource_serializer.rb +20 -0
- data/lib/avocado/serializers/response_serializer.rb +16 -0
- data/lib/avocado/{request_store.rb → storage.rb} +6 -9
- data/lib/avocado/uploader.rb +41 -31
- data/lib/avocado/version.rb +1 -1
- metadata +59 -55
- data/app/assets/javascripts/avocado/angular-route.min.js +0 -14
- data/app/assets/javascripts/avocado/angular.min.js +0 -235
- data/app/assets/javascripts/avocado/app.js.coffee +0 -4
- data/app/assets/javascripts/avocado/controllers/avocado_ctrl.js.coffee +0 -93
- data/app/assets/javascripts/avocado/md5.js +0 -19
- data/app/assets/javascripts/avocado/services/endpoint.js.coffee +0 -23
- data/app/assets/javascripts/avocado/services/resource.js.coffee +0 -5
- data/app/assets/javascripts/avocado/services/response.js.coffee +0 -9
- data/app/assets/javascripts/avocado/ui-utils.min.js +0 -7
- data/app/controllers/avocado/avocado_controller.rb +0 -20
- data/app/models/avocado/endpoint.rb +0 -13
- data/app/models/avocado/parser.rb +0 -56
- data/app/models/avocado/request.rb +0 -37
- data/app/models/avocado/resource.rb +0 -17
- data/app/views/layouts/avocado/avocado.html.erb +0 -15
- data/app/views/template.html.erb +0 -46
- data/lib/avocado/config.rb +0 -36
- data/lib/avocado/controller.rb +0 -26
- data/lib/avocado/middleware.rb +0 -37
- data/lib/avocado/middleware/defaults.rb +0 -17
- data/lib/avocado/middleware/document_if_configuration.rb +0 -12
- data/lib/avocado/middleware/document_metadata.rb +0 -14
- data/lib/avocado/middleware/example_serialization.rb +0 -10
- data/lib/avocado/middleware/ignore_xhr_requests.rb +0 -10
- data/lib/avocado/middleware/request_serialization.rb +0 -48
- data/lib/avocado/middleware/resource_serialization.rb +0 -20
- data/lib/avocado/middleware/response_serialization.rb +0 -20
- data/lib/avocado/packages/minitest_package.rb +0 -15
- data/lib/avocado/packages/package.rb +0 -23
- data/lib/avocado/packages/rspec_package.rb +0 -15
@@ -1,56 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Parser
|
3
|
-
|
4
|
-
attr_reader :resources, :endpoints, :requests
|
5
|
-
|
6
|
-
def initialize(json)
|
7
|
-
@resources = SortedSet.new
|
8
|
-
@endpoints = Set.new
|
9
|
-
@requests = Set.new
|
10
|
-
parse(json)
|
11
|
-
end
|
12
|
-
|
13
|
-
def resource(name)
|
14
|
-
@resources.find { |r| r.name == name }
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def parse(json)
|
20
|
-
json.each do |req|
|
21
|
-
resource = find_or_create_resource_by_name req[:resource][:name]
|
22
|
-
endpoint = find_or_create_endpoint_by_signature resource, req[:request]
|
23
|
-
request = instantiate_request_object_from(req)
|
24
|
-
request.endpoint = endpoint
|
25
|
-
|
26
|
-
if request.unique?(@requests)
|
27
|
-
endpoint.requests << request
|
28
|
-
resource.endpoints << endpoint
|
29
|
-
@resources << resource
|
30
|
-
@endpoints << endpoint
|
31
|
-
@requests << request
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def instantiate_request_object_from(params)
|
37
|
-
Avocado::Request.new \
|
38
|
-
path: params[:request][:path],
|
39
|
-
params: params[:request][:params],
|
40
|
-
headers: params[:request][:headers],
|
41
|
-
status: params[:response][:status],
|
42
|
-
body: params[:response][:body],
|
43
|
-
description: params[:description]
|
44
|
-
end
|
45
|
-
|
46
|
-
def find_or_create_resource_by_name(name)
|
47
|
-
resource(name) || Avocado::Resource.new(name: name)
|
48
|
-
end
|
49
|
-
|
50
|
-
def find_or_create_endpoint_by_signature(resource, request)
|
51
|
-
signature = "#{request[:method]} #{request[:path]}"
|
52
|
-
resource.endpoints.find { |e| e.signature == signature } || Avocado::Endpoint.new(signature: signature)
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Request
|
3
|
-
include ActiveModel::Model
|
4
|
-
|
5
|
-
attr_accessor :uid, :url, :path, :params, :status, :body, :headers
|
6
|
-
attr_accessor :endpoint, :description
|
7
|
-
|
8
|
-
def initialize(*)
|
9
|
-
super
|
10
|
-
self.uid = SecureRandom.hex
|
11
|
-
end
|
12
|
-
|
13
|
-
def ==(other)
|
14
|
-
other.path == path &&
|
15
|
-
other.params == params &&
|
16
|
-
other.status == status &&
|
17
|
-
other.body == body
|
18
|
-
end
|
19
|
-
|
20
|
-
def <=>(other)
|
21
|
-
status <=> other.status
|
22
|
-
end
|
23
|
-
|
24
|
-
def unique?(requests)
|
25
|
-
requests.none? { |req| self == req }
|
26
|
-
end
|
27
|
-
|
28
|
-
def params
|
29
|
-
@params || {}
|
30
|
-
end
|
31
|
-
|
32
|
-
def body
|
33
|
-
@body || {}
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>API Docs</title>
|
5
|
-
<%= stylesheet_link_tag "avocado/application", media: "all" %>
|
6
|
-
<%= javascript_include_tag "avocado/application" %>
|
7
|
-
<%= csrf_meta_tags %>
|
8
|
-
<script type="text/javascript">
|
9
|
-
var data = <%= @data.html_safe %>;
|
10
|
-
</script>
|
11
|
-
</head>
|
12
|
-
<body ng-app="avocado" ng-controller="AvocadoCtrl">
|
13
|
-
<%= yield %>
|
14
|
-
</body>
|
15
|
-
</html>
|
data/app/views/template.html.erb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
<div class="top-bar">
|
2
|
-
<a href="#" id="toggle-filter"><%= image_tag 'avocado/filter-icon.png'%></a>
|
3
|
-
<select ng-model="selectedResource" ng-change="switchResource()">
|
4
|
-
<option ng-selected="true">All</option>
|
5
|
-
<option ng-repeat="endpoint in allEndpoints | unique: 'resource.name' | orderBy: 'resource.name'"/>
|
6
|
-
{{endpoint.resource.name}}
|
7
|
-
</option>
|
8
|
-
</select>
|
9
|
-
<input type="text" ng-model="query" placeholder="Search..." />
|
10
|
-
<div class="filters">
|
11
|
-
<label ng-repeat="filter in filters">
|
12
|
-
<input type="checkbox" ng-model="filter.selected" value="{{filter.name}}" />
|
13
|
-
{{filter.name}}
|
14
|
-
</label>
|
15
|
-
</div>
|
16
|
-
</div>
|
17
|
-
<div class="left-side">
|
18
|
-
<ul>
|
19
|
-
<li ng-repeat="endpoint in filteredEndpoints | filter: search" ng-click="chooseEndpoint(endpoint)" ng-class="{ 'active': (endpoint == currentEndpoint) }">
|
20
|
-
<span class="status-code">{{endpoint.response.statusCode}}</span>
|
21
|
-
<span class="url">{{endpoint.request.method}} {{endpoint.request.path}}</span>
|
22
|
-
<span class="description">{{endpoint.description}}</span>
|
23
|
-
</li>
|
24
|
-
</ul>
|
25
|
-
</div>
|
26
|
-
<div class="right-side">
|
27
|
-
<div ng-if="currentEndpoint">
|
28
|
-
<span class="url">{{currentEndpoint.request.method}} {{currentEndpoint.request.path}}</span>
|
29
|
-
<desc>Request Parameters</desc>
|
30
|
-
<code class="request-params">
|
31
|
-
{{currentEndpoint.request.params}}
|
32
|
-
</code>
|
33
|
-
<desc>Headers</desc>
|
34
|
-
<code class="headers">
|
35
|
-
{{currentEndpoint.request.headers}}
|
36
|
-
</code>
|
37
|
-
<desc>Response Status</desc>
|
38
|
-
<code class="response-status">
|
39
|
-
{{currentEndpoint.response.statusCode}}
|
40
|
-
</code>
|
41
|
-
<desc>Response Body</desc>
|
42
|
-
<code class="response-body">
|
43
|
-
{{currentEndpoint.response.body}}
|
44
|
-
</code>
|
45
|
-
</div>
|
46
|
-
</div>
|
data/lib/avocado/config.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Config
|
3
|
-
class << self
|
4
|
-
|
5
|
-
attr_accessor :url, :headers, :document_if, :json_path, :ignored_params
|
6
|
-
|
7
|
-
def configure(&block)
|
8
|
-
yield self
|
9
|
-
end
|
10
|
-
|
11
|
-
def headers
|
12
|
-
Array(@headers) || []
|
13
|
-
end
|
14
|
-
|
15
|
-
def document_if
|
16
|
-
@document_if || -> { true }
|
17
|
-
end
|
18
|
-
|
19
|
-
def json_path
|
20
|
-
@json_path || Rails.application.root
|
21
|
-
end
|
22
|
-
|
23
|
-
def ignored_params
|
24
|
-
@ignored_params ||= ['controller', 'action']
|
25
|
-
end
|
26
|
-
|
27
|
-
def reset!
|
28
|
-
@headers = nil
|
29
|
-
@document_if = nil
|
30
|
-
@json_path = nil
|
31
|
-
@ignored_params = nil
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/avocado/controller.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# This concern gets patched into ActionController::Base during testing
|
2
|
-
# The after_action will ensure every request gets documented regardless of the
|
3
|
-
# type of test (controller, integration, etc)
|
4
|
-
module Avocado
|
5
|
-
module Controller
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
prepend_around_action :store_request_and_response_in_avocado
|
10
|
-
end
|
11
|
-
|
12
|
-
def documentable?
|
13
|
-
(response.status == 204 && response.body.blank?) || !!JSON.parse(response.body)
|
14
|
-
rescue
|
15
|
-
false
|
16
|
-
end
|
17
|
-
|
18
|
-
def store_request_and_response_in_avocado
|
19
|
-
yield
|
20
|
-
ensure
|
21
|
-
Avocado::RequestStore.instance.reset!
|
22
|
-
Avocado::RequestStore.instance.store(request, response) if documentable?
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
data/lib/avocado/middleware.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Middleware
|
3
|
-
|
4
|
-
attr_accessor :entries
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@entries = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def <<(klass)
|
11
|
-
@entries << klass
|
12
|
-
end
|
13
|
-
|
14
|
-
def invoke(*args, &finally)
|
15
|
-
chain = entries.map(&:new).dup
|
16
|
-
traversal = -> (continue = true) do
|
17
|
-
return if !continue
|
18
|
-
if chain.empty?
|
19
|
-
finally.call
|
20
|
-
else
|
21
|
-
chain.shift.call(*args, &traversal)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
traversal.call
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.configure(&block)
|
28
|
-
@chain ||= new
|
29
|
-
yield @chain
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.invoke(*args, &block)
|
33
|
-
@chain.invoke(*args, &block)
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'avocado/middleware/document_metadata'
|
2
|
-
require 'avocado/middleware/document_if_configuration'
|
3
|
-
require 'avocado/middleware/request_serialization'
|
4
|
-
require 'avocado/middleware/response_serialization'
|
5
|
-
require 'avocado/middleware/resource_serialization'
|
6
|
-
require 'avocado/middleware/example_serialization'
|
7
|
-
require 'avocado/middleware/ignore_xhr_requests'
|
8
|
-
|
9
|
-
Avocado::Middleware.configure do |chain|
|
10
|
-
chain << Avocado::Middleware::DocumentMetadata
|
11
|
-
chain << Avocado::Middleware::DocumentIfConfiguration
|
12
|
-
chain << Avocado::Middleware::RequestSerialization
|
13
|
-
chain << Avocado::Middleware::ResponseSerialization
|
14
|
-
chain << Avocado::Middleware::ResourceSerialization
|
15
|
-
chain << Avocado::Middleware::ExampleSerialization
|
16
|
-
chain << Avocado::Middleware::IgnoreXhrRequests
|
17
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Middleware::DocumentIfConfiguration
|
3
|
-
|
4
|
-
# return false if document_if returns false, so it will
|
5
|
-
# stop the middleware chain and not upload anything
|
6
|
-
def call(*)
|
7
|
-
continue = Avocado::Config.document_if.call
|
8
|
-
yield continue
|
9
|
-
end
|
10
|
-
|
11
|
-
end
|
12
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Middleware::RequestSerialization
|
3
|
-
|
4
|
-
def call(package)
|
5
|
-
@request = package.request
|
6
|
-
Avocado::RequestStore.instance.json.merge! request: serialize(@request)
|
7
|
-
yield
|
8
|
-
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def serialize(request)
|
13
|
-
{
|
14
|
-
method: request.method,
|
15
|
-
path: request.path,
|
16
|
-
params: sanitize_params(request.params).to_h,
|
17
|
-
headers: headers
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
def headers
|
22
|
-
hash = {}
|
23
|
-
Avocado::Config.headers.each do |name|
|
24
|
-
hash[name] = @request.headers.env["HTTP_#{name.tr('-', '_')}".upcase]
|
25
|
-
end
|
26
|
-
hash.select { |_, value| !value.nil? }
|
27
|
-
end
|
28
|
-
|
29
|
-
def sanitize_params(params)
|
30
|
-
params = params.except(*Avocado::Config.ignored_params.flatten)
|
31
|
-
deep_replace_file_uploads_with_text(params)
|
32
|
-
params
|
33
|
-
end
|
34
|
-
|
35
|
-
def deep_replace_file_uploads_with_text(hash)
|
36
|
-
hash.each do |k, v|
|
37
|
-
if v.is_a? Hash
|
38
|
-
deep_replace_file_uploads_with_text(v)
|
39
|
-
elsif v.is_a? Array
|
40
|
-
v.each { |element| deep_replace_file_uploads_with_text(_: element) }
|
41
|
-
elsif v.respond_to? :eof
|
42
|
-
hash[k] = '<Multipart File Upload>'
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Middleware::ResourceSerialization
|
3
|
-
|
4
|
-
def call(package)
|
5
|
-
request = package.request
|
6
|
-
name = infer_resource_name_from_request(request)
|
7
|
-
Avocado::RequestStore.instance.json.merge! resource: { name: name }
|
8
|
-
yield
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def infer_resource_name_from_request(request)
|
14
|
-
controller = request.params[:controller]
|
15
|
-
name = controller.partition('/').reject(&:blank?).last
|
16
|
-
name.titleize.split('/').last
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Avocado
|
2
|
-
class Middleware::ResponseSerialization
|
3
|
-
|
4
|
-
def call(package)
|
5
|
-
response = package.response
|
6
|
-
Avocado::RequestStore.instance.json.merge! response: serialize(response)
|
7
|
-
yield
|
8
|
-
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def serialize(response)
|
13
|
-
{
|
14
|
-
status: response.status,
|
15
|
-
body: response.body
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|