bankocr 0.0.3 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 88a16391bafc7e1f8c59f0d1490d5ec75ddadb1a
4
- data.tar.gz: 9cd73c8055978b7732ca36a0700077536ab03424
3
+ metadata.gz: 0c718e8a72b9c3926e904bd07c21637270d96ccc
4
+ data.tar.gz: 78622c054b4183e0f6b022aedd5cdf492dd2b8e3
5
5
  SHA512:
6
- metadata.gz: ed392b2fce5cf57bea88fc1a57348d6743f793523685e7faabd6e7976fb1d5efc036c9c14bad397e07a80d1f367323cf860fcd2821914d2a33bbb4b7496a2e98
7
- data.tar.gz: 41b514e56b802f7192291033b577e58a00697f57008ed44f16fe1777c23b28e7f1c9547e27713ec4fb0479a353916381d03f71305802d40bb3548bddaae4af75
6
+ metadata.gz: 0fd91b34998b1be1886fff104925b24ebcbe871848ad35f069da570d6f075def69336f6b96f412983f7d236b03c0f54fd9d00ae82778db30aa04fd9ce061fb4c
7
+ data.tar.gz: 77f43c26adb1c807c338d56ba8b38779e6bcb54a9657100394b9ab86ce373c093bf662bac25604f5e3bbfa6f41ff409264d6132515d45ba2006b6627f7bcb06e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bankocr (0.0.3)
4
+ bankocr (0.0.4)
5
5
  thor (~> 0.19)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -9,17 +9,20 @@ This repository provides a solution for BankOCR kata.
9
9
  * Description of the problem can be found here: http://code.joejag.com/coding-dojo-bank-ocr/
10
10
  * Current implementation covers the first 3 use cases.
11
11
 
12
- ## How to run?
13
-
14
- Use the following commands:
12
+ ## How to install
15
13
 
16
14
  ```
17
15
  gem install backocr
18
- bankocr process ./bin/input.in ./bin/output
19
16
  ```
20
17
 
21
- * It will generate a file under /bin directory with results
22
- * If you want to modify input edit file /bin/input.in
18
+ ## How to run?
19
+
20
+ * You can download a sample input file from here: https://github.com/solojavier/BankOCR/raw/master/bin/input.in
21
+ * To process input file and generate a report use the following command:
22
+
23
+ ```
24
+ bankocr process input_path output_path
25
+ ```
23
26
 
24
27
  ## Tests
25
28
 
data/bin/bankocr CHANGED
@@ -9,12 +9,7 @@ module BankOCR
9
9
  'Generates a report for account numbers read from input'
10
10
 
11
11
  def process(input, output)
12
- begin
13
- BankOCR.process(input, output)
14
- p 'OCR accounts report generated succesfully'
15
- rescue Exception => ex
16
- p ex.message
17
- end
12
+ BankOCR.process(input, output)
18
13
  end
19
14
  end
20
15
  end
@@ -1,24 +1,17 @@
1
1
  module BankOCR
2
2
  # Object representing an account number
3
3
  class AccountNumber
4
- attr_reader :error_message, :digits
5
4
 
6
5
  def initialize(digits)
7
6
  @digits = digits
8
- @valid = false
9
-
10
- validate!
11
7
  end
12
8
 
13
9
  def valid?
14
- @valid
10
+ @valid ||= sum(@digits) % 11 == 0
15
11
  end
16
12
 
17
- def validate!
18
- @error_message = 'ILL' if @digits.include?('?')
19
- @error_message ||= 'ERR' if sum(@digits) % 11 != 0
20
-
21
- @valid = true unless @error_message
13
+ def to_s
14
+ @digits
22
15
  end
23
16
 
24
17
  private
data/lib/bankocr.rb CHANGED
@@ -8,8 +8,7 @@ module BankOCR
8
8
  autoload :ReportGenerator, 'report_generator'
9
9
 
10
10
  def self.process(input, output)
11
- digit_strings = BankOCR::FileParser.new(input).entries
12
- account_numbers = digit_strings.map { |d| BankOCR::AccountNumber.new(d) }
11
+ account_numbers = BankOCR::FileParser.new(input).entries
13
12
 
14
13
  BankOCR::ReportGenerator.new(output, account_numbers).save!
15
14
  end
@@ -1,3 +1,3 @@
1
1
  module BankOCR
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
data/lib/file_parser.rb CHANGED
@@ -14,9 +14,10 @@ module BankOCR
14
14
  file = File.open(@input_path)
15
15
  @entries << parse_entry(file) until file.eof?
16
16
 
17
- @entries
17
+ @entries.map{|e| BankOCR::AccountNumber.new(e) }
18
18
  rescue
19
- raise 'Error reading input file, please validate'
19
+ p 'Error reading input file, please validate'
20
+ []
20
21
  ensure
21
22
  file.close if file
22
23
  end
@@ -10,12 +10,21 @@ module BankOCR
10
10
  file = File.open(@output_path, 'w+')
11
11
 
12
12
  @account_numbers.each do |account|
13
- file.write account.digits
14
- file.write " #{account.error_message}" unless account.valid?
15
- file.write "\n"
13
+ file.write "#{account}#{error(account)}\n"
16
14
  end
17
15
 
18
16
  file.close
19
17
  end
18
+
19
+ private
20
+
21
+ def error(account)
22
+ if account.to_s.include?('?')
23
+ ' ILL'
24
+ elsif !account.valid?
25
+ ' ERR'
26
+ end
27
+ end
28
+
20
29
  end
21
30
  end
@@ -13,7 +13,6 @@ describe BankOCR::AccountNumber do
13
13
  account = described_class.new(n)
14
14
 
15
15
  expect(account.valid?).to eq(true)
16
- expect(account.error_message).to eq(nil)
17
16
  end
18
17
  end
19
18
 
@@ -22,7 +21,6 @@ describe BankOCR::AccountNumber do
22
21
  account = described_class.new(n)
23
22
 
24
23
  expect(account.valid?).to eq(false)
25
- expect(account.error_message).to eq('ERR')
26
24
  end
27
25
  end
28
26
 
@@ -31,7 +29,6 @@ describe BankOCR::AccountNumber do
31
29
  account = described_class.new(n)
32
30
 
33
31
  expect(account.valid?).to eq(false)
34
- expect(account.error_message).to eq('ILL')
35
32
  end
36
33
  end
37
34
 
@@ -14,13 +14,13 @@ describe BankOCR::FileParser do
14
14
  it 'returns an array with account numbers' do
15
15
  parser = described_class.new(input_path)
16
16
 
17
- expect(parser.entries).to eq(account_numbers)
17
+ expect(parser.entries.map(&:to_s)).to eq(account_numbers)
18
18
  end
19
19
 
20
20
  it 'returns empty account_numbers if error reading file' do
21
21
  parser = described_class.new('invalid_path')
22
22
 
23
- expect{parser.entries}.to raise_error('Error reading input file, please validate')
23
+ expect(parser.entries).to eq([])
24
24
  end
25
25
 
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bankocr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Javier Cervantes
@@ -74,7 +74,6 @@ files:
74
74
  - lib/bankocr/version.rb
75
75
  - lib/file_parser.rb
76
76
  - lib/report_generator.rb
77
- - lib/utils.rb
78
77
  - spec/bin/bankocr_spec.rb
79
78
  - spec/bin/input.in
80
79
  - spec/lib/account_number_spec.rb
data/lib/utils.rb DELETED
@@ -1,84 +0,0 @@
1
- # Module for BankOCR Application
2
- module BankOCR
3
- # Utility functions to perform data conversions
4
- module Utils
5
- # Parses an OCR machine input file and returns an array of account numbers
6
- def parse_file(input_path)
7
- file = File.open(input_path)
8
- numbers = []
9
-
10
- numbers << next_entry_to_digits(file) until file.eof?
11
- numbers
12
- rescue
13
- []
14
- ensure
15
- file.close if file
16
- end
17
-
18
- # Receives a list of account numbers and returns validation information
19
- def validate_accounts(account_numbers)
20
- account_numbers.map do |number|
21
- valid, message = validate(number.to_s)
22
-
23
- { account_number: number, valid: valid, message: message }
24
- end
25
- end
26
-
27
- # Creates a file report in ouput path with accounts received
28
- def generate_report(output_path, accounts)
29
- file = File.open(output_path, 'w+')
30
-
31
- accounts.select { |a| a[:account_number] }.each do |acc|
32
- file.write acc[:account_number]
33
- file.write " #{acc[:message]}" if !acc[:valid] && acc[:message]
34
- file.write "\n"
35
- end
36
-
37
- file.close
38
- end
39
-
40
- private
41
-
42
- def next_entry_to_digits(file)
43
- top = file.readline
44
- middle = file.readline
45
- bottom = file.readline
46
- _blank = file.readline
47
-
48
- (0..8).map do |i|
49
- low = (i * 3)
50
- high = ((i + 1) * 3) - 1
51
- shape = top[low..high] + middle[low..high] + bottom[low..high]
52
-
53
- conversions[shape] || '?'
54
- end.join
55
- end
56
-
57
- def conversions
58
- { ' _ | ||_|' => '0',
59
- ' | |' => '1',
60
- ' _ _||_ ' => '2',
61
- ' _ _| _|' => '3',
62
- ' |_| |' => '4',
63
- ' _ |_ _|' => '5',
64
- ' _ |_ |_|' => '6',
65
- ' _ | |' => '7',
66
- ' _ |_||_|' => '8',
67
- ' _ |_| _|' => '9' }
68
- end
69
-
70
- def sum(account_number)
71
- (0..8).map { |i| account_number[i].to_i * (i + 2) }.reduce(:+)
72
- end
73
-
74
- def validate(number)
75
- if number.include?('?')
76
- [false, 'ILL']
77
- elsif sum(number) % 11 != 0
78
- [false, 'ERR']
79
- else
80
- [true, 'OK']
81
- end
82
- end
83
- end
84
- end