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.
@@ -1,186 +1,66 @@
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
17
  def test_diff_changes_february_2019
48
18
  @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
- }
90
- result = @diff.diff this_month, last_month
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
- 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
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.2.8
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: rubyXL
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: 3.3.1
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: 3.3.1
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: spreadsheet
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.txt
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.txt
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
- metadata: {}
136
- post_install_message:
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.4.13
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
-