oddb2xml 2.0.5 → 2.0.6
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 +13 -5
- data/Gemfile.lock +26 -19
- data/History.txt +5 -0
- data/dokumentation_calc.textile +50 -0
- data/lib/oddb2xml/builder.rb +9 -4
- data/lib/oddb2xml/calc.rb +1 -1
- data/lib/oddb2xml/cli.rb +1 -0
- data/lib/oddb2xml/compositions_syntax.rb +368 -0
- data/lib/oddb2xml/extractor.rb +13 -4
- data/lib/oddb2xml/parslet_compositions.rb +598 -0
- data/lib/oddb2xml/version.rb +1 -1
- data/oddb2xml.gemspec +1 -0
- data/spec/builder_spec.rb +1 -1
- data/spec/calc_spec.rb +102 -121
- data/spec/composition_syntax_spec.rb +502 -0
- data/spec/data/compositions.txt +8937 -0
- data/spec/data/swissmedic_package-galenic.xlsx +0 -0
- data/spec/data/zurrose_transfer.dat +5 -0
- data/spec/extractor_spec.rb +40 -0
- data/spec/parslet_spec.rb +1268 -0
- data/spec/spec_helper.rb +8 -0
- metadata +56 -34
- data/lib/oddb2xml/parse_compositions.rb +0 -106
@@ -0,0 +1,1268 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'pry'
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
require 'pp'
|
8
|
+
require 'spec_helper'
|
9
|
+
require "#{Dir.pwd}/lib/oddb2xml/parslet_compositions"
|
10
|
+
require 'parslet/rig/rspec'
|
11
|
+
|
12
|
+
hostname = Socket.gethostbyname(Socket.gethostname).first
|
13
|
+
RunAllCompositionsTests = /travis|localhost/i.match(hostname) != nil # takes about five minutes to run!
|
14
|
+
puts "hostname is #{hostname} RunAllCompositionsTests #{RunAllCompositionsTests}"
|
15
|
+
# Testing whether 8937 composition lines can be parsed. Found 380 errors in 293 seconds
|
16
|
+
# 520 examples, 20 failures, 1 pending
|
17
|
+
|
18
|
+
RunCompositionExamples = true
|
19
|
+
RunSubstanceExamples = true
|
20
|
+
RunFailingSpec = false
|
21
|
+
RunExcipiensTest = true
|
22
|
+
RunSpecificTests = true
|
23
|
+
RunMostImportantParserTests = true
|
24
|
+
|
25
|
+
describe ParseComposition do
|
26
|
+
to_add = %(
|
27
|
+
VERBOSE_MESSAGES = true
|
28
|
+
pp composition; binding.pry
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ParseComposition do
|
33
|
+
|
34
|
+
context "should handle missing arom.: before excipiens" do
|
35
|
+
string = "nicotinum 4 mg ut nicotini resinas, aromatica, antiox.: E 321, arom.: excipiens pro praeparatione"
|
36
|
+
composition = ParseComposition.from_string(string)
|
37
|
+
specify { expect(composition.source).to eq string}
|
38
|
+
specify { expect( composition.substances.size).to eq 3 }
|
39
|
+
specify { expect( composition.substances.first.name).to eq "Nicotinum" } # TODO: is not Benzocainum
|
40
|
+
end
|
41
|
+
|
42
|
+
context "should handle missing Label A:) in pollinis allergeni extractu" do
|
43
|
+
string = '"pollinis allergeni extractum (alnus glutinosa, betula alba, corylus avellana) 300 U.: excipiens ad solutionem pro 1 ml'
|
44
|
+
composition = ParseComposition.from_string(string)
|
45
|
+
specify { expect(composition.source).to eq string}
|
46
|
+
specify { expect( composition.substances.size).to eq 0 }
|
47
|
+
specify { expect( composition.label).to eq 'A' }
|
48
|
+
specify { expect( composition.composition.label_description).to eq 'pollinis allergeni extractum (alnus glutinosa, betula alba, corylus avellana) 300 U.' }
|
49
|
+
end
|
50
|
+
|
51
|
+
context "should handle dose with /" do
|
52
|
+
string = 'poly(dl-lactidum-co-glycolidum) 75/25'
|
53
|
+
composition = ParseComposition.from_string(string)
|
54
|
+
specify { expect(composition.source).to eq string}
|
55
|
+
specify { expect( composition.substances.first.name).to eq "Poly(dl-lactidum-co-glycolidum)" }
|
56
|
+
specify { expect( composition.substances.first.dose.to_s).to eq '75/25' }
|
57
|
+
end
|
58
|
+
|
59
|
+
context "should handle per centum" do
|
60
|
+
string = 'acidum nitricum 70 per centum 537 mg, acidum aceticum glaciale 20.4 mg, acidum oxalicum dihydricum 58.6 mg, zinci nitras hexahydricus 6 mg, excipiens ad solutionem pro 1 ml'
|
61
|
+
composition = ParseComposition.from_string(string)
|
62
|
+
specify { expect(composition.source).to eq string}
|
63
|
+
specify { expect( composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum)" }
|
64
|
+
end
|
65
|
+
|
66
|
+
context "should handle Praeparatio sicca and polysorbatum" do
|
67
|
+
string = 'Praeparatio sicca cum solvens: praeparatio sicca: albiglutidum 66.95 mg, trehalosum dihydricum, mannitolum, dinatrii phosphas anhydricus, natrii dihydrogenophosphas monohydricus, polysorbatum 80, solvens: aqua ad iniectabilia 0.65 ml pro vitro'
|
68
|
+
composition = ParseComposition.from_string(string)
|
69
|
+
specify { expect(composition.source).to eq string}
|
70
|
+
specify { expect( composition.substances.first.name).to eq "Albiglutidum)" }
|
71
|
+
specify { expect( composition.label).to eq "Praeparatio sicca cum solvens: praeparatio sicca:" }
|
72
|
+
end
|
73
|
+
|
74
|
+
context "should handle dose with +/-" do
|
75
|
+
string = 'enzephalitidis japanensis virus antigenum (Stamm: SA-14-2) 6.0 +/-1.2 µg, aluminium ut aluminii oxidum hydricum, kalii dihydrogenophosphas, dinatrii phosphas anhydricus, natrii chloridum, aqua q.s. ad solutionem pro 0.5 ml'
|
76
|
+
composition = ParseComposition.from_string(string)
|
77
|
+
specify { expect(composition.source).to eq string}
|
78
|
+
specify { expect( composition.substances.first.name).to eq "Enzephalitidis Japanensis Virus Antigenum (stamm: Sa-14-2)" }
|
79
|
+
specify { expect( composition.substances.first.dose.to_s).to eq '6.0 +/-1.2 µg/0.5 ml' }
|
80
|
+
end
|
81
|
+
|
82
|
+
context "should handle label Praeparatio cryodesiccata (Thrombin)" do
|
83
|
+
string = 'Praeparatio cryodesiccata (Thrombin): thrombinum humanum 500 U.I., natrii chloridum, natrii citras dihydricus, pro vitro'
|
84
|
+
composition = ParseComposition.from_string(string)
|
85
|
+
specify { expect(composition.source).to eq string}
|
86
|
+
specify { expect( composition.substances.first.name).to eq "Thrombinum Humanum" }
|
87
|
+
specify { expect( composition.label).to eq "Praeparatio cryodesiccata (Thrombin):" }
|
88
|
+
end
|
89
|
+
|
90
|
+
context "should handle '150 U.I. hFSH et 150 U.I. hLH'" do
|
91
|
+
string =
|
92
|
+
'Tela cum praeparatione (Panel 1): niccoli sulfas 0.16 mg, alcoholes adipis lanae 0.81 mg, neomycini sulfas 0.49 mg, kalii dichromas 44 µg, Cain-mix: benzocainum 0.364 mg, cinchocaini hydrochloridum 73 µg, tetracaini hydrochloridum 73 µg, Parfum-Mix: amylcinnamaldehydum 15 µg, isoeugenolum 15 µg, cinnamaldehydum 34 µg, eugenolum 34 µg, alcohol cinnamylicus 54 µg, hydroxycitronellalum 54 µg, geraniolum 70 µg, evernia prunastri 70 µg, colophonium 0.97 mg, E 320, E 321, Paraben-Mix: E 218 0.16 mg, E 214 0.16 mg, E 216 0.16 mg, butylis parahydroxybenzoas 0.16 mg, benzylis parahydroxybenzoas 0.16 mg, Negativ-Kontrolle, balsamum peruvianum 0.65 mg, ethylendiamini dihydrochloridum 41 µg, cobalti dichloridum 16 µg, excipiens pro praeparatione'
|
93
|
+
composition = ParseComposition.from_string(string)
|
94
|
+
specify { expect(composition.source).to eq string}
|
95
|
+
context "wrong name Benzocainum" do
|
96
|
+
specify { expect( composition.substances.first.name).to eq "Niccoli Sulfas" } # TODO: is not Benzocainum
|
97
|
+
end
|
98
|
+
specify { expect( composition.label).to eq "Tela cum praeparatione (Panel 1):" }
|
99
|
+
end
|
100
|
+
|
101
|
+
context "should handle '150 U.I. hFSH et 150 U.I. hLH'" do
|
102
|
+
string = 'Praeparatio cryodesiccata: menotropinum 150 U.I. hFSH et 150 U.I. hLH, gonadotropinum chorionicum 7-21 U.I. hCG, lactosum monohydricum, pro vitro'
|
103
|
+
composition = ParseComposition.from_string(string)
|
104
|
+
specify { expect(composition.source).to eq string}
|
105
|
+
specify { expect( composition.substances.first.name).to eq "Menotropinum" }
|
106
|
+
specify { expect( composition.substances.first.dose.to_s).to eq "150 U.I. hFSH et 150 U.I. hLH" }
|
107
|
+
end
|
108
|
+
|
109
|
+
context "should handle '&' and 'deklr.'" do
|
110
|
+
string = 'TM: cardiospermum halicacabum 100 mg, cetearyl octanoat & isopropylmyristat deklar., alcohol benzylicus, aqua q.s. ad unguentum pro'
|
111
|
+
composition = ParseComposition.from_string(string)
|
112
|
+
composition = ParseComposition.from_string('macrogoli 9 aether laurilicus 5 mg, ethanolum 50 mg')
|
113
|
+
specify { expect( composition.substances.first.name).to eq "Tm: Cardiospermum Halicacabum" }
|
114
|
+
end
|
115
|
+
|
116
|
+
context "should handle 'potenziert mit: excipiens pro compresso'" do
|
117
|
+
string = 'ambra grisea D6 30 mg, conium maculatum D3 30 mg, anamirta cocculus D4 210 mg, petroleum rectificatum D8 30 mg, potenziert mit: excipiens pro compresso'
|
118
|
+
composition = ParseComposition.from_string(string)
|
119
|
+
specify { expect(composition.source).to eq string}
|
120
|
+
specify { expect(composition.label).to eq nil }
|
121
|
+
specify { expect(composition.label_description).to eq nil }
|
122
|
+
specify { expect(composition.galenic_form).to eq nil }
|
123
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
124
|
+
specify { expect( composition.substances.first.name).to eq "Terra Silicea Spec." }
|
125
|
+
end
|
126
|
+
|
127
|
+
context "allow substancename with 'ethanol.'" do
|
128
|
+
string = "mandragora ethanol. decoctum D1 30 mg"
|
129
|
+
composition = ParseComposition.from_string(string)
|
130
|
+
specify { expect(composition.substances.size).to eq 1 }
|
131
|
+
specify { expect(composition.substances.first.name).to eq "Mandragora Ethanol. Decoctum D1" }
|
132
|
+
specify { expect(composition.substances.first.dose.to_s).to eq "30 mg" }
|
133
|
+
end
|
134
|
+
|
135
|
+
context "allow substance complicated, calculated dose '6.0 +/-1.2 µg'" do
|
136
|
+
string =
|
137
|
+
"piscis oleum 500 mg corresp. acida carboxylica omega-3 oligoinsaturata 150 mg ut acidum eicosapentaenoicum 90 mg et acidum docosahexaenoicum 60 mg, excipiens pro capsula"
|
138
|
+
composition = ParseComposition.from_string(string)
|
139
|
+
specify { expect(composition.substances.first.name).to eq 'Magnesii Aspartas Dihydricus' } # TODO:
|
140
|
+
specify { expect(composition.substances.first.chemical_substance.name).to eq 'Magnesium' } # TODO:
|
141
|
+
specify { expect(composition.substances.size).to eq 5 }
|
142
|
+
end
|
143
|
+
|
144
|
+
context "allow substance complicated, calculated dose '6.0 +/-1.2 µg'" do
|
145
|
+
string =
|
146
|
+
"enzephalitidis japanensis virus antigenum (Stamm: SA-14-2) 6.0 +/-1.2 µg, aluminium ut aluminii oxidum hydricum, kalii dihydrogenophosphas, dinatrii phosphas anhydricus, natrii chloridum, aqua q.s. ad solutionem pro 0.5 ml"
|
147
|
+
composition = ParseComposition.from_string(string)
|
148
|
+
specify { expect(composition.substances.first.name).to eq 'Magnesii Aspartas Dihydricus' }
|
149
|
+
specify { expect(composition.substances.first.chemical_substance.name).to eq 'Magnesium' }
|
150
|
+
specify { expect(composition.substances.size).to eq 5 }
|
151
|
+
end
|
152
|
+
end if RunFailingSpec
|
153
|
+
|
154
|
+
describe ParseComposition do
|
155
|
+
context "allow 2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)" do
|
156
|
+
string = "2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)"
|
157
|
+
composition = ParseComposition.from_string(string)
|
158
|
+
specify { expect(composition.substances.first.name).to eq "2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)" }
|
159
|
+
specify { expect(composition.substances.size).to eq 1 }
|
160
|
+
end
|
161
|
+
|
162
|
+
context "allow substancename with 90 % " do
|
163
|
+
string =
|
164
|
+
"acidum nitricum 70 per centum 580.66 mg, acidum aceticum glaciale 41.08 mg, acidum oxalicum dihydricum 57.32 mg, acidum lacticum 90 % 4.55 mg, cupri(II) nitras trihydricus 0.048 mg, excipiens ad solutionem pro 1 ml"
|
165
|
+
composition = ParseComposition.from_string(string)
|
166
|
+
specify { expect(composition.substances.size).to eq 5 }
|
167
|
+
substance = composition.substances.find{ |x| /lacticum/i.match(x.name) }
|
168
|
+
specify { expect(composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum" }
|
169
|
+
specify { expect(composition.substances.first.dose.to_s).to eq "580.66 mg/ml" }
|
170
|
+
specify { expect(substance.name).to eq 'Acidum Lacticum 90 %' }
|
171
|
+
specify { expect(substance.dose.to_s).to eq '4.55 mg/ml' }
|
172
|
+
end
|
173
|
+
context "allow substance with two corresp" do
|
174
|
+
string = "magnesii aspartas dihydricus 3.895 g corresp. magnesium 292 mg corresp. 12 mmol, arom.: bergamottae aetheroleum et alia, natrii cyclamas, saccharinum natricum, excipiens ad granulatum pro charta"
|
175
|
+
composition = ParseComposition.from_string(string)
|
176
|
+
context "with correct names" do
|
177
|
+
specify { expect(composition.substances.first.name).to eq 'Magnesii Aspartas Dihydricus' }
|
178
|
+
specify { expect(composition.substances.first.chemical_substance.name).to eq 'Magnesium' }
|
179
|
+
end
|
180
|
+
specify { expect(composition.substances.size).to eq 5 }
|
181
|
+
end
|
182
|
+
|
183
|
+
context "allow substances containing ut, corresp, arom," do
|
184
|
+
string =
|
185
|
+
"calcii carbonas 3 g corresp. calcium 1.2 g, cholecalciferolum 800 U.I. ut cholecalciferoli pulvis corresp. arom.: saccharinum, natrii cyclamas et alia, excipiens pro compresso"
|
186
|
+
composition = ParseComposition.from_string(string)
|
187
|
+
specify { expect(composition.substances.size).to eq 5 }
|
188
|
+
end
|
189
|
+
|
190
|
+
context "allow substances containing 'A + '" do
|
191
|
+
string = "sennosida 20 mg corresp. sennosida A + B calcica 12 mg, excipiens pro compresso obducto"
|
192
|
+
composition = ParseComposition.from_string(string)
|
193
|
+
specify { expect(composition.substances.size).to eq 1 }
|
194
|
+
specify { expect(composition.substances.first.name).to eq 'Sennosida' }
|
195
|
+
specify { expect(composition.substances.first.chemical_substance.name).to eq 'Sennosida A + B Calcica' }
|
196
|
+
end
|
197
|
+
|
198
|
+
context "allow substances separted by ', et'" do
|
199
|
+
string = "extractum spissum ex: echinaceae purpureae herbae recentis tinctura 1140 mg, ratio: 1:12, et echinaceae purpureae radicis recentis tinctura 60 mg, ratio: 1:11, excipiens pro compresso"
|
200
|
+
composition = ParseComposition.from_string(string)
|
201
|
+
specify { expect(composition.substances.size).to eq 2 }
|
202
|
+
end
|
203
|
+
|
204
|
+
context 'find kalium 40 mmol/l' do
|
205
|
+
string = "kalium 40 mmol/l, chloridum 194 mmol/l, natrium 154 mmol/l, aqua ad iniectabilia q.s. ad solutionem pro 1000 ml"
|
206
|
+
composition = ParseComposition.from_string(string)
|
207
|
+
specify { expect(composition.substances.size).to eq 3 }
|
208
|
+
specify { expect(composition.substances.first.name).to eq 'Kalium' }
|
209
|
+
specify { expect(composition.substances.first.dose.to_s).to eq "40 mmol/l/1000 ml" }
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'find corresp doses pro vase.' do
|
213
|
+
string = "farfarae folii recentis succus ratio: 1:0.68-0.95"
|
214
|
+
composition = ParseComposition.from_string(string)
|
215
|
+
specify { expect(composition.substances.size).to eq 1 }
|
216
|
+
specify { expect(composition.substances.last.name).to eq 'Farfarae Folii Recentis Succus' }
|
217
|
+
specify { expect(composition.substances.last.more_info).to eq "ratio: 1:0.68-0.95" }
|
218
|
+
end
|
219
|
+
|
220
|
+
context 'find corresp doses pro vase.' do
|
221
|
+
string = "doses pro vase 30/60"
|
222
|
+
composition = ParseComposition.from_string(string)
|
223
|
+
specify { expect( composition.substances.size).to eq 0 }
|
224
|
+
# specify { expect( composition.substances.first.name).to eq 'Doses pro Vase' } # TODO: must be found somewher eles
|
225
|
+
# specify { expect( composition.substances.first.dose.to_s).to eq '30/60' }
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'find corresp. ca.' do
|
229
|
+
string = "sal ems 100 % m/m, corresp. ca., natrium 308.7 mg/g"
|
230
|
+
composition = ParseComposition.from_string(string)
|
231
|
+
specify { expect(composition.substances.size).to eq 1 }
|
232
|
+
specify { expect(composition.substances.last.name).to eq 'Sal Ems' }
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'find correct result Solvens (i.m.)' do
|
236
|
+
string = "Solvens (i.v.): aqua ad iniectabilia 5 ml, corresp. 20 mg, pro 5 ml"
|
237
|
+
composition = ParseComposition.from_string(string)
|
238
|
+
specify { expect(composition.substances.first).to eq nil }
|
239
|
+
end
|
240
|
+
|
241
|
+
context 'find correct result for dose 1 Mio U.I.' do
|
242
|
+
string = "phenoxymethylpenicillinum kalicum 1 Mio U.I., conserv.: E 200, excipiens pro compresso obducto"
|
243
|
+
composition = ParseComposition.from_string(string)
|
244
|
+
specify { expect(composition.substances.size).to eq 2 }
|
245
|
+
specify { expect(composition.substances.first.name).to eq 'Phenoxymethylpenicillinum Kalicum' }
|
246
|
+
specify { expect(composition.substances.first.dose.to_s).to eq '1 Mio U.I.' }
|
247
|
+
specify { expect(composition.substances.last.name).to eq 'E 200' }
|
248
|
+
end
|
249
|
+
|
250
|
+
context 'find dose with max.' do
|
251
|
+
string = "residui: formaldehydum max. 100 µg"
|
252
|
+
composition = ParseComposition.from_string(string)
|
253
|
+
specify { expect(composition.substances.size).to eq 1 }
|
254
|
+
specify { expect(composition.substances.last.name).to eq 'Formaldehydum' }
|
255
|
+
end
|
256
|
+
|
257
|
+
context 'handle Corresp. 4000 kJ.' do
|
258
|
+
composition = ParseComposition.from_string('Corresp. 4000 kJ.')
|
259
|
+
specify { expect(composition.substances.size).to eq 0 }
|
260
|
+
specify { expect(composition.corresp).to eq '4000 kJ' }
|
261
|
+
end
|
262
|
+
|
263
|
+
context 'handle dose dose with g/dm²' do
|
264
|
+
string = 'Tela cum unguento 14 g/dm²'
|
265
|
+
composition = ParseComposition.from_string(string)
|
266
|
+
specify { expect(composition.substances.size).to eq 1 }
|
267
|
+
specify { expect(composition.substances.first.dose.to_s).to eq '14 g/dm²' }
|
268
|
+
specify { expect(composition.substances.first.name).to eq 'Tela Cum Unguento' }
|
269
|
+
end
|
270
|
+
|
271
|
+
context 'handle dose 2*10^9 CFU,' do
|
272
|
+
string = 'saccharomyces boulardii cryodesiccatus 250 mg corresp. cellulae vivae 2*10^9 CFU, excipiens pro capsula'
|
273
|
+
composition = ParseComposition.from_string(string)
|
274
|
+
specify { expect(composition.substances.size).to eq 1 }
|
275
|
+
specify { expect(composition.substances.first.chemical_substance.dose.to_s).to eq '2*10^9 CFU' }
|
276
|
+
specify { expect(composition.substances.first.name).to eq 'Saccharomyces Boulardii Cryodesiccatus' }
|
277
|
+
end
|
278
|
+
|
279
|
+
context 'handle dose followed by ratio' do
|
280
|
+
# 43996 1 Keppur, Salbe
|
281
|
+
string = "symphyti radicis recentis extractum ethanolicum liquidum 280 mg ratio: 1:3-4"
|
282
|
+
composition = ParseComposition.from_string(string)
|
283
|
+
specify { expect(composition.substances.size).to eq 1 }
|
284
|
+
specify { expect(composition.substances.first.name).to eq 'Symphyti Radicis Recentis Extractum Ethanolicum Liquidum' }
|
285
|
+
end
|
286
|
+
|
287
|
+
context 'find correct result Überzug: E 132' do
|
288
|
+
# 16863 1 Salvia Wild, Tropfen
|
289
|
+
string = "olanzapinum 15 mg, Überzug: E 132, excipiens pro compresso obducto."
|
290
|
+
composition = ParseComposition.from_string(string)
|
291
|
+
specify { expect(composition.substances.size).to eq 2 }
|
292
|
+
specify { expect(composition.substances.first.name).to eq 'Olanzapinum' }
|
293
|
+
specify { expect(composition.substances.last.name).to eq 'E 132' }
|
294
|
+
specify { expect(composition.substances.last.more_info).to eq 'Überzug' }
|
295
|
+
end
|
296
|
+
|
297
|
+
context "should handle ut followed by corresp. " do
|
298
|
+
# 65302 1 Exviera 250 mg, Filmtabletten
|
299
|
+
string = 'dasabuvirum 250 mg ut dasabuvirum natricum corresp. dasabuvirum natricum monohydricum 270.26 mg, excipiens pro compresso obducto'
|
300
|
+
composition = ParseComposition.from_string(string)
|
301
|
+
specify { expect(composition.label).to eq nil }
|
302
|
+
specify { expect(composition.label_description).to eq nil }
|
303
|
+
specify { expect(composition.substances.size).to eq 1 }
|
304
|
+
specify { expect(composition.substances.first.name).to eq 'Dasabuvirum' }
|
305
|
+
specify { expect(composition.substances.first.salts.size).to eq 1 }
|
306
|
+
specify { expect(composition.substances.first.salts.first.name).to eq 'Dasabuvirum Natricum Monohydricum' }
|
307
|
+
end
|
308
|
+
|
309
|
+
context 'find correct result for ut excipiens' do
|
310
|
+
# 16863 1 Salvia Wild, Tropfen
|
311
|
+
string = "drospirenonum 3 mg, ethinylestradiolum 20 µg ut excipiens pro compresso obducto"
|
312
|
+
composition = ParseComposition.from_string(string)
|
313
|
+
specify { expect(composition.substances.size).to eq 2 }
|
314
|
+
specify { expect(composition.substances.last.name).to eq 'Ethinylestradiolum' }
|
315
|
+
end
|
316
|
+
|
317
|
+
context 'find correct result compositions for DER: followed by corresp.' do
|
318
|
+
# 16863 1 Salvia Wild, Tropfen
|
319
|
+
string = "salviae extractum ethanolicum liquidum, DER: 1:4.2-5.0 corresp. ethanolum 40 % V/V"
|
320
|
+
composition = ParseComposition.from_string(string)
|
321
|
+
specify { expect(composition.substances.size).to eq 2 }
|
322
|
+
specify { expect(composition.substances.last.name).to eq 'DER: 1:4.2-5.0' }
|
323
|
+
end
|
324
|
+
|
325
|
+
context 'find correct result compositions for 00613 Pentavac' do
|
326
|
+
line_1 = "I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum tetani 40 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg, virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U., virus poliomyelitis typus 2 inactivatum (D-Antigen) 8 U., virus poliomyelitis typus 3 inactivatum (D-Antigen) 32 U., aluminium ut aluminii hydroxidum hydricum ad adsorptionem, formaldehydum 10 µg, conserv.: phenoxyethanolum 2.5 µl, residui: neomycinum, streptomycinum, polymyxini B sulfas, medium199, aqua q.s. ad suspensionem pro 0.5 ml."
|
327
|
+
line_2 = "II) Hib-Komponente (Lyophilisat): haemophilus influenzae Typ B polysaccharida T-conjugatum 10 µg, trometamolum, saccharum, pro praeparatione."
|
328
|
+
txt = "#{line_1}\n#{line_2}"
|
329
|
+
composition = ParseComposition.from_string(line_1)
|
330
|
+
composition = ParseComposition.from_string(line_2)
|
331
|
+
info = ParseUtil.parse_compositions(txt)
|
332
|
+
|
333
|
+
specify { expect(info.first.label).to eq 'I' }
|
334
|
+
specify { expect(info.size).to eq 2 }
|
335
|
+
specify { expect(info.first.substances.size).to eq 14 }
|
336
|
+
toxoidum = info.first.substances.find{ |x| x.name.match(/Toxoidum Diphtheriae/i) }
|
337
|
+
specify { expect(toxoidum.class).to eq Struct::ParseSubstance }
|
338
|
+
if toxoidum
|
339
|
+
specify { expect(toxoidum.name).to eq 'Toxoidum Diphtheriae' }
|
340
|
+
specify { expect(toxoidum.qty.to_f).to eq 30.0 }
|
341
|
+
specify { expect(toxoidum.unit).to eq 'U.I./0.5 ml' }
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
context 'find correct result compositions for fluticasoni with chemical_dose' do
|
346
|
+
string = 'fluticasoni-17 propionas 100 µg, lactosum monohydricum q.s. ad pulverem pro 25 mg.'
|
347
|
+
composition = ParseComposition.from_string(string)
|
348
|
+
specify { expect(composition.substances.size).to eq 2 }
|
349
|
+
fluticasoni = composition.substances.find{ |x| x.name.match(/Fluticasoni/i) }
|
350
|
+
specify { expect(fluticasoni.name).to eq 'Fluticasoni-17 Propionas' }
|
351
|
+
specify { expect(fluticasoni.qty.to_f).to eq 100.0 }
|
352
|
+
specify { expect(fluticasoni.unit).to eq 'µg/25 mg' }
|
353
|
+
specify { expect(fluticasoni.dose.to_s).to eq "100 µg/25 mg" }
|
354
|
+
lactosum = composition.substances.find{ |x| x.name.match(/Lactosum/i) }
|
355
|
+
specify { expect(lactosum.name).to eq "Lactosum Monohydricum" }
|
356
|
+
specify { expect(lactosum.dose.to_s).to eq "25 mg" }
|
357
|
+
end
|
358
|
+
|
359
|
+
context 'find correct result Solvens (i.m.)' do
|
360
|
+
string = "Solvens (i.m.): aqua ad iniectabilia 2 ml pro vitro"
|
361
|
+
composition = ParseComposition.from_string(string)
|
362
|
+
specify { expect(composition.substances.first.name).to eq 'aqua ad iniectabilia 2 Ml pro Vitro' }
|
363
|
+
end
|
364
|
+
|
365
|
+
context "should handle Iscador" do
|
366
|
+
# 56829 sequence 3 Iscador M
|
367
|
+
string = 'extractum aquosum liquidum fermentatum 0.05 mg ex viscum album (mali) recens 0.01 mg, natrii chloridum, aqua q.s. ad solutionem pro 1 ml.'
|
368
|
+
composition = ParseComposition.from_string(string)
|
369
|
+
viscum = composition.substances.find{ |x| x.name.match(/viscum/i) }
|
370
|
+
specify { expect(viscum.name).to eq 'Extractum Aquosum Liquidum Fermentatum 0.05 Mg Ex Viscum Album (mali) Recens' }
|
371
|
+
specify { expect(viscum.qty).to eq 0.01 } # 0.0001 mg/ml
|
372
|
+
specify { expect(viscum.unit).to eq 'mg/ml' } # 0.0001 mg/ml
|
373
|
+
specify { expect(viscum.dose.qty).to eq 0.01 } # 0.0001 mg/ml
|
374
|
+
specify { expect(viscum.dose.unit).to eq 'mg/ml' } # 0.0001 mg/ml
|
375
|
+
specify { expect(viscum.dose.to_s).to eq '0.01 mg/ml' } # 0.0001 mg/ml
|
376
|
+
specify { expect(composition.source).to eq string }
|
377
|
+
end
|
378
|
+
|
379
|
+
context 'find correct result compositions for poloxamerum' do
|
380
|
+
# 47657 1 Nanocoll, Markierungsbesteck
|
381
|
+
string = "I): albuminum humanum colloidale 0.5 mg, stanni(II) chloridum dihydricum 0.2 mg, glucosum anhydricum, dinatrii phosphas monohydricus, natrii fytas (9:1), poloxamerum 238, q.s. ad pulverem pro vitro."
|
382
|
+
composition = ParseComposition.from_string(string)
|
383
|
+
specify { expect(composition.substances.size).to eq 6 }
|
384
|
+
poloxamerum = composition.substances.find{ |x| x.name.match(/poloxamerum/i) }
|
385
|
+
skip { expect(poloxamerum.name).to eq 'Poloxamerum 238' }
|
386
|
+
skip { expect(poloxamerum.qty.to_f).to eq "" }
|
387
|
+
specify { expect(poloxamerum.unit).to eq nil }
|
388
|
+
end
|
389
|
+
|
390
|
+
context "should handle DER followed by corresp" do
|
391
|
+
# 54024 1 Nieren- und Blasendragées S
|
392
|
+
string = 'DER: 4-5:1, corresp. arbutinum 24-30 mg'
|
393
|
+
composition = ParseComposition.from_string(string)
|
394
|
+
specify { expect(composition.source).to eq string }
|
395
|
+
specify { expect(composition.label).to eq nil }
|
396
|
+
specify { expect(composition.label_description).to eq nil }
|
397
|
+
specify { expect(composition.substances.size).to eq 1 }
|
398
|
+
specify { expect(composition.substances.first.name).to eq 'DER: 4-5:1' }
|
399
|
+
specify { expect(composition.substances.first.chemical_substance.name).to eq 'Arbutinum' }
|
400
|
+
end
|
401
|
+
|
402
|
+
context "should handle 'A): macrogolum 3350 100 g'" do
|
403
|
+
# 57900 1 Moviprep, Pulver
|
404
|
+
string = 'A): macrogolum 3350 100 g, natrii sulfas anhydricus 7.5 g'
|
405
|
+
composition = ParseComposition.from_string(string)
|
406
|
+
specify { expect(composition.source).to eq string }
|
407
|
+
specify { expect(composition.label).to eq 'A' }
|
408
|
+
specify { expect(composition.label_description).to eq nil }
|
409
|
+
specify { expect(composition.substances.size).to eq 2 }
|
410
|
+
specify { expect(composition.substances.first.name).to eq 'Macrogolum 3350' }
|
411
|
+
specify { expect(composition.substances.first.qty).to eq 100 }
|
412
|
+
specify { expect(composition.substances.first.unit).to eq 'g' }
|
413
|
+
end
|
414
|
+
|
415
|
+
context "should able to handle a simple ratio" do
|
416
|
+
string = 'allii sativi maceratum oleosum 270 mg, ratio: 1:10, excipiens pro capsula.'
|
417
|
+
composition = ParseComposition.from_string(string)
|
418
|
+
specify { expect(composition.source).to eq string }
|
419
|
+
specify { expect(composition.substances.size).to eq 1 }
|
420
|
+
specify { expect(composition.substances.first.name).to eq 'Allii Sativi Maceratum Oleosum' }
|
421
|
+
specify { expect(composition.substances.first.more_info).to eq 'ratio: 1:10' }
|
422
|
+
end
|
423
|
+
|
424
|
+
context "should able to handle multiple ratio" do
|
425
|
+
# 25273 1 Schoenenberger naturreiner Heilpflanzensaft, Thymian
|
426
|
+
string = 'thymi herbae recentis extractum aquosum liquidum, ratio: 1:1.5-2.4.'
|
427
|
+
composition = ParseComposition.from_string(string)
|
428
|
+
specify { expect(composition.source).to eq string }
|
429
|
+
specify { expect(composition.substances.size).to eq 1 }
|
430
|
+
specify { expect(composition.substances.first.name).to eq 'Thymi Herbae Recentis Extractum Aquosum Liquidum' }
|
431
|
+
specify { expect(composition.substances.first.more_info).to eq 'ratio: 1:1.5-2.4' }
|
432
|
+
end
|
433
|
+
|
434
|
+
context "should handles lines containing V): mannitolum 40 mg pro dosi" do
|
435
|
+
string = 'V): mannitolum 40 mg pro dosi'
|
436
|
+
composition = ParseComposition.from_string(string)
|
437
|
+
specify { expect(composition.source).to eq string }
|
438
|
+
specify { expect(composition.label).to eq 'V' }
|
439
|
+
specify { expect(composition.substances.size).to eq 1 }
|
440
|
+
end
|
441
|
+
|
442
|
+
|
443
|
+
context "should skip lines containing I) et II)" do
|
444
|
+
skip { "should skip lines containing I) et II)"
|
445
|
+
string = 'I) et II) et III) corresp.: aminoacida 48 g/l, carbohydrata 150 g/l, materia crassa 50 g/l, in emulsione recenter mixta 1250 ml'
|
446
|
+
composition = ParseComposition.from_string(string)
|
447
|
+
specify { expect(composition.source).to eq string }
|
448
|
+
specify { expect(composition.substances.size).to eq 0 }
|
449
|
+
}
|
450
|
+
end
|
451
|
+
|
452
|
+
context "should treat correctly CFU units" do
|
453
|
+
# 56015 Perskindol Cool avec consoude, gel
|
454
|
+
string = 'lactobacillus acidophilus cryodesiccatus min. 10^9 CFU'
|
455
|
+
composition = ParseComposition.from_string(string)
|
456
|
+
specify { expect(composition.substances.first.name).to eq 'Lactobacillus Acidophilus Cryodesiccatus' }
|
457
|
+
specify { expect(composition.substances.first.qty).to eq '10^9' }
|
458
|
+
specify { expect(composition.substances.first.unit).to eq 'CFU' }
|
459
|
+
end
|
460
|
+
|
461
|
+
context "should pass several () inside a name" do
|
462
|
+
composition = nil
|
463
|
+
strings = [
|
464
|
+
'a(eine klammer) und nachher',
|
465
|
+
'(eine klammer) und nachher',
|
466
|
+
'haemagglutininum influenzae A (eine klammer)' ,
|
467
|
+
'haemagglutininum influenzae A (eine klammer) und nachher' ,
|
468
|
+
'haemagglutininum influenzae A (H1N1) (in Klammer)' ,
|
469
|
+
'haemagglutininum influenzae A (H1N1) or (H5N3) (in Klammer) more' ,
|
470
|
+
'haemagglutininum influenzae A (H1N1) eins (second) even more' ,
|
471
|
+
'ab (H1N1)-like: dummy',
|
472
|
+
'Virus-Stamm A/California/7/2009 (H1N1)-like: reassortant virus NYMC X-179A',
|
473
|
+
'haemagglutininum influenzae A (H1N1) (Virus-Stamm A/California/7/2009 (H1N1)-like: reassortant virus NYMC X-179A)',
|
474
|
+
].each { |string|
|
475
|
+
composition = ParseComposition.from_string(string)
|
476
|
+
}
|
477
|
+
composition = ParseComposition.from_string(strings.last + ' 15 µg')
|
478
|
+
specify { expect(composition.substances.first.name.downcase).to eq strings.last.downcase }
|
479
|
+
specify { expect(composition.substances.first.qty).to eq 15 }
|
480
|
+
specify { expect(composition.substances.first.unit).to eq 'µg' }
|
481
|
+
end
|
482
|
+
|
483
|
+
context "should emit correct unit when excipiens contains pro X ml" do
|
484
|
+
string = 'glatiramerum acetas 20 mg corresp. glatiramerum 18 mg, mannitolum, aqua ad iniectabilia q.s. ad solutionem pro 0.5 ml.'
|
485
|
+
composition = ParseComposition.from_string(string)
|
486
|
+
specify { expect(composition.substances.first.name).to eq 'Glatiramerum Acetas' }
|
487
|
+
specify { expect(composition.substances.first.qty).to eq 20 }
|
488
|
+
specify { expect(composition.substances.first.unit).to eq 'mg/0.5 ml' }
|
489
|
+
specify { expect(composition.substances.first.chemical_substance.unit).to eq 'mg/0.5 ml' }
|
490
|
+
specify { expect(composition.substances.first.chemical_substance.name).to eq 'Glatiramerum' }
|
491
|
+
specify { expect(composition.substances.first.chemical_substance.qty).to eq 18 }
|
492
|
+
specify { expect(composition.substances.first.chemical_substance.unit).to eq 'mg/0.5 ml' }
|
493
|
+
end
|
494
|
+
|
495
|
+
context "should handle substance with a range" do
|
496
|
+
string = 'glyceroli monostearas 40-55'
|
497
|
+
composition = ParseComposition.from_string(string)
|
498
|
+
specify { expect(composition.substances.size).to eq 1 }
|
499
|
+
specify { expect(composition.substances.first.name).to eq 'Glyceroli Monostearas' }
|
500
|
+
specify { expect(composition.substances.first.dose.to_s).to eq '40-55' }
|
501
|
+
end
|
502
|
+
|
503
|
+
context "should handle mineralia with alia" do
|
504
|
+
string = 'mineralia: calcium 160 ut alia: ginseng extractum 50 mg'
|
505
|
+
composition = ParseComposition.from_string(string)
|
506
|
+
specify { expect(composition.substances.size).to eq 2 }
|
507
|
+
specify { expect(composition.substances.first.salts.size).to eq 0 }
|
508
|
+
specify { expect(composition.substances.first.name).to eq 'Calcium' } # TODO:
|
509
|
+
specify { expect(composition.substances.last.name).to eq 'Ginseng Extractum' } # TODO:
|
510
|
+
# TODO: specify { expect(composition.substances.first.dose.to_s).to eq '9 g/L 5 ml' }
|
511
|
+
end
|
512
|
+
|
513
|
+
context "should handle mineralia" do
|
514
|
+
string = 'mineralia: calcium 160 mg ut magnesium 120 mg ut ferrum 5.6 mg ut cuprum 1 mg ut manganum 1.4 mg ut iodum 60 µg ut molybdenum 60 µg'
|
515
|
+
composition = ParseComposition.from_string(string)
|
516
|
+
specify { expect(composition.substances.size).to eq 1 }
|
517
|
+
specify { expect(composition.substances.first.more_info).to eq "mineralia" }
|
518
|
+
specify { expect(composition.substances.first.salts.size).to eq 6 }
|
519
|
+
specify { expect(composition.substances.first.salts.first.name).to eq 'Magnesium' }
|
520
|
+
specify { expect(composition.substances.first.salts.first.qty).to eq 120.0 }
|
521
|
+
specify { expect(composition.substances.first.salts.first.unit).to eq 'mg' }
|
522
|
+
specify { expect(composition.substances.first.name).to eq 'Calcium' } # TODO:
|
523
|
+
# TODO: specify { expect(composition.substances.first.dose.to_s).to eq '9 g/L 5 ml' }
|
524
|
+
end
|
525
|
+
|
526
|
+
context "should handle solvens" do
|
527
|
+
string = 'Solvens: natrii chloridi solutio 9 g/L 5 ml.'
|
528
|
+
composition = ParseComposition.from_string(string)
|
529
|
+
specify { expect(composition.substances.size).to eq 1 }
|
530
|
+
specify { expect(composition.substances.first.more_info).to eq "Solvens" }
|
531
|
+
specify { expect(composition.substances.first.name).to eq 'Natrii Chloridi Solutio 9 G/l 5 Ml' } # TODO:
|
532
|
+
# TODO: specify { expect(composition.substances.first.dose.to_s).to eq '9 g/L 5 ml' }
|
533
|
+
end
|
534
|
+
|
535
|
+
context "should parse a complex composition" do
|
536
|
+
string = 'globulina equina (immunisé avec coeur) 8 mg'
|
537
|
+
string = 'globulina equina (immunisé avec coeur, tissu pulmonaire, reins de porcins) 8 mg'
|
538
|
+
composition = ParseComposition.from_string(string)
|
539
|
+
specify { expect(composition.substances.size).to eq 1 }
|
540
|
+
globulina = composition.substances.find{ |x| /globulina/i.match(x.name) }
|
541
|
+
specify { expect(globulina.name).to eq 'Globulina Equina (immunisé Avec Coeur, Tissu Pulmonaire, Reins De Porcins)' }
|
542
|
+
end
|
543
|
+
|
544
|
+
context "should return correct composition for containing '(acarus siro)" do
|
545
|
+
string = "acari allergeni extractum (acarus siro) 50'000 U., conserv.: phenolum, excipiens ad solutionem pro 1 ml."
|
546
|
+
composition = ParseComposition.from_string(string)
|
547
|
+
specify { expect(composition.source).to eq string }
|
548
|
+
specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 3 : 2 } # got only 1
|
549
|
+
specify { expect(composition.substances.first.more_info).to eq nil }
|
550
|
+
specify { expect(composition.substances.first.name).to eq 'Acari Allergeni Extractum (acarus Siro)' }
|
551
|
+
specify { expect(composition.substances.last.name).to eq 'Phenolum' } # was Acari Allergeni Extractum (acarus Siro)
|
552
|
+
specify { expect(composition.substances.last.more_info).to match 'conserv' }
|
553
|
+
end
|
554
|
+
|
555
|
+
context "should return correct composition for containing 'A): acari allergeni extractum 50 U' (IKSNR 60606)" do
|
556
|
+
# Novo-Helisen Depot D. farinae/D. pteronyssinus Kombipackung 1-3, Injektionssuspension
|
557
|
+
string =
|
558
|
+
'A): acari allergeni extractum 50 U.: dermatophagoides farinae 50 % et dermatophagoides pteronyssinus 50 %, aluminium ut aluminii hydroxidum hydricum ad adsorptionem, natrii chloridum, conserv.: phenolum 4.0 mg, aqua q.s. ad suspensionem pro 1 ml.'
|
559
|
+
composition = ParseComposition.from_string(string)
|
560
|
+
composition.label_description
|
561
|
+
specify { expect(composition.label).to eq "A" }
|
562
|
+
specify { expect(composition.label_description).to eq "acari allergeni extractum 50 U." }
|
563
|
+
specify { expect(composition.source).to eq string }
|
564
|
+
specify { expect(composition.substances.size).to eq 5 }
|
565
|
+
pteronyssinus = composition.substances.find{ |x| /pteronyssinus/i.match(x.name) }
|
566
|
+
specify { expect(composition.substances.first.name).to eq 'Dermatophagoides Farinae' }
|
567
|
+
specify { expect(pteronyssinus.name).to eq 'Dermatophagoides Pteronyssinus' }
|
568
|
+
specify { expect(pteronyssinus.more_info).to eq nil }
|
569
|
+
end
|
570
|
+
|
571
|
+
context "should return correct composition for containing 'virus rabiei inactivatum" do
|
572
|
+
string = 'Praeparatio cryodesiccata: virus rabiei inactivatum (Stamm: Wistar Rabies PM/WI 38-1503-3M) min. 2.5 U.I.'
|
573
|
+
composition = ParseComposition.from_string(string)
|
574
|
+
specify { expect(composition.source).to eq string }
|
575
|
+
specify { expect(composition.substances.size).to eq 1 }
|
576
|
+
specify { expect(composition.substances.first.name).to eq "Virus Rabiei Inactivatum (stamm: Wistar Rabies Pm/wi 38-1503-3m)" }
|
577
|
+
specify { expect(composition.substances.first.qty).to eq 2.5 }
|
578
|
+
specify { expect(composition.substances.first.unit).to eq 'U.I.' }
|
579
|
+
specify { expect(composition.label).to eq "Praeparatio cryodesiccata:" }
|
580
|
+
end
|
581
|
+
|
582
|
+
context "should return correct composition for containing Histamin Equivalent Pric. (e.g IKSNR 58566)" do
|
583
|
+
# 58566 1 Soluprick SQ Phleum pratense, Lösung
|
584
|
+
string = 'pollinis allergeni extractum (Phleum pratense) 10 U., natrii chloridum, phenolum, glycerolum, aqua ad iniectabilia q.s. ad solutionem pro 1 ml, U = Histamin Equivalent Prick.'
|
585
|
+
composition = ParseComposition.from_string(string)
|
586
|
+
specify { expect(composition.source).to eq string }
|
587
|
+
specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 5 : 4 }
|
588
|
+
specify { expect(composition.substances.first.name).to eq 'Pollinis Allergeni Extractum (phleum Pratense)' }
|
589
|
+
end
|
590
|
+
|
591
|
+
if RunExcipiensTest
|
592
|
+
context "should handle aqua ad iniectabilia" do
|
593
|
+
string = "aqua ad iniectabilia q.s. ad solutionem pro 5 ml"
|
594
|
+
composition = ParseComposition.from_string(string)
|
595
|
+
substance = composition.substances.first
|
596
|
+
if ExcipiensIs_a_Substance
|
597
|
+
specify { expect(substance.name).to eq 'aqua ad iniectabilia q.s. ad solutionem' }
|
598
|
+
specify { expect(substance.chemical_substance).to eq nil }
|
599
|
+
specify { expect(substance.qty).to eq 5.0}
|
600
|
+
specify { expect(substance.unit).to eq 'ml' }
|
601
|
+
else
|
602
|
+
specify { expect(substance).to eq nil }
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
context "should return correct substance for 'excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V'" do
|
607
|
+
string = "excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V"
|
608
|
+
composition = ParseComposition.from_string(string)
|
609
|
+
substance = composition.substances.first
|
610
|
+
if ExcipiensIs_a_Substance
|
611
|
+
# TODO: what should we report here? dose = pro 1 ml or 59.5 % V/V, chemical_substance = ethanolum?
|
612
|
+
# or does it only make sense as part of a composition?
|
613
|
+
specify { expect(substance.name).to eq 'Ethanolum' }
|
614
|
+
specify { expect(substance.cdose).to eq nil }
|
615
|
+
specify { expect(substance.qty).to eq 59.5}
|
616
|
+
specify { expect(substance.unit).to eq '% V/V' }
|
617
|
+
else
|
618
|
+
specify { expect(substance).to eq nil }
|
619
|
+
end
|
620
|
+
end
|
621
|
+
|
622
|
+
context "should return correct composition for 'excipiens ad emulsionem'" do
|
623
|
+
string = 'excipiens ad emulsionem pro 1 g"'
|
624
|
+
composition = ParseComposition.from_string(string)
|
625
|
+
substance = composition.substances.first
|
626
|
+
if ExcipiensIs_a_Substance
|
627
|
+
specify { expect(composition.source).to eq string }
|
628
|
+
specify { expect(composition.substances.size).to eq 0 }
|
629
|
+
else
|
630
|
+
specify { expect(substance).to eq nil }
|
631
|
+
end
|
632
|
+
end
|
633
|
+
|
634
|
+
context "should return correct substance for 'excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V'" do
|
635
|
+
string = "excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V"
|
636
|
+
composition = ParseComposition.from_string(string)
|
637
|
+
substance = composition.substances.first
|
638
|
+
if ExcipiensIs_a_Substance
|
639
|
+
specify { expect(substance.name).to eq 'Excipiens' }
|
640
|
+
specify { expect(substance.chemical_substance.name).to eq 'Ethanolum' }
|
641
|
+
specify { expect(substance.cdose.to_s).to eq ParseDose.new('59.5', '% V/V').to_s }
|
642
|
+
specify { expect(substance.qty).to eq 1.0}
|
643
|
+
specify { expect(substance.unit).to eq 'ml' }
|
644
|
+
else
|
645
|
+
specify { expect(substance).to eq nil }
|
646
|
+
end
|
647
|
+
end
|
648
|
+
|
649
|
+
context "should return correct substance for 'aqua q.s. ad suspensionem pro 0.5 ml'" do
|
650
|
+
string = "aqua q.s. ad suspensionem pro 0.5 ml"
|
651
|
+
composition = ParseComposition.from_string(string)
|
652
|
+
if ExcipiensIs_a_Substance
|
653
|
+
substance = composition.substances.first
|
654
|
+
specify { expect(substance.name).to eq 'aqua q.s. ad suspensionem' }
|
655
|
+
specify { expect(substance.qty).to eq 0.5}
|
656
|
+
specify { expect(substance.unit).to eq 'ml' }
|
657
|
+
else
|
658
|
+
specify { expect(substance).to eq nil }
|
659
|
+
end
|
660
|
+
end
|
661
|
+
|
662
|
+
context "should return correct substance for 'excipiens ad solutionem pro 3 ml corresp. 50 µg'" do
|
663
|
+
string = "excipiens ad solutionem pro 3 ml corresp. 50 µg"
|
664
|
+
composition = ParseComposition.from_string(string)
|
665
|
+
substance = composition.substances.first
|
666
|
+
if ExcipiensIs_a_Substance
|
667
|
+
specify { expect(substance.name).to eq 'Excipiens' }
|
668
|
+
specify { expect(substance.qty).to eq 3.0}
|
669
|
+
specify { expect(substance.unit).to eq 'ml' }
|
670
|
+
specify { expect(substance.cdose.qty).to eq 50.0}
|
671
|
+
specify { expect(substance.cdose.unit).to eq 'µg' }
|
672
|
+
else
|
673
|
+
specify { expect(substance).to eq nil}
|
674
|
+
end
|
675
|
+
end
|
676
|
+
|
677
|
+
context "should return correct substance for 'excipiens ad pulverem pro 1000 mg'" do
|
678
|
+
string = "excipiens ad pulverem pro 1000 mg"
|
679
|
+
CompositionTransformer.clear_substances
|
680
|
+
composition = ParseComposition.from_string(string)
|
681
|
+
substance = composition.substances.first
|
682
|
+
if ExcipiensIs_a_Substance
|
683
|
+
specify { expect(substance.name).to eq 'Excipiens' }
|
684
|
+
specify { expect(substance.qty).to eq 1000.0 }
|
685
|
+
specify { expect(substance.unit).to eq 'mg' }
|
686
|
+
else
|
687
|
+
specify { expect(substance).to eq nil }
|
688
|
+
end
|
689
|
+
end
|
690
|
+
end
|
691
|
+
context "should pass with 'etinoli 7900 U.I'" do
|
692
|
+
string = "retinoli 7900 U.I."
|
693
|
+
composition = ParseComposition.from_string(string)
|
694
|
+
specify { expect(composition.source).to eq string }
|
695
|
+
specify { expect(composition.substances.size).to eq 1 }
|
696
|
+
specify { expect(composition.substances.first.qty).to eq 7900.0 }
|
697
|
+
specify { expect(composition.substances.first.unit).to eq 'U.I.' }
|
698
|
+
specify { expect(composition.substances.first.name).to eq 'Retinoli' }
|
699
|
+
end
|
700
|
+
|
701
|
+
context "should return correct composition for containing 'absinthii herba 1.2 g pro charta" do
|
702
|
+
string = "absinthii herba 1.2 g pro charta"
|
703
|
+
composition = ParseComposition.from_string(string)
|
704
|
+
specify { expect(composition.source).to eq string }
|
705
|
+
specify { expect(composition.substances.size).to eq 1 }
|
706
|
+
specify { expect(composition.substances.first.name).to eq 'Absinthii Herba' }
|
707
|
+
end
|
708
|
+
|
709
|
+
context "should return correct composition for containing 'ad pulverem'" do
|
710
|
+
string = "pimpinellae radix 15 % ad pulverem"
|
711
|
+
composition = ParseComposition.from_string(string)
|
712
|
+
specify { expect(composition.source).to eq string }
|
713
|
+
specify { expect(composition.substances.size).to eq 1 }
|
714
|
+
specify { expect(composition.substances.first.name).to eq 'Pimpinellae Radix' }
|
715
|
+
end
|
716
|
+
|
717
|
+
context "should return correct composition for 'DER: 6:1'" do
|
718
|
+
string = "DER: 6:1"
|
719
|
+
composition = ParseComposition.from_string(string)
|
720
|
+
specify { expect(composition.source).to eq string }
|
721
|
+
specify { expect(composition.substances.size).to eq 1 }
|
722
|
+
specify { expect(composition.substances.first.name).to eq string }
|
723
|
+
end
|
724
|
+
|
725
|
+
context "should return correct composition for containing ' ut procaini hydrochloridum" do
|
726
|
+
string =
|
727
|
+
'procainum 10 mg ut procaini hydrochloridum'
|
728
|
+
composition = ParseComposition.from_string(string)
|
729
|
+
specify { expect(composition.source).to eq string }
|
730
|
+
specify { expect(composition.substances.size).to eq 1 }
|
731
|
+
specify { expect(composition.substances.first.name).to eq 'Procainum' }
|
732
|
+
specify { expect(composition.substances.first.salts.first.name).to eq 'Procaini Hydrochloridum' }
|
733
|
+
end
|
734
|
+
|
735
|
+
context "should return correct composition for containing 'ad pulverem'" do
|
736
|
+
string =
|
737
|
+
#"absinthii herba 15 %, anisi fructus 15 %, carvi fructus 15 %, foeniculi fructus 15 %, iuniperi pseudofructus 10 %, millefolii herba 15 %, pimpinellae radix 15 % ad pulverem.\n"
|
738
|
+
"pimpinellae radix 15 % ad pulverem.\n"
|
739
|
+
composition = ParseComposition.from_string(string)
|
740
|
+
specify { expect(composition.source).to eq string }
|
741
|
+
specify { expect(composition.substances.size).to eq 1 }
|
742
|
+
specify { expect(composition.substances.first.name).to eq 'Pimpinellae Radix' }
|
743
|
+
specify { expect(composition.substances.first.qty).to eq 15.0 }
|
744
|
+
specify { expect(composition.substances.first.unit).to eq '%' }
|
745
|
+
end
|
746
|
+
|
747
|
+
context "should return correct composition for containing 'excipiens ad globulos" do
|
748
|
+
string =
|
749
|
+
"abrus precatorius C6, aconitum napellus C6, atropa belladonna C6, calendula officinalis C6, chelidonium majus C6, viburnum opulus C6 ana partes, excipiens ad globulos.\n"
|
750
|
+
composition = ParseComposition.from_string(string)
|
751
|
+
specify { expect(composition.source).to eq string }
|
752
|
+
specify { expect(composition.substances.size).to eq 6 }
|
753
|
+
specify { expect(composition.substances.first.name).to eq 'Abrus Precatorius C6' }
|
754
|
+
end
|
755
|
+
|
756
|
+
context "should return correct composition for containing 'arom.: E 104'" do
|
757
|
+
string = 'gentianae radix 12 mg, primulae flos 36 mg, rumicis acetosae herba 36 mg, sambuci flos 36 mg, verbenae herba 36 mg, color.: E 104 et E 132, excipiens pro compresso obducto.'
|
758
|
+
composition = ParseComposition.from_string(string)
|
759
|
+
specify { expect(composition.source).to eq string }
|
760
|
+
specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 8 : 7 }
|
761
|
+
e104 = composition.substances.find{ |x| x.name.eql?('E 104') }
|
762
|
+
|
763
|
+
specify { expect(e104.name).to eq 'E 104' }
|
764
|
+
specify { expect(composition.substances.first.name).to eq 'Gentianae Radix' }
|
765
|
+
end
|
766
|
+
|
767
|
+
context "should return correct composition for containing 'color.: E 160(a)'" do
|
768
|
+
string = 'color.: E 160(a), E 171'
|
769
|
+
composition = ParseComposition.from_string(string)
|
770
|
+
specify { expect(composition.source).to eq string }
|
771
|
+
specify { expect(composition.substances.size).to eq 2 }
|
772
|
+
specify { expect(composition.substances.first.name).to eq 'E 160(a)' }
|
773
|
+
specify { expect(composition.substances.last.name).to eq 'E 171' }
|
774
|
+
end
|
775
|
+
|
776
|
+
|
777
|
+
if RunMostImportantParserTests
|
778
|
+
|
779
|
+
context "should parse a Praeparatio with a label/galenic form?" do
|
780
|
+
string = "Praeparatio cryodesiccata: pollinis allergeni extractum 25'000 U.: urtica dioica"
|
781
|
+
composition = ParseComposition.from_string(string)
|
782
|
+
substance = composition.substances.first
|
783
|
+
# specify { expect(substance.name).to eq 'Urtica Dioica' } # TODO: is this okay?
|
784
|
+
specify { expect(composition.label).to eq 'Praeparatio cryodesiccata:' }
|
785
|
+
end
|
786
|
+
|
787
|
+
context "should return correct substance for equis F(ab')2" do
|
788
|
+
string = "viperis antitoxinum equis F(ab')2"
|
789
|
+
composition = ParseComposition.from_string(string)
|
790
|
+
substance = composition.substances.first
|
791
|
+
specify { expect(substance.name).to eq "Viperis Antitoxinum Equis F(ab')" }
|
792
|
+
end
|
793
|
+
|
794
|
+
context "should return correct substance for with two et substances corresp" do
|
795
|
+
string = "viperis antitoxinum equis F(ab')2 corresp. Vipera aspis > 1000 LD50 mus et Vipera berus > 500 LD50 mus et Vipera ammodytes > 1000 LD50 mus"
|
796
|
+
composition = ParseComposition.from_string(string)
|
797
|
+
substance = composition.substances.last
|
798
|
+
specify { expect(substance.name).to eq "Vipera Ammodytes > 1000 Ld50 Mus" }
|
799
|
+
end
|
800
|
+
|
801
|
+
context "should return correct substance for 'pyrazinamidum 500 mg'" do
|
802
|
+
string = "pyrazinamidum 500 mg"
|
803
|
+
CompositionTransformer.clear_substances
|
804
|
+
composition = ParseComposition.from_string(string)
|
805
|
+
substance = composition.substances.first
|
806
|
+
specify { expect(substance.name).to eq 'Pyrazinamidum' }
|
807
|
+
specify { expect(substance.qty).to eq 500.0 }
|
808
|
+
specify { expect(substance.unit).to eq 'mg' }
|
809
|
+
end
|
810
|
+
|
811
|
+
context "should return correct substance for given with et and corresp. (IKSNR 11879)" do
|
812
|
+
string = "calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg corresp. calcium 100 mg"
|
813
|
+
|
814
|
+
composition = ParseComposition.from_string(string)
|
815
|
+
specify { expect(composition.substances.size).to eq 2 }
|
816
|
+
calcii = composition.substances.find{ |x| /calcii/i.match(x.name) }
|
817
|
+
pentahydricus = composition.substances.find{ |x| /pentahydricus/i.match(x.name) }
|
818
|
+
anhydricus = composition.substances.find{ |x| /anhydricus/i.match(x.name) }
|
819
|
+
specify { expect(pentahydricus.name).to eq 'Calcii Lactas Pentahydricus' }
|
820
|
+
specify { expect(pentahydricus.qty).to eq 25.0}
|
821
|
+
specify { expect(pentahydricus.unit).to eq 'mg' }
|
822
|
+
specify { expect(anhydricus.name).to eq 'Calcii Hydrogenophosphas Anhydricus' }
|
823
|
+
specify { expect(anhydricus.qty).to eq 300.0 }
|
824
|
+
specify { expect(anhydricus.unit).to eq 'mg' }
|
825
|
+
specify { expect(anhydricus.chemical_substance.name).to eq 'Calcium' }
|
826
|
+
specify { expect(anhydricus.chemical_substance.qty).to eq 100.0 }
|
827
|
+
specify { expect(anhydricus.chemical_substance.unit).to eq 'mg' }
|
828
|
+
end
|
829
|
+
|
830
|
+
context "should return correct substances for Nutriflex IKSNR 42847" do
|
831
|
+
string = "I) Glucoselösung: glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.
|
832
|
+
.
|
833
|
+
II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g, lysinum anhydricum 3.98 g ut lysinum monohydricum, methioninum 3.42 g, phenylalaninum 6.15 g, threoninum 3.18 g, tryptophanum 1 g, valinum 4.54 g, argininum 4.73 g, histidinum 2.19 g ut histidini hydrochloridum monohydricum, alaninum 8.49 g, acidum asparticum 2.63 g, acidum glutamicum 6.14 g, glycinum 2.89 g, prolinum 5.95 g, serinum 5.25 g, mineralia: magnesii acetas tetrahydricus 1.08 g, natrii acetas trihydricus 1.63 g, kalii dihydrogenophosphas 2 g, kalii hydroxidum 620 mg, natrii hydroxidum 1.14 g, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.
|
834
|
+
.
|
835
|
+
I) et II) corresp.: aminoacida 70 g, nitrogenia 10 g, natrium 40.5 mmol, kalium 25.7 mmol, calcium 4.1 mmol, magnesium 5 mmol, chloridum 49.5 mmol, phosphas 14.7 mmol, acetas 22 mmol, in solutione recenter reconstituta 1000 ml.
|
836
|
+
Corresp. 5190 kJ pro 1 l."
|
837
|
+
line_1 = "I) Glucoselösung: glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml."
|
838
|
+
line_2 = "."
|
839
|
+
line_3 = "II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g, lysinum anhydricum 3.98 g ut lysinum monohydricum, methioninum 3.42 g, phenylalaninum 6.15 g, threoninum 3.18 g, tryptophanum 1 g, valinum 4.54 g, argininum 4.73 g, histidinum 2.19 g ut histidini hydrochloridum monohydricum, alaninum 8.49 g, acidum asparticum 2.63 g, acidum glutamicum 6.14 g, glycinum 2.89 g, prolinum 5.95 g, serinum 5.25 g, mineralia: magnesii acetas tetrahydricus 1.08 g, natrii acetas trihydricus 1.63 g, kalii dihydrogenophosphas 2 g, kalii hydroxidum 620 mg, natrii hydroxidum 1.14 g, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml."
|
840
|
+
line_4 = "."
|
841
|
+
line_5 = "I) et II) corresp.: aminoacida 70 g, nitrogenia 10 g, natrium 40.5 mmol, kalium 25.7 mmol, calcium 4.1 mmol, magnesium 5 mmol, chloridum 49.5 mmol, phosphas 14.7 mmol, acetas 22 mmol, in solutione recenter reconstituta 1000 ml."
|
842
|
+
line_6 = "Corresp. 5190 kJ pro 1 l."
|
843
|
+
tst = 'glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg, acidum citricum monohydricum'
|
844
|
+
tst2 = 'glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg'
|
845
|
+
tst_ut = 'glucosum anhydricum 240 g ut glucosum monohydricum'
|
846
|
+
composition = ParseComposition.from_string(line_2)
|
847
|
+
line_3 = "II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g, lysinum anhydricum 3.98 g ut lysinum monohydricum, methioninum 3.42 g, phenylalaninum 6.15 g, threoninum 3.18 g, tryptophanum 1 g, valinum 4.54 g, argininum 4.73 g, histidinum 2.19 g ut histidini hydrochloridum monohydricum, alaninum 8.49 g, acidum asparticum 2.63 g, acidum glutamicum 6.14 g, glycinum 2.89 g, prolinum 5.95 g, serinum 5.25 g, mineralia: magnesii acetas tetrahydricus 1.08 g, natrii acetas trihydricus 1.63 g, kalii dihydrogenophosphas 2 g, kalii hydroxidum 620 mg, natrii hydroxidum 1.14 g, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml."
|
848
|
+
line_3 = "II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g"
|
849
|
+
line_3 = "aminoacida: isoleucinum 4.11 g, leucinum 5.48 g"
|
850
|
+
composition = ParseComposition.from_string(line_3)
|
851
|
+
composition = ParseComposition.from_string(line_1)
|
852
|
+
|
853
|
+
composition = ParseComposition.from_string(line_1)
|
854
|
+
specify { expect(composition.substances.size).to eq 3}
|
855
|
+
specify { expect(composition.label).to eq 'I' }
|
856
|
+
specify { expect(composition.label_description).to eq 'Glucoselösung' }
|
857
|
+
dihydricum = composition.substances.find{ |x| /dihydricum/i.match(x.name) }
|
858
|
+
monohydricum = composition.substances.find{ |x| /monohydricum/i.match(x.name) }
|
859
|
+
|
860
|
+
specify { expect(dihydricum.name).to eq 'Calcii Chloridum Dihydricum' }
|
861
|
+
specify { expect(dihydricum.chemical_substance).to eq nil }
|
862
|
+
specify { expect(dihydricum.qty).to eq 600.0}
|
863
|
+
specify { expect(dihydricum.unit).to eq 'mg/500 ml' }
|
864
|
+
|
865
|
+
specify { expect(monohydricum.name).to eq 'Acidum Citricum Monohydricum' }
|
866
|
+
specify { expect(monohydricum.chemical_substance).to eq nil }
|
867
|
+
specify { expect(monohydricum.cdose).to eq nil }
|
868
|
+
specify { expect(monohydricum.qty).to eq nil}
|
869
|
+
specify { expect(monohydricum.unit).to eq nil }
|
870
|
+
end
|
871
|
+
|
872
|
+
context "should return correct substance for 9,11-linolicum " do
|
873
|
+
substance = nil; composition = nil
|
874
|
+
[ "9,11-linolicum",
|
875
|
+
"9,11-linolicum 3.25 mg"
|
876
|
+
].each {
|
877
|
+
|string|
|
878
|
+
composition = ParseComposition.from_string(string)
|
879
|
+
substance = composition.substances.first
|
880
|
+
specify { expect(substance.name).to eq '9,11-linolicum' }
|
881
|
+
specify { expect(substance.chemical_substance).to eq nil }
|
882
|
+
CompositionTransformer.clear_substances
|
883
|
+
composition = ParseComposition.from_string(string)
|
884
|
+
}
|
885
|
+
|
886
|
+
specify { expect(substance.qty).to eq 3.25}
|
887
|
+
specify { expect(substance.unit).to eq 'mg' }
|
888
|
+
end
|
889
|
+
|
890
|
+
context "should return correct substance ut (IKSNR 44744)" do
|
891
|
+
string = "zuclopenthixolum 2 mg ut zuclopenthixoli dihydrochloridum, excipiens pro compresso obducto."
|
892
|
+
composition = ParseComposition.from_string(string)
|
893
|
+
specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 2 : 1}
|
894
|
+
specify { expect(composition.substances.first.name).to eq 'Zuclopenthixolum' }
|
895
|
+
specify { expect(composition.substances.first.qty).to eq 2.0}
|
896
|
+
specify { expect(composition.substances.first.salts.size).to eq 1}
|
897
|
+
if composition.substances.first
|
898
|
+
salt = composition.substances.first.salts.first
|
899
|
+
specify { expect(salt.name).to eq 'Zuclopenthixoli Dihydrochloridum' }
|
900
|
+
specify { expect(salt.qty).to eq nil}
|
901
|
+
specify { expect(salt.unit).to eq nil }
|
902
|
+
end
|
903
|
+
end
|
904
|
+
|
905
|
+
context "should return correct substance for given with et (IKSNR 11879)" do
|
906
|
+
string = "calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg"
|
907
|
+
composition = ParseComposition.from_string(string)
|
908
|
+
specify { expect(composition.substances.size).to eq 2 }
|
909
|
+
pentahydricus = composition.substances.find{ |x| /pentahydricus/i.match(x.name) }
|
910
|
+
anhydricus = composition.substances.find{ |x| /anhydricus/i.match(x.name) }
|
911
|
+
specify { expect(pentahydricus.name).to eq 'Calcii Lactas Pentahydricus' }
|
912
|
+
specify { expect(pentahydricus.qty).to eq 25.0}
|
913
|
+
specify { expect(pentahydricus.unit).to eq 'mg' }
|
914
|
+
specify { expect(anhydricus.name).to eq 'Calcii Hydrogenophosphas Anhydricus' }
|
915
|
+
specify { expect(anhydricus.qty).to eq 300.0 }
|
916
|
+
specify { expect(anhydricus.unit).to eq 'mg' }
|
917
|
+
end
|
918
|
+
|
919
|
+
context "should return correct substance for 'Xenonum(133-xe) 74 -740 Mb'" do
|
920
|
+
string = "Xenonum(133-Xe) 74 -740 MBq"
|
921
|
+
composition = ParseComposition.from_string(string)
|
922
|
+
substance = composition.substances.first
|
923
|
+
specify { expect(substance.name).to eq 'Xenonum(133-xe)' }
|
924
|
+
specify { expect(substance.qty).to eq '74-740' }
|
925
|
+
specify { expect(substance.unit).to eq 'MBq' }
|
926
|
+
end
|
927
|
+
|
928
|
+
context "should return correct substance for 'pyrazinamidum'" do
|
929
|
+
string = "pyrazinamidum"
|
930
|
+
composition = ParseComposition.from_string(string)
|
931
|
+
substance = composition.substances.first
|
932
|
+
specify { expect(substance.name).to eq 'Pyrazinamidum' }
|
933
|
+
specify { expect(substance.qty).to eq nil }
|
934
|
+
specify { expect(substance.unit).to eq nil }
|
935
|
+
end
|
936
|
+
|
937
|
+
context "should return correct substance for 'E 120'" do
|
938
|
+
string = "E 120"
|
939
|
+
composition = ParseComposition.from_string(string)
|
940
|
+
substance = composition.substances.first
|
941
|
+
specify { expect(substance.name).to eq string }
|
942
|
+
specify { expect(substance.qty).to eq nil }
|
943
|
+
specify { expect(substance.unit).to eq nil }
|
944
|
+
end
|
945
|
+
|
946
|
+
context "should return correct substance for 'retinoli palmitas 7900 U.I.'" do
|
947
|
+
string = "retinoli palmitas 7900 U.I."
|
948
|
+
composition = ParseComposition.from_string(string)
|
949
|
+
substance = composition.substances.first
|
950
|
+
specify { expect(substance.name).to eq 'Retinoli Palmitas' }
|
951
|
+
specify { expect(substance.qty).to eq 7900.0}
|
952
|
+
specify { expect(substance.unit).to eq 'U.I.' }
|
953
|
+
end
|
954
|
+
|
955
|
+
context "should return correct substance for 'toxoidum pertussis 8 µg'" do
|
956
|
+
string = "toxoidum pertussis 8 µg"
|
957
|
+
composition = ParseComposition.from_string(string)
|
958
|
+
substance = composition.substances.first
|
959
|
+
specify { expect(substance.name).to eq 'Toxoidum Pertussis' }
|
960
|
+
specify { expect(substance.qty).to eq 8.0}
|
961
|
+
specify { expect(substance.unit).to eq 'µg' }
|
962
|
+
end
|
963
|
+
|
964
|
+
end
|
965
|
+
|
966
|
+
context "should return correct substance Rote Filmtablett 54819 Beriplast" do
|
967
|
+
string = "A) Rote Filmtablette: estradiolum 1 mg ut estradiolum hemihydricum, excipiens pro compresso obducto"
|
968
|
+
string = "estradiolum 1 mg ut estradiolum hemihydricum, excipiens pro compresso obducto"
|
969
|
+
composition = ParseComposition.from_string(string)
|
970
|
+
substance = composition.substances.first
|
971
|
+
specify { expect(composition.substances.size).to eq 1 }
|
972
|
+
# specify { expect(composition.substances.last.name).to eq 'Obducto' }
|
973
|
+
specify { expect(substance.name).to eq 'Estradiolum' }
|
974
|
+
specify { expect(composition.substances.first.salts.first.name).to eq 'Estradiolum Hemihydricum' }
|
975
|
+
specify { expect(substance.cdose.to_s).to eq "" }
|
976
|
+
specify { expect(substance.qty).to eq 1.0}
|
977
|
+
specify { expect(substance.unit).to eq 'mg' }
|
978
|
+
end
|
979
|
+
|
980
|
+
context "should return correct composition for containing ut IKSNR 613" do
|
981
|
+
string = 'aluminium ut aluminii hydroxidum hydricum ad adsorptionem'
|
982
|
+
composition = ParseComposition.from_string(string)
|
983
|
+
specify { expect(composition.source).to eq string }
|
984
|
+
specify { expect(composition.label).to eq nil }
|
985
|
+
specify { expect(composition.substances.size).to eq 1 }
|
986
|
+
specify { expect(composition.substances.first.name).to eq 'Aluminium' }
|
987
|
+
specify { expect(composition.substances.first.salts.first.name).to eq 'Aluminii Hydroxidum Hydricum Ad Adsorptionem' }
|
988
|
+
end
|
989
|
+
|
990
|
+
context "should return correct substance for 'toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg'" do
|
991
|
+
string = "toxoidum pertussis 25 µg et haemagglutininum filamentosum 15 µg"
|
992
|
+
composition = ParseComposition.from_string(string)
|
993
|
+
toxoidum = composition.substances.first
|
994
|
+
specify { expect(toxoidum.name).to eq 'Toxoidum Pertussis' }
|
995
|
+
specify { expect(toxoidum.qty).to eq 25.0}
|
996
|
+
specify { expect(toxoidum.unit).to eq 'µg' }
|
997
|
+
specify { expect(toxoidum.chemical_substance).to eq nil }
|
998
|
+
haemagglutininum = composition.substances.last
|
999
|
+
specify { expect(haemagglutininum.name).to eq 'Haemagglutininum Filamentosum' }
|
1000
|
+
specify { expect(haemagglutininum.qty).to eq 15.0}
|
1001
|
+
specify { expect(haemagglutininum.unit).to eq 'µg' }
|
1002
|
+
end
|
1003
|
+
|
1004
|
+
if RunSpecificTests
|
1005
|
+
context "should return correct composition for containing parenthesis in substance name abd 40 U. (e.g IKSNR 613)" do
|
1006
|
+
string = 'virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U.'
|
1007
|
+
composition = ParseComposition.from_string(string)
|
1008
|
+
specify { expect(composition.source).to eq string }
|
1009
|
+
specify { expect(composition.substances.size).to eq 1 }
|
1010
|
+
specify { expect(composition.substances.first.name).to eq 'Virus Poliomyelitis Typus 1 Inactivatum (d-antigen)' }
|
1011
|
+
end
|
1012
|
+
|
1013
|
+
context "should return correct composition for containing parenthesis in substance name (e.g IKSNR 613)" do
|
1014
|
+
string = 'virus poliomyelitis typus inactivatum (D-Antigen)'
|
1015
|
+
string = 'virus poliomyelitis typus 1 inactivatum (d-antigen)'
|
1016
|
+
composition = ParseComposition.from_string(string)
|
1017
|
+
specify { expect(composition.source).to eq string }
|
1018
|
+
specify { expect(composition.substances.size).to eq 1 }
|
1019
|
+
specify { expect(composition.substances.first.name).to eq 'Virus Poliomyelitis Typus 1 Inactivatum (d-antigen)' }
|
1020
|
+
end
|
1021
|
+
|
1022
|
+
context "should return correct composition for containing residui (e.g IKSNR 613)" do
|
1023
|
+
string = 'residui: neomycinum, streptomycinum'
|
1024
|
+
composition = ParseComposition.from_string(string)
|
1025
|
+
specify { expect(composition.source).to eq string }
|
1026
|
+
specify { expect(composition.substances.size).to eq 2 }
|
1027
|
+
specify { expect(composition.substances.first.more_info).to eq 'residui' }
|
1028
|
+
specify { expect(composition.substances.first.name).to eq 'Neomycinum' }
|
1029
|
+
specify { expect(composition.substances.last.name).to eq 'Streptomycinum' }
|
1030
|
+
end
|
1031
|
+
|
1032
|
+
context "should return correct composition for 'conserv.: E 217, E 219' IKSNR 613" do
|
1033
|
+
# string = 'I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum tetani 40 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg, virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U., virus poliomyelitis typus 2 inactivatum (D-Antigen) 8 U., virus poliomyelitis typus 3 inactivatum (D-Antigen) 32 U., aluminium ut aluminii hydroxidum hydricum ad adsorptionem, formaldehydum 10 µg, conserv.: phenoxyethanolum 2.5 µl, residui: neomycinum, streptomycinum, polymyxini B sulfas, medium199, aqua q.s. ad suspensionem pro 0.5 ml.'
|
1034
|
+
string =
|
1035
|
+
'I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum tetani 40 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg, virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U., virus poliomyelitis typus 2 inactivatum (D-Antigen) 8 U., virus poliomyelitis typus 3 inactivatum (D-Antigen) 32 U., aluminium ut aluminii hydroxidum hydricum ad adsorptionem, formaldehydum 10 µg, conserv.: phenoxyethanolum 2.5 µl, residui: neomycinum, streptomycinum, polymyxini B sulfas, medium199, aqua q.s. ad suspensionem pro 0.5 ml.'
|
1036
|
+
composition = ParseComposition.from_string(string)
|
1037
|
+
specify { expect(composition.source).to eq string }
|
1038
|
+
specify { expect(composition.label).to eq 'I' }
|
1039
|
+
end
|
1040
|
+
|
1041
|
+
context "should return correct composition for 'conserv.: E 217, E 219'" do
|
1042
|
+
string = 'conserv.: E 217, E 219'
|
1043
|
+
composition = ParseComposition.from_string(string)
|
1044
|
+
specify { expect(composition.source).to eq string }
|
1045
|
+
specify { expect(composition.label).to eq nil }
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
context "should parse more complicated example" do
|
1049
|
+
string =
|
1050
|
+
"I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg"
|
1051
|
+
composition = ParseComposition.from_string(string)
|
1052
|
+
specify { expect(composition.source).to eq string }
|
1053
|
+
|
1054
|
+
specify { expect(composition.label).to eq 'I' }
|
1055
|
+
specify { expect(composition.label_description).to eq 'DTPa-IPV-Komponente (Suspension)' }
|
1056
|
+
|
1057
|
+
specify { expect(composition.galenic_form).to eq nil }
|
1058
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
1059
|
+
|
1060
|
+
toxoidum = composition.substances.find{|x| /toxoidum diphther/i.match(x.name)}
|
1061
|
+
specify { expect(toxoidum.name).to eq 'Toxoidum Diphtheriae' }
|
1062
|
+
specify { expect(toxoidum.qty).to eq 30 }
|
1063
|
+
specify { expect(toxoidum.unit).to eq 'U.I.' }
|
1064
|
+
|
1065
|
+
haema = composition.substances.find{|x| /Haemagglutininum/i.match(x.name)}
|
1066
|
+
specify { expect(haema.name).to eq 'Haemagglutininum Filamentosum' }
|
1067
|
+
specify { expect(haema.qty).to eq 25 }
|
1068
|
+
specify { expect(haema.unit).to eq 'µg' }
|
1069
|
+
end
|
1070
|
+
|
1071
|
+
context "should return correct composition for 'minoxidilum'" do
|
1072
|
+
string = 'minoxidilum 2.5 mg, pyrazinamidum 500 mg'
|
1073
|
+
composition = ParseComposition.from_string(string)
|
1074
|
+
specify { expect(composition.source).to eq string }
|
1075
|
+
specify { expect(composition.label).to eq nil }
|
1076
|
+
specify { expect(composition.label_description).to eq nil }
|
1077
|
+
specify { expect(composition.galenic_form).to eq nil }
|
1078
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
1079
|
+
substance = composition.substances.first
|
1080
|
+
specify { expect(substance.name).to eq 'Minoxidilum' }
|
1081
|
+
specify { expect(substance.qty).to eq 2.5 }
|
1082
|
+
specify { expect(substance.unit).to eq 'mg' }
|
1083
|
+
end
|
1084
|
+
|
1085
|
+
context "should return correct composition for 'terra'" do
|
1086
|
+
string = 'terra'
|
1087
|
+
composition = ParseComposition.from_string(string)
|
1088
|
+
specify { expect(composition.source).to eq string }
|
1089
|
+
specify { expect(composition.label).to eq nil }
|
1090
|
+
specify { expect(composition.label_description).to eq nil }
|
1091
|
+
specify { expect(composition.galenic_form).to eq nil }
|
1092
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
1093
|
+
specify { expect( composition.substances.first.name).to eq "Terra" }
|
1094
|
+
end
|
1095
|
+
|
1096
|
+
context "should return correct composition for 'terra silicea spec..'" do
|
1097
|
+
string = 'terra silicea spec. 810 mg, excipiens pro compresso'
|
1098
|
+
composition = ParseComposition.from_string(string)
|
1099
|
+
specify { expect(composition.source).to eq string}
|
1100
|
+
specify { expect(composition.label).to eq nil }
|
1101
|
+
specify { expect(composition.label_description).to eq nil }
|
1102
|
+
specify { expect(composition.galenic_form).to eq nil }
|
1103
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
1104
|
+
specify { expect( composition.substances.first.name).to eq "Terra Silicea Spec." }
|
1105
|
+
end
|
1106
|
+
|
1107
|
+
context "should return correct composition for 'minoxidilum'" do
|
1108
|
+
string = 'minoxidilum 2.5 mg'
|
1109
|
+
composition = ParseComposition.from_string(string)
|
1110
|
+
specify { expect(composition.source).to eq string }
|
1111
|
+
specify { expect(composition.label).to eq nil }
|
1112
|
+
specify { expect(composition.label_description).to eq nil }
|
1113
|
+
specify { expect(composition.galenic_form).to eq nil }
|
1114
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
1115
|
+
substance = composition.substances.first
|
1116
|
+
specify { expect(substance.name).to eq 'Minoxidilum' }
|
1117
|
+
specify { expect(substance.qty).to eq 2.5 }
|
1118
|
+
specify { expect(substance.unit).to eq 'mg' }
|
1119
|
+
end
|
1120
|
+
|
1121
|
+
context "should return correct composition for 'minoxidilum'" do
|
1122
|
+
string = 'minoxidilum'
|
1123
|
+
composition = ParseComposition.from_string(string)
|
1124
|
+
specify { expect(composition.source).to eq string }
|
1125
|
+
specify { expect(composition.label).to eq nil }
|
1126
|
+
specify { expect(composition.label_description).to eq nil }
|
1127
|
+
specify { expect(composition.galenic_form).to eq nil }
|
1128
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
1129
|
+
substance = composition.substances.first
|
1130
|
+
specify { expect(substance.name).to eq 'Minoxidilum' }
|
1131
|
+
specify { expect(substance.qty).to eq nil }
|
1132
|
+
specify { expect(substance.unit).to eq nil }
|
1133
|
+
end
|
1134
|
+
|
1135
|
+
context "should return correct composition for 'minoxidilum excipiens'" do
|
1136
|
+
string = 'minoxidilum 2.5 mg, excipiens pro compresso.'
|
1137
|
+
composition = ParseComposition.from_string(string)
|
1138
|
+
specify { expect(composition.source).to eq string }
|
1139
|
+
specify { expect(composition.label).to eq nil }
|
1140
|
+
specify { expect(composition.label_description).to eq nil }
|
1141
|
+
specify { expect(composition.galenic_form).to eq nil }
|
1142
|
+
specify { expect(composition.route_of_administration).to eq nil }
|
1143
|
+
|
1144
|
+
substance = composition.substances.first
|
1145
|
+
specify { expect(substance.name).to eq 'Minoxidilum' }
|
1146
|
+
specify { expect(substance.qty).to eq 2.5 }
|
1147
|
+
specify { expect(substance.unit).to eq 'mg' }
|
1148
|
+
skip 'what is the correct name for excipiens?'# { expect(composition.substances.last.name).to eq 'Excipiens Pro Compresso' }
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
context 'find correct result compositions for nutriflex' do
|
1152
|
+
line_1 = 'I) Glucoselösung: glucosum anhydricum 150 g ut glucosum monohydricum, natrii dihydrogenophosphas dihydricus 2.34 g, zinci acetas dihydricus 6.58 mg, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.'
|
1153
|
+
line_2 = 'II) Fettemulsion: sojae oleum 25 g, triglycerida saturata media 25 g, lecithinum ex ovo 3 g, glycerolum, natrii oleas, aqua q.s. ad emulsionem pro 250 ml.'
|
1154
|
+
line_3 = 'III) Aminosäurenlösung: isoleucinum 2.34 g, leucinum 3.13 g, lysinum anhydricum 2.26 g ut lysini hydrochloridum, methioninum 1.96 g, aqua ad iniectabilia q.s. ad solutionem pro 400 ml.'
|
1155
|
+
line_4 = 'I) et II) et III) corresp.: aminoacida 32 g/l, acetas 32 mmol/l, acidum citricum monohydricum, in emulsione recenter mixta 1250 ml.'
|
1156
|
+
line_5 = 'Corresp. 4000 kJ.'
|
1157
|
+
text = "#{line_1}\n#{line_2}\n#{line_3}\n#{line_4}\n#{line_5}"
|
1158
|
+
compositions = ParseUtil.parse_compositions(text, 'glucosum anhydricum, zinci acetas dihydricus, isoleucinum, leucinum')
|
1159
|
+
specify { expect(compositions.first.substances.first.name).to eq 'Glucosum Anhydricum'}
|
1160
|
+
specify { expect(compositions.first.substances.first.salts.first.name).to eq 'Glucosum Monohydricum'}
|
1161
|
+
specify { expect(compositions.size).to eq 5}
|
1162
|
+
specify { expect(compositions.first.substances.first.qty.to_f).to eq 150.0}
|
1163
|
+
specify { expect(compositions.first.substances.first.unit).to eq 'g/500 ml'}
|
1164
|
+
|
1165
|
+
specify { expect(compositions[0].source).to eq line_1}
|
1166
|
+
specify { expect(compositions[0].label).to eq 'I'}
|
1167
|
+
specify { expect(compositions[0].label_description).to eq 'Glucoselösung'}
|
1168
|
+
specify { expect(compositions[1].label).to eq 'II' }
|
1169
|
+
specify { expect(compositions[2].label).to eq 'III' }
|
1170
|
+
glucosum = compositions.first.substances.first
|
1171
|
+
specify { expect(glucosum.name).to eq 'Glucosum Anhydricum' }
|
1172
|
+
specify { expect(glucosum.qty.to_f).to eq 150.0}
|
1173
|
+
specify { expect(glucosum.unit).to eq 'g/500 ml'}
|
1174
|
+
specify { expect(compositions[0].substances.size).to eq ExcipiensIs_a_Substance ? 4 : 3 }
|
1175
|
+
specify { expect(compositions[1].substances.size).to eq ExcipiensIs_a_Substance ? 6 : 5 } # should have glycerolum, natrii oleas, aqua
|
1176
|
+
specify { expect(compositions[2].substances.size).to eq ExcipiensIs_a_Substance ? 5 : 4 }
|
1177
|
+
specify { expect(compositions[1].source).to eq line_2}
|
1178
|
+
specify { expect(compositions[2].source).to eq line_3}
|
1179
|
+
specify { expect(compositions[3].source).to eq line_4}
|
1180
|
+
specify { expect(compositions[3].corresp).to eq line_4.sub(/\.$/, '') }
|
1181
|
+
specify { expect(compositions[4].source).to eq line_5}
|
1182
|
+
specify { expect(compositions[4].corresp).to eq '4000 kJ'}
|
1183
|
+
|
1184
|
+
# from II)
|
1185
|
+
if compositions and compositions[1] and compositions[1].substances
|
1186
|
+
lecithinum = compositions[1].substances.find{ |x| x.name.match(/lecithinum/i) }
|
1187
|
+
specify { expect(lecithinum).not_to eq nil}
|
1188
|
+
if lecithinum
|
1189
|
+
specify { expect(lecithinum.name).to eq 'Lecithinum Ex Ovo' }
|
1190
|
+
specify { expect(lecithinum.qty.to_f).to eq 3.0}
|
1191
|
+
specify { expect(lecithinum.unit).to eq 'g/250 ml'}
|
1192
|
+
end
|
1193
|
+
|
1194
|
+
# From III
|
1195
|
+
leucinum = compositions[2].substances.find{ |x| x.name.eql?('Leucinum') }
|
1196
|
+
specify { expect(leucinum).not_to eq nil}
|
1197
|
+
if leucinum
|
1198
|
+
specify { expect(leucinum.name).to eq 'Leucinum' }
|
1199
|
+
specify { expect(leucinum.qty.to_f).to eq 3.13}
|
1200
|
+
specify { expect(leucinum.unit).to eq 'g/400 ml'}
|
1201
|
+
end
|
1202
|
+
leucinum_I = compositions[0].substances.find{ |x| x.name.eql?('Leucinum') }
|
1203
|
+
specify { expect(leucinum_I).to eq nil}
|
1204
|
+
leucinum_II = compositions[1].substances.find{ |x| x.name.eql?('Leucinum') }
|
1205
|
+
specify { expect(leucinum_II).to eq nil}
|
1206
|
+
# aqua = compositions[2].substances.find{ |x| /aqua ad/i.match(x.name) }
|
1207
|
+
# specify { expect(aqua.name).to eq "Aqua Ad Iniectabilia Q.s. Ad Solutionem Pro"}
|
1208
|
+
end
|
1209
|
+
|
1210
|
+
end
|
1211
|
+
|
1212
|
+
end
|
1213
|
+
|
1214
|
+
describe ParseUtil::HandleSwissmedicErrors do
|
1215
|
+
context 'should handle fixes' do
|
1216
|
+
replacement = '\1, \2'
|
1217
|
+
pattern_replacement = { /(sulfuris D6\s[^\s]+\smg)\s([^,]+)/ => replacement }
|
1218
|
+
test_string = 'sulfuris D6 2,2 mg hypericum perforatum D2 0,66'
|
1219
|
+
expected = 'sulfuris D6 2,2 mg, hypericum perforatum D2 0,66'
|
1220
|
+
handler = ParseUtil::HandleSwissmedicErrors.new(pattern_replacement )
|
1221
|
+
result = handler.apply_fixes(test_string)
|
1222
|
+
specify { expect(result).to eq expected }
|
1223
|
+
specify { expect(handler.report.size).to eq 2 }
|
1224
|
+
specify { expect(/report/i.match(handler.report[0]).class).to eq MatchData }
|
1225
|
+
specify { expect(handler.report[1].index(replacement).class).to eq Fixnum }
|
1226
|
+
end
|
1227
|
+
|
1228
|
+
context 'should be used when calling ParseComposition' do
|
1229
|
+
replacement = '\1, \2'
|
1230
|
+
test_string = 'sulfuris D6 2,2 mg hypericum perforatum D2 0,66'
|
1231
|
+
report = ParseComposition.reset
|
1232
|
+
composition = ParseComposition.from_string(test_string).clone
|
1233
|
+
report = ParseComposition.report
|
1234
|
+
specify { expect(composition.substances.size).to eq 2 }
|
1235
|
+
specify { expect(composition.substances.first.name).to eq 'Sulfuris D6' }
|
1236
|
+
specify { expect(composition.substances.last.name).to eq 'Hypericum Perforatum D2' }
|
1237
|
+
specify { expect(/report/i.match(report[0]).class).to eq MatchData }
|
1238
|
+
specify { expect(report[1].index(replacement).class).to eq Fixnum }
|
1239
|
+
end
|
1240
|
+
|
1241
|
+
end
|
1242
|
+
end if RunSpecificTests
|
1243
|
+
|
1244
|
+
describe ParseComposition do
|
1245
|
+
context "should parse a complex composition" do
|
1246
|
+
start_time = Time.now
|
1247
|
+
specify { expect( File.exists?(AllCompositionLines)).to eq true }
|
1248
|
+
inhalt = IO.readlines(AllCompositionLines)
|
1249
|
+
nr = 0
|
1250
|
+
@nrErrors = 0
|
1251
|
+
inhalt.each{
|
1252
|
+
|line|
|
1253
|
+
nr += 1
|
1254
|
+
next if line.length < 5
|
1255
|
+
puts "#{File.basename(AllCompositionLines)}:#{nr} #{@nrErrors} errors: #{line}" if VERBOSE_MESSAGES
|
1256
|
+
begin
|
1257
|
+
composition = ParseComposition.from_string line
|
1258
|
+
rescue Parslet::ParseFailed
|
1259
|
+
@nrErrors += 1
|
1260
|
+
puts "#{File.basename(AllCompositionLines)}:#{nr} parse_error #{@nrErrors} in: #{line}"
|
1261
|
+
# binding.pry
|
1262
|
+
# binding.pry if nr > 300
|
1263
|
+
end
|
1264
|
+
}
|
1265
|
+
at_exit { puts "Testing whether #{nr} composition lines can be parsed. Found #{@nrErrors} errors in #{(Time.now - start_time).to_i} seconds" }
|
1266
|
+
|
1267
|
+
end if RunAllCompositionsTests
|
1268
|
+
end
|