swissmedic-diff 0.2.0 → 0.2.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.
- data/Gemfile.lock +12 -11
- data/History.txt +6 -0
- data/lib/compatibility.rb +0 -17
- data/lib/swissmedic-diff.rb +27 -25
- data/lib/version.rb +1 -1
- data/test/test_swissmedic-diff.rb +7 -17
- metadata +2 -8
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
swissmedic-diff (0.2.
|
4
|
+
swissmedic-diff (0.2.1)
|
5
5
|
nokogiri
|
6
6
|
rubyXL (= 3.3.1)
|
7
7
|
rubyzip
|
@@ -12,14 +12,10 @@ GEM
|
|
12
12
|
specs:
|
13
13
|
ansi (1.5.0)
|
14
14
|
builder (3.2.2)
|
15
|
+
byebug (4.0.5)
|
16
|
+
columnize (= 0.9.0)
|
15
17
|
coderay (1.1.0)
|
16
18
|
columnize (0.9.0)
|
17
|
-
debugger (1.6.8)
|
18
|
-
columnize (>= 0.3.1)
|
19
|
-
debugger-linecache (~> 1.2.0)
|
20
|
-
debugger-ruby_core_source (~> 1.3.5)
|
21
|
-
debugger-linecache (1.2.0)
|
22
|
-
debugger-ruby_core_source (1.3.8)
|
23
19
|
hoe (3.13.1)
|
24
20
|
rake (>= 0.8, < 11.0)
|
25
21
|
method_source (0.8.2)
|
@@ -36,9 +32,12 @@ GEM
|
|
36
32
|
coderay (~> 1.1.0)
|
37
33
|
method_source (~> 0.8.1)
|
38
34
|
slop (~> 3.4)
|
39
|
-
pry-
|
40
|
-
|
41
|
-
pry (
|
35
|
+
pry-byebug (3.1.0)
|
36
|
+
byebug (~> 4.0)
|
37
|
+
pry (~> 0.10)
|
38
|
+
pry-doc (0.8.0)
|
39
|
+
pry (~> 0.9)
|
40
|
+
yard (~> 0.8)
|
42
41
|
rake (10.4.2)
|
43
42
|
ruby-ole (1.2.11.8)
|
44
43
|
ruby-progressbar (1.7.5)
|
@@ -49,6 +48,7 @@ GEM
|
|
49
48
|
slop (3.6.0)
|
50
49
|
spreadsheet (1.0.3)
|
51
50
|
ruby-ole (>= 1.0)
|
51
|
+
yard (0.8.7.6)
|
52
52
|
|
53
53
|
PLATFORMS
|
54
54
|
ruby
|
@@ -57,7 +57,8 @@ DEPENDENCIES
|
|
57
57
|
hoe
|
58
58
|
minitest
|
59
59
|
minitest-reporters
|
60
|
-
pry-
|
60
|
+
pry-byebug
|
61
|
+
pry-doc
|
61
62
|
rake
|
62
63
|
swissmedic-diff!
|
63
64
|
|
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 0.2.1 / 06.07.2015
|
2
|
+
|
3
|
+
* Fix problems comparing dates (using to_date.start)
|
4
|
+
* Assume nothing has changed when comparing nil with an emtpy string
|
5
|
+
* Revert nr of paramenters of diff method to previous version, to make oddb.org happy again
|
6
|
+
|
1
7
|
=== 0.2.0 / 03.07.2015
|
2
8
|
|
3
9
|
* Abort if Swissmedic introduces incompatible header lines
|
data/lib/compatibility.rb
CHANGED
@@ -21,23 +21,6 @@ module Spreadsheet
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
|
-
def Spreadsheet.date_cell(row, idx)
|
25
|
-
if row.kind_of?(Spreadsheet::Excel::Row)
|
26
|
-
row.at(idx) && row.date(idx)
|
27
|
-
else
|
28
|
-
data = row[idx]
|
29
|
-
if data.is_a?(RubyXL::Cell)
|
30
|
-
return data.value.respond_to?(:to_i) ? data.value.to_i : data.value
|
31
|
-
return data.value if data.value.is_a?(DateTime)
|
32
|
-
if data.value.class.to_s == 'DateTime'
|
33
|
-
puts "data is_a RubyXL::Cell and value #{data.value.class} is_a? Date #{data.value.is_a?(Date)} DateTime #{data.value.is_a?(DateTime)}"
|
34
|
-
return Date.new(1899,12,30)+data.to_date.value.to_i
|
35
|
-
else
|
36
|
-
return Date.new(1899,12,30)+data.value.to_i if data.is_a?(RubyXL::Cell)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
24
|
end
|
42
25
|
|
43
26
|
module RubyXL
|
data/lib/swissmedic-diff.rb
CHANGED
@@ -148,25 +148,25 @@ class SwissmedicDiff
|
|
148
148
|
tbook = Spreadsheet.open(target)
|
149
149
|
idx, prr, prp = nil
|
150
150
|
multiples = {}
|
151
|
-
latest_keys = get_column_indices(Spreadsheet.open(latest)).keys
|
152
|
-
target_keys = get_column_indices(tbook).keys
|
151
|
+
@latest_keys = get_column_indices(Spreadsheet.open(latest)).keys
|
152
|
+
@target_keys = get_column_indices(tbook).keys
|
153
153
|
each_valid_row(tbook) { |row|
|
154
|
-
iksnr = cell(row, target_keys.index(:iksnr))
|
155
|
-
seqnr = cell(row, target_keys.index(:seqnr))
|
156
|
-
pacnr = cell(row, target_keys.index(:ikscd))
|
154
|
+
iksnr = cell(row, @target_keys.index(:iksnr))
|
155
|
+
seqnr = cell(row, @target_keys.index(:seqnr))
|
156
|
+
pacnr = cell(row, @target_keys.index(:ikscd))
|
157
157
|
(multiples[iksnr] ||= {})
|
158
158
|
if prr == iksnr && prp == pacnr
|
159
159
|
idx += 1
|
160
160
|
elsif previous = multiples[iksnr][pacnr]
|
161
161
|
prr = iksnr
|
162
162
|
prp = pacnr
|
163
|
-
idx = previous[target_keys.size].to_i + 1
|
163
|
+
idx = previous[@target_keys.size].to_i + 1
|
164
164
|
else
|
165
165
|
prr = iksnr
|
166
166
|
prp = pacnr
|
167
167
|
idx = 0
|
168
168
|
end
|
169
|
-
row[target_keys.size] = idx
|
169
|
+
row[@target_keys.size] = idx
|
170
170
|
(newest_rows[iksnr] ||= {})[pacnr] = row
|
171
171
|
multiples[iksnr][pacnr] = row
|
172
172
|
if(other = known_regs.delete([iksnr]))
|
@@ -176,12 +176,12 @@ class SwissmedicDiff
|
|
176
176
|
end
|
177
177
|
known_seqs.delete([iksnr, seqnr])
|
178
178
|
if(other = known_pacs.delete([iksnr, pacnr, idx]))
|
179
|
-
flags = rows_diff(row,
|
179
|
+
flags = rows_diff(row, other, ignore)
|
180
180
|
(changes[iksnr].concat flags).uniq!
|
181
181
|
updates.push row unless flags.empty?
|
182
182
|
else
|
183
|
-
replacements.store [ iksnr, seqnr, cell(row, target_keys.index(:size)),
|
184
|
-
cell(row, target_keys.index(:unit)) ], row
|
183
|
+
replacements.store [ iksnr, seqnr, cell(row, @target_keys.index(:size)),
|
184
|
+
cell(row, @target_keys.index(:unit)) ], row
|
185
185
|
flags = changes[iksnr]
|
186
186
|
flags.push(:sequence).uniq! unless(flags.include? :new)
|
187
187
|
news.push row
|
@@ -189,8 +189,8 @@ class SwissmedicDiff
|
|
189
189
|
}
|
190
190
|
@diff.replacements = reps = {}
|
191
191
|
known_pacs.each { |(iksnr, pacnr), row|
|
192
|
-
key = [iksnr, '%02i' % cell(row, target_keys.index(:seqnr)).to_i,
|
193
|
-
cell(row, target_keys.index(:size)), cell(row, target_keys.index(:unit))]
|
192
|
+
key = [iksnr, '%02i' % cell(row, @target_keys.index(:seqnr)).to_i,
|
193
|
+
cell(row, @target_keys.index(:size)), cell(row, @target_keys.index(:unit))]
|
194
194
|
if(rep = replacements[key])
|
195
195
|
changes[iksnr].push :replaced_package
|
196
196
|
reps.store rep, pacnr
|
@@ -202,7 +202,7 @@ class SwissmedicDiff
|
|
202
202
|
## the keys in known_pacs don't include the sequence number (which
|
203
203
|
# would prevent us from properly recognizing multi-sequence-Packages),
|
204
204
|
# so we need complete the path to the package now
|
205
|
-
key[1,0] = '%02i' % cell(row, target_keys.index(:seqnr)).to_i
|
205
|
+
key[1,0] = '%02i' % cell(row, @target_keys.index(:seqnr)).to_i
|
206
206
|
key
|
207
207
|
}
|
208
208
|
@diff.sequence_deletions = known_seqs.keys
|
@@ -225,27 +225,27 @@ class SwissmedicDiff
|
|
225
225
|
end
|
226
226
|
def _known_data(latest, known_regs, known_seqs, known_pacs, newest_rows)
|
227
227
|
lbook = Spreadsheet.open(latest)
|
228
|
+
@latest_keys = get_column_indices(lbook).keys
|
228
229
|
idx, prr, prp = nil
|
229
230
|
multiples = {}
|
230
|
-
latest_keys = get_column_indices(lbook).keys
|
231
231
|
each_valid_row(lbook) { |row|
|
232
|
-
iksnr = cell(row, latest_keys.index(:iksnr))
|
233
|
-
seqnr = cell(row, latest_keys.index(:seqnr))
|
234
|
-
pacnr = cell(row, latest_keys.index(:ikscd))
|
232
|
+
iksnr = cell(row, @latest_keys.index(:iksnr))
|
233
|
+
seqnr = cell(row, @latest_keys.index(:seqnr))
|
234
|
+
pacnr = cell(row, @latest_keys.index(:ikscd))
|
235
235
|
multiples[iksnr] ||= {}
|
236
236
|
if prr == iksnr && prp == pacnr
|
237
237
|
idx += 1
|
238
238
|
elsif previous = multiples[iksnr][pacnr]
|
239
239
|
prr = iksnr
|
240
240
|
prp = pacnr
|
241
|
-
idx = previous[latest_keys.size].to_i + 1
|
241
|
+
idx = previous[@latest_keys.size].to_i + 1
|
242
242
|
else
|
243
243
|
prr = iksnr
|
244
244
|
prp = pacnr
|
245
245
|
idx = 0
|
246
246
|
end
|
247
247
|
multiples[iksnr][pacnr] = row
|
248
|
-
row[latest_keys.size] = idx
|
248
|
+
row[@latest_keys.size] = idx
|
249
249
|
known_regs.store [iksnr], row
|
250
250
|
known_seqs.store [iksnr, seqnr], row
|
251
251
|
known_pacs.store [iksnr, pacnr, idx], row
|
@@ -257,15 +257,17 @@ class SwissmedicDiff
|
|
257
257
|
row = rows.sort.first.last
|
258
258
|
cell(row, COLUMNS_2014.keys.index(:name_base))
|
259
259
|
end
|
260
|
-
def rows_diff(row,
|
260
|
+
def rows_diff(row, other, ignore = [])
|
261
261
|
flags = []
|
262
262
|
COLUMNS_OLD.each_with_index {
|
263
263
|
|key, idx|
|
264
264
|
if !ignore.include?(key)
|
265
|
-
left = _comparable(key, row,
|
266
|
-
right = _comparable(key, other,
|
265
|
+
left = _comparable(key, row, @target_keys.index(key))
|
266
|
+
right = _comparable(key, other, @latest_keys.index(key))
|
267
|
+
next if left.is_a?(Date) and right.is_a?(Date) and left.start.eql?(right.start)
|
268
|
+
next if left.is_a?(String) and left.empty? and not right
|
269
|
+
next if right.is_a?(String) and right.empty? and not left
|
267
270
|
if left != right
|
268
|
-
puts "Pushing key #{key}: '#{left.inspect}' != '#{right.inspect}'" if $VERBOSE
|
269
271
|
flags.push key
|
270
272
|
end
|
271
273
|
end
|
@@ -318,9 +320,9 @@ class SwissmedicDiff
|
|
318
320
|
if cell = row[idx]
|
319
321
|
case key
|
320
322
|
when :registration_date, :expiry_date
|
321
|
-
|
323
|
+
row[idx].value.to_date
|
322
324
|
when :seqnr
|
323
|
-
sprintf "%02i", cell.to_i
|
325
|
+
sprintf "%02i", cell(row, idx).to_i
|
324
326
|
else
|
325
327
|
cell(row, idx).downcase.gsub(/\s+/, "")
|
326
328
|
end
|
data/lib/version.rb
CHANGED
@@ -23,10 +23,10 @@ module ODDB
|
|
23
23
|
result = @diff.diff this_month, last_month, [:atc_class, :sequence_date]
|
24
24
|
assert(result.changes.flatten.index('Zulassungs-Nummer') == nil, "Should not find Zulassungs-Nummer in changes")
|
25
25
|
assert_equal(1, result.news.size)
|
26
|
-
assert_equal(
|
27
|
-
assert_equal(
|
26
|
+
assert_equal(1, result.changes.size)
|
27
|
+
assert_equal(0, result.updates.size)
|
28
28
|
assert_equal(['65838'], result.news.collect{|x| x[0] if x[0] == '65838'})
|
29
|
-
assert_equal({"
|
29
|
+
assert_equal({"65838"=>[:new]}, result.changes)
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_diff_wrong_header
|
@@ -37,21 +37,11 @@ module ODDB
|
|
37
37
|
end
|
38
38
|
|
39
39
|
|
40
|
-
def test_date_xlsx
|
41
|
-
tbook = Spreadsheet.open(@january_2014)
|
42
|
-
sheet = tbook.worksheet(0)
|
43
|
-
assert_equal(nil, sheet.row(0)[8]) # sequence_date
|
44
|
-
assert_equal(2010, sheet.row(4).date(8).year)
|
45
|
-
assert_equal(26, sheet.row(4).date(8).day)
|
46
|
-
assert_equal(26, Spreadsheet.date_cell(sheet.row(4), 8).day)
|
47
|
-
assert_equal(2010, Spreadsheet.date_cell(sheet.row(4), 8).year)
|
48
|
-
end
|
49
|
-
|
50
40
|
def test_diff_xlsx_and_xlsx
|
51
41
|
result = @diff.diff @february_2014, @january_2014, [:atc_class, :sequence_date]
|
52
42
|
assert_equal 4, result.news.size
|
53
43
|
expected = {
|
54
|
-
"00277"=>[:name_base
|
44
|
+
"00277"=>[:name_base],
|
55
45
|
"65040"=>[:sequence, :replaced_package],
|
56
46
|
"60125"=>[:new],
|
57
47
|
"61367"=>[:new],
|
@@ -106,14 +96,14 @@ module ODDB
|
|
106
96
|
+ 60125: Otriduo Schnupfen, Dosierspray
|
107
97
|
+ 61367: Hypericum-Mepha 250, Lactab
|
108
98
|
- 00274: Cardio-Pulmo-Rénal Sérocytol, suppositoire
|
109
|
-
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung)
|
99
|
+
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung)
|
110
100
|
> 00278: Colon Sérocytol, suppositoire; ATC-Code (J06AA)
|
111
101
|
> 00279: Conjonctif Sérocytol, suppositoire; ATC-Code (D03AX04)
|
112
102
|
> 65040: Panthoben, Salbe; Packungs-Nummer (001 -> 003)
|
113
103
|
EOS
|
114
104
|
assert_equal <<-EOS.strip, @diff.to_s(:name)
|
115
105
|
- 00274: Cardio-Pulmo-Rénal Sérocytol, suppositoire
|
116
|
-
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung)
|
106
|
+
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung)
|
117
107
|
> 00278: Colon Sérocytol, suppositoire; ATC-Code (J06AA)
|
118
108
|
> 00279: Conjonctif Sérocytol, suppositoire; ATC-Code (D03AX04)
|
119
109
|
+ 61367: Hypericum-Mepha 250, Lactab
|
@@ -122,7 +112,7 @@ module ODDB
|
|
122
112
|
EOS
|
123
113
|
assert_equal <<-EOS.strip, @diff.to_s(:registration)
|
124
114
|
- 00274: Cardio-Pulmo-Rénal Sérocytol, suppositoire
|
125
|
-
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung)
|
115
|
+
> 00277: Coeur-Vaisseaux Sérocytol, Namensänderung; Namensänderung (Coeur-Vaisseaux Sérocytol, Namensänderung)
|
126
116
|
> 00278: Colon Sérocytol, suppositoire; ATC-Code (J06AA)
|
127
117
|
> 00279: Conjonctif Sérocytol, suppositoire; ATC-Code (D03AX04)
|
128
118
|
+ 60125: Otriduo Schnupfen, Dosierspray
|
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.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-07-
|
12
|
+
date: 2015-07-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
@@ -101,18 +101,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
101
|
- - ! '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
|
-
segments:
|
105
|
-
- 0
|
106
|
-
hash: -1183980882964765712
|
107
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
105
|
none: false
|
109
106
|
requirements:
|
110
107
|
- - ! '>='
|
111
108
|
- !ruby/object:Gem::Version
|
112
109
|
version: '0'
|
113
|
-
segments:
|
114
|
-
- 0
|
115
|
-
hash: -1183980882964765712
|
116
110
|
requirements: []
|
117
111
|
rubyforge_project:
|
118
112
|
rubygems_version: 1.8.23.2
|