class PDD::Base

Code base abstraction

Public Class Methods

new(opts) click to toggle source

Ctor.

opts

Options

# File lib/pdd.rb, line 79
def initialize(opts)
  @opts = opts
  PDD.opts = opts
  PDD.log.level = Logger::INFO if @opts[:verbose]
  PDD.log.level = Logger::ERROR if @opts[:quiet]
  PDD.log.info "My version is #{PDD::VERSION}"
  PDD.log.info "Ruby version is #{RUBY_VERSION} at #{RUBY_PLATFORM}"
end

Public Instance Methods

xml() click to toggle source

Generate XML.

# File lib/pdd.rb, line 89
def xml
  dir = @opts[:source] ? @opts[:source] : Dir.pwd
  PDD.log.info "Reading #{dir}"
  require_relative 'pdd/sources'
  sources = Sources.new(dir)
  @opts[:include]&.each do |p|
    sources = sources.include(p)
  end
  @opts[:exclude]&.each do |p|
    sources = sources.exclude(p)
    PDD.log.info "Excluding #{p}"
  end
  sanitize(
    rules(
      Nokogiri::XML::Builder.new do |xml|
        xml << "<?xml-stylesheet type='text/xsl' href='#{xsl}'?>"
        xml.puzzles(attrs) do
          sources.fetch.each do |source|
            source.puzzles.each do |puzzle|
              PDD.log.info "Puzzle #{puzzle.props[:id]} " \
                "#{puzzle.props[:estimate]}/#{puzzle.props[:role]}" \
                " at #{puzzle.props[:file]}"
              render puzzle, xml
            end
          end
        end
      end.to_xml
    )
  )
end

Private Instance Methods

attrs() click to toggle source
# File lib/pdd.rb, line 122
def attrs
  {
    'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
    'xsi:noNamespaceSchemaLocation' => "#{host('xsd')}/#{PDD::VERSION}.xsd",
    'version' => PDD::VERSION,
    'date' => Time.now.utc.iso8601
  }
end
host(suffix) click to toggle source
# File lib/pdd.rb, line 131
def host(suffix)
  "http://pdd-#{suffix}.teamed.io"
end
render(puzzle, xml) click to toggle source
# File lib/pdd.rb, line 139
def render(puzzle, xml)
  props = puzzle.props
  xml.puzzle do
    props.map do |k, v|
      xml.send(:"#{k}", v)
    end
  end
end
rules(xml) click to toggle source
# File lib/pdd.rb, line 148
def rules(xml)
  doc = Nokogiri::XML(xml)
  total = 0
  list = @opts[:rule] || []
  unless list.select { |r| r.start_with?('max-duplicates:') }.empty?
    raise PDD::Error, 'You can\'t modify max-duplicates, it\'s always 1'
  end
  list.push('max-duplicates:1').map do |r|
    name, value = r.split(':')
    rule = RULES[name]
    raise "Rule '#{name}' doesn't exist" if rule.nil?
    rule.new(doc, value).errors.each do |e|
      PDD.log.error e
      total += 1
    end
  end
  raise PDD::Error, "#{total} errors, see log above" unless total.zero?
  xml
end
sanitize(xml) click to toggle source
# File lib/pdd.rb, line 168
def sanitize(xml)
  xsd = Nokogiri::XML::Schema(
    File.read(File.join(File.dirname(__FILE__), '../assets/puzzles.xsd'))
  )
  errors = xsd.validate(Nokogiri::XML(xml)).map(&:message)
  errors.each { |e| PDD.log.error e }
  PDD.log.error(xml) unless errors.empty?
  raise SchemaError, errors.join('; ') unless errors.empty?
  xml
end
xsl() click to toggle source
# File lib/pdd.rb, line 135
def xsl
  "#{host('xsl')}/#{PDD::VERSION}.xsl"
end