Class: PDD::Source

Inherits:
Object
  • Object
show all
Defined in:
lib/pdd/source.rb

Overview

Source.

Instance Method Summary collapse

Constructor Details

#initialize(file, path) ⇒ Source

Ctor.

file

Absolute file name with source code

path

Path to show (without full file name)



32
33
34
35
# File 'lib/pdd/source.rb', line 32

def initialize(file, path)
  @file = file
  @path = path
end

Instance Method Details

#puzzlesObject

Fetch all puzzles.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/pdd/source.rb', line 38

def puzzles
  PDD.log.info "Reading #{@path}..."
  puzzles = []
  lines = File.readlines(@file, encoding: 'UTF-8')
  lines.each_with_index do |line, idx|
    begin
      /[^\s]\x40todo/.match(line) do |_|
        raise Error, "\x40todo must have a leading space to become \
a puzzle, as this page explains: https://github.com/yegor256/pdd#how-to-format"
      end
      /\x40todo(?!\s+#)/.match(line) do |_|
        raise Error, "\x40todo found, but puzzle can't be parsed, \
most probably because \x40todo is not followed by a puzzle marker, \
as this page explains: https://github.com/yegor256/pdd#how-to-format"
      end
      /\x40todo\s+#\s/.match(line) do |_|
        raise Error, "\x40todo found, but there is an unexpected space \
after the hash sign, it should not be there, \
see https://github.com/yegor256/pdd#how-to-format"
      end
      %r{(.*(?:^|\s))\x40todo\s+#([\w\-\.:/]+)\s+(.+)}.match(line) do |m|
        puzzles << puzzle(lines.drop(idx + 1), m, idx)
      end
    rescue Error, ArgumentError => ex
      raise Error, "puzzle at line ##{idx + 1}; #{ex.message}"
    end
  end
  puzzles
end