module Joshua::Doc
Constants
- ICONS
Public Instance Methods
icon(data, size: 24, color: nil, style: nil)
click to toggle source
render single icon
# File lib/doc/doc.rb, line 111 def icon data, size: 24, color: nil, style: nil %[<svg style="width: #{size}px; height: #{size}px; #{style}" viewBox="0 0 24 24" fill="currentColor">#{data}</svg>] end
index()
click to toggle source
render doc for all documented classes
# File lib/doc/doc.rb, line 141 def index tag.div do |n| for @klass in Joshua.documented @opts = @klass.opts icon = @opts.dig(:opts, :icon) n._sticky(style: 'background: #f7f7f7; padding-bottom: 5px; padding-top: 30px; margin-top: 2px;') do |n| n.push name_link @klass, 40 n.push self.icon icon, style: 'position: absolute; margin-left: -40px; margin-top: 1px; fill: #777; background: #f7f7f7;' if icon n.h4 { @klass.to_s.sub(/Api$/, '') } end if desc = @opts.dig(:opts, :desc) n.p { desc } end if detail = @opts.dig(:opts, :detail) n.p { detail } end n.push render_type :member n.push render_type :collection n.br n.hr n.br end end end
misc_file(name)
click to toggle source
# File lib/doc/doc.rb, line 28 def misc_file name File.read [__dir__, '../misc/%s' % name].join('/') end
name_link(name, top=nil)
click to toggle source
anchor link
# File lib/doc/doc.rb, line 106 def name_link name, top=nil %[<a name="#{name}" class="anchor" style="top: #{top || -95}px;"></a>] end
render(mount_on: nil, request: nil, bearer: nil)
click to toggle source
render full page
# File lib/doc/doc.rb, line 33 def render mount_on: nil, request: nil, bearer: nil mount_on ||= request.url.split('?').first+'/' mount_on.sub! %r{//$}, '/' tag.html do |n| n.head do |n| n.title 'Joshua Tester' n.link({ href: "https://fonts.googleapis.com/css?family=Inter:300,400,500,600,700,800,900&display=swap", rel:"stylesheet" }) n.link({ rel:"stylesheet", href:"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" }) n.script({ src: 'https://cdnjs.cloudflare.com/ajax/libs/zepto/1.2.0/zepto.min.js' }) n.script %[window.api_opts = { mount_on: '#{mount_on}', bearer: '#{bearer}' }] end n.body do |n| n.style { misc_file('doc.css') } n.header({ style: 'border-bottom: 1px solid rgb(228, 228, 228);'}) do |n| n._container do |n| n.push top_icons n.push %[<button id="bearer_button" onclick="AuthButton.set()" class="btn btn-sm btn-outline-primary" style="float: right; margin-top: 15px; margin-right: 20px;">-</button>] n.h1({ class: :nav}) { %[<a href="#top">Joshua <gray>Docs</gray></a>] } end end n.img src:"https://i.imgur.com/HWoUz5k.png", style: 'width: 40px; z-index: 1; position: absolute; top: 10px; left: 50%;', onclick: "window.open('https://github.com/dux/joshua')" n.push modal_dialog n._container do |n| n._row do |n| n._col_3 do |n| n._sticky(style: 'padding-top: 30px;') do |n| n.a({ class: :dark, href: '#top' }) { '<p><b>API OBJECTS</b></p>' } n.push left_nav n.br n.br n.p '<b>TOOLS</b>' n.div do |n| n.push %[<p><a class="badge badge-light" href="#api_errors">Named errors</a></p>] n.push %[<p><a class="badge badge-light" href="#{mount_on}_/postman" target="capi_postman">Postman/Insomnija import URL</a></p>] n.push %[<p><a class="badge badge-light" href="#{mount_on}_/raw" target="capi_raw">Raw doc data</a></p>] end n.br n.p '<b>API LIBRARIES</b>' n.div do |n| n.push %[<a class="badge badge-light" href="https://github.com/dux/joshua/blob/master/lib/client/ruby/client" target="capi_ruby">Ruby</a>] n.push %[<a class="badge badge-light" href="https://github.com/dux/joshua/blob/master/lib/misc/api_example.coffee" target="capi_js">Javascript</a>] n.push %[<a class="badge badge-light" href="#">Python</a>] n.push %[<a class="badge badge-light" href="#">C#</a>] end n.br n.p '<b>RESOURCES</b>' n.div do |n| n.push %[<a class="badge badge-light" href="http://vmrcre.org/web/scribe/home/-/blogs/why-rest-sucks" target="capi_why">Why we only prefer POST?</a>] end end end n._col_9 do |n| n.push index n.push list_errors end end end end end end
render_method(name:, m_name:, opts: tag._box do |n|)
click to toggle source
render api method
# File lib/doc/doc.rb, line 188 def render_method name:, m_name:, opts: tag._box do |n| # n.push %[<button onclick="" class="btn btn-info btn-sm request">request</button>] anchor = [@klass, m_name].join('-') n.push name_link anchor n.h5 do |n| n.push "<a href='##{anchor}'>#{m_name}</a>" n.push ' <gray> — %s</gray>' % opts[:desc] if opts[:desc] end n.p({style: 'margin: 20px 0 25px 0;'}) do |n| path = @klass.api_path path += '/:id' if name == :member path += "/#{m_name}" n.push %[<button href="#{path}" class="btn btn-outline-info btn-sm" onclick="ModalForm.render(api_opts.mount_on+this.innerHTML, #{(opts[:params] || {}).to_json.gsub('"', '"')})">#{path}</button>] end if opts[:detail] n.h6 'Details' n.pre opts[:detail] end if mopts = opts[:params] n.h6 'Params' n.ul do |n| for name, opt in mopts n.li do |n| n.push '<bold>%s</bold>: ' % name n.push opt[:type] data = [] data.push 'required' if opt[:required] data.push 'default: %s' % opt[:default].to_s unless opt[:default].nil? n.push ' — (%s)' % data.join(', ') if data.length > 0 end end end end end
render_type(name)
click to toggle source
render members or collection
# File lib/doc/doc.rb, line 172 def render_type name base = @opts[name] || return tag.div do |n| n.br n.h5 '<gray>%s methods</gray>' % name for m_name, member in base n.div do |n| n.push render_method name: name, m_name: m_name, opts: member end end end end
tag()
click to toggle source
# File lib/doc/doc.rb, line 24 def tag HtmlTagBuilder end
top_icons()
click to toggle source
top side navigation icons
# File lib/doc/doc.rb, line 116 def top_icons tag.div({ style: 'float: right; margin-top: 18px;' }) do |n| for icon in ICONS.values next unless icon[:url] n.push %[<a target="_new" href="#{icon[:url]}">#{icon icon[:image]}</a>] end end end