class MediaWiktory::Generator::Param

Attributes

api[RW]

Public Class Methods

extract_default(els) click to toggle source
# File lib/mediawiktory/generator/param.rb, line 53
def extract_default(els)
  els.each { |el| return Regexp.last_match(1) if el =~ /^Default:\s*(.+)$/ }
  nil
end
extract_description(els) click to toggle source
# File lib/mediawiktory/generator/param.rb, line 31
def extract_description(els)
  els.detect { |e| e.attr('class') == 'description' }.at('p')._n.text.to_s.strip.tr("\n", ' ')
end
extract_type(els) click to toggle source
# File lib/mediawiktory/generator/param.rb, line 35
def extract_type(els)
  # TODO: "Expiry time. May be relative (e.g. 5 months or 2 weeks) or absolute
  #   (e.g. 2014-09-18T12:34:56Z). If set to infinite, indefinite, or never, the block will
  #   never expire."
  els.select { |e| e.attr('class') == 'info' }.each do |el|
    case el.text
    when /^Type: ([^\(]+)\s*($|\()/
      return Regexp.last_match(1).strip
    when /^Values \(separate with \|/,
         /^Separate values with \|/
      return 'list'
    when /^One of the following values:/
      return 'enum'
    end
  end
  'string'
end
extract_values(els) click to toggle source
# File lib/mediawiktory/generator/param.rb, line 58
def extract_values(els)
  # 1. try dl from definition
  els.detect { |e| e.attr('class') == 'description' }.tap { |d|
    if d.at('dl')
      return d.at('dl').each_term.map { |dts, dds|
        {name: dts.first.text, description: dds.first.text.tr("\n", ' ')}
      }
    end
  }

  # 2. ...or take from info
  els.select { |e| e.attr('class') == 'info' }.each do |el|
    if el.text =~
       /^(?:One of the following values||Values \(separate with \|.*?\)):\s*(.+)$/
      if el.search('a').count > 1
        return el.search('a').reject { |a| a.text == 'alternative' }
                 .map { |a|
                 {
                   name: a.text,
                   module: a.attr('href').scan(/^.*[\#+](.+)$/).flatten.first
                 }
               }
      else
        return Regexp.last_match(1).sub(/^Can be empty, or/, '').split(',')
                     .map { |s| s.gsub(/^[[:space:]]|[[:space:]]$/, '') }
      end
    end
  end

  nil
end
from_html_nodes(name, dds, prefix: nil) click to toggle source
# File lib/mediawiktory/generator/param.rb, line 9
def from_html_nodes(name, dds, prefix: nil)
  new(
    full_name: name,
    name: name.sub(/^#{prefix}/, ''),
    prefix: prefix,
    description: extract_description(dds),
    type: extract_type(dds),
    vals: extract_values(dds)

    # TODO: lost params
    #   limit: extract_limit(dds),
    #   default: extract_default(dds)

    # TODO: mandatoriness:
    # * optional
    # * mandatory
    # * this OR that is mandatory
    # * this AND that can't intersect
    # * and so on
  )
end

Public Instance Methods

enum?() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 134
def enum?
  type.start_with?('enum')
end
enum_values() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 116
def enum_values
  return [] unless vals

  if vals.all? { |v| v.is_a?(String) }
    vals.map(&:inspect).join(', ')
  elsif vals.all? { |v| v.is_a?(Hash) && v.key?(:description) }
    vals.map { |v| v[:name].inspect }.join(', ')
  elsif modules?
    vals.map { |v| v[:name].to_sym.inspect }.join(', ')
  else
    fail ArgumentError, "Unrenderable values: #{vals}"
  end
end
full_name() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 104
def full_name
  self['full_name']._n.include?('-') ? "'#{self['full_name']}'" : self['full_name']
end
impl_type() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 138
def impl_type
  type = real_type.sub(/^list of (.+)s$/, '\1')
  type = 'string' if type == 'list'
  type = 'enum of modules' if type == 'module'
  case type
  when 'string', 'user name', 'integer', 'integer or max'
    'string'
  when 'boolean'
    'boolean'
  when 'timestamp'
    'timestamp'
  when 'enum'
    'enum'
  when 'enum of modules'
    'enum_of_modules'
  else
    fail ArgumentError, "Cannot render #{real_type} to Ruby still"
  end
end
inspect() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 93
def inspect
  "#<#{self.class} #{name} (#{type})>"
end
Also aliased as: to_s
list?() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 130
def list?
  type.start_with?('list')
end
method_name() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 108
def method_name
  name.tr('-', '_')
end
module_in_hash(m) click to toggle source
# File lib/mediawiktory/generator/param.rb, line 185
def module_in_hash(m)
  "#{m.method_name}: Modules::#{m.class_name}"
end
modules() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 264
def modules
  modules? ? vals.map { |v| api.module(v.module) } : []
end
modules?() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 260
def modules?
  vals._n.all? { |v| v.is_a?(Hash) && v.key?(:module) }
end
modules_hash() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 112
def modules_hash
  modules.map { |m| module_in_hash(m) }.join(', ')
end
param_def() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 213
def param_def
  case real_type
  when 'boolean'
    '' # just sets `true` if method was called
  when /^list/
    '*values'
  else
    'value'
  end
end
param_docs() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 189
def param_docs
  case real_type
  when 'enum'
    " One of #{render_vals}."
  when 'enum of modules'
    ' Selecting an option includes tweaking methods from corresponding module:'
  when 'list of modules'
    ' All selected options include tweaking methods from corresponding modules:'
  when 'list of enums'
    " Allowed values: #{render_vals}."
  end
end
prefix=(pre) click to toggle source
Calls superclass method
# File lib/mediawiktory/generator/param.rb, line 99
def prefix=(pre)
  super
  self.full_name = "#{prefix}#{name}"
end
real_type() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 243
def real_type
  case type
  when 'enum'
    modules? ? 'enum of modules' : 'enum'
  when 'list'
    if modules?
      'list of modules'
    elsif vals
      'list of enums'
    else
      'list'
    end
  else
    type
  end
end
render_vals() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 202
def render_vals
  if vals.all? { |v| v.is_a?(String) }
    vals.map(&:inspect).join(', ')
  elsif vals.all? { |v| v.is_a?(Hash) && v.key?(:description) }
    vals.map { |v| "#{v[:name].inspect} (#{v[:description].chomp('.')})" }.join(', ')
  elsif modules?
  else
    fail ArgumentError, "Unrenderable values: #{vals}"
  end
end
ruby_type() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 158
def ruby_type
  case real_type
  when 'string', 'user name', 'enum'
    'String'
  when 'boolean'
    'true, false'
  when 'integer'
    'Integer'
  when 'integer or max'
    'Integer, "max"'
  when 'list', 'list of user names', 'list of enums'
    'Array<String>'
  when 'list of integers'
    'Array<Integer>'
  when 'list of timestamps'
    'Array<Time>'
  when 'enum of modules'
    'Symbol'
  when 'list of modules'
    'Array<Symbol>'
  when 'timestamp'
    'Time'
  else
    fail ArgumentError, "Cannot render #{real_type} to Ruby still"
  end
end
to_s()
Alias for: inspect
value_conv() click to toggle source
# File lib/mediawiktory/generator/param.rb, line 224
def value_conv
  case real_type
  when 'boolean'
    "'true'" # on false, merge(param: something) not rendered at all
  when 'list of modules'
    "modules_to_hash(values, #{modules.map { |m| m.name.to_sym }})"
  when 'list of timestamps'
    "values.map(&:iso8601).join('|')"
  when /^list/
    "values.join('|')"
  when 'enum of modules'
    "module_to_hash(value, #{modules.map { |m| m.name.to_sym }})"
  when 'timestamp'
    'value.iso8601'
  else
    'value.to_s'
  end
end