oddb2xml 2.0.6 → 2.0.7
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 +8 -8
- data/Gemfile.lock +1 -1
- data/History.txt +13 -0
- data/dokumentation_calc.textile +30 -24
- data/lib/oddb2xml/builder.rb +32 -19
- data/lib/oddb2xml/calc.rb +10 -1
- data/lib/oddb2xml/compositions_syntax.rb +220 -151
- data/lib/oddb2xml/parslet_compositions.rb +148 -323
- data/lib/oddb2xml/version.rb +1 -1
- data/spec/calc_spec.rb +19 -13
- data/spec/composition_syntax_spec.rb +39 -40
- data/spec/data/swissmedic_package-galenic.xlsx +0 -0
- data/spec/parslet_spec.rb +320 -213
- data/spec/spec_helper.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDg2MTM3NzVmZDE3MjhkNjg5ODc3Y2IxNGJkYzVmYTBhMTYyNGI2MQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MmM2ZjRlNzA5NTYwNWIzZDc0MTZmNjcwZDA1NWZkOGEyYzY2MDY2NQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Y2I2YTc2MjA0OTQ1MmFhMDEyZjBmNTZkY2IwMjVjNTg0MzQ1NzY4ZGRlYzIx
|
10
|
+
ZjY4OTAxNzRhMGVjYjU3OTMxYjg1YzVhNjQ0MmQzZTIxNzQwMzAyYTM2MDFj
|
11
|
+
M2ExZmFiZGU3NWRlN2U3YzBjOGE3MDNkMjJkMWQwNTAyNDViYjE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjJkZDk1ZjIzOTVlODQ2YWU3MWE0ZmZkMGM3NTMyMTA2ODNlZGJlOWViOTJm
|
14
|
+
OTYyOTdkMTc0ODkyNTViNjI1Y2YzZDhlOGUyOWE4YzZhNzMzODlkNmQ1M2Jj
|
15
|
+
YmMzODcwMWRjMjIwNGVlOTkzZWMyMTJhZjQ3NDhhZmMyNjQ0ZjA=
|
data/Gemfile.lock
CHANGED
data/History.txt
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
=== 2.0.7 / 29.04.2015
|
2
|
+
|
3
|
+
* parse swissmedic composition with the help of RubyGem parslet.
|
4
|
+
** with extensive unit-tests (spec/composition_spec.rb and spec/parslet_spec.rb
|
5
|
+
* new/changed fields when using --calc, e.g.
|
6
|
+
** more_info
|
7
|
+
** salts
|
8
|
+
** dose_text if qty/unit is not normalized
|
9
|
+
** chemical_substance is now represented as a normal substance
|
10
|
+
** composition.label
|
11
|
+
** composition.label_description
|
12
|
+
** composition.correpond
|
13
|
+
|
1
14
|
=== 2.0.6 / 27.04.2015
|
2
15
|
|
3
16
|
* Remove trailing spaces in names imported from ZurRose transfer.dat
|
data/dokumentation_calc.textile
CHANGED
@@ -13,34 +13,39 @@ h2. Syntax
|
|
13
13
|
|
14
14
|
Die Syntax wird in einer Datei "compositions_syntax":https://raw.githubusercontent.com/ngiger/oddb2xml/master/lib/oddb2xml/compositions_syntax.rb beschrieben.
|
15
15
|
|
16
|
-
|
16
|
+
- ratio := Falls eine Zeile in der Zusammensetzung sow was wie @ratio: 1:10@ oder @ratio: 1:1.5-2.4@ enthält, wird das Feld "more_info" entsprechend gesetzt.
|
17
17
|
|
18
|
-
|
18
|
+
- Namen mit Zahlen := Beschloss dass @Glyceroli Monostearas 33-45@ eine Name und nicht Glyceroli Monostearas von 33 bis 45 von irgendwas ist.
|
19
19
|
|
20
|
-
|
20
|
+
- Dosis := Häufig einfach, z.B. @5 mg@. Komplizierte Ausdrücke wie @2*10^9 CFU@, @9 g/L 5 ml@, @40-55@, @75/25@, @150 U.I. hFSH et 150 U.I. hLH@ oder @6.0 +/-1.2 µg/0.5 ml@ findet man auch.
|
21
|
+
|
22
|
+
- chemical_substance := In der XML-Datei findet man die Substance welche im Swissmedic-Jargon via @corresp@ (u.ä) als eigentlicher Wirkstoff referenziert wird.
|
21
23
|
|
22
|
-
|
23
|
-
* pro praeparatione
|
24
|
-
* excipiens
|
25
|
-
* pro compresso obducto
|
26
|
-
* pro compresso
|
27
|
-
* epro praeparatione
|
28
|
-
* ad pulverem
|
29
|
-
* pro charta
|
30
|
-
* ad globulos
|
31
|
-
* aqua ad iniectabilia q.s. ad solutionem
|
32
|
-
* solvens (i.v.): aqua ad iniectabilia
|
33
|
-
* ad solutionem
|
34
|
-
* q.s. ad
|
35
|
-
* aqua q.s. ad
|
36
|
-
* saccharum ad
|
37
|
-
* aether q.s.
|
38
|
-
* aqua ad iniectabilia
|
39
|
-
* q.s. pro praeparatione
|
40
|
-
* ana partes
|
41
|
-
* et oder @,@ trennen Substanzen
|
42
|
-
* ut vorgehende Substanz wird via nachstehend aufgeführte Salze(e) aufgenommen
|
24
|
+
h2. Gebrauchte Abkürzungen und Schlüsselworte
|
43
25
|
|
26
|
+
- et alia := es gibt noch andere Substanzen. Beispiel: 62504 Olanzapin Sandoz Solufilm 20 mg
|
27
|
+
- et oder , := trennen Substanzen. Beispiel: 29555 NaCl 11,7 % B. Braun, Zusatzampullen zu Infusionslösungen
|
28
|
+
- ut := vorgehende Substanz wird via nachstehend aufgeführte Salze(e) aufgenommen. Beispiel: 54749 Supradyn Vital 50+.
|
29
|
+
- DER: := DrugEthanol Ratio
|
30
|
+
- q.s. :=
|
31
|
+
- pro praeparatione :=
|
32
|
+
- excipiens :=
|
33
|
+
- pro compresso obducto :=
|
34
|
+
- pro compresso :=
|
35
|
+
- epro praeparatione :=
|
36
|
+
- ad pulverem :=
|
37
|
+
- pro charta :=
|
38
|
+
- ad globulos :=
|
39
|
+
- aqua ad iniectabilia q.s. ad solutionem :=
|
40
|
+
- solvens (i.v.): aqua ad iniectabilia :=
|
41
|
+
- ad solutionem :=
|
42
|
+
- q.s. ad :=
|
43
|
+
- aqua q.s. ad :=
|
44
|
+
- saccharum ad :=
|
45
|
+
- aether q.s. :=
|
46
|
+
- aqua ad iniectabilia :=
|
47
|
+
- q.s. pro praeparatione :=
|
48
|
+
- ana partes :=
|
44
49
|
|
45
50
|
h2. Vorgeschlag für Bereinigung
|
46
51
|
|
@@ -48,3 +53,4 @@ h2. Vorgeschlag für Bereinigung
|
|
48
53
|
* Corresp: als Label für Bestandteile
|
49
54
|
* corresp. für zugehörende Substanz
|
50
55
|
* @<@ durch @max.@ ersetzen (1 Mal)
|
56
|
+
* @mind.@ durch @min.@ ersetzen, @min.@ kommt viel häufiger vor
|
data/lib/oddb2xml/builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# encoding: utf-8
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'nokogiri'
|
4
4
|
require 'oddb2xml/util'
|
@@ -31,7 +31,7 @@ module Oddb2xml
|
|
31
31
|
'xmlns' => 'http://wiki.oddb.org/wiki.php?pagename=Swissmedic.Datendeklaration',
|
32
32
|
'CREATION_DATETIME' => Time.new.strftime('%FT%T%z'),
|
33
33
|
'PROD_DATE' => Time.new.strftime('%FT%T%z'),
|
34
|
-
'VALID_DATE' => Time.new.strftime('%FT%T%z')
|
34
|
+
'VALID_DATE' => Time.new.strftime('%FT%T%z'),
|
35
35
|
}
|
36
36
|
class Builder
|
37
37
|
attr_accessor :subject, :index, :items, :flags, :lppvs,
|
@@ -632,6 +632,34 @@ module Oddb2xml
|
|
632
632
|
end
|
633
633
|
|
634
634
|
def build_calc
|
635
|
+
def emit_substance(xml, substance, emit_active=false)
|
636
|
+
xml.MORE_INFO substance.more_info if substance.more_info
|
637
|
+
xml.SUBSTANCE_NAME substance.name
|
638
|
+
xml.IS_ACTIVE_AGENT substance.is_active_agent if emit_active
|
639
|
+
if substance.dose
|
640
|
+
if substance.qty.is_a?(Float) or substance.qty.is_a?(Fixnum)
|
641
|
+
xml.QTY substance.qty
|
642
|
+
xml.UNIT substance.unit
|
643
|
+
else
|
644
|
+
xml.DOSE_TEXT substance.dose.to_s
|
645
|
+
end
|
646
|
+
end
|
647
|
+
if substance.chemical_substance
|
648
|
+
xml.CHEMICAL_SUBSTANCE {
|
649
|
+
emit_substance(xml, substance.chemical_substance)
|
650
|
+
}
|
651
|
+
end
|
652
|
+
if substance.salts and substance.salts.size > 0
|
653
|
+
xml.SALTS {
|
654
|
+
substance.salts.each { |salt|
|
655
|
+
xml.SALT {
|
656
|
+
emit_substance(xml, salt)
|
657
|
+
}
|
658
|
+
}
|
659
|
+
}
|
660
|
+
|
661
|
+
end
|
662
|
+
end
|
635
663
|
packungen_xlsx = File.join(Oddb2xml::WorkDir, "swissmedic_package.xlsx")
|
636
664
|
idx = 0
|
637
665
|
return unless File.exists?(packungen_xlsx)
|
@@ -649,7 +677,7 @@ module Oddb2xml
|
|
649
677
|
seqnr = "%02d" % row.cells[1].value.to_i
|
650
678
|
if row_nr % 250 == 0
|
651
679
|
puts "#{Time.now}: At row #{row_nr} iksnr #{iksnr}";
|
652
|
-
$stdout.
|
680
|
+
$stdout.flush
|
653
681
|
end
|
654
682
|
no8 = sprintf('%05d',row.cells[0].value.to_i) + sprintf('%03d',row.cells[10].value.to_i)
|
655
683
|
name = row.cells[2].value
|
@@ -688,22 +716,7 @@ module Oddb2xml
|
|
688
716
|
xml.LABEL composition.label if composition.label
|
689
717
|
xml.LABEL_DESCRIPTION composition.label_description if composition.label_description
|
690
718
|
xml.SUBSTANCES {
|
691
|
-
|
692
|
-
xml.SUBSTANCE {
|
693
|
-
xml.MORE_INFO substance.more_info.gsub('>','>').gsub('&', '&') if substance.more_info
|
694
|
-
xml.SUBSTANCE_NAME substance.name
|
695
|
-
xml.IS_ACTIVE_AGENT substance.is_active_agent
|
696
|
-
if substance.unit
|
697
|
-
xml.QTY substance.qty
|
698
|
-
xml.UNIT substance.unit
|
699
|
-
end
|
700
|
-
if substance.chemical_substance
|
701
|
-
xml.CHEMICAL_SUBSTANCE substance.chemical_substance.name
|
702
|
-
xml.CHEMICAL_QTY substance.chemical_substance.qty
|
703
|
-
xml.CHEMICAL_UNIT substance.chemical_substance.unit
|
704
|
-
end
|
705
|
-
}
|
706
|
-
}
|
719
|
+
composition.substances.each { |substance| xml.SUBSTANCE { emit_substance(xml, substance, true) }}
|
707
720
|
} if composition.substances
|
708
721
|
}
|
709
722
|
}
|
data/lib/oddb2xml/calc.rb
CHANGED
@@ -205,6 +205,7 @@ public
|
|
205
205
|
|
206
206
|
def get_selling_units(part_from_name_C, pkg_size_L, einheit_M)
|
207
207
|
begin
|
208
|
+
break_condition = (defined?(Pry) and false) # /5 x 2500 ml/.match(pkg_size_L))
|
208
209
|
return pkg_size_to_int(pkg_size_L) unless part_from_name_C
|
209
210
|
part_from_name_C = part_from_name_C.gsub(/[()]/, '_')
|
210
211
|
Measurements.each{ |x|
|
@@ -212,6 +213,7 @@ public
|
|
212
213
|
puts "measurement in einheit_M #{einheit_M} matched: #{x}" if $VERBOSE
|
213
214
|
update_rule('measurement einheit_M')
|
214
215
|
@measure = x
|
216
|
+
binding.pry if break_condition
|
215
217
|
return pkg_size_to_int(pkg_size_L, true)
|
216
218
|
end
|
217
219
|
}
|
@@ -220,12 +222,14 @@ public
|
|
220
222
|
puts "feste_form in #{part_from_name_C} matched: #{x}" if $VERBOSE
|
221
223
|
update_rule('feste_form name_C')
|
222
224
|
@measure = x
|
225
|
+
binding.pry if break_condition
|
223
226
|
return pkg_size_to_int(pkg_size_L)
|
224
227
|
end
|
225
228
|
if einheit_M and x.eql?(einheit_M)
|
226
229
|
puts "feste_form in einheit_M #{einheit_M} matched: #{x}" if $VERBOSE
|
227
230
|
update_rule('feste_form einheit_M')
|
228
231
|
@measure = x
|
232
|
+
binding.pry if break_condition
|
229
233
|
return pkg_size_to_int(pkg_size_L)
|
230
234
|
end
|
231
235
|
}
|
@@ -234,18 +238,21 @@ public
|
|
234
238
|
puts "liquid_form in #{part_from_name_C} matched: #{x}" if $VERBOSE
|
235
239
|
update_rule('liquid_form name_C')
|
236
240
|
@measure = x
|
241
|
+
binding.pry if break_condition
|
237
242
|
return pkg_size_to_int(pkg_size_L, true)
|
238
243
|
end
|
239
244
|
if part_from_name_C and x.match(part_from_name_C.split(' ')[0])
|
240
245
|
puts "liquid_form in #{part_from_name_C} matched: #{x}" if $VERBOSE
|
241
246
|
update_rule('liquid_form first_part')
|
247
|
+
binding.pry if break_condition
|
242
248
|
return pkg_size_to_int(pkg_size_L, true)
|
243
249
|
end
|
244
250
|
if einheit_M and x.eql?(einheit_M)
|
245
251
|
puts "liquid_form in einheit_M #{einheit_M} matched: #{x}" if $VERBOSE
|
246
252
|
update_rule('liquid_form einheit_M')
|
247
253
|
@measure = x
|
248
|
-
|
254
|
+
binding.pry if break_condition
|
255
|
+
return pkg_size_to_int(pkg_size_L, Measurements.find{ |x| pkg_size_L.index(" #{x}")})
|
249
256
|
end
|
250
257
|
}
|
251
258
|
Measurements.each{ |x|
|
@@ -253,9 +260,11 @@ public
|
|
253
260
|
puts "measurement in pkg_size_L #{pkg_size_L} matched: #{x}" if $VERBOSE
|
254
261
|
update_rule('measurement pkg_size_L')
|
255
262
|
@measure = x
|
263
|
+
binding.pry if break_condition
|
256
264
|
return pkg_size_to_int(pkg_size_L, true)
|
257
265
|
end
|
258
266
|
}
|
267
|
+
binding.pry if break_condition
|
259
268
|
puts "Could not find anything for name_C #{part_from_name_C} pkg_size_L: #{pkg_size_L} einheit_M #{einheit_M}" if $VERBOSE
|
260
269
|
update_rule('unbekannt')
|
261
270
|
return 'unbekannt'
|