swissmedic-diff 0.1.6 → 0.1.7

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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ N2M2ZjQwMDk0YmZmYmNmNzZjNDZlMWI2ZDc5OTU3MGVlZTJmOWQxZA==
5
+ data.tar.gz: !binary |-
6
+ MjI1NTljZGZhMTA2N2I0YmI3MDZlZWJiYWNjNWY5NTNjOGE1NjAxZA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NWI3ZWYwYjg2NjE1ZDc3Yzk3NDBjMDY4N2RhZTAxMWFjMzJkYWMzNDJjZGU5
10
+ MmM5ODMwYTBlYTgzZDk3M2MxYTBlMjBkYzQzYjRkOWE4NmE1Y2U2NTk3MDQ0
11
+ YzMwN2I0NmQ3MjNkMjYxNjc2NjJiNTIxODAzMDc4M2I2MDIxYTc=
12
+ data.tar.gz: !binary |-
13
+ MDViOTFhOGFkY2JhYTgxOGE3ZjM0MmNmZmE2Y2I5MzMyZDFkMzI4MTZhM2I3
14
+ OTU1NzQ5ZTY4MTczMDU3ZjczNTY4ZTdkYWEwZjRmMDlhYmJiNGRiZmE2ZGM4
15
+ MjViYTU0MWU3ODgyOTY1MmIzOTRlMmEwOTBlZmM5ZmEzZWUzMzk=
data/Gemfile CHANGED
@@ -5,4 +5,7 @@ gemspec
5
5
  group :development do
6
6
  gem 'rake', :platforms => :ruby_18
7
7
  end
8
-
8
+
9
+ group :debugger do
10
+ gem 'pry-debugger'
11
+ end
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- swissmedic-diff (0.1.5)
4
+ swissmedic-diff (0.1.6)
5
5
  nokogiri
6
6
  rubyXL
7
- rubyzip
7
+ rubyzip (= 0.9.9)
8
8
  spreadsheet
9
9
 
10
10
  GEM
@@ -12,9 +12,18 @@ GEM
12
12
  specs:
13
13
  ansi (1.4.3)
14
14
  builder (3.2.2)
15
+ coderay (1.1.0)
16
+ columnize (0.3.6)
17
+ debugger (1.6.5)
18
+ columnize (>= 0.3.1)
19
+ debugger-linecache (~> 1.2.0)
20
+ debugger-ruby_core_source (~> 1.3.1)
21
+ debugger-linecache (1.2.0)
22
+ debugger-ruby_core_source (1.3.1)
15
23
  hashie (2.0.5)
16
24
  hoe (3.7.4)
17
25
  rake (>= 0.8, < 11.0)
26
+ method_source (0.8.2)
18
27
  mini_portile (0.5.2)
19
28
  minitest (5.2.1)
20
29
  minitest-reporters (1.0.0)
@@ -27,10 +36,18 @@ GEM
27
36
  powerbar (1.0.11)
28
37
  ansi (~> 1.4.0)
29
38
  hashie (>= 1.1.0)
39
+ pry (0.9.12.4)
40
+ coderay (~> 1.0)
41
+ method_source (~> 0.8)
42
+ slop (~> 3.4)
43
+ pry-debugger (0.2.2)
44
+ debugger (~> 1.3)
45
+ pry (~> 0.9.10)
30
46
  rake (10.1.1)
31
47
  ruby-ole (1.2.11.7)
32
48
  rubyXL (1.2.10)
33
49
  rubyzip (0.9.9)
50
+ slop (3.4.7)
34
51
  spreadsheet (0.9.6)
35
52
  ruby-ole (>= 1.0)
36
53
 
@@ -41,5 +58,6 @@ DEPENDENCIES
41
58
  hoe
42
59
  minitest
43
60
  minitest-reporters
61
+ pry-debugger
44
62
  rake
45
63
  swissmedic-diff!
@@ -1,3 +1,9 @@
1
+ === 0.1.7 / 15.01.2014
2
+
3
+ * Support comparing xls and xslx files
4
+ * Must use rubyzip 0.9.9 to support all ruby versions
5
+ * Added debugger to Gemfile
6
+
1
7
  === 0.1.6 / 14.01.2014
2
8
 
3
9
  * Added test/data/Packungen-2014.xlsx
@@ -8,14 +8,16 @@ Manifest.txt
8
8
  README.txt
9
9
  Rakefile
10
10
  bin/swissmedic-diff
11
+ lib/compatibility.rb
11
12
  lib/swissmedic-diff.rb
12
13
  lib/version.rb
13
14
  setup.rb
14
15
  swissmedic-diff.gemspec
15
16
  test/data/Packungen-2013.10.14.xls
16
- test/data/Packungen-2014.xlsx
17
17
  test/data/Packungen.older.xls
18
18
  test/data/Packungen.xls
19
+ test/data/Packungen_2013_small.xls
20
+ test/data/Packungen_2014_small.xlsx
19
21
  test/data/Packungen_error_column.xls
20
22
  test/data/Packungen_error_missing1.xls
21
23
  test/data/Packungen_error_missing2.xls
@@ -0,0 +1,59 @@
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
+ 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
+ return Date.new(1899,12,30)+data.value.to_i if data.is_a?(RubyXL::Cell)
30
+ end
31
+ end
32
+ end
33
+
34
+ module RubyXL
35
+ class Worksheet < PrivateClass
36
+ def row(row_index)
37
+ x = @sheet_data[row_index]
38
+ def x.date(column_index)
39
+ data = self[column_index]
40
+ return Date.new(1899,12,30)+data.value.to_i if data.is_a?(RubyXL::Cell)
41
+ end unless defined?(x.date)
42
+ x
43
+ end
44
+ end
45
+ class Workbook
46
+ def worksheet(idx)
47
+ self[idx]
48
+ end
49
+ end
50
+ class Cell
51
+ def to_i
52
+ self.value.to_i
53
+ end
54
+ def to_s
55
+ self.value.to_s
56
+ end
57
+ end
58
+ end
59
+
@@ -5,6 +5,10 @@
5
5
  require 'ostruct'
6
6
  require 'spreadsheet'
7
7
  require 'rubyXL'
8
+ require 'pp'
9
+
10
+ # add some monkey patches for Spreadsheet and rubyXL
11
+ require File.join(File.dirname(__FILE__), 'compatibility.rb')
8
12
 
9
13
  #= diff command (compare two xls fles) for swissmedic xls file.
10
14
  #
@@ -96,11 +100,7 @@ class SwissmedicDiff
96
100
  @diff.changes = changes = {}
97
101
  @diff.newest_rows = newest_rows
98
102
  Spreadsheet.client_encoding = 'UTF-8'
99
- if File.extname(target).eql?('.xlsx')
100
- tbook = RubyXL::Parser.parse(File.expand_path(target))
101
- else
102
- tbook = Spreadsheet.open(target)
103
- end
103
+ tbook = Spreadsheet.open(target)
104
104
  sheet = tbook.worksheet(0)
105
105
  if new_column = cell(sheet.row(2), COLUMNS.size)
106
106
  raise "New column #{COLUMNS.size} (#{new_column})"
@@ -181,11 +181,7 @@ class SwissmedicDiff
181
181
  [known_regs, known_seqs, known_pacs, newest_rows]
182
182
  end
183
183
  def _known_data(latest, known_regs, known_seqs, known_pacs, newest_rows)
184
- if File.extname(latest).eql?('.xlsx')
185
- lbook = RubyXL::Parser.parse(File.expand_path(latest)).worksheets[0]
186
- else
187
- lbook = Spreadsheet.open(latest)
188
- end
184
+ lbook = Spreadsheet.open(latest)
189
185
  idx, prr, prp = nil
190
186
  multiples = {}
191
187
  each_valid_row(lbook) { |row|
@@ -222,6 +218,8 @@ class SwissmedicDiff
222
218
  COLUMNS.each_with_index { |key, idx|
223
219
  if(!ignore.include?(key) \
224
220
  && _comparable(key, row, idx) != _comparable(key, other, idx))
221
+ # binding.pry if key == :expiry_date
222
+
225
223
  flags.push key
226
224
  end
227
225
  }
@@ -273,7 +271,7 @@ class SwissmedicDiff
273
271
  if cell = row[idx]
274
272
  case key
275
273
  when :registration_date, :expiry_date
276
- row[idx]
274
+ Spreadsheet.date_cell(row, idx)
277
275
  when :seqnr
278
276
  sprintf "%02i", cell.to_i
279
277
  else
@@ -297,11 +295,7 @@ class SwissmedicDiff
297
295
  #return ::
298
296
  def each_valid_row(spreadsheet)
299
297
  skipRows = rows_to_skip(spreadsheet)
300
- if spreadsheet.class.eql?(RubyXL::Worksheet)
301
- worksheet = spreadsheet
302
- else
303
- worksheet = spreadsheet.worksheet(0)
304
- end
298
+ worksheet = spreadsheet.worksheet(0)
305
299
  row_nr = 0
306
300
  worksheet.each() {
307
301
  |row|
@@ -323,11 +317,7 @@ class SwissmedicDiff
323
317
  # Packungen.xls of swissmedic before October 2013 had 3 leading rows
324
318
  # Packungen.xls of swissmedic after October 2013 have 4 leading rows
325
319
  j = 0
326
- if spreadsheet.class.eql?(RubyXL::Worksheet)
327
- j += 1 while spreadsheet[j][0] and spreadsheet[j][0].value.to_i == 0
328
- else
329
- j += 1 while spreadsheet.worksheet(0).row(j)[0].to_i == 0
330
- end
320
+ j += 1 while spreadsheet.worksheet(0).row(j)[0].to_i == 0
331
321
  j
332
322
  end
333
323
 
@@ -1,3 +1,3 @@
1
1
  class SwissmedicDiff
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
@@ -17,7 +17,7 @@ spec = Gem::Specification.new do |s|
17
17
  s.executables << 'swissmedic-diff'
18
18
  s.add_dependency('rubyXL')
19
19
  s.add_dependency('nokogiri')
20
- s.add_dependency('rubyzip')
20
+ s.add_dependency('rubyzip', '0.9.9')
21
21
  s.add_dependency('spreadsheet')
22
22
  s.add_development_dependency "hoe"
23
23
  s.add_development_dependency "minitest"
@@ -26,19 +26,67 @@ module ODDB
26
26
  File.dirname(__FILE__)
27
27
  @workbook = Spreadsheet.open(@data)
28
28
  end
29
- # This is not a unit test as it takes way too long (> 1 minute)
30
- # Instead it might just tell you how to test with real data
29
+
31
30
  def test_diff_xls_and_xlsx
32
31
  @diff = SwissmedicDiff.new
33
- last_month = File.expand_path 'data/Packungen.xls', File.dirname(__FILE__)
34
- this_month = File.expand_path 'data/Packungen-2014.xlsx', File.dirname(__FILE__)
32
+ last_month = File.expand_path 'data/Packungen_2013_small.xls', File.dirname(__FILE__)
33
+ this_month = File.expand_path 'data/Packungen_2014_small.xlsx', File.dirname(__FILE__)
35
34
  result = @diff.diff last_month, this_month, [:atc_class, :sequence_date]
36
35
  assert(result.changes.flatten.index('Zulassungs-Nummer') == nil, "Should not find Zulassungs-Nummer in changes")
37
- assert(result.news.first.index('00275'), "Should find 00275 in news")
38
- assert(result.news.first.index('00277') == nil, "Should not find 00277 in news")
36
+ # puts "Got #{result.news.size} news, #{result.changes.size} changes, #{result.updates.size} updates."
37
+ assert_equal(8, result.news.size)
38
+ assert_equal(3, result.changes.size)
39
+ assert_equal(1, result.updates.size)
40
+ assert(result.news.first.index('00280'), "Should find 00280 in news")
41
+ assert(result.news.flatten.index('65034'), "Should find 65034 in news")
42
+ assert(result.news.flatten.index('00277') == nil, "Should not find 00277 in news")
39
43
  assert(result.news.flatten.index('Zulassungs-Nummer') == nil, "Should not find Zulassungs-Nummer in changes")
40
44
  end
45
+
46
+ def test_date_xls
47
+ tbook = Spreadsheet.open(File.expand_path('data/Packungen.xls', File.dirname(__FILE__)))
48
+ sheet = tbook.worksheet(0)
49
+ assert_equal(nil, sheet.row(0)[8]) # sequence_date
50
+ assert_equal(2010, sheet.row(4).date(8).year)
51
+ assert_equal(26, sheet.row(4).date(8).day)
52
+ # assert_equal(26, Spreadsheet.date_cell(sheet.row(4), 8))
53
+ assert_equal(26, Spreadsheet.date_cell(sheet.row(4), 8).day)
54
+ assert_equal(2010, Spreadsheet.date_cell(sheet.row(4), 8).year)
55
+ end
41
56
 
57
+ def test_date_xlsx
58
+ tbook = Spreadsheet.open(File.expand_path('data/Packungen_2014_small.xlsx', File.dirname(__FILE__)))
59
+ sheet = tbook.worksheet(0)
60
+ # sheet = RubyXL::Parser.parse(File.expand_path(File.expand_path 'data/Packungen_2014_small.xlsx', File.dirname(__FILE__)))[0]
61
+ assert_equal(nil, sheet.row(0)[8]) # sequence_date
62
+ assert_equal(2010, sheet.row(4).date(8).year)
63
+ assert_equal(26, sheet.row(4).date(8).day)
64
+ assert_equal(26, Spreadsheet.date_cell(sheet.row(4), 8).day)
65
+ assert_equal(2010, Spreadsheet.date_cell(sheet.row(4), 8).year)
66
+ end
67
+
68
+ def test_diff_xlsx_and_xls
69
+ @diff = SwissmedicDiff.new
70
+ last_month = File.expand_path 'data/Packungen_2014_small.xlsx', File.dirname(__FILE__)
71
+ this_month = File.expand_path 'data/Packungen.xls', File.dirname(__FILE__)
72
+ result = @diff.diff last_month, this_month, [:atc_class, :sequence_date]
73
+ assert_equal(7, result.news.size)
74
+ assert_equal(2, result.updates.size)
75
+ assert_equal(10, result.changes.size)
76
+ assert(result.changes.flatten.index('00275'), "Should find 00275 in changes")
77
+ assert(result.changes.flatten.index('00277'), "Should find 00277 in changes")
78
+ assert(result.news.flatten.index('Zulassungs-Nummer') == nil, "Should not find Zulassungs-Nummer in changes")
79
+ end
80
+ def test_diff_xlsx_and_xlsx
81
+ @diff = SwissmedicDiff.new
82
+ last_month = File.expand_path 'data/Packungen_2014_small.xlsx', File.dirname(__FILE__)
83
+ this_month = File.expand_path 'data/Packungen_2014_small.xlsx', File.dirname(__FILE__)
84
+ result = @diff.diff last_month, this_month, [:atc_class, :sequence_date]
85
+ assert_equal({}, result.changes)
86
+ assert_equal([], result.news)
87
+ assert_equal([], result.updates)
88
+ end
89
+
42
90
  # This is not a unit test as it takes way too long (> 1 minute)
43
91
  # Instead it might just tell you how to test with real data
44
92
  def test_real_diff
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swissmedic-diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
5
- prerelease:
4
+ version: 0.1.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - Masaomi Hatakeyama, Zeno R.R. Davatz
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-01-14 00:00:00.000000000 Z
11
+ date: 2014-01-15 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rdoc
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: hoe
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -65,6 +60,7 @@ extra_rdoc_files:
65
60
  - Manifest.txt
66
61
  - README.txt
67
62
  files:
63
+ - .gemtest
68
64
  - .gitignore
69
65
  - .travis.yml
70
66
  - Gemfile
@@ -75,21 +71,23 @@ files:
75
71
  - README.txt
76
72
  - Rakefile
77
73
  - bin/swissmedic-diff
74
+ - lib/compatibility.rb
78
75
  - lib/swissmedic-diff.rb
79
76
  - lib/version.rb
80
77
  - setup.rb
81
78
  - swissmedic-diff.gemspec
82
79
  - test/data/Packungen-2013.10.14.xls
83
- - test/data/Packungen-2014.xlsx
84
80
  - test/data/Packungen.older.xls
85
81
  - test/data/Packungen.xls
82
+ - test/data/Packungen_2013_small.xls
83
+ - test/data/Packungen_2014_small.xlsx
86
84
  - test/data/Packungen_error_column.xls
87
85
  - test/data/Packungen_error_missing1.xls
88
86
  - test/data/Packungen_error_missing2.xls
89
87
  - test/test_swissmedic-diff.rb
90
- - .gemtest
91
88
  homepage: https://github.com/zdavatz/swissmedic-diff
92
89
  licenses: []
90
+ metadata: {}
93
91
  post_install_message:
94
92
  rdoc_options:
95
93
  - --main
@@ -97,22 +95,20 @@ rdoc_options:
97
95
  require_paths:
98
96
  - lib
99
97
  required_ruby_version: !ruby/object:Gem::Requirement
100
- none: false
101
98
  requirements:
102
99
  - - ! '>='
103
100
  - !ruby/object:Gem::Version
104
101
  version: '0'
105
102
  required_rubygems_version: !ruby/object:Gem::Requirement
106
- none: false
107
103
  requirements:
108
104
  - - ! '>='
109
105
  - !ruby/object:Gem::Version
110
106
  version: '0'
111
107
  requirements: []
112
108
  rubyforge_project: swissmedic-diff
113
- rubygems_version: 1.8.25
109
+ rubygems_version: 2.2.1
114
110
  signing_key:
115
- specification_version: 3
111
+ specification_version: 4
116
112
  summary: ! '* Compares two Excel Documents provided by Swissmedic and displays the
117
113
  salient differences'
118
114
  test_files: