gman 3.1.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/gman.rb CHANGED
@@ -46,6 +46,28 @@ class Gman
46
46
  $
47
47
  }xi
48
48
 
49
+ # Second level .us domains for states and locality
50
+ # See http://en.wikipedia.org/wiki/.us
51
+ #
52
+ # Examples:
53
+ # * foo.state.il.us
54
+ # * ci.foo.il.us
55
+ #
56
+ # Not:
57
+ # * state.foo.il.us
58
+ # * foo.ci.il.us
59
+ # * k12.il.us
60
+ # * ci.foo.zx.us
61
+ LOCALITY_REGEX = %r{
62
+ (
63
+ (state|dst|cog)
64
+ |
65
+ (ci|town|vil|co)\.[a-z-]+
66
+ )
67
+ \.(ak|al|ar|az|ca|co|ct|dc|de|fl|ga|hi|ia|id|il|in|ks|ky|la|ma|md|me|mi|mn|mo|ms|mt|nc|nd|ne|nh|nj|nm|nv|ny|oh|ok|or|pa|ri|sc|sd|tn|tx|um|ut|va|vt|wa|wi|wv|wy)
68
+ \.us
69
+ }x
70
+
49
71
  # Map last part of TLD to alpha2 country code
50
72
  ALPHA2_MAP = {
51
73
  :ac => 'sh',
@@ -145,6 +167,9 @@ class Gman
145
167
  # Ensure non-edu
146
168
  return false if Swot::is_academic?(domain)
147
169
 
170
+ # Check for locality by regex
171
+ return true if locality?
172
+
148
173
  # check using public suffix's standard logic
149
174
  rule = Gman.list.find domain
150
175
  return true if !rule.nil? && rule.allow?(domain)
@@ -160,6 +185,11 @@ class Gman
160
185
  !!(@text =~ EMAIL_REGEX)
161
186
  end
162
187
 
188
+ # Is this domain a .us state or locality?
189
+ def locality?
190
+ !!(domain =~ LOCALITY_REGEX)
191
+ end
192
+
163
193
  # Helper function to return the public suffix domain object
164
194
  #
165
195
  # Supports all domain strings (URLs, emails)
@@ -196,4 +226,5 @@ class Gman
196
226
  def inspect
197
227
  "#<Gman domain=\"#{domain}\" valid=#{valid?}>"
198
228
  end
229
+
199
230
  end
data/lib/gman/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Gman
2
- VERSION = '3.1.1'
2
+ VERSION = '4.0.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gman
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Balter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-18 00:00:00.000000000 Z
11
+ date: 2014-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: public_suffix
@@ -130,21 +130,14 @@ executables:
130
130
  extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
- - ".gitignore"
134
133
  - CONTRIBUTING.md
135
134
  - Gemfile
136
135
  - LICENSE
137
136
  - README.md
138
- - Rakefile
139
137
  - bin/gman_filter
140
- - gman.gemspec
141
138
  - lib/domains.txt
142
139
  - lib/gman.rb
143
140
  - lib/gman/version.rb
144
- - script/build
145
- - script/release
146
- - test/helper.rb
147
- - test/test_gman.rb
148
141
  homepage: https://github.com/benbalter/gman
149
142
  licenses:
150
143
  - MIT
data/.gitignore DELETED
@@ -1,4 +0,0 @@
1
- *.gem
2
- .bundle
3
- tmp
4
- Gemfile.lock
data/Rakefile DELETED
@@ -1,29 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'rake'
11
-
12
- require 'rake/testtask'
13
- Rake::TestTask.new(:test) do |test|
14
- test.libs << 'lib' << 'test'
15
- test.pattern = 'test/**/test_gman*.rb'
16
- test.verbose = true
17
- end
18
-
19
- desc "Open console with gman loaded"
20
- task :console do
21
- exec "irb -r ./lib/gman.rb"
22
- end
23
-
24
- desc "Validate the domain list"
25
- Rake::TestTask.new(:domains) do |test|
26
- test.libs << 'lib' << 'test'
27
- test.pattern = 'test/**/test_domains*.rb'
28
- test.verbose = true
29
- end
data/gman.gemspec DELETED
@@ -1,43 +0,0 @@
1
- require File.expand_path("lib/gman/version", File.dirname(__FILE__))
2
-
3
- Gem::Specification.new do |s|
4
- s.name = "gman"
5
- s.summary = "Check if a given domain or email address belong to a governemnt entity"
6
- s.description = "A ruby gem to check if the owner of a given email address is working for THE MAN."
7
- s.version = Gman::VERSION
8
- s.authors = ["Ben Balter"]
9
- s.email = "ben.balter@github.com"
10
- s.homepage = "https://github.com/benbalter/gman"
11
- s.licenses = ["MIT"]
12
-
13
- s.files = [
14
- "Gemfile",
15
- "README.md",
16
- "CONTRIBUTING.md",
17
- "LICENSE",
18
- "lib/gman.rb",
19
- "lib/domains.txt",
20
- "lib/gman/version.rb",
21
- "script/build",
22
- "script/release",
23
- "bin/gman_filter",
24
- "gman.gemspec",
25
- "test/helper.rb",
26
- "test/test_gman.rb",
27
- "Rakefile",
28
- ".gitignore"
29
- ]
30
-
31
- s.executables << "gman_filter"
32
-
33
- s.require_paths = ["lib"]
34
- s.add_dependency( "public_suffix", '~> 1.4')
35
- s.add_dependency( "swot", '~> 0.3.1' )
36
- s.add_dependency( "addressable", '~> 2.3' )
37
- s.add_dependency( "iso_country_codes", "~> 0.4" )
38
-
39
- s.add_development_dependency( "rake" )
40
- s.add_development_dependency( "shoulda" )
41
- s.add_development_dependency( "rdoc" )
42
- s.add_development_dependency( "bundler" )
43
- end
data/script/build DELETED
@@ -1,27 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Propagates an initial list of best-guess government domains
3
-
4
- require "public_suffix"
5
- require "yaml"
6
-
7
- # https://gist.github.com/benbalter/6147066
8
- REGEX = /(\.g[ou]{1,2}(v|b|vt)|\.mil|\.gc|\.fed)(\.[a-z]{2})?$/i
9
-
10
- YAML_FILE = File.dirname(__FILE__) + "/../lib/domains.yml"
11
- domains = YAML.load_file YAML_FILE
12
- domains = [] unless domains
13
-
14
- PublicSuffix::List.default.each do |rule|
15
- domain = nil
16
-
17
- if rule.parts.length == 1
18
- domain = rule.parts.first if ".#{rule.value}" =~ REGEX
19
- else
20
- domain = rule.parts.pop(2).join(".") if ".#{rule.value}" =~ REGEX
21
- end
22
-
23
- domains.push domain unless domain.nil? or domains.include? domain
24
- end
25
-
26
- domains = domains.sort
27
- File.open(YAML_FILE, 'w+') {|f| f.write(domains.to_yaml)}
data/script/release DELETED
@@ -1,38 +0,0 @@
1
- #!/bin/sh
2
- # Tag and push a release.
3
-
4
- set -e
5
-
6
- # Make sure we're in the project root.
7
-
8
- cd $(dirname "$0")/..
9
-
10
- # Build a new gem archive.
11
-
12
- rm -rf gman-*.gem
13
- gem build -q gman.gemspec
14
-
15
- # Make sure we're on the master branch.
16
-
17
- (git branch | grep -q '* master') || {
18
- echo "Only release from the master branch."
19
- exit 1
20
- }
21
-
22
- # Figure out what version we're releasing.
23
-
24
- tag=v`ls gman-*.gem | sed 's/^gman-\(.*\)\.gem$/\1/'`
25
-
26
- # Make sure we haven't released this version before.
27
-
28
- git fetch -t origin
29
-
30
- (git tag -l | grep -q "$tag") && {
31
- echo "Whoops, there's already a '${tag}' tag."
32
- exit 1
33
- }
34
-
35
- # Tag it and bag it.
36
-
37
- gem push gman-*.gem && git tag "$tag" &&
38
- git push origin master && git push origin "$tag"
data/test/helper.rb DELETED
@@ -1,21 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- require 'minitest/autorun'
4
-
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
-
13
- require 'shoulda'
14
-
15
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
16
- $LOAD_PATH.unshift(File.dirname(__FILE__))
17
- require 'gman'
18
- require 'net/dns'
19
- require 'net/dns/resolver'
20
- require './lib/gman/parser'
21
-
data/test/test_gman.rb DELETED
@@ -1,94 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'helper')
2
-
3
- VALID = [ "foo.gov",
4
- "http://foo.mil",
5
- "foo@bar.gc.ca",
6
- "foo.gov.au",
7
- "https://www.foo.gouv.fr",
8
- "foo@ci.champaign.il.us",
9
- "foo.bar.baz.gov.au",
10
- "foo@bar.gov.uk",
11
- ".gov",
12
- "foo.fed.us",
13
- ]
14
-
15
- INVALID = [ "foo.bar.com",
16
- "bar@foo.biz",
17
- "http://www.foo.biz",
18
- "foo.uk",
19
- "gov",
20
- "foo@k12.champaign.il.us",
21
- "foo@kii.gov.by",
22
- "foo",
23
- "",
24
- nil,
25
- " ",
26
- ]
27
-
28
- class TestGman < Minitest::Test
29
-
30
- should "recognize government email addresses and domains" do
31
- VALID.each do |test|
32
- assert_equal true, Gman::valid?(test), "#{test} should be detected as a valid government domain"
33
- end
34
- end
35
-
36
- should "not recognize non-government email addresses and domains" do
37
- INVALID.each do |test|
38
- assert_equal false, Gman::valid?(test), "#{test} should be detected as an invalid government domain"
39
- end
40
- end
41
-
42
- should "not allow educational domains" do
43
- assert_equal false, Gman::valid?("foo@gwu.edu")
44
- end
45
-
46
- should "properly parse domains from strings" do
47
- assert_equal "github.gov", Gman.new("foo@github.gov").domain
48
- assert_equal "foo.github.gov", Gman::new("foo.github.gov").domain
49
- assert_equal "github.gov", Gman::new("http://github.gov").domain
50
- assert_equal "github.gov", Gman::new("https://github.gov").domain
51
- assert_equal ".gov", Gman::new(".gov").domain
52
- assert_equal nil, Gman.new("foo").domain
53
- end
54
-
55
- should "not err out on invalid domains" do
56
- assert_equal false, Gman.valid?("foo@gov.invalid")
57
- assert_equal "gov.invalid", Gman.new("foo@gov.invalid").domain
58
- assert_equal nil, Gman.new("foo@gov.invalid").domain_parts
59
- end
60
-
61
- should "return public suffix domain" do
62
- assert_equal PublicSuffix::Domain, Gman.new("whitehouse.gov").domain_parts.class
63
- assert_equal NilClass, Gman.new("foo.invalid").domain_parts.class
64
- end
65
-
66
- should "parse domain parts" do
67
- assert_equal "gov", Gman.new("foo@bar.gov").domain_parts.tld
68
- assert_equal "bar", Gman.new("foo.bar.gov").domain_parts.sld
69
- assert_equal "bar", Gman.new("https://foo.bar.gov").domain_parts.sld
70
- assert_equal "bar.gov", Gman.new("foo@bar.gov").domain_parts.domain
71
- end
72
-
73
- should "not err out on invalid hosts" do
74
- assert_equal nil, Gman.new("</@foo.com").domain
75
- end
76
-
77
- should "returns the path to domains.txt" do
78
- assert_equal true, File.exists?(Gman.list_path)
79
- end
80
-
81
- should "parse the alpha2" do
82
- assert_equal "us", Gman.new("whitehouse.gov").alpha2
83
- assert_equal "us", Gman.new("army.mil").alpha2
84
- assert_equal "gb", Gman.new("foo.gov.uk").alpha2
85
- assert_equal "ca", Gman.new("gov.ca").alpha2
86
- end
87
-
88
- should "determine a domain's country" do
89
- assert_equal "United States", Gman.new("whitehouse.gov").country.name
90
- assert_equal "United States", Gman.new("army.mil").country.name
91
- assert_equal "United Kingdom", Gman.new("foo.gov.uk").country.name
92
- assert_equal "Canada", Gman.new("foo.gc.ca").country.name
93
- end
94
- end