tomparse 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.index CHANGED
@@ -64,5 +64,5 @@ description: ! 'TomParse provides no other functionality than to take a code com
64
64
  and parse it in to a convenient object-oriented structure in accordance
65
65
 
66
66
  with TomDoc standard.'
67
- version: 0.4.0
68
- date: '2013-02-11'
67
+ version: 0.4.1
68
+ date: '2013-02-14'
data/HISTORY.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Release History
2
2
 
3
+ ## 0.4.1 / 2013-02-14
4
+
5
+ This release fixes exmaple parsing.
6
+
7
+ Changes:
8
+
9
+ * Handle variable indention in examples.
10
+ * Do not remove newlines for single example.
11
+
12
+
3
13
  ## 0.4.0 / 2013-02-10
4
14
 
5
15
  For this release, the document parser has been substantially refactored.
@@ -64,5 +64,5 @@ description: ! 'TomParse provides no other functionality than to take a code com
64
64
  and parse it in to a convenient object-oriented structure in accordance
65
65
 
66
66
  with TomDoc standard.'
67
- version: 0.4.0
68
- date: '2013-02-11'
67
+ version: 0.4.1
68
+ date: '2013-02-14'
@@ -540,33 +540,28 @@ module TomParse
540
540
 
541
541
  # Parse example.
542
542
  #
543
- # section - String starting with `Examples`.
544
- # sections - All sections subsequent to section.
543
+ # section - String starting with `Example`.
545
544
  #
546
545
  # Returns nothing.
547
546
  def parse_example(section)
548
- examples = []
549
-
550
- # TODO: make the unidention smarter (could be more than 2 spaces)
551
- section = section.sub('Example', '').gsub(/^\s{2}/,'')
552
-
553
- @examples << section unless section.strip.empty?
547
+ # remove the initial `Example` line and right strip
548
+ section = section.sub(/.*?\n/, '')
549
+ example = clean_example(section)
550
+ @examples << example unless example.strip.empty?
554
551
  end
555
552
 
556
553
  # Parse examples.
557
554
  #
558
555
  # section - String starting with `Examples`.
559
- # sections - All sections subsequent to section.
560
556
  #
561
557
  # Returns nothing.
562
558
  def parse_examples(section)
563
- #examples = []
564
-
565
- # TODO: make the unidention smarter (could be more than 2 spaces)
566
- section = section.sub('Examples', '')
567
-
559
+ # remove the initial `Examples` line and right strip
560
+ section = section.sub(/.*?\n/, '')
568
561
  section.split("\n\n").each do |ex|
569
- @examples << ex.gsub(/^\s{2}/,'') unless ex.strip.empty?
562
+ next if ex.strip.empty?
563
+ example = clean_example(ex)
564
+ @examples << example
570
565
  end
571
566
  end
572
567
 
@@ -587,27 +582,6 @@ module TomParse
587
582
  def parse_returns(section)
588
583
  text = section.gsub(/\s+/, ' ').strip
589
584
  @returns << text
590
-
591
- #returns, raises, current = [], [], []
592
- #
593
- #lines = section.split("\n")
594
- #lines.each do |line|
595
- # case line
596
- # when /^Returns/
597
- # returns << line
598
- # current = returns
599
- # when /^Raises/
600
- # raises << line
601
- # current = raises
602
- # when /^\s+/
603
- # current.last << line.squeeze(' ')
604
- # else
605
- # current << line # TODO: What to do with non-compliant line?
606
- # end
607
- #end
608
- #
609
- #@returns.concat(returns)
610
- #@raises.concat(raises)
611
585
  end
612
586
 
613
587
  # Parse raises section.
@@ -694,6 +668,33 @@ module TomParse
694
668
  @tags << [label, desc.strip] if label
695
669
  end
696
670
 
671
+ private
672
+
673
+ def clean_example(text)
674
+ lines = text.rstrip.lines.to_a
675
+ # remove blank lines from top
676
+ lines.shift while lines.first.strip.empty?
677
+ # determine the indention
678
+ indent = least_indent(lines)
679
+ # remove the indention
680
+ tab = " " * indent
681
+ lines = lines.map{ |line| line.sub(tab, '') }
682
+ # put the lines back together
683
+ lines.join
684
+ end
685
+
686
+ # Given a multi-line string, determine the minimum indention.
687
+ def least_indent(lines)
688
+ indents = []
689
+ lines.map do |line|
690
+ next if line.strip.empty?
691
+ if md = /^\ */.match(line)
692
+ indents << md[0].size
693
+ end
694
+ end
695
+ indents.min || 0
696
+ end
697
+
697
698
  end
698
699
 
699
700
  end
@@ -1,5 +1,13 @@
1
1
  require 'citron'
2
2
  require 'ae'
3
3
 
4
+ if ENV['coverage']
5
+ require 'simplecov'
6
+ SimpleCov.command_name 'tomparse'
7
+ SimpleCov.start do
8
+ coverage_dir 'log/coverage'
9
+ end
10
+ end
11
+
4
12
  require 'tomparse'
5
13
 
@@ -0,0 +1,124 @@
1
+ require_relative 'helper'
2
+
3
+ testcase "Examples" do
4
+
5
+ context "plural form one example" do
6
+ setup do
7
+ @comment = TomParse::TomDoc.new %{
8
+ # Duplicate some text an abitrary number of times.
9
+ #
10
+ # Examples
11
+ # multiplex('Tom', 4)
12
+ # # => 'TomTomTomTom'
13
+ #
14
+ # Returns something or another.
15
+ }
16
+ end
17
+
18
+ test "there is one examples" do
19
+ @comment.examples.size.assert == 1
20
+ end
21
+
22
+ test "the example" do
23
+ @comment.examples.first.assert == "multiplex('Tom', 4)\n# => 'TomTomTomTom'"
24
+ end
25
+ end
26
+
27
+ context "plural form multiple examples" do
28
+ setup do
29
+ @comment = TomParse::TomDoc.new %{
30
+ # Duplicate some text an abitrary number of times.
31
+ #
32
+ # Examples
33
+ # multiplex('Tom', 4)
34
+ # # => 'TomTomTomTom'
35
+ #
36
+ # multiplex('Bo', 2)
37
+ # # => 'BoBo'
38
+ #
39
+ # Returns something or another.
40
+ }
41
+ end
42
+
43
+ test "there are two examples" do
44
+ @comment.examples.size.assert == 2
45
+ end
46
+
47
+ test "the first example" do
48
+ @comment.examples.first.assert == "multiplex('Tom', 4)\n# => 'TomTomTomTom'"
49
+ end
50
+
51
+ test "the second example" do
52
+ @comment.examples.last.assert == "multiplex('Bo', 2)\n# => 'BoBo'"
53
+ end
54
+ end
55
+
56
+ context "singular form" do
57
+ setup do
58
+ @comment = TomParse::TomDoc.new %{
59
+ # Duplicate some text an abitrary number of times.
60
+ #
61
+ # Example
62
+ # answer = multiplex('Tom', 4)
63
+ #
64
+ # return answer
65
+ #
66
+ # Returns something or another.
67
+ }
68
+ end
69
+
70
+ test "there is one example" do
71
+ @comment.examples.size.assert == 1
72
+ end
73
+
74
+ test "the example" do
75
+ @comment.examples.first.assert == "answer = multiplex('Tom', 4)\n\nreturn answer"
76
+ end
77
+ end
78
+
79
+ context "multiple example clauses" do
80
+ setup do
81
+ @comment = TomParse::TomDoc.new %{
82
+ # Duplicate some text an abitrary number of times.
83
+ #
84
+ # Examples
85
+ # multiplex('Tom', 4)
86
+ # # => 'TomTomTomTom'
87
+ #
88
+ # multiplex('Bo', 2)
89
+ # # => 'BoBo'
90
+ #
91
+ # Example
92
+ # answer = multiplex('Tom', 4)
93
+ #
94
+ # return answer
95
+ #
96
+ # Returns something or another.
97
+ }
98
+ end
99
+
100
+ test "there are three examples" do
101
+ @comment.examples.size.assert == 3
102
+ end
103
+ end
104
+
105
+ context "handles whitespace in examples" do
106
+ setup do
107
+ @comment = TomParse::TomDoc.new %{
108
+ # Duplicate some text an abitrary number of times.
109
+ #
110
+ # Examples
111
+ #
112
+ # def multiplex(str, length)
113
+ # str * length
114
+ # end
115
+ }
116
+ end
117
+
118
+ test "correctly handles whitespace with examples" do
119
+ eg = @comment.examples[0].to_s
120
+ eg.assert == "def multiplex(str, length)\n str * length\nend"
121
+ end
122
+ end
123
+
124
+ end
@@ -104,7 +104,6 @@ testcase TomParse::TomDoc do
104
104
  end
105
105
 
106
106
  context "handles multiple paragraph descriptions" do
107
-
108
107
  setup do
109
108
  @comment = TomParse::TomDoc.new %{
110
109
  # Has an initial paragraph.
@@ -122,11 +121,9 @@ testcase TomParse::TomDoc do
122
121
  test "correctly handles multiple paragraphs" do
123
122
  @comment.description.assert == "Has an initial paragraph.\n\nHas another paragraph in the description."
124
123
  end
125
-
126
124
  end
127
125
 
128
126
  context "handles whitespace in examples" do
129
-
130
127
  setup do
131
128
  @comment = TomParse::TomDoc.new %{
132
129
  # Duplicate some text an abitrary number of times.
@@ -143,7 +140,6 @@ testcase TomParse::TomDoc do
143
140
  eg = @comment.examples[0].to_s
144
141
  eg.assert == "def multiplex(str, length)\n str * length\nend"
145
142
  end
146
-
147
143
  end
148
144
 
149
145
  context "without arguments or examples" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tomparse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-11 00:00:00.000000000 Z
12
+ date: 2013-02-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: citron
@@ -83,6 +83,7 @@ files:
83
83
  - lib/tomparse.yml
84
84
  - test/helper.rb
85
85
  - test/test_description.rb
86
+ - test/test_examples.rb
86
87
  - test/test_prefixes.rb
87
88
  - test/test_signatures.rb
88
89
  - test/test_tags.rb
@@ -119,6 +120,7 @@ summary: TomDoc parser for Ruby
119
120
  test_files:
120
121
  - test/test_description.rb
121
122
  - test/helper.rb
123
+ - test/test_examples.rb
122
124
  - test/test_yields.rb
123
125
  - test/test_signatures.rb
124
126
  - test/test_tags.rb