open_ehr 0.9.3 → 0.9.4
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 +6 -0
- data/README.rdoc +6 -8
- data/VERSION +1 -1
- data/lib/open_ehr/am/archetype/constraint_model/primitive.rb +2 -2
- data/lib/open_ehr/am/archetype/ontology.rb +23 -28
- data/lib/open_ehr/am/archetype.rb +1 -1
- data/lib/open_ehr/parser/adl.rb +42 -4
- data/lib/open_ehr/parser/adl_grammar.tt +67 -42
- data/lib/open_ehr/parser/adl_parser.rb +1 -1
- data/lib/open_ehr/parser/cadl_grammar.tt +227 -61
- data/lib/open_ehr/parser/cadl_node.rb +1 -0
- data/lib/open_ehr/parser/dadl_grammar.tt +10 -10
- data/lib/open_ehr/parser/shared_token_grammar.tt +13 -13
- data/open_ehr.gemspec +14 -4
- data/spec/lib/open_ehr/am/archetype/archetype_spec.rb +1 -1
- data/spec/lib/open_ehr/am/archetype/ontology/archetype_ontology_spec.rb +22 -13
- data/spec/lib/open_ehr/parser/adl14/adl-test-SOME_TYPE.generic_type_use_node.draft.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_bindings.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_internal_ref.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_internal_ref2.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_language.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_language_no_accreditation.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_language_order_of_translation_details.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_ontology.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.translations_author_language.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl14/adl-test-entry.translations_language_author.test.adl +1 -1
- data/spec/lib/open_ehr/parser/adl_archetype_internal_ref2_spec.rb +42 -0
- data/spec/lib/open_ehr/parser/adl_archetype_internal_ref_spec.rb +125 -0
- data/spec/lib/open_ehr/parser/adl_archetype_internal_ref_with_generics_spec.rb +258 -0
- data/spec/lib/open_ehr/parser/adl_archetype_ontology_binding_spec.rb +98 -0
- data/spec/lib/open_ehr/parser/adl_archetype_ontology_spec.rb +42 -0
- data/spec/lib/open_ehr/parser/adl_description_spec.rb +13 -2
- data/spec/lib/open_ehr/parser/adl_language_no_accreditation_spec.rb +66 -0
- data/spec/lib/open_ehr/parser/adl_language_order_spec.rb +68 -0
- data/spec/lib/open_ehr/parser/adl_language_spec.rb +119 -0
- data/spec/lib/open_ehr/parser/adl_language_translation_author_language_spec.rb +50 -0
- data/spec/lib/open_ehr/parser/adl_language_translation_language_author_spec.rb +46 -0
- data/spec/lib/open_ehr/parser/adl_parser_spec.rb +2 -2
- data/spec/lib/open_ehr/parser/parser_spec_helper.rb +7 -0
- data/spec/lib/open_ehr/rm/common/resource/translation_details_spec.rb +4 -4
- metadata +49 -39
- data/Gemfile.lock +0 -85
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -5,22 +5,20 @@ Ruby openEHR implementation project.
|
|
5
5
|
|
6
6
|
= Version
|
7
7
|
|
8
|
-
Release-0.9.
|
8
|
+
Release-0.9.4
|
9
9
|
|
10
10
|
= Requirements
|
11
11
|
|
12
12
|
* Ruby 1.9.2 reccomended
|
13
|
-
* RubyGems
|
14
13
|
* Tested with Ruby 1.9.2 on Linux and FreeBSD.
|
15
|
-
*
|
16
|
-
|
17
|
-
adjustment. We do not support Ruby 1.6 anymore.
|
14
|
+
* It would work with some adjustment on Ruby 1.8 or earlier,
|
15
|
+
but not confirmed.
|
18
16
|
* It should work on other platforms with Ruby
|
19
17
|
support as well.
|
20
18
|
|
21
19
|
== DESCRIPTION:
|
22
20
|
|
23
|
-
This is the beta version 0.9.
|
21
|
+
This is the beta version 0.9.4 release of Ruby openEHR implementation
|
24
22
|
project. This release is still experimental preview of our work based
|
25
23
|
on openEHR specification release 1.0.2. We implemented almost of the
|
26
24
|
specifications of the openEHR. The work is still in progress. The
|
@@ -31,7 +29,7 @@ Parser is nearly performing completely. We now consider to descrive
|
|
31
29
|
archetype as another formalism such as YAML, instead of ADL.
|
32
30
|
|
33
31
|
Almost all classes passed the test constructed by RSpec2 (formaly used
|
34
|
-
test/unit). These
|
32
|
+
test/unit). These spec files are under /spec.
|
35
33
|
|
36
34
|
Some specifications are not well determined yet, such as rm/security
|
37
35
|
and so on. We postponed to implement such classes.
|
@@ -41,7 +39,7 @@ project.
|
|
41
39
|
|
42
40
|
= Authors
|
43
41
|
* Main codes
|
44
|
-
|
42
|
+
Shinji Kobayashi, Akimichi Tatsukawa
|
45
43
|
openEHR.jp, <http://openehr.jp>
|
46
44
|
|
47
45
|
* ADL parser test cases are derived from Java and Eiffel
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.4
|
@@ -39,7 +39,7 @@ module OpenEHR
|
|
39
39
|
|
40
40
|
def default_value=(default_value)
|
41
41
|
super
|
42
|
-
default_value_consistency(default_value)
|
42
|
+
default_value_consistency(default_value) unless default_value.nil?
|
43
43
|
end
|
44
44
|
|
45
45
|
def true_valid=(true_valid)
|
@@ -68,7 +68,7 @@ module OpenEHR
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def default_value_consistency(default_value)
|
71
|
-
if (!@true_valid && default_value) || (!@false_valid && !default_value)
|
71
|
+
if (!@true_valid && default_value) || ((!@false_valid) && (!default_value))
|
72
72
|
raise ArgumentError, 'default value inconsistency'
|
73
73
|
end
|
74
74
|
end
|
@@ -5,86 +5,81 @@ module OpenEHR
|
|
5
5
|
class ArchetypeOntology
|
6
6
|
attr_accessor :specialisation_depth, :primary_language
|
7
7
|
attr_accessor :term_attribute_names, :term_bindings
|
8
|
-
attr_accessor :languages_available
|
8
|
+
attr_accessor :languages_available, :terminologies_available
|
9
|
+
attr_accessor :constraint_bindings
|
9
10
|
attr_reader :term_definitions, :constraint_definitions
|
10
11
|
|
11
12
|
def initialize(args = { })
|
12
13
|
self.primary_language = args[:primary_language]
|
13
14
|
self.languages_available = args[:languages_available]
|
15
|
+
self.terminologies_available = args[:terminologies_available]
|
14
16
|
self.specialisation_depth = args[:specialisation_depth]
|
15
17
|
self.term_definitions = args[:term_definitions]
|
16
18
|
if args[:constraint_definitions]
|
17
19
|
self.constraint_definitions = args[:constraint_definitions]
|
18
20
|
end
|
19
21
|
self.term_bindings = args[:term_bindings]
|
22
|
+
self.constraint_bindings = args[:constraint_bindings]
|
20
23
|
end
|
21
24
|
|
22
25
|
def term_definitions=(term_definitions)
|
23
26
|
if term_definitions.nil?
|
24
27
|
raise ArgumentError, 'term_definitions is mandatory'
|
25
28
|
end
|
26
|
-
@term_definition_map = definition_mapper(term_definitions)
|
27
29
|
@term_definitions = term_definitions
|
28
30
|
end
|
29
31
|
|
30
32
|
def term_codes
|
31
|
-
|
32
|
-
value.collect {|term| term.code}}.flatten.uniq
|
33
|
+
code_set @term_definitions
|
33
34
|
end
|
34
35
|
|
35
36
|
def constraint_codes
|
36
37
|
if @constraint_definitions.nil?
|
37
38
|
return nil
|
38
39
|
else
|
39
|
-
|
40
|
-
value.collect {|term| term.code}}.flatten.uniq
|
40
|
+
code_set @constraint_definitions
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
45
|
-
return @
|
46
|
-
end
|
47
|
-
|
48
|
-
def constraint_binding(a_terminology, a_code)
|
49
|
-
|
44
|
+
def constraint_binding(args = {})
|
45
|
+
return @constraint_bindings[args[:terminology]][args[:code]]
|
50
46
|
end
|
51
47
|
|
52
48
|
def constraint_definitions=(constraint_definitions)
|
53
|
-
@constraint_definition_map = definition_mapper(constraint_definitions)
|
54
49
|
@constraint_definitions = constraint_definitions
|
55
50
|
end
|
56
51
|
|
57
52
|
def constraint_definition(args = {})
|
58
|
-
return @
|
53
|
+
return @constraint_definitions[args[:lang]][args[:code]]
|
59
54
|
end
|
60
55
|
|
61
56
|
def has_language?(a_lang)
|
62
|
-
return @
|
57
|
+
return @term_definitions.has_key? a_lang
|
63
58
|
end
|
64
59
|
|
65
60
|
def has_terminology?(a_terminology)
|
66
|
-
|
61
|
+
if !@terminologies_available.nil? &&
|
62
|
+
(@terminologies_available.include? a_terminology)
|
63
|
+
return true
|
64
|
+
else
|
65
|
+
return false
|
66
|
+
end
|
67
67
|
end
|
68
68
|
|
69
69
|
def term_binding(args = { })
|
70
|
-
|
70
|
+
return @term_bindings[args[:terminology]][args[:code]]
|
71
71
|
end
|
72
72
|
|
73
73
|
def term_definition(args = { })
|
74
|
-
return @
|
74
|
+
return @term_definitions[args[:lang]][args[:code]]
|
75
75
|
end
|
76
76
|
|
77
|
-
|
78
|
-
def
|
79
|
-
|
80
|
-
|
81
|
-
defs_map = { }
|
82
|
-
defs.each do |d|
|
83
|
-
defs_map[d.code] = d.items
|
84
|
-
end
|
85
|
-
map[lang] = defs_map
|
77
|
+
protected
|
78
|
+
def code_set(definitions)
|
79
|
+
codes = definitions.values.inject([]) do |codes, item|
|
80
|
+
item.keys
|
86
81
|
end
|
87
|
-
|
82
|
+
codes.uniq
|
88
83
|
end
|
89
84
|
end
|
90
85
|
|
@@ -68,7 +68,7 @@ module OpenEHR
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def concept_name(a_lang)
|
71
|
-
return @ontology.term_definition(:lang => a_lang, :code => @concept)[:text]
|
71
|
+
return @ontology.term_definition(:lang => a_lang, :code => @concept).items[:text]
|
72
72
|
end
|
73
73
|
|
74
74
|
def constraint_references_valid?
|
data/lib/open_ehr/parser/adl.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
include OpenEHR::RM::Support::Identification
|
2
|
+
include OpenEHR::RM::Common::Resource
|
3
|
+
include OpenEHR::RM::DataTypes::Text
|
4
|
+
|
1
5
|
module OpenEHR
|
2
6
|
module Parser
|
3
7
|
module ADLGrammar
|
@@ -6,12 +10,46 @@ module OpenEHR
|
|
6
10
|
end
|
7
11
|
|
8
12
|
class ArchLanguage < Base
|
9
|
-
def
|
10
|
-
lang.value
|
13
|
+
def value
|
14
|
+
Language.new(lang.value)
|
11
15
|
end
|
16
|
+
end
|
17
|
+
|
12
18
|
|
13
|
-
|
14
|
-
|
19
|
+
class Language
|
20
|
+
attr_reader :original_language, :translations
|
21
|
+
|
22
|
+
def initialize(value)
|
23
|
+
self.original_language = value['original_language']
|
24
|
+
self.translations = value['translations']
|
25
|
+
end
|
26
|
+
|
27
|
+
def original_language=(original_language)
|
28
|
+
@original_language = code2lang original_language
|
29
|
+
end
|
30
|
+
|
31
|
+
def translations=(translations)
|
32
|
+
if translations.nil?
|
33
|
+
@translations = nil
|
34
|
+
else
|
35
|
+
tr = translations.inject({ }) do |trans, lang|
|
36
|
+
code, details = lang
|
37
|
+
td = TranslationDetails.new(
|
38
|
+
:language => code2lang(details['language']),
|
39
|
+
:author => details['author'],
|
40
|
+
:accreditation => details['accreditation'],
|
41
|
+
:other_details => details['other_details'])
|
42
|
+
trans.update Hash[code, td]
|
43
|
+
end
|
44
|
+
@translations = tr
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
def code2lang(code)
|
50
|
+
ti, la = code.split '::'
|
51
|
+
ti = TerminologyID.new(:value => ti)
|
52
|
+
CodePhrase.new(:code_string => la, :terminology_id => ti)
|
15
53
|
end
|
16
54
|
end
|
17
55
|
end
|
@@ -33,15 +33,11 @@ module OpenEHR
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def original_language
|
36
|
-
|
37
|
-
OpenEHR::RM::DataTypes::Text::CodePhrase.new(
|
38
|
-
:terminology_id =>
|
39
|
-
OpenEHR::RM::Support::Identification::TerminologyID.new(:value => tid),
|
40
|
-
:code_string => la)
|
36
|
+
lang.value.original_language
|
41
37
|
end
|
42
38
|
|
43
39
|
def translations
|
44
|
-
lang.translations
|
40
|
+
lang.value.translations
|
45
41
|
end
|
46
42
|
|
47
43
|
def description
|
@@ -147,40 +143,35 @@ module OpenEHR
|
|
147
143
|
def value
|
148
144
|
params = desc.value
|
149
145
|
details = { }
|
150
|
-
params[
|
151
|
-
term_id, la = attrs[
|
146
|
+
params['details'].each do |lang, attrs|
|
147
|
+
term_id, la = attrs['language'].split('::')
|
152
148
|
terminology_id =
|
153
149
|
OpenEHR::RM::Support::Identification::TerminologyID.new(
|
154
150
|
:value => term_id)
|
155
|
-
misuse = attrs[
|
151
|
+
misuse = attrs['misuse']
|
152
|
+
misuse = nil if misuse.nil? or misuse.empty?
|
156
153
|
item =
|
157
154
|
OpenEHR::RM::Common::Resource::ResourceDescriptionItem.new(
|
158
155
|
:language => OpenEHR::RM::DataTypes::Text::CodePhrase.new(
|
159
156
|
:terminology_id => terminology_id,
|
160
157
|
:code_string => la),
|
161
|
-
:purpose => attrs[
|
162
|
-
:keywords => attrs[
|
163
|
-
:use => attrs[
|
158
|
+
:purpose => attrs["purpose"],
|
159
|
+
:keywords => attrs["keywords"],
|
160
|
+
:use => attrs["use"],
|
164
161
|
:misuse => misuse,
|
165
|
-
:copyright => attrs[
|
166
|
-
:original_resource_uri => attrs[
|
167
|
-
:other_details => attrs[
|
168
|
-
details[lang
|
162
|
+
:copyright => attrs['copyright'],
|
163
|
+
:original_resource_uri => attrs['original_resource_uri'],
|
164
|
+
:other_details => attrs['other_details'])
|
165
|
+
details[lang] = item
|
169
166
|
end
|
170
|
-
oc = params[
|
171
|
-
original_author = key_s params[:original_author]
|
172
|
-
other_details = key_s params[:other_details] if params[:other_details]
|
167
|
+
oc = params['other_contributors'].nil? ? nil : params['other_contributors'].values
|
173
168
|
OpenEHR::RM::Common::Resource::ResourceDescription.new(
|
174
|
-
:original_author => original_author,
|
169
|
+
:original_author => params['original_author'],
|
175
170
|
:other_contributors => oc,
|
176
|
-
:lifecycle_state => params[
|
171
|
+
:lifecycle_state => params['lifecycle_state'],
|
177
172
|
:details => details,
|
178
|
-
:resource_package_uri => params[
|
179
|
-
:other_details => other_details)
|
180
|
-
end
|
181
|
-
|
182
|
-
def key_s(hash)
|
183
|
-
hash.inject({ }) {|h,i| h.update Hash[i[0].to_s,i[1]]}
|
173
|
+
:resource_package_uri => params['archetype_package_uri'],
|
174
|
+
:other_details => params['other_details'])
|
184
175
|
end
|
185
176
|
}
|
186
177
|
end
|
@@ -200,21 +191,55 @@ module OpenEHR
|
|
200
191
|
rule arch_ontology
|
201
192
|
SYM_ONTOLOGY ontology:V_DADL_TEXT space {
|
202
193
|
def value
|
203
|
-
ao = ontology.value
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
194
|
+
ao = ontology.value
|
195
|
+
arc_term = Proc.new do |code, item|
|
196
|
+
OpenEHR::AM::Archetype::Ontology::ArchetypeTerm.new(
|
197
|
+
:code => code, :items => item)
|
198
|
+
end
|
199
|
+
td = itemizer(ao['term_definitions'], arc_term)
|
200
|
+
cd = ao['constraint_definitions']
|
201
|
+
if cd
|
202
|
+
cd = itemizer(cd , arc_term)
|
203
|
+
end
|
204
|
+
tb = ao['term_bindings']
|
205
|
+
term_bind = Proc.new do |code, item|
|
206
|
+
term_id, code_string = item.split '::'
|
207
|
+
term_id = OpenEHR::RM::Support::Identification::TerminologyID.new(:value => term_id)
|
208
|
+
OpenEHR::RM::DataTypes::Text::CodePhrase.new(:terminology_id => term_id, :code_string => code_string)
|
209
|
+
end
|
210
|
+
if tb
|
211
|
+
tb = itemizer(tb, term_bind)
|
212
|
+
end
|
213
|
+
cons_bind = Proc.new do |code, item|
|
214
|
+
item
|
215
|
+
end
|
216
|
+
cb = ao['constraint_bindings']
|
217
|
+
if cb
|
218
|
+
cb = itemizer(cb, cons_bind)
|
212
219
|
end
|
213
220
|
OpenEHR::AM::Archetype::Ontology::ArchetypeOntology.new(
|
214
|
-
:
|
215
|
-
|
221
|
+
:primary_language => ao['primary_language'],
|
222
|
+
:languages_available => ao['languages_available'],
|
223
|
+
:terminologies_available => ao['terminologies_available'],
|
224
|
+
:term_definitions => td,
|
225
|
+
:constraint_definitions => cd,
|
226
|
+
:term_bindings => tb,
|
227
|
+
:constraint_bindings => cb)
|
228
|
+
end
|
229
|
+
|
230
|
+
def itemizer(defs, itemize)
|
231
|
+
defs.inject({ }) do |term_defs, langs|
|
232
|
+
lang, items = langs
|
233
|
+
terms = items['items'].inject({ }) do |items, term|
|
234
|
+
code, item = term
|
235
|
+
item = itemize.call code, item
|
236
|
+
items.update Hash[code => item]
|
237
|
+
end
|
238
|
+
term_defs.update Hash[lang => terms]
|
239
|
+
end
|
240
|
+
end
|
216
241
|
}
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|
242
|
+
end # of arch_ontology
|
243
|
+
end # of ADLGrammar
|
244
|
+
end # of Parser
|
245
|
+
end # of openEHR
|
@@ -33,7 +33,7 @@ module OpenEHR
|
|
33
33
|
:adl_version => @result.adl_version,
|
34
34
|
:concept => @result.concept,
|
35
35
|
:original_language => original_language,
|
36
|
-
:
|
36
|
+
:translations => @result.translations,
|
37
37
|
:description => @result.description,
|
38
38
|
:definition => @result.definition,
|
39
39
|
:ontology => @result.ontology)
|