avocado-docs 3.0.10 → 3.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 +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
|