medreg 0.1 → 0.1.1
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 +7 -0
- data/.travis.yml +4 -2
- data/History.txt +5 -1
- data/README.textile +12 -1
- data/bin/merge_yaml +61 -0
- data/lib/medreg/company_importer.rb +23 -12
- data/lib/medreg/person_importer.rb +26 -12
- data/lib/medreg/version.rb +1 -1
- data/medreg.gemspec +1 -1
- data/test/test_company.rb +17 -40
- data/test/test_person.rb +43 -46
- data/test/test_run.rb +4 -1
- metadata +26 -37
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f55cbd956da4f88e6ba28632b08daa57a98aeb6e
|
4
|
+
data.tar.gz: c532ca10792ce3bdf697ebebbff3be28e722bd2f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 23bc712a7f410702280f18435b709b0181a946d38a1f71f68db9f233e54e310a145070ffb1162445965c10d3c6a1c05ab02fff37b353cf2522647f03529ce472
|
7
|
+
data.tar.gz: e05592a21ceab1c630cf0da1ccdd75f8d1a42685aac99eea263ee16e87c843fa5592379ed3e34bc953d3f37b4e08ae6ac7f778292252a99371fb952b81774131
|
data/.travis.yml
CHANGED
@@ -5,6 +5,8 @@ before_install:
|
|
5
5
|
install:
|
6
6
|
- bundle install --without debugger
|
7
7
|
|
8
|
+
cache: bundler
|
9
|
+
|
8
10
|
script:
|
9
11
|
- bundle exec ruby test/suite.rb
|
10
12
|
|
@@ -13,10 +15,10 @@ notifications:
|
|
13
15
|
- ngiger@ywesee.com
|
14
16
|
rvm:
|
15
17
|
- ruby-head
|
16
|
-
- 2.1.
|
18
|
+
- 2.1.3
|
17
19
|
- 2.0.0
|
18
20
|
- 1.9.3
|
19
|
-
- 1.8.7
|
20
21
|
matrix:
|
21
22
|
allow_failures:
|
22
23
|
- rvm: ruby-head
|
24
|
+
- rvm: 1.8.7
|
data/History.txt
CHANGED
data/README.textile
CHANGED
@@ -2,16 +2,27 @@ h1. medreg
|
|
2
2
|
|
3
3
|
* https://github.com/zdavatz/medreg
|
4
4
|
|
5
|
+
We use Travis-CI to ensure that our builds are always passing the unit test. !https://travis-ci.org/ngiger/medreg.svg?branch=master!:https://travis-ci.org/ngiger/medreg
|
6
|
+
|
5
7
|
h2. DESCRIPTION
|
6
8
|
|
7
9
|
Create yaml file for all
|
8
|
-
* companies in the health care
|
10
|
+
* companies in the health care from https://www.medregbm.admin.ch/
|
9
11
|
* medical persons from http://www.medregom.admin.ch/
|
10
12
|
|
11
13
|
h2. INSTALL:
|
12
14
|
|
13
15
|
* gem install medreg
|
14
16
|
|
17
|
+
|
18
|
+
h2. Useage
|
19
|
+
|
20
|
+
* @medreg -h@ # give helpl
|
21
|
+
* @medreg @ # get info from medreg for all doctors and pharmacies
|
22
|
+
* @medreg persons@ # get info from medreg for all doctors
|
23
|
+
* @medreg companies@ # get info from medreg for all pharmacies
|
24
|
+
* @merge_yaml output input_file_1 ..@ # merge all input files into the output
|
25
|
+
|
15
26
|
h2. DEVELOPERS:
|
16
27
|
|
17
28
|
* Zeno R.R. Davatz
|
data/bin/merge_yaml
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
root = Pathname.new(__FILE__).realpath.parent.parent
|
5
|
+
$:.unshift root.join('lib') if $0 == __FILE__
|
6
|
+
|
7
|
+
require 'optparse'
|
8
|
+
require "date"
|
9
|
+
require 'medreg'
|
10
|
+
require 'medreg/version'
|
11
|
+
require 'medreg/person'
|
12
|
+
|
13
|
+
ODDB = Medreg
|
14
|
+
def help
|
15
|
+
<<EOS
|
16
|
+
#$0 ver.#{Medreg::VERSION}
|
17
|
+
Usage:
|
18
|
+
#{File.basename(__FILE__)} output input_file_1..
|
19
|
+
Merge all input files into output_file
|
20
|
+
EOS
|
21
|
+
end
|
22
|
+
|
23
|
+
parser = OptionParser.new
|
24
|
+
opts = {}
|
25
|
+
parser.on_tail('-h', '--help') { puts help; exit }
|
26
|
+
|
27
|
+
args = ARGV.dup
|
28
|
+
begin
|
29
|
+
parser.parse!(args)
|
30
|
+
rescue OptionParser::MissingArgument,
|
31
|
+
OptionParser::InvalidArgument,
|
32
|
+
OptionParser::InvalidOption
|
33
|
+
puts help
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
|
37
|
+
begin
|
38
|
+
unless args.size >= 2
|
39
|
+
puts help
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
all = {}
|
43
|
+
to_add = {}
|
44
|
+
puts args.inspect
|
45
|
+
args[1..-1].each{
|
46
|
+
|input|
|
47
|
+
next if File.size(input) < 100
|
48
|
+
puts "reading from file #{input} #{File.size(input)} bytes"
|
49
|
+
to_add = YAML.load_file(input)
|
50
|
+
all = all.merge(to_add)
|
51
|
+
puts "Added to_add #{to_add.class} #{to_add.size}. Have now #{all.size} items"
|
52
|
+
}
|
53
|
+
puts "Have now #{all.size} items to be save into #{args[0]}"
|
54
|
+
File.open(args[0], 'w+') {|f| f.write(all.to_yaml) }
|
55
|
+
puts "Saved #{all.size} items into #{args[0]}. Size is #{(File.size(args[0])/1024).to_i} kBytes"
|
56
|
+
rescue Interrupt
|
57
|
+
puts "Unterbrochen. Breche mit Fehler ab"
|
58
|
+
exit 1
|
59
|
+
end
|
60
|
+
|
61
|
+
puts "#{__FILE__} completed successfully" if $VERBOSE
|
@@ -13,7 +13,7 @@ require 'psych' if RUBY_VERSION.match(/^1\.9/)
|
|
13
13
|
require "yaml"
|
14
14
|
|
15
15
|
module Medreg
|
16
|
-
DebugImport
|
16
|
+
DebugImport = defined?(Minitest) ? true : false
|
17
17
|
BetriebeURL = 'https://www.medregbm.admin.ch/Betrieb/Search'
|
18
18
|
BetriebeXLS_URL = "https://www.medregbm.admin.ch/Publikation/CreateExcelListBetriebs"
|
19
19
|
RegExpBetriebDetail = /\/Betrieb\/Details\//
|
@@ -63,25 +63,36 @@ module Medreg
|
|
63
63
|
@@logInfo = []
|
64
64
|
FileUtils.rm_f(Companies_YAML) if File.exists?(Companies_YAML)
|
65
65
|
@yaml_file = File.open(Companies_YAML, 'w+')
|
66
|
+
@companies_prev_import = 0
|
66
67
|
@companies_created = 0
|
67
|
-
@companies_updated = 0
|
68
68
|
@companies_skipped = 0
|
69
69
|
@companies_deleted = 0
|
70
70
|
@archive = ARCHIVE_PATH
|
71
|
-
@@all_companies =
|
71
|
+
@@all_companies = {}
|
72
72
|
setup_default_agent
|
73
73
|
end
|
74
|
+
def save_import_to_yaml(filename)
|
75
|
+
File.open(filename, 'w+') {|f| f.write(@@all_companies.to_yaml) }
|
76
|
+
save_for_log "Saved #{@@all_companies.size} doctors in #{filename}"
|
77
|
+
end
|
74
78
|
def update
|
75
79
|
saved = @glns_to_import.clone
|
80
|
+
r_loop = ResilientLoop.new(File.basename(__FILE__, '.rb'))
|
81
|
+
@state_yaml = r_loop.state_file.sub('.state', '.yaml')
|
82
|
+
if File.exist?(@state_yaml) and File.size(@state_yaml) > 10
|
83
|
+
@@all_companies = YAML.load_file(@state_yaml)
|
84
|
+
@companies_prev_import = @@all_companies.size
|
85
|
+
puts "Got #{@companies_prev_import} items from previous import saved in #{@state_yaml}"
|
86
|
+
end
|
76
87
|
latest = get_latest_file
|
77
88
|
save_for_log "parse_xls #{latest} specified GLN ids #{saved.inspect}"
|
78
89
|
parse_xls(latest)
|
79
90
|
@info_to_gln.keys
|
80
91
|
get_detail_to_glns(saved.size > 0 ? saved : @glns_to_import)
|
81
|
-
|
92
|
+
save_import_to_yaml(Companies_YAML)
|
93
|
+
return @companies_created, @companies_prev_import, @companies_deleted, @companies_skipped
|
82
94
|
ensure
|
83
|
-
|
84
|
-
save_for_log "Saved #{@@all_companies.size} companies in #{Companies_YAML}"
|
95
|
+
save_import_to_yaml(@state_yaml) if @companies_created > 0
|
85
96
|
end
|
86
97
|
def setup_default_agent
|
87
98
|
@agent = Mechanize.new
|
@@ -139,7 +150,7 @@ module Medreg
|
|
139
150
|
while nr_tries < max_retries and not success
|
140
151
|
begin
|
141
152
|
r_loop.try_run(gln, defined?(Minitest) ? 500 : 5 ) do
|
142
|
-
Medreg.log "Searching for company with GLN #{gln}.
|
153
|
+
Medreg.log "Searching for company with GLN #{gln}. Created #{@companies_created}. At #{@companies_created+@companies_prev_import} of #{glns.size}.#{nr_tries > 0 ? ' nr_tries is ' + nr_tries.to_s : ''}"
|
143
154
|
page_1 = @agent.get(BetriebeURL)
|
144
155
|
raise Search_failure if page_1.content.match(failure)
|
145
156
|
hash = [
|
@@ -156,7 +167,7 @@ module Medreg
|
|
156
167
|
raise Search_failure if page_3.content.match(failure)
|
157
168
|
company = parse_details(page_3, gln)
|
158
169
|
store_company(company)
|
159
|
-
@@all_companies
|
170
|
+
@@all_companies[gln] = company
|
160
171
|
else
|
161
172
|
Medreg.log "could not find gln #{gln}"
|
162
173
|
@companies_skipped += 1
|
@@ -169,8 +180,8 @@ module Medreg
|
|
169
180
|
nr_tries += 1
|
170
181
|
sleep defined?(MiniTest) ? 0.01 : 60
|
171
182
|
end
|
172
|
-
if (@companies_created + @
|
173
|
-
Medreg.log "Start saving
|
183
|
+
if (@companies_created + @companies_prev_import) % 100 == 99
|
184
|
+
Medreg.log "Start saving after #{@companies_created} created #{@companies_prev_import} from previous import"
|
174
185
|
end
|
175
186
|
end
|
176
187
|
}
|
@@ -193,7 +204,7 @@ module Medreg
|
|
193
204
|
def report
|
194
205
|
report = "Companies update \n\n"
|
195
206
|
report << "New companies: " << @companies_created.to_s << "\n"
|
196
|
-
report << "
|
207
|
+
report << "Companies from previous imports: " << @companies_prev_import.to_s << "\n"
|
197
208
|
report << "Deleted companies: " << @companies_deleted.to_s << "\n"
|
198
209
|
report
|
199
210
|
end
|
@@ -255,7 +266,7 @@ module Medreg
|
|
255
266
|
end
|
256
267
|
@glns_to_import = @info_to_gln.keys.sort.uniq
|
257
268
|
end
|
258
|
-
def
|
269
|
+
def CompanyImporter.all_companies
|
259
270
|
@@all_companies
|
260
271
|
end
|
261
272
|
end
|
@@ -16,7 +16,7 @@ require "yaml"
|
|
16
16
|
require 'timeout'
|
17
17
|
|
18
18
|
module Medreg
|
19
|
-
DebugImport = false
|
19
|
+
DebugImport = defined?(Minitest) ? true : false
|
20
20
|
Personen_Candidates = File.expand_path(File.join(__FILE__, '../../../data/Personen_20*.xlsx'))
|
21
21
|
Personen_YAML = File.expand_path(File.join(__FILE__, "../../../data/persons_#{Time.now.strftime('%Y.%m.%d-%H%M')}.yaml"))
|
22
22
|
Personen_CSV = File.expand_path(File.join(__FILE__, "../../../data/persons_#{Time.now.strftime('%Y.%m.%d-%H%M')}.csv"))
|
@@ -57,7 +57,7 @@ module Medreg
|
|
57
57
|
withTimeStamp = "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}: #{msg}" unless defined?(MiniTest)
|
58
58
|
@@logInfo << withTimeStamp
|
59
59
|
end
|
60
|
-
def initialize(
|
60
|
+
def initialize(glns_to_import = [])
|
61
61
|
@glns_to_import = glns_to_import.clone
|
62
62
|
@glns_to_import.delete_if {|item| item.size == 0}
|
63
63
|
@info_to_gln = {}
|
@@ -67,10 +67,10 @@ module Medreg
|
|
67
67
|
FileUtils.mkdir_p(File.dirname(Personen_YAML))
|
68
68
|
@yaml_file = File.open(Personen_YAML, 'w+')
|
69
69
|
@csv_file = File.open(Personen_CSV, 'w+')
|
70
|
-
@
|
71
|
-
@persons_updated = 0
|
70
|
+
@persons_prev_import = 0
|
72
71
|
@persons_skipped = 0
|
73
72
|
@persons_deleted = 0
|
73
|
+
@persons_created = 0
|
74
74
|
@skip_to_doctor = nil
|
75
75
|
@archive = ARCHIVE_PATH
|
76
76
|
@@all_doctors = {}
|
@@ -92,18 +92,31 @@ module Medreg
|
|
92
92
|
@@all_doctors.each{ |doctor| csv << [] }
|
93
93
|
end
|
94
94
|
end
|
95
|
+
|
96
|
+
def save_import_to_yaml(filename)
|
97
|
+
File.open(filename, 'w+') {|f| f.write(@@all_doctors.to_yaml) }
|
98
|
+
save_for_log "Saved #{@@all_doctors.size} doctors in #{filename}"
|
99
|
+
end
|
100
|
+
|
95
101
|
def update
|
96
102
|
saved = @glns_to_import.clone
|
103
|
+
r_loop = ResilientLoop.new(File.basename(__FILE__, '.rb'))
|
104
|
+
@state_yaml = r_loop.state_file.sub('.state', '.yaml')
|
105
|
+
if File.exist?(@state_yaml)
|
106
|
+
@@all_doctors = YAML.load_file(@state_yaml)
|
107
|
+
@persons_prev_import = @@all_doctors.size
|
108
|
+
puts "Got #{@persons_prev_import} items from previous import saved in #{@state_yaml}"
|
109
|
+
end
|
97
110
|
latest = get_latest_file
|
98
111
|
save_for_log "parse_xls #{latest} specified GLN glns #{saved.inspect}"
|
99
112
|
parse_xls(latest)
|
100
113
|
@info_to_gln.keys
|
101
114
|
get_detail_to_glns(saved.size > 0 ? saved : @glns_to_import)
|
102
|
-
|
115
|
+
save_import_to_yaml(Personen_YAML)
|
116
|
+
return @persons_created, @persons_prev_import, @persons_deleted, @persons_skipped
|
103
117
|
ensure
|
104
118
|
# write_csv_file
|
105
|
-
|
106
|
-
save_for_log "Saved #{@@all_doctors.size} doctors in #{Personen_YAML}"
|
119
|
+
save_import_to_yaml(@state_yaml) if @persons_created > 0
|
107
120
|
end
|
108
121
|
def setup_default_agent
|
109
122
|
@agent = Mechanize.new
|
@@ -212,6 +225,7 @@ module Medreg
|
|
212
225
|
end
|
213
226
|
medregId = page_4.body.match(regExp)[1]
|
214
227
|
page_5 = @agent.get(MedRegOmURL + "de/Detail/Detail?pid=#{medregId}")
|
228
|
+
|
215
229
|
File.open(File.join(LOG_PATH, "#{gln}.html"), 'w+') { |f| f.write page_5.content } if DebugImport
|
216
230
|
doc_hash = parse_details( Nokogiri::HTML(page_5.content), gln, info)
|
217
231
|
store_doctor(doc_hash)
|
@@ -234,7 +248,7 @@ module Medreg
|
|
234
248
|
nr_tries = 0
|
235
249
|
while nr_tries < max_retries
|
236
250
|
begin
|
237
|
-
Medreg.log "Searching for doctor with GLN #{gln}.
|
251
|
+
Medreg.log "Searching for doctor with GLN #{gln}. Created #{@persons_created}. At #{@persons_created+@persons_prev_import} of #{glns.size}.#{nr_tries > 0 ? ' nr_tries is ' + nr_tries.to_s : ''}"
|
238
252
|
get_one_doctor(r_loop, gln)
|
239
253
|
break
|
240
254
|
rescue Mechanize::ResponseCodeError, Timeout::Error => e
|
@@ -251,8 +265,8 @@ module Medreg
|
|
251
265
|
end
|
252
266
|
raise "Max retries #{nr_tries} for #{gln.to_s} reached. Aborting import" if nr_tries == max_retries
|
253
267
|
@persons_created += 1
|
254
|
-
if (@persons_created + @
|
255
|
-
Medreg.log "Start saving after #{@persons_created} created #{@
|
268
|
+
if (@persons_created + @persons_prev_import) % 100 == 99
|
269
|
+
Medreg.log "Start saving after #{@persons_created} created #{@persons_prev_import} from previous import"
|
256
270
|
end
|
257
271
|
}
|
258
272
|
r_loop.finished
|
@@ -329,7 +343,7 @@ module Medreg
|
|
329
343
|
report = "Persons update \n\n"
|
330
344
|
report << "Skipped doctors: #{@persons_skipped}#{@skip_to_doctor ? '. Waited for ' + @skip_to_doctor.to_s : ''}" << "\n"
|
331
345
|
report << "New doctors: " << @persons_created.to_s << "\n"
|
332
|
-
report << "
|
346
|
+
report << "Doctors from previous imports: " << @persons_prev_import.to_s << "\n"
|
333
347
|
report << "Deleted doctors: " << @persons_deleted.to_s << "\n"
|
334
348
|
report
|
335
349
|
end
|
@@ -375,7 +389,7 @@ module Medreg
|
|
375
389
|
}
|
376
390
|
end
|
377
391
|
def parse_xls(path)
|
378
|
-
|
392
|
+
Medreg.log "parsing #{path}"
|
379
393
|
workbook = RubyXL::Parser.parse(path)
|
380
394
|
positions = []
|
381
395
|
rows = 0
|
data/lib/medreg/version.rb
CHANGED
data/medreg.gemspec
CHANGED
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "rake"
|
24
24
|
spec.add_development_dependency "flexmock"
|
25
25
|
spec.add_development_dependency "simplecov"
|
26
|
-
spec.add_development_dependency "minitest"
|
26
|
+
spec.add_development_dependency "minitest"
|
27
27
|
end
|
28
28
|
|
data/test/test_company.rb
CHANGED
@@ -9,45 +9,24 @@ $: << File.expand_path("../../src", File.dirname(__FILE__))
|
|
9
9
|
gem 'minitest'
|
10
10
|
require 'minitest/autorun'
|
11
11
|
require 'flexmock'
|
12
|
-
require 'medreg/
|
12
|
+
require 'medreg/company_importer'
|
13
13
|
require 'tempfile'
|
14
14
|
|
15
15
|
module Medreg
|
16
16
|
class TestCompanyPlugin <Minitest::Test
|
17
17
|
include FlexMock::TestCase
|
18
18
|
Test_Companies_XLSX = File.expand_path(File.join(__FILE__, '../data/companies_20141014.xlsx'))
|
19
|
+
def rm_log_files
|
20
|
+
FileUtils.rm_f(Dir.glob("#{Medreg::LOG_PATH}/*"), :verbose => true)
|
21
|
+
end
|
19
22
|
def setup
|
20
|
-
|
21
|
-
:empty_ids => nil,
|
22
|
-
:pointer => 'pointer'
|
23
|
-
)
|
24
|
-
@config = flexmock('config')
|
25
|
-
@company = flexmock('company', :pointer => 'pointer',
|
26
|
-
:ean13= => 'ean13',
|
27
|
-
:name= => 'name',
|
28
|
-
:addresses= => 'addresses',
|
29
|
-
:business_area= => 'business_area',
|
30
|
-
:odba_isolated_store => 'odba_isolated_store',
|
31
|
-
:oid => 'oid',
|
32
|
-
:narcotics= => 'narcotics',
|
33
|
-
:odba_store => 'odba_store',
|
34
|
-
)
|
35
|
-
@app = flexmock('appX',
|
36
|
-
:config => @config,
|
37
|
-
:create_company => @company,
|
38
|
-
:companies => [@company],
|
39
|
-
:company_by_gln => nil,
|
40
|
-
:company_by_origin => @company,
|
41
|
-
:update => 'update',
|
42
|
-
)
|
43
|
-
@plugin = Medreg::Company.new(@app)
|
44
|
-
flexmock(@plugin, :get_latest_file => [true, Test_Companies_XLSX])
|
23
|
+
rm_log_files
|
45
24
|
$stderr.puts "Test_Companies_XLSX #{Test_Companies_XLSX}"
|
46
25
|
end
|
47
26
|
|
48
27
|
def test_update_7601002026444
|
49
|
-
@plugin = Medreg::
|
50
|
-
flexmock(@plugin, :get_latest_file =>
|
28
|
+
@plugin = Medreg::CompanyImporter.new([7601001396371])
|
29
|
+
flexmock(@plugin, :get_latest_file => Test_Companies_XLSX)
|
51
30
|
flexmock(@plugin, :get_company_data => {})
|
52
31
|
flexmock(@plugin, :puts => nil)
|
53
32
|
startTime = Time.now
|
@@ -60,29 +39,29 @@ class TestCompanyPlugin <Minitest::Test
|
|
60
39
|
assert_equal(0, updated)
|
61
40
|
assert_equal(0, deleted)
|
62
41
|
assert_equal(0, skipped)
|
63
|
-
assert_equal(1, Medreg::
|
42
|
+
assert_equal(1, Medreg::CompanyImporter.all_companies.size)
|
64
43
|
assert(File.exists?(csv_file), "file #{csv_file} must be created")
|
65
|
-
linden = Medreg::
|
44
|
+
linden = Medreg::CompanyImporter.all_companies[7601001396371]
|
66
45
|
addresses = linden[:addresses]
|
67
46
|
assert_equal(1, addresses.size)
|
68
47
|
first_address = addresses.first
|
69
|
-
assert_equal(
|
70
|
-
assert_equal(
|
48
|
+
assert_equal(Medreg::Address2, first_address.class)
|
49
|
+
assert_equal([], first_address.fon)
|
71
50
|
assert_equal('5102 Rupperswil', first_address.location)
|
72
51
|
assert_equal('öffentliche Apotheke', linden[:ba_type])
|
73
52
|
assert_equal('5102', first_address.plz)
|
74
53
|
assert_equal('Rupperswil', first_address.city)
|
75
54
|
assert_equal('4', first_address.number)
|
76
55
|
assert_equal('Mitteldorf', first_address.street)
|
77
|
-
assert_equal(
|
56
|
+
assert_equal([], first_address.additional_lines)
|
78
57
|
assert_equal('AB Lindenapotheke AG', first_address.name)
|
79
58
|
inhalt = IO.read(csv_file)
|
80
59
|
assert(inhalt.index('6011 Verzeichnis a/b/c BetmVV-EDI') > 0, 'must find btm')
|
81
60
|
# 7601001396371 AB Lindenapotheke AG Mitteldorf 4 5102 Rupperswil Aargau Schweiz öffentliche Apotheke 6011 Verzeichnis a/b/c BetmVV-EDI
|
82
61
|
end
|
83
62
|
def test_update_all
|
84
|
-
@plugin = Medreg::
|
85
|
-
flexmock(@plugin, :get_latest_file =>
|
63
|
+
@plugin = Medreg::CompanyImporter.new()
|
64
|
+
flexmock(@plugin, :get_latest_file => Test_Companies_XLSX)
|
86
65
|
flexmock(@plugin, :get_company_data => {})
|
87
66
|
flexmock(@plugin, :puts => nil)
|
88
67
|
startTime = Time.now
|
@@ -101,12 +80,10 @@ class TestCompanyPlugin <Minitest::Test
|
|
101
80
|
def test_get_latest_file
|
102
81
|
current = File.expand_path(File.join(__FILE__, "../../../data/xls/companies_#{Time.now.strftime('%Y.%m.%d')}.xlsx"))
|
103
82
|
FileUtils.rm_f(current) if File.exists?(current)
|
104
|
-
@plugin = Medreg::
|
83
|
+
@plugin = Medreg::CompanyImporter.new()
|
105
84
|
res = @plugin.get_latest_file
|
106
|
-
assert(res
|
107
|
-
assert(
|
108
|
-
assert(File.exists?(res[1]), 'companies_latest.xls must exist')
|
109
|
-
assert(File.size(Test_Companies_XLSX) <File.size(res[1]))
|
85
|
+
assert(res.match(Time.now.strftime('%Y.%m.%d')), "filename must match latest not #{res}")
|
86
|
+
assert(File.size(Test_Companies_XLSX) <File.size(res))
|
110
87
|
end
|
111
88
|
end
|
112
89
|
end
|
data/test/test_person.rb
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
4
|
$: << File.expand_path('..', File.dirname(__FILE__))
|
5
|
-
$: << File.expand_path("
|
6
|
-
|
5
|
+
$: << File.expand_path("../lib", File.dirname(__FILE__))
|
6
|
+
puts File.expand_path("../lib", File.dirname(__FILE__))
|
7
7
|
gem 'minitest'
|
8
8
|
require 'minitest/autorun'
|
9
9
|
require 'flexmock'
|
10
|
-
require 'medreg/
|
10
|
+
require 'medreg/person_importer'
|
11
11
|
require 'tempfile'
|
12
12
|
require 'ostruct'
|
13
13
|
|
@@ -16,20 +16,13 @@ Minitest::Test.i_suck_and_my_tests_are_order_dependent!()
|
|
16
16
|
class TestPerson <Minitest::Test
|
17
17
|
include FlexMock::TestCase
|
18
18
|
RunTestTakingLong = false
|
19
|
-
Test_Personen_XLSX = File.expand_path(File.join(__FILE__, '
|
19
|
+
Test_Personen_XLSX = File.expand_path(File.join(__FILE__, '../data/Personen_20141014.xlsx'))
|
20
|
+
def rm_log_files
|
21
|
+
FileUtils.rm_f(Dir.glob("#{Medreg::LOG_PATH}/*"), :verbose => true)
|
22
|
+
end
|
23
|
+
|
20
24
|
def setup
|
21
|
-
|
22
|
-
@doctor = flexmock('doctor', :pointer => 'pointer', :oid => 'oid')
|
23
|
-
@app = flexmock('app',
|
24
|
-
:config => @config,
|
25
|
-
:doctors => [@doctor],
|
26
|
-
:create_doctor => @doctor,
|
27
|
-
:doctor_by_gln => nil,
|
28
|
-
:doctor_by_origin => @doctor,
|
29
|
-
:update => 'update'
|
30
|
-
)
|
31
|
-
@plugin = Medreg::Person.new(@app)
|
32
|
-
flexmock(@plugin, :get_latest=> Test_Personen_XLSX)
|
25
|
+
rm_log_files
|
33
26
|
end
|
34
27
|
|
35
28
|
SomeTestCases = {
|
@@ -41,12 +34,13 @@ class TestPerson <Minitest::Test
|
|
41
34
|
def test_aaa_zuest # name starts with aaa we want this test to be run as first
|
42
35
|
{ 7601000254207 => OpenStruct.new(:family_name => 'Züst', :first_name => 'Peter', :authority => 'Glarus')}.each do
|
43
36
|
|gln, info|
|
44
|
-
|
45
|
-
|
37
|
+
rm_log_files
|
38
|
+
@plugin = Medreg::PersonImporter.new([gln])
|
39
|
+
flexmock(@plugin, :get_latest_file => Test_Personen_XLSX )
|
46
40
|
flexmock(@plugin, :get_doctor_data => {})
|
47
|
-
assert(File.exists?(Test_Personen_XLSX))
|
41
|
+
assert(File.exists?(Test_Personen_XLSX) , "File #{Test_Personen_XLSX} must exist")
|
48
42
|
startTime = Time.now
|
49
|
-
csv_file =
|
43
|
+
csv_file = Medreg::Personen_YAML
|
50
44
|
FileUtils.rm_f(csv_file) if File.exists?(csv_file)
|
51
45
|
created, updated, deleted, skipped = @plugin.update
|
52
46
|
diffTime = (Time.now - startTime).to_i
|
@@ -74,7 +68,7 @@ class TestPerson <Minitest::Test
|
|
74
68
|
addresses = zuest[:addresses]
|
75
69
|
assert_equal(1, addresses.size)
|
76
70
|
first_address = addresses.first
|
77
|
-
assert_equal(
|
71
|
+
assert_equal(Medreg::Address2, first_address.class)
|
78
72
|
assert_equal(1, first_address.fon.size)
|
79
73
|
assert_equal(['Bahnhofstr. 3'], first_address.additional_lines)
|
80
74
|
assert_equal('8753 Mollis', first_address.location)
|
@@ -87,33 +81,17 @@ class TestPerson <Minitest::Test
|
|
87
81
|
assert_equal('3', first_address.number)
|
88
82
|
end
|
89
83
|
end
|
90
|
-
def test_parse
|
91
|
-
SomeTestCases.each{
|
92
|
-
|gln, info|
|
93
|
-
info.gln = gln
|
94
|
-
root = File.expand_path(File.join(__FILE__, "../.."))
|
95
|
-
@plugin = Medreg::Person.new(@app, [gln])
|
96
|
-
html_file = "#{root}/data/html/medreg/#{gln}.html"
|
97
|
-
assert(File.exist?(html_file), "File \#{html_file} must exist")
|
98
|
-
doc_hash = @plugin.parse_details(Nokogiri::HTML(File.read(html_file)),
|
99
|
-
gln,
|
100
|
-
info,
|
101
|
-
)
|
102
|
-
assert(doc_hash.is_a?(Hash), 'doc_hash must be a Hash')
|
103
|
-
assert(doc_hash[:addresses], 'doc_hash must have addresses')
|
104
|
-
assert(doc_hash[:addresses].size > 0, 'doc_hash must have at least one address')
|
105
|
-
}
|
106
|
-
end
|
107
84
|
|
108
85
|
def test_update_single
|
109
86
|
SomeTestCases.each{
|
110
87
|
|gln, info|
|
111
|
-
|
112
|
-
|
88
|
+
rm_log_files
|
89
|
+
@plugin = Medreg::PersonImporter.new([gln])
|
90
|
+
flexmock(@plugin, :get_latest_file => Test_Personen_XLSX )
|
113
91
|
flexmock(@plugin, :get_doctor_data => {})
|
114
92
|
assert(File.exists?(Test_Personen_XLSX))
|
115
93
|
startTime = Time.now
|
116
|
-
csv_file =
|
94
|
+
csv_file = Medreg::Personen_YAML
|
117
95
|
FileUtils.rm_f(csv_file) if File.exists?(csv_file)
|
118
96
|
created, updated, deleted, skipped = @plugin.update
|
119
97
|
diffTime = (Time.now - startTime).to_i
|
@@ -122,7 +100,7 @@ class TestPerson <Minitest::Test
|
|
122
100
|
assert_equal(1, created)
|
123
101
|
assert_equal(0, updated)
|
124
102
|
assert(File.exists?(csv_file), "file #{csv_file} must be created")
|
125
|
-
expected = "
|
103
|
+
expected = "Persons update \n\nSkipped doctors: 0\nNew doctors: 1\nDoctors from previous imports: 0\nDeleted doctors: 0\n"
|
126
104
|
assert_equal(expected, @plugin.report)
|
127
105
|
}
|
128
106
|
end
|
@@ -130,13 +108,13 @@ class TestPerson <Minitest::Test
|
|
130
108
|
def test_update_some_glns
|
131
109
|
glns_ids_to_search = [7601000078261, 7601000813282, 7601000254207, 7601000186874, 7601000201522, 7601000295958,
|
132
110
|
7601000010735, 7601000268969, 7601000019080, 7601000239730 ]
|
133
|
-
@plugin = Medreg::
|
111
|
+
@plugin = Medreg::PersonImporter.new(glns_ids_to_search)
|
134
112
|
|
135
|
-
flexmock(@plugin, :get_latest_file =>
|
113
|
+
flexmock(@plugin, :get_latest_file => Test_Personen_XLSX )
|
136
114
|
flexmock(@plugin, :get_doctor_data => {})
|
137
115
|
assert(File.exists?(Test_Personen_XLSX))
|
138
116
|
startTime = Time.now
|
139
|
-
csv_file =
|
117
|
+
csv_file = Medreg::Personen_YAML
|
140
118
|
FileUtils.rm_f(csv_file) if File.exists?(csv_file)
|
141
119
|
created, updated, deleted, skipped = @plugin.update
|
142
120
|
diffTime = (Time.now - startTime).to_i
|
@@ -148,7 +126,26 @@ class TestPerson <Minitest::Test
|
|
148
126
|
end if RunTestTakingLong
|
149
127
|
|
150
128
|
def test_zzz_get_latest_file # name starts with zzz we want this test to be run as last one (takes longest)
|
151
|
-
@plugin = Medreg::
|
129
|
+
@plugin = Medreg::PersonImporter.new([7601000813282])
|
152
130
|
needs_update, latest = @plugin.get_latest_file
|
153
131
|
end if RunTestTakingLong
|
132
|
+
|
133
|
+
def test_parse
|
134
|
+
SomeTestCases.each{
|
135
|
+
|gln, info|
|
136
|
+
info.gln = gln
|
137
|
+
root = File.expand_path(File.join(__FILE__, "../.."))
|
138
|
+
@plugin = Medreg::PersonImporter.new([gln])
|
139
|
+
html_file = File.expand_path(File.join(__FILE__, "../data/#{gln}.html"))
|
140
|
+
assert(File.exist?(html_file), "File #{html_file} must exist")
|
141
|
+
doc_hash = @plugin.parse_details(Nokogiri::HTML(File.read(html_file)),
|
142
|
+
gln,
|
143
|
+
info,
|
144
|
+
)
|
145
|
+
assert(doc_hash.is_a?(Hash), 'doc_hash must be a Hash')
|
146
|
+
assert(doc_hash[:addresses], 'doc_hash must have addresses')
|
147
|
+
assert(doc_hash[:addresses].size > 0, 'doc_hash must have at least one address')
|
148
|
+
}
|
149
|
+
end
|
150
|
+
|
154
151
|
end
|
data/test/test_run.rb
CHANGED
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: medreg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Niklaus Giger, Zeno R.R. Davatz
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-18 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: mechanize
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rubyXL
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - '='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - '='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,98 +41,90 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: bundler
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rake
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: flexmock
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - ">="
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - ">="
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: simplecov
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - ">="
|
100
88
|
- !ruby/object:Gem::Version
|
101
89
|
version: '0'
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - ">="
|
108
95
|
- !ruby/object:Gem::Version
|
109
96
|
version: '0'
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: minitest
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - ">="
|
116
102
|
- !ruby/object:Gem::Version
|
117
103
|
version: '0'
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
|
-
- -
|
108
|
+
- - ">="
|
124
109
|
- !ruby/object:Gem::Version
|
125
110
|
version: '0'
|
126
111
|
description: Personen und Betriebe Adressen für die Schweiz.
|
127
112
|
email: ngiger@ywesee.com, zdavatz@ywesee.com
|
128
113
|
executables:
|
129
114
|
- medreg
|
115
|
+
- merge_yaml
|
130
116
|
extensions: []
|
131
117
|
extra_rdoc_files: []
|
132
118
|
files:
|
133
|
-
- .gitignore
|
134
|
-
- .travis.yml
|
119
|
+
- ".gitignore"
|
120
|
+
- ".travis.yml"
|
135
121
|
- Gemfile
|
136
122
|
- History.txt
|
137
123
|
- LICENSE
|
138
124
|
- README.textile
|
139
125
|
- Rakefile
|
140
126
|
- bin/medreg
|
127
|
+
- bin/merge_yaml
|
141
128
|
- lib/medreg.rb
|
142
129
|
- lib/medreg/address.rb
|
143
130
|
- lib/medreg/ba_type.rb
|
@@ -149,6 +136,9 @@ files:
|
|
149
136
|
- lib/medreg/resilient_loop.rb
|
150
137
|
- lib/medreg/version.rb
|
151
138
|
- medreg.gemspec
|
139
|
+
- test/data/7601000010735.html
|
140
|
+
- test/data/7601000813282.html
|
141
|
+
- test/data/Personen_20141014.xlsx
|
152
142
|
- test/data/companies_20141014.xlsx
|
153
143
|
- test/suite.rb
|
154
144
|
- test/test_company.rb
|
@@ -157,26 +147,25 @@ files:
|
|
157
147
|
homepage: https://github.com/zdavatz/medreg
|
158
148
|
licenses:
|
159
149
|
- GPL-v2
|
150
|
+
metadata: {}
|
160
151
|
post_install_message:
|
161
152
|
rdoc_options: []
|
162
153
|
require_paths:
|
163
154
|
- lib
|
164
155
|
required_ruby_version: !ruby/object:Gem::Requirement
|
165
|
-
none: false
|
166
156
|
requirements:
|
167
|
-
- -
|
157
|
+
- - ">="
|
168
158
|
- !ruby/object:Gem::Version
|
169
159
|
version: '0'
|
170
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
-
none: false
|
172
161
|
requirements:
|
173
|
-
- -
|
162
|
+
- - ">="
|
174
163
|
- !ruby/object:Gem::Version
|
175
164
|
version: '0'
|
176
165
|
requirements: []
|
177
166
|
rubyforge_project:
|
178
|
-
rubygems_version: 1.
|
167
|
+
rubygems_version: 2.1.11
|
179
168
|
signing_key:
|
180
|
-
specification_version:
|
169
|
+
specification_version: 4
|
181
170
|
summary: Helper module for ch.oddb.org
|
182
171
|
test_files: []
|