treequel 1.0.0

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.
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