swissmedic-diff 0.2.9 → 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 +73 -11
- data/{History.txt → History.md} +25 -16
- data/{README.txt → README.md} +8 -8
- data/Rakefile +3 -3
- data/lib/swissmedic-diff.rb +150 -244
- data/lib/version.rb +1 -1
- data/test/test_swissmedic-diff.rb +47 -167
- metadata +28 -14
- 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,7 +1,7 @@
|
|
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
|
@@ -10,19 +10,19 @@ cert_chain: []
|
|
10
10
|
date: 1980-01-01 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
|
-
name:
|
13
|
+
name: simple_xlsx_reader
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
16
|
- - ">="
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version:
|
18
|
+
version: '0'
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
23
|
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version:
|
25
|
+
version: '0'
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: nokogiri
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
- !ruby/object:Gem::Dependency
|
55
|
-
name:
|
55
|
+
name: logger
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - ">="
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '0'
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
|
-
name:
|
69
|
+
name: ostruct
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - ">="
|
@@ -80,13 +80,13 @@ dependencies:
|
|
80
80
|
- !ruby/object:Gem::Version
|
81
81
|
version: '0'
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
|
-
name:
|
83
|
+
name: rake
|
84
84
|
requirement: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '0'
|
89
|
-
type: :
|
89
|
+
type: :development
|
90
90
|
prerelease: false
|
91
91
|
version_requirements: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
@@ -94,7 +94,21 @@ dependencies:
|
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '0'
|
96
96
|
- !ruby/object:Gem::Dependency
|
97
|
-
name:
|
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
|
98
112
|
requirement: !ruby/object:Gem::Requirement
|
99
113
|
requirements:
|
100
114
|
- - ">="
|
@@ -145,20 +159,20 @@ extra_rdoc_files: []
|
|
145
159
|
files:
|
146
160
|
- Gemfile
|
147
161
|
- Gemfile.lock
|
148
|
-
- History.
|
162
|
+
- History.md
|
149
163
|
- LICENSE
|
150
164
|
- Manifest.txt
|
151
165
|
- Packungen-2023.08.08.xlsx
|
152
166
|
- Packungen-2023.09.08.xlsx
|
153
|
-
- README.
|
167
|
+
- README.md
|
154
168
|
- Rakefile
|
155
169
|
- bin/swissmedic-diff
|
156
|
-
- lib/compatibility.rb
|
157
170
|
- lib/swissmedic-diff.rb
|
158
171
|
- lib/version.rb
|
159
172
|
- test/test_swissmedic-diff.rb
|
160
173
|
homepage: https://github.com/zdavatz/swissmedic-diff
|
161
|
-
licenses:
|
174
|
+
licenses:
|
175
|
+
- GNU GPL version 2
|
162
176
|
metadata:
|
163
177
|
changelog_uri: https://github.com/zdavatz/swissmedic-diff/blob/master/History.md
|
164
178
|
rdoc_options: []
|
@@ -168,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
168
182
|
requirements:
|
169
183
|
- - ">="
|
170
184
|
- !ruby/object:Gem::Version
|
171
|
-
version: '0'
|
185
|
+
version: '2.0'
|
172
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
187
|
requirements:
|
174
188
|
- - ">="
|
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
|
-
|