ofac 1.1.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ class String
2
+
3
+ Ofac_SoundexChars = 'BPFVCSKGJQXZDTLMNR'
4
+ Ofac_SoundexNums = '111122222222334556'
5
+ Ofac_SoundexCharsEx = '^' + Ofac_SoundexChars
6
+ Ofac_SoundexCharsDel = '^A-Z'
7
+
8
+ # desc: http://en.wikipedia.org/wiki/Soundex
9
+ def ofac_soundex(census = true)
10
+ str = upcase.delete(Ofac_SoundexCharsDel).squeeze
11
+
12
+ str[0 .. 0] + str[1 .. -1].
13
+ delete(Ofac_SoundexCharsEx).
14
+ tr(Ofac_SoundexChars, Ofac_SoundexNums)[0 .. (census ? 2 : -1)].
15
+ ljust(3, '0') rescue ''
16
+ end
17
+
18
+ def ofac_sounds_like(other, census = true)
19
+ ofac_soundex(census) == other.ofac_soundex(census)
20
+ end
21
+
22
+ end
@@ -0,0 +1,8 @@
1
+
2
+ namespace :ofac do
3
+ desc "Loads the current file from http://www.treas.gov/offices/enforcement/ofac/sdn/delimit/index.shtml."
4
+ task :update_data => :environment do
5
+ OfacSdnLoader.load_current_sdn_file
6
+ end
7
+
8
+ end
@@ -0,0 +1,104 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ofac}
8
+ s.version = "1.1.11"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Kevin Tyll"]
12
+ s.date = %q{2010-02-05}
13
+ s.description = %q{Attempts to find a hit on the Office of Foreign Assets Control's Specially Designated Nationals list.}
14
+ s.email = %q{kevintyll@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "History.txt",
23
+ "LICENSE",
24
+ "PostInstall.txt",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION.yml",
28
+ "generators/ofac_migration/.DS_Store",
29
+ "generators/ofac_migration/ofac_migration_generator.rb",
30
+ "generators/ofac_migration/templates/.DS_Store",
31
+ "generators/ofac_migration/templates/migration.rb",
32
+ "lib/ofac.rb",
33
+ "lib/ofac/models/ofac.rb",
34
+ "lib/ofac/models/ofac_sdn.rb",
35
+ "lib/ofac/models/ofac_sdn_loader.rb",
36
+ "lib/ofac/ofac_match.rb",
37
+ "lib/ofac/ruby_string_extensions.rb",
38
+ "lib/tasks/ofac.rake",
39
+ "nbproject/project.properties",
40
+ "nbproject/project.xml",
41
+ "ofac.gemspec",
42
+ "pkg/ofac-0.1.0.gem",
43
+ "pkg/ofac-1.0.0.gem",
44
+ "rdoc/classes/Ofac.html",
45
+ "rdoc/classes/OfacMatch.html",
46
+ "rdoc/classes/OfacSdn.html",
47
+ "rdoc/classes/OfacSdnLoader.html",
48
+ "rdoc/classes/String.html",
49
+ "rdoc/created.rid",
50
+ "rdoc/files/README_rdoc.html",
51
+ "rdoc/files/lib/ofac/models/ofac_rb.html",
52
+ "rdoc/files/lib/ofac/models/ofac_sdn_loader_rb.html",
53
+ "rdoc/files/lib/ofac/models/ofac_sdn_rb.html",
54
+ "rdoc/files/lib/ofac/ofac_match_rb.html",
55
+ "rdoc/files/lib/ofac/ruby_string_extensions_rb.html",
56
+ "rdoc/files/lib/ofac_rb.html",
57
+ "rdoc/fr_class_index.html",
58
+ "rdoc/fr_file_index.html",
59
+ "rdoc/fr_method_index.html",
60
+ "rdoc/index.html",
61
+ "rdoc/rdoc-style.css",
62
+ "test/files/test_address_data_load.pip",
63
+ "test/files/test_alt_data_load.pip",
64
+ "test/files/test_sdn_data_load.pip",
65
+ "test/files/valid_flattened_file.csv",
66
+ "test/mocks/test/ofac_sdn_loader.rb",
67
+ "test/ofac_sdn_loader_test.rb",
68
+ "test/ofac_test.rb",
69
+ "test/test_helper.rb"
70
+ ]
71
+ s.homepage = %q{http://github.com/kevintyll/ofac}
72
+ s.post_install_message = %q{For more information on ofac, see http://kevintyll.github.com/ofac/
73
+
74
+ * To create the necessary db migration, from the command line, run:
75
+ script/generate ofac_migration
76
+ * Require the gem in your environment.rb file in the Rails::Initializer block:
77
+ config.gem 'kevintyll-ofac', :lib => 'ofac'
78
+ * To load your table with the current OFAC data, from the command line, run:
79
+ rake ofac:update_data
80
+
81
+ * The OFAC data is not updated with any regularity, but you can sign up for email notifications when the data changes at
82
+ http://www.treas.gov/offices/enforcement/ofac/sdn/index.shtml.}
83
+ s.rdoc_options = ["--charset=UTF-8"]
84
+ s.require_paths = ["lib"]
85
+ s.rubygems_version = %q{1.3.5}
86
+ s.summary = %q{Attempts to find a hit on the Office of Foreign Assets Control's Specially Designated Nationals list.}
87
+ s.test_files = [
88
+ "test/mocks/test/ofac_sdn_loader.rb",
89
+ "test/ofac_sdn_loader_test.rb",
90
+ "test/ofac_test.rb",
91
+ "test/test_helper.rb"
92
+ ]
93
+
94
+ if s.respond_to? :specification_version then
95
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
96
+ s.specification_version = 3
97
+
98
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
99
+ else
100
+ end
101
+ else
102
+ end
103
+ end
104
+
@@ -0,0 +1,10 @@
1
+ 10|7|-0- |-0- |"Panama"|-0-
2
+ 15|12|-0- |-0- |"Panama"|-0-
3
+ 22|14|"123 Somewhere Ln"|"Clearwater"|"United States"|-0-
4
+ 39|27|-0- |"Managua"|"Nicaragua"|-0-
5
+ 39|29|"Bal Harbour Shopping Center, Via Italia"|"Panama City"|"Panama"|-0-
6
+ 41|41|"Avenida de Concha, Espina 8, E-28036"|"Madrid"|"Spain"|-0-
7
+ 41|102|-0- |-0- |-0- |-0-
8
+ 66|111|-0- |-0- |"Italy"|-0-
9
+ 66|117|-0- |-0- |"Panama"|-0-
10
+ 66|125|"1840 West 49th Street"|-0- |"United States"|-0-
@@ -0,0 +1,10 @@
1
+ 15|14|"aka"|"VIAJES GUAMA TOURS"|-0-
2
+ 22|15|"aka"|"HERNANDEZ, Oscar Grouch"|-0-
3
+ 22|16|"aka"|"Alternate Name"|-0-
4
+ 25|57|"aka"|"AVIA IMPORT"|-0-
5
+ 36|219|"aka"|"BNC"|-0-
6
+ 36|220|"aka"|"NATIONAL BANK OF CUBA"|-0-
7
+ 36|221|"aka"|"BNC"|-0-
8
+ 41|222|"aka"|"NATIONAL BANK OF CUBA"|-0-
9
+ 66|223|"aka"|"BNC"|-0-
10
+ 66|224|"aka"|"NATIONAL BANK OF CUBA"|-0-
@@ -0,0 +1,9 @@
1
+ 10|"ABASTECEDORA NAVAL Y INDUSTRIAL, S.A."|-0- |"CUBA"|-0- |-0- |-0- |-0- |-0- |-0- |-0- |-0-
2
+ 15|"ABDELNUR| Nury de Jesus"|"individual"|"CUBA"|-0- |-0- |-0- |-0- |-0- |-0- |-0- |-0-
3
+ 22|"HERNANDEZ, Oscar"|"individual"|"CUBA"|-0- |-0- |"Unknown vessel type"|-0- |-0- |-0- |"Acechilly Navigation Co., Malta"|-0-
4
+ 24|"LOPEZ MENDEZ, Luis Eduardo"|"individual"|"CUBA"|-0- |-0- |"Unknown vessel type"|-0- |-0- |-0- |"Acefrosty Shipping Co., Malta"|-0-
5
+ 25|"ACEFROSTY SHIPPING CO., LTD."|-0- |"CUBA"|-0- |-0- |-0- |-0- |-0- |-0- |-0- |-0-
6
+ 36|"AEROCARIBBEAN AIRLINES"|-0- |"CUBA"|-0- |-0- |-0- |-0- |-0- |-0- |-0- |-0-
7
+ 39|"AEROTAXI EJECUTIVO, S.A."|-0- |"CUBA"|-0- |-0- |-0- |-0- |-0- |-0- |-0- |-0-
8
+ 41|"AGENCIA DE VIAJES GUAMA"|-0- |"CUBA"|-0- |-0- |-0- |-0- |-0- |-0- |-0- |-0-
9
+ 66|"AGUIAR, Raul"|"individual"|"CUBA"|"Director, Banco Nacional de Cuba"|-0- |-0- |-0- |-0- |-0- |-0- |"; Director, Banco Nacional de Cuba."
@@ -0,0 +1,19 @@
1
+ ``|`ABASTECEDORA NAVAL Y INDUSTRIAL, S.A.`|``|`CUBA`|``|``|``|``|``|``|``|``|``|``|`Panama`|``|``|``|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
2
+ ``|`ABDELNUR`|` Nury de Jesus`|`individual`|`CUBA`|``|``|``|``|``|``|``|``|``|`Panama`|``|`aka`|`VIAJES GUAMA TOURS`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
3
+ ``|`HERNANDEZ, Oscar`|`individual`|`CUBA`|``|``|`Unknown vessel type`|``|``|``|`Acechilly Navigation Co., Malta`|``|`123 Somewhere Ln`|`Clearwater`|`United States`|``|`aka`|`HERNANDEZ, Oscar Grouch`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
4
+ ``|`HERNANDEZ, Oscar`|`individual`|`CUBA`|``|``|`Unknown vessel type`|``|``|``|`Acechilly Navigation Co., Malta`|``|`123 Somewhere Ln`|`Clearwater`|`United States`|``|`aka`|`Alternate Name`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
5
+ ``|`LOPEZ MENDEZ, Luis Eduardo`|`individual`|`CUBA`|``|``|`Unknown vessel type`|``|``|``|`Acefrosty Shipping Co., Malta`|``|``|``|``|``|``|``|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
6
+ ``|`ACEFROSTY SHIPPING CO., LTD.`|``|`CUBA`|``|``|``|``|``|``|``|``|``|``|``|``|`aka`|`AVIA IMPORT`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
7
+ ``|`AEROCARIBBEAN AIRLINES`|``|`CUBA`|``|``|``|``|``|``|``|``|``|``|``|``|`aka`|`BNC`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
8
+ ``|`AEROCARIBBEAN AIRLINES`|``|`CUBA`|``|``|``|``|``|``|``|``|``|``|``|``|`aka`|`NATIONAL BANK OF CUBA`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
9
+ ``|`AEROCARIBBEAN AIRLINES`|``|`CUBA`|``|``|``|``|``|``|``|``|``|``|``|``|`aka`|`BNC`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
10
+ ``|`AEROTAXI EJECUTIVO, S.A.`|``|`CUBA`|``|``|``|``|``|``|``|``|``|`Managua`|`Nicaragua`|``|``|``|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
11
+ ``|`AEROTAXI EJECUTIVO, S.A.`|``|`CUBA`|``|``|``|``|``|``|``|``|`Bal Harbour Shopping Center, Via Italia`|`Panama City`|`Panama`|``|``|``|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
12
+ ``|`AGENCIA DE VIAJES GUAMA`|``|`CUBA`|``|``|``|``|``|``|``|``|`Avenida de Concha, Espina 8, E-28036`|`Madrid`|`Spain`|``|`aka`|`NATIONAL BANK OF CUBA`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
13
+ ``|`AGENCIA DE VIAJES GUAMA`|``|`CUBA`|``|``|``|``|``|``|``|``|``|``|``|``|`aka`|`NATIONAL BANK OF CUBA`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
14
+ ``|`AGUIAR, Raul`|`individual`|`CUBA`|`Director, Banco Nacional de Cuba`|``|``|``|``|``|``|`; Director, Banco Nacional de Cuba.`|``|``|`Italy`|``|`aka`|`BNC`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
15
+ ``|`AGUIAR, Raul`|`individual`|`CUBA`|`Director, Banco Nacional de Cuba`|``|``|``|``|``|``|`; Director, Banco Nacional de Cuba.`|``|``|`Italy`|``|`aka`|`NATIONAL BANK OF CUBA`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
16
+ ``|`AGUIAR, Raul`|`individual`|`CUBA`|`Director, Banco Nacional de Cuba`|``|``|``|``|``|``|`; Director, Banco Nacional de Cuba.`|``|``|`Panama`|``|`aka`|`BNC`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
17
+ ``|`AGUIAR, Raul`|`individual`|`CUBA`|`Director, Banco Nacional de Cuba`|``|``|``|``|``|``|`; Director, Banco Nacional de Cuba.`|``|``|`Panama`|``|`aka`|`NATIONAL BANK OF CUBA`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
18
+ ``|`AGUIAR, Raul`|`individual`|`CUBA`|`Director, Banco Nacional de Cuba`|``|``|``|``|``|``|`; Director, Banco Nacional de Cuba.`|`1840 West 49th Street`|``|`United States`|``|`aka`|`BNC`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
19
+ ``|`AGUIAR, Raul`|`individual`|`CUBA`|`Director, Banco Nacional de Cuba`|``|``|``|``|``|``|`; Director, Banco Nacional de Cuba.`|`1840 West 49th Street`|``|`United States`|``|`aka`|`NATIONAL BANK OF CUBA`|``|`2009-05-06 15:55:24`|`2009-05-06 15:55:24`
@@ -0,0 +1,20 @@
1
+ require 'ofac/models/ofac_sdn_loader'
2
+
3
+ class OfacSdnLoader
4
+
5
+ def self.load_current_sdn_file
6
+ sdn = File.new(File.dirname(__FILE__) + '/../../files/test_sdn_data_load.pip')
7
+ address = File.new(File.dirname(__FILE__) + '/../../files/test_address_data_load.pip')
8
+ alt = File.new(File.dirname(__FILE__) + '/../../files/test_alt_data_load.pip')
9
+ active_record_file_load(sdn, address, alt)
10
+ sdn.close
11
+ address.close
12
+ alt.close
13
+ end
14
+
15
+ #Gives access to the private convert_to_flattened_csv method
16
+ def self.create_csv_file(sdn, address, alt)
17
+ convert_to_flattened_csv(sdn, address, alt)
18
+ end
19
+
20
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class OfacSdnLoaderTest < Test::Unit::TestCase
4
+
5
+ context '' do
6
+ setup do setup_ofac_sdn_table end
7
+
8
+ should "load table from files multiple times and always have the same record count" do
9
+ assert_equal(0,OfacSdn.count)
10
+ OfacSdnLoader.load_current_sdn_file #this method is mocked to load test files instead of the live files from the web.
11
+ assert_equal(19, OfacSdn.count)
12
+ OfacSdnLoader.load_current_sdn_file
13
+ assert_equal(19, OfacSdn.count)
14
+ end
15
+
16
+ should "create flattened_csv_file_for_mysql_import" do
17
+ #since, I'm using sqlight3 for it's in memory db, I can't test the mysql load
18
+ #but I can test the csv file creation.
19
+ sdn = File.new(File.dirname(__FILE__) + '/files/test_sdn_data_load.pip')
20
+ address = File.new(File.dirname(__FILE__) + '/files/test_address_data_load.pip')
21
+ alt = File.new(File.dirname(__FILE__) + '/files/test_alt_data_load.pip')
22
+
23
+ csv = OfacSdnLoader.create_csv_file(sdn, address, alt) #this method was created in the mock only to call the private convert_to_flattened_csv method
24
+ correctly_formatted_csv = File.open(File.dirname(__FILE__) + '/files/valid_flattened_file.csv')
25
+
26
+ csv.rewind
27
+ generated_file = csv.readlines
28
+ #compare the values of each csv line, with the correctly formated "control file"
29
+ correctly_formatted_csv.each_with_index do |line,i|
30
+ csv_line = generated_file[i]
31
+ correctly_formatted_record_array = line.split('|')
32
+ csv_record_array = csv_line.split('|')
33
+ (0..18).each do |i| #skip indices 19 and 20, they are the created_at and updated_at fields, they will never match.
34
+ assert_equal correctly_formatted_record_array[i], csv_record_array[i]
35
+ end
36
+ end
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,138 @@
1
+ require 'test_helper'
2
+
3
+ class OfacTest < Test::Unit::TestCase
4
+
5
+ context '' do
6
+ setup do
7
+ setup_ofac_sdn_table
8
+ OfacSdnLoader.load_current_sdn_file #this method is mocked to load test files instead of the live files from the web.
9
+ end
10
+
11
+ should "give a score of 0 if no name is given" do
12
+ assert_equal 0, Ofac.new({:address => '123 somewhere'}).score
13
+ assert_equal 0, Ofac.new({:name => ''}).score
14
+ assert_equal 0, Ofac.new({:name => ' '}).score
15
+ assert_equal 0, Ofac.new({:name => nil}).score
16
+ assert_equal 0, Ofac.new({:name => {:first_name => '',:last_name => ' '}}).score
17
+ assert_equal 0, Ofac.new({:name => {:first_name => '',:last_name => ' '}}).score
18
+ assert_equal 0, Ofac.new({:name => 'P T'}).score
19
+ end
20
+
21
+ should "give a score of 0 if there is no name match" do
22
+ assert_equal 0, Ofac.new({:name => 'Kevin T P'}).score
23
+ assert_equal 0, Ofac.new({:name => "O'Brian"}).score
24
+ assert_equal 0, Ofac.new({:name => {:first_name => 'Matthew',:last_name => "O'Brian"}}).score
25
+ assert_equal 0, Ofac.new({:name => 'Kevin', :address => '123 somewhere ln', :city => 'Clearwater'}).score
26
+ end
27
+
28
+ should "give a score of 60 if there is a name match and deduct scores for non matches on address and city" do
29
+ assert_equal 60, Ofac.new({:name => 'Oscar Hernandez'}).score
30
+ assert_equal 60, Ofac.new({:name => {:first_name => 'Oscar', :last_name => 'Hernandez'}}).score
31
+ end
32
+
33
+ should "give a score of 30 if there is only a partial match" do
34
+ assert_equal 30, Ofac.new({:name => 'Oscar de la Hernandez'}).score
35
+ assert_equal 30, Ofac.new({:name => {:first_name => 'Oscar', :last_name => 'de la Hernandez'}}).score
36
+ end
37
+
38
+ should "handle first or last name not given" do
39
+ assert_equal 60, Ofac.new({:name => {:first_name => 'Oscar', :last_name => ''}}).score
40
+ assert_equal 60, Ofac.new({:name => {:first_name => 'Oscar', :last_name => nil}}).score
41
+ assert_equal 60, Ofac.new({:name => {:first_name => nil, :last_name => 'Oscar'}}).score
42
+ assert_equal 60, Ofac.new({:name => {:first_name => 'Oscar'}}).score
43
+ assert_equal 60, Ofac.new({:name => {:first_name => '', :last_name => 'Oscar'}}).score
44
+ assert_equal 60, Ofac.new({:name => {:last_name => 'Oscar'}}).score
45
+ end
46
+
47
+ should "deduct scores for non matches on address if data is in the database" do
48
+ #if there is data for address or city in the database, and that info is passed in, then 10%
49
+ #of the weight will be deducted if there is no match or sounds like match
50
+
51
+ #name and city match
52
+ assert_equal 89, Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater', :address => 'no match'}).score
53
+ #the record is pulled because clear is like clearwater, but it's not a match
54
+ #score = 60 for name - (30 * .1) for Clear = 57
55
+ assert_equal 57, Ofac.new({:name => 'Oscar Hernandez', :city => 'Clear'}).score
56
+ end
57
+
58
+ should "not deduct from score if no data for city or address is in the database" do
59
+ assert_equal 60, Ofac.new({:name => 'Luis Lopez', :city => 'no match', :address => 'no match'}).score
60
+ end
61
+
62
+ should "give a score of 60 if there is a name match on alternate identity name" do
63
+ assert_equal 60, Ofac.new({:name => 'Alternate Name'}).score
64
+ end
65
+
66
+ should "give a partial score if there is a partial name match" do
67
+ assert_equal 40, Ofac.new({:name => 'Oscar middlename Hernandez'}).score
68
+ assert_equal 30, Ofac.new({:name => 'Oscar WrongLastName'}).score
69
+ assert_equal 70, Ofac.new({:name => 'Oscar middlename Hernandez',:city => 'Clearwater'}).score
70
+ end
71
+
72
+ should "give a score of 90 if there is a name and city match" do
73
+ assert_equal 90, Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater'}).score
74
+ end
75
+
76
+ should "give a score of 100 if there is a name and city and address match" do
77
+ assert_equal 100, Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater', :address => '123 somewhere ln'}).score
78
+ end
79
+
80
+ should "give partial scores for sounds like matches" do
81
+
82
+ #32456 summer lane sounds like 32456 Somewhere ln so is adds 75% of the address weight to the score, or 8.
83
+ assert_equal 98, Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater', :address => '32456 summer lane'}).score
84
+
85
+ #Louis Eduardo Lopez Mendez sounds like Luis Eduardo Lopez Mendez:
86
+ #:name has a weight of 60, so a sounds like is worth 45
87
+ assert_equal 45, Ofac.new({:name => {:first_name => 'Louis Eduardo', :last_name => 'Lopez Mendez'}, :city => 'Las Vegas', :address => 'no match'}).score
88
+ end
89
+
90
+ should 'not give partial scores if sounds like does not match the entire string' do
91
+ #summer sounds like somewhere, and all numbers sound alike, so 2 of the 3 address elements match by sound
92
+ #but the whole thing does not make a sounds like match so only city matches, subtract 1 for no address match
93
+ assert_equal 89, Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater', :address => '12358 summer blvd'}).score
94
+ end
95
+
96
+ should "return an array of possible hits" do
97
+ #it should not matter which order you call score or possible hits.
98
+ sdn = Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater', :address => '123 somewhere ln'})
99
+ assert sdn.score > 0
100
+ assert !sdn.possible_hits.empty?
101
+
102
+ sdn = Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater', :address => '123 somewhere ln'})
103
+ assert !sdn.possible_hits.empty?
104
+ assert sdn.score > 0
105
+ end
106
+
107
+ should "db_hit? should return true if name is an exact match in the database" do
108
+
109
+ sdn = Ofac.new({:name => {:first_name => 'Oscar', :last_name => 'Hernandez'}, :city => 'Clearwater', :address => '123 somewhere ln'})
110
+ assert sdn.db_hit?
111
+
112
+ sdn = Ofac.new({:name => 'Oscar Hernandez', :city => 'Clearwater', :address => '123 somewhere ln'})
113
+ assert sdn.db_hit?
114
+
115
+ #single initials are ignored
116
+ sdn = Ofac.new({:name => 'Oscar M Hernandez', :city => 'Clearwater', :address => '123 somewhere ln'})
117
+ assert sdn.db_hit?
118
+
119
+ #city and address are ignored
120
+ sdn = Ofac.new({:name => 'Oscar Hernandez', :city => 'bad city', :address => 'bad address'})
121
+ assert sdn.db_hit?
122
+ end
123
+
124
+ should "db_hit? should return false if name is not an exact match in the database" do
125
+
126
+ sdn = Ofac.new({:name => {:first_name => 'Oscar', :last_name => 'de la Hernandez'}, :city => 'Clearwater', :address => '123 somewhere ln'})
127
+ assert !sdn.db_hit?
128
+
129
+ sdn = Ofac.new({:name => 'Oscar Maria Hernandez', :city => 'Clearwater', :address => '123 somewhere ln'})
130
+ assert !sdn.db_hit?
131
+
132
+ #city and address are ignored
133
+ sdn = Ofac.new({:name => 'Oscar de la Hernandez', :city => 'bad city', :address => 'bad address'})
134
+ assert !sdn.db_hit?
135
+ end
136
+
137
+ end
138
+ end
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'mocks/test/ofac_sdn_loader'
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+ require 'ofac'
9
+
10
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
11
+
12
+ class Test::Unit::TestCase
13
+ def setup_ofac_sdn_table
14
+ ActiveRecord::Base.connection.tables.each { |table| ActiveRecord::Base.connection.drop_table(table) }
15
+ create_ofac_sdn_table
16
+ end
17
+
18
+ private
19
+
20
+ def create_ofac_sdn_table
21
+ silence_stream(STDOUT) do
22
+ ActiveRecord::Schema.define(:version => 1) do
23
+ create_table :ofac_sdns do |t|
24
+ t.text :name
25
+ t.string :sdn_type
26
+ t.string :program
27
+ t.string :title
28
+ t.string :vessel_call_sign
29
+ t.string :vessel_type
30
+ t.string :vessel_tonnage
31
+ t.string :gross_registered_tonnage
32
+ t.string :vessel_flag
33
+ t.string :vessel_owner
34
+ t.text :remarks
35
+ t.text :address
36
+ t.string :city
37
+ t.string :country
38
+ t.string :address_remarks
39
+ t.string :alternate_identity_type
40
+ t.text :alternate_identity_name
41
+ t.string :alternate_identity_remarks
42
+ t.timestamps
43
+ end
44
+ add_index :ofac_sdns, :sdn_type
45
+ end
46
+ end
47
+ end
48
+
49
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ofac
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.11
5
+ platform: ruby
6
+ authors:
7
+ - Kevin Tyll
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-05 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Attempts to find a hit on the Office of Foreign Assets Control's Specially Designated Nationals list.
17
+ email: kevintyll@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - LICENSE
24
+ - README.rdoc
25
+ files:
26
+ - .document
27
+ - .gitignore
28
+ - History.txt
29
+ - LICENSE
30
+ - PostInstall.txt
31
+ - README.rdoc
32
+ - Rakefile
33
+ - VERSION.yml
34
+ - generators/ofac_migration/.DS_Store
35
+ - generators/ofac_migration/ofac_migration_generator.rb
36
+ - generators/ofac_migration/templates/.DS_Store
37
+ - generators/ofac_migration/templates/migration.rb
38
+ - lib/ofac.rb
39
+ - lib/ofac/models/ofac.rb
40
+ - lib/ofac/models/ofac_sdn.rb
41
+ - lib/ofac/models/ofac_sdn_loader.rb
42
+ - lib/ofac/ofac_match.rb
43
+ - lib/ofac/ruby_string_extensions.rb
44
+ - lib/tasks/ofac.rake
45
+ - nbproject/project.properties
46
+ - nbproject/project.xml
47
+ - ofac.gemspec
48
+ - pkg/ofac-0.1.0.gem
49
+ - pkg/ofac-1.0.0.gem
50
+ - rdoc/classes/Ofac.html
51
+ - rdoc/classes/OfacMatch.html
52
+ - rdoc/classes/OfacSdn.html
53
+ - rdoc/classes/OfacSdnLoader.html
54
+ - rdoc/classes/String.html
55
+ - rdoc/created.rid
56
+ - rdoc/files/README_rdoc.html
57
+ - rdoc/files/lib/ofac/models/ofac_rb.html
58
+ - rdoc/files/lib/ofac/models/ofac_sdn_loader_rb.html
59
+ - rdoc/files/lib/ofac/models/ofac_sdn_rb.html
60
+ - rdoc/files/lib/ofac/ofac_match_rb.html
61
+ - rdoc/files/lib/ofac/ruby_string_extensions_rb.html
62
+ - rdoc/files/lib/ofac_rb.html
63
+ - rdoc/fr_class_index.html
64
+ - rdoc/fr_file_index.html
65
+ - rdoc/fr_method_index.html
66
+ - rdoc/index.html
67
+ - rdoc/rdoc-style.css
68
+ - test/files/test_address_data_load.pip
69
+ - test/files/test_alt_data_load.pip
70
+ - test/files/test_sdn_data_load.pip
71
+ - test/files/valid_flattened_file.csv
72
+ - test/mocks/test/ofac_sdn_loader.rb
73
+ - test/ofac_sdn_loader_test.rb
74
+ - test/ofac_test.rb
75
+ - test/test_helper.rb
76
+ has_rdoc: true
77
+ homepage: http://github.com/kevintyll/ofac
78
+ licenses: []
79
+
80
+ post_install_message: |-
81
+ For more information on ofac, see http://kevintyll.github.com/ofac/
82
+
83
+ * To create the necessary db migration, from the command line, run:
84
+ script/generate ofac_migration
85
+ * Require the gem in your environment.rb file in the Rails::Initializer block:
86
+ config.gem 'kevintyll-ofac', :lib => 'ofac'
87
+ * To load your table with the current OFAC data, from the command line, run:
88
+ rake ofac:update_data
89
+
90
+ * The OFAC data is not updated with any regularity, but you can sign up for email notifications when the data changes at
91
+ http://www.treas.gov/offices/enforcement/ofac/sdn/index.shtml.
92
+ rdoc_options:
93
+ - --charset=UTF-8
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ version:
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: "0"
107
+ version:
108
+ requirements: []
109
+
110
+ rubyforge_project:
111
+ rubygems_version: 1.3.5
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: Attempts to find a hit on the Office of Foreign Assets Control's Specially Designated Nationals list.
115
+ test_files:
116
+ - test/mocks/test/ofac_sdn_loader.rb
117
+ - test/ofac_sdn_loader_test.rb
118
+ - test/ofac_test.rb
119
+ - test/test_helper.rb