swissmedic-diff 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: