mpxj 5.1.8 → 5.1.9

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
  SHA1:
3
- metadata.gz: dda7b3e6a3b6f7f29c3d76d8fcdb06b25a7f658f
4
- data.tar.gz: 54cb2664a0a2964d205be579d2fd5d351e96ce00
3
+ metadata.gz: 341098bd06b4186e6228fcfc40c4d1a36ac2d90e
4
+ data.tar.gz: 8feda84984b5742bc2a0b6418ea16dfcccf097bf
5
5
  SHA512:
6
- metadata.gz: 8f9ff4a6a061a837cc69c20fe1f6a7ded988e2eb6cba37b32249e17b4f30ce9fd196cf166d8f719011827f5c325c44f4bcccc0845b85edf8444e34ef9ab0301a
7
- data.tar.gz: dc90f74557b46dcb4920ee4ebc6108523eb798fe2cd37d3c2d3d53a0dd04986514be7724aad17a91387028872ce6d52132935f90b5bd172c7510f611e3457b38
6
+ metadata.gz: 3f2fb3a5184d5996f87c40545b14e7d4afd37e42c8644e26c8624a8d000ea32633f0b6b7255d0ca106bac2658df1c151860b136405d9ee87cd563a98fae9ef6c
7
+ data.tar.gz: 1ce8e7b048a800b535ea4bb789f42e0ba43d000386d14f2172f25b6680eb777234a7c3955b26ec7fce3e232c2afc06a096994d663cd960078250781ca64ecdfe
@@ -1,89 +1,89 @@
1
- require 'duration'
2
- require 'time'
3
-
4
- module MPXJ
5
- # Base class from which all project entities are derived
6
- class Container
7
- attr_reader :parent_project
8
- def initialize(parent_project, attribute_types, attribute_values)
9
- @parent_project = parent_project
10
- @attribute_types = attribute_types
11
- @attribute_values = attribute_values
12
- end
13
-
14
- def method_missing(name, *args, &block)
15
- # We can probably do this more efficiently with dynamic methods... but let's get some feedback first!
16
- attribute_name = name.to_s
17
- attribute_type = @attribute_types[attribute_name]
18
- attribute_value = @attribute_values[attribute_name]
19
-
20
- if attribute_type.nil? && attribute_value.nil?
21
- super
22
- else
23
- if attribute_type.nil?
24
- attribute_type = 1
25
- end
26
- get_attribute_value(attribute_type, attribute_value)
27
- end
28
- end
29
-
30
- protected
31
-
32
- attr_reader :attribute_values
33
-
34
- private
35
-
36
- def get_attribute_value(attribute_type, attribute_value)
37
- case attribute_type.to_i
38
- when 12, 17, 19
39
- get_integer_value(attribute_value)
40
- when 8, 3, 5, 7
41
- get_float_value(attribute_value)
42
- when 2
43
- get_date_value(attribute_value)
44
- when 6, 16
45
- get_duration_value(attribute_value)
46
- when 4
47
- get_boolean_value(attribute_value)
48
- else
49
- attribute_value
50
- end
51
- end
52
-
53
- def get_duration_value(attribute_value)
54
- if attribute_value.nil?
55
- Duration.new(0)
56
- else
57
- Duration.new(attribute_value.to_i)
58
- end
59
- end
60
-
61
- def get_date_value(attribute_value)
62
- if attribute_value.nil?
63
- nil
64
- else
65
- @parent_project.zone.parse(attribute_value)
66
- end
67
- end
68
-
69
- def get_float_value(attribute_value)
70
- if attribute_value.nil?
71
- 0.0
72
- else
73
- attribute_value.to_f
74
- end
75
- end
76
-
77
- def get_integer_value(attribute_value)
78
- if attribute_value.nil?
79
- 0
80
- else
81
- attribute_value.to_i
82
- end
83
- end
84
-
85
- def get_boolean_value(attribute_value)
86
- attribute_value == true
87
- end
88
- end
89
- end
1
+ require 'duration'
2
+ require 'time'
3
+
4
+ module MPXJ
5
+ # Base class from which all project entities are derived
6
+ class Container
7
+ attr_reader :parent_project
8
+ def initialize(parent_project, attribute_types, attribute_values)
9
+ @parent_project = parent_project
10
+ @attribute_types = attribute_types
11
+ @attribute_values = attribute_values
12
+ end
13
+
14
+ def method_missing(name, *args, &block)
15
+ # We can probably do this more efficiently with dynamic methods... but let's get some feedback first!
16
+ attribute_name = name.to_s
17
+ attribute_type = @attribute_types[attribute_name]
18
+ attribute_value = @attribute_values[attribute_name]
19
+
20
+ if attribute_type.nil? && attribute_value.nil?
21
+ super
22
+ else
23
+ if attribute_type.nil?
24
+ attribute_type = 1
25
+ end
26
+ get_attribute_value(attribute_type, attribute_value)
27
+ end
28
+ end
29
+
30
+ protected
31
+
32
+ attr_reader :attribute_values
33
+
34
+ private
35
+
36
+ def get_attribute_value(attribute_type, attribute_value)
37
+ case attribute_type.to_i
38
+ when 12, 17, 19
39
+ get_integer_value(attribute_value)
40
+ when 8, 3, 5, 7
41
+ get_float_value(attribute_value)
42
+ when 2
43
+ get_date_value(attribute_value)
44
+ when 6, 16
45
+ get_duration_value(attribute_value)
46
+ when 4
47
+ get_boolean_value(attribute_value)
48
+ else
49
+ attribute_value
50
+ end
51
+ end
52
+
53
+ def get_duration_value(attribute_value)
54
+ if attribute_value.nil?
55
+ Duration.new(0)
56
+ else
57
+ Duration.new(attribute_value.to_i)
58
+ end
59
+ end
60
+
61
+ def get_date_value(attribute_value)
62
+ if attribute_value.nil?
63
+ nil
64
+ else
65
+ @parent_project.zone.parse(attribute_value)
66
+ end
67
+ end
68
+
69
+ def get_float_value(attribute_value)
70
+ if attribute_value.nil?
71
+ 0.0
72
+ else
73
+ attribute_value.to_f
74
+ end
75
+ end
76
+
77
+ def get_integer_value(attribute_value)
78
+ if attribute_value.nil?
79
+ 0
80
+ else
81
+ attribute_value.to_i
82
+ end
83
+ end
84
+
85
+ def get_boolean_value(attribute_value)
86
+ attribute_value == true
87
+ end
88
+ end
89
+ end
Binary file
@@ -9,7 +9,7 @@ module MPXJ
9
9
  attr_reader :child_tasks
10
10
  attr_reader :all_assignments
11
11
  attr_reader :zone
12
-
12
+
13
13
  def initialize(file_name, zone)
14
14
  @resources_by_unique_id = {}
15
15
  @tasks_by_unique_id = {}
@@ -24,8 +24,12 @@ module MPXJ
24
24
 
25
25
  @zone = zone
26
26
 
27
+ @field_by_alias = {}
28
+ @alias_by_field = {}
29
+
27
30
  file = File.read(file_name)
28
31
  json_data = JSON.parse(file)
32
+ process_custom_fields(json_data)
29
33
  process_properties(json_data)
30
34
  process_resources(json_data)
31
35
  process_tasks(json_data)
@@ -68,8 +72,63 @@ module MPXJ
68
72
  @tasks_by_unique_id[id]
69
73
  end
70
74
 
75
+ # For a particular entity type (task, resource, and so on), retrieve
76
+ # the field which has the supplied alias. For example this allows the caller to
77
+ # answer the question "which task field is using the alias `Activity ID`"
78
+ #
79
+ # @param field_type_class[String] field type (possible values: task, resource, assignment, constraint, project)
80
+ # @param field_alias[String] the alias we want to look up
81
+ # @return [String] if the alias has been found return the name of the underlying field
82
+ # @return [nil] if the alias is not in use
83
+ def get_field_by_alias(field_type_class, field_alias)
84
+ hash = @field_by_alias[field_type_class]
85
+ if hash
86
+ hash[field_alias]
87
+ end
88
+ end
89
+
90
+ # For a particular entity type (task, resource, and so on), retrieve
91
+ # the alias used by the supplied field. For example this allows the caller to
92
+ # answer the question "does the task field Text1 have an alias?"
93
+ #
94
+ # @param field_type_class[String] field type (possible values: task, resource, assignment, constraint, project)
95
+ # @param field_type[String] the field type we want to look up
96
+ # @return [String] if the field has an alias, return the alias
97
+ # @return [nil] if the field does not have an alias
98
+ def get_alias_by_field(field_type_class, field_type)
99
+ hash = @alias_by_field[field_type_class]
100
+ if hash
101
+ hash[field_type]
102
+ end
103
+ end
104
+
71
105
  private
72
106
 
107
+ def process_custom_fields(json_data)
108
+ custom_fields = json_data["custom_fields"]
109
+ custom_fields.each do |field|
110
+ process_custom_field(field)
111
+ end
112
+ end
113
+
114
+ def process_custom_field(field)
115
+ field_type_class = field["field_type_class"]
116
+ field_type = field["field_type"]
117
+ field_alias = field["field_alias"]
118
+
119
+ process_custom_field_hash(@field_by_alias, field_type_class, field_alias, field_type)
120
+ process_custom_field_hash(@alias_by_field, field_type_class, field_type, field_alias)
121
+ end
122
+
123
+ def process_custom_field_hash(hash, key1, key2, value)
124
+ key1_hash = hash[key1]
125
+ unless key1_hash
126
+ key1_hash = {}
127
+ hash[key1] = key1_hash
128
+ end
129
+ key1_hash[key2] = value
130
+ end
131
+
73
132
  def process_properties(json_data)
74
133
  attribute_types = json_data["property_types"]
75
134
  attribute_values = json_data["property_values"]
@@ -1,48 +1,48 @@
1
- require 'tempfile'
2
- require 'active_support/core_ext/time/calculations'
3
-
4
- module MPXJ
5
- # Used to read a project plan from a file
6
- class Reader
7
- # Reads a project plan from a file, and returns a Project instance
8
- # which provides access to the structure and attributes of the project data.
9
- # Note that an optional timezone can be supplied to ensue that all date-time
10
- # values returned are in the specified timezone.
11
- #
12
- # @param file_name [String] the name of the file to read
13
- # @param zone [ActiveSupport::TimeZone] an optional timezone
14
- # @return [Project] new Project instance
15
- def self.read(file_name, zone = nil)
16
- project = nil
17
- json_file = Tempfile.new([File.basename(file_name, ".*"), '.json'])
18
- tz = zone || Time.zone || ActiveSupport::TimeZone["UTC"]
19
-
20
- begin
21
- classpath = Dir["#{File.dirname(__FILE__)}/*.jar"].join(path_separator)
22
- java_output = `java -cp \"#{classpath}\" net.sf.mpxj.sample.MpxjConvert \"#{file_name}\" \"#{json_file.path}\"`
23
- if $?.exitstatus != 0
24
- raise "Failed to read file: #{java_output}"
25
- end
26
- project = Project.new(json_file, tz)
27
- ensure
28
- json_file.close
29
- json_file.unlink
30
- end
31
- project
32
- end
33
-
34
- # @private
35
- def self.path_separator
36
- if windows?
37
- ";"
38
- else
39
- ":"
40
- end
41
- end
42
-
43
- # @private
44
- def self.windows?
45
- (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
46
- end
47
- end
48
- end
1
+ require 'tempfile'
2
+ require 'active_support/core_ext/time/calculations'
3
+
4
+ module MPXJ
5
+ # Used to read a project plan from a file
6
+ class Reader
7
+ # Reads a project plan from a file, and returns a Project instance
8
+ # which provides access to the structure and attributes of the project data.
9
+ # Note that an optional timezone can be supplied to ensue that all date-time
10
+ # values returned are in the specified timezone.
11
+ #
12
+ # @param file_name [String] the name of the file to read
13
+ # @param zone [ActiveSupport::TimeZone] an optional timezone
14
+ # @return [Project] new Project instance
15
+ def self.read(file_name, zone = nil)
16
+ project = nil
17
+ json_file = Tempfile.new([File.basename(file_name, ".*"), '.json'])
18
+ tz = zone || Time.zone || ActiveSupport::TimeZone["UTC"]
19
+
20
+ begin
21
+ classpath = Dir["#{File.dirname(__FILE__)}/*.jar"].join(path_separator)
22
+ java_output = `java -cp \"#{classpath}\" net.sf.mpxj.sample.MpxjConvert \"#{file_name}\" \"#{json_file.path}\"`
23
+ if $?.exitstatus != 0
24
+ raise "Failed to read file: #{java_output}"
25
+ end
26
+ project = Project.new(json_file, tz)
27
+ ensure
28
+ json_file.close
29
+ json_file.unlink
30
+ end
31
+ project
32
+ end
33
+
34
+ # @private
35
+ def self.path_separator
36
+ if windows?
37
+ ";"
38
+ else
39
+ ":"
40
+ end
41
+ end
42
+
43
+ # @private
44
+ def self.windows?
45
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
46
+ end
47
+ end
48
+ end
@@ -1,5 +1,5 @@
1
1
  # MPXJ gem module
2
2
  module MPXJ
3
3
  # MPXJ gem version number
4
- VERSION = "5.1.8"
4
+ VERSION = "5.1.9"
5
5
  end
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: 5.1.8
4
+ version: 5.1.9
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-07-13 00:00:00.000000000 Z
11
+ date: 2015-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -126,6 +126,7 @@ files:
126
126
  - lib/mpxj/relation.rb
127
127
  - lib/mpxj/resource.rb
128
128
  - lib/mpxj/rtfparserkit-1.2.0.jar
129
+ - lib/mpxj/rtfparserkit-1.4.0.jar
129
130
  - lib/mpxj/task.rb
130
131
  - lib/mpxj/version.rb
131
132
  homepage: http://mpxj.sf.net