mpxj 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/README.md +113 -0
- data/docs/AssignmentAttributes.md +162 -0
- data/docs/RelationAttributes.md +5 -0
- data/docs/ResourceAttributes.md +201 -0
- data/docs/TaskAttributes.md +318 -0
- data/lib/mpxj/assignment.rb +7 -0
- data/lib/mpxj/container.rb +2 -0
- data/lib/mpxj/project.rb +21 -0
- data/lib/mpxj/reader.rb +8 -0
- data/lib/mpxj/relation.rb +1 -0
- data/lib/mpxj/resource.rb +1 -0
- data/lib/mpxj/task.rb +8 -3
- data/lib/mpxj/version.rb +3 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e6e40fb1b9d49d74fdae13c828bc474a018cde6
|
4
|
+
data.tar.gz: ffa9ff48837a143bcdb898f8aeba764e3a6bb3ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 194d76968cb5128e693df6d3c018b510bce7a8b2d522f5501d325c5e0d4d9799c1582208216e6212eadea90d69639c4bd4a19aa7a7cde162130705c75ffd7b5a
|
7
|
+
data.tar.gz: 183c8d18df285d987daecc49fa7498220947b0ea6600b48e037f86a57dc8fe38e6a848fde8102067942d961d0541986d601fbb1effb574004c7c490a878af1fa
|
data/README.md
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# MPXJ
|
2
|
+
|
3
|
+
This gem allows a Ruby developer to work with a read-only view of project plans saved by a number of popular project planning applications.
|
4
|
+
The work required to read data from these files is actually carried out by a [Java library](http://mpxj.sf.net), hence you will need Java installed
|
5
|
+
and available on your path in order to work with this gem. Once the project data has been read from a file, a set of Ruby objects provides access to the
|
6
|
+
structure of the project plan and its attributes.
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
gem 'mpxj'
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install mpxj
|
21
|
+
|
22
|
+
## Supported File Types
|
23
|
+
|
24
|
+
This gem uses the file name extension to determine what kind of project data it is reading. The list below shows the supported file extensions:
|
25
|
+
|
26
|
+
* **MPP** - Microsoft Project MPP file
|
27
|
+
* **MPT** - Microsoft Project template file
|
28
|
+
* **MPX** - Microsoft Project MPX file
|
29
|
+
* **XML** - Microsoft Project MSPDI (XML) file
|
30
|
+
* **MPD** - Microsoft Project database (only when the gem is used on Microsoft Windows)
|
31
|
+
* **PLANNER** - Gnome Planner
|
32
|
+
* **XER** - Primavera XER file
|
33
|
+
* **PMXML** - Primavera PMXML file
|
34
|
+
* **PP** - Asta Powerproject file
|
35
|
+
|
36
|
+
## Example Code
|
37
|
+
|
38
|
+
The following is a trivial example showing some basic task and resource details being queried from a project:
|
39
|
+
|
40
|
+
|
41
|
+
project = MPXJ::Reader.read("project1.mpp")
|
42
|
+
|
43
|
+
puts "There are #{project.all_tasks.size} tasks in this project"
|
44
|
+
puts "There are #{project.all_resources.size} resources in this project"
|
45
|
+
|
46
|
+
puts "The resources are:"
|
47
|
+
project.all_resources.each do |resource|
|
48
|
+
puts resource.name
|
49
|
+
end
|
50
|
+
|
51
|
+
puts "The tasks are:"
|
52
|
+
project.all_tasks.each do |task|
|
53
|
+
puts "#{task.name}: starts on #{task.start}, finishes on #{task.finish}, it's duration is #{task.duration}"
|
54
|
+
end
|
55
|
+
|
56
|
+
## Entities
|
57
|
+
|
58
|
+
The gem represents the project plan using the following classes, all of which reside in the MPXJ module.
|
59
|
+
|
60
|
+
* Project
|
61
|
+
* Resource
|
62
|
+
* Task
|
63
|
+
* Assignment
|
64
|
+
* Relation
|
65
|
+
|
66
|
+
A **Project** contains **Resource**s and **Task**s. Each **Resource** can be **Assigned** to one ore more **Task**s.
|
67
|
+
**Task**s can have dependencies between them which are represented as **Relation**s.
|
68
|
+
|
69
|
+
|
70
|
+
## Methods, Attributes and Data Types
|
71
|
+
|
72
|
+
There are very few explicit methods implemented by the classes noted above. Access to the attributes of each class is provided via a `method_missing` handler which checks to see if the requested method name matches a known attribute name. If it does match, the attribute value is returned, otherwise the normal method missing exception is raised.
|
73
|
+
|
74
|
+
The methods defined explicitly by these classes are:
|
75
|
+
|
76
|
+
Project#all_resources
|
77
|
+
Project#all_tasks
|
78
|
+
Project#child_tasks
|
79
|
+
Project#all_assignments
|
80
|
+
Project#get_resource_by_unique_id(unique_id)
|
81
|
+
Project#get_task_by_unique_id(unique_id)
|
82
|
+
Project#get_resource_by_id(id)
|
83
|
+
Project#get_task_by_id(id)
|
84
|
+
|
85
|
+
Resource#parent_project
|
86
|
+
Resource#assignments
|
87
|
+
|
88
|
+
Task#parent_project
|
89
|
+
Task#assignments
|
90
|
+
Task#predecessors
|
91
|
+
Task#successors
|
92
|
+
Task#child_tasks
|
93
|
+
Task#parent_task
|
94
|
+
|
95
|
+
Assignment#parent_project
|
96
|
+
Assignment#task
|
97
|
+
Assignment#resource
|
98
|
+
|
99
|
+
Each attribute supported by these classes is represented by appropriate data types:
|
100
|
+
|
101
|
+
* String
|
102
|
+
* Duration [https://rubygems.org/gems/duration](https://rubygems.org/gems/duration)
|
103
|
+
* Time
|
104
|
+
* Integer
|
105
|
+
* Float
|
106
|
+
|
107
|
+
The attributes supported by each class are listed here:
|
108
|
+
|
109
|
+
* [Task Attributes](docs/TaskAttributes.md)
|
110
|
+
* [Resource Attributes](docs/ResourceAttributes.md)
|
111
|
+
* [Assignment Attributes](docs/AssignmentAttributes.md)
|
112
|
+
* [Relation Attributes](docs/RelationAttributes.md)
|
113
|
+
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# Assignment Attributes
|
2
|
+
|
3
|
+
Assignment#actual_cost
|
4
|
+
Assignment#actual_finish
|
5
|
+
Assignment#actual_overtime_cost
|
6
|
+
Assignment#actual_overtime_work
|
7
|
+
Assignment#actual_overtime_work_protected
|
8
|
+
Assignment#actual_start
|
9
|
+
Assignment#actual_work
|
10
|
+
Assignment#actual_work_protected
|
11
|
+
Assignment#acwp
|
12
|
+
Assignment#assignment_delay
|
13
|
+
Assignment#assignment_resource_guid
|
14
|
+
Assignment#assignment_task_guid
|
15
|
+
Assignment#assignment_units
|
16
|
+
Assignment#baseline1_budget_cost
|
17
|
+
Assignment#baseline1_budget_work
|
18
|
+
Assignment#baseline1_cost
|
19
|
+
Assignment#baseline1_finish
|
20
|
+
Assignment#baseline1_start
|
21
|
+
Assignment#baseline1_work
|
22
|
+
...
|
23
|
+
Assignment#baseline10_budget_cost
|
24
|
+
Assignment#baseline10_budget_work
|
25
|
+
Assignment#baseline10_cost
|
26
|
+
Assignment#baseline10_finish
|
27
|
+
Assignment#baseline10_start
|
28
|
+
Assignment#baseline10_work
|
29
|
+
Assignment#baseline_budget_cost
|
30
|
+
Assignment#baseline_budget_work
|
31
|
+
Assignment#baseline_cost
|
32
|
+
Assignment#baseline_finish
|
33
|
+
Assignment#baseline_start
|
34
|
+
Assignment#baseline_work
|
35
|
+
Assignment#bcwp
|
36
|
+
Assignment#bcws
|
37
|
+
Assignment#budget_cost
|
38
|
+
Assignment#budget_work
|
39
|
+
Assignment#confirmed
|
40
|
+
Assignment#cost
|
41
|
+
Assignment#cost1
|
42
|
+
...
|
43
|
+
Assignment#cost10
|
44
|
+
Assignment#cost_rate_table
|
45
|
+
Assignment#cost_variance
|
46
|
+
Assignment#created
|
47
|
+
Assignment#cv
|
48
|
+
Assignment#date1
|
49
|
+
...
|
50
|
+
Assignment#date10
|
51
|
+
Assignment#duration1
|
52
|
+
...
|
53
|
+
Assignment#duration10
|
54
|
+
Assignment#duration1_units
|
55
|
+
...
|
56
|
+
Assignment#duration10_units
|
57
|
+
Assignment#enterprise_cost1
|
58
|
+
...
|
59
|
+
Assignment#enterprise_cost10
|
60
|
+
Assignment#enterprise_custom_field1
|
61
|
+
...
|
62
|
+
Assignment#enterprise_custom_field50
|
63
|
+
Assignment#enterprise_date1
|
64
|
+
...
|
65
|
+
Assignment#enterprise_date30
|
66
|
+
Assignment#enterprise_duration1
|
67
|
+
...
|
68
|
+
Assignment#enterprise_duration10
|
69
|
+
Assignment#enterprise_flag1
|
70
|
+
...
|
71
|
+
Assignment#enterprise_flag20
|
72
|
+
Assignment#enterprise_number1
|
73
|
+
...
|
74
|
+
Assignment#enterprise_number40
|
75
|
+
Assignment#enterprise_resource_multi_value20
|
76
|
+
...
|
77
|
+
Assignment#enterprise_resource_multi_value29
|
78
|
+
Assignment#enterprise_resource_outline_code1
|
79
|
+
...
|
80
|
+
Assignment#enterprise_resource_outline_code29
|
81
|
+
Assignment#enterprise_resource_rbs
|
82
|
+
Assignment#enterprise_team_member
|
83
|
+
Assignment#enterprise_text1
|
84
|
+
...
|
85
|
+
Assignment#enterprise_text40
|
86
|
+
Assignment#finish
|
87
|
+
Assignment#finish1
|
88
|
+
...
|
89
|
+
Assignment#finish10
|
90
|
+
Assignment#finish_variance
|
91
|
+
Assignment#fixed_material_assignment
|
92
|
+
Assignment#flag1
|
93
|
+
...
|
94
|
+
Assignment#flag20
|
95
|
+
Assignment#guid
|
96
|
+
Assignment#hyperlink
|
97
|
+
Assignment#hyperlink_address
|
98
|
+
Assignment#hyperlink_data
|
99
|
+
Assignment#hyperlink_href
|
100
|
+
Assignment#hyperlink_screen_tip
|
101
|
+
Assignment#hyperlink_subaddress
|
102
|
+
Assignment#index
|
103
|
+
Assignment#leveling_delay
|
104
|
+
Assignment#leveling_delay_units
|
105
|
+
Assignment#linked_fields
|
106
|
+
Assignment#notes
|
107
|
+
Assignment#number1
|
108
|
+
...
|
109
|
+
Assignment#number20
|
110
|
+
Assignment#overallocated
|
111
|
+
Assignment#overtime_cost
|
112
|
+
Assignment#overtime_work
|
113
|
+
Assignment#owner
|
114
|
+
Assignment#peak
|
115
|
+
Assignment#percent_work_complete
|
116
|
+
Assignment#project
|
117
|
+
Assignment#regular_work
|
118
|
+
Assignment#remaining_cost
|
119
|
+
Assignment#remaining_overtime_cost
|
120
|
+
Assignment#remaining_overtime_work
|
121
|
+
Assignment#remaining_work
|
122
|
+
Assignment#resource_id
|
123
|
+
Assignment#resource_name
|
124
|
+
Assignment#resource_request_type
|
125
|
+
Assignment#resource_type
|
126
|
+
Assignment#resource_unique_id
|
127
|
+
Assignment#response_pending
|
128
|
+
Assignment#start
|
129
|
+
Assignment#start1
|
130
|
+
...
|
131
|
+
Assignment#start10
|
132
|
+
Assignment#start_variance
|
133
|
+
Assignment#summary
|
134
|
+
Assignment#sv
|
135
|
+
Assignment#task_id
|
136
|
+
Assignment#task_name
|
137
|
+
Assignment#task_outline_number
|
138
|
+
Assignment#task_summary_name
|
139
|
+
Assignment#task_unique_id
|
140
|
+
Assignment#team_status_pending
|
141
|
+
Assignment#text1
|
142
|
+
...
|
143
|
+
Assignment#text30
|
144
|
+
Assignment#timephased_actual_overtime_work
|
145
|
+
Assignment#timephased_actual_work
|
146
|
+
Assignment#timephased_baseline1_cost
|
147
|
+
...
|
148
|
+
Assignment#timephased_baseline10_cost
|
149
|
+
Assignment#timephased_baseline1_work
|
150
|
+
...
|
151
|
+
Assignment#timephased_baseline10_work
|
152
|
+
Assignment#timephased_work
|
153
|
+
Assignment#unavailable
|
154
|
+
Assignment#unique_id
|
155
|
+
Assignment#update_needed
|
156
|
+
Assignment#vac
|
157
|
+
Assignment#variable_rate_units
|
158
|
+
Assignment#wbs
|
159
|
+
Assignment#work
|
160
|
+
Assignment#work_contour
|
161
|
+
Assignment#work_variance
|
162
|
+
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# Resource Attributes
|
2
|
+
|
3
|
+
Resource#accrue_at
|
4
|
+
Resource#active
|
5
|
+
Resource#actual_cost
|
6
|
+
Resource#actual_finish
|
7
|
+
Resource#actual_overtime_cost
|
8
|
+
Resource#actual_overtime_work
|
9
|
+
Resource#actual_overtime_work_protected
|
10
|
+
Resource#actual_start
|
11
|
+
Resource#actual_work
|
12
|
+
Resource#actual_work_protected
|
13
|
+
Resource#acwp
|
14
|
+
Resource#assignment
|
15
|
+
Resource#assignment_delay
|
16
|
+
Resource#assignment_owner
|
17
|
+
Resource#assignment_units
|
18
|
+
Resource#availability_data
|
19
|
+
Resource#available_from
|
20
|
+
Resource#available_to
|
21
|
+
Resource#base_calendar
|
22
|
+
Resource#baseline1_budget_cost
|
23
|
+
Resource#baseline1_budget_work
|
24
|
+
Resource#baseline1_cost
|
25
|
+
Resource#baseline1_finish
|
26
|
+
Resource#baseline1_start
|
27
|
+
Resource#baseline1_work
|
28
|
+
...
|
29
|
+
Resource#baseline10_budget_cost
|
30
|
+
Resource#baseline10_budget_work
|
31
|
+
Resource#baseline10_cost
|
32
|
+
Resource#baseline10_finish
|
33
|
+
Resource#baseline10_start
|
34
|
+
Resource#baseline10_work
|
35
|
+
Resource#baseline_budget_cost
|
36
|
+
Resource#baseline_budget_work
|
37
|
+
Resource#baseline_cost
|
38
|
+
Resource#baseline_finish
|
39
|
+
Resource#baseline_start
|
40
|
+
Resource#baseline_work
|
41
|
+
Resource#bcwp
|
42
|
+
Resource#bcws
|
43
|
+
Resource#booking_type
|
44
|
+
Resource#budget
|
45
|
+
Resource#budget_cost
|
46
|
+
Resource#budget_work
|
47
|
+
Resource#calendar_guid
|
48
|
+
Resource#can_level
|
49
|
+
Resource#code
|
50
|
+
Resource#confirmed
|
51
|
+
Resource#cost
|
52
|
+
Resource#cost1
|
53
|
+
...
|
54
|
+
Resource#cost10
|
55
|
+
Resource#cost_center
|
56
|
+
Resource#cost_per_use
|
57
|
+
Resource#cost_rate_a
|
58
|
+
Resource#cost_rate_b
|
59
|
+
Resource#cost_rate_c
|
60
|
+
Resource#cost_rate_d
|
61
|
+
Resource#cost_rate_e
|
62
|
+
Resource#cost_rate_table
|
63
|
+
Resource#cost_variance
|
64
|
+
Resource#created
|
65
|
+
Resource#cv
|
66
|
+
Resource#date1
|
67
|
+
...
|
68
|
+
Resource#date10
|
69
|
+
Resource#default_assignment_owner
|
70
|
+
Resource#duration1
|
71
|
+
...
|
72
|
+
Resource#duration10
|
73
|
+
Resource#duration1_units
|
74
|
+
...
|
75
|
+
Resource#duration10_units
|
76
|
+
Resource#email_address
|
77
|
+
Resource#enterprise
|
78
|
+
Resource#enterprise_base_calendar
|
79
|
+
Resource#enterprise_checked_out_by
|
80
|
+
Resource#enterprise_cost1
|
81
|
+
...
|
82
|
+
Resource#enterprise_cost10
|
83
|
+
Resource#enterprise_custom_field1
|
84
|
+
...
|
85
|
+
Resource#enterprise_custom_field50
|
86
|
+
Resource#enterprise_data
|
87
|
+
Resource#enterprise_date1
|
88
|
+
...
|
89
|
+
Resource#enterprise_date30
|
90
|
+
Resource#enterprise_duration1
|
91
|
+
...
|
92
|
+
Resource#enterprise_duration10
|
93
|
+
Resource#enterprise_duration1_units
|
94
|
+
...
|
95
|
+
Resource#enterprise_duration10_units
|
96
|
+
Resource#enterprise_flag1
|
97
|
+
...
|
98
|
+
Resource#enterprise_flag20
|
99
|
+
Resource#enterprise_is_checked_out
|
100
|
+
Resource#enterprise_last_modified_date
|
101
|
+
Resource#enterprise_multi_value20
|
102
|
+
...
|
103
|
+
Resource#enterprise_multi_value29
|
104
|
+
Resource#enterprise_name_used
|
105
|
+
Resource#enterprise_number1
|
106
|
+
...
|
107
|
+
Resource#enterprise_number40
|
108
|
+
Resource#enterprise_outline_code1
|
109
|
+
...
|
110
|
+
Resource#enterprise_outline_code29
|
111
|
+
Resource#enterprise_rbs
|
112
|
+
Resource#enterprise_required_values
|
113
|
+
Resource#enterprise_team_member
|
114
|
+
Resource#enterprise_text1
|
115
|
+
...
|
116
|
+
Resource#enterprise_text40
|
117
|
+
Resource#enterprise_unique_id
|
118
|
+
Resource#error_message
|
119
|
+
Resource#finish
|
120
|
+
Resource#finish1
|
121
|
+
...
|
122
|
+
Resource#finish10
|
123
|
+
Resource#flag1
|
124
|
+
...
|
125
|
+
Resource#flag20
|
126
|
+
Resource#generic
|
127
|
+
Resource#group
|
128
|
+
Resource#group_by_summary
|
129
|
+
Resource#guid
|
130
|
+
Resource#hyperlink
|
131
|
+
Resource#hyperlink_address
|
132
|
+
Resource#hyperlink_data
|
133
|
+
Resource#hyperlink_href
|
134
|
+
Resource#hyperlink_screen_tip
|
135
|
+
Resource#hyperlink_subaddress
|
136
|
+
Resource#id
|
137
|
+
Resource#import
|
138
|
+
Resource#inactive
|
139
|
+
Resource#index
|
140
|
+
Resource#indicators
|
141
|
+
Resource#initials
|
142
|
+
Resource#leveling_delay
|
143
|
+
Resource#linked_fields
|
144
|
+
Resource#material_label
|
145
|
+
Resource#max_units
|
146
|
+
Resource#name
|
147
|
+
Resource#notes
|
148
|
+
Resource#number1
|
149
|
+
...
|
150
|
+
Resource#number20
|
151
|
+
Resource#objects
|
152
|
+
Resource#outline_code1
|
153
|
+
...
|
154
|
+
Resource#outline_code10
|
155
|
+
Resource#outline_code1_index
|
156
|
+
...
|
157
|
+
Resource#outline_code10_index
|
158
|
+
Resource#overallocated
|
159
|
+
Resource#overtime_cost
|
160
|
+
Resource#overtime_rate
|
161
|
+
Resource#overtime_rate_units
|
162
|
+
Resource#overtime_work
|
163
|
+
Resource#peak
|
164
|
+
Resource#percent_work_complete
|
165
|
+
Resource#phonetics
|
166
|
+
Resource#project
|
167
|
+
Resource#regular_work
|
168
|
+
Resource#remaining_cost
|
169
|
+
Resource#remaining_overtime_cost
|
170
|
+
Resource#remaining_overtime_work
|
171
|
+
Resource#remaining_work
|
172
|
+
Resource#request_demand
|
173
|
+
Resource#response_pending
|
174
|
+
Resource#standard_rate
|
175
|
+
Resource#standard_rate_units
|
176
|
+
Resource#start
|
177
|
+
Resource#start1
|
178
|
+
...
|
179
|
+
Resource#start10
|
180
|
+
Resource#subproject_resource_unique_id
|
181
|
+
Resource#summary
|
182
|
+
Resource#sv
|
183
|
+
Resource#task_outline_number
|
184
|
+
Resource#task_summary_name
|
185
|
+
Resource#team_assignment_pool
|
186
|
+
Resource#teamstatus_pending
|
187
|
+
Resource#text1
|
188
|
+
...
|
189
|
+
Resource#text30
|
190
|
+
Resource#type
|
191
|
+
Resource#unavailable
|
192
|
+
Resource#unique_id
|
193
|
+
Resource#update_needed
|
194
|
+
Resource#vac
|
195
|
+
Resource#wbs
|
196
|
+
Resource#windows_user_account
|
197
|
+
Resource#work
|
198
|
+
Resource#work_contour
|
199
|
+
Resource#work_variance
|
200
|
+
Resource#workgroup
|
201
|
+
|
@@ -0,0 +1,318 @@
|
|
1
|
+
# Task Attributes
|
2
|
+
|
3
|
+
Task#active
|
4
|
+
Task#actual_cost
|
5
|
+
Task#actual_duration
|
6
|
+
Task#actual_duration_units
|
7
|
+
Task#actual_finish
|
8
|
+
Task#actual_overtime_cost
|
9
|
+
Task#actual_overtime_work
|
10
|
+
Task#actual_overtime_work_protected
|
11
|
+
Task#actual_start
|
12
|
+
Task#actual_work
|
13
|
+
Task#actual_work_protected
|
14
|
+
Task#acwp
|
15
|
+
Task#assignment
|
16
|
+
Task#assignment_delay
|
17
|
+
Task#assignment_owner
|
18
|
+
Task#assignment_units
|
19
|
+
Task#baseline1_budget_cost
|
20
|
+
Task#baseline1_budget_work
|
21
|
+
Task#baseline1_cost
|
22
|
+
Task#baseline1_deliverable_finish
|
23
|
+
Task#baseline1_deliverable_start
|
24
|
+
Task#baseline1_duration
|
25
|
+
Task#baseline1_duration_estimated
|
26
|
+
Task#baseline1_duration_units
|
27
|
+
Task#baseline1_estimated_duration
|
28
|
+
Task#baseline1_estimated_finish
|
29
|
+
Task#baseline1_estimated_start
|
30
|
+
Task#baseline1_finish
|
31
|
+
Task#baseline1_fixed_cost
|
32
|
+
Task#baseline1_fixed_cost_accrual
|
33
|
+
Task#baseline1_start
|
34
|
+
Task#baseline1_work
|
35
|
+
...
|
36
|
+
Task#baseline10_budget_cost
|
37
|
+
Task#baseline10_budget_work
|
38
|
+
Task#baseline10_cost
|
39
|
+
Task#baseline10_deliverable_finish
|
40
|
+
Task#baseline10_deliverable_start
|
41
|
+
Task#baseline10_duration
|
42
|
+
Task#baseline10_duration_estimated
|
43
|
+
Task#baseline10_duration_units
|
44
|
+
Task#baseline10_estimated_duration
|
45
|
+
Task#baseline10_estimated_finish
|
46
|
+
Task#baseline10_estimated_start
|
47
|
+
Task#baseline10_finish
|
48
|
+
Task#baseline10_fixed_cost
|
49
|
+
Task#baseline10_fixed_cost_accrual
|
50
|
+
Task#baseline10_start
|
51
|
+
Task#baseline10_work
|
52
|
+
Task#baseline_budget_cost
|
53
|
+
Task#baseline_budget_work
|
54
|
+
Task#baseline_cost
|
55
|
+
Task#baseline_deliverable_finish
|
56
|
+
Task#baseline_deliverable_start
|
57
|
+
Task#baseline_duration
|
58
|
+
Task#baseline_duration_estimated
|
59
|
+
Task#baseline_duration_units
|
60
|
+
Task#baseline_estimated_duration
|
61
|
+
Task#baseline_estimated_finish
|
62
|
+
Task#baseline_estimated_start
|
63
|
+
Task#baseline_finish
|
64
|
+
Task#baseline_fixed_cost
|
65
|
+
Task#baseline_fixed_cost_accrual
|
66
|
+
Task#baseline_start
|
67
|
+
Task#baseline_work
|
68
|
+
Task#bcwp
|
69
|
+
Task#bcws
|
70
|
+
Task#budget_cost
|
71
|
+
Task#budget_work
|
72
|
+
Task#calendar
|
73
|
+
Task#calendar_unique_id
|
74
|
+
Task#complete_through
|
75
|
+
Task#confirmed
|
76
|
+
Task#constraint_date
|
77
|
+
Task#constraint_type
|
78
|
+
Task#contact
|
79
|
+
Task#cost
|
80
|
+
Task#cost1
|
81
|
+
...
|
82
|
+
Task#cost10
|
83
|
+
Task#cost_rate_table
|
84
|
+
Task#cost_variance
|
85
|
+
Task#cpi
|
86
|
+
Task#created
|
87
|
+
Task#critical
|
88
|
+
Task#cv
|
89
|
+
Task#cvpercent
|
90
|
+
Task#date1
|
91
|
+
...
|
92
|
+
Task#date10
|
93
|
+
Task#deadline
|
94
|
+
Task#deliverable_finish
|
95
|
+
Task#deliverable_guid
|
96
|
+
Task#deliverable_name
|
97
|
+
Task#deliverable_start
|
98
|
+
Task#deliverable_type
|
99
|
+
Task#duration
|
100
|
+
Task#duration1
|
101
|
+
...
|
102
|
+
Task#duration10
|
103
|
+
Task#duration1_estimated
|
104
|
+
...
|
105
|
+
Task#duration10_estimated
|
106
|
+
Task#duration1_units
|
107
|
+
...
|
108
|
+
Task#duration10_units
|
109
|
+
Task#duration_text
|
110
|
+
Task#duration_units
|
111
|
+
Task#duration_variance
|
112
|
+
Task#eac
|
113
|
+
Task#early_finish
|
114
|
+
Task#early_start
|
115
|
+
Task#earned_value_method
|
116
|
+
Task#effort_driven
|
117
|
+
Task#enterprise_cost1
|
118
|
+
...
|
119
|
+
Task#enterprise_cost10
|
120
|
+
Task#enterprise_custom_field1
|
121
|
+
...
|
122
|
+
Task#enterprise_custom_field50
|
123
|
+
Task#enterprise_data
|
124
|
+
Task#enterprise_date1
|
125
|
+
...
|
126
|
+
Task#enterprise_date30
|
127
|
+
Task#enterprise_duration1
|
128
|
+
...
|
129
|
+
Task#enterprise_duration10
|
130
|
+
Task#enterprise_duration1_units
|
131
|
+
...
|
132
|
+
Task#enterprise_duration10_units
|
133
|
+
Task#enterprise_flag1
|
134
|
+
...
|
135
|
+
Task#enterprise_flag20
|
136
|
+
Task#enterprise_number1
|
137
|
+
...
|
138
|
+
Task#enterprise_number40
|
139
|
+
Task#enterprise_outline_code1
|
140
|
+
...
|
141
|
+
Task#enterprise_outline_code30
|
142
|
+
Task#enterprise_project_cost1
|
143
|
+
...
|
144
|
+
Task#enterprise_project_cost10
|
145
|
+
Task#enterprise_project_date1
|
146
|
+
...
|
147
|
+
Task#enterprise_project_date30
|
148
|
+
Task#enterprise_project_duration1
|
149
|
+
...
|
150
|
+
Task#enterprise_project_duration10
|
151
|
+
Task#enterprise_project_flag1
|
152
|
+
...
|
153
|
+
Task#enterprise_project_flag20
|
154
|
+
Task#enterprise_project_number1
|
155
|
+
...
|
156
|
+
Task#enterprise_project_number40
|
157
|
+
Task#enterprise_project_outline_code1
|
158
|
+
...
|
159
|
+
Task#enterprise_project_outline_code30
|
160
|
+
Task#enterprise_project_text1
|
161
|
+
...
|
162
|
+
Task#enterprise_project_text40
|
163
|
+
Task#enterprise_text1
|
164
|
+
...
|
165
|
+
Task#enterprise_text40
|
166
|
+
Task#error_message
|
167
|
+
Task#estimated
|
168
|
+
Task#external_task
|
169
|
+
Task#finish
|
170
|
+
Task#finish1
|
171
|
+
...
|
172
|
+
Task#finish10
|
173
|
+
Task#finish_slack
|
174
|
+
Task#finish_text
|
175
|
+
Task#finish_variance
|
176
|
+
Task#fixed_cost
|
177
|
+
Task#fixed_cost_accrual
|
178
|
+
Task#fixed_duration
|
179
|
+
Task#flag1
|
180
|
+
...
|
181
|
+
Task#flag20
|
182
|
+
Task#free_slack
|
183
|
+
Task#group_by_summary
|
184
|
+
Task#guid
|
185
|
+
Task#hide_bar
|
186
|
+
Task#hyperlink
|
187
|
+
Task#hyperlink_address
|
188
|
+
Task#hyperlink_data
|
189
|
+
Task#hyperlink_href
|
190
|
+
Task#hyperlink_screen_tip
|
191
|
+
Task#hyperlink_subaddress
|
192
|
+
Task#id
|
193
|
+
Task#ignore_resource_calendar
|
194
|
+
Task#ignore_warnings
|
195
|
+
Task#index
|
196
|
+
Task#indicators
|
197
|
+
Task#is_duration_valid
|
198
|
+
Task#is_finish_valid
|
199
|
+
Task#is_start_valid
|
200
|
+
Task#late_finish
|
201
|
+
Task#late_start
|
202
|
+
Task#level_assignments
|
203
|
+
Task#leveling_can_split
|
204
|
+
Task#leveling_delay
|
205
|
+
Task#leveling_delay_units
|
206
|
+
Task#linked_fields
|
207
|
+
Task#manual_duration
|
208
|
+
Task#manual_duration_units
|
209
|
+
Task#marked
|
210
|
+
Task#milestone
|
211
|
+
Task#name
|
212
|
+
Task#notes
|
213
|
+
Task#number1
|
214
|
+
...
|
215
|
+
Task#number20
|
216
|
+
Task#outline_code1
|
217
|
+
...
|
218
|
+
Task#outline_code10
|
219
|
+
Task#outline_code1_index
|
220
|
+
...
|
221
|
+
Task#outline_code10_index
|
222
|
+
Task#outline_level
|
223
|
+
Task#outline_number
|
224
|
+
Task#overallocated
|
225
|
+
Task#overtime_cost
|
226
|
+
Task#overtime_work
|
227
|
+
Task#parent_task
|
228
|
+
Task#parent_task_unique_id
|
229
|
+
Task#path_driven_successor
|
230
|
+
Task#path_driving_predecessor
|
231
|
+
Task#path_predecessor
|
232
|
+
Task#path_successor
|
233
|
+
Task#peak
|
234
|
+
Task#percent_complete
|
235
|
+
Task#percent_work_complete
|
236
|
+
Task#physical_percent_complete
|
237
|
+
Task#placeholder
|
238
|
+
Task#predecessors
|
239
|
+
Task#preleveled_finish
|
240
|
+
Task#preleveled_start
|
241
|
+
Task#priority
|
242
|
+
Task#project
|
243
|
+
Task#publish
|
244
|
+
Task#recalc_outline_codes
|
245
|
+
Task#recurring
|
246
|
+
Task#recurring_data
|
247
|
+
Task#regular_work
|
248
|
+
Task#remaining_cost
|
249
|
+
Task#remaining_duration
|
250
|
+
Task#remaining_overtime_cost
|
251
|
+
Task#remaining_overtime_work
|
252
|
+
Task#remaining_work
|
253
|
+
Task#request_demand
|
254
|
+
Task#resource_enterprise_multi_value_code20
|
255
|
+
...
|
256
|
+
Task#resource_enterprise_multi_value_code29
|
257
|
+
Task#resource_enterprise_outline_code1
|
258
|
+
...
|
259
|
+
Task#resource_enterprise_outline_code29
|
260
|
+
Task#resource_enterprise_rbs
|
261
|
+
Task#resource_group
|
262
|
+
Task#resource_initials
|
263
|
+
Task#resource_names
|
264
|
+
Task#resource_phonetics
|
265
|
+
Task#resource_type
|
266
|
+
Task#response_pending
|
267
|
+
Task#resume
|
268
|
+
Task#resume_no_earlier_than
|
269
|
+
Task#rollup
|
270
|
+
Task#scheduled_duration
|
271
|
+
Task#scheduled_finish
|
272
|
+
Task#scheduled_start
|
273
|
+
Task#spi
|
274
|
+
Task#start
|
275
|
+
Task#start1
|
276
|
+
...
|
277
|
+
Task#start10
|
278
|
+
Task#start_slack
|
279
|
+
Task#start_text
|
280
|
+
Task#start_variance
|
281
|
+
Task#status
|
282
|
+
Task#status_indicator
|
283
|
+
Task#status_manager
|
284
|
+
Task#stop
|
285
|
+
Task#subproject_file
|
286
|
+
Task#subproject_read_only
|
287
|
+
Task#subproject_task_id
|
288
|
+
Task#subproject_tasks_uniqueid_offset
|
289
|
+
Task#subproject_unique_task_id
|
290
|
+
Task#successors
|
291
|
+
Task#summary
|
292
|
+
Task#summary_progress
|
293
|
+
Task#sv
|
294
|
+
Task#svpercent
|
295
|
+
Task#task_calendar
|
296
|
+
Task#task_calendar_guid
|
297
|
+
Task#task_mode
|
298
|
+
Task#tcpi
|
299
|
+
Task#teamstatus_pending
|
300
|
+
Task#text1
|
301
|
+
...
|
302
|
+
Task#text30
|
303
|
+
Task#total_slack
|
304
|
+
Task#type
|
305
|
+
Task#unavailable
|
306
|
+
Task#unique_id
|
307
|
+
Task#unique_id_predecessors
|
308
|
+
Task#unique_id_successors
|
309
|
+
Task#update_needed
|
310
|
+
Task#vac
|
311
|
+
Task#warning
|
312
|
+
Task#wbs
|
313
|
+
Task#wbs_predecessors
|
314
|
+
Task#wbs_successors
|
315
|
+
Task#work
|
316
|
+
Task#work_contour
|
317
|
+
Task#work_variance
|
318
|
+
|
data/lib/mpxj/assignment.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
module MPXJ
|
2
|
+
# Represents a relationship between a task and a resource in a project plan
|
2
3
|
class Assignment < Container
|
4
|
+
# Retrieve the task associated with this assignment
|
5
|
+
#
|
6
|
+
# @return [Task] the task associated with this assignment.
|
3
7
|
def task
|
4
8
|
parent_project.get_task_by_unique_id(task_unique_id)
|
5
9
|
end
|
6
10
|
|
11
|
+
# Retrieve the resource associated with this assignment
|
12
|
+
#
|
13
|
+
# @return [Resource] the resource associated with this assignment.
|
7
14
|
def resource
|
8
15
|
parent_project.get_resource_by_unique_id(resource_unique_id)
|
9
16
|
end
|
data/lib/mpxj/container.rb
CHANGED
@@ -2,6 +2,7 @@ require 'duration'
|
|
2
2
|
require 'time'
|
3
3
|
|
4
4
|
module MPXJ
|
5
|
+
# Base class from which all project entities are derived
|
5
6
|
class Container
|
6
7
|
attr_reader :parent_project
|
7
8
|
def initialize(parent_project, attribute_types, attribute_values)
|
@@ -10,6 +11,7 @@ module MPXJ
|
|
10
11
|
@attribute_values = attribute_values
|
11
12
|
end
|
12
13
|
|
14
|
+
|
13
15
|
def method_missing(name, *args, &block)
|
14
16
|
attribute_name = name.to_s
|
15
17
|
attribute_type = @attribute_types[attribute_name]
|
data/lib/mpxj/project.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
module MPXJ
|
4
|
+
# Represents a project plan
|
4
5
|
class Project
|
5
6
|
attr_reader :all_resources
|
6
7
|
attr_reader :all_tasks
|
@@ -25,18 +26,38 @@ module MPXJ
|
|
25
26
|
process_assignments(json_data)
|
26
27
|
end
|
27
28
|
|
29
|
+
# Retrieves the resource with the matching unique_id attribute
|
30
|
+
#
|
31
|
+
# @param unique_id [Integer] resource unique ID
|
32
|
+
# @return [Resource] if the requested resource is found
|
33
|
+
# @return [nil] if the requested resource is not found
|
28
34
|
def get_resource_by_unique_id(unique_id)
|
29
35
|
@resources_by_unique_id[unique_id]
|
30
36
|
end
|
31
37
|
|
38
|
+
# Retrieves the task with the matching unique_id attribute
|
39
|
+
#
|
40
|
+
# @param unique_id [Integer] task unique ID
|
41
|
+
# @return [Task] if the requested task is found
|
42
|
+
# @return [nil] if the requested task is not found
|
32
43
|
def get_task_by_unique_id(unique_id)
|
33
44
|
@tasks_by_unique_id[unique_id]
|
34
45
|
end
|
35
46
|
|
47
|
+
# Retrieves the resource with the matching id attribute
|
48
|
+
#
|
49
|
+
# @param id [Integer] resource ID
|
50
|
+
# @return [Resource] if the requested resource is found
|
51
|
+
# @return [nil] if the requested resource is not found
|
36
52
|
def get_resource_by_id(id)
|
37
53
|
@resources_by_id[id]
|
38
54
|
end
|
39
55
|
|
56
|
+
# Retrieves the task with the matching id attribute
|
57
|
+
#
|
58
|
+
# @param id [Integer] task ID
|
59
|
+
# @return [Task] if the requested task is found
|
60
|
+
# @return [nil] if the requested task is not found
|
40
61
|
def get_task_by_id(id)
|
41
62
|
@tasks_by_unique_id[id]
|
42
63
|
end
|
data/lib/mpxj/reader.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
require 'tempfile'
|
2
2
|
|
3
3
|
module MPXJ
|
4
|
+
# Used to read a project plan from a file
|
4
5
|
class Reader
|
6
|
+
# Reads a project plan from a file, and returns a Project instance
|
7
|
+
# which provides access to the structure and attributes of the project data.
|
8
|
+
#
|
9
|
+
# @param file_name [String] the name of the file to read
|
10
|
+
# @return [Project] new Project instance
|
5
11
|
def self.read(file_name)
|
6
12
|
project = nil
|
7
13
|
json_file = Tempfile.new([File.basename(file_name, ".*"), '.json'])
|
@@ -19,6 +25,7 @@ module MPXJ
|
|
19
25
|
project
|
20
26
|
end
|
21
27
|
|
28
|
+
# @private
|
22
29
|
def self.path_separator
|
23
30
|
if windows?
|
24
31
|
";"
|
@@ -27,6 +34,7 @@ module MPXJ
|
|
27
34
|
end
|
28
35
|
end
|
29
36
|
|
37
|
+
# @private
|
30
38
|
def self.windows?
|
31
39
|
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
|
32
40
|
end
|
data/lib/mpxj/relation.rb
CHANGED
data/lib/mpxj/resource.rb
CHANGED
data/lib/mpxj/task.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module MPXJ
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
# Represents a task in a project plan
|
3
|
+
class Task < Container
|
5
4
|
attr_reader :assignments
|
6
5
|
attr_reader :predecessors
|
7
6
|
attr_reader :successors
|
@@ -15,12 +14,18 @@ module MPXJ
|
|
15
14
|
process_hierarchy
|
16
15
|
end
|
17
16
|
|
17
|
+
# Retrieve the parent task of this task
|
18
|
+
#
|
19
|
+
# @return [Task] if this task is the child of another task
|
20
|
+
# @return [nil] if this is the root task
|
18
21
|
def parent_task
|
19
22
|
parent_project.get_task_by_unique_id(parent_task_unique_id)
|
20
23
|
end
|
21
24
|
|
22
25
|
private
|
23
26
|
|
27
|
+
RELATION_ATTRIBUTE_TYPES = {"task_unique_id" => 17, "lag" => 6, "type" => 10}
|
28
|
+
|
24
29
|
def process_relations
|
25
30
|
@predecessors = process_relation_list(attribute_values["predecessors"])
|
26
31
|
@successors = process_relation_list(attribute_values["successors"])
|
data/lib/mpxj/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mpxj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Iles
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,8 +87,13 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
+
- README.md
|
90
91
|
- bin/console
|
91
92
|
- bin/setup
|
93
|
+
- docs/AssignmentAttributes.md
|
94
|
+
- docs/RelationAttributes.md
|
95
|
+
- docs/ResourceAttributes.md
|
96
|
+
- docs/TaskAttributes.md
|
92
97
|
- lib/mpxj.rb
|
93
98
|
- lib/mpxj/assignment.rb
|
94
99
|
- lib/mpxj/container.rb
|