torture 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9cf9f68d7ab433e6ec3258976fd9899997381c94790c167177f4119cce22ca2
4
- data.tar.gz: 20d17c8428bd51abcfa11fb36f42d10d47ac46eb94b10af2521e89b4eb126711
3
+ metadata.gz: aff3c08d8cd95104a55ad3dc537155ede021cdb199409b8c29a5559016cf0e2a
4
+ data.tar.gz: fb60c30209e3952b38c7913887050f9f4aaae1103483e03810cb1985b1d25733
5
5
  SHA512:
6
- metadata.gz: 36e0d29daccfe432fe4567b214c52cc11681d9add9e25f50445acd460b2af6e9ef58507907191f0fd8fcea3096ca8047395c409105f7811899fc7237497dc59c
7
- data.tar.gz: 653cb314e328aec90a7d62119a66b70d40f80ed90a2ea080d4b15c28ad72a251cc41e413145c8254ecc85bbe68281b4bbf1bbc4dd00cde52777c6814b0896316
6
+ metadata.gz: 00323374d686a6be90492708332cb232a605cab2a946b14cb67ce44f6e06afac5019c5dcf7901ad05019e0ed2e2fe2de670b4ada0edeaea8597df991998d77ce
7
+ data.tar.gz: 6af6813f27bb19e0e1edc442abb30cd4373a3ad2cc7f4726e5d46b9008ba377fce759a03ca1f566a4df6caa994395fde06d4af2972bc86b5067e7217f50d4469
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.0.3
2
+
3
+ * Introduce the `:zoom` option that can show a class header/end plus a "zoomed"
4
+ section.
5
+ * Fix a bug with `:collapse`, when the collapse marker had index `0`.
6
+
1
7
  # 0.0.2
2
8
 
3
9
  * Introduce the `:sub` option for `#snippet` to erase unwanted code parts.
@@ -6,40 +6,31 @@ module Torture
6
6
  end
7
7
 
8
8
  # @param :collapse name of the #~collapse marker that will be displayed as `# ...`.
9
- def self.extract(input, marker:, collapse:nil, unindent:false, sub: nil)
10
- code = nil # also acts as a flag if we're within our section.
11
- ignore = false
12
- indent = 0
9
+ def self.extract(input, marker:, collapse:nil, unindent:false, sub: nil, zoom: nil)
10
+ input_lines = input.each_line.to_a
13
11
 
14
- input.each_line do |ln|
15
- # end of our section?
16
- break if ln =~ /\#:#{marker} end/
12
+ content_lines, first_line = extract_marker_section(input_lines, marker: marker)
13
+ raise "Couldn't find #{marker}" unless first_line
17
14
 
18
- # beginning of our section?
19
- if ln =~ /\#:#{marker}$/
20
- code = ""
21
- indent = ln.match(/(^\s+)/) { |m| m[0].size } || 0
22
- end
15
+ indent = first_line.match(/(^\s+)/) { |m| m[0].size } || 0 # FIXME: what if there's no first line?
23
16
 
24
- next if code.nil? # not in our section.
17
+ if zoom
18
+ content_lines = zoom(content_lines, zoom: zoom)
19
+ end
25
20
 
26
- if ln =~ /#~#{collapse}$/
27
- ignore = true
28
- code << ln.sub("#~#{collapse}", "# ...")
29
- end
21
+ if collapse
22
+ count = content_lines.find_all { |ln| ln =~ /\#~#{collapse}$/ }.size # FIXME: hm, this is private.
30
23
 
31
- if ln =~ /#~#{collapse} end/
32
- ignore = false
33
- next
24
+ count.times do
25
+ content_lines = collapse(content_lines, collapse: collapse)
34
26
  end
35
-
36
- next if ignore
37
- next if ln =~ /#~/
38
- next if ln =~ /#:/
39
- code << ln and next
40
27
  end
41
28
 
42
- raise "Couldn't find #{marker}" unless code
29
+ # remove foreign delimiters
30
+ content_lines = content_lines.reject { |ln| ln =~ /#~/ }
31
+ content_lines = content_lines.reject { |ln| ln =~ /#:/ }
32
+
33
+ code = content_lines.join("")
43
34
 
44
35
  code = unindent(code, indent) if unindent == true
45
36
  code = sub(code, sub) if sub
@@ -47,6 +38,71 @@ module Torture
47
38
  code
48
39
  end
49
40
 
41
+ def self.detect_marker_section(input, delimiter:)
42
+ start_i, stop_i = nil, nil
43
+
44
+ input.each.with_index do |ln, i|
45
+ # end of our section?
46
+ if ln =~ /\##{delimiter} end/
47
+ stop_i = i
48
+ break
49
+ end
50
+
51
+ # beginning of our section?
52
+ if ln =~ /\##{delimiter}$/
53
+ start_i = i
54
+ end
55
+ end
56
+
57
+ [start_i, stop_i]
58
+ end
59
+
60
+ def self.extract_marker_section(input, marker:, delimiter: ":#{marker}")
61
+ start_i, stop_i = detect_marker_section(input, delimiter: delimiter)
62
+ return if start_i.nil?
63
+
64
+ marker_section = input[start_i + 1..stop_i - 1]
65
+
66
+ return marker_section, input[start_i]
67
+ end
68
+
69
+ def self.marker_to_dotdotdot(line, delimiter:)
70
+ line.sub("##{delimiter}", "# ...")
71
+ end
72
+
73
+ def self.zoom(input, zoom:, zoom_frame: [0..0, -1..-1])
74
+ delimiter = "~#{zoom}"
75
+ zoomed_section, first_line = extract_marker_section(input, marker: nil, delimiter: delimiter)
76
+
77
+ before_range, after_range = zoom_frame # DISCUSS: do we need that?
78
+
79
+ content = []
80
+ content += input[before_range]
81
+ content << dotdotdot = marker_to_dotdotdot(first_line, delimiter: delimiter)
82
+ content += zoomed_section
83
+ content << dotdotdot
84
+ content += input[after_range]
85
+
86
+ content
87
+ end
88
+
89
+ def self.collapse(input, collapse:)
90
+ delimiter = "~#{collapse}"
91
+
92
+ start_i, stop_i = detect_marker_section(input, delimiter: delimiter)
93
+
94
+
95
+ content = if start_i == 0
96
+ [] # if the #~skip start is index == 0, don't collect anything "before" (because there isn't anything).
97
+ # TODO: is there a Ruby idiom for this?
98
+ else
99
+ input[0..start_i - 1]
100
+ end
101
+
102
+ content << marker_to_dotdotdot(input[start_i], delimiter: delimiter)
103
+ content += input[stop_i + 1..-1]
104
+ end
105
+
50
106
  # Strip {indent} characters of whitespace from each line beginning.
51
107
  def self.unindent(code, indent)
52
108
  code.gsub(/^ {#{indent}}/, "")
@@ -1,3 +1,3 @@
1
1
  module Torture
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: torture
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-15 00:00:00.000000000 Z
11
+ date: 2025-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake