medreg 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'timeout'
5
+ require 'medreg'
6
+
7
+ module Medreg
8
+ #
9
+ # ResilientLoop is a helper class for running long lasting jobs like imports
10
+ # It has the following characterstics
11
+ # * Possible to restart a failed job at the failing id
12
+ # * Retry an import after a timeout (e.g. of 10 seconds)
13
+ #
14
+ # -------------
15
+ # requirements:
16
+ # -------------
17
+ # Needed is state-id (e.g. an EAN13 code) which allows to distingish whether
18
+ # a loop item was already processed or not
19
+ #
20
+ # ---------------
21
+ # implementation:
22
+ # ---------------
23
+ # the state is saved in a text file
24
+ #
25
+ ExampleUsage = %(
26
+ r_loop = ResilientLoop.new(LoopName)
27
+ loop_entries.each{
28
+ |entry|
29
+ next if r_loop.must_skip?(entry)
30
+ r_loop.try_run(entry, TimeoutValue) { /* do your work */ }
31
+ }
32
+ r_loop.finished
33
+ )
34
+ class ResilientLoop
35
+ attr_reader :state_file, :nr_skipped, :state_id
36
+ attr_writer :nr_retries
37
+
38
+ def initialize(loopname, state_id = nil)
39
+ @loopname = loopname
40
+ @state_id = state_id
41
+ @nr_skipped = 0
42
+ @nr_retries = 3
43
+ get_state
44
+ end
45
+
46
+ def must_skip?(id)
47
+ return false unless @state_id
48
+ if id
49
+ clear_state if id.to_s.eql?(@state_id.to_s)
50
+ @nr_skipped += 1
51
+ return true
52
+ else
53
+ return false
54
+ end
55
+ end
56
+
57
+ def try_run(state, timeout_in_secs = 10, &block)
58
+ idx = 0
59
+ while idx < @nr_retries
60
+ idx += 1
61
+ begin
62
+ status = timeout(timeout_in_secs) do
63
+ block.call
64
+ save_state(state)
65
+ return
66
+ end
67
+ rescue Timeout::Error
68
+ raise Timeout::Error if @nr_retries == idx
69
+ end
70
+ end
71
+ end
72
+
73
+ def finished
74
+ clear_state
75
+ end
76
+ private
77
+ def get_state
78
+ @state_file = File.join(LOG_PATH, @loopname + '.state')
79
+ if File.exists?(@state_file)
80
+ content = IO.read(@state_file)
81
+ eval("@state_id = #{content}")
82
+ else
83
+ @state_id = nil
84
+ end
85
+ end
86
+ def save_state(state)
87
+ File.open(@state_file, 'w+') { |f| f.write(state)}
88
+ end
89
+ def clear_state
90
+ @state_id = nil
91
+ FileUtils.rm_f(@state_file)
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Medreg
4
+ VERSION = '0.1'
5
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'medreg/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "medreg"
8
+ spec.version = Medreg::VERSION
9
+ spec.author = "Niklaus Giger, Zeno R.R. Davatz"
10
+ spec.email = "ngiger@ywesee.com, zdavatz@ywesee.com"
11
+ spec.description = "Personen und Betriebe Adressen für die Schweiz."
12
+ spec.summary = "Helper module for ch.oddb.org"
13
+ spec.homepage = "https://github.com/zdavatz/medreg"
14
+ spec.license = "GPL-v2"
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_dependency 'mechanize'
20
+ spec.add_dependency 'rubyXL', '3.3.1'
21
+
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "flexmock"
25
+ spec.add_development_dependency "simplecov"
26
+ spec.add_development_dependency "minitest" if /^1\./.match(RUBY_VERSION)
27
+ end
28
+
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ $: << File.expand_path(File.dirname(__FILE__))
5
+ # require 'minitest'
6
+ require 'simplecov'
7
+ SimpleCov.start
8
+
9
+ Dir.foreach(File.dirname(__FILE__)) { |file|
10
+ require file if /^test_.*\.rb$/o.match(file)
11
+ }
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # TestCompanyPlugin -- oddb.org -- 11.05.2012 -- yasaka@ywesee.com
4
+ # TestCompanyPlugin -- oddb.org -- 23.03.2011 -- mhatakeyama@ywesee.com
5
+
6
+ $: << File.expand_path('..', File.dirname(__FILE__))
7
+ $: << File.expand_path("../../src", File.dirname(__FILE__))
8
+
9
+ gem 'minitest'
10
+ require 'minitest/autorun'
11
+ require 'flexmock'
12
+ require 'medreg/company'
13
+ require 'tempfile'
14
+
15
+ module Medreg
16
+ class TestCompanyPlugin <Minitest::Test
17
+ include FlexMock::TestCase
18
+ Test_Companies_XLSX = File.expand_path(File.join(__FILE__, '../data/companies_20141014.xlsx'))
19
+ def setup
20
+ @config = flexmock('config',
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])
45
+ $stderr.puts "Test_Companies_XLSX #{Test_Companies_XLSX}"
46
+ end
47
+
48
+ def test_update_7601002026444
49
+ @plugin = Medreg::Company.new(@app, [7601001396371])
50
+ flexmock(@plugin, :get_latest_file => [true, Test_Companies_XLSX])
51
+ flexmock(@plugin, :get_company_data => {})
52
+ flexmock(@plugin, :puts => nil)
53
+ startTime = Time.now
54
+ csv_file = Medreg::Companies_YAML
55
+ FileUtils.rm_f(csv_file) if File.exists?(csv_file)
56
+ created, updated, deleted, skipped = @plugin.update
57
+ diffTime = (Time.now - startTime).to_i
58
+ # $stdout.puts "result: created #{created} deleted #{deleted} skipped #{skipped} in #{diffTime} seconds"
59
+ assert_equal(1, created)
60
+ assert_equal(0, updated)
61
+ assert_equal(0, deleted)
62
+ assert_equal(0, skipped)
63
+ assert_equal(1, Medreg::Company.all_companies.size)
64
+ assert(File.exists?(csv_file), "file #{csv_file} must be created")
65
+ linden = Medreg::Company.all_companies.first
66
+ addresses = linden[:addresses]
67
+ assert_equal(1, addresses.size)
68
+ first_address = addresses.first
69
+ assert_equal(ODDB::Address2, first_address.class)
70
+ assert_equal(nil, first_address.fon)
71
+ assert_equal('5102 Rupperswil', first_address.location)
72
+ assert_equal('öffentliche Apotheke', linden[:ba_type])
73
+ assert_equal('5102', first_address.plz)
74
+ assert_equal('Rupperswil', first_address.city)
75
+ assert_equal('4', first_address.number)
76
+ assert_equal('Mitteldorf', first_address.street)
77
+ assert_equal(nil, first_address.additional_lines)
78
+ assert_equal('AB Lindenapotheke AG', first_address.name)
79
+ inhalt = IO.read(csv_file)
80
+ assert(inhalt.index('6011 Verzeichnis a/b/c BetmVV-EDI') > 0, 'must find btm')
81
+ # 7601001396371 AB Lindenapotheke AG Mitteldorf 4 5102 Rupperswil Aargau Schweiz öffentliche Apotheke 6011 Verzeichnis a/b/c BetmVV-EDI
82
+ end
83
+ def test_update_all
84
+ @plugin = Medreg::Company.new(@app)
85
+ flexmock(@plugin, :get_latest_file => [true, Test_Companies_XLSX])
86
+ flexmock(@plugin, :get_company_data => {})
87
+ flexmock(@plugin, :puts => nil)
88
+ startTime = Time.now
89
+ csv_file = Medreg::Companies_YAML
90
+ FileUtils.rm_f(csv_file) if File.exists?(csv_file)
91
+ created, updated, deleted, skipped = @plugin.update
92
+ diffTime = (Time.now - startTime).to_i
93
+ # $stdout.puts "result: created #{created} deleted #{deleted} skipped #{skipped} in #{diffTime} seconds"
94
+ assert_equal(3, created)
95
+ assert_equal(0, updated)
96
+ assert_equal(0, deleted)
97
+ assert_equal(1, skipped)
98
+ assert(File.exists?(csv_file), "file #{csv_file} must be created")
99
+ end
100
+
101
+ def test_get_latest_file
102
+ current = File.expand_path(File.join(__FILE__, "../../../data/xls/companies_#{Time.now.strftime('%Y.%m.%d')}.xlsx"))
103
+ FileUtils.rm_f(current) if File.exists?(current)
104
+ @plugin = Medreg::Company.new(@app)
105
+ res = @plugin.get_latest_file
106
+ assert(res[0], 'needs_update must be true')
107
+ assert(res[1].match(/latest/), 'filename must match latest')
108
+ assert(File.exists?(res[1]), 'companies_latest.xls must exist')
109
+ assert(File.size(Test_Companies_XLSX) <File.size(res[1]))
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ $: << File.expand_path('..', File.dirname(__FILE__))
5
+ $: << File.expand_path("../../src", File.dirname(__FILE__))
6
+
7
+ gem 'minitest'
8
+ require 'minitest/autorun'
9
+ require 'flexmock'
10
+ require 'medreg/person'
11
+ require 'tempfile'
12
+ require 'ostruct'
13
+
14
+ Minitest::Test.i_suck_and_my_tests_are_order_dependent!()
15
+
16
+ class TestPerson <Minitest::Test
17
+ include FlexMock::TestCase
18
+ RunTestTakingLong = false
19
+ Test_Personen_XLSX = File.expand_path(File.join(__FILE__, '../../data/xlsx/Personen_20141014.xlsx'))
20
+ def setup
21
+ @config = flexmock('config')
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)
33
+ end
34
+
35
+ SomeTestCases = {
36
+ 7601000010735 => OpenStruct.new(:family_name => 'Cevey', :first_name => 'Philippe Marc', :authority => 'Waadt'),
37
+ 7601000813282 => OpenStruct.new(:family_name => 'ABANTO PAYER', :first_name => 'Dora Carmela', :authority => 'Waadt'),
38
+ }
39
+
40
+ # Anita Hensel 7601000972620
41
+ def test_aaa_zuest # name starts with aaa we want this test to be run as first
42
+ { 7601000254207 => OpenStruct.new(:family_name => 'Züst', :first_name => 'Peter', :authority => 'Glarus')}.each do
43
+ |gln, info|
44
+ @plugin = Medreg::Person.new(@app, [gln])
45
+ flexmock(@plugin, :get_latest_file => [ true, Test_Personen_XLSX ] )
46
+ flexmock(@plugin, :get_doctor_data => {})
47
+ assert(File.exists?(Test_Personen_XLSX))
48
+ startTime = Time.now
49
+ csv_file = ODDB::Doctors::Personen_YAML
50
+ FileUtils.rm_f(csv_file) if File.exists?(csv_file)
51
+ created, updated, deleted, skipped = @plugin.update
52
+ diffTime = (Time.now - startTime).to_i
53
+ assert_equal(0, deleted)
54
+ assert_equal(0, skipped)
55
+ assert_equal(1, created)
56
+ assert_equal(0, updated)
57
+ assert_equal(1, Medreg::Person.all_doctors.size)
58
+ zuest = Medreg::Person.all_doctors.first[1] # a hash
59
+ assert_equal(true, zuest[:may_dispense_narcotics])
60
+ assert_equal(true, zuest[:may_sell_drugs])
61
+ assert_equal(nil, zuest[:remark_sell_drugs])
62
+ assert_equal(nil, zuest[:exam])
63
+ assert_equal('Züst', zuest[:name])
64
+ assert_equal('Peter', zuest[:firstname])
65
+ assert_equal(["Allgemeine Innere Medizin, 2003, Schweiz"], zuest[:specialities])
66
+ assert_equal(3, zuest[:capabilities].size)
67
+ [ "Sportmedizin, 2004, Schweiz",
68
+ "Praxislabor, 2002, Schweiz",
69
+ "Sachkunde für dosisintensives Röntgen, 2004, Schweiz",
70
+ ].each {
71
+ |cap|
72
+ assert(zuest[:capabilities].index(cap), "Muss Erfahrung #{cap} fuer Züst finden")
73
+ }
74
+ addresses = zuest[:addresses]
75
+ assert_equal(1, addresses.size)
76
+ first_address = addresses.first
77
+ assert_equal(ODDB::Address2, first_address.class)
78
+ assert_equal(1, first_address.fon.size)
79
+ assert_equal(['Bahnhofstr. 3'], first_address.additional_lines)
80
+ assert_equal('8753 Mollis', first_address.location)
81
+ assert_equal('at_praxis', first_address.type)
82
+ assert_equal('055 6122353', first_address.fon.first)
83
+ assert_equal('Praxis Dr. med. Peter Züst', first_address.name)
84
+ assert_equal('8753', first_address.plz)
85
+ assert_equal('Mollis', first_address.city)
86
+ assert_equal('Bahnhofstr.', first_address.street)
87
+ assert_equal('3', first_address.number)
88
+ end
89
+ 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
+
108
+ def test_update_single
109
+ SomeTestCases.each{
110
+ |gln, info|
111
+ @plugin = Medreg::Person.new(@app, [gln])
112
+ flexmock(@plugin, :get_latest_file => [ true, Test_Personen_XLSX ] )
113
+ flexmock(@plugin, :get_doctor_data => {})
114
+ assert(File.exists?(Test_Personen_XLSX))
115
+ startTime = Time.now
116
+ csv_file = ODDB::Doctors::Personen_YAML
117
+ FileUtils.rm_f(csv_file) if File.exists?(csv_file)
118
+ created, updated, deleted, skipped = @plugin.update
119
+ diffTime = (Time.now - startTime).to_i
120
+ assert_equal(0, deleted)
121
+ assert_equal(0, skipped)
122
+ assert_equal(1, created)
123
+ assert_equal(0, updated)
124
+ assert(File.exists?(csv_file), "file #{csv_file} must be created")
125
+ expected = "Doctors update \n\nNumber of doctors: 1\nSkipped doctors: 0\nNew doctors: 1\nUpdated doctors: 0\nDeleted doctors: 0\n"
126
+ assert_equal(expected, @plugin.report)
127
+ }
128
+ end
129
+
130
+ def test_update_some_glns
131
+ glns_ids_to_search = [7601000078261, 7601000813282, 7601000254207, 7601000186874, 7601000201522, 7601000295958,
132
+ 7601000010735, 7601000268969, 7601000019080, 7601000239730 ]
133
+ @plugin = Medreg::Person.new(@app, glns_ids_to_search)
134
+
135
+ flexmock(@plugin, :get_latest_file => [ true, Test_Personen_XLSX ] )
136
+ flexmock(@plugin, :get_doctor_data => {})
137
+ assert(File.exists?(Test_Personen_XLSX))
138
+ startTime = Time.now
139
+ csv_file = ODDB::Doctors::Personen_YAML
140
+ FileUtils.rm_f(csv_file) if File.exists?(csv_file)
141
+ created, updated, deleted, skipped = @plugin.update
142
+ diffTime = (Time.now - startTime).to_i
143
+ assert_equal(0, deleted)
144
+ assert_equal(0, skipped)
145
+ assert_equal(0, updated)
146
+ assert_equal(glns_ids_to_search.size - 1 , created) # we have one gln_id mentioned twice
147
+ assert(File.exists?(csv_file), "file #{csv_file} must be created")
148
+ end if RunTestTakingLong
149
+
150
+ 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::Person.new(@app, [7601000813282])
152
+ needs_update, latest = @plugin.get_latest_file
153
+ end if RunTestTakingLong
154
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ # TestArray -- odba -- 30.01.2007 -- hwyss@ywesee.com
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $: << File.expand_path('../lib', File.dirname(__FILE__))
6
+
7
+ require 'minitest/autorun'
8
+ require 'flexmock'
9
+ require 'medreg/medreg'
10
+
11
+ module ODBA
12
+ class TestArray < Minitest::Test
13
+ include FlexMock::TestCase
14
+ def setup
15
+ end
16
+ def test_company_importer
17
+ assert Medreg.run('company')
18
+ end
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: medreg
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Niklaus Giger, Zeno R.R. Davatz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-12-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mechanize
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rubyXL
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 3.3.1
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '='
44
+ - !ruby/object:Gem::Version
45
+ version: 3.3.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ 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: flexmock
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: simplecov
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ 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: minitest
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Personen und Betriebe Adressen für die Schweiz.
127
+ email: ngiger@ywesee.com, zdavatz@ywesee.com
128
+ executables:
129
+ - medreg
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - .gitignore
134
+ - .travis.yml
135
+ - Gemfile
136
+ - History.txt
137
+ - LICENSE
138
+ - README.textile
139
+ - Rakefile
140
+ - bin/medreg
141
+ - lib/medreg.rb
142
+ - lib/medreg/address.rb
143
+ - lib/medreg/ba_type.rb
144
+ - lib/medreg/company.rb
145
+ - lib/medreg/company_importer.rb
146
+ - lib/medreg/medreg.rb
147
+ - lib/medreg/person.rb
148
+ - lib/medreg/person_importer.rb
149
+ - lib/medreg/resilient_loop.rb
150
+ - lib/medreg/version.rb
151
+ - medreg.gemspec
152
+ - test/data/companies_20141014.xlsx
153
+ - test/suite.rb
154
+ - test/test_company.rb
155
+ - test/test_person.rb
156
+ - test/test_run.rb
157
+ homepage: https://github.com/zdavatz/medreg
158
+ licenses:
159
+ - GPL-v2
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ requirements: []
177
+ rubyforge_project:
178
+ rubygems_version: 1.8.25
179
+ signing_key:
180
+ specification_version: 3
181
+ summary: Helper module for ch.oddb.org
182
+ test_files: []