saga 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -1
- data/README.rdoc +49 -14
- data/Rakefile +2 -4
- data/VERSION +1 -1
- data/lib/saga/formatter.rb +18 -11
- data/lib/saga/runner.rb +30 -14
- data/saga.gemspec +3 -2
- data/test/fixtures/document.erb +80 -0
- data/test/saga_formatter_spec.rb +16 -2
- data/test/saga_runner_spec.rb +41 -3
- data/test/saga_spec.rb +2 -2
- data/test/spec_helper.rb +1 -1
- metadata +6 -5
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -2,15 +2,22 @@
|
|
2
2
|
|
3
3
|
Saga is a tool to convert the requirements format used at Fingertips to HTML.
|
4
4
|
|
5
|
-
The Saga document consists of three major parts: an introduction, the stories,
|
5
|
+
The Saga document consists of three major parts: an introduction, the stories,
|
6
|
+
and definitions. The document is usually a succinct and complete description of
|
7
|
+
a piece of software. Anyone reading the document should get a fairly good idea
|
8
|
+
of the application without further information.
|
9
|
+
|
6
10
|
|
7
11
|
=== The introduction
|
8
12
|
|
9
|
-
The first line of the document is the title. You can start the line with
|
13
|
+
The first line of the document is the title. You can start the line with
|
14
|
+
‘Requirements’, but this is not compulsory.
|
10
15
|
|
11
16
|
Requirements Saga
|
12
17
|
|
13
|
-
After the title follows a list of authors. It's encouraged to add all the
|
18
|
+
After the title follows a list of authors. It's encouraged to add all the
|
19
|
+
authors, this way people know who to speak to for more information about the
|
20
|
+
stories. Only the name of the author is compulsory.
|
14
21
|
|
15
22
|
- Manfred Stienstra, manfred@fngtps.com, Fingertips, http://www.fngtps.com
|
16
23
|
|
@@ -18,28 +25,39 @@ The final part of the introduction is a concise description of the project.
|
|
18
25
|
|
19
26
|
Saga is a tool to convert the requirements format used at Fingertips to HTML.
|
20
27
|
|
28
|
+
|
21
29
|
=== The stories
|
22
30
|
|
23
31
|
The stories section starts with the USER STORIES header.
|
24
32
|
|
25
33
|
USER STORIES
|
26
34
|
|
27
|
-
After this follows a list of stories. You can choose to add section headers,
|
35
|
+
After this follows a list of stories. You can choose to add section headers,
|
36
|
+
but this is optional. For example:
|
37
|
+
|
38
|
+
As a writer I would like to convert my description of the project to a nice format. - #1 todo
|
28
39
|
|
29
|
-
As a writer I want to convert my description of the project to a nice format. - #1 todo
|
30
|
-
|
31
40
|
Workflow
|
32
|
-
|
33
|
-
As a writer I
|
41
|
+
|
42
|
+
As a writer I would like to see an example so that I don't have to remember all the details of the format. – #2 todo
|
34
43
|
Try to find author details for the system information and autofill that in the generated stub.
|
35
|
-
As a writer I
|
36
|
-
|
44
|
+
As a writer I would like to debug the parse process so I can find out what I did wrong. - #3 todo
|
45
|
+
|
46
|
+
Stories consist of a description and some extra information. The number behind
|
47
|
+
the hash is the unique number of the story. We use the id to point to a story
|
48
|
+
without having to type the whole description in everyday conversation. The
|
49
|
+
little text label at the end describes the status of the story.
|
50
|
+
|
51
|
+
A TextMate bundle for the stories format is available from:
|
52
|
+
https://github.com/Fingertips/stories.tmbundle
|
37
53
|
|
38
|
-
Stories consist of a description and some extra information. The number behind the hash is the unique number of the story. We use the id to point to a story without having to type the whole description in everyday conversation. The little text label at the end describes the status of the story.
|
39
54
|
|
40
55
|
=== Definitions
|
41
56
|
|
42
|
-
The document ends with a list of definitions. Here we define words used
|
57
|
+
The document ends with a list of definitions. Here we define words used
|
58
|
+
throughout the document. We only define words if they need a strict definition
|
59
|
+
or if they might be misunderstood by someone. Like with the stories sections
|
60
|
+
are optional.
|
43
61
|
|
44
62
|
ROLES
|
45
63
|
|
@@ -50,16 +68,33 @@ The document ends with a list of definitions. Here we define words used througho
|
|
50
68
|
|
51
69
|
Project: The software project the developers are working on.
|
52
70
|
|
71
|
+
|
72
|
+
=== Template
|
73
|
+
|
74
|
+
By default the Fingertips template is used when converting requirements to HTML.
|
75
|
+
You can, however, create a custom template. To start from the default one use
|
76
|
+
the <tt>template</tt> command:
|
77
|
+
|
78
|
+
$ saga template design/requirements_template
|
79
|
+
|
80
|
+
Edit the files in the created directory to your liking and then convert your
|
81
|
+
requirements with the <tt>--template</tt> option:
|
82
|
+
|
83
|
+
$ saga convert --template design/requirements_template requirements.txt > requirements.html
|
84
|
+
|
85
|
+
|
53
86
|
=== Usage
|
54
87
|
|
55
88
|
Usage: saga [command]
|
56
|
-
|
89
|
+
|
57
90
|
Commands:
|
58
91
|
new - prints a blank stub
|
59
92
|
convert <filename> - convert the stories to HTML
|
60
93
|
inspect <filename> - print the internals of the document
|
61
94
|
autofill <filename> - adds an id to stories without one
|
62
95
|
planning <filename> - shows the planning of stories in iterations
|
63
|
-
|
96
|
+
template <dir> - creates a template directory
|
97
|
+
|
64
98
|
Options:
|
99
|
+
-t, --template DIR Use an external template for conversion to HTML
|
65
100
|
-h, --help Show help
|
data/Rakefile
CHANGED
@@ -6,9 +6,7 @@ task :default => [:spec]
|
|
6
6
|
|
7
7
|
desc "Run all specs"
|
8
8
|
task :spec do
|
9
|
-
|
10
|
-
load file
|
11
|
-
end
|
9
|
+
sh 'bacon test/*_spec.rb'
|
12
10
|
end
|
13
11
|
|
14
12
|
namespace :documentation do
|
@@ -32,4 +30,4 @@ begin
|
|
32
30
|
s.add_development_dependency('mocha-on-bacon')
|
33
31
|
end
|
34
32
|
rescue LoadError
|
35
|
-
end
|
33
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/lib/saga/formatter.rb
CHANGED
@@ -7,20 +7,23 @@ module Saga
|
|
7
7
|
def initialize(document, options={})
|
8
8
|
@document = document
|
9
9
|
@options = options
|
10
|
-
@options[:template] ||= 'default'
|
10
|
+
@options[:template] ||= File.join(self.class.template_path, 'default')
|
11
11
|
end
|
12
12
|
|
13
13
|
def format
|
14
|
-
|
14
|
+
helpers_file = File.join(@options[:template], 'helpers.rb')
|
15
|
+
if File.exist?(helpers_file)
|
16
|
+
load helpers_file
|
17
|
+
@document.extend(Helpers)
|
18
|
+
end
|
15
19
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
template.result(binding)
|
20
|
+
template_file = File.join(@options[:template], 'document.erb')
|
21
|
+
if File.exist?(template_file)
|
22
|
+
template = Erubis::Eruby.new(File.read(template_file))
|
23
|
+
template.result(@document.send(:binding))
|
24
|
+
else
|
25
|
+
raise ArgumentError, "The template at path `#{template_file}' could not be found."
|
26
|
+
end
|
24
27
|
end
|
25
28
|
|
26
29
|
def self.format(document, options={})
|
@@ -31,5 +34,9 @@ module Saga
|
|
31
34
|
def self.template_path
|
32
35
|
TEMPLATE_PATH
|
33
36
|
end
|
37
|
+
|
38
|
+
def self.saga_format(document)
|
39
|
+
format(document, :template => File.join(template_path, 'saga'))
|
40
|
+
end
|
34
41
|
end
|
35
|
-
end
|
42
|
+
end
|
data/lib/saga/runner.rb
CHANGED
@@ -17,9 +17,13 @@ module Saga
|
|
17
17
|
opts.separator " inspect <filename> - print the internals of the document"
|
18
18
|
opts.separator " autofill <filename> - adds an id to stories without one"
|
19
19
|
opts.separator " planning <filename> - shows the planning of stories in iterations"
|
20
|
+
opts.separator " template <dir> - creates a template directory"
|
20
21
|
opts.separator ""
|
21
22
|
opts.separator "Options:"
|
22
|
-
opts.on("-
|
23
|
+
opts.on("-t", "--template DIR", "Use an external template for conversion to HTML") do |template_path|
|
24
|
+
@options[:template] = File.expand_path(template_path)
|
25
|
+
end
|
26
|
+
opts.on("-h", "--help", "Show help") do
|
23
27
|
puts opts
|
24
28
|
exit
|
25
29
|
end
|
@@ -40,11 +44,11 @@ module Saga
|
|
40
44
|
:definition => 'Someone who is responsible for writing down requirements in the form of stories'
|
41
45
|
}]
|
42
46
|
|
43
|
-
Saga::Formatter.
|
47
|
+
Saga::Formatter.saga_format(document)
|
44
48
|
end
|
45
49
|
|
46
|
-
def convert(filename)
|
47
|
-
Saga::Formatter.format(Saga::Parser.parse(File.read(filename)))
|
50
|
+
def convert(filename, options)
|
51
|
+
Saga::Formatter.format(Saga::Parser.parse(File.read(filename)), options)
|
48
52
|
end
|
49
53
|
|
50
54
|
def write_parsed_document(filename)
|
@@ -60,34 +64,46 @@ module Saga
|
|
60
64
|
def autofill(filename)
|
61
65
|
document = Saga::Parser.parse(File.read(filename))
|
62
66
|
document.autofill_ids
|
63
|
-
Saga::Formatter.
|
67
|
+
Saga::Formatter.saga_format(document)
|
64
68
|
end
|
65
69
|
|
66
70
|
def planning(filename)
|
67
71
|
Saga::Planning.new(Saga::Parser.parse(File.read(filename))).to_s
|
68
72
|
end
|
69
73
|
|
74
|
+
def copy_template(destination)
|
75
|
+
if File.exist?(destination)
|
76
|
+
puts "The directory `#{destination}' already exists!"
|
77
|
+
else
|
78
|
+
require 'fileutils'
|
79
|
+
FileUtils.mkdir_p(destination)
|
80
|
+
FileUtils.cp(File.join(Saga::Formatter.template_path, 'default/helpers.rb'), destination)
|
81
|
+
FileUtils.cp(File.join(Saga::Formatter.template_path, 'default/document.erb'), destination)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
70
85
|
def run_command(command, options)
|
71
86
|
case command
|
72
87
|
when 'new'
|
73
88
|
puts new_file
|
74
89
|
when 'convert'
|
75
|
-
puts convert(File.expand_path(@argv[
|
90
|
+
puts convert(File.expand_path(@argv[0]), options)
|
76
91
|
when 'inspect'
|
77
|
-
write_parsed_document(File.expand_path(@argv[
|
92
|
+
write_parsed_document(File.expand_path(@argv[0]))
|
78
93
|
when 'autofill'
|
79
|
-
puts autofill(File.expand_path(@argv[
|
94
|
+
puts autofill(File.expand_path(@argv[0]))
|
80
95
|
when 'planning'
|
81
|
-
puts planning(File.expand_path(@argv[
|
96
|
+
puts planning(File.expand_path(@argv[0]))
|
97
|
+
when 'template'
|
98
|
+
copy_template(File.expand_path(@argv[0]))
|
82
99
|
else
|
83
|
-
puts convert(File.expand_path(command))
|
100
|
+
puts convert(File.expand_path(command), options)
|
84
101
|
end
|
85
102
|
end
|
86
103
|
|
87
104
|
def run
|
88
|
-
|
89
|
-
|
90
|
-
if command = argv.shift
|
105
|
+
parser.parse!(@argv)
|
106
|
+
if command = @argv.shift
|
91
107
|
run_command(command, @options)
|
92
108
|
else
|
93
109
|
puts parser.to_s
|
@@ -99,4 +115,4 @@ module Saga
|
|
99
115
|
{:name => name}
|
100
116
|
end
|
101
117
|
end
|
102
|
-
end
|
118
|
+
end
|
data/saga.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{saga}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Manfred Stienstra"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-02-17}
|
13
13
|
s.default_executable = %q{saga}
|
14
14
|
s.description = %q{Saga is a tool to convert stories syntax to a nicely formatted document.}
|
15
15
|
s.email = %q{manfred@fngtps.com}
|
@@ -43,6 +43,7 @@ Gem::Specification.new do |s|
|
|
43
43
|
"test/cases/definition.txt",
|
44
44
|
"test/cases/story.txt",
|
45
45
|
"test/cases/story_attributes.txt",
|
46
|
+
"test/fixtures/document.erb",
|
46
47
|
"test/saga_document_spec.rb",
|
47
48
|
"test/saga_formatter_spec.rb",
|
48
49
|
"test/saga_parser_spec.rb",
|
@@ -0,0 +1,80 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
4
|
+
<head>
|
5
|
+
<title>Requirements <%= title %> · Fingertips</title>
|
6
|
+
<link rel="stylesheet" type="text/css" media="all" href="http://resources.fngtps.com/2006/doc.css" />
|
7
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
8
|
+
<style type="text/css">
|
9
|
+
td.id { text-align: right !important; }
|
10
|
+
td.id a { color: #000; }
|
11
|
+
table.review { border-bottom: 1px solid #ccc; margin-top: -1em;}
|
12
|
+
table.review td { padding: .25em 0; vertical-align: top; text-align: left; min-width: 1em; }
|
13
|
+
table.review th { padding: .25em 0; vertical-align: top; text-align: right; }
|
14
|
+
table.review td.story { width: 100%; border-top: 1px solid #ccc; }
|
15
|
+
table.review td.meta { padding-left: 1em; border-top: 1px solid #ccc; text-align: right !important; white-space: nowrap; }
|
16
|
+
table.review td.notes { color: #666; padding: 0 0 .25em 0; font-style: italic; }
|
17
|
+
table.review .dropped { color: #666; text-decoration: line-through; }
|
18
|
+
table.review .done { color: #666; background-color: #f0f8ff; }
|
19
|
+
</style>
|
20
|
+
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
|
21
|
+
</head>
|
22
|
+
<body id="doc" class="requirements">
|
23
|
+
|
24
|
+
<p id="logo"><img src="http://resources.fngtps.com/2006/print-logo.png" alt="Fingertips design & development" /> </p>
|
25
|
+
|
26
|
+
<h1>Requirements <br /><%= title %></h1>
|
27
|
+
|
28
|
+
<% authors.each do |author| %>
|
29
|
+
<p class="author"><%= author %></p>
|
30
|
+
<% end %>
|
31
|
+
|
32
|
+
<% introduction.each do |paragraph| %>
|
33
|
+
<p><%= paragraph %></p>
|
34
|
+
<% end %>
|
35
|
+
|
36
|
+
<% unless stories.empty? %>
|
37
|
+
<h2>User stories</h2>
|
38
|
+
<% stories.each do |header, stories| %>
|
39
|
+
<% unless header.strip == '' %>
|
40
|
+
<h3><%= header %></h3>
|
41
|
+
<% end %>
|
42
|
+
<table class="review">
|
43
|
+
<tr>
|
44
|
+
<th></th>
|
45
|
+
<th title="id">#</th>
|
46
|
+
<th title="Estimate">e</th>
|
47
|
+
<th title="Iteration">i</th>
|
48
|
+
<th title="Status">s</th>
|
49
|
+
</tr>
|
50
|
+
<% stories.each do |story| %>
|
51
|
+
<tr class="<%= story[:status] %>" id="story<%= story[:id] %>">
|
52
|
+
<td class="story"><%= story[:description] %></td>
|
53
|
+
<td class="meta id"><%= story[:id] %></td>
|
54
|
+
<td class="meta estimate"><%= story[:estimate] %></td>
|
55
|
+
<td class="meta iteration"><%= story[:iteration] %></td>
|
56
|
+
<td class="meta status"><%= story[:status] %></td>
|
57
|
+
</tr>
|
58
|
+
<% if story[:notes] %>
|
59
|
+
<tr class="<%= story[:status] %>">
|
60
|
+
<td class="notes" colspan="5"><%= story[:notes] %></td>
|
61
|
+
</tr>
|
62
|
+
<% end %>
|
63
|
+
<% end %>
|
64
|
+
</table>
|
65
|
+
<% end %>
|
66
|
+
<% end %>
|
67
|
+
|
68
|
+
<% definitions.each do |header, definitions| %>
|
69
|
+
<% unless header.strip == '' %>
|
70
|
+
<h2><%= header %></h2>
|
71
|
+
<% end %>
|
72
|
+
<dl>
|
73
|
+
<% definitions.each do |definition| %>
|
74
|
+
<dt><%= definition[:title] %></dt>
|
75
|
+
<dd><%= definition[:definition] %></dd>
|
76
|
+
<% end %>
|
77
|
+
</dl>
|
78
|
+
<% end %>
|
79
|
+
</body>
|
80
|
+
</html>
|
data/test/saga_formatter_spec.rb
CHANGED
@@ -24,7 +24,21 @@ describe "Formatter" do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "formats a saga document to saga" do
|
27
|
-
saga = Saga::Formatter.
|
27
|
+
saga = Saga::Formatter.saga_format(@document)
|
28
28
|
saga.should.include('Requirements Requirements API')
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
|
+
describe "with an external template" do
|
32
|
+
it "raises when the document.erb file doesn't exist" do
|
33
|
+
lambda {
|
34
|
+
Saga::Formatter.format(@document, :template => '/does/not/exist')
|
35
|
+
}.should.raise(ArgumentError, "The template at path `/does/not/exist/document.erb' could not be found.")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "omits the helpers.rb file it it doesn't exist" do
|
39
|
+
formatter = Saga::Formatter.new(@document, :template => File.expand_path('../fixtures', __FILE__))
|
40
|
+
formatter.expects(:load).never
|
41
|
+
formatter.format.should.not.be.empty
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/test/saga_runner_spec.rb
CHANGED
@@ -61,7 +61,7 @@ describe "A Runner" do
|
|
61
61
|
|
62
62
|
it "converts the provided filename" do
|
63
63
|
runner = Saga::Runner.new(%w(requirements.txt))
|
64
|
-
runner.expects(:convert).with(File.expand_path('requirements.txt')).returns('output')
|
64
|
+
runner.expects(:convert).with(File.expand_path('requirements.txt'), {}).returns('output')
|
65
65
|
collect_stdout do
|
66
66
|
runner.run
|
67
67
|
end.should == "output\n"
|
@@ -69,12 +69,22 @@ describe "A Runner" do
|
|
69
69
|
|
70
70
|
it "converts the provided filename when the convert command is given" do
|
71
71
|
runner = Saga::Runner.new(%w(convert requirements.txt))
|
72
|
-
runner.expects(:convert).with(File.expand_path('requirements.txt')).returns('output')
|
72
|
+
runner.expects(:convert).with(File.expand_path('requirements.txt'), {}).returns('output')
|
73
73
|
collect_stdout do
|
74
74
|
runner.run
|
75
75
|
end.should == "output\n"
|
76
76
|
end
|
77
77
|
|
78
|
+
it "converts the provided filename with an external template" do
|
79
|
+
Saga::Parser.stubs(:parse)
|
80
|
+
File.stubs(:read)
|
81
|
+
Saga::Formatter.expects(:format).with do |_, options|
|
82
|
+
options[:template].should == File.expand_path('path/to/a/template')
|
83
|
+
end
|
84
|
+
runner = Saga::Runner.new(%W(convert --template path/to/a/template requirements.txt))
|
85
|
+
collect_stdout { runner.run }
|
86
|
+
end
|
87
|
+
|
78
88
|
it "inspects the parsed document" do
|
79
89
|
runner = Saga::Runner.new(%w(inspect requirements.txt))
|
80
90
|
runner.expects(:write_parsed_document).with(File.expand_path('requirements.txt'))
|
@@ -96,4 +106,32 @@ describe "A Runner" do
|
|
96
106
|
runner.run
|
97
107
|
end.should == "output\n"
|
98
108
|
end
|
99
|
-
|
109
|
+
|
110
|
+
it "copies the default template to the specified path" do
|
111
|
+
begin
|
112
|
+
destination = "/tmp/saga-template-dir"
|
113
|
+
Saga::Runner.new(%W(template #{destination})).run
|
114
|
+
File.read(File.join(destination, 'helpers.rb')).should ==
|
115
|
+
File.read(File.join(Saga::Formatter.template_path, 'default/helpers.rb'))
|
116
|
+
File.read(File.join(destination, 'document.erb')).should ==
|
117
|
+
File.read(File.join(Saga::Formatter.template_path, 'default/document.erb'))
|
118
|
+
ensure
|
119
|
+
FileUtils.rm_rf(destination)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
it "complains when tryin to create a template at an existing path" do
|
124
|
+
begin
|
125
|
+
destination = "/tmp/saga-template-dir"
|
126
|
+
FileUtils.mkdir_p(destination)
|
127
|
+
runner = Saga::Runner.new(%W(template #{destination}))
|
128
|
+
collect_stdout do
|
129
|
+
runner.run
|
130
|
+
end.should == "The directory `#{destination}' already exists!\n"
|
131
|
+
File.should.not.exist File.join(destination, 'helpers.rb')
|
132
|
+
File.should.not.exist File.join(destination, 'document.erb')
|
133
|
+
ensure
|
134
|
+
FileUtils.rm_rf(destination)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
data/test/saga_spec.rb
CHANGED
@@ -24,7 +24,7 @@ describe "Saga" do
|
|
24
24
|
it "round-trips through the parser and formatter" do
|
25
25
|
document = @document
|
26
26
|
2.times do
|
27
|
-
saga = Saga::Formatter.
|
27
|
+
saga = Saga::Formatter.saga_format(document)
|
28
28
|
document = Saga::Parser.parse(saga)
|
29
29
|
end
|
30
30
|
|
@@ -32,4 +32,4 @@ describe "Saga" do
|
|
32
32
|
document.authors.should == @document.authors
|
33
33
|
document.stories.should == @document.stories
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
data/test/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 6
|
9
|
+
- 0
|
10
|
+
version: 0.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Manfred Stienstra
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-17 00:00:00 +01:00
|
19
19
|
default_executable: saga
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- test/cases/definition.txt
|
97
97
|
- test/cases/story.txt
|
98
98
|
- test/cases/story_attributes.txt
|
99
|
+
- test/fixtures/document.erb
|
99
100
|
- test/saga_document_spec.rb
|
100
101
|
- test/saga_formatter_spec.rb
|
101
102
|
- test/saga_parser_spec.rb
|