dropmire 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 119aefccefdf060e5304694801af0c8785458924
4
- data.tar.gz: 5679930bd39b53034d57aa463d16601f18f27a11
3
+ metadata.gz: 00aff84a94e0b3f608c8c246865fb43c2f1a6ace
4
+ data.tar.gz: 2b7661d1934070955617c298abc748296e9025c7
5
5
  SHA512:
6
- metadata.gz: 91f3eee95e9be0aaae45c9290abfc99d328e6acd02bfc2e6ba0908f40df5bb7bff237aff0f4fa87515b79eef587d5f752db1fa66a0563e3ddc2e0554860f8e7f
7
- data.tar.gz: 70b7439097df7b4b755af991c1b19c8afc29cfb670edd796efb3f00c3b6031772d0da225e1e4ffc5da54b309cb11fe2f81ffaddd7b6d86ff3456a541f0b1e4e1
6
+ metadata.gz: 29a80db72e40d488c6f3e0609b70af54251cf0a242f9754e4d617c79bc909c3c9985dd15c097836e8e1d78bd50a882cbb576cb9d3da009e5ec7780d366c8d53e
7
+ data.tar.gz: dc30a3663d0f6ca55e97b8290ce73f3a202686f5ef4228f94ee2dd95f0eac09f72cf9a9ab90788bf1d9951499740eaf72f5af98dec3efddc31821562a82d5d46
data/.gitignore CHANGED
@@ -22,4 +22,7 @@ tmp
22
22
  mkmf.log
23
23
 
24
24
  # ignore application.yml
25
- config/application.yml
25
+ config/application.yml
26
+
27
+ # keep test data private
28
+ spec/demo.txt
data/README.md CHANGED
@@ -18,7 +18,54 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- Coming soon...
21
+ Install the gem:
22
+
23
+ ```bash
24
+ gem install dropmire
25
+ ```
26
+
27
+ Or add to Gemfile:
28
+
29
+ ```bash
30
+ gem 'dropmire'
31
+ ```
32
+
33
+ Do cool stuff
34
+
35
+ ```ruby
36
+ person = Dropmire::Identity.new("""Your scanned input here!""")
37
+
38
+ # use your super cool new object
39
+ person.first_name
40
+ # => 'John'
41
+
42
+ person.middle_name
43
+ # => 'Pearce'
44
+
45
+ person.last_name
46
+ # => 'Doe'
47
+
48
+ person.date_of_birth
49
+ # => '1993-06-07'
50
+
51
+ person.drivers_license_number
52
+ # => 'D21242193207'
53
+
54
+ person.drivers_license_expiration_date
55
+ # => '2015-06'
56
+
57
+ person.street
58
+ # => '1234 Main St'
59
+
60
+ person.city
61
+ # => 'Tallahassee'
62
+
63
+ person.state
64
+ # => 'State'
65
+
66
+ person.zipcode
67
+ # => '12345'
68
+ ```
22
69
 
23
70
  ## Contributing
24
71
 
@@ -0,0 +1,26 @@
1
+ A: 0
2
+ B: 60
3
+ C: 100
4
+ D: 160
5
+ E: 200
6
+ F: 240
7
+ G: 280
8
+ H: 320
9
+ I: 400
10
+ J: 420
11
+ K: 500
12
+ L: 520
13
+ M: 540
14
+ N: 620
15
+ O: 640
16
+ P: 660
17
+ Q: 700
18
+ R: 720
19
+ S: 780
20
+ T: 800
21
+ U: 840
22
+ V: 860
23
+ W: 880
24
+ X: 940
25
+ Y: 960
26
+ Z: 980
@@ -0,0 +1,53 @@
1
+ albert: 20
2
+ alice: 20
3
+ ann: 40
4
+ anna: 40
5
+ annie: 40
6
+ arthur: 40
7
+ bernard: 80
8
+ bette: 80
9
+ bettie: 80
10
+ betty: 80
11
+ carl: 120
12
+ catherine: 120
13
+ charles: 140
14
+ dorthy: 180
15
+ edward: 220
16
+ elizabeth: 220
17
+ florence: 260
18
+ donald: 180
19
+ clara: 140
20
+ frank: 260
21
+ george: 300
22
+ grace: 300
23
+ harold: 340
24
+ harriet: 340
25
+ harry: 360
26
+ hazel: 360
27
+ helen: 380
28
+ henry: 380
29
+ james: 440
30
+ jane: 440
31
+ jayne: 440
32
+ jean: 460
33
+ joan: 480
34
+ john: 460
35
+ joseph: 480
36
+ margaret: 560
37
+ martin: 560
38
+ marvin: 580
39
+ mary: 580
40
+ melvin: 600
41
+ mildred: 600
42
+ patricia: 680
43
+ paul: 680
44
+ richard: 740
45
+ robert: 760
46
+ ruby: 740
47
+ ruth: 760
48
+ thelma: 820
49
+ thomas: 820
50
+ walter: 900
51
+ wanda: 900
52
+ william: 920
53
+ wilma: 920
@@ -0,0 +1,26 @@
1
+ A: 1
2
+ B: 2
3
+ C: 3
4
+ D: 4
5
+ E: 5
6
+ F: 6
7
+ G: 7
8
+ H: 8
9
+ I: 9
10
+ J: 10
11
+ K: 11
12
+ L: 12
13
+ M: 13
14
+ N: 14
15
+ O: 14
16
+ P: 15
17
+ Q: 15
18
+ R: 16
19
+ S: 17
20
+ T: 18
21
+ U: 18
22
+ V: 18
23
+ W: 19
24
+ X: 19
25
+ Y: 19
26
+ Z: 19
data/dropmire.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["jacobsen.connor@gmail.com"]
11
11
  spec.summary = %q{A simple way to collect data from US driver's licenses.}
12
12
  spec.description = %q{A simple way to collect data from US driver's licenses with a card reader.}
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/connorjacobsen/dropmire"
14
14
  spec.license = "Apache-2.0"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -0,0 +1,5 @@
1
+ class String
2
+ def to_char
3
+ (self.to_i + 96).chr
4
+ end
5
+ end
@@ -0,0 +1,101 @@
1
+ require 'dropmire/parser'
2
+
3
+ module Dropmire
4
+ class Identity
5
+ def initialize(text)
6
+ p = Parser.new(text)
7
+ p.parse
8
+
9
+ @attrs = p.attrs
10
+ end
11
+
12
+ # naive method approach
13
+ def address
14
+ { street: street, city: city, state: state, zipcode: zipcode }
15
+ end
16
+
17
+ def street
18
+ attrs[:address][:street]
19
+ end
20
+
21
+ def city
22
+ attrs[:address][:city]
23
+ end
24
+
25
+ def state
26
+ attrs[:address][:state]
27
+ end
28
+
29
+ def zipcode
30
+ attrs[:address][:zipcode]
31
+ end
32
+
33
+ def names
34
+ { first: first_name, middle: middle_name, last: last_name }
35
+ end
36
+
37
+ def first_name
38
+ attrs[:name][:first]
39
+ end
40
+
41
+ def middle_name
42
+ attrs[:name][:middle]
43
+ end
44
+
45
+ def last_name
46
+ attrs[:name][:last]
47
+ end
48
+
49
+ def drivers_license_number
50
+ attrs[:license_num]
51
+ end
52
+
53
+ def drivers_license_iin
54
+ attrs[:iin]
55
+ end
56
+
57
+ def drivers_license_class
58
+ attrs[:license_class]
59
+ end
60
+
61
+ def drivers_license_expiration_date
62
+ attrs[:expiration_date]
63
+ end
64
+
65
+ def date_of_birth
66
+ attrs[:date_of_birth]
67
+ end
68
+
69
+ # For meta attr methods later...
70
+ #
71
+ # def method_missing(method, *args, &block)
72
+ # if addr_lookup method.to_s
73
+
74
+ # else
75
+ # super
76
+ # end
77
+ # end
78
+
79
+ private
80
+
81
+ def attrs
82
+ @attrs
83
+ end
84
+
85
+ # def attr_lookup(attr)
86
+ # if attrs.has_key? attr
87
+ # elsif address_vars
88
+ # elsif name_vars
89
+ # else
90
+ # end
91
+ # end
92
+
93
+ # def address_vars
94
+ # %w(street city state zipcode)
95
+ # end
96
+
97
+ # def name_vars
98
+ # %w(first middle last first_name middle_name last_name)
99
+ # end
100
+ end
101
+ end
@@ -0,0 +1,104 @@
1
+ require 'yaml'
2
+
3
+ module Dropmire
4
+ module NameEncoder
5
+
6
+ class << self
7
+ # :first and :middle are the first and middle names to encode.
8
+ def encode(first, middle)
9
+ raise "Cannot encode nil name" if first.nil? || middle.nil?
10
+
11
+ fcode = generate_fcode(first.downcase)
12
+ mcode = find(:middle_initials, initial(middle).upcase)
13
+
14
+ "%3d" % (fcode + mcode)
15
+ end
16
+
17
+ def generate_fcode(name)
18
+ val = find(:first_names, name.downcase)
19
+
20
+ if val.nil?
21
+ val = find(:first_initials, initial(name).upcase)
22
+ end
23
+
24
+ val
25
+ end
26
+
27
+ # get the corresponding initial for a given :name.
28
+ def initial(name)
29
+ return nil if name.nil?
30
+ name[0].downcase
31
+ end
32
+
33
+ def load(filename)
34
+ load_yaml_from(filename)
35
+ end
36
+
37
+ def first_names
38
+ @first_names ||= load_first_names
39
+ end
40
+
41
+ def first_initials
42
+ @first_initials ||= load_first_initials
43
+ end
44
+
45
+ def middle_initials
46
+ @middle_initials ||= load_middle_initials
47
+ end
48
+
49
+ # searches the desired Hash (chosen by :method) for the :key
50
+ def find(method, key)
51
+ if allowed_find_methods.include? method
52
+ self.send(method).fetch(key, nil)
53
+ else
54
+ raise "Illegal find method!"
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def allowed_find_methods
61
+ [ :first_names, :first_initials, :middle_initials ]
62
+ end
63
+
64
+ def load_first_names
65
+ @first_names = load(first_name_yaml)
66
+ end
67
+
68
+ def load_first_initials
69
+ @first_initials = load(first_initial_yaml)
70
+ end
71
+
72
+ def load_middle_initials
73
+ @middle_initials = load(middle_initial_yaml)
74
+ end
75
+
76
+ def load_yaml_from(filename)
77
+ parsed = begin
78
+ YAML.load(File.open(filename))
79
+ rescue ArgumentError => e
80
+ puts "Could not parse YAML: #{e.message}"
81
+ end
82
+ end
83
+
84
+ # YAML file name helpers #
85
+
86
+ def yaml_dir
87
+ 'config/'
88
+ end
89
+
90
+ def first_name_yaml
91
+ yaml_dir + 'first_name.yml'
92
+ end
93
+
94
+ def first_initial_yaml
95
+ yaml_dir + 'first_initial.yml'
96
+ end
97
+
98
+ def middle_initial_yaml
99
+ yaml_dir + 'middle_initial.yml'
100
+ end
101
+ end
102
+
103
+ end
104
+ end
@@ -1,3 +1,5 @@
1
+ require 'dropmire/ext/string'
2
+
1
3
  module Dropmire
2
4
  class Parser
3
5
  # Public: Creates a new Dropmire::Parser.
@@ -13,15 +15,26 @@ module Dropmire
13
15
  # Returns the Hash of results from the string.
14
16
  def initialize(text, options = {})
15
17
  @text = text
16
- @attrs = {} # empty hash for the parsed values
18
+ @attrs = {:address=>{}} # empty hash for the parsed values
17
19
  end
18
20
 
19
21
  def attrs
20
22
  @attrs
21
23
  end
22
24
 
23
- def address(text)
24
- /\A[%][a-zA-Z]*/.match(text).to_s
25
+ def parse
26
+ parse_methods.each do |method|
27
+ self.send method
28
+ end
29
+ end
30
+
31
+ def parse_methods
32
+ [ :parse_address, :parse_carrot_string, :date_of_birth, :zipcode,
33
+ :license_class, :expiration_date, :parse_license_num ]
34
+ end
35
+
36
+ def address
37
+ /\A[%][a-zA-Z]*/.match(@text).to_s
25
38
  end
26
39
 
27
40
  def state(addr)
@@ -33,11 +46,95 @@ module Dropmire
33
46
  addr[3..l].capitalize
34
47
  end
35
48
 
49
+ def carrot_string
50
+ str = /\^(.*)\^/.match(@text).to_s
51
+ len = str.length-2
52
+ str[1..len].split('^')
53
+ end
54
+
55
+ def parse_carrot_string
56
+ name_string, street_string = carrot_string
57
+ names split_name(name_string)
58
+ street street_string
59
+ end
60
+
36
61
  def parse_address
37
- addr = address @text
38
- @attrs[:state] = state(addr)
39
- @attrs[:city] = city(addr)
40
- [@attrs[:city], @attrs[:state]]
62
+ addr = address
63
+ @attrs[:address][:state] = state(addr)
64
+ @attrs[:address][:city] = city(addr)
65
+
66
+ [@attrs[:address][:city], @attrs[:address][:state]]
67
+ end
68
+
69
+ def split_name(name)
70
+ name.split('$')
71
+ end
72
+
73
+ def names(names)
74
+ @attrs[:name] = {
75
+ first: names[1].capitalize,
76
+ last: names[0].capitalize,
77
+ middle: names[2].capitalize
78
+ }
79
+ end
80
+
81
+ def street(street)
82
+ ary = street.split(' ')
83
+ str = []
84
+ ary.each do |s|
85
+ str << s.capitalize
86
+ end
87
+ @attrs[:address][:street] = str.join(' ')
88
+ end
89
+
90
+ def zipcode
91
+ str = /![\s]*[0-9]*/.match(@text).to_s
92
+ zip = str[1..(str.length)].strip
93
+ @attrs[:address][:zipcode] = zip[0,5]
94
+ end
95
+
96
+ def license_class
97
+ str = /![\s]*[0-9]*[\s]*[A-Z]/.match(@text).to_s
98
+ @attrs[:license_class] = str[-1]
99
+ end
100
+
101
+ def id_string
102
+ /;[0-9]*=/.match(@text).to_s.gsub(/[;=]/, '')
103
+ end
104
+
105
+ def iin(str)
106
+ @attrs[:iin] = str[0,6]
107
+ end
108
+
109
+ def license_num(str)
110
+ num_len = str.length - 8
111
+ @attrs[:license_num] = str[6,2].to_char.upcase + str[8, num_len]
112
+ end
113
+
114
+ def parse_license_num
115
+ id_str = id_string
116
+ iin(id_str)
117
+ license_num(id_str)
118
+ end
119
+
120
+ def expiration_date
121
+ str = /=[0-9]{4}/.match(@text).to_s
122
+ @attrs[:expiration_date] = transform_date str[1,4]
123
+ end
124
+
125
+ def date_of_birth
126
+ str = /=[0-9]*/.match(@text).to_s
127
+ dob = str[5,8]
128
+ year = dob[0,4]
129
+ month = dob[4,2]
130
+ day = dob[6,2]
131
+ @attrs[:date_of_birth] = "#{year}-#{month}-#{day}"
132
+ end
133
+
134
+ def transform_date(date)
135
+ y = date[0,2]
136
+ m = date[2,2]
137
+ "20#{y}-#{m}"
41
138
  end
42
139
  end
43
- end
140
+ end
@@ -0,0 +1,66 @@
1
+ # Implementation of the Soundex phonetic algorithm for indexing names
2
+ # by sound, as pronounced in English.
3
+ module Dropmire
4
+ module Soundex
5
+
6
+ class << self
7
+
8
+ def soundex(str_or_arr)
9
+ case str_or_arr
10
+ when String
11
+ build_code_for(str_or_arr)
12
+ when Array
13
+ str_or_arr.collect { |str| build_code_for(str) }
14
+ else
15
+ nil
16
+ end
17
+ end
18
+
19
+ def build_code_for(str)
20
+ str = str.upcase.gsub(/[^A-Z]/, '')
21
+ return nil if str.empty?
22
+
23
+ soundex_code = str[0]
24
+ last_code = get_code str[0]
25
+
26
+ len = str.length
27
+ str[0..len].chars.each_index do |index|
28
+ return soundex_code if soundex_code.length == 4
29
+
30
+ code = get_code str[index]
31
+ if code == '0'
32
+ unless %w(W H).include? str[index]
33
+ last_code = nil
34
+ end
35
+ elsif code != last_code
36
+ soundex_code += code
37
+ last_code = code
38
+ end
39
+ end
40
+
41
+ return soundex_code.ljust(4, '0')
42
+ end
43
+
44
+ def get_code(char)
45
+ case char
46
+ when 'B', 'F', 'P', 'V'
47
+ '1'
48
+ when 'C', 'G', 'J', 'K', 'Q', 'S', 'X', 'Z'
49
+ '2'
50
+ when 'D', 'T'
51
+ '3'
52
+ when 'L'
53
+ '4'
54
+ when 'M', 'N'
55
+ '5'
56
+ when 'R'
57
+ '6'
58
+ else
59
+ '0'
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
@@ -1,3 +1,3 @@
1
1
  module Dropmire
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/dropmire.rb CHANGED
@@ -1,5 +1,6 @@
1
- require "dropmire/version"
1
+ require "dropmire/identity"
2
2
  require "dropmire/parser"
3
+ require "dropmire/version"
3
4
 
4
5
  module Dropmire
5
6
  end
data/spec/demo.txt CHANGED
@@ -1 +1,3 @@
1
- %FLTALLAHASSEE^JACOBSEN$CONNOR$ALAN^6357 SINKOLA DR^ ?;6360101021210193207=1506199399070=?+! 323124522 E 1602 ECCECC00000?
1
+ %FLTALLAHASSEE^JACOBSEN$CONNOR$ALAN^6357 SINKOLA DR^ ?;6360101021210193207=1506199306070=?+! 323124522 E 1602 ECCECC00000?
2
+
3
+ %CAENCINITAS^MEIER$ALAIN$PIERRE^2814 CRYSTAL RIDGE RD^?;636014064752956=190819930823?+!!92024 M602162BRNBRN I67620131125 [,/,_29’;2!?
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dropmire::Identity do
4
+ @demo_text = """%FLTALLAHASSEE^JACOBSEN$CONNOR$ALAN^1234 MAIN ST^ ?;6360101021210193207=1506199306070=?+! 123454522 E 1602 ECCECC00000?"""
5
+ identity = Dropmire::Identity.new(@demo_text)
6
+ subject { identity }
7
+
8
+ describe "#first_name" do
9
+ it "returns correct value" do
10
+ expect(subject.first_name).to eql "Connor"
11
+ end
12
+ end
13
+
14
+ describe "#middle_name" do
15
+ it "returns correct value" do
16
+ expect(subject.middle_name).to eql "Alan"
17
+ end
18
+ end
19
+
20
+ describe "#last_name" do
21
+ it "returns correct value" do
22
+ expect(subject.last_name).to eql "Jacobsen"
23
+ end
24
+ end
25
+
26
+ describe "#names" do
27
+ names = {first: "Connor", middle: "Alan", last: ""}
28
+ end
29
+
30
+ describe "#address" do
31
+ end
32
+
33
+ describe "#city" do
34
+ it "returns correct value" do
35
+ expect(subject.city).to eql "Tallahassee"
36
+ end
37
+ end
38
+
39
+ describe "#state" do
40
+ it "returns correct value" do
41
+ expect(subject.state).to eql "FL"
42
+ end
43
+ end
44
+
45
+ describe "#street" do
46
+ it "returns correct value" do
47
+ expect(subject.street).to eql "1234 Main St"
48
+ end
49
+ end
50
+
51
+ describe "#zipcode" do
52
+ it "returns correct value" do
53
+ expect(subject.zipcode).to eql "12345"
54
+ end
55
+ end
56
+
57
+ describe "#drivers_license_number" do
58
+ it "returns correct value" do
59
+ expect(subject.drivers_license_number).to eql "J21210193207"
60
+ end
61
+ end
62
+
63
+ describe "#drivers_license_iin" do
64
+ it "returns correct value" do
65
+ expect(subject.drivers_license_iin).to eql "636010"
66
+ end
67
+ end
68
+
69
+ describe "#drivers_license_expiration_date" do
70
+ it "returns correct value" do
71
+ expect(subject.drivers_license_expiration_date).to eql "2015-06"
72
+ end
73
+ end
74
+
75
+ describe "#date_of_birth" do
76
+ it "returns correct value" do
77
+ expect(subject.date_of_birth).to eql "1993-06-07"
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dropmire::NameEncoder do
4
+
5
+ subject { Dropmire::NameEncoder }
6
+
7
+ describe "#encode" do
8
+ context "William Andrew Fakename" do
9
+ it "returns correct value" do
10
+ expect(subject.encode("William", "Andrew")).to eql "921"
11
+ end
12
+ end
13
+
14
+ context "Connor Alan Jacobsen" do
15
+ it "returns correct value" do
16
+ expect(subject.encode("Connor", "Alan")).to eql "101"
17
+ end
18
+ end
19
+ end
20
+
21
+ describe "#generate_fcode" do
22
+ context "first name NotFound" do
23
+ it "uses first initial" do
24
+ expect(subject.generate_fcode("Connor")).to eql 100
25
+ end
26
+ end
27
+
28
+ context "first name found" do
29
+ it "returns correct value" do
30
+ expect(subject.generate_fcode("Alice")).to eql 20
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "#initial" do
36
+ context "when not nil" do
37
+ it "returns a single char" do
38
+ expect(subject.initial('Connor').size).to eql 1
39
+ end
40
+
41
+ it "returns the correct char" do
42
+ expect(subject.initial('Connor')).to eql 'c'
43
+ end
44
+ end
45
+
46
+ context "when nil" do
47
+ it "returns nil" do
48
+ expect(subject.initial(nil)).to eql nil
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "#first_names" do
54
+ it "has class Hash" do
55
+ expect(subject.first_names.class).to eql Hash
56
+ end
57
+
58
+ it "is not empty" do
59
+ expect(subject.first_names.empty?).to eql false
60
+ end
61
+
62
+ describe "sanity check" do
63
+ context "alice" do
64
+ it "returns 20" do
65
+ expect(subject.first_names["alice"]).to eql 20
66
+ end
67
+ end
68
+
69
+ context "donald" do
70
+ it "returns 180" do
71
+ expect(subject.first_names["donald"]).to eql 180
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ describe "#first_initials" do
78
+ it "has class Hash" do
79
+ expect(subject.first_initials.class).to eql Hash
80
+ end
81
+
82
+ it "is not empty" do
83
+ expect(subject.first_initials.empty?).to eql false
84
+ end
85
+
86
+ describe "sanity check" do
87
+ context "C" do
88
+ it "returns 100" do
89
+ expect(subject.first_initials["C"]).to eql 100
90
+ end
91
+ end
92
+
93
+ context "J" do
94
+ it "returns 420" do
95
+ expect(subject.first_initials["J"]).to eql 420
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "#middle_initials" do
102
+ it "has class Hash" do
103
+ expect(subject.middle_initials.class).to eql Hash
104
+ end
105
+
106
+ it "is not empty" do
107
+ expect(subject.middle_initials.empty?).to eql false
108
+ end
109
+
110
+ describe "sanity check" do
111
+ context "C" do
112
+ it "returns 3" do
113
+ expect(subject.middle_initials["C"]).to eql 3
114
+ end
115
+ end
116
+
117
+ context "J" do
118
+ it "returns 10" do
119
+ expect(subject.middle_initials["J"]).to eql 10
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ describe "#find" do
126
+ context "first_names" do
127
+ context "when in YAML" do
128
+ it "returns correct value" do
129
+ expect(subject.find(:first_names, "donald")).to eql 180
130
+ end
131
+ end
132
+
133
+ context "when not in YAML" do
134
+ it "returns nil" do
135
+ expect(subject.find(:first_names, "connor")).to eql nil
136
+ end
137
+ end
138
+ end
139
+
140
+ context "first_initials" do
141
+ context "when in YAML" do
142
+ it "returns correct value" do
143
+ expect(subject.find(:first_initials, "A")).to eql 0
144
+ end
145
+ end
146
+
147
+ context "when not in YAML" do
148
+ it "returns nil" do
149
+ expect(subject.find(:first_initials, "AB")).to eql nil
150
+ end
151
+ end
152
+ end
153
+
154
+ context "middle_initials" do
155
+ context "when in YAML" do
156
+ it "returns correct value" do
157
+ expect(subject.find(:middle_initials, "A")).to eql 1
158
+ end
159
+ end
160
+
161
+ context "when not in YAML" do
162
+ it "returns nil" do
163
+ expect(subject.find(:middle_initials, "AB")).to eql nil
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
data/spec/parser_spec.rb CHANGED
@@ -1,8 +1,7 @@
1
- require 'dropmire'
2
- # require 'spec_helper'
1
+ require 'spec_helper'
3
2
 
4
3
  describe Dropmire::Parser do
5
- @demo_text = ENV['DL_STRING']
4
+ @demo_text = """%FLTALLAHASSEE^JACOBSEN$CONNOR$ALAN^6357 SINKOLA DR^ ?;6360101021210193207=1506199306070=?+! 323124522 E 1602 ECCECC00000?"""
6
5
  parser = Dropmire::Parser.new(@demo_text)
7
6
  subject { parser }
8
7
 
@@ -10,7 +9,26 @@ describe Dropmire::Parser do
10
9
  expect(subject.class).to eql Dropmire::Parser
11
10
  end
12
11
 
13
- describe "#addr" do
12
+ describe "#address" do
13
+ it "returns the address section" do
14
+ expect(subject.address).to eql "%FLTALLAHASSEE"
15
+ end
16
+ end
17
+
18
+ describe "#state" do
19
+ it "returns the correct state" do
20
+ addr = subject.address
21
+
22
+ expect(subject.state(addr)).to eql "FL"
23
+ end
24
+ end
25
+
26
+ describe "#city" do
27
+ it "returns the correct city" do
28
+ addr = subject.address
29
+
30
+ expect(subject.city(addr)).to eql "Tallahassee"
31
+ end
14
32
  end
15
33
 
16
34
  describe "#parse_address" do
@@ -18,4 +36,79 @@ describe Dropmire::Parser do
18
36
  expect(subject.parse_address).to eql ["Tallahassee", "FL"]
19
37
  end
20
38
  end
39
+
40
+ describe "#carrot_string" do
41
+ it "returns the correct array" do
42
+ carrot_arr = ["JACOBSEN$CONNOR$ALAN", "6357 SINKOLA DR"]
43
+ expect(subject.carrot_string).to eql carrot_arr
44
+ end
45
+ end
46
+
47
+ describe "#names" do
48
+ it "returns the correct array of strings" do
49
+ name_hash = {first: "Connor", middle: "Alan", last: "Jacobsen"}
50
+ expect(subject.names(%w(JACOBSEN CONNOR ALAN))).to eql name_hash
51
+ end
52
+ end
53
+
54
+ describe "street" do
55
+ it "returns the correct string" do
56
+ the_street = "6357 SINKOLA DR"
57
+ expect(subject.street(the_street)).to eql "6357 Sinkola Dr"
58
+ end
59
+ end
60
+
61
+ describe "#zipcode" do
62
+ it "returns correct zipcode" do
63
+ expect(subject.zipcode).to eql "32312"
64
+ end
65
+ end
66
+
67
+ describe "#id_string" do
68
+ it "returns the correct string" do
69
+ expect(subject.id_string).to eql "6360101021210193207"
70
+ end
71
+ end
72
+
73
+ describe "#iin" do
74
+ it "returns correct iin" do
75
+ id_str = subject.id_string
76
+ expect(subject.iin(id_str)).to eql "636010"
77
+ end
78
+ end
79
+
80
+ describe "#license_num" do
81
+ context "Florida" do
82
+ it "returns the correct string" do
83
+ id_str = subject.id_string
84
+ expect(subject.license_num(id_str)).to eql "J21210193207"
85
+ end
86
+ end
87
+ end
88
+
89
+ describe "#license_class" do
90
+ it "returns correct license_class" do
91
+ expect(subject.license_class).to eql "E"
92
+ end
93
+ end
94
+
95
+ describe "#expiration_date" do
96
+ it "returns the correct date" do
97
+ expect(subject.expiration_date).to eql "2015-06"
98
+ end
99
+ end
100
+
101
+ describe "#transform_date" do
102
+ it "returns Unix format" do
103
+ expect(subject.transform_date("1707")).to eql "2017-07"
104
+ end
105
+ end
106
+
107
+ describe "#date_of_birth" do
108
+ context "Florida" do
109
+ it "returns correct date_of_birth" do
110
+ expect(subject.date_of_birth).to eql "1993-06-07"
111
+ end
112
+ end
113
+ end
21
114
  end
@@ -0,0 +1,188 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dropmire::Soundex do
4
+ describe "#soundex" do
5
+ context "String" do
6
+ context "Robert" do
7
+ it "returns R163" do
8
+ expect(Dropmire::Soundex.soundex("Robert")).to eql 'R163'
9
+ end
10
+ end
11
+
12
+ context "Rupert" do
13
+ it "returns R163" do
14
+ expect(Dropmire::Soundex.soundex("Rupert")).to eql 'R163'
15
+ end
16
+ end
17
+
18
+ context "Rubin" do
19
+ it "returns R150" do
20
+ expect(Dropmire::Soundex.soundex("Rubin")).to eql 'R150'
21
+ end
22
+ end
23
+
24
+ context "Ashcraft" do
25
+ it "returns A261" do
26
+ expect(Dropmire::Soundex.soundex("Ashcraft")).to eql 'A261'
27
+ end
28
+ end
29
+
30
+ context "Ashcroft" do
31
+ it "returns A261" do
32
+ expect(Dropmire::Soundex.soundex("Ashcroft")).to eql 'A261'
33
+ end
34
+ end
35
+
36
+ context "Tymczak" do
37
+ it "returns T522" do
38
+ expect(Dropmire::Soundex.soundex("Tymczak")).to eql 'T522'
39
+ end
40
+ end
41
+
42
+ context "Pfister" do
43
+ it "returns P236" do
44
+ expect(Dropmire::Soundex.soundex("Pfister")).to eql 'P236'
45
+ end
46
+ end
47
+ end
48
+
49
+ context "Array" do
50
+ it "returns an Array of Soundexs" do
51
+ name_ary = %w(Robert Rupin Ashcroft Pfister)
52
+ answers = %w(R163 R150 A261 P236)
53
+
54
+ expect(Dropmire::Soundex.soundex(name_ary)).to eql answers
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "#build_code_for" do
60
+ context "Robert" do
61
+ it "returns R163" do
62
+ expect(Dropmire::Soundex.build_code_for("Robert")).to eql 'R163'
63
+ end
64
+ end
65
+
66
+ context "Rupert" do
67
+ it "returns R163" do
68
+ expect(Dropmire::Soundex.build_code_for("Rupert")).to eql 'R163'
69
+ end
70
+ end
71
+
72
+ context "Rubin" do
73
+ it "returns R150" do
74
+ expect(Dropmire::Soundex.build_code_for("Rubin")).to eql 'R150'
75
+ end
76
+ end
77
+
78
+ context "Ashcraft" do
79
+ it "returns A261" do
80
+ expect(Dropmire::Soundex.build_code_for("Ashcraft")).to eql 'A261'
81
+ end
82
+ end
83
+
84
+ context "Ashcroft" do
85
+ it "returns A261" do
86
+ expect(Dropmire::Soundex.build_code_for("Ashcroft")).to eql 'A261'
87
+ end
88
+ end
89
+
90
+ context "Tymczak" do
91
+ it "returns T522" do
92
+ expect(Dropmire::Soundex.build_code_for("Tymczak")).to eql 'T522'
93
+ end
94
+ end
95
+
96
+ context "Pfister" do
97
+ it "returns P236" do
98
+ expect(Dropmire::Soundex.build_code_for("Pfister")).to eql 'P236'
99
+ end
100
+ end
101
+ end
102
+
103
+ describe "#get code" do
104
+ context "when code is 1" do
105
+ it "B" do
106
+ expect(Dropmire::Soundex.get_code('B')).to eql '1'
107
+ end
108
+
109
+ it "F" do
110
+ expect(Dropmire::Soundex.get_code('F')).to eql '1'
111
+ end
112
+
113
+ it "P" do
114
+ expect(Dropmire::Soundex.get_code('P')).to eql '1'
115
+ end
116
+
117
+ it "V" do
118
+ expect(Dropmire::Soundex.get_code('V')).to eql '1'
119
+ end
120
+ end
121
+
122
+ context "when code is 2" do
123
+ it "C" do
124
+ expect(Dropmire::Soundex.get_code('C')).to eql '2'
125
+ end
126
+
127
+ it "G" do
128
+ expect(Dropmire::Soundex.get_code('G')).to eql '2'
129
+ end
130
+
131
+ it "J" do
132
+ expect(Dropmire::Soundex.get_code('J')).to eql '2'
133
+ end
134
+
135
+ it "K" do
136
+ expect(Dropmire::Soundex.get_code('K')).to eql '2'
137
+ end
138
+
139
+ it "Q" do
140
+ expect(Dropmire::Soundex.get_code('Q')).to eql '2'
141
+ end
142
+
143
+ it "S" do
144
+ expect(Dropmire::Soundex.get_code('S')).to eql '2'
145
+ end
146
+
147
+ it "X" do
148
+ expect(Dropmire::Soundex.get_code('X')).to eql '2'
149
+ end
150
+
151
+ it "Z" do
152
+ expect(Dropmire::Soundex.get_code('Z')).to eql '2'
153
+ end
154
+ end
155
+
156
+ context "when code is 3" do
157
+ it "D" do
158
+ expect(Dropmire::Soundex.get_code('D')).to eql '3'
159
+ end
160
+
161
+ it "T" do
162
+ expect(Dropmire::Soundex.get_code('T')).to eql '3'
163
+ end
164
+ end
165
+
166
+ context "when code is 4" do
167
+ it "L" do
168
+ expect(Dropmire::Soundex.get_code('L')).to eql '4'
169
+ end
170
+ end
171
+
172
+ context "when code is 5" do
173
+ it "M" do
174
+ expect(Dropmire::Soundex.get_code('M')).to eql '5'
175
+ end
176
+
177
+ it "N" do
178
+ expect(Dropmire::Soundex.get_code('N')).to eql '5'
179
+ end
180
+ end
181
+
182
+ context "when code is 6" do
183
+ it "R" do
184
+ expect(Dropmire::Soundex.get_code('R')).to eql '6'
185
+ end
186
+ end
187
+ end
188
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dropmire
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Connor Jacobsen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-22 00:00:00.000000000 Z
11
+ date: 2014-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -64,14 +64,24 @@ files:
64
64
  - LICENSE.txt
65
65
  - README.md
66
66
  - Rakefile
67
+ - config/first_initial.yml
68
+ - config/first_name.yml
69
+ - config/middle_initial.yml
67
70
  - dropmire.gemspec
68
71
  - lib/dropmire.rb
72
+ - lib/dropmire/ext/string.rb
73
+ - lib/dropmire/identity.rb
74
+ - lib/dropmire/name_encoder.rb
69
75
  - lib/dropmire/parser.rb
76
+ - lib/dropmire/soundex.rb
70
77
  - lib/dropmire/version.rb
71
78
  - spec/demo.txt
79
+ - spec/identity_spec.rb
80
+ - spec/name_encoder_spec.rb
72
81
  - spec/parser_spec.rb
82
+ - spec/soundex_spec.rb
73
83
  - spec/spec_helper.rb
74
- homepage: ''
84
+ homepage: https://github.com/connorjacobsen/dropmire
75
85
  licenses:
76
86
  - Apache-2.0
77
87
  metadata: {}
@@ -97,5 +107,8 @@ specification_version: 4
97
107
  summary: A simple way to collect data from US driver's licenses.
98
108
  test_files:
99
109
  - spec/demo.txt
110
+ - spec/identity_spec.rb
111
+ - spec/name_encoder_spec.rb
100
112
  - spec/parser_spec.rb
113
+ - spec/soundex_spec.rb
101
114
  - spec/spec_helper.rb