germinate 1.2.0

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.
Files changed (105) hide show
  1. data/.gitignore +2 -0
  2. data/History.txt +26 -0
  3. data/README.rdoc +152 -0
  4. data/Rakefile +43 -0
  5. data/TODO +140 -0
  6. data/bin/germ +260 -0
  7. data/cucumber.yml +2 -0
  8. data/examples/basic.rb +123 -0
  9. data/examples/short.rb +19 -0
  10. data/features/author-formats-article.feature +111 -0
  11. data/features/author-lists-info.pending_feature +48 -0
  12. data/features/author-publishes-article-source.feature +5 -0
  13. data/features/author-publishes-article.feature +57 -0
  14. data/features/author-republishes-article.feature +5 -0
  15. data/features/author-selects-hunks.feature +26 -0
  16. data/features/author-sets-variables.feature +88 -0
  17. data/features/author-updates-article-source.feature +5 -0
  18. data/features/author-views-stuff.pending_feature +52 -0
  19. data/features/bin/quoter +6 -0
  20. data/features/bin/sorter +4 -0
  21. data/features/example_articles/bracketing.rb +27 -0
  22. data/features/example_articles/escaping.txt +13 -0
  23. data/features/example_articles/excerpt_output.rb +16 -0
  24. data/features/example_articles/hello.rb +9 -0
  25. data/features/example_articles/pipelines.txt +25 -0
  26. data/features/example_articles/regexen.rb +24 -0
  27. data/features/example_articles/sample_offsets.rb +18 -0
  28. data/features/example_articles/specials.rb +19 -0
  29. data/features/example_articles/stderr.rb +10 -0
  30. data/features/example_articles/wrapping.rb +8 -0
  31. data/features/example_output/bracketing.out +23 -0
  32. data/features/example_output/code_samples.txt +186 -0
  33. data/features/example_output/escaping.out +5 -0
  34. data/features/example_output/excerpt_output.out +6 -0
  35. data/features/example_output/hello.txt +1 -0
  36. data/features/example_output/pipelines.out +28 -0
  37. data/features/example_output/regexen.txt +22 -0
  38. data/features/example_output/sample_offsets.txt +15 -0
  39. data/features/example_output/specials.txt +40 -0
  40. data/features/example_output/stderr.out +3 -0
  41. data/features/example_output/wrapping.txt +3 -0
  42. data/features/step_definitions/germinate.rb +42 -0
  43. data/features/support/env.rb +20 -0
  44. data/germinate.gemspec +55 -0
  45. data/lib/germinate.rb +54 -0
  46. data/lib/germinate/application.rb +113 -0
  47. data/lib/germinate/article_editor.rb +20 -0
  48. data/lib/germinate/formatter.rb +119 -0
  49. data/lib/germinate/hunk.rb +183 -0
  50. data/lib/germinate/implicit_insertion.rb +9 -0
  51. data/lib/germinate/insertion.rb +29 -0
  52. data/lib/germinate/librarian.rb +293 -0
  53. data/lib/germinate/origin.rb +5 -0
  54. data/lib/germinate/pipeline.rb +13 -0
  55. data/lib/germinate/publisher.rb +57 -0
  56. data/lib/germinate/reader.rb +266 -0
  57. data/lib/germinate/selector.rb +136 -0
  58. data/lib/germinate/shared_style_attributes.rb +54 -0
  59. data/lib/germinate/shell_process.rb +94 -0
  60. data/lib/germinate/shell_publisher.rb +19 -0
  61. data/lib/germinate/simple_publisher.rb +7 -0
  62. data/lib/germinate/source_file.rb +41 -0
  63. data/lib/germinate/text_transforms.rb +119 -0
  64. data/lib/germinate/transform_process.rb +25 -0
  65. data/lib/germinate/variable.rb +23 -0
  66. data/sample.rb +14 -0
  67. data/spec/germinate/application_spec.rb +31 -0
  68. data/spec/germinate/article_editor_spec.rb +97 -0
  69. data/spec/germinate/code_hunk_spec.rb +73 -0
  70. data/spec/germinate/file_hunk_spec.rb +28 -0
  71. data/spec/germinate/formatter_spec.rb +160 -0
  72. data/spec/germinate/hunk_spec.rb +84 -0
  73. data/spec/germinate/implicit_insertion_spec.rb +33 -0
  74. data/spec/germinate/insertion_spec.rb +19 -0
  75. data/spec/germinate/librarian_spec.rb +555 -0
  76. data/spec/germinate/pipeline_spec.rb +34 -0
  77. data/spec/germinate/process_spec.rb +105 -0
  78. data/spec/germinate/publisher_spec.rb +130 -0
  79. data/spec/germinate/reader_spec.rb +385 -0
  80. data/spec/germinate/selector_spec.rb +121 -0
  81. data/spec/germinate/shell_publisher_spec.rb +61 -0
  82. data/spec/germinate/source_file_spec.rb +99 -0
  83. data/spec/germinate/text_hunk_spec.rb +98 -0
  84. data/spec/germinate/text_transforms_spec.rb +242 -0
  85. data/spec/germinate/transform_process_spec.rb +50 -0
  86. data/spec/germinate/variable_spec.rb +14 -0
  87. data/spec/germinate_spec.rb +8 -0
  88. data/spec/spec.opts +1 -0
  89. data/spec/spec_helper.rb +16 -0
  90. data/tasks/ann.rake +80 -0
  91. data/tasks/bones.rake +20 -0
  92. data/tasks/cucumber.rake +5 -0
  93. data/tasks/gem.rake +201 -0
  94. data/tasks/git.rake +40 -0
  95. data/tasks/notes.rake +27 -0
  96. data/tasks/post_load.rake +34 -0
  97. data/tasks/rdoc.rake +51 -0
  98. data/tasks/rubyforge.rake +55 -0
  99. data/tasks/setup.rb +292 -0
  100. data/tasks/spec.rake +54 -0
  101. data/tasks/svn.rake +47 -0
  102. data/tasks/test.rake +40 -0
  103. data/tasks/zentest.rake +36 -0
  104. data/test/test_germinate.rb +0 -0
  105. metadata +228 -0
@@ -0,0 +1,5 @@
1
+ Feature: author updates article source
2
+
3
+ As an author
4
+ I want to push changes to article source code
5
+ So that other programmers will see the latest version
@@ -0,0 +1,52 @@
1
+ Note: this is a debug feature and its not worth specifying until it gets a bit
2
+ more stable.
3
+ Feature: author views information
4
+
5
+ As an author
6
+ I want to view the components of my article
7
+ So that I can diagnose errors in output
8
+
9
+ Scenario: list stuff
10
+ Given an article with the contents:
11
+ """
12
+ # :TEXT:
13
+ # Anonymous section 1
14
+
15
+ anonymous code 1
16
+ # :END:
17
+
18
+ anonymous code 2
19
+
20
+ # :TEXT: A
21
+ # Section A
22
+
23
+ # :SAMPLE: X
24
+ code sample X
25
+
26
+ # :PROCESS: frob, "aaa"
27
+ # :PROCESS: munge, "bbb"
28
+ """
29
+ When I run the command "germ show --section=SECTION1" on the article
30
+ Then the output should be as follows:
31
+ """
32
+ # Anonymous section 1
33
+
34
+ Insertion[@SECTION1]
35
+ """
36
+ When I run the command "germ show --section=A" on the article
37
+ Then the output should be as follows:
38
+ """
39
+ # Section A
40
+
41
+ """
42
+ When I run the command "germ show --sample=X" on the article
43
+ Then the output should be as follows:
44
+ """
45
+ code sample X
46
+
47
+ """
48
+ When I run the command "germ show --process=munge" on the article
49
+ Then the output should be as follows:
50
+ """
51
+ bbb
52
+ """
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ File.open(ARGV[0]) do |file|
3
+ file.each_line do |line|
4
+ puts "> #{line.chomp}"
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ $stdin.readlines.sort.each do |line|
3
+ puts line
4
+ end
@@ -0,0 +1,27 @@
1
+ # :BRACKET_CODE: "[", "]"
2
+
3
+ # :SAMPLE: main
4
+ def main
5
+ hello
6
+ end
7
+
8
+ # :SAMPLE: hello, { brackets: [ "{", "}" ] }
9
+ def hello
10
+ puts "hello"
11
+ end
12
+
13
+ # :TEXT:
14
+ # Should have square brackets
15
+ # :INSERT: @main
16
+
17
+ # :TEXT:
18
+ # Should have curly brackets
19
+ # :INSERT: @hello
20
+
21
+ # :TEXT:
22
+ # Should have curly brackets
23
+ # :INSERT: @hello:2
24
+
25
+ # :TEXT:
26
+ # Should have angle brackets
27
+ # :INSERT: @hello:2, { brackets: [ "<", ">" ] }
@@ -0,0 +1,13 @@
1
+ # What if you want to write about Germinate in Germinate? Escaping is the key.
2
+
3
+ # :TEXT:
4
+ # Here are some Germinate directives
5
+ # \:TEXT:
6
+ # \:SAMPLE:
7
+ # \:INSERT:
8
+ # You get the idea.
9
+
10
+ # It works in code too:
11
+
12
+ # :SAMPLE:
13
+ # \:PROCESS: foo, bar
@@ -0,0 +1,16 @@
1
+ # We can excerpt the output of a command instead of running the command on an
2
+ # excerpt.
3
+ # :PROCESS: ruby, "ruby %f"
4
+ # :SAMPLE:
5
+
6
+ puts "-" * 3
7
+ puts "line 1"
8
+ puts "-" * 5
9
+
10
+ puts "=" * 3
11
+ puts "line 2"
12
+ puts "=" * 5
13
+
14
+ # :TEXT:
15
+ # :INSERT: $SOURCE|ruby:/===/../=====/
16
+ # :INSERT: $SOURCE|ruby:/---/../-----/
@@ -0,0 +1,9 @@
1
+ # A hello, world demo for Germinate
2
+ # This section should not appear in the output
3
+
4
+ # :TEXT:
5
+ # Hello, world!
6
+ # :CUT:
7
+
8
+ def ignore_me
9
+ end
@@ -0,0 +1,25 @@
1
+ # A %f will be replaced with a path to a temporary file
2
+ # :PROCESS: quote, "quoter %f"
3
+ #
4
+ # If there is no %f the content will be piped into the command on STDIN
5
+ # :PROCESS: sort, "sorter"
6
+
7
+ # :SAMPLE: names
8
+ joe
9
+ sally
10
+ aaron
11
+ george
12
+ zack
13
+ susan
14
+ # :TEXT:
15
+ # Sorting the sample:
16
+ # :INSERT: @names|sort
17
+ #
18
+ # Quoting the sample:
19
+ # :INSERT: @names|quote
20
+ #
21
+ # We can combine pipelines with excerpting:
22
+ # :INSERT: @names:2..4|quote
23
+ #
24
+ # And we can chain processes to form a true pipeline:
25
+ # :INSERT: @names|sort|quote
@@ -0,0 +1,24 @@
1
+ # :SAMPLE: A
2
+
3
+ def foo
4
+ # ...
5
+ end
6
+
7
+ def bar
8
+ # ...
9
+ end
10
+
11
+ class Frob
12
+ # ...
13
+ end
14
+
15
+ # :TEXT:
16
+ # We can select code by regexp
17
+ # :INSERT: @A:/foo/../end/
18
+ #
19
+ # Or with a regex and a length
20
+ # :INSERT: @A:/bar/,7
21
+ #
22
+ # Ending offset can be exclusive
23
+ # :INSERT: @A:/foo/.../Frob/
24
+
@@ -0,0 +1,18 @@
1
+ # :SAMPLE: A
2
+ a_line_1 = 1
3
+ a_line_2 = 2
4
+ a_line_3 = 3
5
+ a_line_4 = 4
6
+
7
+ # :TEXT:
8
+ # We can specify a starting offset:
9
+ # :INSERT: @A:2
10
+ #
11
+ # And an ending offset
12
+ # :INSERT: @A:2..3
13
+ #
14
+ # Ending offset can be exclusive
15
+ # :INSERT: @A:1...3
16
+ #
17
+ # We can specify offset and count instead
18
+ # :INSERT: @A:2,3
@@ -0,0 +1,19 @@
1
+ # :SAMPLE: A
2
+ a_line_1 = 1
3
+ a_line_2 = 2
4
+ a_line_3 = 3
5
+ a_line_4 = 4
6
+
7
+ # :SAMPLE: B
8
+ b_line_1 = 1
9
+ b_line_2 = 2
10
+
11
+ # :TEXT:
12
+ # We can paste in all the code:
13
+ # :INSERT: $CODE, { disable_transforms: true }
14
+ #
15
+ # Or all the text:
16
+ # :INSERT: $TEXT, { disable_transforms: true }
17
+ #
18
+ # Or the entire source file
19
+ # :INSERT: $SOURCE, { disable_transforms: true }
@@ -0,0 +1,10 @@
1
+ # We can capture both STDOUT and STDERR by using shell modifiers
2
+ # :PROCESS: ruby, "ruby %f 2>&1"
3
+ # :SAMPLE: output
4
+ $stdout.sync = true
5
+ $stdout.puts "Hello, STDOUT"
6
+ $stderr.puts "Hello, STDERR"
7
+ $stdout.puts "Hello again, STDOUT"
8
+
9
+ # :TEXT:
10
+ # :INSERT: $SOURCE|ruby
@@ -0,0 +1,8 @@
1
+ # An example of text-wrappeing
2
+ #
3
+ # :TEXT:
4
+ # 'Twas brillig and the slithy toves
5
+ # Did gyre and gimbal in the wabe
6
+ #
7
+ # All mimsy were the borogroves
8
+ # And the momeraths outgrabe
@@ -0,0 +1,23 @@
1
+ Should have square brackets
2
+ [
3
+ def main
4
+ hello
5
+ end
6
+ ]
7
+
8
+ Should have curly brackets
9
+ {
10
+ def hello
11
+ puts "hello"
12
+ end
13
+ }
14
+
15
+ Should have curly brackets
16
+ {
17
+ puts "hello"
18
+ }
19
+
20
+ Should have angle brackets
21
+ <
22
+ puts "hello"
23
+ >
@@ -0,0 +1,186 @@
1
+ Hi there! Here's a Hello, World method:
2
+
3
+ def hello
4
+ puts "Hello, World!"
5
+ end
6
+
7
+ The immediately following code sample can be implicitly referenced:
8
+
9
+ def nameless
10
+ puts "I have no name"
11
+ end
12
+
13
+ Or explicitly referenced
14
+
15
+ def foo
16
+ puts "foo"
17
+ end
18
+
19
+ Samples can be referenced by name
20
+
21
+ def fred
22
+ # This comment is part of the sample
23
+ puts "Hello, my name is Fred"
24
+ puts "la la la"
25
+ end
26
+
27
+ Or by index:
28
+
29
+ def boring
30
+ 1 + 1
31
+ end
32
+
33
+ SOURCE is a special sample which contains this entire source file.
34
+
35
+ # This example demonstrates the use of code samples.
36
+
37
+ # :TEXT:
38
+ # Hi there! Here's a Hello, World method:
39
+
40
+ def hello
41
+ puts "Hello, World!"
42
+ end
43
+
44
+ # :CUT:
45
+ # Here's some boring support code we don't want to show the world.
46
+
47
+ def boring
48
+ 1 + 1
49
+ end
50
+
51
+ # Here are two a named samples:
52
+ # :SAMPLE: fred
53
+
54
+ def fred
55
+ # This comment is part of the sample
56
+ puts "Hello, my name is Fred"
57
+ puts "la la la"
58
+ end
59
+
60
+ # :SAMPLE: sally
61
+
62
+ def sally
63
+ puts "Hello, my name is Sally"
64
+ end
65
+
66
+ # :END:
67
+ # Sample "sally" ends above, and does not include the following.
68
+
69
+ def wizard
70
+ puts "Pay no attention to the man behind the curtain!"
71
+ end
72
+
73
+ # Samples can be inside comment blocks
74
+ # :SAMPLE: george
75
+ # (defun george () (format "Hello from George"))
76
+ # :CUT:
77
+
78
+ # Samples can have comment markers stripped
79
+ # :SAMPLE: mary, { uncomment: true }
80
+ # (defun mary () (format "Hello from Mary"))
81
+ # :CUT:
82
+
83
+ # :TEXT:
84
+ # The immediately following code sample can be implicitly referenced:
85
+ # :INSERT:
86
+ # :CUT:
87
+ def nameless
88
+ puts "I have no name"
89
+ end
90
+
91
+ # :TEXT:
92
+ # Or explicitly referenced
93
+ # :INSERT: FOLLOWING
94
+ # :CUT:
95
+ def foo
96
+ puts "foo"
97
+ end
98
+
99
+ # :TEXT:
100
+ # Samples can be referenced by name
101
+ # :INSERT: fred
102
+ #
103
+ # Or by index:
104
+ # :INSERT: #2
105
+ #
106
+ # SOURCE is a special sample which contains this entire source file.
107
+ # :INSERT: SOURCE, { indent: 4 }
108
+ #
109
+ # CODE is a special sample which contains all the non-text portions of this
110
+ # file.
111
+ # :INSERT: CODE, { indent: " > " }
112
+ #
113
+ # We can select specific lines:
114
+ # :INSERT: sally:2
115
+ #
116
+ # Or ranges of lines:
117
+ # :INSERT: sally:2..3
118
+ #
119
+ # Or lines matching a regex:
120
+ # :INSERT: sally:/def/
121
+ #
122
+ # Or ranges of regexen:
123
+ # :INSERT: fred:/puts/.../end/
124
+
125
+ CODE is a special sample which contains all the non-text portions of this file.
126
+
127
+ > # This example demonstrates the use of code samples.
128
+ >
129
+ > def hello
130
+ > puts "Hello, World!"
131
+ > end
132
+ >
133
+ > # Here's some boring support code we don't want to show the world.
134
+ >
135
+ > def boring
136
+ > 1 + 1
137
+ > end
138
+ >
139
+ > # Here are two a named samples:
140
+ >
141
+ > def fred
142
+ > # This comment is part of the sample
143
+ > puts "Hello, my name is Fred"
144
+ > puts "la la la"
145
+ > end
146
+ >
147
+ > def sally
148
+ > puts "Hello, my name is Sally"
149
+ > end
150
+ >
151
+ > # Sample "sally" ends above, and does not include the following.
152
+ >
153
+ > def wizard
154
+ > puts "Pay no attention to the man behind the curtain!"
155
+ > end
156
+ >
157
+ > # Samples can be inside comment blocks
158
+ >
159
+ > # Samples can have comment markers stripped
160
+ >
161
+ > def nameless
162
+ > puts "I have no name"
163
+ > end
164
+ >
165
+ > def foo
166
+ > puts "foo"
167
+ > end
168
+
169
+ We can select specific lines:
170
+
171
+ puts "Hello, my name is Sally"
172
+
173
+ Or ranges of lines:
174
+
175
+ puts "Hello, my name is Sally"
176
+ end
177
+
178
+ Or lines matching a regex:
179
+
180
+ def sally
181
+
182
+ # Or ranges of regexen:
183
+
184
+ puts "Hello, my name is Fred"
185
+ puts "la la la"
186
+