open_ehr 0.9.4 → 0.9.5
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.
- data/History.txt +3 -0
- data/README.rdoc +3 -3
- data/VERSION +1 -1
- data/lib/open_ehr/am/archetype/constraint_model/primitive.rb +61 -34
- data/lib/open_ehr/am/openehr_profile/data_types/basic.rb +27 -0
- data/lib/open_ehr/am/openehr_profile/data_types/quantity.rb +18 -0
- data/lib/open_ehr/am/openehr_profile/data_types/text.rb +22 -0
- data/lib/open_ehr/am/openehr_profile/data_types.rb +12 -0
- data/lib/open_ehr/am/openehr_profile.rb +10 -0
- data/lib/open_ehr/am.rb +2 -0
- data/lib/open_ehr/assumed_library_types.rb +30 -25
- data/lib/open_ehr/parser/cadl_grammar.tt +479 -163
- data/lib/open_ehr/parser/shared_token_grammar.tt +63 -43
- data/lib/open_ehr/rm/data_types/quantity/date_time.rb +27 -14
- data/lib/open_ehr.rb +1 -1
- data/open_ehr.gemspec +17 -6
- data/spec/lib/open_ehr/am/archetype/assertion/operator_kind_spec.rb +4 -0
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_date_spec.rb +20 -48
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_date_time_spec.rb +33 -8
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_duration_spec.rb +19 -52
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_string_spec.rb +2 -3
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_time_spec.rb +27 -7
- data/spec/lib/open_ehr/am/archetype/ontology/archetype_ontology_spec.rb +0 -1
- data/spec/lib/open_ehr/am/openehr_profile/data_types/text/c_code_phrase_spec.rb +35 -0
- data/spec/lib/open_ehr/parser/adl14/adl-test-SOME_TYPE.generic_type_basic.draft.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_slot.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_slot.test2.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.basic_types.test.adl +3 -3
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_code_phrase.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.datetime.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.durations.test.adl +2 -4
- data/spec/lib/open_ehr/parser/adl_archetype_internal_ref_with_generics_spec.rb +6 -6
- data/spec/lib/open_ehr/parser/adl_archetype_slot_cluster_spec.rb +101 -0
- data/spec/lib/open_ehr/parser/adl_archetype_slot_spec.rb +193 -0
- data/spec/lib/open_ehr/parser/adl_archetype_uncommon_term_keys_spec.rb +25 -0
- data/spec/lib/open_ehr/parser/adl_parser_spec.rb +6 -6
- data/spec/lib/open_ehr/parser/basic_generic_type_spec.rb +18 -0
- data/spec/lib/open_ehr/parser/basic_type_spec.rb +2922 -0
- data/spec/lib/open_ehr/parser/code_phrase_spec.rb +91 -0
- data/spec/lib/open_ehr/parser/date_time_spec.rb +1953 -0
- data/spec/lib/open_ehr/parser/duration_spec.rb +475 -0
- data/spec/lib/open_ehr/rm/data_types/quantity/date_time/dv_duration_spec.rb +44 -0
- data/spec/lib/open_ehr/rm/data_types/quantity/date_time/dv_time_spec.rb +6 -2
- data/spec/spec_helper.rb +3 -2
- metadata +52 -41
- data/lib/open_ehr/am/archetype/archetype_description/archetype_description.rb +0 -21
- data/lib/open_ehr/am/open_ehr_profile/data_types/basic.rb +0 -29
- data/lib/open_ehr/am/open_ehr_profile/data_types/quantity.rb +0 -19
- data/lib/open_ehr/am/open_ehr_profile/data_types/text.rb +0 -15
data/History.txt
CHANGED
data/README.rdoc
CHANGED
|
@@ -5,12 +5,12 @@ Ruby openEHR implementation project.
|
|
|
5
5
|
|
|
6
6
|
= Version
|
|
7
7
|
|
|
8
|
-
Release-0.9.
|
|
8
|
+
Release-0.9.5
|
|
9
9
|
|
|
10
10
|
= Requirements
|
|
11
11
|
|
|
12
|
-
* Ruby 1.9.
|
|
13
|
-
* Tested with Ruby 1.9.
|
|
12
|
+
* Ruby 1.9.x reccomended
|
|
13
|
+
* Tested with Ruby 1.9.3 on Linux and FreeBSD.
|
|
14
14
|
* It would work with some adjustment on Ruby 1.8 or earlier,
|
|
15
15
|
but not confirmed.
|
|
16
16
|
* It should work on other platforms with Ruby
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.5
|
|
@@ -34,6 +34,7 @@ module OpenEHR
|
|
|
34
34
|
binary_consistency(args[:true_valid], args[:false_valid])
|
|
35
35
|
@true_valid = args[:true_valid]
|
|
36
36
|
@false_valid = args[:false_valid]
|
|
37
|
+
args[:type] = 'Boolean'
|
|
37
38
|
super(args)
|
|
38
39
|
end
|
|
39
40
|
|
|
@@ -78,6 +79,7 @@ module OpenEHR
|
|
|
78
79
|
attr_reader :pattern, :list
|
|
79
80
|
|
|
80
81
|
def initialize(args = { })
|
|
82
|
+
args[:type] = 'String'
|
|
81
83
|
super
|
|
82
84
|
consistency(args[:pattern], args[:list])
|
|
83
85
|
@pattern = args[:pattern]
|
|
@@ -106,6 +108,7 @@ module OpenEHR
|
|
|
106
108
|
attr_reader :list, :range
|
|
107
109
|
|
|
108
110
|
def initialize(args = { })
|
|
111
|
+
args[:type] ||= 'Integer'
|
|
109
112
|
super
|
|
110
113
|
consistency(args[:list], args[:range])
|
|
111
114
|
@list = args[:list]
|
|
@@ -132,13 +135,14 @@ module OpenEHR
|
|
|
132
135
|
|
|
133
136
|
class CReal < CInteger
|
|
134
137
|
def initialize(args = { })
|
|
138
|
+
args[:type] = 'Real'
|
|
135
139
|
super
|
|
136
140
|
end
|
|
137
141
|
end
|
|
138
142
|
|
|
139
143
|
module CDateModule
|
|
140
|
-
attr_accessor :range, :
|
|
141
|
-
attr_reader :month_validity, :day_validity
|
|
144
|
+
attr_accessor :timezone_validity, :day_validity, :range, :list
|
|
145
|
+
attr_reader :month_validity, :day_validity, :range, :pattern
|
|
142
146
|
|
|
143
147
|
def month_validity=(month_validity)
|
|
144
148
|
if (month_validity == ValidityKind::OPTIONAL &&
|
|
@@ -151,14 +155,23 @@ module OpenEHR
|
|
|
151
155
|
@month_validity = month_validity
|
|
152
156
|
end
|
|
153
157
|
|
|
154
|
-
def
|
|
155
|
-
@
|
|
158
|
+
def pattern=(pattern)
|
|
159
|
+
@pattern = pattern if valid_pattern?(pattern)
|
|
156
160
|
end
|
|
157
161
|
|
|
158
162
|
def validity_is_range?
|
|
159
163
|
return !@range.nil?
|
|
160
164
|
end
|
|
161
165
|
|
|
166
|
+
protected
|
|
167
|
+
def valid_pattern?(pattern)
|
|
168
|
+
if /^([Yy?X]{4})(-([Mm?X]{2})(-([Dd?X]{2}))?)?$/ =~ pattern
|
|
169
|
+
true
|
|
170
|
+
else
|
|
171
|
+
false
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
162
175
|
private
|
|
163
176
|
def consistency_validity(month_validity, day_validity)
|
|
164
177
|
end
|
|
@@ -168,8 +181,13 @@ module OpenEHR
|
|
|
168
181
|
include CDateModule
|
|
169
182
|
|
|
170
183
|
def initialize(args = { })
|
|
171
|
-
|
|
172
|
-
|
|
184
|
+
args[:type] = 'ISO8601_DATE'
|
|
185
|
+
super
|
|
186
|
+
@range = args[:range]
|
|
187
|
+
if args[:pattern]
|
|
188
|
+
self.pattern = args[:pattern]
|
|
189
|
+
end
|
|
190
|
+
self.list = args[:list]
|
|
173
191
|
self.timezone_validity = args[:timezone_validity]
|
|
174
192
|
self.day_validity = args[:day_validity]
|
|
175
193
|
self.month_validity = args[:month_validity]
|
|
@@ -177,9 +195,12 @@ module OpenEHR
|
|
|
177
195
|
end
|
|
178
196
|
|
|
179
197
|
module CTimeModule
|
|
180
|
-
attr_accessor :range
|
|
198
|
+
attr_accessor :range, :list
|
|
181
199
|
attr_reader :minute_validity, :second_validity,
|
|
182
|
-
:millisecond_validity
|
|
200
|
+
:millisecond_validity, :pattern
|
|
201
|
+
def pattern=(pattern)
|
|
202
|
+
@pattern = pattern if valid_pattern? pattern
|
|
203
|
+
end
|
|
183
204
|
|
|
184
205
|
def minute_validity=(minute_validity)
|
|
185
206
|
if (minute_validity == ValidityKind::OPTIONAL &&
|
|
@@ -205,17 +226,29 @@ module OpenEHR
|
|
|
205
226
|
@millisecond_validity = millisecond_validity
|
|
206
227
|
end
|
|
207
228
|
|
|
229
|
+
protected
|
|
208
230
|
def validity_is_range?
|
|
209
231
|
return !@range.nil?
|
|
210
232
|
end
|
|
233
|
+
|
|
234
|
+
def valid_pattern?(pattern)
|
|
235
|
+
if /^([Hh?X]{2})(:([Mm?X]{2})(:([Ss?X]{2}))?)?$/ =~ pattern
|
|
236
|
+
true
|
|
237
|
+
else
|
|
238
|
+
false
|
|
239
|
+
end
|
|
240
|
+
end
|
|
211
241
|
end
|
|
212
242
|
|
|
213
243
|
class CTime < CPrimitive
|
|
214
244
|
include CTimeModule
|
|
215
245
|
|
|
216
246
|
def initialize(args = { })
|
|
247
|
+
args[:type] = 'ISO8601_TIME'
|
|
217
248
|
super
|
|
249
|
+
self.pattern = args[:pattern]
|
|
218
250
|
self.range = args[:range]
|
|
251
|
+
self.list = args[:list]
|
|
219
252
|
self.millisecond_validity = args[:millisecond_validity]
|
|
220
253
|
self.second_validity = args[:second_validity]
|
|
221
254
|
self.minute_validity = args[:minute_validity]
|
|
@@ -227,7 +260,11 @@ module OpenEHR
|
|
|
227
260
|
attr_reader :hour_validity
|
|
228
261
|
|
|
229
262
|
def initialize(args = { })
|
|
263
|
+
args[:type] = 'ISO8601_DATE_TIME'
|
|
230
264
|
super
|
|
265
|
+
self.pattern = args[:pattern]
|
|
266
|
+
self.list = args[:list]
|
|
267
|
+
self.range = args[:range]
|
|
231
268
|
self.timezone_validity = args[:timezone_validity]
|
|
232
269
|
self.millisecond_validity = args[:millisecond_validity]
|
|
233
270
|
self.second_validity = args[:second_validity]
|
|
@@ -258,40 +295,30 @@ module OpenEHR
|
|
|
258
295
|
end
|
|
259
296
|
@day_validity = day_validity
|
|
260
297
|
end
|
|
298
|
+
|
|
299
|
+
protected
|
|
300
|
+
def valid_pattern?(pattern)
|
|
301
|
+
if /^([Yy?X]{4})(-([Mm?X]{2})(-([Dd?X]{2}))?)?[T ]?([Hh?X]{2})(:([Mm?X]{2})(:([Ss?X]{2}))?)?$/ =~ pattern
|
|
302
|
+
true
|
|
303
|
+
else
|
|
304
|
+
false
|
|
305
|
+
end
|
|
306
|
+
end
|
|
261
307
|
end
|
|
262
308
|
|
|
263
309
|
class CDuration < CPrimitive
|
|
264
|
-
|
|
265
|
-
attr_accessor :
|
|
266
|
-
|
|
267
|
-
|
|
310
|
+
attr_accessor :years_allowed, :months_allowed, :weeks_allowed
|
|
311
|
+
attr_accessor :days_allowed, :hours_allowed, :minutes_allowed
|
|
312
|
+
attr_accessor :seconds_allowed, :fractional_seconds_allowed
|
|
313
|
+
attr_accessor :pattern, :list, :range
|
|
268
314
|
|
|
269
315
|
def initialize(args = { })
|
|
316
|
+
args[:type] = 'ISO8601_DURATION'
|
|
270
317
|
super
|
|
271
|
-
self.
|
|
272
|
-
self.
|
|
273
|
-
self.minutes_allowed = args[:minutes_allowed]
|
|
274
|
-
self.hours_allowed = args[:hours_allowed]
|
|
275
|
-
self.days_allowed = args[:days_allowed]
|
|
276
|
-
self.months_allowed = args[:months_allowed]
|
|
277
|
-
self.weeks_allowed = args[:weeks_allowed]
|
|
278
|
-
self.years_allowed = args[:years_allowed]
|
|
318
|
+
self.pattern = args[:pattern]
|
|
319
|
+
self.list = args[:list]
|
|
279
320
|
self.range = args[:range]
|
|
280
321
|
end
|
|
281
|
-
|
|
282
|
-
def range=(range)
|
|
283
|
-
if range.nil? && !(@years_allowed ||
|
|
284
|
-
@months_allowed ||
|
|
285
|
-
@weeks_allowed ||
|
|
286
|
-
@days_allowed ||
|
|
287
|
-
@hours_allowed ||
|
|
288
|
-
@minutes_allowed ||
|
|
289
|
-
@seconds_allowed ||
|
|
290
|
-
@fractional_seconds_allowed)
|
|
291
|
-
raise ArgumentError, 'invalid range'
|
|
292
|
-
end
|
|
293
|
-
@range = range
|
|
294
|
-
end
|
|
295
322
|
end
|
|
296
323
|
end # of Primitive
|
|
297
324
|
end # of CostraintModel
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module OpenEHR
|
|
2
|
+
module AM
|
|
3
|
+
module OpenEHRProfile
|
|
4
|
+
module DataTypes
|
|
5
|
+
module Basic
|
|
6
|
+
class CDvState
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class StateMachine
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class State
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class TerminalState < State
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class NonTerminalState < State
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class Transition
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end # of DataTypes
|
|
25
|
+
end # of OpenEHR Profile
|
|
26
|
+
end # of AM
|
|
27
|
+
end # of OpenEHR
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module OpenEHR
|
|
2
|
+
module AM
|
|
3
|
+
module OpenEHRProfile
|
|
4
|
+
module DataTypes
|
|
5
|
+
module Quantity
|
|
6
|
+
class CDvQuantity < OpenEHR::AM::Archetype::ConstraintModel::CDomainType
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class CDvOrdinal < OpenEHR::AM::Archetype::ConstraintModel::CDomainType
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class CQuantityItem
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end # of DataTypes
|
|
16
|
+
end # of OpenEHRProfile
|
|
17
|
+
end # of AM
|
|
18
|
+
end # of OpenEHR
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
include OpenEHR::AM::Archetype::ConstraintModel
|
|
2
|
+
|
|
3
|
+
module OpenEHR
|
|
4
|
+
module AM
|
|
5
|
+
module OpenEHRProfile
|
|
6
|
+
module DataTypes
|
|
7
|
+
module Text
|
|
8
|
+
class CCodePhrase < CDomainType
|
|
9
|
+
attr_accessor :terminology_id, :code_list
|
|
10
|
+
|
|
11
|
+
def initialize(args = { })
|
|
12
|
+
super
|
|
13
|
+
self.terminology_id = args[:terminology_id]
|
|
14
|
+
self.code_list = args[:code_list]
|
|
15
|
+
self.assumed_value = args[:assumed_value]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end # of Text
|
|
19
|
+
end # of Data_Types
|
|
20
|
+
end # of OpenEHR Profile
|
|
21
|
+
end # of AM
|
|
22
|
+
end # of OpenEHR
|
data/lib/open_ehr/am.rb
CHANGED
|
@@ -80,7 +80,7 @@ module OpenEHR
|
|
|
80
80
|
end
|
|
81
81
|
end # end of Interval
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
module TimeDefinitions #< Any
|
|
84
84
|
DAYS_IN_LEAP_YEAR = 366
|
|
85
85
|
DAYS_IN_WEEK = 7
|
|
86
86
|
DAYS_IN_YEAR = 365
|
|
@@ -131,26 +131,33 @@ module OpenEHR
|
|
|
131
131
|
def self.valid_month?(mo)
|
|
132
132
|
mo >= 1 and mo <= MONTH_IN_YEAR
|
|
133
133
|
end
|
|
134
|
+
|
|
135
|
+
protected
|
|
136
|
+
def nilthenzero(value)
|
|
137
|
+
return value ? value : 0
|
|
138
|
+
end
|
|
139
|
+
|
|
134
140
|
end # end of TimeDefinitions
|
|
135
141
|
|
|
136
142
|
module ISO8601DateModule
|
|
143
|
+
include TimeDefinitions
|
|
137
144
|
attr_reader :year, :month, :day
|
|
138
145
|
|
|
139
146
|
def year=(year)
|
|
140
|
-
unless
|
|
147
|
+
unless TimeDefinitions.valid_year?(year)
|
|
141
148
|
raise ArgumentError, "Year is not valid"
|
|
142
149
|
end
|
|
143
150
|
@year = year
|
|
144
151
|
end
|
|
145
152
|
|
|
146
153
|
def month=(month)
|
|
147
|
-
raise ArgumentError, "Month is not valid" unless month.nil? or
|
|
154
|
+
raise ArgumentError, "Month is not valid" unless month.nil? or TimeDefinitions.valid_month?(month)
|
|
148
155
|
@month = month
|
|
149
156
|
end
|
|
150
157
|
|
|
151
158
|
def day=(day)
|
|
152
159
|
|
|
153
|
-
raise ArgumentError, "Day is not valid" unless day.nil? or
|
|
160
|
+
raise ArgumentError, "Day is not valid" unless day.nil? or TimeDefinitions.valid_day?(@year, @month, day)
|
|
154
161
|
@day = day
|
|
155
162
|
end
|
|
156
163
|
|
|
@@ -197,11 +204,7 @@ module OpenEHR
|
|
|
197
204
|
end
|
|
198
205
|
end
|
|
199
206
|
|
|
200
|
-
|
|
201
|
-
return value ? value : 0
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
class ISO8601Date < TimeDefinitions
|
|
207
|
+
class ISO8601Date
|
|
205
208
|
include ISO8601DateModule, Comparable
|
|
206
209
|
def initialize(string)
|
|
207
210
|
/(\d{4})(?:-(\d{2})(?:-(\d{2})?)?)?/ =~ string
|
|
@@ -237,10 +240,11 @@ module OpenEHR
|
|
|
237
240
|
end # end of ISO8601_DATE
|
|
238
241
|
|
|
239
242
|
module ISO8601TimeModule
|
|
243
|
+
include TimeDefinitions
|
|
240
244
|
attr_reader :hour, :minute, :second, :fractional_second, :timezone
|
|
241
245
|
|
|
242
246
|
def hour=(hour)
|
|
243
|
-
unless
|
|
247
|
+
unless TimeDefinitions.valid_hour?(hour, @minute, @second)
|
|
244
248
|
raise ArgumentError, "hour is not valid"
|
|
245
249
|
end
|
|
246
250
|
@hour = hour
|
|
@@ -251,7 +255,7 @@ module OpenEHR
|
|
|
251
255
|
end
|
|
252
256
|
|
|
253
257
|
def minute=(minute)
|
|
254
|
-
raise ArgumentError, "minute is not valid" if !minute.nil? and !
|
|
258
|
+
raise ArgumentError, "minute is not valid" if !minute.nil? and !TimeDefinitions.valid_minute?(minute)
|
|
255
259
|
@minute = minute
|
|
256
260
|
end
|
|
257
261
|
|
|
@@ -261,7 +265,7 @@ module OpenEHR
|
|
|
261
265
|
|
|
262
266
|
def second=(second)
|
|
263
267
|
raise ArgumentError, "minute not defined" if @minute.nil? and !second.nil?
|
|
264
|
-
raise ArgumentError, "second is not valid" if !second.nil? and !
|
|
268
|
+
raise ArgumentError, "second is not valid" if !second.nil? and !TimeDefinitions.valid_second?(second)
|
|
265
269
|
@second = second
|
|
266
270
|
end
|
|
267
271
|
|
|
@@ -280,8 +284,8 @@ module OpenEHR
|
|
|
280
284
|
end
|
|
281
285
|
|
|
282
286
|
def timezone=(timezone)
|
|
283
|
-
unless timezone.nil?
|
|
284
|
-
if /[+-](\d{2}):?(\d{2})/ =~ timezone
|
|
287
|
+
unless timezone.nil?
|
|
288
|
+
if /([+-](\d{2}):?(\d{2})|Z)/ =~ timezone
|
|
285
289
|
@timezone = timezone
|
|
286
290
|
else
|
|
287
291
|
raise ArgumentError, "timezone invalid"
|
|
@@ -328,10 +332,10 @@ module OpenEHR
|
|
|
328
332
|
end
|
|
329
333
|
end
|
|
330
334
|
|
|
331
|
-
class ISO8601Time
|
|
335
|
+
class ISO8601Time
|
|
332
336
|
include ISO8601TimeModule, Comparable
|
|
333
337
|
def initialize(string)
|
|
334
|
-
|
|
338
|
+
/^(\d{2}):?(\d{2})?(:?)(\d{2})?((\.|,)(\d+))?(Z|([+-](\d{2}):?(\d{2})))?$/ =~ string
|
|
335
339
|
if $2.nil?
|
|
336
340
|
self.minute = nil
|
|
337
341
|
else
|
|
@@ -376,12 +380,12 @@ module OpenEHR
|
|
|
376
380
|
return false
|
|
377
381
|
end
|
|
378
382
|
if !mm.nil?
|
|
379
|
-
if !
|
|
383
|
+
if !TimeDefinitions.valid_minute?(mm.to_i)
|
|
380
384
|
return false
|
|
381
385
|
end
|
|
382
386
|
end
|
|
383
387
|
if !ss.nil?
|
|
384
|
-
if !
|
|
388
|
+
if !TimeDefinitions.valid_second?(ss.to_i)
|
|
385
389
|
return false
|
|
386
390
|
end
|
|
387
391
|
end
|
|
@@ -435,7 +439,7 @@ module OpenEHR
|
|
|
435
439
|
class ISO8601DateTime < ISO8601Date
|
|
436
440
|
include ISO8601DateTimeModule
|
|
437
441
|
def initialize(string)
|
|
438
|
-
unless /(\d{4})(?:-(\d{2})(?:-(\d{2})
|
|
442
|
+
unless /(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?T(\d{2})(?::(\d{2})(?::(\d{2})(?:(\.|,)(\d+))?)?(Z|([+-]\d{2}):?(\d{2}))?)?/ =~ string
|
|
439
443
|
raise ArgumentError, 'format invalid'
|
|
440
444
|
else
|
|
441
445
|
self.year = $1.to_i
|
|
@@ -465,15 +469,15 @@ module OpenEHR
|
|
|
465
469
|
else
|
|
466
470
|
self.hour = $4.to_i
|
|
467
471
|
end
|
|
468
|
-
if $
|
|
472
|
+
if $8.nil? or $8.empty?
|
|
469
473
|
self.fractional_second = nil
|
|
470
474
|
else
|
|
471
|
-
self.fractional_second = ("0."+$
|
|
475
|
+
self.fractional_second = ("0."+$8).to_f
|
|
472
476
|
end
|
|
473
|
-
if $
|
|
477
|
+
if $9.nil?
|
|
474
478
|
self.timezone = nil
|
|
475
479
|
else
|
|
476
|
-
self.timezone = $9
|
|
480
|
+
self.timezone = $9
|
|
477
481
|
end
|
|
478
482
|
end
|
|
479
483
|
|
|
@@ -517,6 +521,7 @@ module OpenEHR
|
|
|
517
521
|
end # end of ISO8601Timezone
|
|
518
522
|
|
|
519
523
|
module ISO8601DurationModule
|
|
524
|
+
include TimeDefinitions
|
|
520
525
|
attr_reader :years, :months, :weeks, :days
|
|
521
526
|
attr_reader :hours, :minutes, :seconds, :fractional_second
|
|
522
527
|
|
|
@@ -607,10 +612,10 @@ module OpenEHR
|
|
|
607
612
|
end
|
|
608
613
|
end
|
|
609
614
|
|
|
610
|
-
class ISO8601Duration
|
|
615
|
+
class ISO8601Duration
|
|
611
616
|
include ISO8601DurationModule
|
|
612
617
|
def initialize(str)
|
|
613
|
-
/^P((\d+)
|
|
618
|
+
/^P((\d+)[Yy])?((\d+)[Mm])?((\d+)[Ww])?((\d)[dD])?(T((\d+)[Hh])?((\d+)[Mm])?((\d+)(\.\d+)?[Ss])?)?$/ =~ str
|
|
614
619
|
self.years = $2.to_i
|
|
615
620
|
self.months = $4.to_i
|
|
616
621
|
self.weeks = $6.to_i
|