yard-api 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/config/yard_api.yml +1 -1
- data/lib/yard-api/code_objects/api_object.rb +19 -0
- data/lib/yard-api/options.rb +7 -2
- data/lib/yard-api/registry.rb +9 -0
- data/lib/yard-api/serializer.rb +61 -0
- data/lib/yard-api/templates/helpers/base_helper.rb +98 -94
- data/lib/yard-api/templates/helpers/html_helper.rb +23 -1
- data/lib/yard-api/verifier.rb +2 -0
- data/lib/yard-api/version.rb +1 -1
- data/lib/yard-api.rb +17 -0
- data/spec/fulldoc_spec.rb +67 -0
- data/spec/spec_helper.rb +13 -0
- data/templates/api/fulldoc/html/css/common.css +78 -29
- data/templates/api/fulldoc/html/js/app.js +36 -5
- data/templates/api/fulldoc/html/setup.rb +109 -9
- data/templates/api/layout/html/_dynamic_styles.erb +5 -4
- data/templates/api/layout/html/sidebar.erb +1 -1
- data/templates/api/method_details/html/method_signature.erb +4 -1
- data/templates/api/tags/html/argument/_list.erb +7 -3
- data/templates/api/tags/html/argument/_table.erb +3 -2
- data/templates/api/tags/html/returns.erb +1 -0
- data/templates/api/tags/setup.rb +8 -3
- data/templates/api/topic/html/setup.rb +18 -2
- data/templates/api/topic/html/topic_doc.erb +45 -10
- data/yard-api.gemspec +1 -0
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4174d158765fdfb8f72c2625f74d77e6bff1cf27
|
4
|
+
data.tar.gz: e50d4045d98142419848d2898b6a4fcf0989d9dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da95663074496a8b87e5ffaa29e922b95a6d2a75f04fd64165bd9f635ea79333777f196d8ecc8f0d6725b32603b27f0bf138a518e6bf6700afec4075e6fd99db
|
7
|
+
data.tar.gz: b6672a201e37c8f16829dd9f19a6836c956fb530799dbcab0cdd335a730008732a7f3d0bc8665c9bd2162f9ee991d8ee8c97946125dd977a962a1c8ddd8933c8
|
data/README.md
CHANGED
@@ -40,6 +40,10 @@ Read that file to view all the available options.
|
|
40
40
|
|
41
41
|
## Changelog
|
42
42
|
|
43
|
+
**29/7/2015 [0.3.0]**
|
44
|
+
|
45
|
+
- major rework of the linking logic, much improvements but some stuff is broken now
|
46
|
+
|
43
47
|
**28/7/2015 [0.2.3]**
|
44
48
|
|
45
49
|
- dropped the `@argument_scope` tag
|
data/config/yard_api.yml
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'yard/code_objects/class_object'
|
2
|
+
|
3
|
+
module YARD::CodeObjects
|
4
|
+
class APIObject < Base
|
5
|
+
def path
|
6
|
+
super().gsub(/\s/, '')
|
7
|
+
end
|
8
|
+
|
9
|
+
def title
|
10
|
+
[ object.title, name ].join('::')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class ClassObject < NamespaceObject
|
15
|
+
def title
|
16
|
+
self[:api_id] || super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/yard-api/options.rb
CHANGED
@@ -4,6 +4,8 @@ module YARD::APIPlugin
|
|
4
4
|
default_attr :format, 'html'
|
5
5
|
default_attr :no_save, false
|
6
6
|
|
7
|
+
default_attr :output, 'compiled/doc/api'
|
8
|
+
|
7
9
|
default_attr :title, 'Rails API Project'
|
8
10
|
default_attr :url_title, 'my_app'
|
9
11
|
default_attr :url_prefix, '/api'
|
@@ -20,8 +22,8 @@ module YARD::APIPlugin
|
|
20
22
|
|
21
23
|
default_attr :one_file, false
|
22
24
|
default_attr :strict, false
|
23
|
-
default_attr :verbose, false
|
24
|
-
default_attr :debug, false
|
25
|
+
default_attr :verbose, ENV['VERBOSE'] || false
|
26
|
+
default_attr :debug, ENV['DEBUG'] || false
|
25
27
|
default_attr :theme, 'default'
|
26
28
|
|
27
29
|
default_attr :tabular_arguments, false
|
@@ -39,6 +41,9 @@ module YARD::APIPlugin
|
|
39
41
|
default_attr :show_footer, true
|
40
42
|
default_attr :readme_page_title, 'Home'
|
41
43
|
|
44
|
+
default_attr :resource_index, false
|
45
|
+
default_attr :centered, true
|
46
|
+
|
42
47
|
attr_accessor :readme
|
43
48
|
end
|
44
49
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module YARD::APIPlugin
|
2
|
+
class Serializer < ::YARD::Serializers::FileSystemSerializer
|
3
|
+
USNSEP = '__' # url-safe namespace separator
|
4
|
+
FSSEP = '/'
|
5
|
+
|
6
|
+
def self.topicize(str)
|
7
|
+
str.lines.first.gsub(/\W+/, '_').downcase
|
8
|
+
end
|
9
|
+
|
10
|
+
def serialize(object, data)
|
11
|
+
path = File.join(basepath, serialized_path(object))
|
12
|
+
|
13
|
+
if path.include?(' ')
|
14
|
+
debugger
|
15
|
+
end
|
16
|
+
|
17
|
+
log.debug "Serializing to #{path}"
|
18
|
+
File.open!(path, "wb") {|f| f.write data }
|
19
|
+
end
|
20
|
+
|
21
|
+
def serialized_path(object)
|
22
|
+
return object if object.is_a?(String)
|
23
|
+
|
24
|
+
fspath = nil
|
25
|
+
|
26
|
+
if object.is_a?(YARD::CodeObjects::ExtraFileObject)
|
27
|
+
fspath = 'file.' + object.name + (extension.empty? ? '' : ".#{extension}")
|
28
|
+
else
|
29
|
+
fspath = if object == YARD::Registry.root
|
30
|
+
"top-level-namespace"
|
31
|
+
else
|
32
|
+
self.class.topicize(get_api_id(object))
|
33
|
+
end
|
34
|
+
|
35
|
+
if object.is_a?(YARD::CodeObjects::MethodObject)
|
36
|
+
fspath += '_' + object.scope.to_s[0,1]
|
37
|
+
end
|
38
|
+
|
39
|
+
unless extension.empty?
|
40
|
+
fspath += ".#{extension}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if (fspath.include?(' '))
|
45
|
+
debugger
|
46
|
+
end
|
47
|
+
|
48
|
+
fspath.gsub(/[^\w\.\-_\/]+/, '-')
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_api_id(object)
|
52
|
+
if object[:api_id]
|
53
|
+
object.api_id
|
54
|
+
elsif tag = object.tag(:API)
|
55
|
+
tag.text.lines.first.strip
|
56
|
+
else
|
57
|
+
object.name.to_s
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -5,100 +5,100 @@ module YARD::Templates::Helpers::BaseHelper
|
|
5
5
|
YARD::APIPlugin.options
|
6
6
|
end
|
7
7
|
|
8
|
-
def linkify_with_api(*args)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
alias_method :linkify_without_api, :linkify
|
70
|
-
alias_method :linkify, :linkify_with_api
|
71
|
-
|
72
|
-
def lookup_topic(controller_name)
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
def lookup_appendix(title)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
end
|
8
|
+
# def linkify_with_api(*args)
|
9
|
+
# # References to controller actions
|
10
|
+
# #
|
11
|
+
# # Syntax: api:ControllerName#method_name [TITLE OVERRIDE]
|
12
|
+
# #
|
13
|
+
# # @example Explicit reference with title defaulting to the action
|
14
|
+
# # # @see api:Assignments#create
|
15
|
+
# # # => <a href="assignments.html#method.assignments_api.create">create</a>
|
16
|
+
# #
|
17
|
+
# # @example Inline reference with an overriden title
|
18
|
+
# # # Here's a link to absolute {api:Assignments#destroy destruction}
|
19
|
+
# # # => <a href="assignments.html#method.assignments_api.destroy">destruction</a>
|
20
|
+
# #
|
21
|
+
# # @note Action links inside the All Resources section will be relative.
|
22
|
+
# if args.first.is_a?(String) && args.first =~ %r{^api:([^#]+)#(.*)}
|
23
|
+
# topic, controller = *lookup_topic($1.to_s)
|
24
|
+
# if topic
|
25
|
+
# html_file = "#{topicize topic.first}.html"
|
26
|
+
# action = $2
|
27
|
+
# link_url("#{html_file}#method.#{topicize(controller.name.to_s).sub("_controller", "")}.#{action}", args[1])
|
28
|
+
# else
|
29
|
+
# raise "couldn't find API link for #{args.first}"
|
30
|
+
# end
|
31
|
+
|
32
|
+
# # References to API objects defined by @object
|
33
|
+
# #
|
34
|
+
# # Syntax: api:ControllerName:Object+Name [TITLE OVERRIDE]
|
35
|
+
# #
|
36
|
+
# # @example Explicit resource reference with title defaulting to its name
|
37
|
+
# # # @see api:Assignments:Assignment
|
38
|
+
# # # => <a href="assignments.html#Assignment">Assignment</a>
|
39
|
+
# #
|
40
|
+
# # @example Explicit resource reference with an overriden title
|
41
|
+
# # # @return api:Assignments:AssignmentOverride An Assignment Override
|
42
|
+
# # # => <a href="assignments.html#Assignment">An Assignment Override</a>
|
43
|
+
# elsif args.first.is_a?(String) && args.first =~ %r{^api:([^:]+):(.*)}
|
44
|
+
# scope_name, resource_name = $1.downcase, $2.gsub('+', ' ')
|
45
|
+
# link_url("#{scope_name}.html##{resource_name}", args[1] || resource_name)
|
46
|
+
# elsif args.first.is_a?(String) && args.first == 'Appendix:' && args.size > 1
|
47
|
+
# __errmsg = "unable to locate referenced appendix '#{args[1]}'"
|
48
|
+
|
49
|
+
# unless appendix = lookup_appendix(args[1].to_s)
|
50
|
+
# raise __errmsg
|
51
|
+
# end
|
52
|
+
|
53
|
+
# topic, controller = *lookup_topic(appendix.namespace.to_s)
|
54
|
+
|
55
|
+
# if topic
|
56
|
+
# html_file = "#{topicize topic.first}.html"
|
57
|
+
# bookmark = "#{appendix.name.to_s.gsub(' ', '+')}-appendix"
|
58
|
+
# ret = link_url("#{html_file}##{bookmark}", appendix.title)
|
59
|
+
# else
|
60
|
+
# raise __errmsg
|
61
|
+
# end
|
62
|
+
|
63
|
+
# # A non-API link, delegate to YARD's HTML linker
|
64
|
+
# else
|
65
|
+
# linkify_without_api(*args)
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
|
69
|
+
# alias_method :linkify_without_api, :linkify
|
70
|
+
# alias_method :linkify, :linkify_with_api
|
71
|
+
|
72
|
+
# def lookup_topic(controller_name)
|
73
|
+
# controller = nil
|
74
|
+
# topic = options[:resources].find do |resource, controllers|
|
75
|
+
# controllers.detect do |_controller|
|
76
|
+
# if _controller.path.to_s == controller_name
|
77
|
+
# controller = _controller
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
# end
|
81
|
+
|
82
|
+
# [ topic, controller ]
|
83
|
+
# end
|
84
|
+
|
85
|
+
# def lookup_appendix(title)
|
86
|
+
# appendix = nil
|
87
|
+
|
88
|
+
# YARD::APIPlugin.log("Looking up appendix: #{title}") if api_options.verbose
|
89
|
+
|
90
|
+
# if object
|
91
|
+
# # try in the object scope
|
92
|
+
# appendix = YARD::Registry.at(".appendix.#{object.path}.#{title}")
|
93
|
+
|
94
|
+
# # try in the object's namespace scope
|
95
|
+
# if appendix.nil? && object.respond_to?(:namespace)
|
96
|
+
# appendix = YARD::Registry.at(".appendix.#{object.namespace.path}.#{title}")
|
97
|
+
# end
|
98
|
+
# end
|
99
|
+
|
100
|
+
# appendix
|
101
|
+
# end
|
102
102
|
|
103
103
|
def tag_partial(name, tag, locals={})
|
104
104
|
options[:tag] = tag
|
@@ -121,4 +121,8 @@ module YARD::Templates::Helpers::BaseHelper
|
|
121
121
|
def get_current_route
|
122
122
|
get_current_routes.first
|
123
123
|
end
|
124
|
+
|
125
|
+
def schema_is_model?(schema)
|
126
|
+
schema.has_key?('description') && schema.has_key?('properties')
|
127
|
+
end
|
124
128
|
end
|
@@ -2,7 +2,7 @@ require 'yard/templates/helpers/html_helper'
|
|
2
2
|
|
3
3
|
module YARD::Templates::Helpers::HtmlHelper
|
4
4
|
def topicize(str)
|
5
|
-
|
5
|
+
::YARD::APIPlugin::Serializer.topicize(str)
|
6
6
|
end
|
7
7
|
|
8
8
|
def url_for_file(filename, anchor = nil)
|
@@ -11,6 +11,10 @@ module YARD::Templates::Helpers::HtmlHelper
|
|
11
11
|
link
|
12
12
|
end
|
13
13
|
|
14
|
+
# def url_for_api_object(name, object)
|
15
|
+
# "#{object.parent.path}::#{name}"
|
16
|
+
# end
|
17
|
+
|
14
18
|
def static_pages()
|
15
19
|
@@static_pages ||= begin
|
16
20
|
locate_static_pages(YARD::APIPlugin.options)
|
@@ -133,4 +137,22 @@ module YARD::Templates::Helpers::HtmlHelper
|
|
133
137
|
html = resolve_links(html)
|
134
138
|
html
|
135
139
|
end
|
140
|
+
|
141
|
+
def htmlify_tag_type(tag)
|
142
|
+
co = if tag.type =~ /API::(?:(\S+)::)?(\S+)\b/
|
143
|
+
# discard [] at the end denoting array of objects
|
144
|
+
P(tag.type.gsub(/\[\]$/, ''))
|
145
|
+
end
|
146
|
+
|
147
|
+
if co && !co.is_a?(YARD::CodeObjects::Proxy)
|
148
|
+
begin
|
149
|
+
linkify(co, tag.type.split(YARD::CodeObjects::NSEP)[1..-1].join(YARD::CodeObjects::NSEP))
|
150
|
+
rescue Exception => e
|
151
|
+
YARD::APIPlugin.logger.warn e
|
152
|
+
""
|
153
|
+
end
|
154
|
+
else
|
155
|
+
tag.type
|
156
|
+
end
|
157
|
+
end
|
136
158
|
end
|
data/lib/yard-api/verifier.rb
CHANGED
data/lib/yard-api/version.rb
CHANGED
data/lib/yard-api.rb
CHANGED
@@ -37,6 +37,10 @@ module YARD
|
|
37
37
|
log.enter_level(level) { log.puts(message) }
|
38
38
|
end
|
39
39
|
|
40
|
+
def self.logger
|
41
|
+
YARD::Logger.instance
|
42
|
+
end
|
43
|
+
|
40
44
|
def self.on_error(message)
|
41
45
|
if self.options.strict
|
42
46
|
raise message
|
@@ -48,8 +52,11 @@ module YARD
|
|
48
52
|
|
49
53
|
require 'yard-api/version'
|
50
54
|
require 'yard-api/options'
|
55
|
+
require 'yard-api/registry'
|
51
56
|
require 'yard-api/tags'
|
52
57
|
require 'yard-api/verifier'
|
58
|
+
require 'yard-api/serializer'
|
59
|
+
require 'yard-api/code_objects/api_object'
|
53
60
|
require 'yard-api/templates/helpers/base_helper'
|
54
61
|
require 'yard-api/templates/helpers/html_helper'
|
55
62
|
require 'yard-api/templates/helpers/route_helper'
|
@@ -63,6 +70,16 @@ module YARD
|
|
63
70
|
class YardocOptions < Templates::TemplateOptions
|
64
71
|
default_attr :resources, []
|
65
72
|
default_attr :json_objects, []
|
73
|
+
default_attr :controllers, []
|
74
|
+
default_attr :current_route, nil
|
75
|
+
default_attr :inline_file, nil
|
76
|
+
default_attr :all_resources, nil
|
77
|
+
default_attr :tag, nil
|
78
|
+
default_attr :locale, nil
|
79
|
+
default_attr :multi_dialect, false
|
80
|
+
default_attr :argument_tags, []
|
81
|
+
default_attr :output, nil
|
82
|
+
default_attr :json_objects_map, {}
|
66
83
|
end
|
67
84
|
end
|
68
85
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module YARD
|
4
|
+
module Serializers
|
5
|
+
# A serializer that writes data to standard output.
|
6
|
+
class SpecSerializer < Base
|
7
|
+
# Creates a serializer to print text to stdout
|
8
|
+
#
|
9
|
+
# @param [Fixnum, nil] wrap if wrap is a number, wraps text to +wrap+
|
10
|
+
# columns, otherwise no wrapping is done.
|
11
|
+
def initialize(buffer)
|
12
|
+
@buffer = buffer
|
13
|
+
end
|
14
|
+
|
15
|
+
# Overrides serialize behaviour to write data to standard output
|
16
|
+
def serialize(object, data)
|
17
|
+
@buffer << data
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe YARD::Templates::Engine.template(:api, :fulldoc) do
|
24
|
+
before do
|
25
|
+
Registry.clear
|
26
|
+
set_option("output", "./tmp/doc")
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '@object' do
|
30
|
+
it 'should register it as a CodeObject inside the API namespace' do
|
31
|
+
populate <<-'eof'
|
32
|
+
# @API Quizzes
|
33
|
+
#
|
34
|
+
# @object Quiz
|
35
|
+
# {
|
36
|
+
# "id": "Quiz",
|
37
|
+
# "description": "A quiz that can be taken by students.",
|
38
|
+
# "properties": {
|
39
|
+
# "id": {
|
40
|
+
# "type": "String"
|
41
|
+
# }
|
42
|
+
# }
|
43
|
+
# }
|
44
|
+
class QuizzesController < ApplicationController
|
45
|
+
end
|
46
|
+
eof
|
47
|
+
|
48
|
+
YARD::Templates::Engine.render({
|
49
|
+
objects: [ P('QuizzesController') ],
|
50
|
+
type: :fulldoc,
|
51
|
+
template: :api,
|
52
|
+
format: :html
|
53
|
+
})
|
54
|
+
|
55
|
+
expect(Registry.all.map(&:path).sort).to eq(%w[
|
56
|
+
API
|
57
|
+
API::Quiz
|
58
|
+
API::Quizzes
|
59
|
+
API::Quizzes::Quiz
|
60
|
+
QuizzesController
|
61
|
+
])
|
62
|
+
|
63
|
+
expect(P('API::Quizzes::Quiz')).to be_truthy
|
64
|
+
expect(P('API::Quizzes::Quiz').parent).to eq P('API::Quizzes')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'byebug'
|
2
|
+
|
1
3
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
4
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
5
|
# The generated `.rspec` file contains `--require spec_helper` which will cause this
|
@@ -111,4 +113,15 @@ RSpec.configure do |config|
|
|
111
113
|
@options.reset_defaults
|
112
114
|
@overridden_options.clear
|
113
115
|
end
|
116
|
+
|
117
|
+
Registry = YARD::Registry
|
118
|
+
|
119
|
+
def T(template)
|
120
|
+
YARD::Templates::Engine.template(:api)
|
121
|
+
end
|
122
|
+
|
123
|
+
def populate(str=nil)
|
124
|
+
Registry.clear
|
125
|
+
YARD.parse_string str if str
|
126
|
+
end
|
114
127
|
end
|
@@ -24,11 +24,7 @@ a.active {
|
|
24
24
|
}
|
25
25
|
|
26
26
|
code {
|
27
|
-
|
28
|
-
padding: 0px 5px;
|
29
|
-
border: 1px solid #ddd;
|
30
|
-
background-color: #f8f8f8;
|
31
|
-
border-radius: 3px;
|
27
|
+
background-color: #f5f5f5;
|
32
28
|
font-family: Consolas, "Liberation Mono", Courier, monospace;
|
33
29
|
font-weight: bold;
|
34
30
|
}
|
@@ -47,13 +43,13 @@ h2 {
|
|
47
43
|
|
48
44
|
.endpoint__beta-banner {
|
49
45
|
border-left: 5px solid rgba(255,0,0,0.65);
|
50
|
-
background-color: #
|
46
|
+
background-color: #FFFBE6;
|
51
47
|
padding: 0.6em;
|
52
48
|
font-size: 85%;
|
53
49
|
}
|
54
50
|
|
55
51
|
.method-details__beta-flag {
|
56
|
-
color: #
|
52
|
+
color: #800;
|
57
53
|
background: #fca;
|
58
54
|
padding: 0.5em 0.6em;
|
59
55
|
font-size: 85%;
|
@@ -77,6 +73,8 @@ h2 {
|
|
77
73
|
color: inherit;
|
78
74
|
padding: 0.35em 0;
|
79
75
|
text-decoration: none;
|
76
|
+
font-size: 85%;
|
77
|
+
line-height: 1.2;
|
80
78
|
}
|
81
79
|
|
82
80
|
#sidebar a:hover {
|
@@ -88,28 +86,31 @@ h2 {
|
|
88
86
|
}
|
89
87
|
|
90
88
|
.sidebar__heading {
|
91
|
-
color: #
|
89
|
+
color: #aaa;
|
92
90
|
text-transform: uppercase;
|
93
91
|
font-size: 1em;
|
94
92
|
margin-bottom: 0.5em;
|
95
93
|
padding-bottom: 0;
|
96
94
|
margin-top: 1em;
|
95
|
+
font-weight: normal;
|
97
96
|
}
|
98
97
|
|
99
98
|
.endpoint__path {
|
100
|
-
font-size:
|
99
|
+
font-size: 85%;
|
101
100
|
font-weight: normal;
|
102
101
|
font-family: Monaco, Consolas, Courier, monospace;
|
103
|
-
padding:
|
104
|
-
margin
|
105
|
-
background: #
|
102
|
+
padding: 0.5em;
|
103
|
+
margin: 1em 0;
|
104
|
+
background: #FFFBE6;
|
106
105
|
}
|
107
106
|
|
108
|
-
.method-
|
107
|
+
.method-details__verb {
|
109
108
|
font-weight: bold;
|
109
|
+
color: #800;
|
110
110
|
}
|
111
|
+
|
111
112
|
.method-details .id-fragment {
|
112
|
-
color: #
|
113
|
+
color: #800;
|
113
114
|
}
|
114
115
|
|
115
116
|
.method-details__defined-in {
|
@@ -135,7 +136,7 @@ h2 {
|
|
135
136
|
/* highlight.js overrides */
|
136
137
|
pre.code, div.syntaxhighlighter {
|
137
138
|
font-family: Monaco, Consolas, Courier, monospace;
|
138
|
-
background-color: #
|
139
|
+
background-color: #FFFBE6;
|
139
140
|
font-size: 85%;
|
140
141
|
overflow: auto;
|
141
142
|
padding: 0.5em 1em;
|
@@ -157,18 +158,29 @@ pre.code, div.syntaxhighlighter {
|
|
157
158
|
|
158
159
|
td.code textarea { display: none; }
|
159
160
|
|
160
|
-
|
161
|
-
|
161
|
+
.topic__quicklinks {
|
162
|
+
padding: 0;
|
163
|
+
margin: 0;
|
162
164
|
}
|
163
|
-
|
164
|
-
|
165
|
+
|
166
|
+
.topic__quicklinks li {
|
167
|
+
list-style: none;
|
168
|
+
display: inline-block;
|
169
|
+
margin-right: 1em;
|
170
|
+
margin-bottom: 1em;
|
165
171
|
}
|
166
|
-
|
167
|
-
|
172
|
+
|
173
|
+
.topic__quicklinks li a {
|
174
|
+
display: block;
|
175
|
+
padding: 0.5em 1em;
|
176
|
+
background-color: #f5f5f5;
|
177
|
+
text-decoration: none;
|
178
|
+
border-radius: 3px;
|
179
|
+
font-size: 85%;
|
168
180
|
}
|
169
|
-
|
170
|
-
|
171
|
-
|
181
|
+
|
182
|
+
.topic__quicklinks li a:hover {
|
183
|
+
background-color: transparent;
|
172
184
|
}
|
173
185
|
|
174
186
|
a.method-details__name-link {
|
@@ -285,9 +297,6 @@ h4 {
|
|
285
297
|
}
|
286
298
|
|
287
299
|
code.argument-listing__argument-name {
|
288
|
-
border: none;
|
289
|
-
padding: 0;
|
290
|
-
margin: 0;
|
291
300
|
overflow: auto;
|
292
301
|
}
|
293
302
|
|
@@ -301,7 +310,7 @@ code.argument-listing__argument-name {
|
|
301
310
|
|
302
311
|
.argument-listing__argument-required {
|
303
312
|
font-style: normal;
|
304
|
-
color: #
|
313
|
+
color: #800;
|
305
314
|
font-weight: bold;
|
306
315
|
opacity: 0.6;
|
307
316
|
}
|
@@ -319,7 +328,7 @@ code.argument-listing__argument-name {
|
|
319
328
|
|
320
329
|
.example-codeblocks__tabs {
|
321
330
|
margin-bottom: -0.5em; /* negate the margin of the example block */
|
322
|
-
background: #
|
331
|
+
background: #FFF7CC;
|
323
332
|
padding: 0.5em 1em;
|
324
333
|
font-size: 85%;
|
325
334
|
}
|
@@ -331,4 +340,44 @@ code.argument-listing__argument-name {
|
|
331
340
|
|
332
341
|
.example-codeblocks__tabs a.active {
|
333
342
|
font-weight: bold;
|
343
|
+
}
|
344
|
+
|
345
|
+
.type-mute {
|
346
|
+
color: #777;
|
347
|
+
}
|
348
|
+
|
349
|
+
.object-synopsis__header {
|
350
|
+
padding: 1em 0;
|
351
|
+
background: #FFFBE6;
|
352
|
+
position: relative; /* for the toggler btn */
|
353
|
+
}
|
354
|
+
|
355
|
+
.object-synopsis__header-text {
|
356
|
+
display: block;
|
357
|
+
width: 40%;
|
358
|
+
max-width: 260px;
|
359
|
+
text-align: right;
|
360
|
+
}
|
361
|
+
|
362
|
+
.object-synopsis__toggler {
|
363
|
+
appearance: none;
|
364
|
+
-webkit-appearance: none;
|
365
|
+
-moz-appearance: none;
|
366
|
+
border: none;
|
367
|
+
padding: 0;
|
368
|
+
|
369
|
+
background-color: transparent;
|
370
|
+
font-size: small;
|
371
|
+
color: #4183c4;
|
372
|
+
position: absolute;
|
373
|
+
top: 50%;
|
374
|
+
right: 1em;
|
375
|
+
margin-top: -0.5em;
|
376
|
+
cursor: pointer;
|
377
|
+
font-weight: bold;
|
378
|
+
line-height: 1;
|
379
|
+
}
|
380
|
+
|
381
|
+
.object-synopsis__toggler:hover {
|
382
|
+
text-decoration: underline;
|
334
383
|
}
|
@@ -1,6 +1,35 @@
|
|
1
|
+
/* global $:true, hljs:true */
|
2
|
+
|
3
|
+
function makeObjectSynopsisBlocksTogglable() {
|
4
|
+
var MARKER_CLASS = 'object-synopsis__hidden';
|
5
|
+
|
6
|
+
$('.object-synopsis__toggler').each(function() {
|
7
|
+
var $togglerButton = $(this);
|
8
|
+
var $objectSynopsis = $togglerButton.closest('.object-synopsis');
|
9
|
+
var $objectSynopsisContent = $objectSynopsis.find('.object-synopsis__content');
|
10
|
+
|
11
|
+
function render() {
|
12
|
+
if (!$togglerButton.hasClass(MARKER_CLASS)) {
|
13
|
+
$togglerButton.text('Hide');
|
14
|
+
$objectSynopsisContent.show();
|
15
|
+
}
|
16
|
+
else {
|
17
|
+
$togglerButton.text('Show');
|
18
|
+
$objectSynopsisContent.hide();
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
$togglerButton.on('click', function() {
|
23
|
+
$togglerButton.toggleClass(MARKER_CLASS);
|
24
|
+
render();
|
25
|
+
});
|
26
|
+
|
27
|
+
render();
|
28
|
+
});
|
29
|
+
}
|
30
|
+
|
1
31
|
$(function() {
|
2
32
|
$('.method-details__name').each(function(i, el) {
|
3
|
-
var subtopic = $(el).data('subtopic');
|
4
33
|
var $a = $(el).find('a');
|
5
34
|
var anchorText = $.trim($a[0].innerHTML);
|
6
35
|
|
@@ -8,9 +37,9 @@ $(function() {
|
|
8
37
|
return;
|
9
38
|
}
|
10
39
|
|
11
|
-
var $row = $('#
|
40
|
+
var $row = $('#topicQuicklinks');
|
12
41
|
var $link = $('<a/>', {
|
13
|
-
href: '#'
|
42
|
+
href: '#' + $(el).attr('name')
|
14
43
|
}).html(anchorText);
|
15
44
|
|
16
45
|
$('<li>').append($link).appendTo($row);
|
@@ -50,7 +79,9 @@ $(function() {
|
|
50
79
|
$(this).addClass('active');
|
51
80
|
});
|
52
81
|
});
|
53
|
-
|
82
|
+
|
54
83
|
$(this).find('a:first').click();
|
55
84
|
});
|
56
|
-
|
85
|
+
|
86
|
+
makeObjectSynopsisBlocksTogglable();
|
87
|
+
});
|
@@ -1,11 +1,21 @@
|
|
1
1
|
require 'pathname'
|
2
|
+
require 'json'
|
2
3
|
|
3
4
|
include YARD::Templates::Helpers::ModuleHelper
|
4
5
|
include YARD::Templates::Helpers::FilterHelper
|
5
6
|
|
6
7
|
def init
|
8
|
+
YARD::APIPlugin.logger.info "YARD-API: starting."
|
9
|
+
|
10
|
+
options.serializer = YARD::APIPlugin::Serializer.new
|
11
|
+
options.serializer.basepath = api_options.output
|
12
|
+
|
13
|
+
options.objects.each do |object|
|
14
|
+
object[:api_id] = object.tag('API').text.lines.first
|
15
|
+
end
|
16
|
+
|
7
17
|
options[:resources] = options[:objects].
|
8
|
-
group_by { |o| o
|
18
|
+
group_by { |o| o[:api_id] }.
|
9
19
|
sort_by { |o| o.first }
|
10
20
|
|
11
21
|
build_json_objects_map
|
@@ -15,13 +25,51 @@ def init
|
|
15
25
|
return serialize_onefile_index
|
16
26
|
end
|
17
27
|
|
18
|
-
serialize_index if File.exists?(api_options['readme'])
|
28
|
+
serialize_index if File.exists?(api_options['readme'] || '')
|
19
29
|
serialize_static_pages
|
20
30
|
serialize_resource_index if api_options['resource_index']
|
21
31
|
|
22
32
|
options.delete(:objects)
|
23
33
|
|
24
34
|
options[:resources].each do |resource, controllers|
|
35
|
+
controllers.each do |controller|
|
36
|
+
if controller.is_a?(YARD::CodeObjects::NamespaceObject)
|
37
|
+
co = YARD::CodeObjects::ClassObject.new(
|
38
|
+
YARD::APIPlugin::Registry.root,
|
39
|
+
controller[:api_id]
|
40
|
+
)
|
41
|
+
|
42
|
+
YARD::Registry.register co
|
43
|
+
|
44
|
+
(controller.tags(:object) + controller.tags(:model)).each do |tag|
|
45
|
+
tag_co = YARD::CodeObjects::APIObject.new(co, tag.text.lines[0].strip)
|
46
|
+
tag_co.object = tag.object
|
47
|
+
|
48
|
+
# Make an alias on the global API namespace, for convenience.
|
49
|
+
# Now an object called "Bar" under the "Foo" controller can be
|
50
|
+
# referenced using [API::Bar] as well as [API::Foo::Bar] which will
|
51
|
+
# never face any conflicts.
|
52
|
+
shortcut_tag_co = YARD::CodeObjects::APIObject.new(YARD::APIPlugin::Registry.root, tag.text.lines[0].strip)
|
53
|
+
shortcut_tag_co.object = tag.object
|
54
|
+
|
55
|
+
# We need to override #namespace because #url_for() uses it to
|
56
|
+
# generate the url, which has to be done usign #object and not
|
57
|
+
# #namespace (which points to P("API") and we want
|
58
|
+
# P("API::#{tag.object.path}")).
|
59
|
+
shortcut_tag_co.namespace = tag.object
|
60
|
+
|
61
|
+
YARD::Registry.register(tag_co)
|
62
|
+
YARD::Registry.register(shortcut_tag_co)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# debugger
|
68
|
+
|
69
|
+
if controllers.length > 1
|
70
|
+
debugger
|
71
|
+
end
|
72
|
+
|
25
73
|
serialize_resource(resource, controllers)
|
26
74
|
end
|
27
75
|
end
|
@@ -34,12 +82,21 @@ def serialize(object)
|
|
34
82
|
end
|
35
83
|
|
36
84
|
def serialize_resource(resource, controllers)
|
85
|
+
YARD::APIPlugin.logger.info('=' * 80)
|
86
|
+
YARD::APIPlugin.logger.info ">>> #{resource} <<< (#{controllers})"
|
87
|
+
YARD::APIPlugin.logger.info('-' * 80)
|
88
|
+
|
37
89
|
options[:object] = resource
|
38
90
|
options[:controllers] = controllers
|
39
|
-
|
40
|
-
|
91
|
+
|
92
|
+
controllers.each do |controller|
|
93
|
+
Templates::Engine.with_serializer(controller, options.serializer) do
|
94
|
+
T('layout').run(options)
|
95
|
+
end
|
41
96
|
end
|
97
|
+
|
42
98
|
options.delete(:controllers)
|
99
|
+
YARD::APIPlugin.logger.info('-' * 80)
|
43
100
|
end
|
44
101
|
|
45
102
|
def serialize_index
|
@@ -93,12 +150,55 @@ def build_json_objects_map
|
|
93
150
|
options[:json_objects] = {}
|
94
151
|
options[:resources].each do |r,cs|
|
95
152
|
cs.each do |controller|
|
96
|
-
(controller.tags(:object) + controller.tags(:model)).each do |
|
97
|
-
name,
|
98
|
-
|
99
|
-
|
100
|
-
|
153
|
+
(controller.tags(:object) + controller.tags(:model)).each do |tag|
|
154
|
+
name, json_string = tag.text.split(%r{\n+}, 2).map(&:strip)
|
155
|
+
|
156
|
+
if json = parse_json(json_string)
|
157
|
+
options[:json_objects_map][name] = topicize r
|
158
|
+
options[:json_objects][r] ||= []
|
159
|
+
options[:json_objects][r] << [name, json]
|
160
|
+
end
|
101
161
|
end
|
102
162
|
end
|
103
163
|
end
|
104
164
|
end
|
165
|
+
|
166
|
+
def parse_json(json_string)
|
167
|
+
JSON::parse(json_string || '').tap do |json|
|
168
|
+
validate_json_schema(json, ->(msg) {
|
169
|
+
raise <<-MSG
|
170
|
+
#{'=' * 32}
|
171
|
+
#{msg.strip}
|
172
|
+
#{'-' * 32}
|
173
|
+
Offending JSON belongs to: "#{name}" in "#{tag.object.path}".
|
174
|
+
#{'=' * 32}
|
175
|
+
MSG
|
176
|
+
})
|
177
|
+
end
|
178
|
+
rescue JSON::ParserError => e
|
179
|
+
YARD::APIPlugin.on_error(
|
180
|
+
<<-MSG
|
181
|
+
#{'*' * 32}
|
182
|
+
A @#{tag.tag_name} docstring contains invalid JSON.
|
183
|
+
Offending JSON belongs to "#{name}" in "#{tag.object.path}".
|
184
|
+
---
|
185
|
+
#{tag}
|
186
|
+
---
|
187
|
+
#{e}
|
188
|
+
#{'*' * 32}
|
189
|
+
MSG
|
190
|
+
)
|
191
|
+
|
192
|
+
nil
|
193
|
+
end
|
194
|
+
|
195
|
+
def validate_json_schema(schema, on_error)
|
196
|
+
if schema_is_model?(schema)
|
197
|
+
if !schema['description'].is_a?(String)
|
198
|
+
on_error.call <<-MSG
|
199
|
+
Expected "description" to be a String, got #{schema['description'].class}.
|
200
|
+
Value: #{schema['description'].to_json}
|
201
|
+
MSG
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
@@ -10,20 +10,21 @@
|
|
10
10
|
body {
|
11
11
|
margin: 0 auto;
|
12
12
|
width: <%= content_width %>px;
|
13
|
+
padding-left: <%= sidebar_width %>px;
|
13
14
|
}
|
14
|
-
|
15
|
+
|
15
16
|
#sidebar {
|
16
17
|
margin-left: -<%= sidebar_width %>px;
|
17
18
|
width: <%= sidebar_width %>px;
|
18
19
|
left: auto;
|
19
20
|
}
|
20
|
-
|
21
|
+
|
21
22
|
#content {
|
22
23
|
padding-left: 3em;
|
23
24
|
}
|
24
|
-
<% else %>
|
25
|
+
<% else %>
|
25
26
|
body {
|
26
|
-
padding-left: <%= sidebar_width + api_options.spacer %>px;
|
27
|
+
padding-left: <%= sidebar_width + (api_options.spacer || 0) %>px;
|
27
28
|
padding-right: <%= api_options.spacer %>px;
|
28
29
|
}
|
29
30
|
|
@@ -7,7 +7,10 @@
|
|
7
7
|
%>
|
8
8
|
|
9
9
|
<div class='endpoint__path'>
|
10
|
-
<span class="
|
10
|
+
<span class="method-details__verb <%= route[:verb].downcase %>">
|
11
|
+
<%= route[:verb] %>
|
12
|
+
</span>
|
13
|
+
|
11
14
|
<%= formatted_route_path %>
|
12
15
|
</div>
|
13
16
|
|
@@ -1,11 +1,13 @@
|
|
1
1
|
<ul class="argument-listing">
|
2
|
-
<%
|
2
|
+
<% options[:argument_tags].each do |tag| %>
|
3
3
|
<li class="argument-listing__argument">
|
4
4
|
<div class="argument-listing__argument-details">
|
5
5
|
<code class="argument-listing__argument-name"><%= h tag.name %></code>
|
6
|
-
<span class="argument-listing__argument-type"
|
6
|
+
<span class="argument-listing__argument-type">
|
7
|
+
<%= htmlify_tag_type(tag) %>
|
8
|
+
</span>
|
7
9
|
|
8
|
-
<% if (tag.accepted_values
|
10
|
+
<% if Array(tag.accepted_values).any? %>
|
9
11
|
<span class="argument-listing__argument-values">
|
10
12
|
<span>[ <%= tag.accepted_values.join(', ') %> ]</span>
|
11
13
|
</span>
|
@@ -19,6 +21,8 @@
|
|
19
21
|
<div class="argument-listing__argument-text">
|
20
22
|
<% if !tag.text.empty? %>
|
21
23
|
<%= html_markup_markdown(tag.text) %>
|
24
|
+
<% else %>
|
25
|
+
<em class="type-mute">No description provided.</em>
|
22
26
|
<% end %>
|
23
27
|
</div>
|
24
28
|
</li>
|
@@ -1,4 +1,5 @@
|
|
1
|
-
<%
|
1
|
+
<% argument_tags = options[:argument_tags] %>
|
2
|
+
<% has_accepted_values = argument_tags.any? { |e| Array(e.accepted_values).any? } %>
|
2
3
|
|
3
4
|
<table>
|
4
5
|
<thead>
|
@@ -12,7 +13,7 @@
|
|
12
13
|
</thead>
|
13
14
|
|
14
15
|
<tbody>
|
15
|
-
<%
|
16
|
+
<% argument_tags.each do |tag| %>
|
16
17
|
<tr>
|
17
18
|
<td><code class="argument-name"><%= h tag.name %></code></td>
|
18
19
|
<td><span class="argument-type"><%= tag.type %></span></td>
|
data/templates/api/tags/setup.rb
CHANGED
@@ -47,10 +47,10 @@ def emits
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def argument
|
50
|
-
|
51
|
-
@argument_tags = object.tags(:argument)
|
50
|
+
argument_tags = object.tags(:argument)
|
52
51
|
|
53
|
-
if
|
52
|
+
if argument_tags.any?
|
53
|
+
options[:argument_tags] = argument_tags
|
54
54
|
erb('argument')
|
55
55
|
end
|
56
56
|
end
|
@@ -66,6 +66,11 @@ def returns
|
|
66
66
|
@object_name = response_info.text.strip
|
67
67
|
@is_list = false
|
68
68
|
end
|
69
|
+
|
70
|
+
# if @object_name =~ /\{(\S+)\}/
|
71
|
+
# @object_name = $1
|
72
|
+
# end
|
73
|
+
|
69
74
|
@resource_name = options[:json_objects_map][@object_name]
|
70
75
|
return unless @resource_name
|
71
76
|
erb(:returns)
|
@@ -4,17 +4,18 @@ def init
|
|
4
4
|
sections :header, [:topic_doc, :method_details_list, [T('method_details')]]
|
5
5
|
@resource = object
|
6
6
|
@beta = options[:controllers].any? { |c| c.tag('beta') }
|
7
|
+
@meths = options[:controllers].map { |c| c.meths(:inherited => false, :included => false) }.flatten
|
8
|
+
@meths = run_verifier(@meths)
|
7
9
|
end
|
8
10
|
|
9
11
|
def method_details_list
|
10
|
-
@meths = options[:controllers].map { |c| c.meths(:inherited => false, :included => false) }.flatten
|
11
|
-
@meths = run_verifier(@meths)
|
12
12
|
erb(:method_details_list)
|
13
13
|
end
|
14
14
|
|
15
15
|
def topic_doc
|
16
16
|
@docstring = options[:controllers].map { |c| c.docstring }.join("\n\n")
|
17
17
|
@object = @object.dup
|
18
|
+
@controller = options[:controllers].first
|
18
19
|
def @object.source_type; nil; end
|
19
20
|
@json_objects = options[:json_objects][@resource] || []
|
20
21
|
erb(:topic_doc)
|
@@ -28,6 +29,21 @@ def properties_of_model(json)
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
32
|
+
def properties_of_model_as_tags(json)
|
33
|
+
props = json.has_key?('properties') ? json['properties'] : json
|
34
|
+
props.reduce([]) do |tags, (id, prop)|
|
35
|
+
is_required = prop.has_key?('required') ? prop['required'] : false
|
36
|
+
is_required_str = is_required ? 'Required' : 'Optional'
|
37
|
+
|
38
|
+
tag = YARD::APIPlugin::Tags::ArgumentTag.new(
|
39
|
+
nil,
|
40
|
+
"[#{is_required_str}, #{prop['type']}] #{id}\n #{prop['description']}"
|
41
|
+
)
|
42
|
+
|
43
|
+
tags << tag
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
31
47
|
def word_wrap(text, col_width=80)
|
32
48
|
text.gsub!( /(\S{#{col_width}})(?=\S)/, '\1 ' )
|
33
49
|
text.gsub!( /(.{1,#{col_width}})(?:\s+|$)/, "\\1\n" )
|
@@ -13,15 +13,50 @@
|
|
13
13
|
<section>
|
14
14
|
<h2>Interfaces</h2>
|
15
15
|
|
16
|
-
|
16
|
+
<% if @meths.empty? %>
|
17
|
+
<p>
|
18
|
+
<em class="type-mute">This API currently has no endpoints available.</em>
|
19
|
+
</p>
|
20
|
+
<% end %>
|
21
|
+
|
22
|
+
<ul id="topicQuicklinks" class="topic__quicklinks"></ul>
|
17
23
|
</section>
|
18
24
|
|
19
|
-
<% @json_objects.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
<% if @json_objects.any? %>
|
26
|
+
<section>
|
27
|
+
<h2>Object Synopses</h2>
|
28
|
+
|
29
|
+
<% @json_objects.each do |name, json| %>
|
30
|
+
<% if false %>
|
31
|
+
<% properties = render_properties(json) %>
|
32
|
+
<div class='object-synopsis'>
|
33
|
+
<h3>
|
34
|
+
<a name="<%= name %>"></a><%= name %> object synopsis:
|
35
|
+
</h3>
|
36
|
+
<pre class="example code"><%= html_syntax_highlight(properties ? properties : json, :plain) %></pre>
|
37
|
+
</div>
|
38
|
+
<% end %>
|
39
|
+
|
40
|
+
<div class="object-synopsis">
|
41
|
+
<h3 class="object-synopsis__header" id="<%= name %>-api">
|
42
|
+
<span class="object-synopsis__header-text"><%= name %></span>
|
43
|
+
<button class="object-synopsis__toggler"></button>
|
44
|
+
</h3>
|
45
|
+
|
46
|
+
<div class="object-synopsis__content">
|
47
|
+
<div class="object-synopsis__content-description">
|
48
|
+
<% if schema_is_model?(json) && !json['description'].empty? %>
|
49
|
+
<%= htmlify json['description'] %>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<%=
|
54
|
+
tag_partial("../../tags/html/argument/_list", nil, {
|
55
|
+
argument_tags: properties_of_model_as_tags(json)
|
56
|
+
})
|
57
|
+
%>
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
<% end %>
|
61
|
+
</section>
|
62
|
+
<% end %>
|
data/yard-api.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yard-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ahmad Amireh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description: |2
|
70
84
|
TBD
|
71
85
|
email: ahmad@instructure.com
|
@@ -78,9 +92,12 @@ files:
|
|
78
92
|
- README.md
|
79
93
|
- config/yard_api.yml
|
80
94
|
- lib/yard-api.rb
|
95
|
+
- lib/yard-api/code_objects/api_object.rb
|
81
96
|
- lib/yard-api/markup/redcarpet.rb
|
82
97
|
- lib/yard-api/options.rb
|
83
98
|
- lib/yard-api/railtie.rb
|
99
|
+
- lib/yard-api/registry.rb
|
100
|
+
- lib/yard-api/serializer.rb
|
84
101
|
- lib/yard-api/tags.rb
|
85
102
|
- lib/yard-api/tags/argument_tag.rb
|
86
103
|
- lib/yard-api/templates/helpers/base_helper.rb
|
@@ -89,6 +106,7 @@ files:
|
|
89
106
|
- lib/yard-api/verifier.rb
|
90
107
|
- lib/yard-api/version.rb
|
91
108
|
- lib/yard-api/yardoc_task.rb
|
109
|
+
- spec/fulldoc_spec.rb
|
92
110
|
- spec/spec_helper.rb
|
93
111
|
- spec/tags/argument_spec.rb
|
94
112
|
- tasks/yard_api.rake
|