medreg 0.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.
@@ -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: []