mit_stalker 1.0.4 → 1.0.5
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 +15 -0
- data/.project +23 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +65 -0
- data/LICENSE.txt +20 -0
- data/Rakefile +32 -22
- data/VERSION +1 -0
- data/lib/mit_stalker.rb +40 -33
- data/mit_stalker.gemspec +52 -18
- data/test/fixtures/mixed_response.txt +31 -0
- data/test/fixtures/single_response2.txt +19 -0
- data/test/helper.rb +18 -0
- data/test/mit_stalker_test.rb +42 -34
- metadata +95 -38
- data/CHANGELOG +0 -9
- data/LICENSE +0 -21
- data/Manifest +0 -10
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OThiMGJhYTQ0ZmQ2ZWQzZWFjZGRiZGQxMzNhNzgxZGIzZGIyOWU3Mg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDBlNzJiMTliMWYwODc5MTljODgwMDgxOGQwNzQ0ZDUzZTdiYWU1MA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Y2Q0M2ZlMDNiYWY0YzJkMGU0NWU3NzlhNmE2ODYxODc5MzM0N2FhNzA1ZTJk
|
10
|
+
NDAxOWJjZmVlMmJiNDZhYWQyMTg3ZmE5MGUzOGZjNWQ2MmUwZjFkMzM1ZTBm
|
11
|
+
ODc3NGJmZDM4YjFhYTU3YjU0OWMzNGY5OTRlMjBhNjgxNjJkYjA=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YTI3ZmFmNzc4MDQxYmM2NDllYjI4ZGVkZjkzN2JhOWRkNWJhMWRjNDIxMzk3
|
14
|
+
ZjM0MTAzZTY4NmNhNTc1ZGRkZjNhYTNlNjJhNmVhOTExOWQ4ZThkNzgyZGM1
|
15
|
+
MDcwZjk0MmJiNjE3NzEwZGU2MjAwMjYwYWYzNTNkNTUyOWU4OGE=
|
data/.project
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<projectDescription>
|
3
|
+
<name>mit_stalker</name>
|
4
|
+
<comment></comment>
|
5
|
+
<projects>
|
6
|
+
</projects>
|
7
|
+
<buildSpec>
|
8
|
+
<buildCommand>
|
9
|
+
<name>com.aptana.ide.core.unifiedBuilder</name>
|
10
|
+
<arguments>
|
11
|
+
</arguments>
|
12
|
+
</buildCommand>
|
13
|
+
<buildCommand>
|
14
|
+
<name>org.rubypeople.rdt.core.rubybuilder</name>
|
15
|
+
<arguments>
|
16
|
+
</arguments>
|
17
|
+
</buildCommand>
|
18
|
+
</buildSpec>
|
19
|
+
<natures>
|
20
|
+
<nature>com.aptana.ruby.core.rubynature</nature>
|
21
|
+
<nature>org.rubypeople.rdt.core.rubynature</nature>
|
22
|
+
</natures>
|
23
|
+
</projectDescription>
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.3.5)
|
5
|
+
builder (3.2.2)
|
6
|
+
faraday (0.8.8)
|
7
|
+
multipart-post (~> 1.2.0)
|
8
|
+
git (1.2.6)
|
9
|
+
github_api (0.10.1)
|
10
|
+
addressable
|
11
|
+
faraday (~> 0.8.1)
|
12
|
+
hashie (>= 1.2)
|
13
|
+
multi_json (~> 1.4)
|
14
|
+
nokogiri (~> 1.5.2)
|
15
|
+
oauth2
|
16
|
+
hashie (2.0.5)
|
17
|
+
highline (1.6.19)
|
18
|
+
httpauth (0.2.0)
|
19
|
+
jeweler (1.8.7)
|
20
|
+
builder
|
21
|
+
bundler (~> 1.0)
|
22
|
+
git (>= 1.2.5)
|
23
|
+
github_api (= 0.10.1)
|
24
|
+
highline (>= 1.6.15)
|
25
|
+
nokogiri (= 1.5.10)
|
26
|
+
rake
|
27
|
+
rdoc
|
28
|
+
json (1.8.0)
|
29
|
+
jwt (0.1.8)
|
30
|
+
multi_json (>= 1.5)
|
31
|
+
metaclass (0.0.1)
|
32
|
+
minitest (5.0.6)
|
33
|
+
mocha (0.14.0)
|
34
|
+
metaclass (~> 0.0.1)
|
35
|
+
multi_json (1.7.9)
|
36
|
+
multi_xml (0.5.5)
|
37
|
+
multipart-post (1.2.0)
|
38
|
+
nokogiri (1.5.10)
|
39
|
+
oauth2 (0.9.2)
|
40
|
+
faraday (~> 0.8)
|
41
|
+
httpauth (~> 0.2)
|
42
|
+
jwt (~> 0.1.4)
|
43
|
+
multi_json (~> 1.0)
|
44
|
+
multi_xml (~> 0.5)
|
45
|
+
rack (~> 1.2)
|
46
|
+
rack (1.5.2)
|
47
|
+
rake (10.1.0)
|
48
|
+
rdoc (4.0.1)
|
49
|
+
json (~> 1.4)
|
50
|
+
simplecov (0.7.1)
|
51
|
+
multi_json (~> 1.0)
|
52
|
+
simplecov-html (~> 0.7.1)
|
53
|
+
simplecov-html (0.7.1)
|
54
|
+
yard (0.8.7)
|
55
|
+
|
56
|
+
PLATFORMS
|
57
|
+
ruby
|
58
|
+
|
59
|
+
DEPENDENCIES
|
60
|
+
bundler (>= 1.3.5)
|
61
|
+
jeweler (>= 1.8.7)
|
62
|
+
minitest (>= 4.7.3)
|
63
|
+
mocha (>= 0.14.0)
|
64
|
+
simplecov
|
65
|
+
yard (>= 0.8.7)
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Victor Costan
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,28 +1,38 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Author:: Victor Costan
|
4
|
-
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
-
# License:: MIT
|
1
|
+
# encoding: utf-8
|
6
2
|
|
7
3
|
require 'rubygems'
|
8
|
-
require '
|
4
|
+
require 'bundler'
|
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
|
+
require 'rake'
|
9
13
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
p.need_zip = true
|
22
|
-
p.rdoc_pattern = /^(lib|bin|tasks|ext)|^BUILD|^README|^CHANGELOG|^TODO|^LICENSE|^COPYING$/
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "mit_stalker"
|
18
|
+
gem.homepage = "http://github.com/pwnall/mit_stalker"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{Fetches publicly available information about MIT students.}
|
21
|
+
gem.description = %Q{Fetches publicly available information about MIT students.}
|
22
|
+
gem.email = "victor@costan.us"
|
23
|
+
gem.authors = ["Victor Costan"]
|
24
|
+
# dependencies defined in Gemfile
|
23
25
|
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/*_test.rb'
|
32
|
+
test.verbose = true
|
28
33
|
end
|
34
|
+
|
35
|
+
task :default => :test
|
36
|
+
|
37
|
+
require 'yard'
|
38
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.5
|
data/lib/mit_stalker.rb
CHANGED
@@ -1,42 +1,49 @@
|
|
1
|
-
# Fetch publicly available information about MIT students.
|
2
|
-
#
|
3
|
-
# Author:: Victor Costan
|
4
|
-
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
-
# License:: MIT
|
1
|
+
# Fetch publicly available information about MIT students.
|
6
2
|
|
7
3
|
require 'socket'
|
4
|
+
require 'timeout'
|
8
5
|
|
9
6
|
|
10
|
-
# Fetch publicly available information about MIT students.
|
7
|
+
# Fetch publicly available information about MIT students.
|
11
8
|
module MitStalker
|
9
|
+
class <<self
|
10
|
+
# The number of seconds to wait for a finger result.
|
11
|
+
attr_accessor :finger_timeout
|
12
|
+
end
|
13
|
+
self.finger_timeout = 10
|
14
|
+
|
12
15
|
# Issues a finger request to a server.
|
13
16
|
#
|
14
17
|
# Returns a string containing the finger response, or nil if something went
|
15
18
|
# wrong.
|
16
19
|
def self.finger(request, host)
|
17
20
|
begin
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
Timeout.timeout(self.finger_timeout) do
|
22
|
+
client = TCPSocket.open host, 'finger'
|
23
|
+
client.send request + "\n", 0 # 0 means standard packet
|
24
|
+
result = client.readlines.join
|
25
|
+
client.close
|
26
|
+
|
27
|
+
return result
|
28
|
+
end
|
29
|
+
rescue Timeout::Error
|
30
|
+
return nil
|
24
31
|
rescue
|
25
32
|
return nil
|
26
33
|
end
|
27
34
|
end
|
28
|
-
|
35
|
+
|
29
36
|
# Retrieves an MIT student's full name, based on the Athena username.
|
30
37
|
#
|
31
38
|
# Returns a string containing the full name, or nil if the Athena username is
|
32
|
-
# not recognized.
|
39
|
+
# not recognized.
|
33
40
|
def self.full_name_from_user_name(user_name)
|
34
41
|
athena_data = finger user_name.downcase, 'linux.mit.edu'
|
35
42
|
return nil if athena_data.nil?
|
36
|
-
match =
|
43
|
+
match = /(N|n)ame\: (.*)$/.match athena_data
|
37
44
|
match and match[2].strip
|
38
45
|
end
|
39
|
-
|
46
|
+
|
40
47
|
# Parses a MIT directory response into users.
|
41
48
|
#
|
42
49
|
# Returns a (possibly empty) array of hashes, with one hash per user. A hash
|
@@ -44,8 +51,8 @@ module MitStalker
|
|
44
51
|
# {:name => 'Victor Costan', :year => '1'}
|
45
52
|
def self.parse_mitdir_response(response)
|
46
53
|
return [] if response.nil?
|
47
|
-
|
48
|
-
lines = response.split("\r\n").reverse
|
54
|
+
|
55
|
+
lines = response.split("\r\n").reverse
|
49
56
|
users = []
|
50
57
|
user = {}
|
51
58
|
lines.each do |line|
|
@@ -54,15 +61,15 @@ module MitStalker
|
|
54
61
|
user = {}
|
55
62
|
next
|
56
63
|
end
|
57
|
-
|
64
|
+
|
58
65
|
match = /([^:]*):(.+)/.match line
|
59
66
|
break unless match
|
60
|
-
|
67
|
+
|
61
68
|
user[match[1].strip.downcase.gsub(' ', '_').to_sym] = match[2].strip
|
62
69
|
end
|
63
70
|
users
|
64
71
|
end
|
65
|
-
|
72
|
+
|
66
73
|
# Computes a name vector from a full name.
|
67
74
|
#
|
68
75
|
# The same name, in different formats, should yield the same vector. Different
|
@@ -70,24 +77,24 @@ module MitStalker
|
|
70
77
|
def self.name_vector(name)
|
71
78
|
name.gsub(/\W/, ' ').gsub(/ +/, ' ').split.sort
|
72
79
|
end
|
73
|
-
|
80
|
+
|
74
81
|
# Narrows down a MIT directory response to a single user.
|
75
82
|
#
|
76
83
|
# Returns a single user information hash, or nil if no user has the given
|
77
|
-
# full name.
|
84
|
+
# full name.
|
78
85
|
def self.refine_mitdir_response_by_name(users, full_name)
|
79
86
|
vector = name_vector(full_name)
|
80
87
|
user_base_info = users.find { |user| name_vector(user[:name]) == vector }
|
81
88
|
return nil unless user_base_info
|
82
|
-
|
89
|
+
|
83
90
|
# Don't make an extra request for the same info.
|
84
91
|
return users.first if users.length == 1
|
85
|
-
|
92
|
+
|
86
93
|
# Requesting by alias should return a single name.
|
87
94
|
users = parse_mitdir_response finger(user_base_info[:alias], 'web.mit.edu')
|
88
95
|
users and users.first
|
89
96
|
end
|
90
|
-
|
97
|
+
|
91
98
|
# Narrows down a MIT directory response to a single user.
|
92
99
|
#
|
93
100
|
# Returns a single user information hash, or nil if no user has the given
|
@@ -104,26 +111,26 @@ module MitStalker
|
|
104
111
|
next unless users
|
105
112
|
user = users.first
|
106
113
|
if user[:email] and user[:email].split('@').first == user_name
|
107
|
-
return user
|
114
|
+
return user
|
108
115
|
end
|
109
116
|
end
|
110
117
|
end
|
111
118
|
nil
|
112
119
|
end
|
113
|
-
|
120
|
+
|
114
121
|
# Flips an official full-name (e.g. Costan, Victor-Marius) to its normal form.
|
115
122
|
def self.flip_full_name(name)
|
116
123
|
name.split(',', 2).map(&:strip).reverse.join(' ')
|
117
124
|
end
|
118
|
-
|
125
|
+
|
119
126
|
# Retrieves information about an MIT student from an Athena username.
|
120
127
|
#
|
121
128
|
# Returns a hash containing user information, or nil if the user was not
|
122
129
|
# found.
|
123
|
-
def self.from_user_name(user_name)
|
130
|
+
def self.from_user_name(user_name, finger_timeout=10)
|
124
131
|
user_name = user_name.downcase
|
125
132
|
full_name = full_name_from_user_name user_name
|
126
|
-
|
133
|
+
|
127
134
|
if full_name
|
128
135
|
users = parse_mitdir_response finger(full_name, 'web.mit.edu')
|
129
136
|
else
|
@@ -132,11 +139,11 @@ module MitStalker
|
|
132
139
|
if users.empty?
|
133
140
|
users = parse_mitdir_response finger(user_name, 'web.mit.edu')
|
134
141
|
end
|
135
|
-
|
142
|
+
|
136
143
|
user = refine_mitdir_response_by_name(users, full_name) if full_name
|
137
144
|
user = refine_mitdir_response_by_email(users, user_name) unless user
|
138
145
|
return nil unless user
|
139
|
-
|
146
|
+
|
140
147
|
user.merge :full_name => (full_name || flip_full_name(user[:name]))
|
141
148
|
end
|
142
149
|
end
|
data/mit_stalker.gemspec
CHANGED
@@ -1,36 +1,70 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
1
4
|
# -*- encoding: utf-8 -*-
|
2
5
|
|
3
6
|
Gem::Specification.new do |s|
|
4
7
|
s.name = "mit_stalker"
|
5
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.5"
|
6
9
|
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new(">=
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
11
|
s.authors = ["Victor Costan"]
|
9
|
-
s.date = "
|
12
|
+
s.date = "2013-09-05"
|
10
13
|
s.description = "Fetches publicly available information about MIT students."
|
11
|
-
s.email = "victor@
|
12
|
-
s.extra_rdoc_files = [
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
s.email = "victor@costan.us"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.textile"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".project",
|
21
|
+
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.textile",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"lib/mit_stalker.rb",
|
28
|
+
"mit_stalker.gemspec",
|
29
|
+
"test/fixtures/mixed_response.txt",
|
30
|
+
"test/fixtures/multi_response.txt",
|
31
|
+
"test/fixtures/no_response.txt",
|
32
|
+
"test/fixtures/single_response.txt",
|
33
|
+
"test/fixtures/single_response2.txt",
|
34
|
+
"test/helper.rb",
|
35
|
+
"test/mit_stalker_test.rb"
|
36
|
+
]
|
37
|
+
s.homepage = "http://github.com/pwnall/mit_stalker"
|
38
|
+
s.licenses = ["MIT"]
|
16
39
|
s.require_paths = ["lib"]
|
17
|
-
s.
|
18
|
-
s.rubygems_version = "1.8.15"
|
40
|
+
s.rubygems_version = "2.0.7"
|
19
41
|
s.summary = "Fetches publicly available information about MIT students."
|
20
|
-
s.test_files = ["test/mit_stalker_test.rb"]
|
21
42
|
|
22
43
|
if s.respond_to? :specification_version then
|
23
|
-
s.specification_version =
|
44
|
+
s.specification_version = 4
|
24
45
|
|
25
46
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
-
s.add_development_dependency(%q<
|
27
|
-
s.add_development_dependency(%q<
|
47
|
+
s.add_development_dependency(%q<mocha>, [">= 0.14.0"])
|
48
|
+
s.add_development_dependency(%q<minitest>, [">= 4.7.3"])
|
49
|
+
s.add_development_dependency(%q<yard>, [">= 0.8.7"])
|
50
|
+
s.add_development_dependency(%q<bundler>, [">= 1.3.5"])
|
51
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.8.7"])
|
52
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
28
53
|
else
|
29
|
-
s.add_dependency(%q<
|
30
|
-
s.add_dependency(%q<
|
54
|
+
s.add_dependency(%q<mocha>, [">= 0.14.0"])
|
55
|
+
s.add_dependency(%q<minitest>, [">= 4.7.3"])
|
56
|
+
s.add_dependency(%q<yard>, [">= 0.8.7"])
|
57
|
+
s.add_dependency(%q<bundler>, [">= 1.3.5"])
|
58
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.7"])
|
59
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
31
60
|
end
|
32
61
|
else
|
33
|
-
s.add_dependency(%q<
|
34
|
-
s.add_dependency(%q<
|
62
|
+
s.add_dependency(%q<mocha>, [">= 0.14.0"])
|
63
|
+
s.add_dependency(%q<minitest>, [">= 4.7.3"])
|
64
|
+
s.add_dependency(%q<yard>, [">= 0.8.7"])
|
65
|
+
s.add_dependency(%q<bundler>, [">= 1.3.5"])
|
66
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.7"])
|
67
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
35
68
|
end
|
36
69
|
end
|
70
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Student data loaded as of Sep 29, Staff data loaded as of Sep 29.
|
2
|
+
|
3
|
+
Notify Personnel or use WebSIS as appropriate to change your information.
|
4
|
+
|
5
|
+
Our on-line help system describes
|
6
|
+
How to change data, how the directory works, where to get more info.
|
7
|
+
For a listing of help topics, enter finger help@mit.edu. Try finger
|
8
|
+
help_about@mit.edu to read about how the directory works.
|
9
|
+
Directory bluepages may be found at http://mit.edu/communications/bp.
|
10
|
+
|
11
|
+
There were 3 matches to your request.
|
12
|
+
|
13
|
+
Complete information will be shown only when one individual matches
|
14
|
+
your query. Resubmit your query with more information.
|
15
|
+
For example, use both firstname and lastname or use the alias field.
|
16
|
+
|
17
|
+
name: Li, An
|
18
|
+
department: Electrical Eng & Computer Sci
|
19
|
+
email: _anli@MIT.EDU
|
20
|
+
year: 4
|
21
|
+
alias: A-li2
|
22
|
+
|
23
|
+
name: Costan, Victor Marius
|
24
|
+
department: Electrical Eng & Computer Sci
|
25
|
+
year: G
|
26
|
+
alias: V-costan
|
27
|
+
|
28
|
+
name: Li, Alice
|
29
|
+
department: Electrical Eng & Computer Sci
|
30
|
+
year: 4
|
31
|
+
alias: A-li
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Student data loaded as of Feb 3, Staff data loaded as of Feb 3.
|
2
|
+
|
3
|
+
Notify Personnel or use WebSIS as appropriate to change your information.
|
4
|
+
|
5
|
+
Our on-line help system describes
|
6
|
+
How to change data, how the directory works, where to get more info.
|
7
|
+
For a listing of help topics, enter finger help@mit.edu. Try finger
|
8
|
+
help_about@mit.edu to read about how the directory works.
|
9
|
+
Directory bluepages may be found at http://mit.edu/communications/bp.
|
10
|
+
|
11
|
+
There was 1 match to your request.
|
12
|
+
|
13
|
+
name: Li, Alice
|
14
|
+
email: aliceli@MIT.EDU
|
15
|
+
address: MacGregor House # B322
|
16
|
+
department: Electrical Eng & Computer Sci
|
17
|
+
school: School Of Engineering
|
18
|
+
year: 4
|
19
|
+
alias: A-li
|
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
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 'minitest/autorun'
|
11
|
+
require 'minitest/unit'
|
12
|
+
require 'mocha/setup'
|
13
|
+
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
16
|
+
require 'mit_stalker'
|
17
|
+
|
18
|
+
MiniTest.autorun
|
data/test/mit_stalker_test.rb
CHANGED
@@ -1,26 +1,31 @@
|
|
1
|
-
|
2
|
-
# Copyright:: Copyright (C) 2009 Zergling.Net
|
3
|
-
# License:: MIT
|
1
|
+
require File.expand_path('./helper', File.dirname(__FILE__))
|
4
2
|
|
5
|
-
require 'mit_stalker'
|
6
|
-
require 'test/unit'
|
7
|
-
require 'flexmock/test_unit'
|
8
3
|
|
9
|
-
|
10
|
-
class MitStalkerTest < Test::Unit::TestCase
|
4
|
+
class MitStalkerTest < Minitest::Test
|
11
5
|
def fixture(name)
|
12
6
|
File.read File.join(File.dirname(__FILE__), 'fixtures', name)
|
13
7
|
end
|
14
|
-
|
8
|
+
|
15
9
|
def test_finger
|
16
10
|
assert_equal nil, MitStalker.finger('root', 'nosuchhostname.com'),
|
17
11
|
'Invalid hostname'
|
18
|
-
|
19
|
-
result = MitStalker.finger
|
20
|
-
assert_operator(/
|
12
|
+
|
13
|
+
result = MitStalker.finger 'no_such_user', 'linux.mit.edu'
|
14
|
+
assert_operator(/no_such_user/, :=~, result,
|
21
15
|
"The finger response looks incorrect")
|
16
|
+
|
17
|
+
begin
|
18
|
+
MitStalker.finger_timeout = 1
|
19
|
+
|
20
|
+
start_time = Time.now
|
21
|
+
result = MitStalker.finger 'no_such_user', 'web.mit.edu'
|
22
|
+
assert_equal nil, result, 'Invalid timeout result'
|
23
|
+
assert_in_delta Time.now - start_time, 1, 0.2, 'Bad timeout duration'
|
24
|
+
ensure
|
25
|
+
MitStalker.finger_timeout = 10
|
26
|
+
end
|
22
27
|
end
|
23
|
-
|
28
|
+
|
24
29
|
def test_full_name
|
25
30
|
assert_equal 'Srinivas Devadas',
|
26
31
|
MitStalker.full_name_from_user_name('devadas'),
|
@@ -30,16 +35,16 @@ class MitStalkerTest < Test::Unit::TestCase
|
|
30
35
|
'Capital letter in user name'
|
31
36
|
assert_equal nil, MitStalker.full_name_from_user_name('no_user')
|
32
37
|
end
|
33
|
-
|
38
|
+
|
34
39
|
def test_parse_mitdir_no_response
|
35
40
|
assert_equal [],
|
36
41
|
MitStalker.parse_mitdir_response(fixture('no_response.txt'))
|
37
42
|
end
|
38
|
-
|
43
|
+
|
39
44
|
def test_parse_mitdir_single_response
|
40
45
|
response = MitStalker.parse_mitdir_response fixture('single_response.txt')
|
41
46
|
assert_equal 1, response.length, 'Response should have 1 user'
|
42
|
-
|
47
|
+
|
43
48
|
assert_equal 'Costan, Victor Marius', response.first[:name]
|
44
49
|
assert_equal 'costan@MIT.EDU', response.first[:email]
|
45
50
|
assert_equal 'G', response.first[:year]
|
@@ -47,40 +52,40 @@ class MitStalkerTest < Test::Unit::TestCase
|
|
47
52
|
assert_equal 'http://www.costan.us', response.first[:url]
|
48
53
|
assert_equal 'V-costan', response.first[:alias]
|
49
54
|
end
|
50
|
-
|
55
|
+
|
51
56
|
def test_parse_mitdir_multiple_responses
|
52
57
|
response = MitStalker.parse_mitdir_response fixture('multi_response.txt')
|
53
58
|
assert_equal 155, response.length, 'Response should have 110 users'
|
54
|
-
|
59
|
+
|
55
60
|
response.each do |user|
|
56
61
|
assert_operator(/Li/, :=~, user[:name], "Name doesn't match query")
|
57
62
|
assert_operator(/li/i, :=~, user[:alias], "Alias doesn't match query")
|
58
63
|
end
|
59
64
|
end
|
60
|
-
|
65
|
+
|
61
66
|
def test_name_vector
|
62
67
|
['Victor-Marius Costan', 'Victor Marius Costan', 'Costan, Victor-Marius',
|
63
68
|
'Costan, Victor Marius'].each do |name|
|
64
69
|
assert_equal ['Costan', 'Marius', 'Victor'], MitStalker.name_vector(name)
|
65
70
|
end
|
66
71
|
end
|
67
|
-
|
72
|
+
|
68
73
|
def test_refine_mitdir_response_by_name
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
multi_response =
|
73
|
-
|
74
|
+
MitStalker.expects(:finger).with('Y-li16', 'web.mit.edu').
|
75
|
+
returns(fixture('single_response.txt')).once
|
76
|
+
|
77
|
+
multi_response = MitStalker.parse_mitdir_response(
|
78
|
+
fixture('multi_response.txt'))
|
74
79
|
user = MitStalker.refine_mitdir_response_by_name multi_response,
|
75
80
|
'Yan Ping Li'
|
76
81
|
assert_equal 'costan@MIT.EDU', user[:email], 'Wrong user information'
|
77
82
|
end
|
78
|
-
|
83
|
+
|
79
84
|
def test_refine_mitdir_response_by_email
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
85
|
+
MitStalker.expects(:finger).with('V-costan', 'web.mit.edu').
|
86
|
+
returns(fixture('single_response.txt')).once
|
87
|
+
MitStalker.expects(:finger).with('A-li', 'web.mit.edu').
|
88
|
+
returns(fixture('single_response2.txt')).once
|
84
89
|
|
85
90
|
mixed_response =
|
86
91
|
MitStalker.parse_mitdir_response fixture('mixed_response.txt')
|
@@ -89,24 +94,27 @@ class MitStalkerTest < Test::Unit::TestCase
|
|
89
94
|
assert user, 'No user returned'
|
90
95
|
assert_equal 'Li, Alice', user[:name]
|
91
96
|
end
|
92
|
-
|
97
|
+
|
93
98
|
def test_flip_full_name
|
94
99
|
assert_equal 'Victor Marius Costan',
|
95
100
|
MitStalker.flip_full_name('Costan, Victor Marius'), 'flipped'
|
96
101
|
assert_equal 'Victor Marius Costan',
|
97
102
|
MitStalker.flip_full_name('Victor Marius Costan'), 'canonical'
|
98
103
|
end
|
99
|
-
|
104
|
+
|
100
105
|
def test_from_user_name
|
101
106
|
assert_equal nil, MitStalker.from_user_name('no_such_user')
|
102
|
-
|
107
|
+
|
103
108
|
info = MitStalker.from_user_name 'devadas'
|
109
|
+
assert info, 'No info returned'
|
104
110
|
assert_equal 'Devadas, Srinivas', info[:name]
|
105
|
-
|
111
|
+
|
106
112
|
info = MitStalker.from_user_name 'Devadas'
|
113
|
+
assert info, 'No info returned'
|
107
114
|
assert_equal 'Devadas, Srinivas', info[:name], 'capitalized user name'
|
108
115
|
|
109
116
|
info = MitStalker.from_user_name 'nickolai'
|
117
|
+
assert info, 'No info returned'
|
110
118
|
assert_equal 'Zeldovich, Nickolai', info[:name]
|
111
119
|
assert_equal 'Nickolai Zeldovich', info[:full_name]
|
112
120
|
end
|
metadata
CHANGED
@@ -1,88 +1,145 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mit_stalker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Victor Costan
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-09-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
17
|
-
none: false
|
14
|
+
name: mocha
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: 0.14.0
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.14.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.7.3
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.7.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: yard
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.7
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.8.7
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.3.5
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.3.5
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: jeweler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.8.7
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.8.7
|
25
83
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement:
|
28
|
-
none: false
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
29
86
|
requirements:
|
30
87
|
- - ! '>='
|
31
88
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0
|
89
|
+
version: '0'
|
33
90
|
type: :development
|
34
91
|
prerelease: false
|
35
|
-
version_requirements:
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
36
97
|
description: Fetches publicly available information about MIT students.
|
37
|
-
email: victor@
|
98
|
+
email: victor@costan.us
|
38
99
|
executables: []
|
39
100
|
extensions: []
|
40
101
|
extra_rdoc_files:
|
41
|
-
-
|
42
|
-
- LICENSE
|
102
|
+
- LICENSE.txt
|
43
103
|
- README.textile
|
44
|
-
- lib/mit_stalker.rb
|
45
104
|
files:
|
46
|
-
-
|
47
|
-
-
|
48
|
-
-
|
105
|
+
- .project
|
106
|
+
- Gemfile
|
107
|
+
- Gemfile.lock
|
108
|
+
- LICENSE.txt
|
49
109
|
- README.textile
|
50
110
|
- Rakefile
|
111
|
+
- VERSION
|
51
112
|
- lib/mit_stalker.rb
|
113
|
+
- mit_stalker.gemspec
|
114
|
+
- test/fixtures/mixed_response.txt
|
52
115
|
- test/fixtures/multi_response.txt
|
53
116
|
- test/fixtures/no_response.txt
|
54
117
|
- test/fixtures/single_response.txt
|
118
|
+
- test/fixtures/single_response2.txt
|
119
|
+
- test/helper.rb
|
55
120
|
- test/mit_stalker_test.rb
|
56
|
-
|
57
|
-
|
58
|
-
|
121
|
+
homepage: http://github.com/pwnall/mit_stalker
|
122
|
+
licenses:
|
123
|
+
- MIT
|
124
|
+
metadata: {}
|
59
125
|
post_install_message:
|
60
|
-
rdoc_options:
|
61
|
-
- --line-numbers
|
62
|
-
- --inline-source
|
63
|
-
- --title
|
64
|
-
- Mit_stalker
|
65
|
-
- --main
|
66
|
-
- README.textile
|
126
|
+
rdoc_options: []
|
67
127
|
require_paths:
|
68
128
|
- lib
|
69
129
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
-
none: false
|
71
130
|
requirements:
|
72
131
|
- - ! '>='
|
73
132
|
- !ruby/object:Gem::Version
|
74
133
|
version: '0'
|
75
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
-
none: false
|
77
135
|
requirements:
|
78
136
|
- - ! '>='
|
79
137
|
- !ruby/object:Gem::Version
|
80
|
-
version: '
|
138
|
+
version: '0'
|
81
139
|
requirements: []
|
82
|
-
rubyforge_project:
|
83
|
-
rubygems_version:
|
140
|
+
rubyforge_project:
|
141
|
+
rubygems_version: 2.0.7
|
84
142
|
signing_key:
|
85
|
-
specification_version:
|
143
|
+
specification_version: 4
|
86
144
|
summary: Fetches publicly available information about MIT students.
|
87
|
-
test_files:
|
88
|
-
- test/mit_stalker_test.rb
|
145
|
+
test_files: []
|
data/CHANGELOG
DELETED
data/LICENSE
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
The MIT License
|
2
|
-
|
3
|
-
Copyright (c) 2009 Zergling.Net
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in
|
13
|
-
all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
THE SOFTWARE.
|