medreg 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.travis.yml +22 -0
- data/Gemfile +11 -0
- data/History.txt +3 -0
- data/LICENSE +675 -0
- data/README.textile +22 -0
- data/Rakefile +30 -0
- data/bin/medreg +44 -0
- data/lib/medreg.rb +3 -0
- data/lib/medreg/address.rb +67 -0
- data/lib/medreg/ba_type.rb +38 -0
- data/lib/medreg/company.rb +33 -0
- data/lib/medreg/company_importer.rb +262 -0
- data/lib/medreg/medreg.rb +37 -0
- data/lib/medreg/person.rb +45 -0
- data/lib/medreg/person_importer.rb +417 -0
- data/lib/medreg/resilient_loop.rb +94 -0
- data/lib/medreg/version.rb +5 -0
- data/medreg.gemspec +28 -0
- data/test/suite.rb +11 -0
- data/test/test_company.rb +112 -0
- data/test/test_person.rb +154 -0
- data/test/test_run.rb +20 -0
- metadata +182 -0
@@ -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
|
data/medreg.gemspec
ADDED
@@ -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
|
+
|
data/test/suite.rb
ADDED
@@ -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
|
data/test/test_person.rb
ADDED
@@ -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
|
data/test/test_run.rb
ADDED
@@ -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: []
|