quarry 0.3.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.
- data/CHANGES +6 -0
- data/COPYING +344 -0
- data/MANIFEST +151 -0
- data/METADATA +22 -0
- data/NEWS +8 -0
- data/README +75 -0
- data/VERSION +1 -0
- data/bin/rubybreak +3 -0
- data/bin/xact-ruby +6 -0
- data/demo/spec/demo_check.rb +21 -0
- data/demo/spec/demo_outline.rb +25 -0
- data/demo/test/demo_run.rb +21 -0
- data/doc/manual.html2 +1416 -0
- data/doc/rdoc/classes/Assertion.html +101 -0
- data/doc/rdoc/classes/Assertion/False.html +132 -0
- data/doc/rdoc/classes/Assertion/True.html +137 -0
- data/doc/rdoc/classes/Kernel.html +86 -0
- data/doc/rdoc/classes/Method.html +137 -0
- data/doc/rdoc/classes/Module.html +165 -0
- data/doc/rdoc/classes/Object.html +154 -0
- data/doc/rdoc/classes/Quarry.html +177 -0
- data/doc/rdoc/classes/Quarry/Design.html +170 -0
- data/doc/rdoc/classes/Quarry/Design/Specification.html +265 -0
- data/doc/rdoc/classes/Quarry/Design/Specification/Context.html +174 -0
- data/doc/rdoc/classes/Quarry/MethodProbe.html +267 -0
- data/doc/rdoc/classes/Quarry/Mock.html +89 -0
- data/doc/rdoc/classes/Quarry/Mock/Object.html +276 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/CHANGES.html +100 -0
- data/doc/rdoc/files/COPYING.html +457 -0
- data/doc/rdoc/files/MANIFEST.html +630 -0
- data/doc/rdoc/files/METADATA.html +92 -0
- data/doc/rdoc/files/NEWS.html +99 -0
- data/doc/rdoc/files/README.html +171 -0
- data/doc/rdoc/files/VERSION.html +96 -0
- data/doc/rdoc/files/bin/rubybreak.html +96 -0
- data/doc/rdoc/files/bin/xact-ruby.html +92 -0
- data/doc/rdoc/files/lib/quarry/assert/must_rb.html +96 -0
- data/doc/rdoc/files/lib/quarry/assert/should_rb.html +96 -0
- data/doc/rdoc/files/lib/quarry/assertion_rb.html +96 -0
- data/doc/rdoc/files/lib/quarry/breakout_rb.html +144 -0
- data/doc/rdoc/files/lib/quarry/design/spec_rb.html +100 -0
- data/doc/rdoc/files/lib/quarry/document_rb.html +92 -0
- data/doc/rdoc/files/lib/quarry/loadmonitor_rb.html +92 -0
- data/doc/rdoc/files/lib/quarry/methodprobe_rb.html +111 -0
- data/doc/rdoc/files/lib/quarry/mock/object_rb.html +123 -0
- data/doc/rdoc/files/lib/quarry/mockery_rb.html +115 -0
- data/doc/rdoc/fr_class_index.html +60 -0
- data/doc/rdoc/fr_file_index.html +65 -0
- data/doc/rdoc/fr_method_index.html +77 -0
- data/doc/rdoc/index.html +26 -0
- data/doc/rdoc/rdoc-style.css +175 -0
- data/doc/ri/Assertion/False/assert-i.yaml +10 -0
- data/doc/ri/Assertion/False/cdesc-False.yaml +19 -0
- data/doc/ri/Assertion/False/message-i.yaml +10 -0
- data/doc/ri/Assertion/True/assert-i.yaml +11 -0
- data/doc/ri/Assertion/True/cdesc-True.yaml +24 -0
- data/doc/ri/Assertion/True/message-c.yaml +11 -0
- data/doc/ri/Assertion/True/message-i.yaml +11 -0
- data/doc/ri/Assertion/True/method_missing-i.yaml +11 -0
- data/doc/ri/Assertion/True/new-c.yaml +11 -0
- data/doc/ri/Assertion/cdesc-Assertion.yaml +17 -0
- data/doc/ri/Kernel/cdesc-Kernel.yaml +15 -0
- data/doc/ri/Method/cdesc-Method.yaml +18 -0
- data/doc/ri/Method/migration-i.yaml +12 -0
- data/doc/ri/Method/signature-i.yaml +12 -0
- data/doc/ri/Module/cdesc-Module.yaml +21 -0
- data/doc/ri/Module/doc-i.yaml +16 -0
- data/doc/ri/Module/method_added-i.yaml +10 -0
- data/doc/ri/Object/assert%21-i.yaml +14 -0
- data/doc/ri/Object/assert-i.yaml +14 -0
- data/doc/ri/Object/cdesc-Object.yaml +20 -0
- data/doc/ri/Quarry/Design/Specification/Context/after-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/Context/before-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/Context/cdesc-Context.yaml +24 -0
- data/doc/ri/Quarry/Design/Specification/Context/method_missing-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/Context/specifications-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/cdesc-Specification.yaml +44 -0
- data/doc/ri/Quarry/Design/Specification/check-i.yaml +12 -0
- data/doc/ri/Quarry/Design/Specification/new-c.yaml +12 -0
- data/doc/ri/Quarry/Design/Specification/outline-i.yaml +12 -0
- data/doc/ri/Quarry/Design/cdesc-Design.yaml +22 -0
- data/doc/ri/Quarry/Design/check-c.yaml +12 -0
- data/doc/ri/Quarry/Design/outline-c.yaml +10 -0
- data/doc/ri/Quarry/Design/specification-c.yaml +10 -0
- data/doc/ri/Quarry/Design/specifications-c.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/cdesc-MethodProbe.yaml +46 -0
- data/doc/ri/Quarry/MethodProbe/duckcall-c.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/initialize_copy-i.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/method_missing-i.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/new-c.yaml +10 -0
- data/doc/ri/Quarry/Mock/Object/cdesc-Object.yaml +52 -0
- data/doc/ri/Quarry/Mock/Object/echo-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/Object/keys-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/Object/mock-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/Object/mocks-c.yaml +10 -0
- data/doc/ri/Quarry/Mock/Object/spin-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/cdesc-Mock.yaml +15 -0
- data/doc/ri/Quarry/Mockery-i.yaml +12 -0
- data/doc/ri/Quarry/cdesc-Quarry.yaml +17 -0
- data/doc/ri/created.rid +1 -0
- data/lib/quarry/assert/must.rb +8 -0
- data/lib/quarry/assert/should.rb +9 -0
- data/lib/quarry/assertion.rb +95 -0
- data/lib/quarry/breakout.rb +45 -0
- data/lib/quarry/design/spec.rb +197 -0
- data/lib/quarry/document.rb +35 -0
- data/lib/quarry/loadmonitor.rb +14 -0
- data/lib/quarry/methodprobe.rb +216 -0
- data/lib/quarry/mock/object.rb +169 -0
- data/lib/quarry/mockery.rb +85 -0
- metadata +214 -0
data/METADATA
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
project : quarry
|
|
3
|
+
version : 0.3.0
|
|
4
|
+
status : beta
|
|
5
|
+
|
|
6
|
+
title : Quarry
|
|
7
|
+
subtitle : Ruby Development Libraries
|
|
8
|
+
slogan : ALL YOUR BASE ARE BELONG TO RUBY!
|
|
9
|
+
created : 2006-12-16
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
abstract :
|
|
13
|
+
Quarry is a small collection of libraries to facilitate
|
|
14
|
+
Ruby project development, testing and debugging.
|
|
15
|
+
|
|
16
|
+
copyright : (c) 2007 Tiger Ops & 7rans
|
|
17
|
+
|
|
18
|
+
author : Thomas Sawyer <transfire@gmail.com>
|
|
19
|
+
#email : facets-universal@rubyforge.org
|
|
20
|
+
homepage : 'http://quarry.rubyforge.org'
|
|
21
|
+
download : 'http://rubyforge.org/projects/quarry'
|
|
22
|
+
|
data/NEWS
ADDED
data/README
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
= Ruby Quarry
|
|
2
|
+
|
|
3
|
+
http://quarry.rubyforge.org
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
== Introduction
|
|
7
|
+
|
|
8
|
+
Ruby Quarry is a developers testing and debuging suite.
|
|
9
|
+
It features a flexible BDD specification system and
|
|
10
|
+
a number of useful tools.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
== Features
|
|
14
|
+
|
|
15
|
+
=== Design::Specification
|
|
16
|
+
|
|
17
|
+
Quarry's BBD system is uniqe in two ways. First it utilizes Ruby's
|
|
18
|
+
Execption system to catch Assertions which are define via
|
|
19
|
+
with assertion <i>functors</i>. Eg.
|
|
20
|
+
|
|
21
|
+
require 'quarry/assertion'
|
|
22
|
+
|
|
23
|
+
4.assert = 5
|
|
24
|
+
|
|
25
|
+
This will raise ans Assertion error. Quarry's design specification
|
|
26
|
+
then is just a measn of outlining and capturing these
|
|
27
|
+
assertions.
|
|
28
|
+
|
|
29
|
+
The sepcification themeleleves are completely freewform. There is
|
|
30
|
+
no enforced nomenclature. Eg.
|
|
31
|
+
|
|
32
|
+
Quarry::Design.spec "Example Specification" do
|
|
33
|
+
|
|
34
|
+
i_will_show "concerning the number 5" do
|
|
35
|
+
|
|
36
|
+
that "5 != 4" do
|
|
37
|
+
5.assert! == 4
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
but_that "5 == 5" do
|
|
41
|
+
5.assert == 5
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
If you were to run this specification, you would simply see an outline.
|
|
49
|
+
|
|
50
|
+
= Example Specification
|
|
51
|
+
== i_will_show concerning the number 5
|
|
52
|
+
=== that 5 != 4
|
|
53
|
+
=== but_that 5 == 5
|
|
54
|
+
|
|
55
|
+
If there were errors, we say *-items detaling each.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
=== MethodProbe
|
|
59
|
+
|
|
60
|
+
MethodProbe (aka the Duck Hunter) is an expiremental project --
|
|
61
|
+
not meant for production use, that can dip-down into a method
|
|
62
|
+
and provide a read-out of the methods it uses. Thus it
|
|
63
|
+
provides a (duck-)signiture of a method. Keep in mind, that
|
|
64
|
+
becuase it is runtime bound it is not perfect. It can miss
|
|
65
|
+
some parts of a method due to conditionals and, albiet rare,
|
|
66
|
+
it can get stung by the halting problem.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
== Copying
|
|
70
|
+
|
|
71
|
+
Copyright (c) 2007 Tiger Ops / Thomas Sawyer
|
|
72
|
+
|
|
73
|
+
Quarry is distributed under the terms of the GPLv3.
|
|
74
|
+
|
|
75
|
+
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
quarry 0.3.0 beta 2008-08-21
|
data/bin/rubybreak
ADDED
data/bin/xact-ruby
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'quarry/test/spec'
|
|
2
|
+
|
|
3
|
+
Quarry::Design.specification "Example Specification" do
|
|
4
|
+
|
|
5
|
+
demonstrate "basic assertions" do
|
|
6
|
+
|
|
7
|
+
notice_that "4 != 3" do
|
|
8
|
+
4.must == 3
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
and_that "4.must_not == 4 is false" do
|
|
12
|
+
4.must_not == 4
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
as_well_as_that "raise ArgumentError does not raise a SyntaxError" do
|
|
16
|
+
lambda{raise ArgumentError}.must.raise? SyntaxError
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'ratchets/spec/design'
|
|
2
|
+
|
|
3
|
+
Ratchets::Design.specification "Example Specification" do
|
|
4
|
+
|
|
5
|
+
demonstrate "basic assertions" do
|
|
6
|
+
|
|
7
|
+
that "4.must == 3 fails" do
|
|
8
|
+
4.must == 3
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
that "4.must_not == 4 fails" do
|
|
12
|
+
4.must_not == 4
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
that "raise ArgumentError does not raise a SyntaxError" do
|
|
16
|
+
lambda{raise ArgumentError}.must.raise? SyntaxError
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
$no_autocheck = true
|
|
24
|
+
|
|
25
|
+
Ratchets::Design.outline
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'ratchets/test/case'
|
|
2
|
+
|
|
3
|
+
Ratchets::Test.suite "example suite" do
|
|
4
|
+
|
|
5
|
+
test_case "example case" do
|
|
6
|
+
|
|
7
|
+
test "4 should equal 3" do
|
|
8
|
+
4.assert == 3
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "4 should not equal 4" do
|
|
12
|
+
4.assert_not == 4
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "raises syntax error" do
|
|
16
|
+
lambda{raise SyntaxError}.should.raise? SyntaxError
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
data/doc/manual.html2
ADDED
|
@@ -0,0 +1,1416 @@
|
|
|
1
|
+
<HTML>
|
|
2
|
+
|
|
3
|
+
<HEAD>
|
|
4
|
+
|
|
5
|
+
<TITLE>Ratchets - User Manual</TITLE>
|
|
6
|
+
|
|
7
|
+
<LINK REL="SHORTCUT ICON" HREF="img/ruby.gif"/>
|
|
8
|
+
<LINK REL="StyleSheet" HREF="style.css" TITLE="Times" TYPE="text/css">
|
|
9
|
+
|
|
10
|
+
<SCRIPT language="javascript" src="js/jquery.js"></script>
|
|
11
|
+
|
|
12
|
+
<SCRIPT type="text/javascript">
|
|
13
|
+
var chapter_count = 0;
|
|
14
|
+
|
|
15
|
+
function chapter(name) {
|
|
16
|
+
chapter_count++;
|
|
17
|
+
document.write('<h1 id="ch' + chapter_count + '">' + chapter_count + '. ' + name + '</h1>');
|
|
18
|
+
$('#table_of_contents').append('<li><a href="#ch' + chapter_count + '">' + name + '</a></li>');
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
var view_mode = false;
|
|
22
|
+
|
|
23
|
+
function toc_toggle() {
|
|
24
|
+
if(view_mode) {
|
|
25
|
+
$('#text').css('margin-left','260px');
|
|
26
|
+
$('#toc').show();
|
|
27
|
+
view_mode = false;
|
|
28
|
+
} else {
|
|
29
|
+
$('#toc').hide();
|
|
30
|
+
$('#text').css('margin-left','20px');
|
|
31
|
+
view_mode = true;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
</SCRIPT>
|
|
35
|
+
|
|
36
|
+
</HEAD>
|
|
37
|
+
<BODY>
|
|
38
|
+
|
|
39
|
+
<div id="toggle" style="position: fixed; top: 0; left: 0;">
|
|
40
|
+
<a href="javascript: toc_toggle();"><img src="img/icon/book.jpg" height="30px;" style="border: none;"/></a>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
<!-- Side Table of Contents -->
|
|
45
|
+
|
|
46
|
+
<div id="toc">
|
|
47
|
+
<img src="img/icon/book.jpg" align="left" style="padding-right: 10px;"/>
|
|
48
|
+
<h1>Ratchets</h1>
|
|
49
|
+
<h2>User Manual</h2><br/>
|
|
50
|
+
<b>Table of Contents</b>
|
|
51
|
+
<ol id="table_of_contents"></ol>
|
|
52
|
+
<div id="copy">Copyright © 2006 Thomas Sawyer.<br/>All Rights Reserved.</div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
<div id="text">
|
|
58
|
+
|
|
59
|
+
<!-- Title -->
|
|
60
|
+
|
|
61
|
+
<div id="booktitle" style="text-align: left;">
|
|
62
|
+
<div id="title1">RATCHETS</div>
|
|
63
|
+
<div id="title2">User Manual</div>
|
|
64
|
+
<br/>
|
|
65
|
+
<div> rev. <span id="rev">9</span> (~<span id="rev">75%</span>) </div>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div id="copy">Copyright © 2006 Thomas Sawyer. All Rights Reserved.</div>
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
<!-- Introduction -->
|
|
72
|
+
|
|
73
|
+
<div id="intro" class="section" style="margin-top: 40px;">
|
|
74
|
+
|
|
75
|
+
<div class="part">Introduction</div>
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
<script type="text/javascript"> chapter('Introducing Ratchets'); </script>
|
|
79
|
+
|
|
80
|
+
<p>Ratchets started life as <i>Reap</i>, a project assistant application born of a complex Rakefile.
|
|
81
|
+
Rake is the most widely used task tool for Ruby, but over time, small implementations details led
|
|
82
|
+
Reap to become it's own independent build system. Reap was a great tool, but it was still very much
|
|
83
|
+
a work in progress... a program in search of it's source.</p>
|
|
84
|
+
|
|
85
|
+
<p>Then one day, while working on Ratchets' sister project <a href="http://facets.rubyforge.org">Facets</a>
|
|
86
|
+
inspiration struck. The key to the "new Reap" is the same as Facets. Just as Facets is a collection of
|
|
87
|
+
programming tools, so too the "new Reap" would be a collection of project tools. These tools could
|
|
88
|
+
be called upon by any program, including utilities Ratcehts would provide, but first and foremost
|
|
89
|
+
it would be a library. And thus Ratchets was born.</p>
|
|
90
|
+
|
|
91
|
+
<p>Ratchet's features:</p>
|
|
92
|
+
|
|
93
|
+
<ul>
|
|
94
|
+
<li>Reuable collection of project management tools.</li>
|
|
95
|
+
<li>Tools can get settings from a central project information store.</li>
|
|
96
|
+
<li>Tools are accessable via a command-line utility.</li>
|
|
97
|
+
<li>Promotes convention over configuration, but still remains flexible.</li>
|
|
98
|
+
</ul>
|
|
99
|
+
|
|
100
|
+
<div class="special"><b>IMPORTANT!</b> This documentation is not yet complete. If you look at the
|
|
101
|
+
header at the top of the page, you will see a rev. number. Beside the rev. number is an approx.
|
|
102
|
+
percentage of completion. Keep that in figure in mind as you read through the documentation.
|
|
103
|
+
Thanks.</div>
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
<script type="text/javascript"> chapter('Getting Started'); </script>
|
|
107
|
+
|
|
108
|
+
<p>If you haven't already done so, you'll first need to install Ratchets.
|
|
109
|
+
The process is straight-forward. Download the package file, decompress it,
|
|
110
|
+
'cd' into the package directory and run <code>setup.rb</code>. Eg.</p>
|
|
111
|
+
|
|
112
|
+
<pre>
|
|
113
|
+
$ tar -xvzf ratchets-0.7.0.gzip
|
|
114
|
+
$ cd ratchets-0.7.0
|
|
115
|
+
$ sudo ruby setup.rb
|
|
116
|
+
</pre>
|
|
117
|
+
|
|
118
|
+
<p>Alternatively you can install the gem.</p>
|
|
119
|
+
|
|
120
|
+
<pre>
|
|
121
|
+
$ gem install ratchets
|
|
122
|
+
</pre>
|
|
123
|
+
|
|
124
|
+
<p>Once installed you can immediately start using Ratchets. Here's the down low.</p>
|
|
125
|
+
|
|
126
|
+
<p>Rathcets has a command line tool called, simply enough, <code>project</code>.
|
|
127
|
+
While there are a few other commands you'll eventually want to know about, this
|
|
128
|
+
is the main facility. You can use <code>project --help</code> to familiarize yourself
|
|
129
|
+
with some of it's capability.</p>
|
|
130
|
+
|
|
131
|
+
<p>In general the first argument given to <code>project</code> is either the name
|
|
132
|
+
of a built-in tool or the name of a user-defined task, followed by any extra
|
|
133
|
+
information to effect the results of the script/task.</p>
|
|
134
|
+
|
|
135
|
+
<!--
|
|
136
|
+
TODO!!!!
|
|
137
|
+
<p>While you can use the project command as a fully independent command,
|
|
138
|
+
a <i>ProjectInfo</i> file ...
|
|
139
|
+
</p>
|
|
140
|
+
-->
|
|
141
|
+
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
<!-- Project Generation -->
|
|
146
|
+
|
|
147
|
+
<div id="proj" class="section">
|
|
148
|
+
|
|
149
|
+
<img src="img/radio_earth.jpg" align="right" style="padding: 0 10px;"/>
|
|
150
|
+
|
|
151
|
+
<div class="part">Part I</div> <div id="title1" style="color: #44ee33;">Project Generation</div>
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
<script type="text/javascript"> chapter('Creating a New Project'); </script>
|
|
155
|
+
|
|
156
|
+
<p>As mentioned at the end of the previous chapter, Ratchets is utilized primarily through
|
|
157
|
+
the <code>project</code> command-line interface. By supplying this command the name of a
|
|
158
|
+
"ratchet" with subsequent options we activate various build procedures.</p>
|
|
159
|
+
|
|
160
|
+
<p>The first "ratchet" we will cover, as it is likely the first anyone will need,
|
|
161
|
+
is <code>new</code>. The new tool is be used to generate new project scaffolding
|
|
162
|
+
or add additional <i>parts</i> to an existing project.</p>
|
|
163
|
+
|
|
164
|
+
<p>Let look at creating a whole new project. To do this, first create a directory for the
|
|
165
|
+
new project, <code>cd</code> into it, then invoke <code>project new</code>.</p>
|
|
166
|
+
|
|
167
|
+
<pre>
|
|
168
|
+
$ mkdir myproject
|
|
169
|
+
$ cd myproject
|
|
170
|
+
$ project new
|
|
171
|
+
Project ready.
|
|
172
|
+
</pre>
|
|
173
|
+
|
|
174
|
+
<p>And just like that, a standard Ruby project layout is created. If you look at the contents of the directory
|
|
175
|
+
you will see conventional folders like <code>bin/ lib/</code> and <code>data/</code>. The conventions
|
|
176
|
+
followed are according to those established by Minero Akoi's
|
|
177
|
+
<a href="http://i.loveruby.net/en/projects/setup/doc/">setup.rb</a>. If you are relatively new to Ruby
|
|
178
|
+
it is a good idea to familiarize yourself with this material.</p>
|
|
179
|
+
|
|
180
|
+
<p>Besides the standard layout, <code>new</code> can also create a subversion layout which includes
|
|
181
|
+
the associated <code>branches tags trunk</code> tier. Simply specify the option as <code>--svn</code>
|
|
182
|
+
or <code>--subversion</code> after <code>new</code>.
|
|
183
|
+
|
|
184
|
+
<pre>
|
|
185
|
+
$ project new --svn
|
|
186
|
+
</pre>
|
|
187
|
+
|
|
188
|
+
<p>With or without the subversion tier, <code>new</code> also has a website layout option,
|
|
189
|
+
<code>--web</code>, which will create an additional tier with an <code>index.html</code> file and
|
|
190
|
+
some other website related structure, placing the source repository in a <code>src</code> subdirectory.
|
|
191
|
+
This is a great way to layout a project, btw.</p>
|
|
192
|
+
|
|
193
|
+
<p>The <code>new</code> command can create even better project scaffolding if we first provide
|
|
194
|
+
some information about our project. To do that we must first create a <i>project information file</i>.
|
|
195
|
+
The information in this file can then be used by Ratchets to enhance the new project's scaffolding.</p>
|
|
196
|
+
|
|
197
|
+
<pre>
|
|
198
|
+
$ mkdir myproject
|
|
199
|
+
$ cd myproject
|
|
200
|
+
$ project new --info
|
|
201
|
+
CREATED: ProjectInfo
|
|
202
|
+
Please edit the file to suit your project.
|
|
203
|
+
</pre>
|
|
204
|
+
|
|
205
|
+
<p>As you can see this creates a <i>project information file</i> called <code>ProjectInfo</code>.
|
|
206
|
+
Another, and perhaps better way to create a ProjectInfo file is to copy one from some
|
|
207
|
+
other project and modify it to suit your needs. That makes it easier to learn how to fill
|
|
208
|
+
them out. But if you don't have that option or you are already familiar with the layout,
|
|
209
|
+
then you can use the <code>new</code> command create a blank template.</p>
|
|
210
|
+
|
|
211
|
+
<p>The name of the project information file has some flexibility. Capitalization, for
|
|
212
|
+
instance, is insignifficant; <code>projectinfo</code> would do just as well. Also
|
|
213
|
+
a few alternative namings are supported, namely, <code>project.yaml</code> or just
|
|
214
|
+
<code>PROJECT</code> (again capitalization doesn't matter). For simplicity sake we will refer
|
|
215
|
+
to this file as the ProjectInfo file throughout the documentation. Just remember that you
|
|
216
|
+
can substitue any of these other supported names in it's place to suit your personal preference.
|
|
217
|
+
If you prefer one of the alternate names when creating the file, you can specify it as
|
|
218
|
+
a parameter of the <code>--info</code> option.</p>
|
|
219
|
+
|
|
220
|
+
<pre>
|
|
221
|
+
$ project new --info project.yaml
|
|
222
|
+
</pre>
|
|
223
|
+
|
|
224
|
+
<p>Rather then 'ProjectInfo', the file will be called 'project.yaml'. Ratchets will let you know
|
|
225
|
+
if you pick a name it does not recognize.</p>
|
|
226
|
+
|
|
227
|
+
<p>Once you have edited the ProjectInfo file (more on this in the next section), subsequnelty running
|
|
228
|
+
<code>project new</code> will create the same project layout as before, but it will add
|
|
229
|
+
enhanced details to further ease the creation of the new project. For instance, the lib
|
|
230
|
+
directory will already have subdirectory named appropriately and if you use the --web option,
|
|
231
|
+
the index.html page will be suitably labeled. And so on.</p>
|
|
232
|
+
|
|
233
|
+
<div class="special"><b>NOTE</b> The enhanced information scaffolding is barely
|
|
234
|
+
implemented as of yet. But will continue to improve with future releases.</div>
|
|
235
|
+
|
|
236
|
+
<p>Of course, if you already have a project with which you wish to use Ratchets, rather than
|
|
237
|
+
create a whole new project layout you will probably just want to add the <code><i>ProjectInfo</i></code>
|
|
238
|
+
file to it. In that case you simply run <code>project new --info</code>. The project information file
|
|
239
|
+
will be added and the rest of your project will be undisturbed. Running <code>project new</code> on
|
|
240
|
+
a pre-existing project will have no effect. It will simply report an error that your project
|
|
241
|
+
already has content.</p>
|
|
242
|
+
|
|
243
|
+
<div class="special"><b>IMPORTANT!</b> Currently there is a small
|
|
244
|
+
problem with automatic scaffolding. If you are using an <code>svn</code> and/or a <code>web</code>
|
|
245
|
+
project layout be sure to add <code>basedir: src</code>, <code>basedir: trunk</code> or
|
|
246
|
+
<code>basedir: src/trunk</code> to the project information file depending on which combination
|
|
247
|
+
of layout you are using. Or opionally you can move the project information file to the source
|
|
248
|
+
directory and utilize it from there rather than the top-most tier. We will fix this issue in a
|
|
249
|
+
future release.</div>
|
|
250
|
+
|
|
251
|
+
<p>The project file is of central importance to Ratchets and the <code>project</code> command.
|
|
252
|
+
The file is a YAML-formatted file storing shared information from which Ratchets' tools gather
|
|
253
|
+
default information on how to perform their actions. Most subsequent activity will largely
|
|
254
|
+
depend on the content of this file. So lets now turn our attention squarely to it.</p>
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
<script type="text/javascript"> chapter('The ProjectInfo File'); </script>
|
|
258
|
+
|
|
259
|
+
<p>The structure of the ProjectInfo file is fairly self-explanitory. The header is devoted to
|
|
260
|
+
common information. This is generally followed by deafult tool settings. And lastly
|
|
261
|
+
a <i>tasks</i> section is used to define user tasks. Each task entry is a YAML map where the
|
|
262
|
+
key represent the task name followed by a private type (!!) which identifies the tool
|
|
263
|
+
it invokes. The next line begins the indented attributes the tool needs to do the job.
|
|
264
|
+
To a detailed list of parameters each tool accepts have a look at the RDoc API.</p>
|
|
265
|
+
|
|
266
|
+
<b>Example ProjectInfo File</b><br/>
|
|
267
|
+
|
|
268
|
+
<pre>
|
|
269
|
+
--- %YAML:1.0
|
|
270
|
+
|
|
271
|
+
title : Reap
|
|
272
|
+
name : reap
|
|
273
|
+
|
|
274
|
+
version : 6.0.0
|
|
275
|
+
status : 'beta'
|
|
276
|
+
|
|
277
|
+
author : Thomas Sawyer
|
|
278
|
+
created : '2004-04-01'
|
|
279
|
+
email : transfirz@zmail.com
|
|
280
|
+
homepage : "http://reap.rubyforge.org"
|
|
281
|
+
|
|
282
|
+
summary : A Ruby Project Management Assistant
|
|
283
|
+
|
|
284
|
+
description: >
|
|
285
|
+
Reap comprises a set of tasks commonly needed by
|
|
286
|
+
Ruby package developers/deployers, such as testing,
|
|
287
|
+
packaging, releasing, etc. You can also use Reap
|
|
288
|
+
to create your own custom tasks. Reap utilizes a
|
|
289
|
+
YAML configuration file to harvest common project
|
|
290
|
+
information, significantly simplifying these chores.
|
|
291
|
+
|
|
292
|
+
rubyforge:
|
|
293
|
+
project : reap
|
|
294
|
+
username : transami
|
|
295
|
+
|
|
296
|
+
revision:
|
|
297
|
+
tool: darcs
|
|
298
|
+
exclude:
|
|
299
|
+
- doc/api
|
|
300
|
+
|
|
301
|
+
package:
|
|
302
|
+
executables : [ reap, rubytest ]
|
|
303
|
+
dependencies:
|
|
304
|
+
- [ facets, '> 1.5' ]
|
|
305
|
+
exclude:
|
|
306
|
+
- snip
|
|
307
|
+
- doc/api
|
|
308
|
+
|
|
309
|
+
tasks:
|
|
310
|
+
|
|
311
|
+
foo: !!ruby
|
|
312
|
+
script: |
|
|
313
|
+
puts "Foo it is!"
|
|
314
|
+
|
|
315
|
+
</pre>
|
|
316
|
+
|
|
317
|
+
<p>As you can the top portion is fairly self-explainitory. After that we see entries related to
|
|
318
|
+
specific Ratchet tools like package. This entry specifies default parameters to use for any
|
|
319
|
+
subsequent call of the package tool. We will cover this in more detail in the
|
|
320
|
+
<a href="tool.html">Tool Utilization</a> documention.</p>
|
|
321
|
+
|
|
322
|
+
<p>Following this is the tasks section with which we can
|
|
323
|
+
define our own user-defined tasks. Typically these are specializtions of the buil-in tools,
|
|
324
|
+
but as you can see by our "silly example" arbitary tasks can be written as well. We will
|
|
325
|
+
cover this in more detail in the <a href="task.html">Task Management</a> documentation.</p>
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
<script type="text/javascript"> chapter('Verifying Project Information'); </script>
|
|
329
|
+
|
|
330
|
+
<p>When Ratchets searches for a ProjectInfo file it will move up the
|
|
331
|
+
directory hierarchy from the current working directory until it finds a ProjectInfo file
|
|
332
|
+
and will assume the location of that file is your project's source directory unless the file
|
|
333
|
+
itself specifes that another directory is the source root.</p>
|
|
334
|
+
|
|
335
|
+
<p>Project has one other subcommand that can be used to verify the project information: <code>info</code>.
|
|
336
|
+
This simply dumps the parsed contents of the ProjectInfo file to stdout.</p>
|
|
337
|
+
|
|
338
|
+
<pre>
|
|
339
|
+
$ project info
|
|
340
|
+
</pre>
|
|
341
|
+
|
|
342
|
+
<p>This may seem trivial, but it can be sometimes be useful to quicky insure information
|
|
343
|
+
is correct and that you are calling <code>project</code> from an appropriate location. [ed-
|
|
344
|
+
the order of information is arbitrary, so it looks a bit messy. This will be improved
|
|
345
|
+
in a future release.]</p>
|
|
346
|
+
|
|
347
|
+
</div>
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
<!-- Task Management -->
|
|
351
|
+
|
|
352
|
+
<div id="task" class="section">
|
|
353
|
+
|
|
354
|
+
<img src="img/clipboard2.png" align="right" style="margin-top: -75px; padding: 10px;"/>
|
|
355
|
+
|
|
356
|
+
<div class="part">Part II</div>
|
|
357
|
+
|
|
358
|
+
<div id="title1" style="color: #884444;">Task Management</div>
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
<script type="text/javascript"> chapter('Task Versitility'); </script>
|
|
362
|
+
|
|
363
|
+
<p>Ratchets is a very versitile application. Ratchets supports a number of techniques
|
|
364
|
+
for utilizing it's built-in tools and defining new tasks. Depedending on the desired usage,
|
|
365
|
+
Ratchets can be a build tool <i>library</i>, or taking advantage of it's own system, can
|
|
366
|
+
be used as a build tool in its own right.</p>
|
|
367
|
+
|
|
368
|
+
<p>One easily adopted usage of Ratchets is as a build library invoked from Rake.
|
|
369
|
+
Rake is the prevalent build tool for Ruby, and an excellent one at that. Ratchets
|
|
370
|
+
tools can be easily called from any application, so calling them from a Rake task
|
|
371
|
+
is a natural endeavor. Ratchets goes a step further in its support of Rake however
|
|
372
|
+
by allowing the built-in tools to be setup as Rake tasks automatically.
|
|
373
|
+
If this is intended usage jump down to <a href="#ch4">Ratchets a la Rake</a>
|
|
374
|
+
to learn more.</p>
|
|
375
|
+
|
|
376
|
+
<p>On the other hand, forgoing a separate build tool, tasks can instead be defined
|
|
377
|
+
as YAML descriptors and invoked via thae <code>project</code> command-line utility.
|
|
378
|
+
This makes tasks extremely easy to read and write, and allows project information
|
|
379
|
+
and task definitions to be jointly located but still universally accessible as
|
|
380
|
+
pure data. We will cover this usage in <a href="#ch2">Describing Tasks
|
|
381
|
+
via YAML</a>.</p>
|
|
382
|
+
|
|
383
|
+
<p>The other alternative, which we will discuss last, is for tasks to be defined as
|
|
384
|
+
stand-alone executables. This approach is in the spirit of Unix --it's favor of many
|
|
385
|
+
small tools over single monolithic applications. Ratchets provides strong support
|
|
386
|
+
for this mode of operation, which we have dubbed the <a href="#ch3">Sake Technique</a>.
|
|
387
|
+
[ed- In fact, it is my prefered usage.]</p>
|
|
388
|
+
|
|
389
|
+
<p>In any case, no matter which technique is used. The centralized data resource
|
|
390
|
+
for project information is readily available. This <i>reapability</i> of
|
|
391
|
+
information, probably more than any other feature, makes Ratchets so effective.</p>
|
|
392
|
+
|
|
393
|
+
<div class="special">
|
|
394
|
+
<b>SIDE NOTE</b> The terms <i>tool</i> and <i>task</i> are often used interchangably.
|
|
395
|
+
Loosly speaking a tool is a built-in task, and a task is a user-defined tool.
|
|
396
|
+
Furthermore, <i>tool</i> will generally be the term used when calling upon
|
|
397
|
+
Ratchets as a library, whereas <i>task</i> is used when referring to an invocation
|
|
398
|
+
of the Ratchets command-line utility <code>project</code>. In other words, these are
|
|
399
|
+
rules of thumb and not hard distinctions.
|
|
400
|
+
</div>
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
<!--
|
|
404
|
+
|
|
405
|
+
<p>The conversion is almost seemless. The task class needs only conform to some simple conventions (in this case
|
|
406
|
+
for example you can see the package_file.include needs to be reduced to a single 'include' attribnute) which are farily
|
|
407
|
+
trivial to implement. This format has been a big hit with Reap's users. Of course it's optional, one can still do
|
|
408
|
+
everything through the Reapfile (but why?).</p>
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
<h2>Sake may have some nice built-in tasks, but we use Rake. So what good is it?</h2>
|
|
412
|
+
|
|
413
|
+
<p>Sake's unix style of many small scripts is fairly orthongonal to Rake's,
|
|
414
|
+
So you can still call upon Sake's built-in scripts in your Rakefile, if you so prefer.
|
|
415
|
+
Check it out:</p>
|
|
416
|
+
|
|
417
|
+
<pre>
|
|
418
|
+
require 'sake/project'
|
|
419
|
+
|
|
420
|
+
desc "Generate RDocs"
|
|
421
|
+
|
|
422
|
+
task :rdoc do
|
|
423
|
+
Automation.rdoc do |s|
|
|
424
|
+
s.template = 'jamis'
|
|
425
|
+
s.include = 'lib/**/*'
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
</pre>
|
|
429
|
+
|
|
430
|
+
<p>Of course, you don't have to use Reap's task system. You can still use Rake's for all your project tasks if
|
|
431
|
+
you prefer or for some reason must, and you can still get Reap's task functionality. Reap provides a simple interface
|
|
432
|
+
for doing this. Here's an example of a Rakefile using Reap.</p>
|
|
433
|
+
|
|
434
|
+
<pre>
|
|
435
|
+
require 'reap/reap'
|
|
436
|
+
|
|
437
|
+
task_package 'pack' do |pkg|
|
|
438
|
+
pkg.distribute = [ 'gem' ]
|
|
439
|
+
pkg.dependencies = [ facets ]
|
|
440
|
+
end
|
|
441
|
+
</pre>
|
|
442
|
+
|
|
443
|
+
<p>In the above, all information is provided directly via the Ruby task code. No information is coming from the
|
|
444
|
+
projectinfo file (same is tru for a Reapfile). But you can also use Rake while utilizing the projectinfo file if
|
|
445
|
+
you wish. In your Rakefile simple put:</p>
|
|
446
|
+
|
|
447
|
+
<pre>
|
|
448
|
+
require 'reap/rake'
|
|
449
|
+
</pre>
|
|
450
|
+
|
|
451
|
+
<p>Then all the tasks defined in the projectinfo file will be available via Rake. You can still add additional
|
|
452
|
+
Rake tasks, of course.</p>
|
|
453
|
+
|
|
454
|
+
<p>Reap can be used in the same fashion as Rake. Simply create a Reapfile and use the <code>reap</code>
|
|
455
|
+
command to utilize your tasks.</p>
|
|
456
|
+
|
|
457
|
+
<p>Adding a extra Reap task is pretty easy. Just define a task in a the special <i>meta/reapfile</i>.
|
|
458
|
+
If you have ever created a task in Rake's 'Rakefile' then you know how to do it here too. A simple
|
|
459
|
+
task would look like this:</p>
|
|
460
|
+
|
|
461
|
+
<pre>
|
|
462
|
+
desc "My special task"
|
|
463
|
+
task :hello do
|
|
464
|
+
puts "Hello, World!"
|
|
465
|
+
end
|
|
466
|
+
</pre>
|
|
467
|
+
|
|
468
|
+
<p>You may not like keeping a "monolithic" file of tasks and instead prefer to keep a collection of
|
|
469
|
+
individual task scripts. You can do this by placing your script in the <i>meta/tasks</i> folder and
|
|
470
|
+
encapsulating your task defintion in the Tasks module.</p>
|
|
471
|
+
|
|
472
|
+
<pre>
|
|
473
|
+
module Tasks
|
|
474
|
+
|
|
475
|
+
desc "My special task"
|
|
476
|
+
task :hello do
|
|
477
|
+
puts "Hello, World!"
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
end
|
|
481
|
+
</pre>
|
|
482
|
+
|
|
483
|
+
-->
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
<script type="text/javascript"> chapter('Describing Tasks with YAML'); </script>
|
|
487
|
+
|
|
488
|
+
<!-- <h2 id="ch3">YAML Task Descriptors</h2> -->
|
|
489
|
+
|
|
490
|
+
<p>You can define tasks using YAML <i>descriptors</i>. These can be placed directly in
|
|
491
|
+
the ProjectInfo file unders a <code>tasks:</code> section. Or kept in a separate file
|
|
492
|
+
called <code>tasks</code>.</p>
|
|
493
|
+
|
|
494
|
+
<pre>
|
|
495
|
+
|
|
496
|
+
# Example tasks file
|
|
497
|
+
|
|
498
|
+
--- %YAML:1.0
|
|
499
|
+
|
|
500
|
+
package: !!package
|
|
501
|
+
distribute : [ tar.bz2, gem, deb ]
|
|
502
|
+
dir: '../package'
|
|
503
|
+
|
|
504
|
+
release: !!release
|
|
505
|
+
host : rubyforge.org
|
|
506
|
+
username : transami
|
|
507
|
+
project : reap
|
|
508
|
+
groupid : 811
|
|
509
|
+
package : Reap
|
|
510
|
+
dir : '../DISTRIBUTION'
|
|
511
|
+
|
|
512
|
+
publish: !!publish
|
|
513
|
+
target : rubyforge
|
|
514
|
+
type : web
|
|
515
|
+
host : rubyforge.org
|
|
516
|
+
username : transami
|
|
517
|
+
dir : web
|
|
518
|
+
|
|
519
|
+
rdoc: !!rdoc
|
|
520
|
+
dir: 'web/doc/api'
|
|
521
|
+
main: README
|
|
522
|
+
|
|
523
|
+
announce: !!announce
|
|
524
|
+
to : ruby-talk@ruby-lang.org
|
|
525
|
+
from : &email transfirz@zmail.com
|
|
526
|
+
domain : unit.rubyforge.org
|
|
527
|
+
server : smtp.gmail.com
|
|
528
|
+
port : 587
|
|
529
|
+
account : *email
|
|
530
|
+
type : login # cram_md5, plain
|
|
531
|
+
security : tls # ~, tls, ssl (not working yet)
|
|
532
|
+
file : doc/LATEST # file contains announcement
|
|
533
|
+
slogan : REAP THE REWARDS!
|
|
534
|
+
links : []
|
|
535
|
+
|
|
536
|
+
</pre>
|
|
537
|
+
|
|
538
|
+
<p>Once you tasks are defined you can see what tasks are ready to run simply by
|
|
539
|
+
typing <code>project</code> without any arguments into the command line.
|
|
540
|
+
For example you might see something like:</p>
|
|
541
|
+
|
|
542
|
+
<pre>
|
|
543
|
+
~/myproj$ project
|
|
544
|
+
[from /home/foome/myprojects/foosys]
|
|
545
|
+
announce Email project announcement.
|
|
546
|
+
doap Generate DOAP project file.
|
|
547
|
+
extest Extract unit-tests from script comments.
|
|
548
|
+
info Display the ProjectInfo file.
|
|
549
|
+
install Locally install package using setup.rb.
|
|
550
|
+
package Build distribution packages.
|
|
551
|
+
publish Publish documents to the web.
|
|
552
|
+
rdoc Generate API Documentation.
|
|
553
|
+
release Release distribution files.
|
|
554
|
+
test Run unit-tests (each in a separate process).
|
|
555
|
+
</pre>
|
|
556
|
+
|
|
557
|
+
<p>To run a task specifiy the name of the task to project, eg. <code>project announce</code>.
|
|
558
|
+
Task names take precedence over build script names.</p>
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
<script type="text/javascript"> chapter('Ratchets a la Rake'); </script>
|
|
562
|
+
|
|
563
|
+
<p>Using Ratchets via Rake is staright-forward, but can be approached in either of two ways.</p>
|
|
564
|
+
|
|
565
|
+
<p>Since Ratchets' project tools are designed as stand-alone reusable modules, one can
|
|
566
|
+
access them directly. For instance let's define an RDoc task by calling directly on
|
|
567
|
+
Ratcehts' <code>Doc.rdoc</code> module method.</p>
|
|
568
|
+
|
|
569
|
+
<pre>
|
|
570
|
+
require 'ratchets/doc'
|
|
571
|
+
|
|
572
|
+
desc 'rdoc the project'
|
|
573
|
+
|
|
574
|
+
task :rdoc do
|
|
575
|
+
Ratchets::Doc.rdoc do |r|
|
|
576
|
+
r.title = "MyApplication"
|
|
577
|
+
r.main = "README"
|
|
578
|
+
r.template = "html"
|
|
579
|
+
r.options = ["--all", "--inline-source"]
|
|
580
|
+
r.include = ["lib/**/*", "bin/*", "[A-Z]*"]
|
|
581
|
+
r.basedir = "src"
|
|
582
|
+
r.output = "rdoc"
|
|
583
|
+
end
|
|
584
|
+
end
|
|
585
|
+
</pre>
|
|
586
|
+
|
|
587
|
+
<p>This usage leaves everything up to the the Rake file. Although most of these fields have reasonable
|
|
588
|
+
defaults. Nonetheless, no information is being provided to the tool via a project information file,
|
|
589
|
+
becuase we are invoking Ratchet's underlying rdoc tool directly.</p>
|
|
590
|
+
|
|
591
|
+
<p>Now let's do the same thing, but via the Project class.</p>
|
|
592
|
+
|
|
593
|
+
<pre>
|
|
594
|
+
require 'ratchets/project'
|
|
595
|
+
|
|
596
|
+
project = Project.new do |info|
|
|
597
|
+
info.title = "MyApplication"
|
|
598
|
+
info.basedir = "src"
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
desc 'rdoc the project'
|
|
603
|
+
|
|
604
|
+
task :rdoc do
|
|
605
|
+
project.rdoc do |r|
|
|
606
|
+
r.main = "README"
|
|
607
|
+
r.template = "html"
|
|
608
|
+
r.options = ["--all", "--inline-source"]
|
|
609
|
+
r.include = ["lib/**/*", "bin/*", "[A-Z]*"]
|
|
610
|
+
r.output = "rdoc"
|
|
611
|
+
end
|
|
612
|
+
end
|
|
613
|
+
</pre>
|
|
614
|
+
|
|
615
|
+
<p>Here we have created a new Project object and have invoked the rdoc tool <i>via</i> it's interface.
|
|
616
|
+
This automatically incorporates general information about the project of use to the tool --in this case
|
|
617
|
+
the project's title and it's basedir. The other fields are rdoc specific so they cannot be shared.
|
|
618
|
+
But we can go a step further and define a set of <i>tool specific defaults</i> for any rdoc task.</p>
|
|
619
|
+
|
|
620
|
+
<pre>
|
|
621
|
+
require 'ratchets/project'
|
|
622
|
+
|
|
623
|
+
project = Project.new(
|
|
624
|
+
:title => "MyApplication"
|
|
625
|
+
:basedir => "src"
|
|
626
|
+
:rdoc => {
|
|
627
|
+
:main => 'README'
|
|
628
|
+
:template => "html"
|
|
629
|
+
:options => ["--all", "--inline-source"]
|
|
630
|
+
:include => ["lib/**/*", "bin/*", "[A-Z]*"]
|
|
631
|
+
:output => "rdoc"
|
|
632
|
+
}
|
|
633
|
+
)
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
desc 'rdoc the project'
|
|
637
|
+
|
|
638
|
+
task :rdoc do
|
|
639
|
+
project.rdoc
|
|
640
|
+
end
|
|
641
|
+
</pre>
|
|
642
|
+
|
|
643
|
+
<p>You'll also notice that we are demonstrating Ratchet's versitility in accepting arguments.
|
|
644
|
+
The <code>Project.new</code> method can take either a hash <u>or</u> a block. In fact, this is
|
|
645
|
+
a widely used pattern throughout Ratchets.</p>
|
|
646
|
+
|
|
647
|
+
<p>One final step. It's is likely we don't need to fuss with each and every tool Ratchets
|
|
648
|
+
provides us. All-in-all we will probably want most, if not all, of them avaialble to us, and
|
|
649
|
+
since Ratcehts generally provides reasonable defaults for most fields, we will rarely have
|
|
650
|
+
to explicitly fill out each one. In fact, every field we gave thus far for rdoc, except
|
|
651
|
+
title and basedir, are the default settings. So to facilitate this, the project class has an
|
|
652
|
+
<code>autonew</code> method which automatically generates all the tasks for every project tool
|
|
653
|
+
Ratchets offers.</p>
|
|
654
|
+
|
|
655
|
+
<pre>
|
|
656
|
+
require 'ratchets/project'
|
|
657
|
+
|
|
658
|
+
project = Project.autonew(
|
|
659
|
+
:title => "MyApplication"
|
|
660
|
+
:basedir => "src"
|
|
661
|
+
)
|
|
662
|
+
</pre>
|
|
663
|
+
|
|
664
|
+
<p>Now when you invoke <code>Rake -T</code> you will see a good sized list of available tasks.</p>
|
|
665
|
+
|
|
666
|
+
<p>The techinque as discussed thus far is quite usable, and those heavily favoring pure Rake usage
|
|
667
|
+
may wish to venture no further than right here. But there are is one final variation that has
|
|
668
|
+
it's own benefits. Rather then store the project information as Ruby code within one's Rakefile,
|
|
669
|
+
the information can be placed in a separate <i>ProjectInfo</i> file (something you are already
|
|
670
|
+
familiar with if you read about Project Generation). To utilize this file, instead of using the
|
|
671
|
+
<code>new</code> or <code>autonew</code> methods you instead use the <code>load</code> and
|
|
672
|
+
<code>autoload</code> methods. The upshot is that your typical Rakefile may have little more
|
|
673
|
+
than these two-lines:</p>
|
|
674
|
+
|
|
675
|
+
<pre>
|
|
676
|
+
require 'ratchets/project'
|
|
677
|
+
Project.autoload
|
|
678
|
+
</pre>
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
<script type="text/javascript"> chapter('The "Sake" Technique'); </script>
|
|
682
|
+
|
|
683
|
+
<p>Sake follows a non-centralized model of design. As such, Sake is essentially a collection of
|
|
684
|
+
tools that make it easy to create your own sand-alone task scripts. Here's a basic example
|
|
685
|
+
session of how such tasks are utilized.</p>
|
|
686
|
+
|
|
687
|
+
<pre>
|
|
688
|
+
$ cd sake/src
|
|
689
|
+
|
|
690
|
+
$ ls
|
|
691
|
+
bin data doc ProjectInfo setup.rb
|
|
692
|
+
_darcs demo lib script work
|
|
693
|
+
|
|
694
|
+
$ lt script/
|
|
695
|
+
[/home/monkey/code/ruby/sake/src]
|
|
696
|
+
script/package # Generate distributable packages
|
|
697
|
+
script/version # Generate VERSION file
|
|
698
|
+
script/release # Release packages to hosting service
|
|
699
|
+
script/changelog # Generate ChangeLog file
|
|
700
|
+
script/rdoc # Generate API documentaiton
|
|
701
|
+
|
|
702
|
+
$ script/version -n
|
|
703
|
+
0.0.1 (2006-08-12)
|
|
704
|
+
</pre>
|
|
705
|
+
|
|
706
|
+
<p>Notice the use of <code>lt</code>. That's an included utility that lists executable
|
|
707
|
+
script in a given directory. It does this by grabbing the first comment line
|
|
708
|
+
(that starts with #) it finds.</p>
|
|
709
|
+
|
|
710
|
+
<br/>
|
|
711
|
+
|
|
712
|
+
<p>Ruby task scripts are plan ruby scripts. The only thing special about them are:</p>
|
|
713
|
+
|
|
714
|
+
<ol><li>The bang header tells the system to run the script as a "rubytask"</li>
|
|
715
|
+
<li>The first comment line describes the task (mainly for use by <code>lt</code>).
|
|
716
|
+
<li>The name of the main method, if used, must be the same as the scripts (minus extension).
|
|
717
|
+
</ol>
|
|
718
|
+
|
|
719
|
+
<p>Here's your obligatory <code>hello</code> example.</p>
|
|
720
|
+
|
|
721
|
+
<pre>
|
|
722
|
+
#! /usr/bin/env rubytask
|
|
723
|
+
|
|
724
|
+
# Hello World
|
|
725
|
+
#
|
|
726
|
+
# This is my first sake script!
|
|
727
|
+
|
|
728
|
+
puts "Hello, World!"
|
|
729
|
+
</pre>
|
|
730
|
+
|
|
731
|
+
<p>How this example simply prints "Hello, World!" to stdout immediately. That may be fine one-off cases,
|
|
732
|
+
but because it does not relegate the execution to a method however, it is not as easily reusable. A better
|
|
733
|
+
way to write this example is:</p>
|
|
734
|
+
|
|
735
|
+
<pre>
|
|
736
|
+
#! /usr/bin/env rubytask
|
|
737
|
+
|
|
738
|
+
# Hello World
|
|
739
|
+
#
|
|
740
|
+
# This is my first sake script!
|
|
741
|
+
|
|
742
|
+
def hello
|
|
743
|
+
puts "Hello, World!"
|
|
744
|
+
end
|
|
745
|
+
</pre>
|
|
746
|
+
|
|
747
|
+
<p>Keep in mind, for this to work, the file itself must be named 'hello' or 'hello.rb'
|
|
748
|
+
to match the main method's name.</p>
|
|
749
|
+
|
|
750
|
+
<p>Ratcehts provides a convenient mechanism by which to call other stand-alone tasks
|
|
751
|
+
simply by calling them as another method.</p>
|
|
752
|
+
|
|
753
|
+
<pre>
|
|
754
|
+
#!/usr/bin/env rubytask
|
|
755
|
+
|
|
756
|
+
# General preperation
|
|
757
|
+
#
|
|
758
|
+
# This script preforms a number of tasks to prepare for release.
|
|
759
|
+
|
|
760
|
+
testrun
|
|
761
|
+
changelog
|
|
762
|
+
version
|
|
763
|
+
</pre>
|
|
764
|
+
|
|
765
|
+
<p>This will call three external scripts in order: test, changelog and version.
|
|
766
|
+
Sometimes there is method is already defined with the same name as an external task. In those
|
|
767
|
+
cases you can manually invoke the extrneal method via the <code>#rubytask</code> method.
|
|
768
|
+
For instance the above can be also written:</p>
|
|
769
|
+
|
|
770
|
+
<pre>
|
|
771
|
+
#!/usr/bin/env rubytask
|
|
772
|
+
|
|
773
|
+
# General preperation
|
|
774
|
+
#
|
|
775
|
+
# This script preforms a number of tasks to prepare for release.
|
|
776
|
+
|
|
777
|
+
system_task 'testrun'
|
|
778
|
+
system_task 'changelog'
|
|
779
|
+
system_task 'version'
|
|
780
|
+
</pre>
|
|
781
|
+
|
|
782
|
+
<p>The two forms are completely equivalent. The former is simply calling #system_task behined the scenes.</p>
|
|
783
|
+
|
|
784
|
+
<p>The <code>rubytask</code> method restricts the same task from being run twice in the same execution session,
|
|
785
|
+
so there's not need to worry about cascading task calls. On the other hand if you wish to reuse a task more
|
|
786
|
+
than once, here's how to write a script to do so.</p>
|
|
787
|
+
|
|
788
|
+
<pre>
|
|
789
|
+
#!/usr/bin/env rubytask
|
|
790
|
+
|
|
791
|
+
require_local 'hello'
|
|
792
|
+
|
|
793
|
+
# Say hello three times
|
|
794
|
+
|
|
795
|
+
hello
|
|
796
|
+
hello
|
|
797
|
+
hello
|
|
798
|
+
</pre>
|
|
799
|
+
|
|
800
|
+
<p>The "Sake" technique of creating tasks for a project takes a little more time to setup.
|
|
801
|
+
But it has many distinct advantages. Among them:</p>
|
|
802
|
+
|
|
803
|
+
<ul>
|
|
804
|
+
<li>Tasks are clearly enumerable and can be viewed like any other file-system folder.</li>
|
|
805
|
+
<li>Individual tasks can be quickly edited without having to sort through other task definitions.</li>
|
|
806
|
+
<li>Permissions on tasks can be restricted individually.</li>
|
|
807
|
+
<li>Shell-based tools can coexist along side rubytask tools.</li>
|
|
808
|
+
</ul>
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
<script type="text/javascript"> chapter('Lookup and Do'); </script>
|
|
812
|
+
|
|
813
|
+
<p>What if I want to run a task script, but I'm currently way down in the
|
|
814
|
+
project's directory tree. I dont want to <code>cd</code> all the way up or type
|
|
815
|
+
<code>../</code> a bunch of times.</h2>
|
|
816
|
+
|
|
817
|
+
<p>Sake provides a utility called <code>ludo</code> which stands for
|
|
818
|
+
<i>lookup and do</i>. Just prepend that command to your invocation and it
|
|
819
|
+
will find the executable and execute it.</p>
|
|
820
|
+
|
|
821
|
+
<pre>
|
|
822
|
+
% ludo script/info
|
|
823
|
+
</pre>
|
|
824
|
+
|
|
825
|
+
<p>By the way, the <code>ludo</code> command can be used anywhere you like, it is
|
|
826
|
+
not dependent on Sake to work. Albeit you should exercise some caution when doing
|
|
827
|
+
so since <code>ludo</code> actively searches up the directory tree for a script
|
|
828
|
+
to execute.</p>
|
|
829
|
+
|
|
830
|
+
|
|
831
|
+
<br/>
|
|
832
|
+
|
|
833
|
+
<p>By the way, if you'd like to really make <i>sake</i> here's the process:</h2>
|
|
834
|
+
|
|
835
|
+
<div style="margin: 20px; margin-bottom: 50px;">
|
|
836
|
+
<img src="img/process.gif"/>
|
|
837
|
+
</div>
|
|
838
|
+
|
|
839
|
+
<p>Good luck with that. <code>;)</code></p>
|
|
840
|
+
|
|
841
|
+
</div>
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
<!-- Build Tools -->
|
|
845
|
+
|
|
846
|
+
<div id="tool" class="section">
|
|
847
|
+
|
|
848
|
+
<img src="img/redratchet.jpg" align="right" style="margin-top: -30px; padding: 10px;"/>
|
|
849
|
+
|
|
850
|
+
<div class="part">Part III</div>
|
|
851
|
+
|
|
852
|
+
<div id="title1" style="color: #888844;">Tool Utilization</div>
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
<script type="text/javascript"> chapter('Tools and the Project Class'); </script>
|
|
856
|
+
|
|
857
|
+
<p>At it's core it is a set of integrated tools designed to simplify the life
|
|
858
|
+
of Ruby application developers and project managers. The built-in tools cover
|
|
859
|
+
the full range of common project needs, from setting up a standard project structure
|
|
860
|
+
to packaging and making announcements. Because of commonality between the tools,
|
|
861
|
+
Reap utilizes a central YAML configuration file(s) to harvest project information.
|
|
862
|
+
This significantly simplifies usage.</p>
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
<p>Custom tasks can also be easily created to suit specific project requirements.
|
|
866
|
+
In this respect Reap is much like Rake.
|
|
867
|
+
|
|
868
|
+
<p>Reap differentiates itself from the other build tools in a number of ways.
|
|
869
|
+
It supports a variety of techinues for utilizing tools and defining tasks.
|
|
870
|
+
Reap can be used as a Rake-clone. In fact Reap is a nearly 100% compatible
|
|
871
|
+
replacement for Rake[1]. On the other hand, if you can't pull yourself
|
|
872
|
+
away from Rake, Reap's tasks can also be used via Rake much like any other set of
|
|
873
|
+
addon Rake tasks.</p>
|
|
874
|
+
|
|
875
|
+
<p>Reap tasks can also be defined as standard executables, the ability to use YAML
|
|
876
|
+
to easily setup built-in tasks, the use of a centralized data resource for project
|
|
877
|
+
information and it's extensive library of built-in tasks. The built-in tasks are
|
|
878
|
+
extensive enough that Sake can also be thought of as a complete project managment
|
|
879
|
+
assitant application.</p>
|
|
880
|
+
|
|
881
|
+
|
|
882
|
+
<script type="text/javascript"> chapter('Revision Tools'); </script>
|
|
883
|
+
|
|
884
|
+
<p>Revision tools are tied to a particular revision control system like SVN or Darcs. The one exception is
|
|
885
|
+
the backup tool which simply makes a raw compress backup of your source repository. Because of the
|
|
886
|
+
tie into the particluar revision system you should make sure the <code>scm:</code> entry is set in your
|
|
887
|
+
ProjectInfo file, otherwise these tools will not be be available. Vaild settings are <code>cvs</code>,
|
|
888
|
+
<code>svn</code>, <code>git</code> and <code>darcs</darcs>.</p>
|
|
889
|
+
|
|
890
|
+
<p><span class="red">IMPORTANT!</span> Only Darcs is fully supported at this time. The others will be supported
|
|
891
|
+
in a future release.</p>
|
|
892
|
+
|
|
893
|
+
<h2>Backup</h2>
|
|
894
|
+
|
|
895
|
+
<p>Backup tool provides a facility to quuickly backup a project. The location of the backup will be under the given
|
|
896
|
+
output folder, then under the name of the project and a subdirectory of the day’s date.
|
|
897
|
+
For example, Ratchets itself was backed up to today at: <code>/var/backup/ratchets/ratchets_2006_10_21.tar.gz</code></p>
|
|
898
|
+
|
|
899
|
+
<pre class="list">
|
|
900
|
+
name Name of project/backup
|
|
901
|
+
output The backup directory (eg. '/var/backup')
|
|
902
|
+
folder The directory to backup. [.]
|
|
903
|
+
</pre>
|
|
904
|
+
|
|
905
|
+
<h2>History</h2>
|
|
906
|
+
|
|
907
|
+
<p>The history tool produces a ChangeLog. The ChangeLog can be had in a number of styles.
|
|
908
|
+
Presently <code>gnu</code> and <code>compact</code> are support. Both <code>xml</code> and
|
|
909
|
+
<code>yaml</code> formats will be available in an upcoming release.</p>
|
|
910
|
+
|
|
911
|
+
<pre class="list">
|
|
912
|
+
output File to save the log. [doc/ChangeLog]
|
|
913
|
+
style ChangeLog format. [gnu]
|
|
914
|
+
</pre>
|
|
915
|
+
|
|
916
|
+
<h2>Stamp</h2>
|
|
917
|
+
|
|
918
|
+
<p>The stamp tool produces a VERSION stamp. This is one-line string that gives
|
|
919
|
+
version, release status and release date in a concise and readable, but machine parsable
|
|
920
|
+
format.
|
|
921
|
+
|
|
922
|
+
<pre class="list">
|
|
923
|
+
version Version of release.
|
|
924
|
+
status Status of release (eg. beta, RC1).
|
|
925
|
+
released Date of release.
|
|
926
|
+
file File to save the version stamp.
|
|
927
|
+
</pre>
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
<script type="text/javascript"> chapter('Progress Tools'); </script>
|
|
931
|
+
|
|
932
|
+
<h2>Notes</h2>
|
|
933
|
+
|
|
934
|
+
<p>The notes tool can lookup and list TODO, FIXME and other types of labeled comments from source code.</p>
|
|
935
|
+
|
|
936
|
+
<pre class="list">
|
|
937
|
+
include File pattern selecting files to analyze.
|
|
938
|
+
Default pattern is 'lib/**/*'.
|
|
939
|
+
label Types of notes to find [TODO, FIXME].
|
|
940
|
+
</pre>
|
|
941
|
+
|
|
942
|
+
<h2>Stats</h2>
|
|
943
|
+
|
|
944
|
+
<p>The stats tools provides file and LOC analysis of your code.</p>
|
|
945
|
+
|
|
946
|
+
<pre class="list">
|
|
947
|
+
include The files to include in analysis.
|
|
948
|
+
Default pattern is 'lib/**/*'.
|
|
949
|
+
exclude The files to exclude from analysis.
|
|
950
|
+
</pre>
|
|
951
|
+
|
|
952
|
+
<h2>Test</h2>
|
|
953
|
+
|
|
954
|
+
<p>Run unit-tests (each in a separate process).</p>
|
|
955
|
+
|
|
956
|
+
<p>It will run unit tests. Each test file is run in a separate interpretor to prevent script clash.</p>
|
|
957
|
+
|
|
958
|
+
<p>The Test class runs each test in it’s own proccess, making for a more pure test facility.
|
|
959
|
+
This prevents potential conflicts between scripts.</p>
|
|
960
|
+
|
|
961
|
+
<pre class="list">
|
|
962
|
+
tests Test files (eg. test/tc_**/*.rb)
|
|
963
|
+
|
|
964
|
+
Defaults to typcial selection.
|
|
965
|
+
libs List of lookup directories to include in
|
|
966
|
+
load path. './lib' is always included.
|
|
967
|
+
live Flag to quickly deactive use of local libs.
|
|
968
|
+
Test against installed files instead.
|
|
969
|
+
reqs List of any files to pre-require.
|
|
970
|
+
</pre>
|
|
971
|
+
|
|
972
|
+
<p>NOTE This works well enough but it is a tad delicate. It actually marshals test results across
|
|
973
|
+
stdout->stdin shell pipe. One consequence of this is that you can’t send debug info to stdout in
|
|
974
|
+
your tests #(including p and puts).</p>
|
|
975
|
+
|
|
976
|
+
|
|
977
|
+
<script type="text/javascript"> chapter('Manifest Tools'); </script>
|
|
978
|
+
|
|
979
|
+
<h2>Manifest</h2>
|
|
980
|
+
|
|
981
|
+
<p>Manifest class produces a simple file manifest for a project, listing the path
|
|
982
|
+
of each file and it’s MD5 checksum.
|
|
983
|
+
Create a manifest file for the package. By default is a very simple filename manifest.
|
|
984
|
+
The check type can be supplied and a checksum will be given with each filename.
|
|
985
|
+
In the future this will be exanded to build a varity of manifest formats.</p>
|
|
986
|
+
|
|
987
|
+
<pre class="list">
|
|
988
|
+
include Files to include.
|
|
989
|
+
exclude Files to exclude from the included.
|
|
990
|
+
file Save the manifest to this file (otherwise stdout).
|
|
991
|
+
digest Include optional digest type:
|
|
992
|
+
md5, sha128 (sha1), sha256, sha512
|
|
993
|
+
</pre>
|
|
994
|
+
|
|
995
|
+
<h2>Sign</h2>
|
|
996
|
+
|
|
997
|
+
<p>Sign class will generate signitures for a library’s files. It also can generate
|
|
998
|
+
a public key for the project if it does not have one. You must supply a private key.</p>
|
|
999
|
+
|
|
1000
|
+
<pre class="list">
|
|
1001
|
+
name Project name.
|
|
1002
|
+
keyfile Pathname top .pem file of private key.
|
|
1003
|
+
include Glob of files to include.
|
|
1004
|
+
exclude Glob of files to exclude.
|
|
1005
|
+
output Dir to store signiture files [data/{name}/sig].
|
|
1006
|
+
</pre>
|
|
1007
|
+
|
|
1008
|
+
|
|
1009
|
+
<script type="text/javascript"> chapter('Documentation Tools'); </script>
|
|
1010
|
+
|
|
1011
|
+
<h2>Rdoc</h2>
|
|
1012
|
+
|
|
1013
|
+
<p>RDoc tool is a user-friendly interface for generating RDocs via the rdoc shell command.
|
|
1014
|
+
This tool generates API documentation from source comments.</p>
|
|
1015
|
+
|
|
1016
|
+
<pre class="list">
|
|
1017
|
+
title Project title to use in documentation.
|
|
1018
|
+
output Directory to store documentation [doc]
|
|
1019
|
+
source Project location to document [.]
|
|
1020
|
+
main File to use as main page [README]
|
|
1021
|
+
template Which RDoc template to use [html]
|
|
1022
|
+
include Files to include in RDocs
|
|
1023
|
+
exclude Files to exclude from those
|
|
1024
|
+
options Pass-thru extra options to RDoc command
|
|
1025
|
+
</pre>
|
|
1026
|
+
|
|
1027
|
+
<h2>Publish</h2>
|
|
1028
|
+
|
|
1029
|
+
<p>The publish tools provides a simple way to upload documents or even an entire
|
|
1030
|
+
website to a host.</p>
|
|
1031
|
+
|
|
1032
|
+
<pre class="list">
|
|
1033
|
+
include Files to include.
|
|
1034
|
+
</pre>
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
<script type="text/javascript"> chapter('Release Tools'); </script>
|
|
1038
|
+
|
|
1039
|
+
<h2>Announce</h2>
|
|
1040
|
+
|
|
1041
|
+
<p>The announce tool handles release announcements. It generates a nicely
|
|
1042
|
+
formated message and then emails to the specified address(es).</p>
|
|
1043
|
+
|
|
1044
|
+
<pre class="list">
|
|
1045
|
+
title Project title [title].
|
|
1046
|
+
version Project version [version].
|
|
1047
|
+
summary Brief one-line description [summary].
|
|
1048
|
+
description Long description of project [description].
|
|
1049
|
+
homepage Project homepage web address [homepage].
|
|
1050
|
+
links Array of http links to related sites.
|
|
1051
|
+
file File that contains announcement message.
|
|
1052
|
+
memo Embedded announcement message.
|
|
1053
|
+
slogan Motto for you project.
|
|
1054
|
+
email Send email otherwise just display announcement.
|
|
1055
|
+
</pre>
|
|
1056
|
+
|
|
1057
|
+
<p>If email is set to true, then these also apply:</p>
|
|
1058
|
+
|
|
1059
|
+
<pre class="list">
|
|
1060
|
+
subject Subject of email message.
|
|
1061
|
+
from Message FROM address [email].
|
|
1062
|
+
to Email address to send announcemnt.
|
|
1063
|
+
server Email server to route message.
|
|
1064
|
+
port Email server's port.
|
|
1065
|
+
domain Email server's domain name.
|
|
1066
|
+
account Email account name.
|
|
1067
|
+
login Login type: plain, cram_md5 or login.
|
|
1068
|
+
secure Uses TLS security, true or false?
|
|
1069
|
+
</pre>
|
|
1070
|
+
|
|
1071
|
+
<p>(Square brackets indicate defaults taken from Project information. if used via Project class.)</p>
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
<h2>Package</h2>
|
|
1075
|
+
|
|
1076
|
+
<p>Create distribution packages.
|
|
1077
|
+
|
|
1078
|
+
<p>This tool can create standard .zip, .tgz, or .tbz packages, plus .gem, .deb and other distributions.</p>
|
|
1079
|
+
|
|
1080
|
+
<p>Builds distribution packages. The package task supports tar.gz, tar.bz2, zip source packages
|
|
1081
|
+
and gem, pacman and debian ditribution packages.</p>
|
|
1082
|
+
|
|
1083
|
+
<pre class="list">
|
|
1084
|
+
Inherited settings:
|
|
1085
|
+
|
|
1086
|
+
name Package name.
|
|
1087
|
+
version Package version.
|
|
1088
|
+
architecture Can be any, i368, i686, ppc, etc.
|
|
1089
|
+
executables Executable files in this distribution.
|
|
1090
|
+
|
|
1091
|
+
Tool specific settings:
|
|
1092
|
+
|
|
1093
|
+
output Directory in which to store distributions.
|
|
1094
|
+
include Files to include in distribution.
|
|
1095
|
+
exclude Files to exclude from those.
|
|
1096
|
+
formats List of distribution formats desired. Eg.
|
|
1097
|
+
tgz, tar.gz, tbz, tar.bz2, zip
|
|
1098
|
+
gem, deb, rpm, pac, etc.
|
|
1099
|
+
tier Version tier the package (for use with Library).
|
|
1100
|
+
rules Specify where files should go in package (see below).
|
|
1101
|
+
|
|
1102
|
+
Seetings that can be of use depending on the package format.
|
|
1103
|
+
|
|
1104
|
+
category Software category.
|
|
1105
|
+
dependencies List of packages this depends.
|
|
1106
|
+
recommends List of packages that can be used with this package.
|
|
1107
|
+
replaces List of packages this one replaces.
|
|
1108
|
+
|
|
1109
|
+
RubyGems specific settings:
|
|
1110
|
+
|
|
1111
|
+
autorequire
|
|
1112
|
+
platform
|
|
1113
|
+
require_paths
|
|
1114
|
+
</pre>
|
|
1115
|
+
|
|
1116
|
+
<p>If you need to vary settings according to the format, all you need to do is create
|
|
1117
|
+
separate package tasks.</p>
|
|
1118
|
+
|
|
1119
|
+
<p>There is one parameter that deserves additional attention. This is the setting called ‘rules’.
|
|
1120
|
+
The rules setting allows you to define how files are copied into the distribution package, so instead
|
|
1121
|
+
of a one to one copy of the included files, you can actually have a file placed in a different
|
|
1122
|
+
location within the distribution. This can be very handy if you wish to develop your project with one
|
|
1123
|
+
layout, but need to distribute it with another.</p>
|
|
1124
|
+
|
|
1125
|
+
<p>See the Stage module for details on using rules.</p>
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
<h2>Release</h2>
|
|
1129
|
+
|
|
1130
|
+
<p>Upload release packages to hosting service.
|
|
1131
|
+
This task releases files to a host such as RubyForge.</p>
|
|
1132
|
+
|
|
1133
|
+
<pre class="list">
|
|
1134
|
+
folder Distribution directory
|
|
1135
|
+
exclude Distribution types to exclude
|
|
1136
|
+
package Package name
|
|
1137
|
+
date Date of release (defaults to Time.now)
|
|
1138
|
+
processor Processor/Architecture (Any, i386, PPC, etc.)
|
|
1139
|
+
release Release name (default is version number)
|
|
1140
|
+
is_public Public release?
|
|
1141
|
+
|
|
1142
|
+
changes Changes given in string form.
|
|
1143
|
+
notes Release notes given in string form.
|
|
1144
|
+
-or-
|
|
1145
|
+
changelog Change log file
|
|
1146
|
+
notelog Release notes file
|
|
1147
|
+
</pre>
|
|
1148
|
+
|
|
1149
|
+
<p>The release option can be a template by using %s in the string.
|
|
1150
|
+
The version number of your project will be sub’d in for the %s.
|
|
1151
|
+
This saves you from having to update the release name before every release.</p>
|
|
1152
|
+
|
|
1153
|
+
|
|
1154
|
+
<script type="text/javascript"> chapter('Deployment Tools'); </script>
|
|
1155
|
+
|
|
1156
|
+
<h2>Setup</h2>
|
|
1157
|
+
|
|
1158
|
+
<p>This tool builds and installs a project using setup.rb or install.rb.
|
|
1159
|
+
If neither exist setup.rb will be created for the purpose.</p>
|
|
1160
|
+
|
|
1161
|
+
<pre class="list">
|
|
1162
|
+
options Command line options to add to shell command.
|
|
1163
|
+
</pre>
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
<script type="text/javascript"> chapter('Creating Custom Tools'); </script>
|
|
1167
|
+
|
|
1168
|
+
<p>Adding code to a rakefile or a sake-style script is fine for one-off tasks. But what if you
|
|
1169
|
+
need a more versitle and reusable tool --one you can add to your projectinfo file like Ratchets
|
|
1170
|
+
built-in tools? In that case you need to build a <i>custom tool</i>.</p>
|
|
1171
|
+
|
|
1172
|
+
<p>If you have custom tools you'd like to use for all your projects you can place them
|
|
1173
|
+
either in you home directory under ~/.share/ratchets/tools/, or you could make them
|
|
1174
|
+
universally available to all users in the shared data directory, on Debian,
|
|
1175
|
+
/usr/share/ratchets/tools/. If, on the other hand, the tool is specific to a project,
|
|
1176
|
+
place it in a project tools/ folder.</p>
|
|
1177
|
+
|
|
1178
|
+
<div class="special"><b>IMPORTANT!</b> While this is how you write a custom tool, the loading
|
|
1179
|
+
of custom tools is still on our TODO list. Sake-style scripts will have to suffice until
|
|
1180
|
+
we get this fixed.</div>
|
|
1181
|
+
|
|
1182
|
+
<p>Here's a "simple" example of a custom tool:</p>
|
|
1183
|
+
|
|
1184
|
+
<pre>
|
|
1185
|
+
# Add tool to a tool module (or add to an existing tool module).
|
|
1186
|
+
|
|
1187
|
+
module MyToolModule
|
|
1188
|
+
|
|
1189
|
+
module_function # very important!
|
|
1190
|
+
|
|
1191
|
+
def simple( keys=nil, &yld )
|
|
1192
|
+
keys = (keys||yld).to_openobject
|
|
1193
|
+
|
|
1194
|
+
message = keys.message
|
|
1195
|
+
signed = keys.signed || '-annonymous'
|
|
1196
|
+
|
|
1197
|
+
puts message + "\n\n" + signed
|
|
1198
|
+
end
|
|
1199
|
+
|
|
1200
|
+
end
|
|
1201
|
+
|
|
1202
|
+
# To use the new tool via project, add a tool interface.
|
|
1203
|
+
|
|
1204
|
+
class Project
|
|
1205
|
+
|
|
1206
|
+
tool :simple, 'my custom tool'
|
|
1207
|
+
|
|
1208
|
+
def simple( keys )
|
|
1209
|
+
keys = keys.to_h
|
|
1210
|
+
keys *= {
|
|
1211
|
+
:message => info.message
|
|
1212
|
+
}
|
|
1213
|
+
keys *= (info[:simple] || {})
|
|
1214
|
+
MyToolModule.simple(keys)
|
|
1215
|
+
end
|
|
1216
|
+
|
|
1217
|
+
end
|
|
1218
|
+
</pre>
|
|
1219
|
+
|
|
1220
|
+
<p>The corresponding settings in the ProjectInfo file can then be:</p>
|
|
1221
|
+
|
|
1222
|
+
<pre>
|
|
1223
|
+
message: Hi, how are you?
|
|
1224
|
+
|
|
1225
|
+
tasks:
|
|
1226
|
+
|
|
1227
|
+
simple: !!simple
|
|
1228
|
+
signed: Your friend, Tom.
|
|
1229
|
+
</pre>
|
|
1230
|
+
|
|
1231
|
+
<p>And to use it type:</p>
|
|
1232
|
+
|
|
1233
|
+
<pre>
|
|
1234
|
+
$ project simple
|
|
1235
|
+
</pre>
|
|
1236
|
+
|
|
1237
|
+
<p>Notice the reference to 'info'. This is an OpenStruct-like interface to the project information.</p>
|
|
1238
|
+
|
|
1239
|
+
<p>It's a good idea to take some time and learn all the standard properties of a project's information file
|
|
1240
|
+
which you can draw on for your own tools. Looking at the RDoc API documentation will elucidate most of them.
|
|
1241
|
+
And, of course you can also invent your own if needed.</p>
|
|
1242
|
+
|
|
1243
|
+
<p>The rest of building a tool is a matter or writing the code to have it do what you want. If you
|
|
1244
|
+
develop any nice tools, be sure to pass them along!
|
|
1245
|
+
</p>
|
|
1246
|
+
|
|
1247
|
+
|
|
1248
|
+
<script type="text/javascript"> chapter('Reaping the Rewards'); </script>
|
|
1249
|
+
|
|
1250
|
+
<p>As you can see there are many tools...</p>
|
|
1251
|
+
|
|
1252
|
+
</div>
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
<!-- Test Services -->
|
|
1256
|
+
|
|
1257
|
+
<div id="test" class="section">
|
|
1258
|
+
|
|
1259
|
+
<img src="img/test.jpg" align="right" style="margin-top: -25px; padding: 10px;"/>
|
|
1260
|
+
|
|
1261
|
+
<div class="part">Part IV</div>
|
|
1262
|
+
|
|
1263
|
+
<div id="title1">Test Services</div>
|
|
1264
|
+
|
|
1265
|
+
<br/><br/>
|
|
1266
|
+
|
|
1267
|
+
<div style="color: white; width: 40%; font: bold 1.5em monospace; background: red; text-align: center;">
|
|
1268
|
+
WARNING!!! TEST SERVICES ARE NOT READY FOR GENERAL USE!
|
|
1269
|
+
</div>
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
<script type="text/javascript"> chapter('Summary of Test Services'); </script>
|
|
1273
|
+
|
|
1274
|
+
<p>Ratchet's provides a number of different tools to help you
|
|
1275
|
+
test your applicaitons. Running units test was briefly covered
|
|
1276
|
+
in Tool Utilization, but Ratchets' test services are far more
|
|
1277
|
+
extensive. These include a full testing framework similar to
|
|
1278
|
+
Test Unit and RSpec, mock object classes to facilitate test
|
|
1279
|
+
creation, and a versitle breakpoint tool, as well as a variety
|
|
1280
|
+
of test run styles and modes.
|
|
1281
|
+
</p>
|
|
1282
|
+
|
|
1283
|
+
|
|
1284
|
+
<script type="text/javascript"> chapter('Unit Test Framework'); </script>
|
|
1285
|
+
|
|
1286
|
+
<p>Ratchet's test framework is actually very simple in design. It is centered around a simple
|
|
1287
|
+
functor (ie. a function decorator) that routes all calls though an assertion hook. The functor
|
|
1288
|
+
is accessed the the <code>should</code> method, or it negating counterpart <code>should_not</code>.
|
|
1289
|
+
Via this special functor, we can use all of Ruby's typical commands to test assertions wihtout
|
|
1290
|
+
learning any special purpose DSL.</p>
|
|
1291
|
+
|
|
1292
|
+
<p>Consider this simple example.</p>
|
|
1293
|
+
|
|
1294
|
+
<pre>
|
|
1295
|
+
a = 1
|
|
1296
|
+
a == 1
|
|
1297
|
+
a.should == 1
|
|
1298
|
+
</pre>
|
|
1299
|
+
|
|
1300
|
+
<p>The difference between the 2nd and 3rd lines...</p>
|
|
1301
|
+
|
|
1302
|
+
<p>Ratchets' Test Framework also support Behavior Driven Devlopment. BDD is primarily a
|
|
1303
|
+
differnece in one's frame of mind rather the a substatially differnt meand of testing.
|
|
1304
|
+
But two method facilitate that minset: context and ???.</p>
|
|
1305
|
+
|
|
1306
|
+
<pre>
|
|
1307
|
+
context "some context" do
|
|
1308
|
+
??? "some ???" do
|
|
1309
|
+
a.should == 1
|
|
1310
|
+
end
|
|
1311
|
+
end
|
|
1312
|
+
</pre>
|
|
1313
|
+
|
|
1314
|
+
<p></p>
|
|
1315
|
+
|
|
1316
|
+
|
|
1317
|
+
<script type="text/javascript"> chapter('Making a Mockery'); </script>
|
|
1318
|
+
|
|
1319
|
+
<p>Ratchets has a few mocking classes to make test writing easier. Mock objects
|
|
1320
|
+
are object that pretend to be other object. There is a generic mock object
|
|
1321
|
+
with versitle setup commands for creating complex mock interactions quickly and
|
|
1322
|
+
easily. There are also IO, File and Dir mock objects to avoid testing against
|
|
1323
|
+
fixtures. In the works is also an AOP-based wrapping mechinism that (with
|
|
1324
|
+
any luck) will make mocking pre-existing classes a snap.</p>
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
<script type="text/javascript"> chapter('Breakpoints and Tracepoints'); </script>
|
|
1328
|
+
|
|
1329
|
+
<p>Ratchets provides a couple of breakpoint tools. These can be
|
|
1330
|
+
run externally or invoked by your code. Ratchets breakpoint system
|
|
1331
|
+
is quite versitle, based on the work Florian Gross' and Mentalurgy
|
|
1332
|
+
it can drop you into an irb seesion, or it can drop you into your
|
|
1333
|
+
favorite editor at the point of failure.</p>
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
<script type="text/javascript"> chapter('Additional Testing Services'); </script>
|
|
1337
|
+
|
|
1338
|
+
<p>Ratchets has a few additional testing tools that may be of use.</p>
|
|
1339
|
+
|
|
1340
|
+
<p>The MethodProbe is an interesting tool that allows one to drop
|
|
1341
|
+
<i>decoy</i> arguments into a method and extract parameter interface
|
|
1342
|
+
requirements. Unfortunately MethodProbe is an imperfect device
|
|
1343
|
+
because Ruby does not expose all of it's features as overridable
|
|
1344
|
+
methods, in particular conditionals like <code>if</code> are not
|
|
1345
|
+
methods. So not all parameter interfaces can be determined.
|
|
1346
|
+
But with selective usage MehtodProbe can provide useful information.</p>
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
<script type="text/javascript"> chapter('Excerpt Runner'); </script>
|
|
1350
|
+
|
|
1351
|
+
<p>You may learn about Reap's ability to extract unit tests from source code wrapped in
|
|
1352
|
+
<code>=begin test...=end</code> comment blocks.</p>
|
|
1353
|
+
|
|
1354
|
+
<pre>
|
|
1355
|
+
=begin test
|
|
1356
|
+
|
|
1357
|
+
require 'test/unit'
|
|
1358
|
+
|
|
1359
|
+
class TestThis < Test::Unit::TestCase
|
|
1360
|
+
assert_equal( 2, 1+1 )
|
|
1361
|
+
end
|
|
1362
|
+
|
|
1363
|
+
=end
|
|
1364
|
+
</pre>
|
|
1365
|
+
|
|
1366
|
+
<p>This can be amazing convenient, especailly for testing functional support scripts. But it's not a
|
|
1367
|
+
convenient to have to extract your tests every time you need to run <i>one</i>. To solve this problem,
|
|
1368
|
+
Reap also includes a command called <code>rubytest</code>. To us it simply navigate to the file in
|
|
1369
|
+
question (eg. the one with the commented test, of course) and type:</p>
|
|
1370
|
+
|
|
1371
|
+
<pre>
|
|
1372
|
+
% exrb myscript.rb
|
|
1373
|
+
</pre>
|
|
1374
|
+
|
|
1375
|
+
<p>And you'll see your standard test assertion feedback.</p>
|
|
1376
|
+
|
|
1377
|
+
</div>
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
<!-- Appendix -->
|
|
1381
|
+
|
|
1382
|
+
<div id="appendix" class="section">
|
|
1383
|
+
|
|
1384
|
+
<img src="img/appendix.png" align="right" style="margin-top: -25px; padding: 10px;"/>
|
|
1385
|
+
|
|
1386
|
+
<div class="part">Appendix</div>
|
|
1387
|
+
|
|
1388
|
+
|
|
1389
|
+
<script type="text/javascript"> chapter('License'); </script>
|
|
1390
|
+
|
|
1391
|
+
<p>
|
|
1392
|
+
Ratcehts<br/>
|
|
1393
|
+
Copyright © 2006 Thomas Sawyer</br>
|
|
1394
|
+
</p>
|
|
1395
|
+
|
|
1396
|
+
<p>Ruby/GPL License</p>
|
|
1397
|
+
|
|
1398
|
+
<p>This program is free software; you can redistribute it and/or modify
|
|
1399
|
+
it under the terms of the Ruby License or GNU General Public License
|
|
1400
|
+
as published by the Free Software Foundation; either version 2 of the
|
|
1401
|
+
License, or (at your option) any later version.</p>
|
|
1402
|
+
|
|
1403
|
+
<p>This program is distributed in the hope that it will be useful,
|
|
1404
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
1405
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
1406
|
+
GNU General Public License for more details.</p>
|
|
1407
|
+
|
|
1408
|
+
<p>You should have received a copy of the GNU General Public License
|
|
1409
|
+
along with this program; if not, write to the Free Software
|
|
1410
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p>
|
|
1411
|
+
|
|
1412
|
+
</div>
|
|
1413
|
+
|
|
1414
|
+
</div>
|
|
1415
|
+
</body>
|
|
1416
|
+
</html>
|