oddb2xml 2.2.7 → 2.2.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5231618926015f8fe6730a4bb96e5c1b02bcd7a6
4
- data.tar.gz: 46d8563881526d72bfafa74d328b599e59f5ead8
3
+ metadata.gz: 0a750539ac436cafb6b5b818c9767cdce87ba5a4
4
+ data.tar.gz: 98b62a3bbc44b6b68d69f7b1fb474c66d5627b74
5
5
  SHA512:
6
- metadata.gz: bcaad4b40f4e4a353c8d81a0628a766f71072926365ab4227b28c495448ef504f7a3870b13cbbe1ce6bc32f47f18ad844d6bade36f5ac4118275352361eaf044
7
- data.tar.gz: c34d48f22e6f16b235695f1fe911d0249884287d0f787ec891b3cd4db7d145a3c60b011b91c0228c7af33db0d5d61fdbb5c521ff197ca682d82a111506524abd
6
+ metadata.gz: 5325bf91c6a88bc753c4d9611397923bf1e62e1fd2c974e894c939eefd737c88201196ce919d69b35458aa6e281560fc3e9fa1201252c5e383baf3238609098c
7
+ data.tar.gz: 75990e37f5267bcebf5bf97a347cc6df2d4bc2863ea15b29c1fc5dfc73f5edee1d8d8553527c56e9a0d8f54a2ec53a4850ad8769e1c2b9c6e5fe3927da34f40b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oddb2xml (2.2.7)
4
+ oddb2xml (2.2.8)
5
5
  archive-tar-minitar
6
6
  httpi (>= 2.4.1)
7
7
  mechanize
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === 2.2.8 / 25.11.2015
2
+
3
+ * Improved spec tests against all XSD elements
4
+ * Fixed NINCD for LPPV items
5
+
1
6
  === 2.2.7 / 24.11.2015
2
7
 
3
8
  * Removed no more emitted QTY from definition of ART in oddb2xml.xsd
@@ -1103,7 +1103,7 @@ module Oddb2xml
1103
1103
  Oddb2xml.add_hash(_builder.to_xml)
1104
1104
  end
1105
1105
  def detect_nincd(de_idx)
1106
- if @lppvs[de_idx[:ean]] # LPPV
1106
+ if @lppvs[de_idx[:ean].to_s] # LPPV
1107
1107
  20
1108
1108
  elsif @items[de_idx[:pharmacode]] # BAG-XML (SL/LS)
1109
1109
  10
@@ -183,7 +183,7 @@ module Oddb2xml
183
183
  file = File.join(WorkDir, 'XMLPublications.zip')
184
184
  Oddb2xml.log "BagXmlDownloader #{__LINE__}: #{file}"
185
185
  unless Oddb2xml.skip_download(file)
186
- Oddb2xml.log "BagXmlDownloader #{__LINE__}: #{file}"
186
+ Oddb2xml.log "BagXmlDownloader #{__LINE__}: #{file}"
187
187
  begin
188
188
  response = @agent.get(@url)
189
189
  response.save_as(file)
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "2.2.7"
2
+ VERSION = "2.2.8"
3
3
  end
data/oddb2xml.xsd CHANGED
@@ -184,12 +184,12 @@
184
184
  <xs:element name="LIMPTS">
185
185
  <xs:simpleType>
186
186
  <xs:restriction base="xs:byte">
187
+ <xs:enumeration value="10" />
187
188
  <xs:enumeration value="20" />
188
189
  <xs:enumeration value="30" />
189
- <xs:enumeration value="60" />
190
- <xs:enumeration value="10" />
191
190
  <xs:enumeration value="40" />
192
191
  <xs:enumeration value="50" />
192
+ <xs:enumeration value="60" />
193
193
  <xs:enumeration value="80" />
194
194
  <xs:enumeration value="100" />
195
195
  </xs:restriction>
@@ -1084,12 +1084,12 @@
1084
1084
  <xs:element name="CDVALMD">
1085
1085
  <xs:simpleType>
1086
1086
  <xs:restriction base="xs:string">
1087
- <xs:enumeration value="X" />
1088
- <xs:enumeration value="E" />
1089
- <xs:enumeration value="D" />
1090
- <xs:enumeration value="C" />
1091
- <xs:enumeration value="B" />
1092
1087
  <xs:enumeration value="A" />
1088
+ <xs:enumeration value="B" />
1089
+ <xs:enumeration value="C" />
1090
+ <xs:enumeration value="D" />
1091
+ <xs:enumeration value="E" />
1092
+ <xs:enumeration value="X" />
1093
1093
  </xs:restriction>
1094
1094
  </xs:simpleType>
1095
1095
  </xs:element>
data/spec/builder_spec.rb CHANGED
@@ -3,7 +3,232 @@
3
3
  require 'spec_helper'
4
4
  require "rexml/document"
5
5
  include REXML
6
- RUN_ALL = false
6
+ RUN_ALL = true
7
+
8
+ # TODO: Add articles which contain these values
9
+ # not done, because it was easy to verify this by running on the command line grep 'LIMPTS' oddb_article.xml | sort | uniq
10
+ ARTICLE_ATTRIBUTE_TESTS = [
11
+ ['ARTICLE', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
12
+ ['ARTICLE', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
13
+ ['ARTICLE', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
14
+ ['ARTICLE/ART', 'SHA256', /[a-f0-9]{32}/],
15
+ ['ARTICLE/ART', 'DT', /\d{4}-\d{2}-\d{2}/],
16
+ ]
17
+
18
+ ARTICLE_MISSING_ELEMENTS = [
19
+ ['ARTICLE/ART/LIMPTS', '10'],
20
+ ['ARTICLE/ART/LIMPTS', '30'],
21
+ ['ARTICLE/ART/LIMPTS', '40'],
22
+ ['ARTICLE/ART/LIMPTS', '50'],
23
+ ['ARTICLE/ART/LIMPTS', '60'],
24
+ ['ARTICLE/ART/LIMPTS', '80'],
25
+ ['ARTICLE/ART/LIMPTS', '100'],
26
+ ['ARTICLE/ART/SLOPLUS', '1'],
27
+ ]
28
+
29
+ ARTICLE_ZURROSE_ELEMENTS = [
30
+ ['ARTICLE/ART/REF_DATA', '0'],
31
+ ['ARTICLE/ART/ARTCOMP/COMPNO', '7601001000858'],
32
+ ['ARTICLE/ART/ARTPRI/VDAT', Date.today.strftime('%d.%m.%Y')], # TODO:
33
+ ['ARTICLE/ART/ARTPRI/PTYP', 'PEXF'],
34
+ ['ARTICLE/ART/ARTPRI/PTYP', 'PPUB'],
35
+ ['ARTICLE/ART/ARTPRI/PTYP', 'ZURROSE'],
36
+ ['ARTICLE/ART/ARTPRI/PTYP', 'ZURROSEPUB'],
37
+ ['ARTICLE/ART/ARTINS/NINCD', '13'],
38
+ ['ARTICLE/ART/ARTINS/NINCD', '20'],
39
+ ]
40
+
41
+ ARTICLE_COMMON_ELEMENTS = [
42
+ ['ARTICLE/ART/REF_DATA', '1'],
43
+ ['ARTICLE/ART/SMCAT', 'A'],
44
+ ['ARTICLE/ART/SMCAT', 'B'],
45
+ ['ARTICLE/ART/SMCAT', 'C'],
46
+ ['ARTICLE/ART/SMCAT', 'D'],
47
+ ['ARTICLE/ART/GEN_PRODUCTION', 'X'],
48
+ ['ARTICLE/ART/DRUG_INDEX', 'd'],
49
+ ['ARTICLE/ART/INSULIN_CATEGORY', 'Insulinanalog: schnell wirkend'],
50
+ ['ARTICLE/ART/SMNO', '16105058'],
51
+ ['ARTICLE/ART/PRODNO', '161051'],
52
+ ['ARTICLE/ART/VAT', '2'],
53
+ ['ARTICLE/ART/SALECD', 'A'],
54
+ ['ARTICLE/ART/SALECD', 'I'],
55
+ ['ARTICLE/ART/COOL', '1'],
56
+ ['ARTICLE/ART/LIMPTS', '20'],
57
+ ['ARTICLE/ART/CDBG', 'Y'],
58
+ ['ARTICLE/ART/CDBG', 'N'],
59
+ ['ARTICLE/ART/BG', 'Y'],
60
+ ['ARTICLE/ART/BG', 'N'],
61
+ ['ARTICLE/ART/ARTBAR/BC', Oddb2xml::ORPHAN_GTIN.to_s],
62
+ ['ARTICLE/ART/ARTBAR/BC', Oddb2xml::FRIDGE_GTIN.to_s],
63
+ ['ARTICLE/ART/DSCRD', 'NAROPIN Inj Lös 0.2 % 5 Polybag 100 ml'],
64
+ ['ARTICLE/ART/DSCRF', 'NAROPIN sol inj 0.2 % 5 polybag 100 ml"'],
65
+ ['ARTICLE/ART/SORTD', 'NAROPIN INJ LöS 0.2 % 5 POLYBAG 100 ML'],
66
+ ['ARTICLE/ART/SORTF', 'NAROPIN SOL INJ 0.2 % 5 POLYBAG 100 ML'],
67
+ ['ARTICLE/ART/SYN1D', 'Hirudoid'],
68
+ ['ARTICLE/ART/SYN1F', 'Hirudoid'],
69
+ ['ARTICLE/ART/SLOPLUS', '2'],
70
+ ['ARTICLE/ART/ARTINS/NINCD', '10'],
71
+ ]
72
+
73
+ CODE_ATTRIBUTE_TESTS = [
74
+ ['CODE', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
75
+ ['CODE', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
76
+ ['CODE', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
77
+ ['CODE/CD', 'DT', ''],
78
+ ]
79
+
80
+ CODE_MISSING_ELEMENT_TESTS = [
81
+ ]
82
+
83
+ CODE_ELEMENT_TESTS = [
84
+ ['CODE/CD/CDTYP', '11'],
85
+ ['CODE/CD/CDTYP', '12'],
86
+ ['CODE/CD/CDTYP', '13'],
87
+ ['CODE/CD/CDTYP', '14'],
88
+ ['CODE/CD/CDTYP', '15'],
89
+ ['CODE/CD/CDTYP', '16'],
90
+ ['CODE/CD/CDVAL', 'A'],
91
+ ['CODE/CD/CDVAL', 'B'],
92
+ ['CODE/CD/CDVAL', 'C'],
93
+ ['CODE/CD/CDVAL', 'D'],
94
+ ['CODE/CD/CDVAL', 'E'],
95
+ ['CODE/CD/CDVAL', 'X'],
96
+ ['CODE/CD/DSCRSD', 'Kontraindiziert'],
97
+ ['CODE/CD/DSCRSD', 'Kombination meiden'],
98
+ ['CODE/CD/DSCRSD', 'Monitorisieren'],
99
+ ['CODE/CD/DSCRSD', 'Vorsichtsmassnahmen'],
100
+ ['CODE/CD/DSCRSD', 'keine Massnahmen'],
101
+ ['CODE/CD/DEL', 'false'],
102
+ ]
103
+
104
+ INTERACTION_ATTRIBUTE_TESTS = [
105
+ ['INTERACTION', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
106
+ ['INTERACTION', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
107
+ ['INTERACTION', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
108
+ ['INTERACTION/IX', 'SHA256', /[a-f0-9]{32}/],
109
+ ['INTERACTION/IX', 'DT', ''],
110
+ ]
111
+
112
+ INTERACTION_MISSING_ELEMENT_TESTS = [
113
+ ['INTERACTION/IX/EFFD', 'Kombination meiden'],
114
+ ['INTERACTION/IX/EFFD', 'Kontraindiziert'],
115
+ ['INTERACTION/IX/EFFD', 'Monitorisieren'],
116
+ ['INTERACTION/IX/EFFD', 'Vorsichtsmassnahmen'],
117
+ ['INTERACTION/IX/DEL', 'true'], # Never found???
118
+ ]
119
+
120
+ INTERACTION_ELEMENT_TESTS = [
121
+ ['INTERACTION/IX/IXNO', '2'],
122
+ ['INTERACTION/IX/TITD', 'Keine Interaktion'],
123
+ ['INTERACTION/IX/GRP1D', 'N06AB06'],
124
+ ['INTERACTION/IX/GRP2D', 'M03BX02'],
125
+ ['INTERACTION/IX/EFFD', 'Keine Interaktion.'],
126
+ ['INTERACTION/IX/MECHD', /Tizanidin wird über CYP1A2 metabolisiert/],
127
+ ['INTERACTION/IX/MEASD', /Die Kombination aus Sertralin und Tizanidin/],
128
+ ['INTERACTION/IX/DEL', 'false'],
129
+ ]
130
+
131
+ LIMITATION_ATTRIBUTE_TESTS = [
132
+ ['LIMITATION', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
133
+ ['LIMITATION', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
134
+ ['LIMITATION', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
135
+ ['LIMITATION/LIM', 'SHA256', /[a-f0-9]{32}/],
136
+ ['LIMITATION/LIM', 'DT', ''],
137
+ ]
138
+
139
+ # Found by grep LIMTYP oddb_limitation.xml | sort | uniq
140
+ LIMITATION_MISSING_ELEMENT_TESTS = [
141
+ ['LIMITATION/LIM/SwissmedicNo8', '62089002'],
142
+ ['LIMITATION/LIM/Pharmacode', '0'],
143
+ ['LIMITATION/LIM/LIMTYP', 'AUD'],
144
+ ['LIMITATION/LIM/LIMTYP', 'KOM'],
145
+ ['LIMITATION/LIM/LIMTYP', 'ZEI'],
146
+ ]
147
+
148
+ LIMITATION_ELEMENT_TESTS = [
149
+ ['LIMITATION/LIM/LIMVAL', '10'],
150
+ ['LIMITATION/LIM/LIMVAL', '20'],
151
+ ['LIMITATION/LIM/LIMVAL', '30'],
152
+ ['LIMITATION/LIM/LIMVAL', '40'],
153
+ ['LIMITATION/LIM/LIMVAL', '50'],
154
+ ['LIMITATION/LIM/LIMVAL', '60'],
155
+ ['LIMITATION/LIM/LIMVAL', '80'],
156
+ ['LIMITATION/LIM/LIMVAL', '100'],
157
+ ['LIMITATION/LIM/IT', '07.02.40.'],
158
+ ['LIMITATION/LIM/LIMTYP', 'DIA'],
159
+ ['LIMITATION/LIM/LIMTYP', 'PKT'],
160
+ ['LIMITATION/LIM/LIMNAMEBAG', '070240'],
161
+ ['LIMITATION/LIM/LIMNIV', 'IP'],
162
+ ['LIMITATION/LIM/VDAT', /\d{2}\.\d{2}\.\d{4}/],
163
+ ['LIMITATION/LIM/DSCRD', /Therapiedauer/],
164
+ ['LIMITATION/LIM/DSCRF', /Traitement de la pneumonie/],
165
+ ['LIMITATION/LIM/SwissmedicNo5', '28486'],
166
+ ]
167
+
168
+ SUBSTANCE_ATTRIBUTE_TESTS = [
169
+ ['SUBSTANCE', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
170
+ ['SUBSTANCE', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
171
+ ['SUBSTANCE', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
172
+ ['SUBSTANCE/SB', 'SHA256', /[a-f0-9]{32}/],
173
+ ['SUBSTANCE/SB', 'DT', ''],
174
+ ]
175
+
176
+ SUBSTANCE_MISSING_ELEMENT_TESTS = [
177
+ ]
178
+
179
+ SUBSTANCE_ELEMENT_TESTS = [
180
+ ['SUBSTANCE/SB/SUBNO', '1'],
181
+ ['SUBSTANCE/SB/NAML', 'Linezolidum'],
182
+ ]
183
+
184
+ # Betriebe and Medizinalpersonen don't work at the moment
185
+ BETRIEB_ATTRIBUTE_TESTS = [
186
+ ['Betriebe', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
187
+ ['Betriebe', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
188
+ ['Betriebe', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
189
+ ['Betriebe/Betrieb', 'DT', ''],
190
+ ]
191
+
192
+ BETRIEB_MISSING_ELEMENT_TESTS = [
193
+ ]
194
+
195
+ BETRIEB_ELEMENT_TESTS = [
196
+ ['Betriebe/Betrieb/GLN_Betrieb', '974633'],
197
+ ['Betriebe/Betrieb/Betriebsname_1', 'Betriebsname_1'],
198
+ ['Betriebe/Betrieb/Betriebsname_2', 'Betriebsname_2'],
199
+ ['Betriebe/Betrieb/Strasse', 'Strasse'],
200
+ ['Betriebe/Betrieb/Nummer', 'Nummer'],
201
+ ['Betriebe/Betrieb/PLZ', 'PLZ'],
202
+ ['Betriebe/Betrieb/Ort', 'Ort'],
203
+ ['Betriebe/Betrieb/Bewilligungskanton', 'Bewilligungskanton'],
204
+ ['Betriebe/Betrieb/Land', 'Land'],
205
+ ['Betriebe/Betrieb/Betriebstyp', 'Betriebstyp'],
206
+ ['Betriebe/Betrieb/BTM_Berechtigung', 'BTM_Berechtigung'],
207
+ ]
208
+
209
+ MEDIZINALPERSON_ATTRIBUTE_TESTS = [
210
+ ['Personen', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
211
+ ['Personen', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
212
+ ['Personen', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
213
+ ['Personen/Person', 'DT', ''],
214
+ ]
215
+
216
+ MEDIZINALPERSON_MISSING_ELEMENT_TESTS = [
217
+ ]
218
+
219
+ MEDIZINALPERSON_ELEMENT_TESTS = [
220
+ ['Personen/Person/GLN_Person', '56459'],
221
+ ['Personen/Person/Name', 'Name'],
222
+ ['Personen/Person/Vorname', 'Vorname'],
223
+ ['Personen/Person/PLZ', 'PLZ'],
224
+ ['Personen/Person/Ort', 'Ort'],
225
+ ['Personen/Person/Bewilligungskanton', 'Bewilligungskanton'],
226
+ ['Personen/Person/Land', 'Land'],
227
+ ['Personen/Person/Bewilligung_Selbstdispensation', 'Bewilligung_Selbstdispensation'],
228
+ ['Personen/Person/Diplom', 'Diplom'],
229
+ ['Personen/Person/BTM_Berechtigung', 'BTM_Berechtigung'],
230
+ ]
231
+
7
232
  def checkItemForRefdata(doc, pharmacode, isRefdata)
8
233
  article = XPath.match( doc, "//ART[PHAR=#{pharmacode.to_s}]").first
9
234
  name = article.elements['DSCRD'].text
@@ -14,6 +239,14 @@ def checkItemForRefdata(doc, pharmacode, isRefdata)
14
239
  article
15
240
  end
16
241
 
242
+ ['article', 'betrieb', 'code', 'interaction', 'limitation', 'medizinalperson', 'product', 'substance'].each do |cat|
243
+ eval "
244
+ def oddb_#{cat}_xml
245
+ File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_#{cat}.xml'))
246
+ end
247
+ "
248
+ end
249
+
17
250
  def check_article_IGM_format(line, price_kendural=825, add_80_percents=false)
18
251
  typ = line[0..1]
19
252
  name = line[10..59]
@@ -154,7 +387,7 @@ def checkArticleXml(checkERYTHROCIN = true)
154
387
 
155
388
  erythrocin_gtin = '7680202580475' # picked up from zur rose
156
389
  erythrocin = checkAndGetArticleWithGTIN(doc, erythrocin_gtin)
157
- expect(erythrocin.elements['DSCRD'].text).to eq("ERYTHROCIN i.v. Trockensub 1000 mg Amp") if checkERYTHROCIN
390
+ expect(erythrocin.elements['DSCRD'].text).to eq("ERYTHROCIN i.v. Trockensub 1000 mg Amp [!]") if checkERYTHROCIN
158
391
 
159
392
  lansoyl = checkAndGetArticleWithGTIN(doc, Oddb2xml::LANSOYL_GTIN)
160
393
  expect(lansoyl.elements['DSCRD'].text).to eq 'LANSOYL Gel 225 g'
@@ -210,8 +443,8 @@ def checkProductXml
210
443
  end
211
444
 
212
445
  describe Oddb2xml::Builder do
213
- NrExtendedArticles = 86
214
- NrSubstances = 12
446
+ NrExtendedArticles = 90
447
+ NrSubstances = 14
215
448
  NrProdno = 23
216
449
  NrPackages = 24
217
450
  RegExpDesitin = /1125819012LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk/
@@ -232,13 +465,12 @@ describe Oddb2xml::Builder do
232
465
  options = Oddb2xml::Options.new
233
466
  # @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options.opts).run }
234
467
  Oddb2xml::Cli.new(options.opts).run # to debug
235
- @article_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_article.xml'))
236
- @doc = Nokogiri::XML(File.open(@article_xml))
237
- @rexml = REXML::Document.new File.read(@article_xml)
468
+ @doc = Nokogiri::XML(File.open(oddb_article_xml))
469
+ @rexml = REXML::Document.new File.read(oddb_article_xml)
238
470
  end
239
471
 
240
472
  it 'should return produce a oddb_article.xml' do
241
- expect(File.exists?(@article_xml)).to eq true
473
+ expect(File.exists?(oddb_article_xml)).to eq true
242
474
  end
243
475
 
244
476
  it 'oddb_article.xml should contain a SHA256' do
@@ -247,7 +479,7 @@ describe Oddb2xml::Builder do
247
479
  end
248
480
 
249
481
  it 'should be possible to verify the oddb_article.xml' do
250
- result = Oddb2xml.verify_sha256(@article_xml)
482
+ result = Oddb2xml.verify_sha256(oddb_article_xml)
251
483
  expect(result)
252
484
  end
253
485
 
@@ -255,6 +487,23 @@ describe Oddb2xml::Builder do
255
487
  check_validation_via_xsd
256
488
  end
257
489
 
490
+ context 'XSD article' do
491
+ check_attributes(oddb_article_xml, ARTICLE_ATTRIBUTE_TESTS)
492
+ check_elements(oddb_article_xml, ARTICLE_COMMON_ELEMENTS)
493
+ end
494
+
495
+ context 'XSD betrieb' do
496
+ skip 'At the moment downloading and extractiong the medreg is broken!'
497
+ # check_attributes(oddb_betrieb_xml, BETRIEB_ATTRIBUTE_TESTS)
498
+ # check_elements(oddb_betrieb_xml, BETRIEB_COMMON_ELEMENTS)
499
+ end
500
+
501
+ context 'XSD medizinalperson' do
502
+ skip 'At the moment downloading and extractiong the medreg is broken!'
503
+ # check_attributes(oddb_medizinalperson_xml, MEDIZINAPERSON_ATTRIBUTE_TESTS)
504
+ # check_elements(oddb_medizinalperson_xml, MEDIZINAPERSON_COMMON_ELEMENTS)
505
+ end
506
+
258
507
  it 'should have a correct insulin (gentechnik) for 7680532900196' do
259
508
  expect(XPath.match( @rexml, "//ART/[BC='7680532900196']").size).to eq 1
260
509
  expect(XPath.match( @rexml, "//ART//GEN_PRODUCTION").size).to eq 2
@@ -317,7 +566,7 @@ if RUN_ALL
317
566
  end
318
567
 
319
568
  it 'should generate a valid oddb_product.xml' do
320
- expect(@res).to match(/products/)
569
+ expect(@res).to match(/products/) if @res
321
570
  checkProductXml
322
571
  end
323
572
  end
@@ -384,6 +633,12 @@ if RUN_ALL
384
633
  checkArticleXml
385
634
  end
386
635
 
636
+ context 'XSD' do
637
+ check_attributes(oddb_article_xml, ARTICLE_ATTRIBUTE_TESTS)
638
+ check_elements(oddb_article_xml, ARTICLE_COMMON_ELEMENTS)
639
+ check_elements(oddb_article_xml, ARTICLE_ZURROSE_ELEMENTS)
640
+ end
641
+
387
642
  it 'should emit a correct oddb_article.xml' do
388
643
  checkArticleXml(false)
389
644
  end
@@ -413,6 +668,26 @@ if RUN_ALL
413
668
  end
414
669
  end
415
670
 
671
+ context 'XSD limitation' do
672
+ check_attributes(oddb_limitation_xml, LIMITATION_ATTRIBUTE_TESTS)
673
+ check_elements(oddb_limitation_xml, LIMITATION_ELEMENT_TESTS)
674
+ end
675
+
676
+ context 'XSD code' do
677
+ check_attributes(oddb_code_xml, CODE_ATTRIBUTE_TESTS)
678
+ check_elements(oddb_code_xml, CODE_ELEMENT_TESTS)
679
+ end
680
+
681
+ context 'XSD interaction' do
682
+ check_attributes(oddb_interaction_xml, INTERACTION_ATTRIBUTE_TESTS)
683
+ check_elements(oddb_interaction_xml, INTERACTION_ELEMENT_TESTS)
684
+ end
685
+
686
+ context 'XSD substance' do
687
+ check_attributes(oddb_substance_xml, SUBSTANCE_ATTRIBUTE_TESTS)
688
+ check_elements(oddb_substance_xml, SUBSTANCE_ELEMENT_TESTS)
689
+ end
690
+
416
691
  it 'should emit a correct oddb_article.xml' do
417
692
  checkArticleXml
418
693
  end
@@ -431,8 +706,8 @@ if RUN_ALL
431
706
  end
432
707
 
433
708
  it 'should generate the flag ORPH for orphan' do
434
- doc = REXML::Document.new File.new(checkAndGetArticleXmlName('non-refdata'))
435
- orphan = checkAndGetArticleWithGTIN(doc, Oddb2xml::ORPHAN_GTIN)
709
+ doc = REXML::Document.new File.new(oddb_product_xml)
710
+ orphan = checkAndGetProductWithGTIN(doc, Oddb2xml::ORPHAN_GTIN)
436
711
  expect(orphan).not_to eq nil
437
712
  expect(orphan.elements['ORPH'].text).to eq("true")
438
713
  end
@@ -526,11 +801,10 @@ if RUN_ALL
526
801
  end
527
802
 
528
803
  it 'should generate the flag SALECD' do
529
- @article_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_article.xml'))
530
- expect(File.exists?(@article_xml)).to eq true
531
- FileUtils.cp(@article_xml, File.join(Oddb2xml::WorkDir, 'tst-SALECD.xml'))
532
- article_xml = IO.read(@article_xml)
533
- doc = REXML::Document.new File.new(@article_xml)
804
+ expect(File.exists?(oddb_article_xml)).to eq true
805
+ FileUtils.cp(oddb_article_xml, File.join(Oddb2xml::WorkDir, 'tst-SALECD.xml'))
806
+ article_xml = IO.read(oddb_article_xml)
807
+ doc = REXML::Document.new File.new(oddb_article_xml)
534
808
  expect(XPath.match( doc, "//REF_DATA" ).size).to be > 0
535
809
  checkItemForSALECD(doc, Oddb2xml::FERRO_GRADUMET_GTIN, 'A') # FERRO-GRADUMET Depottabl 30 Stk
536
810
  checkItemForSALECD(doc, Oddb2xml::SOFRADEX_GTIN, 'I') # SOFRADEX
@@ -546,9 +820,8 @@ if RUN_ALL
546
820
  end
547
821
 
548
822
  it 'should add 80 percent to zur_rose pubbprice' do
549
- @article_xml = File.expand_path(File.join(Oddb2xml::WorkDir, 'oddb_article.xml'))
550
- expect(File.exists?(@article_xml)).to eq true
551
- FileUtils.cp(@article_xml, File.join(Oddb2xml::WorkDir, 'tst-e80.xml'))
823
+ expect(File.exists?(oddb_article_xml)).to eq true
824
+ FileUtils.cp(oddb_article_xml, File.join(Oddb2xml::WorkDir, 'tst-e80.xml'))
552
825
  checkProductXml
553
826
  checkArticleXml
554
827
  checkPrices(true)
@@ -558,9 +831,10 @@ if RUN_ALL
558
831
  checkProductXml
559
832
  end
560
833
 
561
- it 'should generate a product with the COOL (fridge) attribute' do
562
- fridge_product = checkAndGetProductWithGTIN(doc, Oddb2xml::FRIDGE_GTIN)
563
- fridge_product.elements['COOL'].text.should == '1'
834
+ it 'should generate an article with the COOL (fridge) attribute' do
835
+ doc = REXML::Document.new File.new(oddb_article_xml)
836
+ fridge_product = checkAndGetArticleWithGTIN(doc, Oddb2xml::FRIDGE_GTIN)
837
+ fridge_product.elements['COOL'].text.should == '1'
564
838
  end
565
839
 
566
840
  it 'should generate a correct oddb_article.xml' do
data/spec/calc_spec.rb CHANGED
@@ -611,6 +611,7 @@ Die HILFSSTOFFE sind Aqua ad iniectabilia und Natrii chloridum.
611
611
  end
612
612
 
613
613
  describe Oddb2xml::Calc do
614
+ @@oddb_calc_xml = File.join(Oddb2xml::WorkDir, 'oddb_calc.xml')
614
615
 
615
616
  before(:all) do
616
617
  @savedDir = Dir.pwd
@@ -621,22 +622,78 @@ describe Oddb2xml::Calc do
621
622
  @run_time_options = '--calc --skip-download'
622
623
  @options = Oddb2xml::Options.new
623
624
  @options.parser.parse!(@run_time_options.split(' '))
624
- @oddb_calc_xml = File.join(Oddb2xml::WorkDir, 'oddb_calc.xml')
625
625
  @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(@options.opts).run }
626
- expect(File.exists?(@oddb_calc_xml)).to eq true
627
- @doc = REXML::Document.new File.read(@oddb_calc_xml)
626
+ expect(File.exists?(@@oddb_calc_xml)).to eq true
627
+ @doc = REXML::Document.new File.read(@@oddb_calc_xml)
628
+ @nokogiri = Nokogiri::XML(File.read(@@oddb_calc_xml))
628
629
  end
629
630
 
630
631
  after(:all) do
631
632
  Dir.chdir @savedDir if @savedDir and File.directory?(@savedDir)
632
633
  end
633
634
 
635
+ context "Verify elements from XSD" do
636
+ attribute_tests = [
637
+ ['ARTICLES', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
638
+ ['ARTICLES', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
639
+ ['ARTICLES', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
640
+ ['ARTICLES/ARTICLE', 'SHA256', /[a-f0-9]{32}/],
641
+ ]
642
+
643
+ check_attributes(@@oddb_calc_xml, attribute_tests)
644
+
645
+ element_tests = [
646
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/EXCIPIENS', /.*pro Vitro.*/],
647
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/EXCIPIENS', /.Excipiens ad solutionem.*/],
648
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/LABEL', 'I'],
649
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/LABEL', 'Solvens'],
650
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/LABEL_DESCRIPTION', 'Aminosäurenlösung'],
651
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/LABEL_DESCRIPTION', 'Fettemulsion'],
652
+ # ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/DOSE_TEXT', 'mg'],
653
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/SALTS/SALT/SUBSTANCE_NAME', 'Ceftriaxonum Natricum'],
654
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/CORRESP', /4240 kJ pro 1 l/],
655
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/CORRESP', /I\) et II\) et III\) corresp.*/],
656
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/CHEMICAL_SUBSTANCE/DOSE_TEXT', '10-50 mg'],
657
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/CHEMICAL_SUBSTANCE/MORE_INFO', 'ratio: 1:2-2.8'],
658
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/CHEMICAL_SUBSTANCE/SUBSTANCE_NAME', 'Levomenolum'],
659
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/IS_ACTIVE_AGENT', 'false'],
660
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/IS_ACTIVE_AGENT', 'true'],
661
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/MORE_INFO', 'conserv.'],
662
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/MORE_INFO', 'antiox.'],
663
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/MORE_INFO', 'Praeparatio sicca'],
664
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/QTY', '100'],
665
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/QTY', /4\.08/],
666
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/SUBSTANCE_NAME', 'E 124'],
667
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/SUBSTANCE_NAME', 'Lamivudinum'],
668
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/UNIT', 'mg'],
669
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/UNIT', 'mg'],
670
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/UNIT', 'µg'],
671
+ ['ARTICLES/ARTICLE/COMPOSITIONS/COMPOSITION/SUBSTANCES/SUBSTANCE/UNIT', /U\.I\.\/ml/],
672
+ ['ARTICLES/ARTICLE/GALENIC_FORM', 'Infusionsemulsion'],
673
+ ['ARTICLES/ARTICLE/GALENIC_FORM', 'Tropfen'],
674
+ ['ARTICLES/ARTICLE/GALENIC_GROUP', 'Lösungsmittel'],
675
+ ['ARTICLES/ARTICLE/GALENIC_GROUP', 'Tabletten'],
676
+ ['ARTICLES/ARTICLE/GTIN', Oddb2xml::FRIDGE_GTIN],
677
+ ['ARTICLES/ARTICLE/GTIN', Oddb2xml::ORPHAN_GTIN],
678
+ ['ARTICLES/ARTICLE/MEASURE', 'Suppositorien'],
679
+ ['ARTICLES/ARTICLE/MEASURE', /Ampulle\(n\)/],
680
+ ['ARTICLES/ARTICLE/NAME', 'Apligraf'],
681
+ ['ARTICLES/ARTICLE/NAME', 'Lansoyl, gelée'],
682
+ ['ARTICLES/ARTICLE/PKG_SIZE', '1'],
683
+ ['ARTICLES/ARTICLE/PKG_SIZE', '5 x 2500 ml'],
684
+ ['ARTICLES/ARTICLE/PKG_SIZE', '75 mm'],
685
+ ['ARTICLES/ARTICLE/SELLING_UNITS', '1'],
686
+ ['ARTICLES/ARTICLE/SELLING_UNITS', '60'],
687
+ ['ARTICLES/ARTICLE/SELLING_UNITS', 'unbekannt'],
688
+ ]
689
+ check_elements(@@oddb_calc_xml, element_tests)
690
+ end
634
691
  context "when passing #{@run_time_options}" do
635
692
  it 'should contain the new fields as per July 2015' do
636
693
  # xml.GEN_PRODUCTION gen_production
637
694
  # xml.INSULIN_CATEGORY insulin_category
638
695
  # xml.DRUG_INDEX drug_index
639
- expect(File.exists?(@oddb_calc_xml)).to eq true
696
+ expect(File.exists?(@@oddb_calc_xml)).to eq true
640
697
  end
641
698
 
642
699
  it 'should create a correct xml and a csv file' do
@@ -652,22 +709,7 @@ describe Oddb2xml::Calc do
652
709
  oddb_calc_xsd = File.expand_path(File.join(File.dirname(__FILE__), '..', 'oddb_calc.xsd'))
653
710
  expect(File.exists?(oddb_calc_xsd)).to eq true
654
711
  xsd = Nokogiri::XML::Schema(File.read(oddb_calc_xsd))
655
- doc = Nokogiri::XML(File.read(@oddb_calc_xml))
656
- xsd.validate(doc).each do |error| expect(error).to be_nil end
657
- end
658
-
659
- it 'should create correct entries for narotin' do
660
- gtin = '7680540151009'
661
- ean12 = '7680' + sprintf('%05d',Tst_naropin.iksnr_A) + sprintf('%03d',Tst_naropin.pack_K)
662
- ean13 = (ean12 + Oddb2xml.calc_checksum(ean12))
663
- expect(ean13).to eq gtin
664
-
665
- Tst_naropin.values_to_compare.each{
666
- | key, value |
667
- result = XPath.match( @doc, "//ARTICLE[GTIN='#{gtin}']/#{key.to_s.upcase}").first.text
668
- puts "Testing key #{key.inspect} #{value.inspect} against #{result} seems to fail" unless result == value.to_s
669
- expect(result).to eq value.to_s
670
- }
712
+ xsd.validate(@nokogiri).each do |error| expect(error).to be_nil end
671
713
  end
672
714
 
673
715
  it 'should create correct entries for narotin' do
Binary file
@@ -385,6 +385,7 @@ describe Oddb2xml::BagXmlDownloader do
385
385
  it_behaves_like 'any downloader'
386
386
  context 'when download is called' do
387
387
  let(:xml) {
388
+ VCR.eject_cassette
388
389
  VCR.use_cassette('oddb2xml', :tag => :bag_xml) do
389
390
  @downloader.download
390
391
  end
@@ -4,16 +4,27 @@ require 'spec_helper'
4
4
  require "#{Dir.pwd}/lib/oddb2xml/downloader"
5
5
  ENV['TZ'] = 'UTC' # needed for last_change
6
6
  LAST_CHANGE = "2015-07-03 00:00:00 +0000"
7
- NR_PACKS = 23
7
+ NR_PACKS = 24
8
+
9
+ def common_before
10
+ @savedDir = Dir.pwd
11
+ Dir.chdir(Oddb2xml::WorkDir)
12
+ VCR.eject_cassette; VCR.insert_cassette('oddb2xml')
13
+ end
14
+
15
+ def common_after
16
+ VCR.eject_cassette
17
+ Dir.chdir(@savedDir) if @savedDir and File.directory?(@savedDir)
18
+ end
8
19
 
9
20
  describe Oddb2xml::LppvExtractor do
10
21
  before(:all) {
11
- VCR.eject_cassette; VCR.insert_cassette('oddb2xml')
22
+ common_before
12
23
  @downloader = Oddb2xml::LppvDownloader.new
13
24
  @content = @downloader.download
14
25
  @lppvs = Oddb2xml::LppvExtractor.new(@content).to_hash
15
26
  }
16
- after(:all) { VCR.eject_cassette }
27
+ after(:all) { common_after }
17
28
  it "should have at least one item" do
18
29
  expect(@lppvs.size).not_to eq 0
19
30
  end
@@ -21,12 +32,12 @@ end
21
32
 
22
33
  describe Oddb2xml::MigelExtractor do
23
34
  before(:all) {
24
- VCR.eject_cassette; VCR.insert_cassette('oddb2xml')
35
+ common_before
25
36
  @downloader = Oddb2xml::MigelDownloader.new
26
37
  xml = @downloader.download
27
38
  @items = Oddb2xml::MigelExtractor.new(xml).to_hash
28
39
  }
29
- after(:all) { VCR.eject_cassette }
40
+ after(:all) { common_after }
30
41
  it "should have at some items" do
31
42
  expect(@items.size).not_to eq 0
32
43
  expect(@items.find{|k,v| 3248410 == v[:pharmacode] }).not_to be_nil
@@ -37,8 +48,8 @@ describe Oddb2xml::MigelExtractor do
37
48
  end
38
49
 
39
50
  describe Oddb2xml::RefdataExtractor do
40
- before(:all) { VCR.eject_cassette; VCR.insert_cassette('oddb2xml') }
41
- after(:all) { VCR.eject_cassette }
51
+ before(:all) { common_before }
52
+ after(:all) { common_after }
42
53
  @@last_change = '2015-11-24 00:00:00 +0000'
43
54
 
44
55
  context 'should handle pharma articles' do
@@ -96,8 +107,8 @@ describe Oddb2xml::RefdataExtractor do
96
107
  end
97
108
 
98
109
  describe Oddb2xml::BagXmlExtractor do
99
- before(:all) { VCR.eject_cassette; VCR.insert_cassette('oddb2xml') }
100
- after(:all) { VCR.eject_cassette }
110
+ before(:all) { common_before }
111
+ after(:all) { common_after }
101
112
  context 'should handle articles with and without pharmacode' do
102
113
  subject do
103
114
  dat = File.read(File.join(Oddb2xml::SpecData, 'Preparations.xml'))
@@ -129,8 +140,8 @@ describe Oddb2xml::BagXmlExtractor do
129
140
  end
130
141
 
131
142
  describe Oddb2xml::SwissmedicInfoExtractor do
132
- before(:all) { VCR.eject_cassette; VCR.insert_cassette('oddb2xml') }
133
- after(:all) { VCR.eject_cassette }
143
+ before(:all) { common_before }
144
+ after(:all) { common_after }
134
145
  include ServerMockHelper
135
146
  before(:each) do
136
147
  @downloader = Oddb2xml::SwissmedicInfoDownloader.new
@@ -153,8 +164,8 @@ describe Oddb2xml::SwissmedicInfoExtractor do
153
164
  end
154
165
 
155
166
  describe Oddb2xml::SwissmedicExtractor do
156
- before(:all) { VCR.eject_cassette; VCR.insert_cassette('oddb2xml'); cleanup_directories_before_run }
157
- after(:all) { VCR.eject_cassette }
167
+ before(:all) { common_before; cleanup_directories_before_run }
168
+ after(:all) { common_after }
158
169
  context 'when transfer.dat is empty' do
159
170
  subject { Oddb2xml::SwissmedicInfoExtractor.new("") }
160
171
  it { expect(subject.to_hash).to be_empty }
@@ -226,8 +237,8 @@ describe Oddb2xml::SwissmedicExtractor do
226
237
  end
227
238
 
228
239
  describe Oddb2xml::EphaExtractor do
229
- before(:all) { VCR.eject_cassette; VCR.insert_cassette('oddb2xml') }
230
- after(:all) { VCR.eject_cassette }
240
+ before(:all) { common_before }
241
+ after(:all) { common_after }
231
242
  context 'can parse epha_interactions.csv' do
232
243
  it {
233
244
  filename = File.join(Oddb2xml::SpecData, 'epha_interactions.csv')
@@ -239,14 +250,14 @@ describe Oddb2xml::EphaExtractor do
239
250
  end
240
251
 
241
252
  describe Oddb2xml::MedregbmExtractor do
242
- # before(:all) { VCR.eject_cassette; VCR.insert_cassette('oddb2xml') }
243
- # after(:all) { VCR.eject_cassette }
253
+ # before(:all) { common_before }
254
+ # after(:all) { common_after }
244
255
  it "pending"
245
256
  end
246
257
 
247
258
  describe Oddb2xml::ZurroseExtractor do
248
- before(:all) { VCR.eject_cassette; VCR.insert_cassette('oddb2xml') }
249
- after(:all) { VCR.eject_cassette }
259
+ before(:all) { common_before }
260
+ after(:all) { common_after }
250
261
  context 'when transfer.dat is empty' do
251
262
  subject { Oddb2xml::ZurroseExtractor.new("") }
252
263
  it { expect(subject.to_hash).to be_empty }
data/spec/spec_helper.rb CHANGED
@@ -30,6 +30,7 @@ module Oddb2xml
30
30
  WorkDir = File.join(File.dirname(__FILE__), 'run')
31
31
  Downloads = File.join(WorkDir, 'downloads')
32
32
  SpecCompressor = File.join(Oddb2xml::SpecData, 'compressor')
33
+ DATE_REGEXP = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[-+]\d{4}/
33
34
 
34
35
  GTINS_CALC = [
35
36
  '7680458820202', # for calc_spec.rb
@@ -167,6 +168,41 @@ module ServerMockHelper
167
168
  end
168
169
  end
169
170
 
171
+ def check_elements(xml_name, tests)
172
+ tests.each do |test|
173
+ path = test[0]
174
+ value = test[1]
175
+ it "should have correct entries #{value} for path #{path}" do
176
+ found = false
177
+ Nokogiri::XML(File.read(xml_name)).search(path, nil, nil).each do |x|
178
+ if value.match(x.text)
179
+ found= true
180
+ break
181
+ end
182
+ end
183
+ expect(found).to be true
184
+ end
185
+ end
186
+ end
187
+
188
+ def check_attributes(xml_name, tests)
189
+ tests.each do |test|
190
+ path = test[0]
191
+ attribute = test[1]
192
+ value = test[2]
193
+ it "should have correct value #{value} for attribute #{attribute} in #{path}" do
194
+ found = false
195
+ Nokogiri::XML(File.read(xml_name)).search(path, nil, nil).each do |x|
196
+ if value.match(x["#{attribute}"])
197
+ found= true
198
+ break
199
+ end
200
+ end
201
+ expect(found).to be true
202
+ end
203
+ end
204
+ end
205
+
170
206
  RSpec.configure do |config|
171
207
  config.run_all_when_everything_filtered = true
172
208
  config.filter_run :focus
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oddb2xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.7
4
+ version: 2.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhiro Asaka, Zeno R.R. Davatz, Niklaus Giger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-24 00:00:00.000000000 Z
11
+ date: 2015-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip