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
left_nav() click to toggle source

left side navigation

# File lib/doc/doc.rb, line 126
def left_nav
  tag.div do |n|
    Joshua.documented.each do |name|
      n.a({ class:'btn btn-outline-info btn-sm', style: '-font-size: 14px; margin-bottom: 10px;', href: '#%s' % name}) do |n|
        icon = name.opts.dig(:opts, :icon)
        n.push self.icon icon, size: 20 if icon
        n.push name.to_s.sub(/Api$/, '')
      end

      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
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 &nbsp; <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>&nbsp; &mdash; &nbsp; %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('"', '&quot;')})">#{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 ' &mdash; (%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