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
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NTMzMWY2MTU3YjA3YzA3MjMwOGUxNjE2NWQzZDdlZDVmYzk5ODFhYQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d41e3b7113ec16d2179bd7a53a11df303a21abe0
|
4
|
+
data.tar.gz: cadc27ef5996be8a1a349e5a2cefa0a0955d7126
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
N2IzNjY1Mjg0YTBiNTQ2NjIwMWViNTY0MmM2OGQyNDM4ZWRmNjk0NTZlYTE3
|
11
|
-
ZmMwODNjMjAwMmMxMTg2MmNkOTZlNmVkZWU1ZmZmMmJkMTNkYmU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YTU2MzM5M2NiZjhjODVmYzQ5MGZjNTc3YWZmMzQ0MmZjYjNmYjVkYjdhYTg4
|
14
|
-
NWZmMmQzYjg3MGNjZDI3M2Q4NjExNTZjYTI5ODFlYWE5MDY2NDliZjVlMzdi
|
15
|
-
MDRiY2Q1YWY1ZWE2NmI1ZmMzNjVlNjQ5YjM0ZDk3MGViOWYwZjA=
|
6
|
+
metadata.gz: 3a299f666560f1bcf1c6f966cec5d34188bd54e250252a5fe9ccc85f32dd48fba534b97d778adc8a5c56ee7ca12ea5aa32e62602a3e93d69c763b79e8478ca04
|
7
|
+
data.tar.gz: cf28d6e25966fd6a8fbea3b3c53b5561afeaba60e24ba9401a61e827bf7d93aad5a4c35b06a0b3e42ff3e59b68cc1e87cd31de8f50314c25ee8750554229b716
|
@@ -0,0 +1 @@
|
|
1
|
+
app = angular.module 'avocado', ['angular.filter']
|
@@ -1,22 +1,5 @@
|
|
1
|
-
# This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
-
# listed below.
|
3
|
-
#
|
4
|
-
# Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
-
# or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
-
#
|
7
|
-
# It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
-
# compiled file.
|
9
|
-
#
|
10
|
-
# Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
-
# about supported directives.
|
12
|
-
#
|
13
1
|
#= require jquery
|
14
2
|
#= require jquery_ujs
|
15
|
-
#= require avocado/angular.min
|
16
|
-
#= require avocado/angular-route.min
|
17
|
-
#= require avocado/ui-utils.min
|
18
|
-
#= require avocado/app
|
19
|
-
#= require avocado/md5
|
20
3
|
#= require_tree .
|
21
4
|
|
22
5
|
$ ->
|
@@ -27,4 +10,4 @@ $ ->
|
|
27
10
|
$('.left-side, .right-side').mouseup (e) ->
|
28
11
|
container = $('.filters')
|
29
12
|
if !(container.is(e.target)) && (container.has(e.target).length is 0)
|
30
|
-
container.hide()
|
13
|
+
container.hide()
|
@@ -0,0 +1,50 @@
|
|
1
|
+
angular.module('avocado')
|
2
|
+
|
3
|
+
.controller 'AvocadoCtrl', ['$scope', '$location', 'Spec', 'ResponseStatusFilter', 'RequestMethodFilter', ($scope, $location, Spec, ResponseStatusFilter, RequestMethodFilter) ->
|
4
|
+
new class AvocadoCtrl
|
5
|
+
constructor: ->
|
6
|
+
@allSpecs = Spec.all()
|
7
|
+
@specs = Spec.all()
|
8
|
+
@query = undefined
|
9
|
+
@activeSpec = @_findActiveSpec() if @_specUUIDGiven()
|
10
|
+
@activeResource = 'All'
|
11
|
+
|
12
|
+
@filters = [
|
13
|
+
new ResponseStatusFilter(200, 299, true)
|
14
|
+
new RequestMethodFilter('GET')
|
15
|
+
new RequestMethodFilter('POST')
|
16
|
+
new RequestMethodFilter('PATCH', 'PUT')
|
17
|
+
new RequestMethodFilter('DELETE')
|
18
|
+
]
|
19
|
+
|
20
|
+
chooseSpec: (spec) ->
|
21
|
+
@activeSpec = spec
|
22
|
+
$location.path spec.uuid
|
23
|
+
|
24
|
+
chooseResource: ->
|
25
|
+
resourceName = @activeResource.replace /\s+/g, ''
|
26
|
+
@specs = if resourceName is 'All' then @allSpecs else Spec.forResource(resourceName)
|
27
|
+
|
28
|
+
getFilteredSpecs: ->
|
29
|
+
specs = @specs
|
30
|
+
activeFilters = @filters.filter (f) -> f.active
|
31
|
+
strictFilters = activeFilters.filter (f) -> f.strict
|
32
|
+
relaxedFilters = activeFilters.filter (f) -> !f.strict
|
33
|
+
|
34
|
+
specs.filter (spec) ->
|
35
|
+
result = strictFilters.every((f) -> f.apply(spec))
|
36
|
+
result &&= relaxedFilters.some((f) -> f.apply(spec)) if relaxedFilters.length > 0
|
37
|
+
result
|
38
|
+
|
39
|
+
search: (spec) =>
|
40
|
+
return true if !@query
|
41
|
+
[spec.request.path, spec.description].some (term) =>
|
42
|
+
term.toLowerCase().indexOf(@query.toLowerCase()) != -1
|
43
|
+
|
44
|
+
_findActiveSpec: ->
|
45
|
+
specUUID = $location.path().substr 1
|
46
|
+
@activeSpec = @allSpecs.find (spec) -> spec.uuid == specUUID
|
47
|
+
|
48
|
+
_specUUIDGiven: ->
|
49
|
+
$location.path().length > 0
|
50
|
+
]
|
@@ -1,12 +1,14 @@
|
|
1
|
-
angular.module('avocado
|
1
|
+
angular.module('avocado')
|
2
2
|
|
3
|
+
.factory 'Request', ->
|
3
4
|
class Request
|
4
5
|
constructor: (json) ->
|
5
6
|
@method = json.method
|
6
7
|
@path = json.path
|
7
8
|
@params = JSON.stringify(json.params, undefined, 2)
|
9
|
+
@headers = ''
|
8
10
|
|
9
|
-
|
10
|
-
for name,value of json.headers
|
11
|
+
for name, value of json.headers
|
11
12
|
@headers = "#{@headers}\n#{name}: #{value}"
|
13
|
+
|
12
14
|
@headers = @headers.trim()
|
@@ -0,0 +1,27 @@
|
|
1
|
+
angular.module('avocado')
|
2
|
+
|
3
|
+
.factory 'Spec', ['Request', 'Response', 'Resource', (Request, Response, Resource) ->
|
4
|
+
|
5
|
+
class Spec
|
6
|
+
constructor: (json) ->
|
7
|
+
@description = json.description
|
8
|
+
@request = new Request json.request
|
9
|
+
@response = new Response json.response
|
10
|
+
@resource = new Resource json.resource
|
11
|
+
@uuid = @generateMD5Hash @request, @response
|
12
|
+
|
13
|
+
@all: ->
|
14
|
+
specs = []
|
15
|
+
window.data.forEach (data) ->
|
16
|
+
angular.fromJson(data).forEach (data) ->
|
17
|
+
specs.push new Spec(data)
|
18
|
+
specs
|
19
|
+
|
20
|
+
@forResource: (resourceName) ->
|
21
|
+
@all().filter (spec) ->
|
22
|
+
spec.resource.name.replace(/\s+/g, '') == resourceName
|
23
|
+
|
24
|
+
generateMD5Hash: (request, response) ->
|
25
|
+
hashTarget = @description + request.method + request.path + request.params + request.headers
|
26
|
+
md5(hashTarget).toString().substr 0, 7
|
27
|
+
]
|
@@ -0,0 +1,15 @@
|
|
1
|
+
angular.module('avocado')
|
2
|
+
|
3
|
+
.factory 'RequestMethodFilter', ->
|
4
|
+
class RequestMethodFilter
|
5
|
+
constructor: (methods...) ->
|
6
|
+
@methods = methods
|
7
|
+
@active = false
|
8
|
+
@strict = false
|
9
|
+
|
10
|
+
getName: ->
|
11
|
+
@methods[0]
|
12
|
+
|
13
|
+
apply: (item) ->
|
14
|
+
@methods.some (method) ->
|
15
|
+
item.request.method == method
|
@@ -0,0 +1,15 @@
|
|
1
|
+
angular.module('avocado')
|
2
|
+
|
3
|
+
.factory 'ResponseStatusFilter', ->
|
4
|
+
class ResponseStatusFilter
|
5
|
+
constructor: (minCode, maxCode, active = false) ->
|
6
|
+
@minCode = minCode
|
7
|
+
@maxCode = maxCode
|
8
|
+
@active = active
|
9
|
+
@strict = true
|
10
|
+
|
11
|
+
getName: ->
|
12
|
+
@minCode
|
13
|
+
|
14
|
+
apply: (item) ->
|
15
|
+
@minCode <= item.response.statusCode <= @maxCode
|
@@ -1,4 +1,34 @@
|
|
1
1
|
module Avocado
|
2
|
-
class SpecsController <
|
2
|
+
class SpecsController < ::ActionController::Base
|
3
|
+
layout 'avocado'
|
4
|
+
|
5
|
+
def index
|
6
|
+
@data = json_files.map { |filename| File.read filename }
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
File.open(new_json_filename, 'w+') { |f| f.write params[:file].read }
|
11
|
+
File.delete(*json_files_from_past_uploads)
|
12
|
+
head :ok
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def upload_id
|
17
|
+
params[:upload_id]
|
18
|
+
end
|
19
|
+
|
20
|
+
def new_json_filename
|
21
|
+
Avocado.json_path.join "avocado-#{Time.current.to_s(:nsec)}-#{Avocado.upload_id.call}.json"
|
22
|
+
end
|
23
|
+
|
24
|
+
def json_files
|
25
|
+
Dir.glob Avocado.json_path.join('avocado*.json')
|
26
|
+
end
|
27
|
+
|
28
|
+
def json_files_from_past_uploads
|
29
|
+
json_files.reject do |spec|
|
30
|
+
spec.end_with? "-#{upload_id}.json"
|
31
|
+
end
|
32
|
+
end
|
3
33
|
end
|
4
|
-
end
|
34
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<div class="top-bar">
|
2
|
+
<a href="#" id="toggle-filter"><%= image_tag 'avocado/filter-icon.png'%></a>
|
3
|
+
|
4
|
+
<select ng-model="ctrl.activeResource" ng-change="ctrl.chooseResource()">
|
5
|
+
<option ng-selected="true">All</option>
|
6
|
+
<option ng-repeat="spec in ctrl.allSpecs | unique: 'resource.name' | orderBy: 'resource.name'"/>
|
7
|
+
{{ spec.resource.name }}
|
8
|
+
</option>
|
9
|
+
</select>
|
10
|
+
|
11
|
+
<input type="text" ng-model="ctrl.query" placeholder="Search..." />
|
12
|
+
|
13
|
+
<div class="filters">
|
14
|
+
<label ng-repeat="filter in ctrl.filters">
|
15
|
+
<input type="checkbox" ng-model="filter.active" value="{{ filter.getName() }}" />
|
16
|
+
{{ filter.getName() }}
|
17
|
+
</label>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="left-side">
|
22
|
+
<ul>
|
23
|
+
<li ng-repeat="spec in ctrl.getFilteredSpecs() | filter: ctrl.search" ng-click="ctrl.chooseSpec(spec)" ng-class="{ 'active': (spec == ctrl.activeSpec) }">
|
24
|
+
<span class="status-code">{{spec.response.statusCode}}</span>
|
25
|
+
<span class="url">{{spec.request.method}} {{spec.request.path}}</span>
|
26
|
+
<span class="description">{{spec.description}}</span>
|
27
|
+
</li>
|
28
|
+
</ul>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="right-side">
|
32
|
+
<div ng-if="ctrl.activeSpec">
|
33
|
+
<span class="url">{{ctrl.activeSpec.request.method}} {{ctrl.activeSpec.request.path}}</span>
|
34
|
+
<desc>Request Parameters</desc>
|
35
|
+
<code class="request-params">
|
36
|
+
{{ctrl.activeSpec.request.params}}
|
37
|
+
</code>
|
38
|
+
<desc>Headers</desc>
|
39
|
+
<code class="headers">
|
40
|
+
{{ctrl.activeSpec.request.headers}}
|
41
|
+
</code>
|
42
|
+
<desc>Response Status</desc>
|
43
|
+
<code class="response-status">
|
44
|
+
{{ctrl.activeSpec.response.statusCode}}
|
45
|
+
</code>
|
46
|
+
<desc>Response Body</desc>
|
47
|
+
<code class="response-body">
|
48
|
+
{{ctrl.activeSpec.response.body}}
|
49
|
+
</code>
|
50
|
+
</div>
|
51
|
+
</div>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>API Docs</title>
|
5
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
|
6
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.11/angular-filter.min.js"></script>
|
7
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.4.0/js/md5.min.js"></script>
|
8
|
+
|
9
|
+
<%= stylesheet_link_tag "avocado/application", media: "all" %>
|
10
|
+
<%= javascript_include_tag "avocado/application" %>
|
11
|
+
<%= csrf_meta_tags %>
|
12
|
+
|
13
|
+
<script type="text/javascript">
|
14
|
+
var data = <%= @data.to_json.html_safe %>;
|
15
|
+
</script>
|
16
|
+
</head>
|
17
|
+
<body ng-app="avocado" ng-controller="AvocadoCtrl as ctrl">
|
18
|
+
<%= yield %>
|
19
|
+
</body>
|
20
|
+
</html>
|
data/config/routes.rb
CHANGED
data/lib/avocado-docs.rb
CHANGED
@@ -1,21 +1,39 @@
|
|
1
1
|
require 'avocado/engine'
|
2
|
-
require 'avocado/
|
2
|
+
require 'avocado/controller_patch'
|
3
|
+
require 'avocado/controller_response'
|
4
|
+
require 'avocado/logger'
|
5
|
+
require 'avocado/storage'
|
3
6
|
require 'avocado/uploader'
|
4
|
-
require 'avocado/
|
5
|
-
require 'avocado/
|
6
|
-
require 'avocado/
|
7
|
-
require 'avocado/
|
8
|
-
require 'avocado/
|
9
|
-
require 'avocado/
|
10
|
-
require 'avocado/
|
11
|
-
|
12
|
-
require 'yaml'
|
13
|
-
require 'net/http/post/multipart'
|
7
|
+
require 'avocado/adapters/base_adapter'
|
8
|
+
require 'avocado/adapters/minitest_adapter'
|
9
|
+
require 'avocado/adapters/rspec_adapter'
|
10
|
+
require 'avocado/adapters/cucumber_adapter'
|
11
|
+
require 'avocado/serializers/request_serializer'
|
12
|
+
require 'avocado/serializers/resource_serializer'
|
13
|
+
require 'avocado/serializers/response_serializer'
|
14
14
|
|
15
15
|
module Avocado
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
class << self
|
17
|
+
attr_accessor :url, :headers, :json_path, :upload_id, :document_if, :ignored_params, :storage, :uploader
|
18
|
+
|
19
|
+
def configure
|
20
|
+
yield self
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset!
|
24
|
+
self.url = nil
|
25
|
+
self.headers = []
|
26
|
+
self.json_path = ::Rails.root
|
27
|
+
self.upload_id = proc { SecureRandom.uuid }
|
28
|
+
self.document_if = proc { true }
|
29
|
+
self.ignored_params = %w(controller action format)
|
30
|
+
self.storage = Avocado::Storage.instance
|
31
|
+
self.uploader = Avocado::Uploader.instance
|
32
|
+
|
33
|
+
storage.clear
|
34
|
+
uploader.reset
|
35
|
+
end
|
20
36
|
end
|
21
37
|
end
|
38
|
+
|
39
|
+
Avocado.reset!
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Avocado
|
2
|
+
module Adapters
|
3
|
+
class BaseAdapter
|
4
|
+
attr_accessor :spec, :request, :response
|
5
|
+
|
6
|
+
def initialize(spec, request, response)
|
7
|
+
@spec = spec
|
8
|
+
@request = request
|
9
|
+
@response = response
|
10
|
+
end
|
11
|
+
|
12
|
+
def upload?(&block)
|
13
|
+
block ||= proc { true }
|
14
|
+
request && response && !ajax? && document_if? && block.call
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_h
|
18
|
+
{
|
19
|
+
description: spec.description,
|
20
|
+
resource: Avocado::Serializers::ResourceSerializer.new(request).to_h,
|
21
|
+
request: Avocado::Serializers::RequestSerializer.new(request).to_h,
|
22
|
+
response: Avocado::Serializers::ResponseSerializer.new(response).to_h
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def ajax?
|
28
|
+
request.xhr?
|
29
|
+
end
|
30
|
+
|
31
|
+
def document_if?
|
32
|
+
Avocado.document_if.call request, response
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|