Module: Torture::Snippet

Defined in:
lib/torture/snippet.rb

Class Method Summary collapse

Class Method Details

.extract(input, marker:, collapse: nil, unindent: false, sub: nil) ⇒ Object

Parameters:

  • :collapse

    name of the #~collapse marker that will be displayed as ‘# …`.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/torture/snippet.rb', line 9

def self.extract(input, marker:, collapse:nil, unindent:false, sub: nil)
  code = nil     # also acts as a flag if we're within our section.
  ignore = false
  indent = 0

  input.each_line do |ln|
    # end of our section?
    break if ln =~ /\#:#{marker} end/

    # beginning of our section?
    if ln =~ /\#:#{marker}$/
      code   = ""
      indent = ln.match(/(^\s+)/) { |m| m[0].size } || 0
    end

    next if code.nil? # not in our section.

    if ln =~ /#~#{collapse}$/
      ignore = true
      code << ln.sub("#~#{collapse}", "# ...")
    end

    if ln =~ /#~#{collapse} end/
      ignore = false
      next
    end

    next if ignore
    next if ln =~ /#~/
    next if ln =~ /#:/
    code << ln and next
  end

  raise "Couldn't find #{marker}" unless code

  code = unindent(code, indent) if unindent == true
  code = sub(code, sub) if sub

  code
end

.extract_from(file:, **kws) ⇒ Object



3
4
5
6
# File 'lib/torture/snippet.rb', line 3

def self.extract_from(file:, **kws)
  input = File.open(file)
  self.extract(input, **kws)
end

.sub(code, sub) ⇒ Object



55
56
57
# File 'lib/torture/snippet.rb', line 55

def self.sub(code, sub)
  code.sub(sub, "")
end

.unindent(code, indent) ⇒ Object

Strip indent characters of whitespace from each line beginning.



51
52
53
# File 'lib/torture/snippet.rb', line 51

def self.unindent(code, indent)
  code.gsub(/^ {#{indent}}/, "")
end