oddb2xml 1.5.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -1,3 +1,7 @@
1
+ === 1.5.3 / 08.07.2013
2
+
3
+ * Add -p option for zurrose transfer.dat
4
+
1
5
  === 1.5.2 / 12.06.2013
2
6
 
3
7
  * Improve NINCD detection
@@ -17,9 +17,10 @@ Usage:
17
17
  -c F, --compress=F Compress format F. {tar.gz|zip}
18
18
  -f F, --format=F File format F, default is xml. {xml|dat}
19
19
  If F is given, -o option is ignored.
20
- -o O, --option=O Optional output. O, only 'fi' is available.
21
20
  -i I, --include=I Include target option for 'dat' format. only 'ean14' is available.
22
21
  'xml' format includes always ean14 records.
22
+ -o O, --option=O Optional output. O, only 'fi' is available.
23
+ -p P, --price=P Price source (transfer.dat). P, only 'zurrose' is available.
23
24
  -t S, --tag-suffix=S XML tag suffix S. Default is none. [A-z0-9]
24
25
  If S is given, it is also used as prefix of filename.
25
26
  -x N, --context=N context N {product|address}. product is default.
@@ -46,6 +47,7 @@ parser.on('-o v', '--option v', /^fi$/) {|v| opts[:fi] = true }
46
47
  parser.on('-i v', '--include v', /^ean14$/) {|v| opts[:ean14] = true }
47
48
  parser.on('-t v', '--tag-suffix v', /^[A-z0-9]*$/i) {|v| opts[:tag_suffix] = v.upcase }
48
49
  parser.on('-x v', '--context v', /^addr(ess)*$/i){|v| opts[:address] = true }
50
+ parser.on('-p v', '--prices v', /^zurrose$/) {|v| opts[:price] = v.intern }
49
51
  #parser.on('--debug') {|v| opts[:debug] = true }
50
52
  parser.on_tail('-h', '--help') { puts help; exit }
51
53
 
@@ -19,7 +19,7 @@ module Oddb2xml
19
19
  class Builder
20
20
  attr_accessor :subject, :index, :items, :flags, :lppvs,
21
21
  :actions, :migel, :orphans, :fridges,
22
- :infos, :packs,
22
+ :infos, :packs, :prices,
23
23
  :ean14, :tag_suffix,
24
24
  :companies, :people
25
25
  def initialize
@@ -31,6 +31,7 @@ module Oddb2xml
31
31
  @infos = {}
32
32
  @packs = {}
33
33
  @migel = {}
34
+ @prices = {} # zurrose
34
35
  @actions = []
35
36
  @orphans = []
36
37
  @fridges = []
@@ -645,7 +646,14 @@ module Oddb2xml
645
646
  #xml.LINENO
646
647
  #xml.NOUNITS
647
648
  #}
648
- if pac
649
+ if !@prices.empty? && de_idx[:ean] && \
650
+ price = @prices[de_idx[:ean]] # zurrose
651
+ xml.ARTPRI {
652
+ xml.VDAT datetime
653
+ xml.PTYP "ZURROSE"
654
+ xml.PRICE price
655
+ }
656
+ elsif pac
649
657
  pac[:prices].each_pair do |key, price|
650
658
  xml.ARTPRI {
651
659
  xml.VDAT price[:valid_date] unless price[:valid_date].empty?
@@ -22,6 +22,7 @@ module Oddb2xml
22
22
  @lppvs = {} # lppv.txt from files repo
23
23
  @infos = {} # [option] FI from SwissmedicInfo
24
24
  @packs = {} # [option] Packungen from Swissmedic for dat
25
+ @prices = {} # [addition] prices from zurrose transfer.txt
25
26
  @migel = {} # [addition] additional Non Pharma products from files repo
26
27
  @actions = [] # [addition] interactions from epha
27
28
  @orphans = [] # [addition] Orphaned drugs from Swissmedic xls
@@ -53,6 +54,9 @@ module Oddb2xml
53
54
  if @options[:nonpharma]
54
55
  threads << download(:migel) # oddb2xml_files
55
56
  end
57
+ if @options[:price] # zurrose
58
+ threads << download(@options[:price])
59
+ end
56
60
  threads << download(:package) # swissmedic
57
61
  threads << download(:bm_update) # oddb2xml_files
58
62
  threads << download(:lppv) # oddb2xml_files
@@ -109,7 +113,7 @@ module Oddb2xml
109
113
  builder.infos = @infos
110
114
  builder.packs = @packs
111
115
  # additional sources
112
- %w[actions orphans fridges migel].each do |addition|
116
+ %w[actions orphans fridges migel prices].each do |addition|
113
117
  builder.send("#{addition}=".intern, self.instance_variable_get("@#{addition}"))
114
118
  end
115
119
  end
@@ -225,6 +229,15 @@ module Oddb2xml
225
229
  @items = hsh
226
230
  end
227
231
  end
232
+ when :zurrose
233
+ Thread.new do
234
+ downloader = ZurroseDownloader.new(@options)
235
+ xml = downloader.download
236
+ @mutex.synchronize do
237
+ hsh = ZurroseExtractor.new(xml).to_hash
238
+ @prices = hsh
239
+ end
240
+ end
228
241
  when :index
229
242
  Thread.new do
230
243
  downloader = SwissIndexDownloader.new(@options, type, lang)
@@ -8,12 +8,13 @@ module Oddb2xml
8
8
  module DownloadMethod
9
9
  private
10
10
  def download_as(file, option='r')
11
+ data = nil
11
12
  begin
12
13
  response = @agent.get(@url)
13
14
  response.save_as(file)
14
15
  response = nil # win
15
16
  io = File.open(file, option)
16
- return io.read
17
+ data = io.read
17
18
  rescue Timeout::Error, Errno::ETIMEDOUT
18
19
  retrievable? ? retry : raise
19
20
  ensure
@@ -22,6 +23,7 @@ module Oddb2xml
22
23
  File.unlink(file)
23
24
  end
24
25
  end
26
+ return data
25
27
  end
26
28
  end
27
29
  class Downloader
@@ -109,6 +111,13 @@ module Oddb2xml
109
111
  download_as('oddb2xml_files_lppv.txt', 'r')
110
112
  end
111
113
  end
114
+ class ZurroseDownloader < Downloader
115
+ include DownloadMethod
116
+ def download
117
+ @url ||= 'http://zurrose.com/fileadmin/main/lib/download.php?file=/fileadmin/user_upload/downloads/DOS/IGM01_ohne_MwSt/Vollstamm/transfer.dat'
118
+ download_as('oddb2xml_zurrose_transfer.dat', 'r:iso-8859-1:utf-8')
119
+ end
120
+ end
112
121
  class MedregbmDownloader < Downloader
113
122
  include DownloadMethod
114
123
  def initialize(type=:company)
@@ -407,4 +407,19 @@ module Oddb2xml
407
407
  data
408
408
  end
409
409
  end
410
+ class ZurroseExtractor < Extractor
411
+ def initialize(dat)
412
+ @io = StringIO.new(dat)
413
+ end
414
+ def to_hash
415
+ data = {}
416
+ while line = @io.gets
417
+ next unless line =~ /(7680\d{9})\r\n$/
418
+ ean = $1.to_s
419
+ price = line[60,6].gsub(/(\d{2})$/, "." + $1.to_s).to_f.round(2).to_s
420
+ data[ean] = price
421
+ end
422
+ data
423
+ end
424
+ end
410
425
  end
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "1.5.2"
2
+ VERSION = "1.5.3"
3
3
  end
@@ -284,3 +284,23 @@ describe Oddb2xml::MedregbmDownloader do
284
284
  end
285
285
  end
286
286
  end
287
+
288
+ describe Oddb2xml::ZurroseDownloader do
289
+ include ServerMockHelper
290
+ before(:each) do
291
+ setup_zurrose_server_mock
292
+ @downloader = Oddb2xml::ZurroseDownloader.new
293
+ end
294
+ it_behaves_like 'any downloader'
295
+ context 'when download is called' do
296
+ let(:dat) { @downloader.download }
297
+ it 'should read dat as String' do
298
+ dat.should be_a String
299
+ dat.bytes.should_not nil
300
+ end
301
+ it 'should clean up current directory' do
302
+ dat.should_not raise_error(Timeout::Error)
303
+ File.exist?('oddb2xml_zurrose_transfer.dat').should be(false)
304
+ end
305
+ end
306
+ end
@@ -228,6 +228,20 @@ module ServerMockHelper
228
228
  :headers => {'Content-Type' => 'text/plain; charset=utf-8'},
229
229
  :body => stub_response)
230
230
  end
231
+ def setup_zurrose_server_mock
232
+ # dat
233
+ stub_dat_url = 'http://zurrose.com/fileadmin/main/lib/download.php?file=/fileadmin/user_upload/downloads/DOS/IGM01_ohne_MwSt/Vollstamm/transfer.dat'
234
+ stub_response = File.read(File.expand_path('../data/zurrose_transfer.dat', __FILE__))
235
+ stub_request(:get, stub_dat_url).
236
+ with(:headers => {
237
+ 'Accept' => '*/*',
238
+ 'Host' => 'zurrose.com',
239
+ }).
240
+ to_return(
241
+ :status => 200,
242
+ :headers => {'Content-Type' => 'text/plain; charset=utf-8'},
243
+ :body => stub_response)
244
+ end
231
245
  end
232
246
 
233
247
  RSpec.configure do |config|
metadata CHANGED
@@ -1,186 +1,206 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: oddb2xml
3
- version: !ruby/object:Gem::Version
4
- version: 1.5.2
3
+ version: !ruby/object:Gem::Version
4
+ hash: 5
5
5
  prerelease:
6
+ segments:
7
+ - 1
8
+ - 5
9
+ - 3
10
+ version: 1.5.3
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Yasuhiro Asaka, Zeno R.R. Davatz
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-06-12 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2013-07-08 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: rubyzip
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
22
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
- - !ruby/object:Gem::Dependency
31
- name: archive-tar-minitar
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
38
32
  type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: archive-tar-minitar
39
36
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
37
+ requirement: &id002 !ruby/object:Gem::Requirement
41
38
  none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: mechanize
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
52
- - !ruby/object:Gem::Version
53
- version: 2.5.1
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
54
46
  type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: mechanize
55
50
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
51
+ requirement: &id003 !ruby/object:Gem::Requirement
57
52
  none: false
58
- requirements:
53
+ requirements:
59
54
  - - ~>
60
- - !ruby/object:Gem::Version
55
+ - !ruby/object:Gem::Version
56
+ hash: 25
57
+ segments:
58
+ - 2
59
+ - 5
60
+ - 1
61
61
  version: 2.5.1
62
- - !ruby/object:Gem::Dependency
63
- name: nokogiri
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
62
  type: :runtime
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
65
+ name: nokogiri
71
66
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
78
- - !ruby/object:Gem::Dependency
79
- name: savon
80
- requirement: !ruby/object:Gem::Requirement
67
+ requirement: &id004 !ruby/object:Gem::Requirement
81
68
  none: false
82
- requirements:
83
- - - ! '>='
84
- - !ruby/object:Gem::Version
85
- version: '2.0'
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
86
76
  type: :runtime
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: savon
87
80
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
81
+ requirement: &id005 !ruby/object:Gem::Requirement
89
82
  none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '2.0'
94
- - !ruby/object:Gem::Dependency
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 2
89
+ - 0
90
+ version: "2.0"
91
+ type: :runtime
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
95
94
  name: spreadsheet
96
- requirement: !ruby/object:Gem::Requirement
95
+ prerelease: false
96
+ requirement: &id006 !ruby/object:Gem::Requirement
97
97
  none: false
98
- requirements:
99
- - - ! '>='
100
- - !ruby/object:Gem::Version
101
- version: '0'
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
102
105
  type: :runtime
106
+ version_requirements: *id006
107
+ - !ruby/object:Gem::Dependency
108
+ name: rspec
103
109
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- - !ruby/object:Gem::Dependency
111
- name: rdoc
112
- requirement: !ruby/object:Gem::Requirement
110
+ requirement: &id007 !ruby/object:Gem::Requirement
113
111
  none: false
114
- requirements:
115
- - - ~>
116
- - !ruby/object:Gem::Version
117
- version: '4.0'
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
118
119
  type: :development
120
+ version_requirements: *id007
121
+ - !ruby/object:Gem::Dependency
122
+ name: webmock
119
123
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ~>
124
- - !ruby/object:Gem::Version
125
- version: '4.0'
126
- - !ruby/object:Gem::Dependency
127
- name: rspec
128
- requirement: !ruby/object:Gem::Requirement
124
+ requirement: &id008 !ruby/object:Gem::Requirement
129
125
  none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 3
130
+ segments:
131
+ - 0
132
+ version: "0"
134
133
  type: :development
134
+ version_requirements: *id008
135
+ - !ruby/object:Gem::Dependency
136
+ name: hoe
135
137
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
138
+ requirement: &id009 !ruby/object:Gem::Requirement
137
139
  none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
142
- - !ruby/object:Gem::Dependency
143
- name: webmock
144
- requirement: !ruby/object:Gem::Requirement
145
- none: false
146
- requirements:
147
- - - ! '>='
148
- - !ruby/object:Gem::Version
149
- version: '0'
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ hash: 15
144
+ segments:
145
+ - 3
146
+ - 4
147
+ version: "3.4"
150
148
  type: :development
149
+ version_requirements: *id009
150
+ - !ruby/object:Gem::Dependency
151
+ name: rdoc
151
152
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
+ requirement: &id010 !ruby/object:Gem::Requirement
153
154
  none: false
154
- requirements:
155
- - - ! '>='
156
- - !ruby/object:Gem::Version
157
- version: '0'
158
- - !ruby/object:Gem::Dependency
159
- name: hoe
160
- requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ hash: 3
159
+ segments:
160
+ - 0
161
+ version: "0"
162
+ type: :development
163
+ version_requirements: *id010
164
+ - !ruby/object:Gem::Dependency
165
+ name: rdoc
166
+ prerelease: false
167
+ requirement: &id011 !ruby/object:Gem::Requirement
161
168
  none: false
162
- requirements:
163
- - - ! '>='
164
- - !ruby/object:Gem::Version
165
- version: '3.4'
169
+ requirements:
170
+ - - ~>
171
+ - !ruby/object:Gem::Version
172
+ hash: 19
173
+ segments:
174
+ - 3
175
+ - 10
176
+ version: "3.10"
166
177
  type: :development
178
+ version_requirements: *id011
179
+ - !ruby/object:Gem::Dependency
180
+ name: hoe
167
181
  prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
182
+ requirement: &id012 !ruby/object:Gem::Requirement
169
183
  none: false
170
- requirements:
171
- - - ! '>='
172
- - !ruby/object:Gem::Version
173
- version: '3.4'
184
+ requirements:
185
+ - - ~>
186
+ - !ruby/object:Gem::Version
187
+ hash: 25
188
+ segments:
189
+ - 2
190
+ - 13
191
+ version: "2.13"
192
+ type: :development
193
+ version_requirements: *id012
174
194
  description: oddb2xml creates xml files using swissINDEX, BAG-XML and Swissmedic.
175
195
  email: yasaka@ywesee.com, zdavatz@ywesee.com
176
- executables:
196
+ executables:
177
197
  - oddb2xml
178
198
  extensions: []
179
- extra_rdoc_files:
199
+
200
+ extra_rdoc_files:
180
201
  - History.txt
181
202
  - Manifest.txt
182
- - README.md
183
- files:
203
+ files:
184
204
  - .gitignore
185
205
  - .rspec
186
206
  - Gemfile
@@ -234,30 +254,40 @@ files:
234
254
  - tools/cacert.pem
235
255
  - tools/set.bat
236
256
  - tools/win_fetch_cacerts.rb
237
- homepage: https://github.com/zdavatz/oddb2xml
257
+ - .gemtest
258
+ homepage:
238
259
  licenses: []
260
+
239
261
  post_install_message:
240
- rdoc_options:
262
+ rdoc_options:
241
263
  - --main
242
- - README.md
243
- require_paths:
264
+ - README.txt
265
+ require_paths:
244
266
  - lib
245
- required_ruby_version: !ruby/object:Gem::Requirement
267
+ required_ruby_version: !ruby/object:Gem::Requirement
246
268
  none: false
247
- requirements:
248
- - - ! '>='
249
- - !ruby/object:Gem::Version
250
- version: '0'
251
- required_rubygems_version: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ hash: 3
273
+ segments:
274
+ - 0
275
+ version: "0"
276
+ required_rubygems_version: !ruby/object:Gem::Requirement
252
277
  none: false
253
- requirements:
254
- - - ! '>='
255
- - !ruby/object:Gem::Version
256
- version: '0'
278
+ requirements:
279
+ - - ">="
280
+ - !ruby/object:Gem::Version
281
+ hash: 3
282
+ segments:
283
+ - 0
284
+ version: "0"
257
285
  requirements: []
286
+
258
287
  rubyforge_project: oddb2xml
259
- rubygems_version: 1.8.23
288
+ rubygems_version: 1.8.25
260
289
  signing_key:
261
290
  specification_version: 3
262
291
  summary: oddb2xml creates xml files.
263
292
  test_files: []
293
+