BuildMaster 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +26 -0
- data/lib/buildmaster.rb +2 -1
- data/lib/buildmaster/build_number_file.rb +27 -0
- data/lib/buildmaster/buildnumber +1 -0
- data/lib/buildmaster/file_processor.rb +114 -25
- data/lib/buildmaster/java_manifest.rb +4 -0
- data/lib/buildmaster/{site.rb → site/site.rb} +11 -46
- data/lib/buildmaster/site/template/buildmaster.css +340 -0
- data/lib/buildmaster/site/template/buildmaster_template.xml +130 -0
- data/lib/buildmaster/site/template_builder.rb +276 -0
- data/lib/buildmaster/site_server.rb +33 -0
- data/lib/buildmaster/site_spec.rb +74 -22
- data/lib/buildmaster/site_tester.rb +14 -2
- data/lib/buildmaster/source_content.rb +11 -0
- data/lib/buildmaster/source_file_handler.rb +7 -2
- data/lib/buildmaster/svn_driver.rb +23 -11
- data/lib/buildmaster/template_exception.rb +8 -0
- data/lib/buildmaster/template_runner.rb +19 -86
- data/lib/buildmaster/templatelets.rb +23 -0
- data/lib/buildmaster/templatelets/attribute.rb +16 -0
- data/lib/buildmaster/templatelets/each.rb +43 -0
- data/lib/buildmaster/templatelets/href.rb +39 -0
- data/lib/buildmaster/templatelets/include.rb +30 -0
- data/lib/buildmaster/templatelets/link.rb +41 -0
- data/lib/buildmaster/templatelets/text.rb +14 -0
- data/lib/buildmaster/templatelets/when.rb +24 -0
- data/lib/buildmaster/tree_to_object.rb +76 -0
- data/lib/buildmaster/xtemplate.rb +10 -11
- data/test/buildmaster/manifest.mf +1 -1
- data/test/buildmaster/{content → site/content}/index.html +0 -0
- data/test/buildmaster/site/content/markdown.markdown +0 -0
- data/test/buildmaster/site/content/textile.textile +0 -0
- data/test/buildmaster/{tc_site.rb → site/tc_site.rb} +1 -1
- data/test/buildmaster/site/tc_template_builder.rb +128 -0
- data/test/buildmaster/tc_build_number_file.rb +31 -0
- data/test/buildmaster/tc_file_processor.rb +81 -14
- data/test/buildmaster/tc_site_spec.rb +26 -42
- data/test/buildmaster/tc_source_file_handler.rb +55 -0
- data/test/buildmaster/tc_template_runner.rb +42 -1
- data/test/buildmaster/tc_tree_to_object.rb +120 -0
- data/test/buildmaster/tc_xtemplate.rb +13 -233
- data/test/buildmaster/templatelets/common_templatelet_test.rb +27 -0
- data/test/buildmaster/templatelets/tc_attribute.rb +57 -0
- data/test/buildmaster/templatelets/tc_each.rb +69 -0
- data/test/buildmaster/templatelets/tc_href.rb +48 -0
- data/test/buildmaster/templatelets/tc_include.rb +34 -0
- data/test/buildmaster/templatelets/tc_link.rb +70 -0
- data/test/buildmaster/templatelets/tc_text.rb +36 -0
- data/test/buildmaster/templatelets/tc_when.rb +59 -0
- data/test/buildmaster/ts_site.rb +4 -0
- data/test/buildmaster/ts_templatelets.rb +10 -0
- data/test/tmp/output/index.html +8 -0
- data/test/tmp/output/markdown.html +8 -0
- data/test/tmp/output/textile.html +8 -0
- data/test/ts_buildmaster.rb +15 -3
- metadata +102 -53
@@ -0,0 +1,27 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "..", "..", "lib")
|
2
|
+
|
3
|
+
require 'rexml/xpath'
|
4
|
+
require 'rexml/document'
|
5
|
+
require 'test/unit'
|
6
|
+
require 'buildmaster/site_spec'
|
7
|
+
require 'buildmaster/source_content'
|
8
|
+
require 'buildmaster/template_exception'
|
9
|
+
require 'buildmaster/templatelets'
|
10
|
+
|
11
|
+
module BuildMaster
|
12
|
+
class CommonTemplateletTest < Test::Unit::TestCase
|
13
|
+
def setup
|
14
|
+
@site_spec = SiteSpec.new
|
15
|
+
@site_spec.content_dir = '/tmp/workingdir/content'
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_element(name)
|
19
|
+
element = REXML::Element.new
|
20
|
+
element.name=name
|
21
|
+
return element
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_dummy
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'common_templatelet_test'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
|
6
|
+
|
7
|
+
require 'buildmaster/template_exception'
|
8
|
+
require 'buildmaster/templatelets/attribute'
|
9
|
+
|
10
|
+
module BuildMaster
|
11
|
+
class AttributeTest < CommonTemplateletTest
|
12
|
+
def test_should_set_attribute_based_on_evaluation
|
13
|
+
templatelet = Attribute.new(AttributeForTest.new(self))
|
14
|
+
target = create_element('a')
|
15
|
+
template_element = create_attribute_element('attr-name', 'expression')
|
16
|
+
expected_pathname = Pathname.new('/path')
|
17
|
+
@source_path = SourceContent.new(expected_pathname, nil)
|
18
|
+
templatelet.process(target, template_element, @source_path)
|
19
|
+
assert_equal('value', target.attributes['attr-name'])
|
20
|
+
assert_equal(expected_pathname, @path_logged)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_check_for_expression_responder
|
24
|
+
target = create_element('a')
|
25
|
+
template_element = create_attribute_element('name', 'eval')
|
26
|
+
source_path = SourceContent.new(Pathname.new('./'), create_element('name'))
|
27
|
+
begin
|
28
|
+
Attribute.new(self).process(target, template_element, source_path)
|
29
|
+
fail('template exception should have been thrown')
|
30
|
+
rescue TemplateException => e
|
31
|
+
assert_equal(true, e.message.include?('eval'))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_attribute_element(name, eval)
|
36
|
+
element = create_element('attribute')
|
37
|
+
element.attributes['name'] = name
|
38
|
+
element.attributes['eval'] = eval
|
39
|
+
return element
|
40
|
+
end
|
41
|
+
|
42
|
+
def expression_called_with(path)
|
43
|
+
@path_logged = path
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class AttributeForTest
|
48
|
+
def initialize(logger)
|
49
|
+
@logger = logger
|
50
|
+
end
|
51
|
+
|
52
|
+
def expression(path)
|
53
|
+
@logger.expression_called_with(path)
|
54
|
+
return 'value'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'common_templatelet_test'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
|
6
|
+
|
7
|
+
require 'buildmaster/template_runner'
|
8
|
+
|
9
|
+
module BuildMaster
|
10
|
+
|
11
|
+
class EachTest < CommonTemplateletTest
|
12
|
+
def test_should_iteration_through_selected_elements
|
13
|
+
template_content = <<CONTENT
|
14
|
+
<each source="rss" select="/rss/item" count="2">
|
15
|
+
<div class="NewsItem">
|
16
|
+
<p class="Title"><include elements="./title/text()"/></p>
|
17
|
+
<p class="Date"><include elements="./pubDate/text()"/></p>
|
18
|
+
</div>
|
19
|
+
</each>
|
20
|
+
CONTENT
|
21
|
+
target = create_element('test')
|
22
|
+
template = REXML::XPath.first(REXML::Document.new(template_content), '/each')
|
23
|
+
site = MySite.new
|
24
|
+
each_processor = Each.new(site)
|
25
|
+
each_processor.process(target, template, SourceContent.new('doc/doc.html', nil))
|
26
|
+
assert_equal('NewsItem', REXML::XPath.first(target, 'div').attributes['class'])
|
27
|
+
assert_equal(2, REXML::XPath.match(target, 'div').size)
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_line_test_rss_uri_need_start_a_server
|
31
|
+
template_content = <<CONTENT
|
32
|
+
<each source="http://localhost:2000/news-rss2.xml" select="/rss/item" count="2">
|
33
|
+
<div class="NewsItem">
|
34
|
+
<p class="Title"><include elements="./title/text()"/></p>
|
35
|
+
<p class="Date"><include elements="./pubDate/text()"/></p>
|
36
|
+
</div>
|
37
|
+
</each>
|
38
|
+
CONTENT
|
39
|
+
target = create_element('test')
|
40
|
+
template = REXML::XPath.first(REXML::Document.new(template_content), '/each')
|
41
|
+
site = MySite.new
|
42
|
+
each_processor = Each.new(site)
|
43
|
+
each_processor.process(target, template, SourceContent.new('doc/doc.html', nil))
|
44
|
+
assert_equal('NewsItem', REXML::XPath.first(target, 'div').attributes['class'])
|
45
|
+
assert_equal(2, REXML::XPath.match(target, 'div').size)
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class MySite < SiteSpec
|
51
|
+
def load_document(path)
|
52
|
+
content = <<CONTENT
|
53
|
+
<rss>
|
54
|
+
<item>
|
55
|
+
<title>Title One</title>
|
56
|
+
<pubDate>Today</pubDate>
|
57
|
+
</item>
|
58
|
+
<item>
|
59
|
+
<title>Title Two</title>
|
60
|
+
<pubDate>Tomorrow</pubDate>
|
61
|
+
</item>
|
62
|
+
</rss>
|
63
|
+
CONTENT
|
64
|
+
|
65
|
+
return REXML::Document.new(content)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'common_templatelet_test'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
|
6
|
+
|
7
|
+
module BuildMaster
|
8
|
+
class HrefTest < CommonTemplateletTest
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
@template_element = create_element('href')
|
12
|
+
@target_element = create_element('a')
|
13
|
+
@href = Href.new(@site_spec)
|
14
|
+
end
|
15
|
+
|
16
|
+
def source(path)
|
17
|
+
SourceContent.new(Pathname.new(path), nil)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_should_populate_href_attribute_with_full_url
|
21
|
+
expected_url = 'http://www.rubyforge.org'
|
22
|
+
@template_element.attributes['url']=expected_url
|
23
|
+
@href.process(@target_element, @template_element, source('index.html'))
|
24
|
+
assert_equal(expected_url, @target_element.attributes['href'])
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_populate_href_attribute_with_relative_path
|
28
|
+
@template_element.attributes['url']='doc/doc.html'
|
29
|
+
@href.process(@target_element, @template_element, source('download/index.html'))
|
30
|
+
assert_equal('../doc/doc.html', @target_element.attributes['href'])
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_support_image_tag_by_generating_src_attribute
|
34
|
+
@template_element.attributes['url']='doc/doc.gif'
|
35
|
+
@target_element = create_element('img')
|
36
|
+
@href.process(@target_element, @template_element, source('download/download.html'))
|
37
|
+
assert_equal('../doc/doc.gif', @target_element.attributes['src'])
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_should_handle_external_links
|
41
|
+
@template_element.attributes['url'] = 'http://www.google.com'
|
42
|
+
@target_element = create_element('img')
|
43
|
+
@href.process(@target_element, @template_element, source('download/download.html'))
|
44
|
+
assert_equal('http://www.google.com', @target_element.attributes['src'])
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'common_templatelet_test'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
|
6
|
+
|
7
|
+
require 'rexml/document'
|
8
|
+
require 'rexml/element'
|
9
|
+
require 'buildmaster/site_spec'
|
10
|
+
require 'buildmaster/source_content'
|
11
|
+
require 'buildmaster/templatelets/include'
|
12
|
+
|
13
|
+
module BuildMaster
|
14
|
+
class IncludeTest < CommonTemplateletTest
|
15
|
+
def test_should_include_the_source
|
16
|
+
target = create_element('target')
|
17
|
+
template = create_element('include')
|
18
|
+
template.attributes['elements'] = '/item/*'
|
19
|
+
source_content = <<CONTENT
|
20
|
+
<item>
|
21
|
+
text
|
22
|
+
<one>test</one>
|
23
|
+
<two></two>
|
24
|
+
</item>
|
25
|
+
CONTENT
|
26
|
+
source = SourceContent.new(Pathname.new('doc/index.html'), REXML::Document.new(source_content))
|
27
|
+
include = Include.new(SiteSpec.new)
|
28
|
+
include.process(target, template, source)
|
29
|
+
assert_equal('test', REXML::XPath.first(target, 'one').text)
|
30
|
+
assert_equal('text', target.text.strip!)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'common_templatelet_test'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
|
6
|
+
|
7
|
+
require 'rexml/document'
|
8
|
+
require 'rexml/xpath'
|
9
|
+
require 'buildmaster/site_spec'
|
10
|
+
require 'buildmaster/source_content'
|
11
|
+
|
12
|
+
module BuildMaster
|
13
|
+
class LinkTest < CommonTemplateletTest
|
14
|
+
def test_should_generate_link_with_relative_path
|
15
|
+
target = create_element('div')
|
16
|
+
template_content = <<CONTENT
|
17
|
+
<?xml ?>
|
18
|
+
<root>
|
19
|
+
<link href="content/path.html">text</link>
|
20
|
+
</root>
|
21
|
+
CONTENT
|
22
|
+
template_document = REXML::Document.new(template_content)
|
23
|
+
template = REXML::XPath.first(template_document, '/root/link')
|
24
|
+
source = create_element('source')
|
25
|
+
link = Link.new(SiteSpec.new)
|
26
|
+
link.process(target, template, SourceContent.new(Pathname.new('doc/doc.html'), source))
|
27
|
+
actual = REXML::XPath.first(target, 'a')
|
28
|
+
assert_equal('../content/path.html', actual.attributes['href'])
|
29
|
+
assert_equal('text', actual.text)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_copy_all_attributes
|
33
|
+
target = create_element('div')
|
34
|
+
template = create_element('link')
|
35
|
+
template.attributes['href'] = 'content/path.html'
|
36
|
+
template.attributes['attribute1'] = 'value1'
|
37
|
+
template.attributes['attribute2'] = 'value2'
|
38
|
+
source = create_element('source')
|
39
|
+
link = Link.new(SiteSpec.new)
|
40
|
+
link.process(target, template, SourceContent.new(Pathname.new('doc/doc.html'), source))
|
41
|
+
actual = REXML::XPath.first(target, 'a')
|
42
|
+
assert_equal('value1', actual.attributes['attribute1'])
|
43
|
+
assert_equal('value2', actual.attributes['attribute2'])
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_handle_absolute_path
|
47
|
+
target = create_element('div')
|
48
|
+
template = create_element('link')
|
49
|
+
template.attributes['href'] = '/content/path.html'
|
50
|
+
source = create_element('source')
|
51
|
+
link = Link.new(SiteSpec.new)
|
52
|
+
link.process(target, template, SourceContent.new(Pathname.new('doc/iste/doc.html'), source))
|
53
|
+
actual = REXML::XPath.first(target, 'a')
|
54
|
+
assert_equal('../../content/path.html', actual.attributes['href'])
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_should_generate_div_with_current_class_attribute_if_link_is_on_current_page
|
58
|
+
target = create_element('div')
|
59
|
+
template = create_element('link')
|
60
|
+
template.attributes['href'] = '/content/path.html'
|
61
|
+
source = create_element('source')
|
62
|
+
link = Link.new(SiteSpec.new)
|
63
|
+
link.process(target, template, SourceContent.new(Pathname.new('content/path.html'), source))
|
64
|
+
actual = REXML::XPath.first(target, 'div')
|
65
|
+
assert_equal(nil, actual.attributes['href'])
|
66
|
+
assert_equal('current', actual.attributes['class'])
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'common_templatelet_test'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
|
6
|
+
|
7
|
+
require 'rexml/document'
|
8
|
+
require 'rexml/xpath'
|
9
|
+
require 'buildmaster/site_spec'
|
10
|
+
require 'buildmaster/source_content'
|
11
|
+
|
12
|
+
module BuildMaster
|
13
|
+
class TextTest < CommonTemplateletTest
|
14
|
+
def test_should_generate_text_based_on_property
|
15
|
+
target = create_element('target')
|
16
|
+
template = create_element('text')
|
17
|
+
template.attributes['property'] = 'property'
|
18
|
+
text = Text.new({'property' => 'text'})
|
19
|
+
text.process(target, template, nil)
|
20
|
+
assert_equal('text', target.text)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_throw_exception_if_property_not_set
|
24
|
+
target = create_element('target')
|
25
|
+
template = create_element('text')
|
26
|
+
template.attributes['property'] = 'one'
|
27
|
+
text = Text.new(Hash.new)
|
28
|
+
begin
|
29
|
+
text.process(target, template, nil)
|
30
|
+
fail('TemplateException should have been thrown')
|
31
|
+
rescue TemplateException => exception
|
32
|
+
assert_equal(true, exception.message.include?('one'))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'common_templatelet_test'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
|
6
|
+
|
7
|
+
require 'rexml/document'
|
8
|
+
require 'rexml/xpath'
|
9
|
+
require 'buildmaster/site_spec'
|
10
|
+
require 'buildmaster/templatelets'
|
11
|
+
|
12
|
+
module BuildMaster
|
13
|
+
class WhenTest < CommonTemplateletTest
|
14
|
+
def test_should_process_child_when_evaluated_true
|
15
|
+
target = create_element('target')
|
16
|
+
template_content = <<CONTENT
|
17
|
+
<when test='expression_for_true'>
|
18
|
+
<h1>Header</h1>
|
19
|
+
</when>
|
20
|
+
CONTENT
|
21
|
+
template_document = REXML::Document.new(template_content)
|
22
|
+
template = REXML::XPath.first(template_document, '/when')
|
23
|
+
when_processor = When.new(self, self)
|
24
|
+
when_processor.process(target, template, self)
|
25
|
+
actual = REXML::XPath.first(target, 'h1')
|
26
|
+
assert_equal('Header', actual.text)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_not_process_child_when_evaluated_false
|
30
|
+
target = create_element('target')
|
31
|
+
template_content = <<CONTENT
|
32
|
+
<when test='expression_for_false'>
|
33
|
+
<h1>Header</h1>
|
34
|
+
</when>
|
35
|
+
CONTENT
|
36
|
+
template_document = REXML::Document.new(template_content)
|
37
|
+
template = REXML::XPath.first(template_document, '/when')
|
38
|
+
when_processor = When.new(self, self)
|
39
|
+
when_processor.process(target, template, self)
|
40
|
+
assert_equal(0, target.size)
|
41
|
+
end
|
42
|
+
|
43
|
+
def path
|
44
|
+
return Pathname.new('index.html')
|
45
|
+
end
|
46
|
+
|
47
|
+
def expression_for_true(path)
|
48
|
+
return true
|
49
|
+
end
|
50
|
+
|
51
|
+
def expression_for_false(path)
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
def load_templatelets
|
56
|
+
return Hash.new
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
require 'templatelets/tc_attribute'
|
5
|
+
require 'templatelets/tc_each'
|
6
|
+
require 'templatelets/tc_href'
|
7
|
+
require 'templatelets/tc_include'
|
8
|
+
require 'templatelets/tc_link'
|
9
|
+
require 'templatelets/tc_text'
|
10
|
+
require 'templatelets/tc_when'
|