saga 0.8.0 → 0.8.1

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/.kick CHANGED
@@ -15,4 +15,11 @@ process do |files|
15
15
  "test/saga_tokenizer_spec.rb"
16
16
  end
17
17
  end)
18
+ files.take_and_map do |file|
19
+ case file
20
+ when 'design/requirements.txt'
21
+ log `./bin/saga design/requirements.txt > design/requirements.html`
22
+ files.delete(file)
23
+ end
24
+ end
18
25
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.8.1
@@ -0,0 +1,83 @@
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 Saga &middot; 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
+ table.review tr.nested td.story { padding-left: 1em; }
20
+ </style>
21
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
22
+ </head>
23
+ <body id="doc" class="requirements">
24
+
25
+ <p id="logo"><img src="http://resources.fngtps.com/2006/print-logo.png" alt="Fingertips design &amp; development" /> </p>
26
+
27
+ <h1>Requirements <br />Saga</h1>
28
+
29
+ <p class="author">Manfred Stienstra, <a href="mailto:manfred@fngtps.com">manfred@fngtps.com</a></p>
30
+
31
+
32
+ <h2>User stories</h2>
33
+ <table class="review">
34
+ <tr>
35
+ <th></th>
36
+ <th title="id">#</th>
37
+ <th title="Estimate">e</th>
38
+ <th title="Iteration">i</th>
39
+ <th title="Status">s</th>
40
+ </tr>
41
+ <tr class="done" id="story1">
42
+ <td class="story">As a writer I would like to write stories so developers can implement them.</td>
43
+ <td class="meta id">1</td>
44
+ <td class="meta estimate"></td>
45
+ <td class="meta iteration"></td>
46
+ <td class="meta status">done</td>
47
+ </tr>
48
+ <tr class="todo" id="story2">
49
+ <td class="story">As a writer I would like to add priorities to my stories so that I can show their importance.</td>
50
+ <td class="meta id">2</td>
51
+ <td class="meta estimate"></td>
52
+ <td class="meta iteration"></td>
53
+ <td class="meta status">todo</td>
54
+ </tr>
55
+ <tr class="todo" id="story3">
56
+ <td class="story">As a writer I would like to order my stories so that I can easily find the story I need.</td>
57
+ <td class="meta id">3</td>
58
+ <td class="meta estimate"></td>
59
+ <td class="meta iteration"></td>
60
+ <td class="meta status">todo</td>
61
+ </tr>
62
+ <tr class="todo">
63
+ <td class="notes" colspan="5">Improve the HTML template to allow ordering by ID, estimate, iteration, status, and priority.</td>
64
+ </tr>
65
+ <tr class="todo" id="story4">
66
+ <td class="story">As a writer I would like to ignore certain themes during autofill and planning so that I can specify non-functional stories.</td>
67
+ <td class="meta id">4</td>
68
+ <td class="meta estimate"></td>
69
+ <td class="meta iteration"></td>
70
+ <td class="meta status">todo</td>
71
+ </tr>
72
+ <tr class="todo">
73
+ <td class="notes" colspan="5">saga -n 'Non-functional' -n 'Optional' autofill design/requirements.txt</td>
74
+ </tr>
75
+ </table>
76
+
77
+ <h2>Roles</h2>
78
+ <dl>
79
+ <dt>Writer</dt>
80
+ <dd>Someone who is responsible for writing down requirements in the form of stories</dd>
81
+ </dl>
82
+ </body>
83
+ </html>
@@ -0,0 +1,16 @@
1
+ Requirements Saga
2
+
3
+ - Manfred Stienstra, manfred@fngtps.com
4
+
5
+ USER STORIES
6
+
7
+ As a writer I would like to write stories so developers can implement them. - #1 done
8
+ As a writer I would like to add priorities to my stories so that I can show their importance. - #2 todo
9
+ As a writer I would like to order my stories so that I can easily find the story I need. - #3 todo
10
+ Improve the HTML template to allow ordering by ID, estimate, iteration, status, and priority.
11
+ As a writer I would like to ignore certain themes during autofill and planning so that I can specify non-functional stories. - #4 todo
12
+ saga -n 'Non-functional' -n 'Optional' autofill design/requirements.txt
13
+
14
+ ROLES
15
+
16
+ Writer: Someone who is responsible for writing down requirements in the form of stories
data/lib/saga/planning.rb CHANGED
@@ -7,7 +7,7 @@ module Saga
7
7
  end
8
8
 
9
9
  def iterations
10
- @document.stories.values.flatten.inject({}) do |properties, story|
10
+ @document.stories_as_flat_list.inject({}) do |properties, story|
11
11
  if story[:estimate]
12
12
  iteration = story[:iteration] || -1
13
13
  properties[iteration] ||= BLANK_ITERATION.dup
@@ -29,22 +29,18 @@ module Saga
29
29
 
30
30
  def unestimated
31
31
  unestimated = 0
32
- @document.stories.values.each do |stories|
33
- stories.each do |story|
34
- unestimated += 1 unless story[:estimate]
35
- end
32
+ @document.stories_as_flat_list.each do |story|
33
+ unestimated += 1 unless story[:estimate]
36
34
  end
37
35
  unestimated
38
36
  end
39
37
 
40
38
  def statusses
41
39
  statusses = {}
42
- @document.stories.values.each do |stories|
43
- stories.each do |story|
44
- if story[:estimate] and story[:status]
45
- statusses[story[:status]] ||= 0
46
- statusses[story[:status]] += self.class.estimate_to_hours(story[:estimate])
47
- end
40
+ @document.stories_as_flat_list.each do |story|
41
+ if story[:estimate] and story[:status]
42
+ statusses[story[:status]] ||= 0
43
+ statusses[story[:status]] += self.class.estimate_to_hours(story[:estimate])
48
44
  end
49
45
  end
50
46
  statusses
data/saga.gemspec CHANGED
@@ -4,15 +4,15 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{saga}
8
- s.version = "0.7.1"
7
+ s.name = "saga"
8
+ s.version = "0.8.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = [%q{Manfred Stienstra}]
12
- s.date = %q{2011-07-04}
13
- s.description = %q{Saga is a tool to convert stories syntax to a nicely formatted document.}
14
- s.email = %q{manfred@fngtps.com}
15
- s.executables = [%q{saga}]
11
+ s.authors = ["Manfred Stienstra"]
12
+ s.date = "2012-06-18"
13
+ s.description = "Saga is a tool to convert stories syntax to a nicely formatted document."
14
+ s.email = "manfred@fngtps.com"
15
+ s.executables = ["saga"]
16
16
  s.extra_rdoc_files = [
17
17
  "LICENSE",
18
18
  "README.rdoc"
@@ -24,6 +24,8 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "VERSION",
26
26
  "bin/saga",
27
+ "design/requirements.html",
28
+ "design/requirements.txt",
27
29
  "lib/saga.rb",
28
30
  "lib/saga/document.rb",
29
31
  "lib/saga/formatter.rb",
@@ -39,6 +41,8 @@ Gem::Specification.new do |s|
39
41
  "templates/saga/helpers.rb",
40
42
  "test/cases/author.txt",
41
43
  "test/cases/definition.txt",
44
+ "test/cases/document.txt",
45
+ "test/cases/nested_stories.txt",
42
46
  "test/cases/story.txt",
43
47
  "test/cases/story_attributes.txt",
44
48
  "test/fixtures/document.erb",
@@ -51,20 +55,10 @@ Gem::Specification.new do |s|
51
55
  "test/saga_tokenizer_spec.rb",
52
56
  "test/spec_helper.rb"
53
57
  ]
54
- s.homepage = %q{http://fingertips.github.com}
55
- s.require_paths = [%q{lib}]
56
- s.rubygems_version = %q{1.8.5}
57
- s.summary = %q{Saga is a tool to convert stories syntax to a nicely formatted document.}
58
- s.test_files = [
59
- "test/saga_document_spec.rb",
60
- "test/saga_formatter_spec.rb",
61
- "test/saga_parser_spec.rb",
62
- "test/saga_planning_spec.rb",
63
- "test/saga_runner_spec.rb",
64
- "test/saga_spec.rb",
65
- "test/saga_tokenizer_spec.rb",
66
- "test/spec_helper.rb"
67
- ]
58
+ s.homepage = "http://fingertips.github.com"
59
+ s.require_paths = ["lib"]
60
+ s.rubygems_version = "1.8.18"
61
+ s.summary = "Saga is a tool to convert stories syntax to a nicely formatted document."
68
62
 
69
63
  if s.respond_to? :specification_version then
70
64
  s.specification_version = 3
@@ -31,7 +31,7 @@
31
31
  <% end %>
32
32
 
33
33
  <% introduction.each do |paragraph| %>
34
- <p><%= paragraph %></p>
34
+ <p><%== paragraph %></p>
35
35
  <% end %>
36
36
 
37
37
  <% unless stories.empty? %>
@@ -2,6 +2,8 @@ Requirements Case
2
2
 
3
3
  - Manfred Stienstra, manfred@fngtps.com
4
4
 
5
+ Saga is a tool for writing and publishing <requirements> in the form of user stories.
6
+
5
7
  USER STORIES
6
8
 
7
9
  As a writer I would like to write stories so that developers can implement them. - #1 todo
@@ -30,7 +30,7 @@
30
30
  <% end %>
31
31
 
32
32
  <% introduction.each do |paragraph| %>
33
- <p><%= paragraph %></p>
33
+ <p><%== paragraph %></p>
34
34
  <% end %>
35
35
 
36
36
  <% unless stories.empty? %>
@@ -9,7 +9,7 @@ describe "Formatter" do
9
9
  {:name => 'Manfred Stienstra', :email => 'manfred@fngtps.com', :company => 'Fingertips', :website => 'http://www.fngtps.com'}
10
10
  ]
11
11
  @document.introduction = [
12
- 'A web service for interfacing with the service.', 'Exposes a public API to the application.'
12
+ 'A web service for interfacing with the service.', 'Exposes a public API to the application.', 'Uses <20> levels of redirection.'
13
13
  ]
14
14
  @document.stories = [
15
15
  ['General', [
@@ -29,6 +29,12 @@ describe "Formatter" do
29
29
  html.should.include('receive a certificate')
30
30
  end
31
31
 
32
+ it "include the escaped introduction in the HTML output" do
33
+ html = Saga::Formatter.format(@document)
34
+ html.should.include('<p>Uses &lt;20&gt; levels of redirection.</p>')
35
+ html.should.include('receive a certificate')
36
+ end
37
+
32
38
  it "formats a saga document to saga" do
33
39
  saga = Saga::Formatter.saga_format(@document)
34
40
  saga.should.include('Requirements Requirements API')
@@ -14,30 +14,30 @@ end
14
14
  describe "A Planning for unestimated stories" do
15
15
  before do
16
16
  @document = Saga::Document.new
17
- @document.stories[''] = [{}, {}, {}]
17
+ @document.stories[''] = [{}, {}, {:stories => [{}, {}]}]
18
18
  @planning = Saga::Planning.new(@document)
19
19
  end
20
20
 
21
21
  it "shows a planning" do
22
- @planning.to_s.should == "Unestimated : 3 stories"
22
+ @planning.to_s.should == "Unestimated : 5 stories"
23
23
  end
24
24
  end
25
25
 
26
- describe "A Planning for estimated and unestimatesd stories" do
26
+ describe "A Planning for estimated and unestimated stories" do
27
27
  before do
28
28
  @document = Saga::Document.new
29
29
  @document.stories[''] = [{}, {}, {}]
30
- @document.stories['Member'] = [{:estimate => [12, :hours]}]
30
+ @document.stories['Member'] = [{}, {:estimate => [6, :hours], :stories => [{:estimate => [6, :hours]}]}, {}]
31
31
  @planning = Saga::Planning.new(@document)
32
32
  end
33
33
 
34
34
  it "shows a planning" do
35
35
  @planning.to_s.should ==
36
- "Unplanned : 12 (1 story)\n"+
37
- "----------------------------\n"+
38
- "Total : 12 (1 story)\n"+
36
+ "Unplanned : 12 (2 stories)\n"+
37
+ "------------------------------\n"+
38
+ "Total : 12 (2 stories)\n"+
39
39
  "\n"+
40
- "Unestimated : 3 stories"
40
+ "Unestimated : 5 stories"
41
41
  end
42
42
  end
43
43
 
@@ -59,19 +59,21 @@ end
59
59
  describe "A complicated Planning" do
60
60
  before do
61
61
  @document = Saga::Document.new
62
- @document.stories[''] = [{:estimate => [12, :hours], :iteration => 1}, {:estimate => [8, :hours]}]
63
- @document.stories['Developer'] = [{:estimate => [1, :weeks], :iteration => 2}, {:estimate => [1, :hours], :iteration => 2}]
62
+ @document.stories[''] = [{:estimate => [12, :hours], :iteration => 1}, {:estimate => [8, :hours], :stories => [{}, {}]}]
63
+ @document.stories['Developer'] = [{:estimate => [1, :weeks], :iteration => 2,:stories => [{:estimate => [2, :hours], :iteration => 2}, {:estimate => [1, :hours]}]}, {:estimate => [1, :hours], :iteration => 2}]
64
64
  @document.stories['Writer'] = [{:estimate => [5, :hours], :iteration => 1}, {:estimate => [2, :hours], :iteration => 3}]
65
65
  @planning = Saga::Planning.new(@document)
66
66
  end
67
67
 
68
68
  it "shows a planning" do
69
69
  @planning.to_s.should ==
70
- "Unplanned : 8 (1 story)\n"+
70
+ "Unplanned : 9 (2 stories)\n"+
71
71
  "Iteration 1 : 17 (2 stories)\n"+
72
- "Iteration 2 : 41 (2 stories)\n"+
72
+ "Iteration 2 : 43 (3 stories)\n"+
73
73
  "Iteration 3 : 2 (1 story)\n"+
74
74
  "------------------------------\n"+
75
- "Total : 68 (6 stories)"
75
+ "Total : 71 (8 stories)\n"+
76
+ "\n"+
77
+ "Unestimated : 2 stories"
76
78
  end
77
79
  end
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: 63
4
+ hash: 61
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 0
10
- version: 0.8.0
9
+ - 1
10
+ version: 0.8.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Manfred Stienstra
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-12 00:00:00 +02:00
19
- default_executable: saga
18
+ date: 2012-06-18 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: erubis
@@ -78,6 +77,8 @@ files:
78
77
  - Rakefile
79
78
  - VERSION
80
79
  - bin/saga
80
+ - design/requirements.html
81
+ - design/requirements.txt
81
82
  - lib/saga.rb
82
83
  - lib/saga/document.rb
83
84
  - lib/saga/formatter.rb
@@ -106,7 +107,6 @@ files:
106
107
  - test/saga_spec.rb
107
108
  - test/saga_tokenizer_spec.rb
108
109
  - test/spec_helper.rb
109
- has_rdoc: true
110
110
  homepage: http://fingertips.github.com
111
111
  licenses: []
112
112
 
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  requirements: []
137
137
 
138
138
  rubyforge_project:
139
- rubygems_version: 1.6.2
139
+ rubygems_version: 1.8.18
140
140
  signing_key:
141
141
  specification_version: 3
142
142
  summary: Saga is a tool to convert stories syntax to a nicely formatted document.