cornell_ldap 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ begin
11
11
  gem.homepage = "http://github.com/aepstein/cornell_ldap"
12
12
  gem.authors = ["Ari Epstein"]
13
13
  gem.add_development_dependency "rspec", ">= 1.2.9"
14
- gem.add_dependency "activeldap", ">= 1.2.0"
14
+ gem.add_dependency "net-ldap", '>= 0.1.1'
15
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
16
  end
17
17
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.0
1
+ 1.3.0
data/cornell_ldap.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cornell_ldap}
8
- s.version = "1.2.0"
8
+ s.version = "1.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ari Epstein"]
12
- s.date = %q{2009-11-05}
12
+ s.date = %q{2010-07-27}
13
13
  s.description = %q{Using ActiveLdap, this library provides an easy interface for communicating with the Cornell University LDAP directory. Use of this directory is restricted to purposes authorized by the university.}
14
14
  s.email = %q{aepstein607@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -32,11 +32,11 @@ Gem::Specification.new do |s|
32
32
  s.homepage = %q{http://github.com/aepstein/cornell_ldap}
33
33
  s.rdoc_options = ["--charset=UTF-8"]
34
34
  s.require_paths = ["lib"]
35
- s.rubygems_version = %q{1.3.5}
35
+ s.rubygems_version = %q{1.3.6}
36
36
  s.summary = %q{Toolkit for accessing information about people through the Cornell University LDAP directory.}
37
37
  s.test_files = [
38
- "spec/cornell_ldap_spec.rb",
39
- "spec/spec_helper.rb"
38
+ "spec/spec_helper.rb",
39
+ "spec/cornell_ldap_spec.rb"
40
40
  ]
41
41
 
42
42
  if s.respond_to? :specification_version then
@@ -45,14 +45,14 @@ Gem::Specification.new do |s|
45
45
 
46
46
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
47
47
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
48
- s.add_runtime_dependency(%q<activeldap>, [">= 1.2.0"])
48
+ s.add_runtime_dependency(%q<net-ldap>, [">= 0.1.1"])
49
49
  else
50
50
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
51
- s.add_dependency(%q<activeldap>, [">= 1.2.0"])
51
+ s.add_dependency(%q<net-ldap>, [">= 0.1.1"])
52
52
  end
53
53
  else
54
54
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
55
- s.add_dependency(%q<activeldap>, [">= 1.2.0"])
55
+ s.add_dependency(%q<net-ldap>, [">= 0.1.1"])
56
56
  end
57
57
  end
58
58
 
data/lib/cornell_ldap.rb CHANGED
@@ -1,10 +1,74 @@
1
1
  require 'rubygems' unless defined? Gem
2
- require 'active_ldap' unless defined? ActiveLdap
2
+ require 'net/ldap' unless defined? Net::LDAP
3
3
 
4
4
  module CornellLdap
5
- class Record < ActiveLdap::Base
6
- ldap_mapping :dn_attribute => 'uid',
7
- :prefix => 'ou=People'
5
+ class Record < Object
6
+
7
+ MAPPINGS = {
8
+ :cornelledutype => :status,
9
+ :cornelleduwrkngtitle1 => :status_title1,
10
+ :cornelleduwrkngtitle2 => :status_title2,
11
+ :cornelleduacadcollege => :college,
12
+ :cornelleducampusaddress => :campus_address,
13
+ :cornelledulocaladdress => :local_address,
14
+ :homepostaladdress => :home_address,
15
+ :givenname => :first_name,
16
+ :cornelledumiddlename => :middle_name,
17
+ :sn => :last_name
18
+ }
19
+
20
+ CONNECTION_PARAMETERS = [ :port, :host, :auth ]
21
+
22
+ def self.setup_connection( params )
23
+ @@connection_params = params
24
+ con = {}
25
+ CONNECTION_PARAMETERS.each do |setting|
26
+ con[setting] = @@connection_params[setting] if params.key? setting
27
+ end
28
+ @@connection = Net::LDAP.new( con )
29
+ end
30
+
31
+ def self.connection
32
+ @@connection
33
+ end
34
+
35
+ def self.find( subject )
36
+ r = connection.search(
37
+ :base => 'ou=People,' + @@connection_params[:base], :size => 1,
38
+ :filter => Net::LDAP::Filter.eq( 'uid', subject ),
39
+ :scope => Net::LDAP::SearchScope_SingleLevel
40
+ )
41
+ return CornellLdap::Record.new( r.first ) if r && r.length > 0
42
+ nil
43
+ end
44
+
45
+ # Takes an address string and converts it to a hash representation:
46
+ #
47
+ # [street] Street address
48
+ # [city] City
49
+ # [state] State
50
+ # [zip] Zip code
51
+ def self.address_attributes(string_address)
52
+ return if string_address.nil?
53
+ array_address = string_address.split(',').map! { |x| x.strip }
54
+ state = false
55
+ array_address.each_index { |i| state = i if array_address[i] =~ /^[A-Za-z]{2,2}$/ }
56
+ return unless state && state > 1
57
+ attributes = { :street => array_address[0..(state-2)].join(', '),
58
+ :city => array_address[state - 1],
59
+ :state => array_address[state] }
60
+ attributes[:zip] = array_address[state + 1] unless array_address[state + 1].nil?
61
+ attributes
62
+ end
63
+
64
+ attr_accessor :attributes
65
+
66
+ def initialize( record )
67
+ self.attributes = Hash.new
68
+ MAPPINGS.each do |ldap, local|
69
+ self.attributes[local] = record[ldap].first unless record[ldap].nil? || record[ldap].empty?
70
+ end
71
+ end
8
72
 
9
73
  # Returns a string representation of the person's status with the university
10
74
  # of one of the following types:
@@ -15,26 +79,26 @@ module CornellLdap
15
79
  # [grad] graduate or professional student
16
80
  # [alumni] alumnus
17
81
  # [temporary] temporary or casual employee
18
- # [unknown] unable to determine status from LDAP record
82
+ # false status unknown
19
83
  def status
20
84
  return @status unless @status.nil?
21
- return unless attribute_present?('type')
22
- @status = case self['type']
85
+ return unless attributes.key?( :status )
86
+ @status = case attributes[:status]
23
87
  when /^staff/ then 'staff'
24
88
  when /^acad/ then
25
- if ( attribute_present?('cornelleduwrkngtitle1') && cornelleduwrkngtitle1 =~ /^Prof/ ) ||
26
- ( attribute_present?('cornelleduwrkngtitle2') && cornelleduwrkngtitle2 =~ /^Prof/ ) then
89
+ if ( attributes.key?(:status_title1) && attributes[:status_title1] =~ /^Prof/ ) ||
90
+ ( attributes.key?(:status_title2) && attributes[:status_title2] =~ /^Prof/ ) then
27
91
  'faculty'
28
92
  else
29
93
  'staff'
30
94
  end
31
- when /^student/ then case cornelleduacadcollege
95
+ when /^student/ then case attributes[:college]
32
96
  when 'AS', 'AR', 'AG', 'IL', 'HE', 'EN', 'UN' then 'undergrad'
33
97
  else 'grad'
34
98
  end
35
99
  when /^alumni/ then 'alumni'
36
100
  when /^temp/ then 'temporary'
37
- else 'unknown'
101
+ else false
38
102
  end
39
103
  end
40
104
 
@@ -45,8 +109,8 @@ module CornellLdap
45
109
  unless @campus_address.nil?
46
110
  return @campus_address
47
111
  end
48
- @campus_address = false unless attribute_present?('cornelleducampusaddress') &&
49
- @campus_address = { :street => cornelleducampusaddress.strip,
112
+ @campus_address = false unless attributes.key?(:campus_address) &&
113
+ @campus_address = { :street => attributes[:campus_address].strip,
50
114
  :on_campus => true }
51
115
  return campus_address
52
116
  end
@@ -57,8 +121,8 @@ module CornellLdap
57
121
  unless @local_address.nil?
58
122
  return @local_address
59
123
  end
60
- @local_address = false unless attribute_present?('cornelledulocaladdress') &&
61
- @local_address = Record.address_attributes(cornelledulocaladdress)
124
+ @local_address = false unless attributes.key?(:local_address) &&
125
+ @local_address = Record.address_attributes(attributes[:local_address])
62
126
  return local_address
63
127
  end
64
128
 
@@ -68,47 +132,19 @@ module CornellLdap
68
132
  unless @home_address.nil?
69
133
  return @home_address
70
134
  end
71
- @home_address = false unless attribute_present?('homePostalAddress') &&
72
- @home_address = Record.address_attributes(homePostalAddress)
135
+ @home_address = false unless attributes.key?(:home_address) &&
136
+ @home_address = Record.address_attributes(attributes[:home_address])
73
137
  return home_address
74
138
  end
75
139
 
76
- # Takes an address string and converts it to a hash representation:
77
- #
78
- # [street] Street address
79
- # [city] City
80
- # [state] State
81
- # [zip] Zip code
82
- def self.address_attributes(string_address)
83
- return if string_address.nil?
84
- array_address = string_address.split(',').map! { |x| x.strip }
85
- state = false
86
- array_address.each_index { |i| state = i if array_address[i] =~ /^[A-Za-z]{2,2}$/ }
87
- return unless state && state > 1
88
- attributes = { :street => array_address[0..(state-2)].join(', '),
89
- :city => array_address[state - 1],
90
- :state => array_address[state] }
91
- attributes[:zip] = array_address[state + 1] unless array_address[state + 1].nil?
92
- attributes
93
- end
94
-
95
140
  # Returns first name of person
96
- def first_name
97
- return nil unless attribute_present?('givenName')
98
- self.givenName
99
- end
141
+ def first_name; attributes[:first_name]; end
100
142
 
101
143
  # Returns middle name of person
102
- def middle_name
103
- return nil unless attribute_present?('cornelledumiddlename')
104
- self.cornelledumiddlename
105
- end
144
+ def middle_name; attributes[:middle_name]; end
106
145
 
107
146
  # Returns last name of person
108
- def last_name
109
- return nil unless attribute_present?('sn')
110
- self.sn
111
- end
147
+ def last_name; attributes[:last_name]; end
112
148
  end
113
149
  end
114
150
 
@@ -2,9 +2,8 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  require 'cornell_ldap'
4
4
 
5
- ActiveLdap::Base.setup_connection :host => 'directory.cornell.edu',
6
- :port => 389,
7
- :base => 'o=Cornell University,c=US'
5
+ CornellLdap::Record.setup_connection :host => 'directory.cornell.edu',
6
+ :port => 389, :base => 'o=Cornell University,c=US'
8
7
 
9
8
 
10
9
  describe "CornellLdap" do
@@ -18,7 +17,7 @@ describe "CornellLdap" do
18
17
  ['student', 'GR', nil, nil, 'grad'],
19
18
  ['alumni', nil, nil, nil, 'alumni'],
20
19
  ['temp', nil, nil, nil, 'temporary'],
21
- ['blah', nil, nil, nil, 'unknown']
20
+ ['blah', nil, nil, nil, false]
22
21
  ]
23
22
  end
24
23
 
@@ -27,13 +26,12 @@ describe "CornellLdap" do
27
26
 
28
27
  it "should correctly guess the status of several types" do
29
28
  @map.each do |scenario|
30
- person = mock_person
31
- person.attributes={
32
- 'type' => scenario[0],
33
- 'cornelleduacadcollege' => scenario[1],
34
- 'cornelleduwrkngtitle1' => scenario[2],
35
- 'cornelleduwrkngtitle2' => scenario[3]
36
- }
29
+ person = mock_person( {
30
+ :cornelledutype => [scenario[0]],
31
+ :cornelleduacadcollege => [scenario[1]],
32
+ :cornelleduwrkngtitle1 => [scenario[2]],
33
+ :cornelleduwrkngtitle2 => [scenario[3]]
34
+ } )
37
35
  person.status.should eql scenario[4]
38
36
  person
39
37
  end
@@ -61,13 +59,13 @@ describe "CornellLdap" do
61
59
 
62
60
  it "should call address_attributes to return local address" do
63
61
  person = mock_person
64
- CornellLdap::Record.should_receive(:address_attributes).once.with(person.cornelledulocaladdress)
62
+ CornellLdap::Record.should_receive(:address_attributes).once.with(person.attributes[:local_address])
65
63
  person.local_address
66
64
  end
67
65
 
68
66
  it "should call address_attributes to return home address" do
69
67
  person = mock_person
70
- CornellLdap::Record.should_receive(:address_attributes).once.with(person.homePostalAddress)
68
+ CornellLdap::Record.should_receive(:address_attributes).once.with(person.attributes[:home_address])
71
69
  person.home_address
72
70
  end
73
71
 
@@ -76,19 +74,17 @@ describe "CornellLdap" do
76
74
  person.campus_address[:street].should eql '-100 Day Hall'
77
75
  end
78
76
 
79
- def mock_person
80
- person = CornellLdap::Record.new
81
- person.attributes={
82
- 'type' => 'staff',
83
- 'cornelleduacadcollege' => 'AS',
84
- 'cornelleducampusaddress' => '-100 Day Hall ',
85
- 'cornelledulocaladdress' => '1 Main St., Apt. 1, Ithaca, NY, 14850',
86
- 'homePostalAddress' => '1 Broadway, New York, NY, 00000',
87
- 'givenName' => 'John',
88
- 'cornelledumiddlename' => 'A',
89
- 'sn' => 'Doe'
90
- }
91
- person
77
+ def mock_person(values = {})
78
+ CornellLdap::Record.new( {
79
+ :cornelledutype => ['staff'],
80
+ :cornelleduacadcollege => ['AS'],
81
+ :cornelleducampusaddress => ['-100 Day Hall '],
82
+ :cornelledulocaladdress => ['1 Main St., Apt. 1, Ithaca, NY, 14850'],
83
+ :homepostaladdress => ['1 Broadway, New York, NY, 00000'],
84
+ :givenname => ['John'],
85
+ :cornelledumiddlename => ['A'],
86
+ :sn => ['Doe']
87
+ }.merge(values) )
92
88
  end
93
89
  end
94
90
 
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cornell_ldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 3
8
+ - 0
9
+ version: 1.3.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Ari Epstein
@@ -9,29 +14,37 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-11-05 00:00:00 -05:00
17
+ date: 2010-07-27 00:00:00 -04:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rspec
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 2
30
+ - 9
23
31
  version: 1.2.9
24
- version:
32
+ type: :development
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
- name: activeldap
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
35
+ name: net-ldap
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - ">="
32
40
  - !ruby/object:Gem::Version
33
- version: 1.2.0
34
- version:
41
+ segments:
42
+ - 0
43
+ - 1
44
+ - 1
45
+ version: 0.1.1
46
+ type: :runtime
47
+ version_requirements: *id002
35
48
  description: Using ActiveLdap, this library provides an easy interface for communicating with the Cornell University LDAP directory. Use of this directory is restricted to purposes authorized by the university.
36
49
  email: aepstein607@gmail.com
37
50
  executables: []
@@ -66,21 +79,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
66
79
  requirements:
67
80
  - - ">="
68
81
  - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
69
84
  version: "0"
70
- version:
71
85
  required_rubygems_version: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
74
88
  - !ruby/object:Gem::Version
89
+ segments:
90
+ - 0
75
91
  version: "0"
76
- version:
77
92
  requirements: []
78
93
 
79
94
  rubyforge_project:
80
- rubygems_version: 1.3.5
95
+ rubygems_version: 1.3.6
81
96
  signing_key:
82
97
  specification_version: 3
83
98
  summary: Toolkit for accessing information about people through the Cornell University LDAP directory.
84
99
  test_files:
85
- - spec/cornell_ldap_spec.rb
86
100
  - spec/spec_helper.rb
101
+ - spec/cornell_ldap_spec.rb