treequel 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/ChangeLog +354 -0
  2. data/LICENSE +27 -0
  3. data/README +66 -0
  4. data/Rakefile +345 -0
  5. data/Rakefile.local +43 -0
  6. data/bin/treeirb +14 -0
  7. data/bin/treequel +229 -0
  8. data/examples/company-directory.rb +112 -0
  9. data/examples/ldap-monitor.rb +143 -0
  10. data/examples/ldap-monitor/public/css/master.css +328 -0
  11. data/examples/ldap-monitor/public/images/card_small.png +0 -0
  12. data/examples/ldap-monitor/public/images/chain_small.png +0 -0
  13. data/examples/ldap-monitor/public/images/globe_small.png +0 -0
  14. data/examples/ldap-monitor/public/images/globe_small_green.png +0 -0
  15. data/examples/ldap-monitor/public/images/plug.png +0 -0
  16. data/examples/ldap-monitor/public/images/shadows/large-30-down.png +0 -0
  17. data/examples/ldap-monitor/public/images/tick.png +0 -0
  18. data/examples/ldap-monitor/public/images/tick_circle.png +0 -0
  19. data/examples/ldap-monitor/public/images/treequel-favicon.png +0 -0
  20. data/examples/ldap-monitor/views/backends.erb +41 -0
  21. data/examples/ldap-monitor/views/connections.erb +74 -0
  22. data/examples/ldap-monitor/views/databases.erb +39 -0
  23. data/examples/ldap-monitor/views/dump_subsystem.erb +14 -0
  24. data/examples/ldap-monitor/views/index.erb +14 -0
  25. data/examples/ldap-monitor/views/layout.erb +35 -0
  26. data/examples/ldap-monitor/views/listeners.erb +30 -0
  27. data/examples/ldap_state.rb +62 -0
  28. data/lib/treequel.rb +145 -0
  29. data/lib/treequel/branch.rb +589 -0
  30. data/lib/treequel/branchcollection.rb +204 -0
  31. data/lib/treequel/branchset.rb +360 -0
  32. data/lib/treequel/constants.rb +604 -0
  33. data/lib/treequel/directory.rb +541 -0
  34. data/lib/treequel/exceptions.rb +32 -0
  35. data/lib/treequel/filter.rb +704 -0
  36. data/lib/treequel/mixins.rb +325 -0
  37. data/lib/treequel/schema.rb +245 -0
  38. data/lib/treequel/schema/attributetype.rb +252 -0
  39. data/lib/treequel/schema/ldapsyntax.rb +96 -0
  40. data/lib/treequel/schema/matchingrule.rb +124 -0
  41. data/lib/treequel/schema/matchingruleuse.rb +124 -0
  42. data/lib/treequel/schema/objectclass.rb +289 -0
  43. data/lib/treequel/sequel_integration.rb +26 -0
  44. data/lib/treequel/utils.rb +169 -0
  45. data/rake/191_compat.rb +26 -0
  46. data/rake/dependencies.rb +76 -0
  47. data/rake/helpers.rb +434 -0
  48. data/rake/hg.rb +261 -0
  49. data/rake/manual.rb +782 -0
  50. data/rake/packaging.rb +135 -0
  51. data/rake/publishing.rb +318 -0
  52. data/rake/rdoc.rb +30 -0
  53. data/rake/style.rb +62 -0
  54. data/rake/svn.rb +668 -0
  55. data/rake/testing.rb +187 -0
  56. data/rake/verifytask.rb +64 -0
  57. data/rake/win32.rb +190 -0
  58. data/spec/lib/constants.rb +93 -0
  59. data/spec/lib/helpers.rb +100 -0
  60. data/spec/treequel/branch_spec.rb +569 -0
  61. data/spec/treequel/branchcollection_spec.rb +213 -0
  62. data/spec/treequel/branchset_spec.rb +376 -0
  63. data/spec/treequel/directory_spec.rb +487 -0
  64. data/spec/treequel/filter_spec.rb +482 -0
  65. data/spec/treequel/mixins_spec.rb +330 -0
  66. data/spec/treequel/schema/attributetype_spec.rb +237 -0
  67. data/spec/treequel/schema/ldapsyntax_spec.rb +83 -0
  68. data/spec/treequel/schema/matchingrule_spec.rb +158 -0
  69. data/spec/treequel/schema/matchingruleuse_spec.rb +137 -0
  70. data/spec/treequel/schema/objectclass_spec.rb +262 -0
  71. data/spec/treequel/schema_spec.rb +118 -0
  72. data/spec/treequel/utils_spec.rb +49 -0
  73. data/spec/treequel_spec.rb +179 -0
  74. metadata +169 -0
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ BEGIN {
4
+ require 'pathname'
5
+ basedir = Pathname.new( __FILE__ ).dirname.parent.parent
6
+
7
+ libdir = basedir + "lib"
8
+
9
+ $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
10
+ }
11
+
12
+ begin
13
+ require 'spec'
14
+ require 'spec/lib/constants'
15
+ require 'spec/lib/helpers'
16
+
17
+ require 'yaml'
18
+ require 'ldap'
19
+ require 'ldap/schema'
20
+ require 'treequel/schema'
21
+ rescue LoadError
22
+ unless Object.const_defined?( :Gem )
23
+ require 'rubygems'
24
+ retry
25
+ end
26
+ raise
27
+ end
28
+
29
+
30
+ include Treequel::TestConstants
31
+ include Treequel::Constants
32
+
33
+ #####################################################################
34
+ ### C O N T E X T S
35
+ #####################################################################
36
+
37
+ describe Treequel::Schema do
38
+ include Treequel::SpecHelpers
39
+
40
+ before( :all ) do
41
+ setup_logging( :fatal )
42
+ @datadir = Pathname( __FILE__ ).dirname.parent + 'data'
43
+ end
44
+
45
+ after( :all ) do
46
+ reset_logging()
47
+ end
48
+
49
+ TEST_NUMERICOID = '1.12.3.8.16.1.1.5'
50
+ TEST_DESCR = 'objectClass'
51
+ TEST_OIDLIST = %:( #{TEST_DESCR} $ objectCaste $ #{TEST_NUMERICOID} ) :
52
+
53
+ it "can parse the schema structure returned from LDAP::Conn#schema" do
54
+ schema_dumpfile = @datadir + 'schema.yml'
55
+ hash = YAML.load_file( schema_dumpfile )
56
+ schemahash = LDAP::Schema.new( hash )
57
+
58
+ schema = Treequel::Schema.new( schemahash )
59
+
60
+ schema.object_classes.should have( 298 ).members
61
+ schema.attribute_types.should have( 1085 ).members
62
+ schema.matching_rules.should have( 72 ).members
63
+ schema.matching_rule_uses.should have( 54 ).members
64
+ schema.ldap_syntaxes.should have( 31 ).members
65
+ end
66
+
67
+
68
+ it "can parse the schema structure returned from LDAP::Conn#schema even under $SAFE >= 1" do
69
+ schema_dumpfile = @datadir + 'schema.yml'
70
+ hash = YAML.load_file( schema_dumpfile )
71
+
72
+ schema = nil
73
+ Thread.new do
74
+ Thread.current.abort_on_exception = true
75
+ $SAFE = 1
76
+ schemahash = LDAP::Schema.new( hash )
77
+ schema = Treequel::Schema.new( schemahash )
78
+ end.join
79
+
80
+ schema.object_classes.should have( 298 ).members
81
+ schema.attribute_types.should have( 1085 ).members
82
+ schema.matching_rules.should have( 72 ).members
83
+ schema.matching_rule_uses.should have( 54 ).members
84
+ schema.ldap_syntaxes.should have( 31 ).members
85
+ end
86
+
87
+
88
+ it "can parse a valid oidlist" do
89
+ oids = Treequel::Schema.parse_oids( TEST_OIDLIST )
90
+ oids.should have(3).members
91
+ oids.should == [ :objectClass, :objectCaste, TEST_NUMERICOID ]
92
+ end
93
+
94
+ it "returns an empty Array if oidlist it's asked to parse is nil" do
95
+ Treequel::Schema.parse_oids( nil ).should == []
96
+ end
97
+
98
+ it "raises an exception if it's asked to parse an invalid oidlist" do
99
+ expect do
100
+ Treequel::Schema.parse_oids( %Q{my name is Jorma, I'm the sensitive one} )
101
+ end.to raise_error( Treequel::ParseError, /oidlist/i )
102
+ end
103
+
104
+
105
+ it "keeps a numeric OID as a String when parsing it" do
106
+ Treequel::Schema.parse_oid( TEST_NUMERICOID ).should be_a( String )
107
+ Treequel::Schema.parse_oid( TEST_NUMERICOID ).should == TEST_NUMERICOID
108
+ end
109
+
110
+ it "transforms a named OID as a Symbol when parsing it" do
111
+ Treequel::Schema.parse_oid( TEST_DESCR ).should be_a( Symbol )
112
+ Treequel::Schema.parse_oid( TEST_DESCR ).should == TEST_DESCR.to_sym
113
+ end
114
+
115
+ end
116
+
117
+
118
+ # vim: set nosta noet ts=4 sw=4:
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ BEGIN {
4
+ require 'pathname'
5
+ basedir = Pathname.new( __FILE__ ).dirname.parent.parent
6
+
7
+ libdir = basedir + "lib"
8
+
9
+ $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
10
+ }
11
+
12
+ begin
13
+ require 'spec'
14
+ require 'spec/lib/constants'
15
+ require 'spec/lib/helpers'
16
+
17
+ require 'treequel'
18
+ require 'treequel/utils'
19
+ rescue LoadError
20
+ unless Object.const_defined?( :Gem )
21
+ require 'rubygems'
22
+ retry
23
+ end
24
+ raise
25
+ end
26
+
27
+
28
+ include Treequel::TestConstants
29
+ # include Treequel::Constants
30
+
31
+ #####################################################################
32
+ ### C O N T E X T S
33
+ #####################################################################
34
+
35
+ describe Treequel, "utilities" do
36
+ include Treequel::SpecHelpers
37
+
38
+ before( :all ) do
39
+ setup_logging( :fatal )
40
+ end
41
+
42
+ after( :all ) do
43
+ reset_logging()
44
+ end
45
+
46
+ end
47
+
48
+
49
+ # vim: set nosta noet ts=4 sw=4:
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ BEGIN {
4
+ require 'pathname'
5
+ basedir = Pathname.new( __FILE__ ).dirname.parent
6
+
7
+ libdir = basedir + "lib"
8
+
9
+ $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
10
+ }
11
+
12
+ begin
13
+ require 'spec'
14
+ require 'spec/lib/constants'
15
+ require 'spec/lib/helpers'
16
+
17
+ require 'treequel'
18
+ require 'treequel/directory'
19
+ rescue LoadError
20
+ unless Object.const_defined?( :Gem )
21
+ require 'rubygems'
22
+ retry
23
+ end
24
+ raise
25
+ end
26
+
27
+
28
+ include Treequel::TestConstants
29
+
30
+
31
+ #####################################################################
32
+ ### C O N T E X T S
33
+ #####################################################################
34
+
35
+ describe Treequel do
36
+ include Treequel::SpecHelpers
37
+
38
+ before( :all ) do
39
+ reset_logging()
40
+ end
41
+
42
+ it "should know if its default logger is replaced" do
43
+ Treequel.reset_logger
44
+ Treequel.should be_using_default_logger
45
+ Treequel.logger = Logger.new( $stderr )
46
+ Treequel.should_not be_using_default_logger
47
+ end
48
+
49
+
50
+ it "returns a version string if asked" do
51
+ Treequel.version_string.should =~ /\w+ [\d.]+/
52
+ end
53
+
54
+
55
+ it "returns a version string with a build number if asked" do
56
+ Treequel.version_string(true).should =~ /\w+ [\d.]+ \(build rev.*\)/
57
+ end
58
+
59
+
60
+ it "provides a convenience method for creating directory objects" do
61
+ Treequel::Directory.should_receive( :new ).and_return( :a_directory )
62
+ Treequel.directory.should == :a_directory
63
+ end
64
+
65
+ it "accepts an LDAP url as the argument to the directory convenience method" do
66
+ Treequel::Directory.should_receive( :new ).
67
+ with({ :host => 'ldap.example.com', :base_dn => 'dc=example,dc=com', :port => 389 }).
68
+ and_return( :a_directory )
69
+ Treequel.directory( 'ldap://ldap.example.com/dc=example,dc=com' ).should == :a_directory
70
+ end
71
+
72
+ it "raises an exception if #directory is called with a non-ldap URL" do
73
+ lambda {
74
+ Treequel.directory( 'http://example.com/' )
75
+ }.should raise_error( ArgumentError, /ldap url/i )
76
+ end
77
+
78
+ it "accepts an options hash as the argument to the directory convenience method" do
79
+ opts = { :host => 'ldap.example.com', :base_dn => 'dc=example,dc=com' }
80
+ Treequel::Directory.should_receive( :new ).with( opts ).
81
+ and_return( :a_directory )
82
+ Treequel.directory( opts ).should == :a_directory
83
+ end
84
+
85
+ it "can build an options hash from an LDAP URL" do
86
+ Treequel.make_options_from_uri( 'ldap://ldap.example.com/dc=example,dc=com' ).should ==
87
+ { :host => 'ldap.example.com', :base_dn => 'dc=example,dc=com', :port => 389 }
88
+ end
89
+
90
+ it "can build an options hash from an LDAPS URL" do
91
+ Treequel.make_options_from_uri( 'ldaps://ldap.example.com/dc=example,dc=com' ).should ==
92
+ { :host => 'ldap.example.com', :base_dn => 'dc=example,dc=com', :port => 636, :connect_type => :ssl }
93
+ end
94
+
95
+ it "can build an options hash from an LDAP URL without a host" do
96
+ Treequel.make_options_from_uri( 'ldap:///dc=example,dc=com' ).should ==
97
+ { :base_dn => 'dc=example,dc=com', :port => 389 }
98
+ end
99
+
100
+ # [?<attrs>[?<scope>[?<filter>[?<extensions>]]]]
101
+ it "can build an options hash from an LDAP URL with extra stuff" do
102
+ uri = 'ldap:///dc=example,dc=com?uid=jrandom,ou=People?l?one?!bindname=cn=auth'
103
+ Treequel.make_options_from_uri( uri ).should ==
104
+ { :base_dn => 'dc=example,dc=com', :port => 389 }
105
+ end
106
+
107
+ it "accepts a combination of URL and options hash as the argument to the directory " +
108
+ "convenience method" do
109
+ uri = 'ldap://ldap.example.com/dc=example,dc=com'
110
+ user_dn = 'cn=admin,dc=example,dc=com'
111
+ pass = 'a:password!'
112
+ options_hash = {
113
+ :host => 'ldap.example.com',
114
+ :base_dn => 'dc=example,dc=com',
115
+ :port => 389,
116
+ :connect_type => :plain,
117
+ :bind_dn => user_dn,
118
+ :pass => pass,
119
+ }
120
+
121
+ Treequel::Directory.should_receive( :new ).
122
+ with( options_hash ).
123
+ and_return( :a_directory )
124
+
125
+ Treequel.directory( uri, :bind_dn => user_dn, :pass => pass, :connect_type => :plain )
126
+ end
127
+
128
+
129
+ describe " logging subsystem" do
130
+ before(:each) do
131
+ Treequel.reset_logger
132
+ end
133
+
134
+ after(:each) do
135
+ Treequel.reset_logger
136
+ end
137
+
138
+
139
+ it "has the default logger instance after being reset" do
140
+ Treequel.logger.should equal( Treequel.default_logger )
141
+ end
142
+
143
+ it "has the default log formatter instance after being reset" do
144
+ Treequel.logger.formatter.should equal( Treequel.default_log_formatter )
145
+ end
146
+
147
+ end
148
+
149
+
150
+ describe " logging subsystem with new defaults" do
151
+ before( :all ) do
152
+ @original_logger = Treequel.default_logger
153
+ @original_log_formatter = Treequel.default_log_formatter
154
+ end
155
+
156
+ after( :all ) do
157
+ Treequel.default_logger = @original_logger
158
+ Treequel.default_log_formatter = @original_log_formatter
159
+ end
160
+
161
+
162
+ it "uses the new defaults when the logging subsystem is reset" do
163
+ logger = mock( "dummy logger", :null_object => true )
164
+ formatter = mock( "dummy logger" )
165
+
166
+ Treequel.default_logger = logger
167
+ Treequel.default_log_formatter = formatter
168
+
169
+ logger.should_receive( :formatter= ).with( formatter )
170
+
171
+ Treequel.reset_logger
172
+ Treequel.logger.should equal( logger )
173
+ end
174
+
175
+ end
176
+
177
+ end
178
+
179
+ # vim: set nosta noet ts=4 sw=4:
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: treequel
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Granger, Mahlon E. Smith
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-13 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ruby-ldap
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.9.9
24
+ version:
25
+ description: |-
26
+ A library for interacting with LDAP (modeled after Sequel). It is an attempt to remove
27
+ the impedence mismatch of trying to treat LDAP as if it's a relational database, and
28
+ instead embrace its hierarchical, free-form nature.
29
+ email:
30
+ - ged@FaerieMUD.org
31
+ - mahlon@martini.nu
32
+ executables:
33
+ - treeirb
34
+ - treequel
35
+ extensions: []
36
+
37
+ extra_rdoc_files:
38
+ - ChangeLog
39
+ - README
40
+ - LICENSE
41
+ files:
42
+ - Rakefile
43
+ - ChangeLog
44
+ - README
45
+ - LICENSE
46
+ - spec/treequel/branch_spec.rb
47
+ - spec/treequel/branchcollection_spec.rb
48
+ - spec/treequel/branchset_spec.rb
49
+ - spec/treequel/directory_spec.rb
50
+ - spec/treequel/filter_spec.rb
51
+ - spec/treequel/mixins_spec.rb
52
+ - spec/treequel/schema/attributetype_spec.rb
53
+ - spec/treequel/schema/ldapsyntax_spec.rb
54
+ - spec/treequel/schema/matchingrule_spec.rb
55
+ - spec/treequel/schema/matchingruleuse_spec.rb
56
+ - spec/treequel/schema/objectclass_spec.rb
57
+ - spec/treequel/schema_spec.rb
58
+ - spec/treequel/utils_spec.rb
59
+ - spec/treequel_spec.rb
60
+ - spec/lib/constants.rb
61
+ - spec/lib/helpers.rb
62
+ - bin/treeirb
63
+ - bin/treequel
64
+ - lib/treequel/branch.rb
65
+ - lib/treequel/branchcollection.rb
66
+ - lib/treequel/branchset.rb
67
+ - lib/treequel/constants.rb
68
+ - lib/treequel/directory.rb
69
+ - lib/treequel/exceptions.rb
70
+ - lib/treequel/filter.rb
71
+ - lib/treequel/mixins.rb
72
+ - lib/treequel/schema/attributetype.rb
73
+ - lib/treequel/schema/ldapsyntax.rb
74
+ - lib/treequel/schema/matchingrule.rb
75
+ - lib/treequel/schema/matchingruleuse.rb
76
+ - lib/treequel/schema/objectclass.rb
77
+ - lib/treequel/schema.rb
78
+ - lib/treequel/sequel_integration.rb
79
+ - lib/treequel/utils.rb
80
+ - lib/treequel.rb
81
+ - rake/191_compat.rb
82
+ - rake/dependencies.rb
83
+ - rake/helpers.rb
84
+ - rake/hg.rb
85
+ - rake/manual.rb
86
+ - rake/packaging.rb
87
+ - rake/publishing.rb
88
+ - rake/rdoc.rb
89
+ - rake/style.rb
90
+ - rake/svn.rb
91
+ - rake/testing.rb
92
+ - rake/verifytask.rb
93
+ - rake/win32.rb
94
+ - ./examples/company-directory.rb
95
+ - ./examples/ldap-monitor.rb
96
+ - ./examples/ldap_state.rb
97
+ - ./examples/ldap-monitor/views/backends.erb
98
+ - ./examples/ldap-monitor/views/connections.erb
99
+ - ./examples/ldap-monitor/views/databases.erb
100
+ - ./examples/ldap-monitor/views/dump_subsystem.erb
101
+ - ./examples/ldap-monitor/views/index.erb
102
+ - ./examples/ldap-monitor/views/layout.erb
103
+ - ./examples/ldap-monitor/views/listeners.erb
104
+ - ./examples/ldap-monitor/public/css/master.css
105
+ - ./examples/ldap-monitor/public/images/card_small.png
106
+ - ./examples/ldap-monitor/public/images/chain_small.png
107
+ - ./examples/ldap-monitor/public/images/globe_small.png
108
+ - ./examples/ldap-monitor/public/images/globe_small_green.png
109
+ - ./examples/ldap-monitor/public/images/plug.png
110
+ - ./examples/ldap-monitor/public/images/shadows/large-30-down.png
111
+ - ./examples/ldap-monitor/public/images/tick.png
112
+ - ./examples/ldap-monitor/public/images/tick_circle.png
113
+ - ./examples/ldap-monitor/public/images/treequel-favicon.png
114
+ - Rakefile.local
115
+ has_rdoc: true
116
+ homepage: http://deveiate.org/projects/Treequel
117
+ licenses: []
118
+
119
+ post_install_message:
120
+ rdoc_options:
121
+ - -w
122
+ - "4"
123
+ - -HN
124
+ - -i
125
+ - .
126
+ - -m
127
+ - README
128
+ - -t
129
+ - treequel
130
+ - -W
131
+ - http://deveiate.org/projects/Treequel/browser/
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: "0"
139
+ version:
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: "0"
145
+ version:
146
+ requirements:
147
+ - ldap >=0
148
+ rubyforge_project: treequel
149
+ rubygems_version: 1.3.5
150
+ signing_key:
151
+ specification_version: 3
152
+ summary: An honest LDAP library
153
+ test_files:
154
+ - spec/treequel/branch_spec.rb
155
+ - spec/treequel/branchcollection_spec.rb
156
+ - spec/treequel/branchset_spec.rb
157
+ - spec/treequel/directory_spec.rb
158
+ - spec/treequel/filter_spec.rb
159
+ - spec/treequel/mixins_spec.rb
160
+ - spec/treequel/schema/attributetype_spec.rb
161
+ - spec/treequel/schema/ldapsyntax_spec.rb
162
+ - spec/treequel/schema/matchingrule_spec.rb
163
+ - spec/treequel/schema/matchingruleuse_spec.rb
164
+ - spec/treequel/schema/objectclass_spec.rb
165
+ - spec/treequel/schema_spec.rb
166
+ - spec/treequel/utils_spec.rb
167
+ - spec/treequel_spec.rb
168
+ - spec/lib/constants.rb
169
+ - spec/lib/helpers.rb