ardekantur-gantty 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +9 -1
- data/lib/gantty.rb +97 -14
- data/spec/gantty_spec.rb +10 -3
- data/spec/resource_spec.rb +3 -0
- data/spec/task_spec.rb +114 -6
- data/spec/test_gantt_project.gan +18 -55
- metadata +2 -2
data/Rakefile
CHANGED
@@ -17,7 +17,15 @@ Rake::GemPackageTask.new(spec) do |pkg|
|
|
17
17
|
pkg.gem_spec = spec
|
18
18
|
end
|
19
19
|
|
20
|
+
desc "run rspec + rcov"
|
21
|
+
Spec::Rake::SpecTask.new("spec:rcov") do |t|
|
22
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
23
|
+
t.rcov_opts = ['--exclude', "spec/,rcov.rb,rspec.rb,spec*,gems*"]
|
24
|
+
t.rcov = true
|
25
|
+
t.rcov_dir = 'doc/coverage'
|
26
|
+
end
|
27
|
+
|
20
28
|
desc "install the gem locally"
|
21
29
|
task :install => [:package] do
|
22
30
|
sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
|
23
|
-
end
|
31
|
+
end
|
data/lib/gantty.rb
CHANGED
@@ -1,14 +1,27 @@
|
|
1
1
|
$:.unshift File.expand_path(File.dirname(__FILE__))
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
+
require 'date'
|
4
5
|
require 'nokogiri'
|
5
6
|
|
6
7
|
module Gantty
|
7
8
|
|
9
|
+
PRIORITY = { :low => 0, :normal => 1, :medium => 1, :high => 2, 0 => :low, 1 => :normal, 2 => :high }
|
10
|
+
HARDNESS = { :rubber => "Rubber", :strong => "Strong" }
|
11
|
+
DEPENDS = { 1 => :add_starts_with, 2 => :add_starts_after, 3 => :add_finishes_with, 4 => :add_finishes_before }
|
12
|
+
|
13
|
+
def self.Task args
|
14
|
+
return Task.new(args)
|
15
|
+
end
|
16
|
+
|
8
17
|
def self.Open file
|
9
18
|
return GanttChart.new(file)
|
10
19
|
end
|
11
20
|
|
21
|
+
def self.New
|
22
|
+
return GanttChart.new
|
23
|
+
end
|
24
|
+
|
12
25
|
class GanttChart
|
13
26
|
|
14
27
|
attr_accessor :resources, :tasks
|
@@ -23,45 +36,115 @@ module Gantty
|
|
23
36
|
end
|
24
37
|
|
25
38
|
def parse_gantt
|
39
|
+
depends = { 1 => [], 2 => [], 3 => [], 4 => [] }
|
26
40
|
@gantt.xpath('//resource').each { |r| @resources << Resource.new(r) }
|
27
|
-
@gantt.xpath('//task').each
|
28
|
-
|
41
|
+
@gantt.xpath('//task').each do |t|
|
42
|
+
@tasks << Task.new(t)
|
43
|
+
t.children.select { |c| c.name == "depend" }.each do |dependency|
|
44
|
+
depends[dependency.attributes["type"].to_i] << [t.attributes["id"].to_i, dependency.attributes["id"].to_i]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
@tasks.each do |task|
|
48
|
+
@gantt.xpath("//allocation[@task-id=#{task.id}]").each do |alloc|
|
49
|
+
task.coordinators += @resources.select { |r| r.id == alloc.attributes["resource-id"].to_i }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
depends.each do |type,queue|
|
54
|
+
queue.each { |relation| task_by_id(relation.last).send(DEPENDS[type], task_by_id(relation.first)) }
|
55
|
+
end
|
29
56
|
end
|
30
57
|
|
31
58
|
def current_tasks date = Date.today
|
32
59
|
@tasks.select { |t| t.start <= date and t.end >= date }
|
33
60
|
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def task_by_id id
|
65
|
+
@tasks.select { |t| t.id == id }.first
|
66
|
+
end
|
34
67
|
|
35
68
|
end
|
36
69
|
|
37
70
|
class Task
|
38
|
-
attr_accessor :name, :start, :duration, :end, :percent_complete, :coordinators
|
71
|
+
attr_accessor :name, :start, :duration, :end, :percent_complete, :coordinators, :priority
|
72
|
+
attr_accessor :starts_with, :starts_after, :finishes_with, :finishes_before
|
73
|
+
|
39
74
|
attr_reader :id
|
40
75
|
|
41
76
|
def initialize t
|
42
|
-
@
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
77
|
+
@starts_with, @starts_after, @finishes_with, @finishes_before = [], [], [], []
|
78
|
+
if t.is_a? Hash
|
79
|
+
@name = t[:name]
|
80
|
+
elsif t.is_a? String
|
81
|
+
raise ArgumentError, "name cannot be blank" if t.length == 0
|
82
|
+
@name = t
|
83
|
+
else
|
84
|
+
@name = t.attributes["name"]
|
85
|
+
@start = Date.strptime(t.attributes["start"])
|
86
|
+
@duration = t.attributes["duration"].to_i
|
87
|
+
@priority = PRIORITY[t.attributes["priority"].to_i]
|
88
|
+
@end = @start + @duration
|
89
|
+
@percent_complete = t.attributes["complete"].to_i
|
90
|
+
@coordinators = []
|
91
|
+
@id = t.attributes["id"].to_i
|
92
|
+
end
|
49
93
|
end
|
50
94
|
|
51
95
|
def start= new_date
|
52
96
|
raise ArgumentError, "expected a DateTime" unless new_date.is_a? Date
|
53
|
-
raise ArgumentError, "start date cannot be past end date"
|
97
|
+
raise ArgumentError, "start date cannot be past end date" if @end and new_date >= @end
|
54
98
|
@start = new_date
|
55
|
-
@duration = (@end - @start).to_i
|
99
|
+
@duration = (@end - @start).to_i if @end
|
56
100
|
end
|
57
101
|
|
58
102
|
def end= new_date
|
59
103
|
raise ArgumentError, "expected a DateTime" unless new_date.is_a? Date
|
60
|
-
raise ArgumentError, "end date cannot be before start date"
|
104
|
+
raise ArgumentError, "end date cannot be before start date" if @start and new_date <= @start
|
61
105
|
@end = new_date
|
62
|
-
@duration = (@end - @start).to_i
|
106
|
+
@duration = (@end - @start).to_i if @start
|
63
107
|
end
|
64
108
|
|
109
|
+
def duration= new_duration
|
110
|
+
raise ArgumentError, "expected a number of days" unless new_duration.is_a? Fixnum
|
111
|
+
raise ArgumentError, "expected a positive day count" if new_duration < 0
|
112
|
+
@start = Date.today unless @start
|
113
|
+
@duration = new_duration
|
114
|
+
@end = @start + new_duration
|
115
|
+
end
|
116
|
+
|
117
|
+
def percent_complete= new_percent
|
118
|
+
raise ArgumentError, "percent complete must be a number" unless new_percent.is_a? Fixnum
|
119
|
+
raise ArgumentError, "percent complete must be between 0 and 100" if new_percent < 0 or new_percent > 100
|
120
|
+
@percent_complete = new_percent
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# If Task B has predecessor Task A with relationship Finish->Start, task_b.before.include? task_a
|
125
|
+
# <task id="#{task_a.id}"...><depend id="#{task_b.id}" type="2" difference="1" hardness="Rubber"/></task>
|
126
|
+
# Start-Start: 1 => #starts_with
|
127
|
+
# Finish-Start: 2 => #starts_after
|
128
|
+
# Finish-Finish: 3 => #finishes_with
|
129
|
+
# Start-Finish: 4 => #finishes_before
|
130
|
+
#
|
131
|
+
|
132
|
+
def add_starts_with t
|
133
|
+
@starts_with << t
|
134
|
+
end
|
135
|
+
|
136
|
+
def add_starts_after t
|
137
|
+
@starts_after << t
|
138
|
+
end
|
139
|
+
|
140
|
+
def add_finishes_with t
|
141
|
+
@finishes_with << t
|
142
|
+
end
|
143
|
+
|
144
|
+
def add_finishes_before t
|
145
|
+
@finishes_before << t
|
146
|
+
end
|
147
|
+
|
65
148
|
end
|
66
149
|
|
67
150
|
class Resource
|
data/spec/gantty_spec.rb
CHANGED
@@ -11,15 +11,22 @@ describe "Gantty" do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should return a list of all tasks" do
|
14
|
-
@gantt.tasks.size.should ==
|
14
|
+
@gantt.tasks.size.should == 13
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should return a list of all current tasks" do
|
18
|
-
@gantt.current_tasks(Date.new(2008, 10, 18)).size.should ==
|
18
|
+
@gantt.current_tasks(Date.new(2008, 10, 18)).size.should == 7
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should include tasks starting today as current tasks for today" do
|
22
|
-
@gantt.current_tasks(Date.new(2008, 11, 3)).size.should ==
|
22
|
+
@gantt.current_tasks(Date.new(2008, 11, 3)).size.should == 4
|
23
23
|
end
|
24
|
+
|
25
|
+
it "should be allowed to be created empty" do
|
26
|
+
lambda { @new_chart = Gantty::New() }.should_not raise_error
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return itself as correct XML"
|
30
|
+
it "should have a company name"
|
24
31
|
|
25
32
|
end
|
data/spec/resource_spec.rb
CHANGED
data/spec/task_spec.rb
CHANGED
@@ -5,13 +5,19 @@ describe "Task" do
|
|
5
5
|
before do
|
6
6
|
@gantt = Gantty::Open GANTT_CHART
|
7
7
|
@task = @gantt.tasks.first
|
8
|
-
@team_task = @gantt.tasks.select { |t| t.id ==
|
8
|
+
@team_task = @gantt.tasks.select { |t| t.id == 12 }.first
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should have a name" do
|
12
12
|
@task.name.should == "Project Planning"
|
13
13
|
end
|
14
14
|
|
15
|
+
it "should provide a shortcut method for instantiating a Task with a name" do
|
16
|
+
task_name = "Chunky Bacon"
|
17
|
+
@t = Gantty::Task :name => task_name
|
18
|
+
@t.name.should == task_name
|
19
|
+
end
|
20
|
+
|
15
21
|
it "should have a start date" do
|
16
22
|
@task.start.month.should == 10
|
17
23
|
@task.start.year.should == 2008
|
@@ -32,21 +38,123 @@ describe "Task" do
|
|
32
38
|
end
|
33
39
|
|
34
40
|
it "should not allow an end date that comes before the start date" do
|
35
|
-
@task.start = Date.new(
|
36
|
-
@task.duration.should == 165
|
41
|
+
lambda { @task.start = Date.new(2009, 10, 1) }.should raise_error
|
37
42
|
end
|
38
43
|
|
39
44
|
it "should not allow a start date that comes before the end date" do
|
40
|
-
lambda { @task.end = Date.new(2008, 10, 10) }.should raise_error
|
45
|
+
lambda { @task.end = Date.new(2008, 10, 10) }.should raise_error
|
41
46
|
end
|
42
47
|
|
43
48
|
it "should change the duration to match a changed start date" do
|
44
|
-
|
49
|
+
@task.start = Date.new(2008,10, 10)
|
50
|
+
@task.duration.should == 165
|
45
51
|
end
|
46
52
|
|
47
53
|
it "should return an array of coordinators" do
|
48
54
|
@team_task.coordinators.size.should == 2
|
49
|
-
@team_task.coordinators.
|
55
|
+
@team_task.coordinators.should have(2).things
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return its priority" do
|
59
|
+
@task.priority.should == :high
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should allow changing of its start date and end date" do
|
63
|
+
task = Gantty::Task.new :name => "Chunky Bacon"
|
64
|
+
task.start = Date.today
|
65
|
+
task.start.should == Date.today
|
66
|
+
|
67
|
+
task = Gantty::Task.new :name => "Chunky Bacon"
|
68
|
+
task.end = Date.today
|
69
|
+
task.end.should == Date.today
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should require a name" do
|
73
|
+
lambda { task = Gantty::Task.new }.should raise_error
|
74
|
+
lambda { task = Gantty::Task.new "" }.should raise_error
|
75
|
+
|
76
|
+
lambda { task = Gantty::Task.new "This is the task name" }.should_not raise_error
|
77
|
+
lambda { task = Gantty::Task.new :name => "This is the task name" }.should_not raise_error
|
78
|
+
end
|
79
|
+
|
80
|
+
# Start-Start: 1 => #starts_with
|
81
|
+
# Finish-Start: 2 => #starts_after
|
82
|
+
# Finish-Finish: 3 => #finishes_with
|
83
|
+
# Start-Finish: 4 => #finishes_before
|
84
|
+
|
85
|
+
it "should return the Start-Start tasks of itself" do
|
86
|
+
@pred_task = @gantt.tasks.select { |t| t.id == 13 }.first
|
87
|
+
@pred_task.name.should == "Acceptance Test Plan"
|
88
|
+
@pred_task.starts_with.size.should == 1
|
89
|
+
@pred_task.starts_with.first.name.should == "Requirements Document"
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return the Finish-Start tasks of itself" do
|
93
|
+
@pred_task = @gantt.tasks.select { |t| t.id == 13 }.first
|
94
|
+
@pred_task.name.should == "Acceptance Test Plan"
|
95
|
+
@pred_task.starts_after.size.should == 1
|
96
|
+
@pred_task.starts_after.first.name.should == "Integration Test Plan"
|
50
97
|
end
|
98
|
+
|
99
|
+
it "should return the Start-Finish tasks of itself" do
|
100
|
+
@pred_task = @gantt.tasks.select { |t| t.id == 14 }.first
|
101
|
+
@pred_task.name.should == "Design Document"
|
102
|
+
@pred_task.finishes_before.size.should == 1
|
103
|
+
@pred_task.finishes_before.first.name.should == "Acceptance Test Plan"
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should return the percentage completed" do
|
107
|
+
@task.percent_complete.should == 13
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should allow the percentage completed to be changed" do
|
111
|
+
@task.percent_complete = 90
|
112
|
+
@task.percent_complete.should == 90
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should ensure the percentage completed is a number" do
|
116
|
+
lambda { task.percent_complete = "blah" }.should raise_error
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should not allow the percentage to be above 100 or below 0" do
|
120
|
+
task = Gantty::Task.new :name => "Chunky Bacon"
|
121
|
+
|
122
|
+
lambda { task.percent_complete = -4 }.should raise_error
|
123
|
+
lambda { task.percent_complete = 9001 }.should raise_error
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should allow the duration to be changed manually, changing the end date to compensate" do
|
127
|
+
@task.start = Date.new(2008, 10, 10)
|
128
|
+
@task.duration = 10
|
129
|
+
@task.end.should == Date.new(2008, 10, 20)
|
130
|
+
|
131
|
+
task = Gantty::Task :name => "Chunky Bacon"
|
132
|
+
task.start = Date.new(2008, 10, 10)
|
133
|
+
task.duration = 10
|
134
|
+
task.end.should == Date.new(2008, 10, 20)
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should set the start date to today if the duration is set before the start date" do
|
138
|
+
duration = 10
|
139
|
+
task = Gantty::Task :name => "Chunky Bacon"
|
140
|
+
task.duration = duration
|
141
|
+
task.end.should == Date.today + duration
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should make sure a user-set duration is a number" do
|
145
|
+
@t = Gantty::Task :name => "Chunky Bacon"
|
146
|
+
lambda { @t.duration = "infinity" }.should raise_error
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should make sure a user-set duration is positive" do
|
150
|
+
@t = Gantty::Task :name => "Chunky Bacon"
|
151
|
+
lambda { @t.duration = -6 }.should raise_error
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should return dependencies in correct XML"
|
155
|
+
it "should return itself in correct XML"
|
156
|
+
it "should make sure start and end dates are dates"
|
157
|
+
it "should attempt to parse dates from strings if necessary"
|
158
|
+
it "should return its color"
|
51
159
|
|
52
160
|
end
|
data/spec/test_gantt_project.gan
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<project name="ClementineGantt" company="" webLink="" view-date="2008-
|
2
|
+
<project name="ClementineGantt" company="" webLink="" view-date="2008-08-17" view-index="0" gantt-divider-location="652" resource-divider-location="301" version="2.0">
|
3
3
|
<description></description>
|
4
|
-
<view zooming-state="default:
|
4
|
+
<view zooming-state="default:7" id="gantt-chart"/>
|
5
5
|
<view id="resource-table">
|
6
6
|
<field id="0" name="Name" width="55" order="0"/>
|
7
7
|
<field id="1" name="Default role" width="44" order="1"/>
|
@@ -31,53 +31,29 @@
|
|
31
31
|
<taskproperty id="tpd8" name="coordinator" type="default" valuetype="text"/>
|
32
32
|
<taskproperty id="tpd9" name="predecessorsr" type="default" valuetype="text"/>
|
33
33
|
</taskproperties>
|
34
|
-
<task id="0" name="Project Planning" color="#8cb6ce" meeting="false" start="2008-10-14" duration="161" complete="13" priority="
|
35
|
-
<task id="1" name="Research" color="#8cb6ce" meeting="false" start="2008-10-14" duration="
|
36
|
-
<task id="2" name="
|
37
|
-
<task id="3" name="
|
34
|
+
<task id="0" name="Project Planning" color="#8cb6ce" meeting="false" start="2008-10-14" duration="161" complete="13" priority="2" expand="true">
|
35
|
+
<task id="1" name="Research" color="#8cb6ce" meeting="false" start="2008-10-14" duration="6" complete="47" priority="1" expand="false">
|
36
|
+
<task id="2" name="Prior Art" color="#8cb6ce" meeting="false" start="2008-10-14" duration="6" complete="0" priority="1" expand="true"/>
|
37
|
+
<task id="3" name="Focus Groups" color="#8cb6ce" meeting="false" start="2008-10-14" duration="6" complete="0" priority="1" expand="true">
|
38
38
|
<notes><![CDATA[investigate how to get this into the hands of a student in a game class during term 2 or 3]]></notes>
|
39
39
|
</task>
|
40
|
-
<task id="4" name="
|
41
|
-
<task id="5" name="
|
40
|
+
<task id="4" name="Marketing / Branding" color="#8cb6ce" meeting="false" start="2008-10-14" duration="6" complete="0" priority="1" expand="true"/>
|
41
|
+
<task id="5" name="Logos / Graphical Design" color="#8cb6ce" meeting="false" start="2008-10-14" duration="6" complete="0" priority="1" expand="true"/>
|
42
42
|
<task id="6" name="Wii Homebrew" color="#8cb6ce" meeting="false" start="2008-10-14" duration="6" complete="75" priority="1" expand="true"/>
|
43
|
-
<task id="7" name="COM bridge between C++ and C#" color="#8cb6ce" meeting="false" start="2008-10-14" duration="13" complete="100" priority="1" expand="true"/>
|
44
|
-
<task id="8" name="Google group/interproject communication" color="#8cb6ce" meeting="false" start="2008-10-14" duration="6" complete="100" priority="1" expand="true"/>
|
45
43
|
</task>
|
46
|
-
<task id="9" name="Formalization of Project" color="#8cb6ce" meeting="false" start="2008-10-22" duration="10" complete="42" priority="1" expand="true"/>
|
47
44
|
<task id="10" name="Website" color="#8cb6ce" meeting="false" start="2008-11-03" duration="141" complete="8" priority="1" expand="true"/>
|
48
45
|
</task>
|
49
|
-
<task id="11" name="Project
|
50
|
-
<task id="
|
51
|
-
<
|
52
|
-
<task id="35" name="Spatial Interface" color="#ff0033" meeting="false" start="2008-10-27" duration="7" complete="0" priority="1" expand="true"/>
|
53
|
-
<task id="36" name="3D input wiimote service providers" color="#ff0033" meeting="false" start="2008-10-27" duration="7" complete="0" priority="1" expand="true"/>
|
46
|
+
<task id="11" name="Project Design" color="#8cb6ce" meeting="false" start="2008-11-03" duration="107" complete="1" priority="1" expand="true">
|
47
|
+
<task id="12" name="Requirements Document" color="#ff3333" meeting="false" start="2008-11-03" duration="16" complete="7" priority="1" expand="true">
|
48
|
+
<depend id="13" type="1" difference="1" hardness="Strong"/>
|
54
49
|
</task>
|
55
|
-
<task id="
|
56
|
-
<
|
57
|
-
<task id="14" name="Design Document" color="#ff3333" meeting="false" start="2008-12-02" duration="45" complete="0" priority="1" expand="true"/>
|
58
|
-
<task id="15" name="Integration Test Plan" color="#ff3333" meeting="false" start="2009-01-26" duration="11" complete="0" priority="1" expand="true"/>
|
50
|
+
<task id="13" name="Acceptance Test Plan" color="#ff3333" meeting="false" start="2009-02-06" duration="12" complete="0" priority="1" expand="true">
|
51
|
+
<depend id="14" type="4" difference="0" hardness="Strong"/>
|
59
52
|
</task>
|
60
|
-
<task id="
|
61
|
-
<task id="
|
62
|
-
<
|
63
|
-
<task id="19" name="3D Interface" color="#00ff00" meeting="false" start="2009-01-01" duration="52" complete="0" priority="1" expand="true"/>
|
64
|
-
<task id="20" name="Spatial Interface" color="#00ff00" meeting="false" start="2009-01-01" duration="52" complete="0" priority="1" expand="true"/>
|
65
|
-
<task id="21" name="Accelerometer Interface" color="#00ff00" meeting="false" start="2009-01-01" duration="52" complete="0" priority="1" expand="true"/>
|
53
|
+
<task id="14" name="Design Document" color="#ff3333" meeting="false" start="2008-12-23" duration="45" complete="0" priority="1" expand="true"/>
|
54
|
+
<task id="15" name="Integration Test Plan" color="#ff3333" meeting="false" start="2009-01-26" duration="11" complete="0" priority="1" expand="true">
|
55
|
+
<depend id="13" type="2" difference="0" hardness="Strong"/>
|
66
56
|
</task>
|
67
|
-
<task id="22" name="Demos" color="#8cb6ce" meeting="false" start="2009-02-16" duration="31" complete="0" priority="1" expand="true">
|
68
|
-
<task id="23" name="3D Demo" color="#00ff00" meeting="false" start="2009-02-16" duration="31" complete="0" priority="1" expand="true"/>
|
69
|
-
<task id="24" name="Spatial Demo" color="#00ff00" meeting="false" start="2009-02-16" duration="31" complete="0" priority="1" expand="true"/>
|
70
|
-
<task id="25" name="Tennis Demo" color="#00ff00" meeting="false" start="2009-02-16" duration="31" complete="0" priority="1" expand="true"/>
|
71
|
-
</task>
|
72
|
-
</task>
|
73
|
-
<task id="26" name="Testing" color="#8cb6ce" meeting="false" start="2008-12-01" duration="142" complete="0" priority="1" expand="true">
|
74
|
-
<task id="27" name="Writing acceptance Tests" color="#990099" meeting="false" start="2008-12-01" duration="31" complete="0" priority="1" expand="true"/>
|
75
|
-
<task id="28" name="Perform test on new code" color="#990099" meeting="false" start="2009-01-01" duration="90" complete="0" priority="1" expand="true"/>
|
76
|
-
<task id="29" name="Tests and bug fixes" color="#990099" meeting="false" start="2009-04-01" duration="21" complete="0" priority="1" expand="true"/>
|
77
|
-
</task>
|
78
|
-
<task id="30" name="Presentation Prep" color="#8cb6ce" meeting="false" start="2009-01-20" duration="103" complete="0" priority="1" expand="true">
|
79
|
-
<task id="31" name="Initial presentations" color="#ffcc33" meeting="false" start="2009-01-20" duration="5" complete="0" priority="1" expand="true"/>
|
80
|
-
<task id="32" name="Final Presentations" color="#ffcc33" meeting="false" start="2009-04-27" duration="6" complete="0" priority="1" expand="true"/>
|
81
57
|
</task>
|
82
58
|
</tasks>
|
83
59
|
<resources>
|
@@ -91,26 +67,13 @@
|
|
91
67
|
<allocation task-id="4" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
92
68
|
<allocation task-id="5" resource-id="9" function="Default:0" responsible="true" load="100.0"/>
|
93
69
|
<allocation task-id="6" resource-id="9" function="Default:0" responsible="true" load="100.0"/>
|
94
|
-
<allocation task-id="7" resource-id="6" function="Default:1" responsible="true" load="100.0"/>
|
95
|
-
<allocation task-id="8" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
96
|
-
<allocation task-id="10" resource-id="9" function="Default:0" responsible="false" load="100.0"/>
|
97
70
|
<allocation task-id="10" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
98
|
-
<allocation task-id="
|
99
|
-
<allocation task-id="
|
100
|
-
<allocation task-id="36" resource-id="6" function="Default:1" responsible="true" load="100.0"/>
|
71
|
+
<allocation task-id="10" resource-id="9" function="Default:0" responsible="false" load="100.0"/>
|
72
|
+
<allocation task-id="12" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
101
73
|
<allocation task-id="12" resource-id="6" function="Default:1" responsible="true" load="100.0"/>
|
102
74
|
<allocation task-id="13" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
103
75
|
<allocation task-id="14" resource-id="6" function="Default:1" responsible="true" load="100.0"/>
|
104
76
|
<allocation task-id="15" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
105
|
-
<allocation task-id="17" resource-id="9" function="Default:0" responsible="false" load="100.0"/>
|
106
|
-
<allocation task-id="17" resource-id="7" function="Default:0" responsible="false" load="100.0"/>
|
107
|
-
<allocation task-id="17" resource-id="6" function="Default:1" responsible="true" load="100.0"/>
|
108
|
-
<allocation task-id="17" resource-id="8" function="Default:0" responsible="false" load="100.0"/>
|
109
|
-
<allocation task-id="19" resource-id="8" function="Default:0" responsible="true" load="100.0"/>
|
110
|
-
<allocation task-id="20" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
111
|
-
<allocation task-id="20" resource-id="6" function="Default:1" responsible="true" load="100.0"/>
|
112
|
-
<allocation task-id="21" resource-id="7" function="Default:0" responsible="true" load="100.0"/>
|
113
|
-
<allocation task-id="23" resource-id="9" function="Default:0" responsible="true" load="100.0"/>
|
114
77
|
</allocations>
|
115
78
|
<vacations/>
|
116
79
|
<taskdisplaycolumns>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ardekantur-gantty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ardekantur
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-11-20 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|