devver-germinate 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/History.txt +4 -0
- data/README.rdoc +132 -0
- data/Rakefile +43 -0
- data/bin/germ +133 -0
- data/cucumber.yml +2 -0
- data/examples/basic.rb +118 -0
- data/examples/short.rb +17 -0
- data/features/author-formats-article.feature +108 -0
- data/features/author-lists-info.feature +45 -0
- data/features/author-publishes-article-source.feature +5 -0
- data/features/author-publishes-article.feature +5 -0
- data/features/author-republishes-article.feature +5 -0
- data/features/author-selects-hunks.feature +26 -0
- data/features/author-updates-article-source.feature +5 -0
- data/features/author-views-stuff.feature +48 -0
- data/features/bin/quoter +6 -0
- data/features/bin/sorter +4 -0
- data/features/example_articles/code_samples.rb +89 -0
- data/features/example_articles/escaping.txt +12 -0
- data/features/example_articles/hello.rb +9 -0
- data/features/example_articles/pipelines.txt +25 -0
- data/features/example_articles/regexen.rb +24 -0
- data/features/example_articles/sample_offsets.rb +18 -0
- data/features/example_articles/specials.rb +19 -0
- data/features/example_articles/wrapping.rb +8 -0
- data/features/example_output/code_samples.txt +186 -0
- data/features/example_output/escaping.out +5 -0
- data/features/example_output/hello.txt +1 -0
- data/features/example_output/pipelines.out +28 -0
- data/features/example_output/regexen.txt +22 -0
- data/features/example_output/sample_offsets.txt +15 -0
- data/features/example_output/specials.txt +36 -0
- data/features/example_output/wrapping.txt +3 -0
- data/features/step_definitions/germinate.rb +30 -0
- data/features/support/env.rb +18 -0
- data/germinate.gemspec +55 -0
- data/lib/germinate.rb +54 -0
- data/lib/germinate/application.rb +62 -0
- data/lib/germinate/article_editor.rb +20 -0
- data/lib/germinate/article_formatter.rb +75 -0
- data/lib/germinate/formatter.rb +119 -0
- data/lib/germinate/hunk.rb +149 -0
- data/lib/germinate/implicit_insertion.rb +9 -0
- data/lib/germinate/insertion.rb +15 -0
- data/lib/germinate/librarian.rb +179 -0
- data/lib/germinate/pipeline.rb +11 -0
- data/lib/germinate/process.rb +67 -0
- data/lib/germinate/reader.rb +212 -0
- data/lib/germinate/selector.rb +95 -0
- data/lib/germinate/shared_style_attributes.rb +23 -0
- data/lib/germinate/text_transforms.rb +90 -0
- data/spec/germinate/application_spec.rb +14 -0
- data/spec/germinate/article_editor_spec.rb +97 -0
- data/spec/germinate/article_formatter_spec.rb +153 -0
- data/spec/germinate/code_hunk_spec.rb +45 -0
- data/spec/germinate/formatter_spec.rb +160 -0
- data/spec/germinate/hunk_spec.rb +77 -0
- data/spec/germinate/implicit_insertion_spec.rb +33 -0
- data/spec/germinate/insertion_spec.rb +18 -0
- data/spec/germinate/librarian_spec.rb +336 -0
- data/spec/germinate/pipeline_spec.rb +24 -0
- data/spec/germinate/process_spec.rb +64 -0
- data/spec/germinate/reader_spec.rb +306 -0
- data/spec/germinate/selector_spec.rb +65 -0
- data/spec/germinate/text_hunk_spec.rb +53 -0
- data/spec/germinate/text_transforms_spec.rb +154 -0
- data/spec/germinate_spec.rb +8 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +16 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/cucumber.rake +5 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +51 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/tasks/zentest.rake +36 -0
- data/test/test_germinate.rb +0 -0
- metadata +209 -0
@@ -0,0 +1,108 @@
|
|
1
|
+
Feature: author formats article
|
2
|
+
|
3
|
+
As an author
|
4
|
+
I want to format my articles
|
5
|
+
So that they can be published
|
6
|
+
|
7
|
+
Scenario: format text followed by code
|
8
|
+
Given an article with the contents:
|
9
|
+
"""
|
10
|
+
# :TEXT:
|
11
|
+
# This is my article
|
12
|
+
|
13
|
+
this is my code
|
14
|
+
"""
|
15
|
+
When I run the format command on the article
|
16
|
+
Then the output should be as follows:
|
17
|
+
"""
|
18
|
+
This is my article
|
19
|
+
|
20
|
+
this is my code
|
21
|
+
"""
|
22
|
+
|
23
|
+
Scenario: format code with bracketing
|
24
|
+
Given an article with the contents:
|
25
|
+
"""
|
26
|
+
# :BRACKET_CODE: "<pre>", "</pre>"
|
27
|
+
# :TEXT:
|
28
|
+
# This is my article
|
29
|
+
|
30
|
+
this is my code
|
31
|
+
"""
|
32
|
+
When I run the format command on the article
|
33
|
+
Then the output should be as follows:
|
34
|
+
"""
|
35
|
+
This is my article
|
36
|
+
|
37
|
+
<pre>
|
38
|
+
this is my code
|
39
|
+
</pre>
|
40
|
+
"""
|
41
|
+
|
42
|
+
Scenario: override default bracketing
|
43
|
+
Given an article with the contents:
|
44
|
+
"""
|
45
|
+
# :BRACKET_CODE: "<pre>", "</pre>"
|
46
|
+
# :TEXT: SECTION1
|
47
|
+
# This is my article
|
48
|
+
|
49
|
+
# :SAMPLE: SECTION1, { brackets: [ '[code]', '[/code]' ] }
|
50
|
+
this is my code
|
51
|
+
"""
|
52
|
+
When I run the format command on the article
|
53
|
+
Then the output should be as follows:
|
54
|
+
"""
|
55
|
+
This is my article
|
56
|
+
|
57
|
+
[code]
|
58
|
+
this is my code
|
59
|
+
[/code]
|
60
|
+
"""
|
61
|
+
|
62
|
+
Scenario: insert a named section
|
63
|
+
Given an article with the contents:
|
64
|
+
"""
|
65
|
+
# :BRACKET_CODE: "<pre>", "</pre>"
|
66
|
+
|
67
|
+
# :SAMPLE: sample1
|
68
|
+
code sample 1
|
69
|
+
|
70
|
+
# :SAMPLE: sample2
|
71
|
+
code sample 2
|
72
|
+
|
73
|
+
# :TEXT:
|
74
|
+
# Here is example 2:
|
75
|
+
# :INSERT: @sample2
|
76
|
+
#
|
77
|
+
# And here is example 1:
|
78
|
+
# :INSERT: @sample1
|
79
|
+
"""
|
80
|
+
When I run the format command on the article
|
81
|
+
Then the output should be as follows:
|
82
|
+
"""
|
83
|
+
Here is example 2:
|
84
|
+
<pre>
|
85
|
+
code sample 2
|
86
|
+
</pre>
|
87
|
+
|
88
|
+
And here is example 1:
|
89
|
+
<pre>
|
90
|
+
code sample 1
|
91
|
+
</pre>
|
92
|
+
"""
|
93
|
+
|
94
|
+
Scenario Outline: more formatting examples
|
95
|
+
Given the article "<input_file>"
|
96
|
+
When I run the format command on the article
|
97
|
+
Then the output should look like "<output_file>"
|
98
|
+
|
99
|
+
Scenarios:
|
100
|
+
| input_file | output_file |
|
101
|
+
| hello.rb | hello.txt |
|
102
|
+
| wrapping.rb | wrapping.txt |
|
103
|
+
| sample_offsets.rb | sample_offsets.txt |
|
104
|
+
| specials.rb | specials.txt |
|
105
|
+
| regexen.rb | regexen.txt |
|
106
|
+
| pipelines.txt | pipelines.out |
|
107
|
+
| escaping.txt | escaping.out |
|
108
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Feature: author lists information
|
2
|
+
|
3
|
+
As an author
|
4
|
+
I want to list the various components of my article
|
5
|
+
So that I can diagnose errors in output
|
6
|
+
|
7
|
+
Scenario: list stuff
|
8
|
+
Given an article with the contents:
|
9
|
+
"""
|
10
|
+
# :TEXT:
|
11
|
+
# Anonymous section 1
|
12
|
+
|
13
|
+
anonymous code 1
|
14
|
+
# :END:
|
15
|
+
|
16
|
+
anonymous code 2
|
17
|
+
|
18
|
+
# :TEXT: A
|
19
|
+
# Section A
|
20
|
+
|
21
|
+
# :SAMPLE: X
|
22
|
+
code sample X
|
23
|
+
|
24
|
+
# :PROCESS: frob, "aaa"
|
25
|
+
# :PROCESS: munge, "bbb"
|
26
|
+
"""
|
27
|
+
When I run the command "germ list --sections" on the article
|
28
|
+
Then the output should be as follows:
|
29
|
+
"""
|
30
|
+
SECTION1
|
31
|
+
A
|
32
|
+
"""
|
33
|
+
When I run the command "germ list --samples" on the article
|
34
|
+
Then the output should be as follows:
|
35
|
+
"""
|
36
|
+
SECTION1
|
37
|
+
SECTION2
|
38
|
+
X
|
39
|
+
"""
|
40
|
+
When I run the command "germ list --processes" on the article
|
41
|
+
Then the output should be as follows:
|
42
|
+
"""
|
43
|
+
frob
|
44
|
+
munge
|
45
|
+
"""
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Feature: author experiments with selectors
|
2
|
+
|
3
|
+
As an author
|
4
|
+
I want to test the behavior of various selectors
|
5
|
+
So that I know what to use in my article
|
6
|
+
|
7
|
+
Scenario: list stuff
|
8
|
+
Given an article with the contents:
|
9
|
+
"""
|
10
|
+
# :TEXT: A
|
11
|
+
# Section A
|
12
|
+
|
13
|
+
# :SAMPLE: X
|
14
|
+
X 1
|
15
|
+
X 2
|
16
|
+
X 3
|
17
|
+
X 4
|
18
|
+
|
19
|
+
# :PROCESS: quote, "quoter %f"
|
20
|
+
"""
|
21
|
+
When I run the command "germ select --selector='@X:2..3|quote'" on the article
|
22
|
+
Then the output should be as follows:
|
23
|
+
"""
|
24
|
+
> X 2
|
25
|
+
> X 3
|
26
|
+
"""
|
@@ -0,0 +1,48 @@
|
|
1
|
+
Feature: author views information
|
2
|
+
|
3
|
+
As an author
|
4
|
+
I want to view the components of my article
|
5
|
+
So that I can diagnose errors in output
|
6
|
+
|
7
|
+
Scenario: list stuff
|
8
|
+
Given an article with the contents:
|
9
|
+
"""
|
10
|
+
# :TEXT:
|
11
|
+
# Anonymous section 1
|
12
|
+
|
13
|
+
anonymous code 1
|
14
|
+
# :END:
|
15
|
+
|
16
|
+
anonymous code 2
|
17
|
+
|
18
|
+
# :TEXT: A
|
19
|
+
# Section A
|
20
|
+
|
21
|
+
# :SAMPLE: X
|
22
|
+
code sample X
|
23
|
+
|
24
|
+
# :PROCESS: frob, "aaa"
|
25
|
+
# :PROCESS: munge, "bbb"
|
26
|
+
"""
|
27
|
+
When I run the command "germ show --section=SECTION1" on the article
|
28
|
+
Then the output should be as follows:
|
29
|
+
"""
|
30
|
+
# Anonymous section 1
|
31
|
+
"""
|
32
|
+
When I run the command "germ show --section=A" on the article
|
33
|
+
Then the output should be as follows:
|
34
|
+
"""
|
35
|
+
# Section A
|
36
|
+
|
37
|
+
"""
|
38
|
+
When I run the command "germ show --sample=X" on the article
|
39
|
+
Then the output should be as follows:
|
40
|
+
"""
|
41
|
+
code sample X
|
42
|
+
|
43
|
+
"""
|
44
|
+
When I run the command "germ show --process=munge" on the article
|
45
|
+
Then the output should be as follows:
|
46
|
+
"""
|
47
|
+
bbb
|
48
|
+
"""
|
data/features/bin/quoter
ADDED
data/features/bin/sorter
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# This example demonstrates the use of code samples.
|
2
|
+
|
3
|
+
# :TEXT:
|
4
|
+
# Hi there! Here's a Hello, World method:
|
5
|
+
|
6
|
+
def hello
|
7
|
+
puts "Hello, World!"
|
8
|
+
end
|
9
|
+
|
10
|
+
# :CUT:
|
11
|
+
# Here's some boring support code we don't want to show the world.
|
12
|
+
|
13
|
+
def boring
|
14
|
+
1 + 1
|
15
|
+
end
|
16
|
+
|
17
|
+
# Here are two a named samples:
|
18
|
+
# :SAMPLE: fred
|
19
|
+
|
20
|
+
def fred
|
21
|
+
# This comment is part of the sample
|
22
|
+
puts "Hello, my name is Fred"
|
23
|
+
puts "la la la"
|
24
|
+
end
|
25
|
+
|
26
|
+
# :SAMPLE: sally
|
27
|
+
|
28
|
+
def sally
|
29
|
+
puts "Hello, my name is Sally"
|
30
|
+
end
|
31
|
+
|
32
|
+
# :END:
|
33
|
+
# Sample "sally" ends above, and does not include the following.
|
34
|
+
|
35
|
+
def wizard
|
36
|
+
puts "Pay no attention to the man behind the curtain!"
|
37
|
+
end
|
38
|
+
|
39
|
+
# Samples can be inside comment blocks
|
40
|
+
# :SAMPLE: george
|
41
|
+
# (defun george () (format "Hello from George"))
|
42
|
+
# :CUT:
|
43
|
+
|
44
|
+
# Samples can have comment markers stripped
|
45
|
+
# :SAMPLE: mary, { uncomment: true }
|
46
|
+
# (defun mary () (format "Hello from Mary"))
|
47
|
+
# :CUT:
|
48
|
+
|
49
|
+
# :TEXT:
|
50
|
+
# The immediately following code sample can be implicitly referenced:
|
51
|
+
# :INSERT:
|
52
|
+
# :CUT:
|
53
|
+
def nameless
|
54
|
+
puts "I have no name"
|
55
|
+
end
|
56
|
+
|
57
|
+
# :TEXT:
|
58
|
+
# Or explicitly referenced
|
59
|
+
# :INSERT: FOLLOWING
|
60
|
+
# :CUT:
|
61
|
+
def foo
|
62
|
+
puts "foo"
|
63
|
+
end
|
64
|
+
|
65
|
+
# :TEXT:
|
66
|
+
# Samples can be referenced by name
|
67
|
+
# :INSERT: fred
|
68
|
+
#
|
69
|
+
# Or by index:
|
70
|
+
# :INSERT: #2
|
71
|
+
#
|
72
|
+
# SOURCE is a special sample which contains the entire source file.
|
73
|
+
# :INSERT: SOURCE, { indent: 4 }
|
74
|
+
#
|
75
|
+
# CODE is a special sample which contains all the non-text portions of this
|
76
|
+
# file.
|
77
|
+
# :INSERT: CODE, { indent: " > " }
|
78
|
+
#
|
79
|
+
# We can select specific lines:
|
80
|
+
# :INSERT: sally:2
|
81
|
+
#
|
82
|
+
# Or ranges of lines:
|
83
|
+
# :INSERT: sally:2..3
|
84
|
+
#
|
85
|
+
# Or lines matching a regex:
|
86
|
+
# :INSERT: sally:/def/
|
87
|
+
#
|
88
|
+
# Or ranges of regexen:
|
89
|
+
# :INSERT: fred:/puts/.../end/
|
@@ -0,0 +1,12 @@
|
|
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
|
+
# :SAMPLE:
|
12
|
+
# \:PROCESS: foo, bar
|
@@ -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
|