saga 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
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.