swissmedic-diff 0.2.8 → 0.3.0
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 +4 -4
- data/Gemfile +0 -9
- data/Gemfile.lock +88 -20
- data/{History.txt → History.md} +29 -15
- data/{README.txt → README.md} +8 -8
- data/Rakefile +3 -3
- data/lib/swissmedic-diff.rb +153 -247
- data/lib/version.rb +1 -1
- data/test/test_swissmedic-diff.rb +47 -167
- metadata +55 -15
- data/lib/compatibility.rb +0 -57
@@ -1,186 +1,66 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
2
|
+
|
3
3
|
# SwissmedicPluginTest -- oddb.org -- 18.03.2008 -- hwyss@ywesee.com
|
4
4
|
|
5
5
|
$: << File.expand_path("../lib", File.dirname(__FILE__))
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
7
|
+
require "minitest/autorun"
|
8
|
+
require "swissmedic-diff"
|
9
|
+
require "pp"
|
10
10
|
|
11
11
|
module ODDB
|
12
12
|
class SwissmedicPluginTest < Minitest::Test
|
13
13
|
def setup
|
14
14
|
@diff = SwissmedicDiff.new
|
15
|
-
@january_2014 = File.expand_path 'data/Packungen-2014.01.01.xlsx', File.dirname(__FILE__)
|
16
|
-
@february_2014 = File.expand_path 'data/Packungen-2014.02.01.xlsx', File.dirname(__FILE__)
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_diff_new_format_july_2015
|
20
|
-
@diff = SwissmedicDiff.new
|
21
|
-
last_month = File.expand_path 'data/Packungen-2015.06.04.xlsx', File.dirname(__FILE__)
|
22
|
-
this_month = File.expand_path 'data/Packungen-2015.07.02.xlsx', File.dirname(__FILE__)
|
23
|
-
result = @diff.diff this_month, last_month, [:atc_class, :sequence_date]
|
24
|
-
assert(result.changes.flatten.index('Zulassungs-Nummer') == nil, "Should not find Zulassungs-Nummer in changes")
|
25
|
-
assert_equal(2, result.news.size)
|
26
|
-
assert_equal(4, result.changes.size)
|
27
|
-
assert_equal(4, result.updates.size)
|
28
|
-
assert_equal(['65838', nil], result.news.collect{|x| x[0] if x[0] == '65838'})
|
29
|
-
assert_equal({"00277"=>[:name_base, :expiry_date], "00279"=>[:expiry_date], "65838"=>[:new], "15219"=>[:new]}, result.changes)
|
30
15
|
end
|
31
16
|
|
32
|
-
def test_diff_changes
|
33
|
-
@diff = SwissmedicDiff.new
|
34
|
-
last_month = File.expand_path 'data/Packungen-2015.06.04.xlsx', File.dirname(__FILE__)
|
35
|
-
this_month = File.expand_path 'data/Packungen-2015.07.02.xlsx', File.dirname(__FILE__)
|
36
|
-
expected = {
|
37
|
-
"00277"=>[:name_base, :expiry_date],
|
38
|
-
"00279"=>[:expiry_date],
|
39
|
-
"65838"=>[:new],
|
40
|
-
"15219"=>[:new]
|
41
|
-
}
|
42
|
-
result = @diff.diff this_month, last_month
|
43
|
-
assert_equal(expected, result.changes)
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
17
|
def test_diff_changes_february_2019
|
48
18
|
@diff = SwissmedicDiff.new
|
49
|
-
last_month = File.expand_path
|
50
|
-
this_month = File.expand_path
|
51
|
-
expected =
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
assert_equal(expected, result.changes)
|
92
|
-
end
|
19
|
+
last_month = File.expand_path "data/Packungen-2019.03.06.xlsx", File.dirname(__FILE__)
|
20
|
+
this_month = File.expand_path "data/Packungen-2025.07.01.xlsx", File.dirname(__FILE__)
|
21
|
+
expected = {"00450" => [:new],
|
22
|
+
"00278" => [:new],
|
23
|
+
"00279" => [:new],
|
24
|
+
"44447" => [:name_base, :production_science, :expiry_date, :substances, :composition],
|
25
|
+
"65837" => [:new],
|
26
|
+
"65838" => [:new],
|
27
|
+
"15219" => [:expiry_date],
|
28
|
+
"00000" => [:new],
|
29
|
+
"00277" => [:delete],
|
30
|
+
"16105" => [:delete],
|
31
|
+
"16598" => [:delete],
|
32
|
+
"28486" => [:delete],
|
33
|
+
"30015" => [:delete],
|
34
|
+
"31644" => [:delete],
|
35
|
+
"32475" => [:delete],
|
36
|
+
"35366" => [:delete],
|
37
|
+
"43454" => [:delete],
|
38
|
+
"44625" => [:delete],
|
39
|
+
"45882" => [:delete],
|
40
|
+
"53290" => [:delete],
|
41
|
+
"53662" => [:delete],
|
42
|
+
"54015" => [:delete],
|
43
|
+
"54534" => [:delete],
|
44
|
+
"55558" => [:delete],
|
45
|
+
"66297" => [:delete],
|
46
|
+
"55594" => [:delete],
|
47
|
+
"55674" => [:delete],
|
48
|
+
"56352" => [:delete],
|
49
|
+
"58943" => [:delete],
|
50
|
+
"59267" => [:delete],
|
51
|
+
"61186" => [:delete],
|
52
|
+
"62069" => [:delete],
|
53
|
+
"62132" => [:delete],
|
54
|
+
"65856" => [:delete],
|
55
|
+
"65857" => [:delete],
|
56
|
+
"58734" => [:delete],
|
57
|
+
"55561" => [:delete],
|
58
|
+
"65160" => [:delete],
|
59
|
+
"58158" => [:delete],
|
60
|
+
"39252" => [:delete]}
|
93
61
|
|
94
|
-
|
95
|
-
@diff = SwissmedicDiff.new
|
96
|
-
last_month = File.expand_path 'data/Packungen-2015.06.04.xlsx', File.dirname(__FILE__)
|
97
|
-
this_month = File.expand_path 'data/Packungen-wrong-header.xlsx', File.dirname(__FILE__)
|
98
|
-
assert_raises(RuntimeError) { @diff.diff this_month, last_month, [:atc_class, :sequence_date]}
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
def test_diff_xlsx_and_xlsx
|
103
|
-
result = @diff.diff @february_2014, @january_2014, [:atc_class, :sequence_date]
|
104
|
-
assert_equal 4, result.news.size
|
105
|
-
expected = {
|
106
|
-
"00277"=>[:name_base, :expiry_date],
|
107
|
-
"65040"=>[:sequence, :replaced_package],
|
108
|
-
"60125"=>[:new],
|
109
|
-
"61367"=>[:new],
|
110
|
-
"00274"=>[:delete]
|
111
|
-
}
|
112
|
-
assert_equal(expected, result.changes)
|
113
|
-
assert_equal 1, result.updates.size
|
114
|
-
assert_equal 5, result.changes.size
|
115
|
-
assert_equal 3, result.package_deletions.size
|
116
|
-
assert_equal 4, result.package_deletions.first.size
|
117
|
-
iksnrs = result.package_deletions.collect { |row| row.at(0) }.sort
|
118
|
-
ikscds = result.package_deletions.collect { |row| row.at(2) }.sort
|
119
|
-
assert_equal ["00274", "00274", "65040"], iksnrs
|
120
|
-
assert_equal ["001", "001", "002"], ikscds
|
121
|
-
assert_equal 1, result.sequence_deletions.size
|
122
|
-
assert_equal ["00274", "01"], result.sequence_deletions.at(0)
|
123
|
-
assert_equal 1, result.registration_deletions.size
|
124
|
-
assert_equal ["00274"], result.registration_deletions.at(0)
|
125
|
-
assert_equal 1, result.replacements.size
|
126
|
-
assert_equal '001', result.replacements.values.first
|
127
|
-
|
128
|
-
assert_equal 'Panthoben, Salbe', result.news.first[2].value
|
129
|
-
assert_equal 'Coeur-Vaisseaux Sérocytol, Namensänderung', result.updates.first[2].value
|
130
|
-
end
|
131
|
-
|
132
|
-
def test_diff_error_column
|
133
|
-
res = @diff.diff(@february_2014, @january_2014)
|
134
|
-
assert_equal(OpenStruct, res.class)
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_diff__ignore
|
138
|
-
ignore = [:company, :name_base, :expiry_date, :indication_sequence]
|
139
|
-
result = @diff.diff(@february_2014, @january_2014, ignore)
|
140
|
-
expected = {
|
141
|
-
"00278"=>[:atc_class],
|
142
|
-
"00279"=>[:atc_class],
|
143
|
-
"65040"=>[:sequence, :replaced_package],
|
144
|
-
"60125"=>[:new],
|
145
|
-
"61367"=>[:new],
|
146
|
-
"00274"=>[:delete]
|
147
|
-
}
|
62
|
+
result = @diff.diff this_month, last_month
|
148
63
|
assert_equal(expected, result.changes)
|
149
|
-
assert_equal 4, result.news.size
|
150
|
-
assert_equal 3, result.updates.size
|
151
|
-
assert_equal 6, result.changes.size
|
152
|
-
assert_equal 3, result.package_deletions.size
|
153
|
-
end
|
154
|
-
def test_to_s
|
155
|
-
@diff.to_s
|
156
|
-
@diff.diff(@february_2014, @january_2014)
|
157
|
-
assert_equal <<-EOS.strip, @diff.to_s
|
158
|
-
+ 60125: Otriduo Schnupfen, Dosierspray
|
159
|
-
+ 61367: Hypericum-Mepha 250, Lactab
|
160
|
-
- 00274: Cardio-Pulmo-Rénal Sérocytol, suppositoire
|
161
|
-
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung), Ablaufdatum der Zulassung (25.04.2020)
|
162
|
-
> 00278: Colon Sérocytol, suppositoire; ATC-Code (J06AA)
|
163
|
-
> 00279: Conjonctif Sérocytol, suppositoire; ATC-Code (D03AX04)
|
164
|
-
> 65040: Panthoben, Salbe; Packungs-Nummer (001 -> 003)
|
165
|
-
EOS
|
166
|
-
assert_equal <<-EOS.strip, @diff.to_s(:name)
|
167
|
-
- 00274: Cardio-Pulmo-Rénal Sérocytol, suppositoire
|
168
|
-
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung), Ablaufdatum der Zulassung (25.04.2020)
|
169
|
-
> 00278: Colon Sérocytol, suppositoire; ATC-Code (J06AA)
|
170
|
-
> 00279: Conjonctif Sérocytol, suppositoire; ATC-Code (D03AX04)
|
171
|
-
+ 61367: Hypericum-Mepha 250, Lactab
|
172
|
-
+ 60125: Otriduo Schnupfen, Dosierspray
|
173
|
-
> 65040: Panthoben, Salbe; Packungs-Nummer (001 -> 003)
|
174
|
-
EOS
|
175
|
-
assert_equal <<-EOS.strip, @diff.to_s(:registration)
|
176
|
-
- 00274: Cardio-Pulmo-Rénal Sérocytol, suppositoire
|
177
|
-
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung), Ablaufdatum der Zulassung (25.04.2020)
|
178
|
-
> 00278: Colon Sérocytol, suppositoire; ATC-Code (J06AA)
|
179
|
-
> 00279: Conjonctif Sérocytol, suppositoire; ATC-Code (D03AX04)
|
180
|
-
+ 60125: Otriduo Schnupfen, Dosierspray
|
181
|
-
+ 61367: Hypericum-Mepha 250, Lactab
|
182
|
-
> 65040: Panthoben, Salbe; Packungs-Nummer (001 -> 003)
|
183
|
-
EOS
|
184
64
|
end
|
185
65
|
end
|
186
66
|
end
|
metadata
CHANGED
@@ -1,29 +1,28 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swissmedic-diff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hannes Wyss, Masaomi Hatakeyama
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
10
|
date: 1980-01-01 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
13
|
+
name: simple_xlsx_reader
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
16
15
|
requirements:
|
17
16
|
- - ">="
|
18
17
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
18
|
+
version: '0'
|
20
19
|
type: :runtime
|
21
20
|
prerelease: false
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
23
22
|
requirements:
|
24
23
|
- - ">="
|
25
24
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
25
|
+
version: '0'
|
27
26
|
- !ruby/object:Gem::Dependency
|
28
27
|
name: nokogiri
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,7 +52,21 @@ dependencies:
|
|
53
52
|
- !ruby/object:Gem::Version
|
54
53
|
version: '0'
|
55
54
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
55
|
+
name: logger
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: ostruct
|
57
70
|
requirement: !ruby/object:Gem::Requirement
|
58
71
|
requirements:
|
59
72
|
- - ">="
|
@@ -80,6 +93,34 @@ dependencies:
|
|
80
93
|
- - ">="
|
81
94
|
- !ruby/object:Gem::Version
|
82
95
|
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: standard
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: debug
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
type: :development
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
83
124
|
- !ruby/object:Gem::Dependency
|
84
125
|
name: minitest
|
85
126
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,22 +159,22 @@ extra_rdoc_files: []
|
|
118
159
|
files:
|
119
160
|
- Gemfile
|
120
161
|
- Gemfile.lock
|
121
|
-
- History.
|
162
|
+
- History.md
|
122
163
|
- LICENSE
|
123
164
|
- Manifest.txt
|
124
165
|
- Packungen-2023.08.08.xlsx
|
125
166
|
- Packungen-2023.09.08.xlsx
|
126
|
-
- README.
|
167
|
+
- README.md
|
127
168
|
- Rakefile
|
128
169
|
- bin/swissmedic-diff
|
129
|
-
- lib/compatibility.rb
|
130
170
|
- lib/swissmedic-diff.rb
|
131
171
|
- lib/version.rb
|
132
172
|
- test/test_swissmedic-diff.rb
|
133
173
|
homepage: https://github.com/zdavatz/swissmedic-diff
|
134
|
-
licenses:
|
135
|
-
|
136
|
-
|
174
|
+
licenses:
|
175
|
+
- GNU GPL version 2
|
176
|
+
metadata:
|
177
|
+
changelog_uri: https://github.com/zdavatz/swissmedic-diff/blob/master/History.md
|
137
178
|
rdoc_options: []
|
138
179
|
require_paths:
|
139
180
|
- lib
|
@@ -141,15 +182,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
182
|
requirements:
|
142
183
|
- - ">="
|
143
184
|
- !ruby/object:Gem::Version
|
144
|
-
version: '0'
|
185
|
+
version: '2.0'
|
145
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
187
|
requirements:
|
147
188
|
- - ">="
|
148
189
|
- !ruby/object:Gem::Version
|
149
190
|
version: '0'
|
150
191
|
requirements: []
|
151
|
-
rubygems_version: 3.
|
152
|
-
signing_key:
|
192
|
+
rubygems_version: 3.6.2
|
153
193
|
specification_version: 4
|
154
194
|
summary: Find out what Products have changed on the swiss healthcare market
|
155
195
|
test_files:
|
data/lib/compatibility.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: utf-8
|
3
|
-
require 'spreadsheet'
|
4
|
-
require 'rubyXL'
|
5
|
-
|
6
|
-
module Spreadsheet
|
7
|
-
class << self
|
8
|
-
def open io_or_path, mode="rb+"
|
9
|
-
if File.extname(io_or_path).downcase == '.xlsx'
|
10
|
-
RubyXL::Parser.parse(io_or_path)
|
11
|
-
else
|
12
|
-
if io_or_path.respond_to? :seek
|
13
|
-
Excel::Workbook.open(io_or_path)
|
14
|
-
elsif block_given?
|
15
|
-
File.open(io_or_path, mode) do |fh|
|
16
|
-
yield open(fh)
|
17
|
-
end
|
18
|
-
else
|
19
|
-
open File.open(io_or_path, mode)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
module RubyXL
|
27
|
-
class Worksheet
|
28
|
-
def row(row_index)
|
29
|
-
x = @sheet_data[row_index]
|
30
|
-
def x.date(column_index)
|
31
|
-
data = self[column_index]
|
32
|
-
return data.value.respond_to?(:to_i) ? data.value.to_i : data.value
|
33
|
-
# return Date.new(1899,12,30)+data.value.to_i if data.is_a?(RubyXL::Cell)
|
34
|
-
end unless defined?(x.date)
|
35
|
-
x
|
36
|
-
end
|
37
|
-
end
|
38
|
-
class Workbook
|
39
|
-
def worksheet(idx)
|
40
|
-
self[idx]
|
41
|
-
end
|
42
|
-
end
|
43
|
-
class Row < OOXMLObject
|
44
|
-
def []=(ind, value)
|
45
|
-
cells[ind] = value
|
46
|
-
end
|
47
|
-
end
|
48
|
-
class Cell
|
49
|
-
def to_i
|
50
|
-
self.value.respond_to?(:to_i) ? self.value.to_i : self.value
|
51
|
-
end
|
52
|
-
def to_s
|
53
|
-
self.value.to_s
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|