mpxj 13.6.0 → 13.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c8cf902945b120caf9accd4d09eafef0737fb10216de71f84bf7b2ac4b5d651
4
- data.tar.gz: 1926ce5fd7253cc93fd4f820bf49811e09a849d1013eda357013543117b73e14
3
+ metadata.gz: 6db16fa074527bf24f66fc3489f80b74e8d3b57f66c16a1ec08fb1caff9549f9
4
+ data.tar.gz: 828539843889b0dc81b6af42895d40002aafa3f21333ee746f2f51402d0fb9e6
5
5
  SHA512:
6
- metadata.gz: 3519d8d8aa1a7bd331ebe71d88a32b38aac3009637dc1c9a2b8b8b6d446496f4f922c3d6d9c4abbb0277afb16f80dd3ab577957500f2bc8dec612315e3c742f9
7
- data.tar.gz: db0ccdf21f2e074fb91a8da72ce9da4b9cc1043fc83a90f7d4e68484e9360a8f56f72e360aeb86b68f1a7dac973d48a725f26c6a2b59f04edbdc5eee9a06cd1d
6
+ metadata.gz: 3b797948446ff205f52ad52442308923c89b571c6f74b5d9524dad595a50fc04ca3b3f82db67a2ae15e948fd90bc29c61e7df10adbbafe0dc2e5fff7014ac014
7
+ data.tar.gz: 2f5e9809446502455952c062e2a848bc06031d29d3fa293a7c755b077263e199540bb0f1191013ed562e6aa6404f2a3b96b817ac5977f900d3fbc5f217faec30
@@ -0,0 +1,112 @@
1
+ module MPXJ
2
+ # Represents a calendar
3
+ class Calendar < Container
4
+ attr_reader :days
5
+ attr_reader :weeks
6
+ attr_reader :exceptions
7
+
8
+ def initialize(parent_project, attribute_values)
9
+ super(parent_project, attribute_values.slice('unique_id', 'guid', 'parent_unique_id', 'name', 'type', 'personal', 'minutes_per_day', 'minutes_per_week', 'minutes_per_month', 'minutes_per_year'))
10
+ process_days(attribute_values)
11
+ process_weeks(attribute_values)
12
+ process_exceptions(attribute_values)
13
+ end
14
+
15
+ # Retrieve the calendar unique ID
16
+ #
17
+ # @return [Integer] the calendar unique ID
18
+ def unique_id
19
+ get_integer_value(attribute_values['unique_id'])
20
+ end
21
+
22
+ # Retrieve the calendar GUID
23
+ #
24
+ # @return [String] the calendar GUID
25
+ def guid
26
+ attribute_values['guid']
27
+ end
28
+
29
+ # Retrieve the parent calendar unique ID
30
+ #
31
+ # @return [Integer] the parent calendar unique ID
32
+ # @return [nil] if the calendar does not have a parent
33
+ def parent_unique_id
34
+ get_nillable_integer_value(attribute_values['parent_unique_id'])
35
+ end
36
+
37
+ # Retrieve the parent calendar of this calendar
38
+ #
39
+ # @return [Calendar] if this calendar is the child of another calendar
40
+ # @return [nil] if this is a base calendar
41
+ def parent_calendar
42
+ parent_project.get_calendar_by_unique_id(attribute_values['parent_unique_id']&.to_i)
43
+ end
44
+
45
+ # Retrieve the calendar name
46
+ #
47
+ # @return [String] the calendar name
48
+ def name
49
+ attribute_values['name']
50
+ end
51
+
52
+ # Retrieve the calendar type
53
+ #
54
+ # @return [String] the calendar type
55
+ def type
56
+ attribute_values['type']
57
+ end
58
+
59
+ # Retrieve the personal flag
60
+ #
61
+ # @return [Boolean] true if this is a personal calendar
62
+ def personal
63
+ get_boolean_value(attribute_values['personal'])
64
+ end
65
+
66
+ # Retrieve the number of minutes per day
67
+ #
68
+ # @return [Integer] the number of minutes per day
69
+ # @return [nil] if this calendar does not provide a value for minutes per day
70
+ def minutes_per_day
71
+ get_nillable_integer_value(attribute_values['minutes_per_day'])
72
+ end
73
+
74
+ # Retrieve the number of minutes per week
75
+ #
76
+ # @return [Integer] the number of minutes per week
77
+ # @return [nil] if this calendar does not provide a value for minutes per week
78
+ def minutes_per_week
79
+ get_nillable_integer_value(attribute_values['minutes_per_week'])
80
+ end
81
+
82
+ # Retrieve the number of minutes per month
83
+ #
84
+ # @return [Integer] the number of minutes per month
85
+ # @return [nil] if this calendar does not provide a value for minutes per month
86
+ def minutes_per_month
87
+ get_nillable_integer_value(attribute_values['minutes_per_month'])
88
+ end
89
+
90
+ # Retrieve the number of minutes per year
91
+ #
92
+ # @return [Integer] the number of minutes per year
93
+ # @return [nil] if this calendar does not provide a value for minutes per year
94
+ def minutes_per_year
95
+ get_nillable_integer_value(attribute_values['minutes_per_year'])
96
+ end
97
+
98
+ private
99
+
100
+ def process_days(attribute_values)
101
+ @days = attribute_values.slice('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday').map {|name, day| [name, CalendarDay.new(parent_project, day)]}.to_h
102
+ end
103
+
104
+ def process_weeks(attribute_values)
105
+ @weeks = (attribute_values['working_weeks'] || []).map {|week| CalendarWeek.new(parent_project, week)}
106
+ end
107
+
108
+ def process_exceptions(attribute_values)
109
+ @exceptions = (attribute_values['exceptions'] || []).map {|exception| CalendarException.new(parent_project, exception)}
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,26 @@
1
+ module MPXJ
2
+ # Represents a calendar day
3
+ class CalendarDay < Container
4
+ attr_reader :hours
5
+
6
+ def initialize(parent_project, attribute_values)
7
+ super(parent_project, attribute_values.slice('type'))
8
+ process_hours(attribute_values)
9
+ end
10
+
11
+ # Retrieve the day type
12
+ #
13
+ # @return [String] the calendar day type
14
+ def type
15
+ attribute_values['type']
16
+ end
17
+
18
+ private
19
+
20
+ def process_hours(attribute_values)
21
+ @hours = (attribute_values['hours'] || {}).map do |hours|
22
+ CalendarHours.new(parent_project, hours)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,47 @@
1
+ module MPXJ
2
+ # Represents a calendar exception
3
+ class CalendarException < Container
4
+ attr_reader :hours
5
+
6
+ def initialize(parent_project, attribute_values)
7
+ super(parent_project, attribute_values.slice('name', 'from', 'to', 'type'))
8
+ process_hours(attribute_values)
9
+ end
10
+
11
+ # Retrieve the exception name
12
+ #
13
+ # @return [String] the exception name
14
+ def name
15
+ attribute_values['name']
16
+ end
17
+
18
+ # Retrieve the date on which this exception starts
19
+ #
20
+ # @return [Time] the exception from date
21
+ def from
22
+ get_date_value(attribute_values['from'])
23
+ end
24
+
25
+ # Retrieve the date on which this exception ends
26
+ #
27
+ # @return [Time] the exception to date
28
+ def to
29
+ get_date_value(attribute_values['to'])
30
+ end
31
+
32
+ # Retrieve the exception type
33
+ #
34
+ # @return [String] the exception type
35
+ def type
36
+ attribute_values['type']
37
+ end
38
+
39
+ private
40
+
41
+ def process_hours(attribute_values)
42
+ @hours = (attribute_values['hours'] || {}).map do |hours|
43
+ CalendarHours.new(parent_project, hours)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,19 @@
1
+ module MPXJ
2
+ # Represents a range of hours
3
+ class CalendarHours < Container
4
+
5
+ # Retrieve the the start hour
6
+ #
7
+ # @return [Time] start hour
8
+ def from
9
+ get_date_value(attribute_values['from'])
10
+ end
11
+
12
+ # Retrieve the the finish hour
13
+ #
14
+ # @return [Time] finish hour
15
+ def to
16
+ get_date_value(attribute_values['to'])
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ module MPXJ
2
+ # Represents a working week
3
+ class CalendarWeek < Container
4
+ attr_reader :days
5
+
6
+ def initialize(parent_project, attribute_values)
7
+ super(parent_project, attribute_values.slice('name', 'effective_from', 'effective_to'))
8
+ process_days(attribute_values)
9
+ end
10
+
11
+ # Retrieve the exception name
12
+ #
13
+ # @return [String] the exception name
14
+ def name
15
+ attribute_values['name']
16
+ end
17
+
18
+ # Retrieve the date from which this working week is in effect
19
+ #
20
+ # @return [Time] effective from date
21
+ def effective_from
22
+ get_date_value(attribute_values['effective_from'])
23
+ end
24
+
25
+ # Retrieve the date to which this working week is in effect
26
+ #
27
+ # @return [Time] effective to date
28
+ def effective_to
29
+ get_date_value(attribute_values['effective_to'])
30
+ end
31
+
32
+ private
33
+
34
+ def process_days(attribute_values)
35
+ @days = attribute_values.slice('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday').map {|name, day| [name, CalendarDay.new(parent_project, day)]}.to_h
36
+ end
37
+ end
38
+ end
@@ -45,6 +45,14 @@ module MPXJ
45
45
  end
46
46
  end
47
47
 
48
+ def get_nillable_integer_value(attribute_value)
49
+ if attribute_value.nil?
50
+ nil
51
+ else
52
+ attribute_value.to_i
53
+ end
54
+ end
55
+
48
56
  def get_boolean_value(attribute_value)
49
57
  attribute_value == true
50
58
  end
data/lib/mpxj/mpxj.jar CHANGED
Binary file
data/lib/mpxj/project.rb CHANGED
@@ -4,6 +4,7 @@ module MPXJ
4
4
  # Represents a project plan
5
5
  class Project
6
6
  attr_reader :properties
7
+ attr_reader :all_calendars
7
8
  attr_reader :all_resources
8
9
  attr_reader :all_tasks
9
10
  attr_reader :child_tasks
@@ -11,12 +12,14 @@ module MPXJ
11
12
  attr_reader :zone
12
13
 
13
14
  def initialize(file_name, zone)
15
+ @calendars_by_unique_id = {}
14
16
  @resources_by_unique_id = {}
15
17
  @tasks_by_unique_id = {}
16
18
 
17
- @resources_by_id = {}
19
+ @resources_by_id = {}
18
20
  @tasks_by_id = {}
19
21
 
22
+ @all_calendars = []
20
23
  @all_resources = []
21
24
  @all_tasks = []
22
25
  @all_assignments = []
@@ -29,6 +32,7 @@ module MPXJ
29
32
 
30
33
  file = File.read(file_name)
31
34
  json_data = JSON.parse(file)
35
+ process_calendars(json_data)
32
36
  process_custom_fields(json_data)
33
37
  process_properties(json_data)
34
38
  process_resources(json_data)
@@ -36,6 +40,15 @@ module MPXJ
36
40
  process_assignments(json_data)
37
41
  end
38
42
 
43
+ # Retrieves the calendar with the matching unique_id attribute
44
+ #
45
+ # @param unique_id [Integer] calendar unique ID
46
+ # @return [Calendar] if the requested calendar is found
47
+ # @return [nil] if the requested calendar is not found
48
+ def get_calendar_by_unique_id(unique_id)
49
+ @calendars_by_unique_id[unique_id]
50
+ end
51
+
39
52
  # Retrieves the resource with the matching unique_id attribute
40
53
  #
41
54
  # @param unique_id [Integer] resource unique ID
@@ -104,6 +117,15 @@ module MPXJ
104
117
 
105
118
  private
106
119
 
120
+ def process_calendars(json_data)
121
+ calendars = json_data["calendars"]
122
+ calendars.each do |attribute_values|
123
+ calendar = Calendar.new(self, attribute_values)
124
+ @all_calendars << calendar
125
+ @calendars_by_unique_id[calendar.unique_id] = calendar
126
+ end
127
+ end
128
+
107
129
  def process_custom_fields(json_data)
108
130
  custom_fields = json_data["custom_fields"] || []
109
131
  custom_fields.each do |field|
@@ -2,5 +2,12 @@ module MPXJ
2
2
  # Represents the properties of a project
3
3
  class Properties < Container
4
4
  include MPXJ::PropertyMethods
5
+
6
+ # Retrieve the default calendar for this project
7
+ #
8
+ # @return [Calendar] default calendar
9
+ def default_calendar
10
+ parent_project.get_calendar_by_unique_id(attribute_values['default_calendar_unique_id']&.to_i)
11
+ end
5
12
  end
6
13
  end
data/lib/mpxj/resource.rb CHANGED
@@ -8,5 +8,13 @@ module MPXJ
8
8
  super(parent_project, attribute_values)
9
9
  @assignments = []
10
10
  end
11
+
12
+ # Retrieve the calendar used by this resource
13
+ #
14
+ # @return [Calendar] resource calendar
15
+ # @return [nil] if this resource does not have a calendar
16
+ def calendar
17
+ parent_project.get_calendar_by_unique_id(attribute_values['calendar_unique_id']&.to_i)
18
+ end
11
19
  end
12
20
  end
data/lib/mpxj/task.rb CHANGED
@@ -24,6 +24,14 @@ module MPXJ
24
24
  parent_project.get_task_by_unique_id(attribute_values['parent_task_unique_id']&.to_i)
25
25
  end
26
26
 
27
+ # Retrieve the calendar used by this task
28
+ #
29
+ # @return [Calendar] task calendar
30
+ # @return [nil] if this task does not have a calendar assigned
31
+ def calendar
32
+ parent_project.get_calendar_by_unique_id(attribute_values['calendar_unique_id']&.to_i)
33
+ end
34
+
27
35
  private
28
36
 
29
37
  def process_relations
@@ -18,6 +18,13 @@ module MPXJ
18
18
  attribute_values['activity_codes']
19
19
  end
20
20
 
21
+ # Retrieve the Activity Code Values value
22
+ #
23
+ # @return Activity Code Values value
24
+ def activity_code_values
25
+ attribute_values['activity_code_values']
26
+ end
27
+
21
28
  # Retrieve the Activity ID value
22
29
  #
23
30
  # @return Activity ID value
@@ -6909,6 +6916,7 @@ module MPXJ
6909
6916
  ATTRIBUTE_TYPES = {
6910
6917
  'active' => :boolean,
6911
6918
  'activity_codes' => :activity_code_list,
6919
+ 'activity_code_values' => :activity_code_values,
6912
6920
  'activity_id' => :string,
6913
6921
  'activity_percent_complete' => :percentage,
6914
6922
  'activity_status' => :activity_status,
data/lib/mpxj/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # MPXJ gem module
2
2
  module MPXJ
3
3
  # MPXJ gem version number
4
- VERSION = "13.6.0"
4
+ VERSION = "13.7.0"
5
5
  end
data/lib/mpxj.rb CHANGED
@@ -3,6 +3,11 @@ require "mpxj/container"
3
3
  require "mpxj/project"
4
4
  require "mpxj/property_methods"
5
5
  require "mpxj/properties"
6
+ require "mpxj/calendar"
7
+ require "mpxj/calendar_day"
8
+ require "mpxj/calendar_week"
9
+ require "mpxj/calendar_hours"
10
+ require "mpxj/calendar_exception"
6
11
  require "mpxj/resource_methods"
7
12
  require "mpxj/resource"
8
13
  require "mpxj/task_methods"
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: 13.6.0
4
+ version: 13.7.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: 2024-11-06 00:00:00.000000000 Z
11
+ date: 2024-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -118,6 +118,11 @@ files:
118
118
  - lib/mpxj/argument_error.rb
119
119
  - lib/mpxj/assignment.rb
120
120
  - lib/mpxj/assignment_methods.rb
121
+ - lib/mpxj/calendar.rb
122
+ - lib/mpxj/calendar_day.rb
123
+ - lib/mpxj/calendar_exception.rb
124
+ - lib/mpxj/calendar_hours.rb
125
+ - lib/mpxj/calendar_week.rb
121
126
  - lib/mpxj/commons-codec-1.17.0.jar
122
127
  - lib/mpxj/commons-collections4-4.4.jar
123
128
  - lib/mpxj/commons-io-2.16.1.jar