dcm_dict 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +674 -0
  3. data/LICENSE +22 -0
  4. data/README.md +296 -0
  5. data/Rakefile +36 -0
  6. data/bin/dcm_dict_converter.rb +194 -0
  7. data/lib/dcm_dict.rb +46 -0
  8. data/lib/dcm_dict/dictionary/base_dictionary.rb +47 -0
  9. data/lib/dcm_dict/dictionary/base_record.rb +62 -0
  10. data/lib/dcm_dict/dictionary/data_element_dictionary.rb +117 -0
  11. data/lib/dcm_dict/dictionary/data_element_record.rb +93 -0
  12. data/lib/dcm_dict/dictionary/uid_dictionary.rb +82 -0
  13. data/lib/dcm_dict/dictionary/uid_record.rb +48 -0
  14. data/lib/dcm_dict/encoder/data_to_code.rb +79 -0
  15. data/lib/dcm_dict/error/dictionary_error.rb +30 -0
  16. data/lib/dcm_dict/ext/object_extension.rb +38 -0
  17. data/lib/dcm_dict/refine/array_refine.rb +34 -0
  18. data/lib/dcm_dict/refine/data_element_refine.rb +37 -0
  19. data/lib/dcm_dict/refine/internal/array_refine_internal.rb +97 -0
  20. data/lib/dcm_dict/refine/internal/hash_refine_internal.rb +71 -0
  21. data/lib/dcm_dict/refine/internal/string_refine_internal.rb +119 -0
  22. data/lib/dcm_dict/refine/string_refine.rb +35 -0
  23. data/lib/dcm_dict/refine/symbol_refine.rb +34 -0
  24. data/lib/dcm_dict/refine/uid_refine.rb +36 -0
  25. data/lib/dcm_dict/rubies/rb_ext.rb +32 -0
  26. data/lib/dcm_dict/source_data/data_elements_data.rb +3937 -0
  27. data/lib/dcm_dict/source_data/detached_data.rb +67 -0
  28. data/lib/dcm_dict/source_data/uid_values_data.rb +382 -0
  29. data/lib/dcm_dict/version.rb +27 -0
  30. data/lib/dcm_dict/xml/constant.rb +38 -0
  31. data/lib/dcm_dict/xml/field_data.rb +47 -0
  32. data/lib/dcm_dict/xml/nokogiri_tool.rb +108 -0
  33. data/lib/dcm_dict/xml/rexml_tool.rb +105 -0
  34. data/lib/dcm_dict/xml/tag_field_data.rb +96 -0
  35. data/lib/dcm_dict/xml/uid_field_data.rb +49 -0
  36. data/lib/dcm_dict/xml/xml_tool.rb +47 -0
  37. data/spec/data_element_sample_spec_helper.rb +110 -0
  38. data/spec/data_element_shared_example_spec_helper.rb +57 -0
  39. data/spec/dcm_dict/dictionary/data_element_dictionary_spec.rb +75 -0
  40. data/spec/dcm_dict/dictionary/data_element_record_spec.rb +117 -0
  41. data/spec/dcm_dict/dictionary/uid_dictionary_spec.rb +60 -0
  42. data/spec/dcm_dict/dictionary/uid_record_spec.rb +53 -0
  43. data/spec/dcm_dict/encoder/data_to_code_spec.rb +109 -0
  44. data/spec/dcm_dict/ext/object_extension_spec.rb +53 -0
  45. data/spec/dcm_dict/refine/array_refine_spec.rb +61 -0
  46. data/spec/dcm_dict/refine/internal/array_refine_internal_spec.rb +98 -0
  47. data/spec/dcm_dict/refine/internal/hash_refine_internal_spec.rb +64 -0
  48. data/spec/dcm_dict/refine/internal/string_refine_internal_spec.rb +214 -0
  49. data/spec/dcm_dict/refine/string_refine_spec.rb +87 -0
  50. data/spec/dcm_dict/refine/symbol_refine_spec.rb +41 -0
  51. data/spec/dcm_dict/rubies/rb_ext_spec.rb +46 -0
  52. data/spec/dcm_dict/source_data/data_elements_data_spec.rb +40 -0
  53. data/spec/dcm_dict/source_data/detached_data_spec.rb +55 -0
  54. data/spec/dcm_dict/source_data/uid_values_data_spec.rb +37 -0
  55. data/spec/dcm_dict/version_spec.rb +30 -0
  56. data/spec/dcm_dict/xml/tag_field_data_spec.rb +62 -0
  57. data/spec/dcm_dict/xml/uid_field_data_spec.rb +60 -0
  58. data/spec/dictionary_shared_example_spec_helper.rb +118 -0
  59. data/spec/refine_shared_example_spec_helper.rb +54 -0
  60. data/spec/spec_helper.rb +42 -0
  61. data/spec/xml_sample_spec_helper.rb +533 -0
  62. metadata +212 -0
@@ -0,0 +1,38 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ module DcmDict
25
+ module XML
26
+ DataElementNodeSetIdx = { tag_ps: 0,
27
+ tag_name: 1,
28
+ tag_key: 2,
29
+ tag_vr: 3,
30
+ tag_vm: 4,
31
+ tag_note: 5 }.freeze
32
+
33
+ UidNodeSetIdx = { uid_value: 0,
34
+ uid_name: 1,
35
+ uid_type: 2}.freeze
36
+
37
+ end
38
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ module DcmDict
25
+ module XML
26
+
27
+ # Base class to manage xml data
28
+ class FieldData
29
+ using DcmDict::Refine::Internal::StringRefineInternal
30
+
31
+ # Initialize object using +extract_proc+ as proc to extract data from xml element
32
+ def initialize(extract_proc)
33
+ @extract_proc = extract_proc
34
+ end
35
+
36
+ private
37
+ def extract_multiple_data(key, sep)
38
+ extract_content_data(key).split(sep)
39
+ end
40
+
41
+ def extract_content_data(key)
42
+ data = @extract_proc.call(key)
43
+ data ? data.dcm_unspace : ''
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,108 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+
25
+ module DcmDict
26
+ module XML
27
+ @@nokogiri_enable = false
28
+
29
+ begin
30
+ #raise LoadError.new "Simulate LoadError to disable Nokogiri"
31
+ require 'nokogiri'
32
+ @@nokogiri_enable = true
33
+ rescue LoadError
34
+ end
35
+
36
+ # Check for Nokogiri gem
37
+ def self.nokogiri_enable?
38
+ @@nokogiri_enable
39
+ end
40
+
41
+ if @@nokogiri_enable
42
+ module NokogiriTool
43
+
44
+ # Extract data element data from a table row using +xml_tr_string+ as source string
45
+ def self.extract_data_element_field_from_xml_tr(xml_tr_string)
46
+ nodeset = extract_nokogiri_nodeset(xml_tr_string)
47
+ extract_data_element_field_from_tr_set(nodeset)
48
+ end
49
+
50
+ # Extract data element data from xml table row using +trset+ (NodeSet) as source
51
+ def self.extract_data_element_field_from_tr_set(trset)
52
+ proc = tag_field_extract_proc(trset)
53
+ TagFieldData.new(proc).data_element_data
54
+ end
55
+
56
+ # Extract uid data from a table row using +xml_tr_string+ as source string
57
+ def self.extract_uid_field_from_xml_tr(xml_tr_string)
58
+ nodeset = extract_nokogiri_nodeset(xml_tr_string)
59
+ extract_uid_field_from_tr_set(nodeset)
60
+ end
61
+
62
+ # Extract uid data from a table row using +trset+ (NodeSet) as source
63
+ def self.extract_uid_field_from_tr_set(trset)
64
+ proc = uid_field_extract_proc(trset)
65
+ UidFieldData.new(proc).uid_data
66
+ end
67
+
68
+ # Create XML root object from xml source string +xml_string+
69
+ def self.create_xml_doc(xml_string)
70
+ Nokogiri::XML(xml_string)
71
+ end
72
+
73
+ # Calls the given block from +doc+ once for each 'table row' identified by +xpath+
74
+ def self.each_tr_set(doc, xpath)
75
+ alltr = doc.xpath(xpath)
76
+ alltr.each do |tr|
77
+ trset = tr.xpath('xmlns:td')
78
+ yield trset if block_given?
79
+ end
80
+ end
81
+
82
+ private
83
+ def self.tag_field_extract_proc(node_set)
84
+ make_nokogiri_proc(node_set, DataElementNodeSetIdx)
85
+ end
86
+
87
+ def self.uid_field_extract_proc(node_set)
88
+ make_nokogiri_proc(node_set, UidNodeSetIdx)
89
+ end
90
+
91
+ def self.make_nokogiri_proc(node_set, node_set_idx)
92
+ Proc.new do |key|
93
+ idx = node_set_idx[key]
94
+ node_set[idx] ? node_set[idx].content.gsub(/ {2,}/, '') : ''
95
+ end
96
+ end
97
+
98
+ def self.extract_nokogiri_nodeset(xml_tr_string)
99
+ doc = create_xml_doc(xml_tr_string)
100
+ each_tr_set(doc, '//xmlns:tr') do |tdset|
101
+ return tdset
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,105 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ require "rexml/document"
25
+
26
+ module DcmDict
27
+ module XML
28
+
29
+ module RexmlTool
30
+
31
+ # Extract data element data from a table row using +xml_tr_string+ as source string
32
+ def self.extract_data_element_field_from_xml_tr(xml_tr_string)
33
+ nodeset = extract_rexml_nodeset(xml_tr_string)
34
+ extract_data_element_field_from_tr_set(nodeset)
35
+ end
36
+
37
+ # Extract data element data from xml table row using +trset+ (NodeSet) as source
38
+ def self.extract_data_element_field_from_tr_set(trset)
39
+ proc = tag_field_extract_proc(trset)
40
+ TagFieldData.new(proc).data_element_data
41
+ end
42
+
43
+ # Extract uid data from a table row using +xml_tr_string+ as source string
44
+ def self.extract_uid_field_from_xml_tr(xml_tr_string)
45
+ nodeset = extract_rexml_nodeset(xml_tr_string)
46
+ extract_uid_field_from_tr_set(nodeset)
47
+ end
48
+
49
+ # Extract uid data from a table row using +trset+ (XML Element) as source
50
+ def self.extract_uid_field_from_tr_set(trset)
51
+ proc = uid_field_extract_proc(trset)
52
+ UidFieldData.new(proc).uid_data
53
+ end
54
+
55
+ # Create XML root object from xml source string +xml_string+
56
+ def self.create_xml_doc(xml_string)
57
+ REXML::Document.new(xml_string)
58
+ end
59
+
60
+ # Calls the given block from +doc+ once for each 'table row' identified by +xpath+
61
+ def self.each_tr_set(doc, xpath)
62
+ alltr = REXML::XPath.match(doc, xpath)
63
+ alltr.each do |tr|
64
+ trset = tr.get_elements('xmlns:td')
65
+ yield trset if block_given?
66
+ end
67
+ end
68
+
69
+ private
70
+ def self.tag_field_extract_proc(node_set)
71
+ make_rexml_proc(node_set, DataElementNodeSetIdx)
72
+ end
73
+
74
+ def self.uid_field_extract_proc(node_set)
75
+ make_rexml_proc(node_set, UidNodeSetIdx)
76
+ end
77
+
78
+ def self.make_rexml_proc(node_set, node_set_idx)
79
+ Proc.new do |key|
80
+ element = node_set[node_set_idx[key]]
81
+ field = ''
82
+ if element
83
+ element.each_element_with_text do |txt1|
84
+ field << "\n" unless field.nil_or_empty?
85
+ txt1.each_element_with_text do |txt2|
86
+ field << txt2.texts.map(&:value).join('')
87
+ end
88
+ field << txt1.texts.map(&:value).join('')
89
+ end
90
+ end
91
+ field
92
+ end
93
+ end
94
+
95
+ def self.extract_rexml_nodeset(xml_tr_string)
96
+ doc = create_xml_doc(xml_tr_string)
97
+ each_tr_set(doc, "//xmlns:tr") do |tdset|
98
+ return tdset
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,96 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ module DcmDict
25
+ module XML
26
+ MultiFieldSeparator = ' or '.freeze
27
+ DefaultMultiTagValue = '2'.freeze
28
+
29
+ # Class to handle data element data
30
+ class TagFieldData < FieldData
31
+ using DcmDict::Refine::Internal::StringRefineInternal
32
+ using DcmDict::Refine::Internal::HashRefineInternal
33
+
34
+ # Initialize object using +extract_proc+ as proc to extract data from xml element
35
+ def initialize(extract_proc)
36
+ super
37
+ end
38
+
39
+ # Extract and build data element data
40
+ def data_element_data
41
+ extract_base_data()
42
+ @data.check_base_data_tag_field!
43
+ extend_base_data()
44
+ @data
45
+ end
46
+
47
+ private
48
+ def extract_base_data()
49
+ @data = { :tag_ps => extract_content_data(:tag_ps),
50
+ :tag_name => extract_content_data(:tag_name),
51
+ :tag_key => extract_content_data(:tag_key),
52
+ :tag_vr => extract_tag_vr(),
53
+ :tag_vm => extract_tag_vm(),
54
+ :tag_note => extract_content_data(:tag_note) }
55
+ end
56
+
57
+ def extract_tag_vr()
58
+ extract_multiple_data(:tag_vr, MultiFieldSeparator).map(&:to_sym)
59
+ end
60
+
61
+ def extract_tag_vm()
62
+ extract_multiple_data(:tag_vm, MultiFieldSeparator)
63
+ end
64
+
65
+ def extend_base_data
66
+ @data[:tag_str] = extract_tag_str_from_data
67
+ @data[:tag_sym] = extract_tag_sym_from_data
68
+ @data[:tag_ndm] = extract_tag_ndm_from_data
69
+ @data[:tag_ary] = extract_tag_ary_from_data
70
+ @data[:tag_multiple] = data_with_multiple_tag?
71
+ end
72
+
73
+ def extract_tag_str_from_data
74
+ @data[:tag_ps].gsub(/[xX|]/, DefaultMultiTagValue)
75
+ end
76
+
77
+ def data_with_multiple_tag?
78
+ @data[:tag_ps].index(/[xX|]/) ? true : false
79
+ end
80
+
81
+ def extract_tag_ary_from_data
82
+ @data[:tag_str].to_tag_ary
83
+ end
84
+
85
+ def extract_tag_ndm_from_data
86
+ @data[:tag_str].to_tag_ndm
87
+ end
88
+
89
+ def extract_tag_sym_from_data
90
+ @data[:tag_key].tag_key_to_sym
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,49 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ module DcmDict
25
+ module XML
26
+
27
+ # Class to handle uid data
28
+ class UidFieldData < FieldData
29
+ using DcmDict::Refine::Internal::StringRefineInternal
30
+
31
+ # Initialize object using +extract_proc+ as proc to extract data from xml element
32
+ def initialize(extract_proc)
33
+ super
34
+ end
35
+
36
+ # Extract and build uid data
37
+ def uid_data
38
+ extract_base_data
39
+ end
40
+
41
+ private
42
+ def extract_base_data
43
+ { uid_value: extract_content_data(:uid_value),
44
+ uid_name: extract_content_data(:uid_name),
45
+ uid_type: extract_content_data(:uid_type).uid_type_to_sym}
46
+ end
47
+ end
48
+ end
49
+ end