oddb2xml 1.0.8 → 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -1
- data/lib/oddb2xml/builder.rb +44 -3
- data/lib/oddb2xml/cli.rb +17 -11
- data/lib/oddb2xml/compressor.rb +1 -1
- data/lib/oddb2xml/extractor.rb +3 -6
- data/lib/oddb2xml/version.rb +1 -1
- metadata +62 -38
data/History.txt
CHANGED
data/lib/oddb2xml/builder.rb
CHANGED
@@ -27,12 +27,53 @@ module Oddb2xml
|
|
27
27
|
yield self
|
28
28
|
end
|
29
29
|
end
|
30
|
-
def to_xml
|
31
|
-
if
|
30
|
+
def to_xml(subject=nil)
|
31
|
+
if subject
|
32
|
+
self.send('build_' + subject)
|
33
|
+
elsif @subject
|
32
34
|
self.send('build_' + @subject)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
private
|
38
|
+
def build_substance
|
39
|
+
@substances = []
|
40
|
+
@items.values.uniq.each do |seq|
|
41
|
+
seq[:substances].each do |sub|
|
42
|
+
@substances << sub[:name]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
@substances.uniq!
|
46
|
+
@substances.sort!
|
47
|
+
_builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
|
48
|
+
xml.doc.tag_suffix = @tag_suffix
|
49
|
+
datetime = Time.new.strftime('%FT%T.%7N%z')
|
50
|
+
xml.SUBSTANCE(
|
51
|
+
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
|
52
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
53
|
+
'xmlns' => 'http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration',
|
54
|
+
'CREATION_DATETIME' => datetime,
|
55
|
+
'PROD_DATE' => datetime,
|
56
|
+
'VALID_DATE' => datetime,
|
57
|
+
) {
|
58
|
+
@substances.each_with_index do |sub_name, i|
|
59
|
+
xml.SB('DT' => '') {
|
60
|
+
xml.SUBNO (i + 1).to_i
|
61
|
+
#xml.NAMD
|
62
|
+
#xml.ANAMD
|
63
|
+
#xml.NAMF
|
64
|
+
xml.NAML sub_name
|
65
|
+
}
|
66
|
+
end
|
67
|
+
xml.RESULT {
|
68
|
+
xml.OK_ERROR 'OK'
|
69
|
+
xml.NBR_RECORD @substances.length.to_s
|
70
|
+
xml.ERROR_CODE ''
|
71
|
+
xml.MESSAGE ''
|
72
|
+
}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
_builder.to_xml
|
76
|
+
end
|
36
77
|
def build_product
|
37
78
|
# merge company info from swissINDEX
|
38
79
|
objects = []
|
@@ -137,7 +178,7 @@ module Oddb2xml
|
|
137
178
|
seq[:substances].each do |sub|
|
138
179
|
xml.CPTCMP {
|
139
180
|
xml.LINE sub[:index] unless sub[:index].empty?
|
140
|
-
|
181
|
+
xml.SUBNO @substances.index(sub[:name]) + 1 if @substances.include?(sub[:name])
|
141
182
|
xml.QTY sub[:quantity] unless sub[:quantity].empty?
|
142
183
|
xml.QTYU sub[:unit] unless sub[:unit].empty?
|
143
184
|
#xml.WHK
|
data/lib/oddb2xml/cli.rb
CHANGED
@@ -12,7 +12,7 @@ module Oddb2xml
|
|
12
12
|
LANGUAGES = %w[DE FR] # EN does not exist
|
13
13
|
def initialize(args)
|
14
14
|
@options = args
|
15
|
-
|
15
|
+
@mutex = Mutex.new
|
16
16
|
@items = {} # Items from Preparations.xml in BAG
|
17
17
|
@index = {} # Base index from swissINDEX
|
18
18
|
LANGUAGES.each do |lang|
|
@@ -20,28 +20,27 @@ module Oddb2xml
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
def run
|
23
|
-
|
24
|
-
#threads = []
|
23
|
+
threads = []
|
25
24
|
# bag_xml
|
26
|
-
|
25
|
+
threads << Thread.new do
|
27
26
|
downloader = BagXmlDownloader.new
|
28
27
|
xml = downloader.download
|
29
28
|
@items = BagXmlExtractor.new(xml).to_hash
|
30
|
-
|
29
|
+
end
|
31
30
|
LANGUAGES.each do |lang|
|
32
31
|
# swissindex
|
33
32
|
types.each do |type|
|
34
|
-
|
33
|
+
threads << Thread.new do
|
35
34
|
downloader = SwissIndexDownloader.new(type)
|
36
35
|
xml = downloader.download_by(lang)
|
37
|
-
|
38
|
-
|
36
|
+
@mutex.synchronize do
|
37
|
+
hsh = SwissIndexExtractor.new(xml, type).to_hash
|
39
38
|
@index[lang][type] = hsh
|
40
|
-
|
41
|
-
|
39
|
+
end
|
40
|
+
end
|
42
41
|
end
|
43
42
|
end
|
44
|
-
|
43
|
+
threads.map(&:join)
|
45
44
|
build
|
46
45
|
report
|
47
46
|
end
|
@@ -65,12 +64,19 @@ module Oddb2xml
|
|
65
64
|
builder.items = @items
|
66
65
|
builder.tag_suffix = @options[:tag_suffix]
|
67
66
|
end
|
67
|
+
if file =~ /(product)/
|
68
|
+
xml = builder.to_xml('substance')
|
69
|
+
File.open(file.gsub($1, 'substance'), 'w:utf-8'){ |fh| fh << xml }
|
70
|
+
end
|
68
71
|
xml = builder.to_xml
|
69
72
|
File.open(file, 'w:utf-8'){ |fh| fh << xml }
|
70
73
|
end
|
71
74
|
if @options[:compress_ext]
|
72
75
|
compressor = Compressor.new(prefix, @options[:compress_ext])
|
73
76
|
files.values.each do |file|
|
77
|
+
if file =~ /(product)/
|
78
|
+
compressor.contents << file.gsub($1, 'substance')
|
79
|
+
end
|
74
80
|
compressor.contents << file
|
75
81
|
end
|
76
82
|
compressor.finalize!
|
data/lib/oddb2xml/compressor.rb
CHANGED
data/lib/oddb2xml/extractor.rb
CHANGED
@@ -11,8 +11,6 @@ module Oddb2xml
|
|
11
11
|
end
|
12
12
|
class BagXmlExtractor < Extractor
|
13
13
|
def to_hash
|
14
|
-
#File.open('../bagxml.xml', 'r:ASCII-8BIT') {|f| @xml = f.read }
|
15
|
-
# pharmacode => sequence
|
16
14
|
data = {}
|
17
15
|
doc = Nokogiri::XML(@xml)
|
18
16
|
doc.xpath('//Preparation').each do |seq|
|
@@ -38,8 +36,9 @@ module Oddb2xml
|
|
38
36
|
seq.xpath('.//Substance').each_with_index do |sub, i|
|
39
37
|
item[:substances] << {
|
40
38
|
:index => i.to_s,
|
41
|
-
:
|
42
|
-
:
|
39
|
+
:name => (name = sub.at_xpath('.//DescriptionLa')) ? name.text : '',
|
40
|
+
:quantity => (qtty = sub.at_xpath('.//Quantity')) ? qtty.text : '',
|
41
|
+
:unit => (unit = sub.at_xpath('.//QuantityUnit')) ? unit.text : '',
|
43
42
|
}
|
44
43
|
end
|
45
44
|
item[:pharmacodes] = []
|
@@ -93,8 +92,6 @@ module Oddb2xml
|
|
93
92
|
super(xml)
|
94
93
|
end
|
95
94
|
def to_hash
|
96
|
-
#File.open("../swissindex_#{@type.downcase}.xml", 'r:ASCII-8BIT'){|f| @xml = f.read }
|
97
|
-
# pharmacode => package
|
98
95
|
data = {}
|
99
96
|
doc = Nokogiri::XML(@xml)
|
100
97
|
doc.remove_namespaces!
|
data/lib/oddb2xml/version.rb
CHANGED
metadata
CHANGED
@@ -1,48 +1,63 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: oddb2xml
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 5
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 9
|
10
|
+
version: 1.0.9
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Yasuhiro Asaka, Zeno R.R. Davatz
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2012-12-11 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: rdoc
|
16
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
24
|
none: false
|
18
|
-
requirements:
|
25
|
+
requirements:
|
19
26
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 19
|
29
|
+
segments:
|
30
|
+
- 3
|
31
|
+
- 10
|
32
|
+
version: "3.10"
|
22
33
|
type: :development
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
26
36
|
name: hoe
|
27
|
-
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
|
-
requirements:
|
40
|
+
requirements:
|
30
41
|
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 25
|
44
|
+
segments:
|
45
|
+
- 2
|
46
|
+
- 13
|
47
|
+
version: "2.13"
|
33
48
|
type: :development
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
email:
|
49
|
+
version_requirements: *id002
|
50
|
+
description: ""
|
51
|
+
email:
|
38
52
|
- yasaka@ywesee.com, zdavatz@ywesee.com
|
39
|
-
executables:
|
53
|
+
executables:
|
40
54
|
- oddb2xml
|
41
55
|
extensions: []
|
42
|
-
|
56
|
+
|
57
|
+
extra_rdoc_files:
|
43
58
|
- History.txt
|
44
59
|
- Manifest.txt
|
45
|
-
files:
|
60
|
+
files:
|
46
61
|
- .gitignore
|
47
62
|
- .rspec
|
48
63
|
- Gemfile
|
@@ -73,28 +88,37 @@ files:
|
|
73
88
|
- spec/spec_helper.rb
|
74
89
|
homepage:
|
75
90
|
licenses: []
|
91
|
+
|
76
92
|
post_install_message:
|
77
|
-
rdoc_options:
|
93
|
+
rdoc_options:
|
78
94
|
- --main
|
79
95
|
- README.txt
|
80
|
-
require_paths:
|
96
|
+
require_paths:
|
81
97
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
99
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
88
|
-
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 3
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
108
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 3
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
version: "0"
|
94
116
|
requirements: []
|
117
|
+
|
95
118
|
rubyforge_project: oddb2xml
|
96
119
|
rubygems_version: 1.8.15
|
97
120
|
signing_key:
|
98
121
|
specification_version: 3
|
99
|
-
summary:
|
122
|
+
summary: ""
|
100
123
|
test_files: []
|
124
|
+
|