devver-germinate 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/features/author-formats-article.feature +1 -0
- data/features/example_articles/bracketing.rb +27 -0
- data/features/example_output/bracketing.out +23 -0
- data/germinate.gemspec +2 -2
- data/lib/germinate.rb +1 -1
- data/lib/germinate/hunk.rb +1 -7
- data/lib/germinate/insertion.rb +8 -2
- data/lib/germinate/librarian.rb +2 -2
- data/lib/germinate/reader.rb +13 -4
- data/lib/germinate/shared_style_attributes.rb +16 -3
- data/spec/germinate/implicit_insertion_spec.rb +1 -1
- data/spec/germinate/insertion_spec.rb +2 -2
- data/spec/germinate/librarian_spec.rb +5 -1
- data/spec/germinate/reader_spec.rb +20 -2
- metadata +3 -2
- data/features/example_articles/code_samples.rb +0 -89
@@ -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,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
|
+
>
|
data/germinate.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{germinate}
|
5
|
-
s.version = "1.0.
|
5
|
+
s.version = "1.0.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Avdi Grimm"]
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.email = %q{avdi@avdi.org}
|
13
13
|
s.executables = ["germ"]
|
14
14
|
s.extra_rdoc_files = ["History.txt", "README.rdoc", "bin/germ"]
|
15
|
-
s.files = [".gitignore", "History.txt", "README.rdoc", "Rakefile", "bin/germ", "cucumber.yml", "examples/basic.rb", "examples/short.rb", "features/author-formats-article.feature", "features/author-lists-info.feature", "features/author-publishes-article-source.feature", "features/author-publishes-article.feature", "features/author-republishes-article.feature", "features/author-selects-hunks.feature", "features/author-updates-article-source.feature", "features/author-views-stuff.feature", "features/bin/quoter", "features/bin/sorter", "features/example_articles/
|
15
|
+
s.files = [".gitignore", "History.txt", "README.rdoc", "Rakefile", "bin/germ", "cucumber.yml", "examples/basic.rb", "examples/short.rb", "features/author-formats-article.feature", "features/author-lists-info.feature", "features/author-publishes-article-source.feature", "features/author-publishes-article.feature", "features/author-republishes-article.feature", "features/author-selects-hunks.feature", "features/author-updates-article-source.feature", "features/author-views-stuff.feature", "features/bin/quoter", "features/bin/sorter", "features/example_articles/bracketing.rb", "features/example_articles/escaping.txt", "features/example_articles/hello.rb", "features/example_articles/pipelines.txt", "features/example_articles/regexen.rb", "features/example_articles/sample_offsets.rb", "features/example_articles/specials.rb", "features/example_articles/wrapping.rb", "features/example_output/bracketing.out", "features/example_output/code_samples.txt", "features/example_output/escaping.out", "features/example_output/hello.txt", "features/example_output/pipelines.out", "features/example_output/regexen.txt", "features/example_output/sample_offsets.txt", "features/example_output/specials.txt", "features/example_output/wrapping.txt", "features/step_definitions/germinate.rb", "features/support/env.rb", "germinate.gemspec", "lib/germinate.rb", "lib/germinate/application.rb", "lib/germinate/article_editor.rb", "lib/germinate/article_formatter.rb", "lib/germinate/formatter.rb", "lib/germinate/hunk.rb", "lib/germinate/implicit_insertion.rb", "lib/germinate/insertion.rb", "lib/germinate/librarian.rb", "lib/germinate/pipeline.rb", "lib/germinate/process.rb", "lib/germinate/reader.rb", "lib/germinate/selector.rb", "lib/germinate/shared_style_attributes.rb", "lib/germinate/text_transforms.rb", "spec/germinate/application_spec.rb", "spec/germinate/article_editor_spec.rb", "spec/germinate/article_formatter_spec.rb", "spec/germinate/code_hunk_spec.rb", "spec/germinate/formatter_spec.rb", "spec/germinate/hunk_spec.rb", "spec/germinate/implicit_insertion_spec.rb", "spec/germinate/insertion_spec.rb", "spec/germinate/librarian_spec.rb", "spec/germinate/pipeline_spec.rb", "spec/germinate/process_spec.rb", "spec/germinate/reader_spec.rb", "spec/germinate/selector_spec.rb", "spec/germinate/text_hunk_spec.rb", "spec/germinate/text_transforms_spec.rb", "spec/germinate_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/ann.rake", "tasks/bones.rake", "tasks/cucumber.rake", "tasks/gem.rake", "tasks/git.rake", "tasks/notes.rake", "tasks/post_load.rake", "tasks/rdoc.rake", "tasks/rubyforge.rake", "tasks/setup.rb", "tasks/spec.rake", "tasks/svn.rake", "tasks/test.rake", "tasks/zentest.rake", "test/test_germinate.rb"]
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.homepage = %q{http://github.com/devver/germinate/}
|
18
18
|
s.rdoc_options = ["--main", "README.rdoc"]
|
data/lib/germinate.rb
CHANGED
data/lib/germinate/hunk.rb
CHANGED
@@ -11,13 +11,7 @@ class Germinate::Hunk < ::Array
|
|
11
11
|
|
12
12
|
def initialize(contents=[], template = {})
|
13
13
|
super(contents)
|
14
|
-
|
15
|
-
copy_shared_style_attrubutes_from(template)
|
16
|
-
else
|
17
|
-
template.each_pair do |key, value|
|
18
|
-
send(key, value)
|
19
|
-
end
|
20
|
-
end
|
14
|
+
copy_shared_style_attrubutes_from(template)
|
21
15
|
end
|
22
16
|
|
23
17
|
# return a copy with leading and trailing whitespace lines removed
|
data/lib/germinate/insertion.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
require 'fattr'
|
2
|
+
require File.expand_path("shared_style_attributes", File.dirname(__FILE__))
|
2
3
|
|
3
4
|
class Germinate::Insertion
|
5
|
+
include Germinate::SharedStyleAttributes
|
6
|
+
|
4
7
|
attr_reader :library
|
5
8
|
attr_reader :selector
|
6
9
|
|
7
|
-
def initialize(selector, library)
|
10
|
+
def initialize(selector, library, template={})
|
11
|
+
copy_shared_style_attrubutes_from(template)
|
8
12
|
@selector = selector
|
9
13
|
@library = library
|
10
14
|
end
|
11
15
|
|
12
16
|
def resolve
|
13
|
-
library[selector]
|
17
|
+
returning(library[selector]) do |hunk|
|
18
|
+
hunk.copy_shared_style_attrubutes_from(self, false)
|
19
|
+
end
|
14
20
|
end
|
15
21
|
end
|
data/lib/germinate/librarian.rb
CHANGED
@@ -50,8 +50,8 @@ class Germinate::Librarian
|
|
50
50
|
@samples[sample] << line
|
51
51
|
end
|
52
52
|
|
53
|
-
def add_insertion!(section, selector)
|
54
|
-
insertion = Germinate::Insertion.new(selector, self)
|
53
|
+
def add_insertion!(section, selector, attributes)
|
54
|
+
insertion = Germinate::Insertion.new(selector, self, attributes)
|
55
55
|
@sections[section] << insertion
|
56
56
|
end
|
57
57
|
|
data/lib/germinate/reader.rb
CHANGED
@@ -153,8 +153,7 @@ class Germinate::Reader
|
|
153
153
|
self.sample_name = sample_name || automatic_section_name
|
154
154
|
librarian.set_code_attributes!(
|
155
155
|
sample_name,
|
156
|
-
|
157
|
-
:code_close_bracket => options.fetch("brackets", []).last)
|
156
|
+
options_to_style_attributes(options))
|
158
157
|
code!
|
159
158
|
end
|
160
159
|
|
@@ -163,10 +162,11 @@ class Germinate::Reader
|
|
163
162
|
librarian.code_close_bracket = close_bracket
|
164
163
|
end
|
165
164
|
|
166
|
-
def insert_control_line!(selector=nil)
|
165
|
+
def insert_control_line!(selector=nil, options={})
|
167
166
|
librarian.add_insertion!(
|
168
167
|
current_section,
|
169
|
-
Germinate::Selector.new(selector, current_section)
|
168
|
+
Germinate::Selector.new(selector, current_section),
|
169
|
+
options_to_style_attributes(options))
|
170
170
|
end
|
171
171
|
|
172
172
|
def process_control_line!(process_name, command)
|
@@ -209,4 +209,13 @@ class Germinate::Reader
|
|
209
209
|
def unescape(line)
|
210
210
|
line.sub(/\\(:[A-Z0-9_]+:)/, '\1')
|
211
211
|
end
|
212
|
+
|
213
|
+
def options_to_style_attributes(options)
|
214
|
+
returning({}) do |attributes|
|
215
|
+
if options.key?("brackets")
|
216
|
+
attributes[:code_open_bracket] = options.fetch("brackets").first
|
217
|
+
attributes[:code_close_bracket] = options.fetch("brackets").last
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
212
221
|
end
|
@@ -15,9 +15,22 @@ module Germinate::SharedStyleAttributes
|
|
15
15
|
}
|
16
16
|
end
|
17
17
|
|
18
|
-
def copy_shared_style_attrubutes_from(other)
|
19
|
-
other
|
20
|
-
|
18
|
+
def copy_shared_style_attrubutes_from(other, override=true)
|
19
|
+
case other
|
20
|
+
when Germinate::SharedStyleAttributes
|
21
|
+
copy_attributes!(other.shared_style_attributes)
|
22
|
+
when Hash
|
23
|
+
copy_attributes!(other, override)
|
24
|
+
else
|
25
|
+
raise "Don't know how to copy attributes from #{other.inspect}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def copy_attributes!(attributes, override=true)
|
30
|
+
attributes.each_pair do |key, value|
|
31
|
+
if !value.nil? && (override || !send(key))
|
32
|
+
self.send(key, value)
|
33
|
+
end
|
21
34
|
end
|
22
35
|
end
|
23
36
|
end
|
@@ -4,7 +4,7 @@ require File.expand_path(
|
|
4
4
|
module Germinate
|
5
5
|
describe ImplicitInsertion do
|
6
6
|
before :each do
|
7
|
-
@hunk = stub("Hunk")
|
7
|
+
@hunk = stub("Hunk").as_null_object
|
8
8
|
@library = stub("Library")
|
9
9
|
@selector = stub("Selector")
|
10
10
|
@it = Germinate::ImplicitInsertion.new(@selector, @library)
|
@@ -4,10 +4,10 @@ require File.expand_path(
|
|
4
4
|
module Germinate
|
5
5
|
describe Insertion, "given a library and a selector" do
|
6
6
|
before :each do
|
7
|
-
@hunk = stub("Hunk")
|
7
|
+
@hunk = stub("Hunk").as_null_object
|
8
8
|
@library = stub("Library", :[] => @hunk)
|
9
9
|
@selector = stub("Selector")
|
10
|
-
@it = Germinate::Insertion.new(@selector, @library)
|
10
|
+
@it = Germinate::Insertion.new(@selector, @library, {})
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should use the library to resolve itself" do
|
@@ -83,7 +83,7 @@ module Germinate
|
|
83
83
|
|
84
84
|
context "given an insertion in my_section with selector @my_selector" do
|
85
85
|
before :each do
|
86
|
-
@it.add_insertion!("my_section", "@my_selector")
|
86
|
+
@it.add_insertion!("my_section", "@my_selector", { :comment_prefix => "@" })
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should add an Insertion to the named section" do
|
@@ -97,6 +97,10 @@ module Germinate
|
|
97
97
|
it "should give the insertion a reference to the library" do
|
98
98
|
@it.section("my_section").last.library.should == @it
|
99
99
|
end
|
100
|
+
|
101
|
+
it "should apply any passed attributes to the insertion" do
|
102
|
+
@it.section("my_section").last.comment_prefix.should == "@"
|
103
|
+
end
|
100
104
|
end
|
101
105
|
|
102
106
|
context "given a process to file" do
|
@@ -277,12 +277,13 @@ module Germinate
|
|
277
277
|
end
|
278
278
|
|
279
279
|
it "should add an insertion to the current section" do
|
280
|
-
@librarian.should_receive(:add_insertion!).
|
280
|
+
@librarian.should_receive(:add_insertion!).
|
281
|
+
with("mysection", anything, anything)
|
281
282
|
@it << @line
|
282
283
|
end
|
283
284
|
|
284
285
|
it "should pass a selector object to the librarian" do
|
285
|
-
@librarian.should_receive(:add_insertion!) do |section, selector|
|
286
|
+
@librarian.should_receive(:add_insertion!) do |section, selector, options|
|
286
287
|
selector.should be_a_kind_of(Selector)
|
287
288
|
selector.string.should == "foo"
|
288
289
|
selector.default_key.should == "mysection"
|
@@ -291,6 +292,23 @@ module Germinate
|
|
291
292
|
end
|
292
293
|
end
|
293
294
|
|
295
|
+
context "given an insertion with custom attributes" do
|
296
|
+
before :each do
|
297
|
+
@it << ":TEXT: mysection"
|
298
|
+
@line = ":INSERT: foo, { brackets: ['<<', '>>'] } "
|
299
|
+
end
|
300
|
+
|
301
|
+
it "should pass the attributes on to the library" do
|
302
|
+
@librarian.should_receive(:add_insertion!).
|
303
|
+
with(anything, anything, {
|
304
|
+
:code_open_bracket => "<<",
|
305
|
+
:code_close_bracket => ">>"
|
306
|
+
})
|
307
|
+
@it << @line
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
|
294
312
|
context "given a process directive" do
|
295
313
|
before :each do
|
296
314
|
@line = ' # :PROCESS: sortail, "sort | tail"'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devver-germinate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Avdi Grimm
|
@@ -111,7 +111,7 @@ files:
|
|
111
111
|
- features/author-views-stuff.feature
|
112
112
|
- features/bin/quoter
|
113
113
|
- features/bin/sorter
|
114
|
-
- features/example_articles/
|
114
|
+
- features/example_articles/bracketing.rb
|
115
115
|
- features/example_articles/escaping.txt
|
116
116
|
- features/example_articles/hello.rb
|
117
117
|
- features/example_articles/pipelines.txt
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- features/example_articles/sample_offsets.rb
|
120
120
|
- features/example_articles/specials.rb
|
121
121
|
- features/example_articles/wrapping.rb
|
122
|
+
- features/example_output/bracketing.out
|
122
123
|
- features/example_output/code_samples.txt
|
123
124
|
- features/example_output/escaping.out
|
124
125
|
- features/example_output/hello.txt
|
@@ -1,89 +0,0 @@
|
|
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/
|