class MediaWiktory::Generator::Api

Public Class Methods

from_html(source, **metadata) click to toggle source
# File lib/mediawiktory/generator/api.rb, line 10
def from_html(source, **metadata)
  doc = Nokogiri::HTML(source)
  modules =
    doc
    .at('#mw-content-text').children_groups('h3,h4', 'div,p')
    .map { |title, components| Module.from_html_nodes(title.first._n.text.to_s, components) }

  new(**metadata.merge(modules: modules))
end
from_url(url) click to toggle source
# File lib/mediawiktory/generator/api.rb, line 20
def from_url(url)
  uri = Addressable::URI.parse(url)
  uri.query_values = {action: :query, meta: :siteinfo, siprop: :general, format: :json}
  meta = JSON.parse(open(uri).read)['query']['general']
  uri.query_values = {action: :help, recursivesubmodules: true}
  html = open(uri).read
  from_html(html, site: OpenStruct.new(name: meta['sitename'], base: meta['base']))
end
new(**source) click to toggle source
Calls superclass method
# File lib/mediawiktory/generator/api.rb, line 30
def initialize(**source)
  super(source.merge(
    main: source[:modules].detect(&:main?),
    actions: source[:modules].select(&:action?),
    non_actions: source[:modules].reject { |m| m.main? || m.action? }
  ))
  modules.each { |m| m.api = self }

  # "generators" parameter for action=query are special. They are not defined by modules, but
  # by "You can use this or that module, just add 'g' to it".
  query = actions.detect { |a| a.name == 'query' } or return
  query.params.detect { |p| p.name == 'generator' }
       .tap do |query_generator|

    self.generators =
      query_generator
      .modules.map { |mod|
        mod.merge(
          name: "g-#{mod.name}",
          description: "#{mod.description} _Generator module: for fetching pages corresponding to request._",
          params: mod.params.reject { |p| p.name == 'prop' }.map(&:dup)
        ).tap { |m| m.prefix = "g#{m.prefix}" }
      }

    modules.concat(generators)
    non_actions.concat(generators)
    query_generator.vals =
      query_generator.vals.map { |v| {name: v.name, module: "g-#{v.module}"} }
  end
end

Public Instance Methods

main_template() click to toggle source
# File lib/mediawiktory/generator/api.rb, line 70
def main_template
  'api.rb'
end
module(name) click to toggle source
# File lib/mediawiktory/generator/api.rb, line 61
def module(name)
  candidates = modules.reject(&:action?).select { |m| m.name == name }
  candidates.empty? and fail ArgumentError, "Module #{name} not found"
  candidates.count == 1 or fail ArgumentError, "Module #{name} is ambigous"
  candidates.first
end