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