swissmedic-diff 0.2.9 → 0.3.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.
@@ -1,186 +1,89 @@
1
1
  #!/usr/bin/env ruby
2
- # -*- encoding: utf-8 -*-
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 'minitest/autorun'
8
- require 'swissmedic-diff'
9
- require 'pp'
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
- def test_diff_changes_february_2019
17
+ def test_diff_changes_january_2026
18
+ start_time = Time.now
48
19
  @diff = SwissmedicDiff.new
49
- last_month = File.expand_path 'data/Packungen-2015.07.02.xlsx', File.dirname(__FILE__)
50
- this_month = File.expand_path 'data/Packungen-2019.03.06.xlsx', File.dirname(__FILE__)
51
- expected = {"00277"=>[:name_base, :expiry_date, :production_science],
52
- "15219"=>[:expiry_date, :indication_registration, :indication_sequence, :sequence],
53
- "16105"=>[:new],
54
- "16598"=>[:new],
55
- "28486"=>[:new],
56
- "30015"=>[:new],
57
- "31644"=>[:new],
58
- "32475"=>[:new],
59
- "35366"=>[:new],
60
- "43454"=>[:new],
61
- "44625"=>[:new],
62
- "45882"=>[:new],
63
- "53290"=>[:new],
64
- "53662"=>[:new],
65
- "54015"=>[:new],
66
- "54534"=>[:new],
67
- "55558"=>[:new],
68
- "66297"=>[:new],
69
- "55594"=>[:new],
70
- "55674"=>[:new],
71
- "56352"=>[:new],
72
- "58943"=>[:new],
73
- "59267"=>[:new],
74
- "61186"=>[:new],
75
- "62069"=>[:new],
76
- "62132"=>[:new],
77
- "65856"=>[:new],
78
- "65857"=>[:new],
79
- "58734"=>[:new],
80
- "55561"=>[:new],
81
- "65160"=>[:new],
82
- "58158"=>[:new],
83
- "44447"=>[:new],
84
- "39252"=>[:new],
85
- "00278"=>[:delete],
86
- "00279"=>[:delete],
87
- "65837"=>[:delete],
88
- "65838"=>[:delete]
89
- }
20
+ last_month = File.expand_path "data/Packungen-2025.12.15.xlsx", File.dirname(__FILE__)
21
+ this_month = File.expand_path "data/Packungen-2026.01.08.xlsx", File.dirname(__FILE__)
90
22
  result = @diff.diff this_month, last_month
91
- assert_equal(expected, result.changes)
92
- end
93
-
94
- def test_diff_wrong_header
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
23
+ duration = (Time.now - start_time).to_i
24
+ puts "Took #{duration} seconds"
25
+ assert_equal(487, result.updates.size)
26
+ assert_equal(336, result.changes.size)
27
+ assert_equal(148, result.news.size)
28
+ assert_equal(7, result.replacements.size)
29
+ assert_equal(107, result.package_deletions.size)
100
30
 
31
+ assert_equal(["16105", "01", "Hirudoid, Creme", "Medinova AG", "Synthetika", "02.08.2.", "C05BA01", Date.new(1951, 9, 1), Date.new(1951, 9, 1), "unbegrenzt", "001", "14", "g", "D", "D", "D", "heparinoidum (chondroitini polysulfas)", "heparinoidum (chondroitini polysulfas) 3 mg, corresp. 250 U., glycerolum (85 per centum), acidum stearicum, alcoholes adipis lanae, alcohol cetylicus et stearylicus 31.375 mg, vaselinum album, alcohol myristylicus, alcohol isopropylicus, kalii hydroxidum, E 218 1.6 mg, thymolum, propylis parahydroxybenzoas 0.4 mg, aqua purificata, ad unguentum pro 1 g.", "X", "Venenmittel für den äusserlichen Gebrauch", nil, nil, nil, nil, 0], result.news.first)
101
32
 
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
33
+ assert_equal([["55249", "01", "Bronchosan Husten, Tropfen zum Einnehmen", "A.Vogel AG", "Phytoarzneimittel", "03.02.0.", "R05CA10", Date.new(2000, 10, 18), Date.new(2000, 10, 18), "unbegrenzt", "001", "50", "ml", "D", "D", "D", "hederae helicis herbae recentis tinctura (Hedera helix L., herba), thymi herbae recentis tinctura (Thymus vulgaris L., herba), liquiritiae radicis tinctura (Glycyrrhiza glabra L., radix)", "hederae helicis herbae recentis tinctura (Hedera helix L., herba) 376.1 mg, ratio: 1:5.6, Auszugsmittel ethanolum 50.6% (V/V), thymi herbae recentis tinctura (Thymus vulgaris L., herba) 329.1 mg, ratio: 1:7.9, Auszugsmittel ethanolum 50.6% (V/V), liquiritiae radicis tinctura (Glycyrrhiza glabra L., radix) 233.9 mg, ratio: 1:10, Auszugsmittel ethanolum 50.6% (V/V), anisi stellati aetheroleum, eucalypti aetheroleum, ad solutionem pro 1 ml, corresp. ethanolum 51 % V/V.", "X", "Bei Erkältungshusten", nil, nil, nil, nil, 0], "052"], result.replacements.first)
127
34
 
128
- assert_equal 'Panthoben, Salbe', result.news.first[2].value
129
- assert_equal 'Coeur-Vaisseaux Sérocytol, Namensänderung', result.updates.first[2].value
35
+ assert_equal(["00613", [:expiry_date]], result.changes.first)
36
+ assert_equal({target: "Packungen-2026.01.08.xlsx 3198082 bytes", latest: "Packungen-2025.12.15.xlsx 3218271 bytes", news: 148, updates: 487, changes: 336, newest_rows: 6305, replacements: 147, package_deletions: 107, sequence_deletions: 60, registration_deletions: 47}, SwissmedicDiff.stat)
130
37
  end
131
38
 
132
- def test_diff_error_column
133
- res = @diff.diff(@february_2014, @january_2014)
134
- assert_equal(OpenStruct, res.class)
135
- end
39
+ def test_diff_changes_february_2019
40
+ @diff = SwissmedicDiff.new
41
+ last_month = File.expand_path "data/Packungen-2019.03.06.xlsx", File.dirname(__FILE__)
42
+ this_month = File.expand_path "data/Packungen-2025.07.01.xlsx", File.dirname(__FILE__)
43
+ expected = {"00450" => [:new],
44
+ "00278" => [:new],
45
+ "00279" => [:new],
46
+ "44447" => [:name_base, :production_science, :expiry_date, :substances, :composition],
47
+ "65837" => [:new],
48
+ "65838" => [:new],
49
+ "15219" => [:expiry_date],
50
+ "00000" => [:new],
51
+ "00277" => [:delete],
52
+ "16105" => [:delete],
53
+ "16598" => [:delete],
54
+ "28486" => [:delete],
55
+ "30015" => [:delete],
56
+ "31644" => [:delete],
57
+ "32475" => [:delete],
58
+ "35366" => [:delete],
59
+ "43454" => [:delete],
60
+ "44625" => [:delete],
61
+ "45882" => [:delete],
62
+ "53290" => [:delete],
63
+ "53662" => [:delete],
64
+ "54015" => [:delete],
65
+ "54534" => [:delete],
66
+ "55558" => [:delete],
67
+ "66297" => [:delete],
68
+ "55594" => [:delete],
69
+ "55674" => [:delete],
70
+ "56352" => [:delete],
71
+ "58943" => [:delete],
72
+ "59267" => [:delete],
73
+ "61186" => [:delete],
74
+ "62069" => [:delete],
75
+ "62132" => [:delete],
76
+ "65856" => [:delete],
77
+ "65857" => [:delete],
78
+ "58734" => [:delete],
79
+ "55561" => [:delete],
80
+ "65160" => [:delete],
81
+ "58158" => [:delete],
82
+ "39252" => [:delete]}
136
83
 
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
- }
84
+ result = @diff.diff this_month, last_month
148
85
  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
86
+ assert_equal({target: "Packungen-2025.07.01.xlsx 245310 bytes", latest: "Packungen-2019.03.06.xlsx 347989 bytes", news: 41, updates: 2, changes: 40, newest_rows: 40, replacements: 9, package_deletions: 39, sequence_deletions: 34, registration_deletions: 32}, SwissmedicDiff.stat)
184
87
  end
185
88
  end
186
89
  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.2.9
4
+ version: 0.3.1
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: rubyXL
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: 3.3.1
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: 3.3.1
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: spreadsheet
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: logger
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: ostruct
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: :runtime
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: rake
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,23 @@ extra_rdoc_files: []
145
159
  files:
146
160
  - Gemfile
147
161
  - Gemfile.lock
148
- - History.txt
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.txt
167
+ - Packungen-2025.12.15.xlsx
168
+ - Packungen-2026.01.08.xlsx
169
+ - README.md
154
170
  - Rakefile
155
171
  - bin/swissmedic-diff
156
- - lib/compatibility.rb
157
172
  - lib/swissmedic-diff.rb
158
173
  - lib/version.rb
174
+ - test/test_swissmedic-diff-bin.rb
159
175
  - test/test_swissmedic-diff.rb
160
176
  homepage: https://github.com/zdavatz/swissmedic-diff
161
- licenses: []
177
+ licenses:
178
+ - GNU GPL version 2
162
179
  metadata:
163
180
  changelog_uri: https://github.com/zdavatz/swissmedic-diff/blob/master/History.md
164
181
  rdoc_options: []
@@ -168,14 +185,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
168
185
  requirements:
169
186
  - - ">="
170
187
  - !ruby/object:Gem::Version
171
- version: '0'
188
+ version: '2.6'
172
189
  required_rubygems_version: !ruby/object:Gem::Requirement
173
190
  requirements:
174
191
  - - ">="
175
192
  - !ruby/object:Gem::Version
176
193
  version: '0'
177
194
  requirements: []
178
- rubygems_version: 3.6.2
195
+ rubygems_version: 4.0.3
179
196
  specification_version: 4
180
197
  summary: Find out what Products have changed on the swiss healthcare market
181
198
  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
-