oddb2xml 2.2.7 → 2.2.8

Sign up to get free protection for your applications and to get access to all the features.
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