treequel 1.8.6 → 1.9.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.
- data.tar.gz.sig +0 -0
- data/ChangeLog +36 -1
- data/History.rdoc +6 -0
- data/Manifest.txt +0 -1
- data/README.rdoc +9 -7
- data/Rakefile +3 -0
- data/lib/treequel.rb +25 -55
- data/lib/treequel/branch.rb +6 -2
- data/lib/treequel/branchcollection.rb +10 -6
- data/lib/treequel/branchset.rb +4 -1
- data/lib/treequel/directory.rb +8 -4
- data/lib/treequel/filter.rb +36 -24
- data/lib/treequel/mixins.rb +5 -58
- data/lib/treequel/model.rb +7 -2
- data/lib/treequel/model/errors.rb +6 -2
- data/lib/treequel/schema.rb +5 -2
- data/lib/treequel/schema/attributetype.rb +7 -3
- data/lib/treequel/schema/ldapsyntax.rb +6 -3
- data/lib/treequel/schema/matchingrule.rb +6 -3
- data/lib/treequel/schema/matchingruleuse.rb +7 -3
- data/lib/treequel/schema/objectclass.rb +8 -3
- data/lib/treequel/schema/table.rb +6 -2
- data/spec/lib/helpers.rb +4 -91
- data/spec/treequel/directory_spec.rb +8 -21
- data/spec/treequel/mixins_spec.rb +4 -14
- data/spec/treequel_spec.rb +8 -52
- metadata +119 -40
- metadata.gz.sig +1 -1
- data/lib/treequel/utils.rb +0 -179
data/lib/treequel/mixins.rb
CHANGED
@@ -149,64 +149,11 @@ module Treequel
|
|
149
149
|
### Add logging to a Treequel class. Including classes get #log and #log_debug methods.
|
150
150
|
module Loggable
|
151
151
|
|
152
|
-
###
|
153
|
-
###
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
def initialize( klass, force_debug=false )
|
158
|
-
@classname = klass.name
|
159
|
-
@force_debug = force_debug
|
160
|
-
end
|
161
|
-
|
162
|
-
### Delegate debug messages to the global logger with the appropriate class name.
|
163
|
-
def debug( msg=nil, &block )
|
164
|
-
Treequel.logger.add( Logger::DEBUG, msg, @classname, &block )
|
165
|
-
end
|
166
|
-
|
167
|
-
### Delegate info messages to the global logger with the appropriate class name.
|
168
|
-
def info( msg=nil, &block )
|
169
|
-
return self.debug( msg, &block ) if @force_debug
|
170
|
-
Treequel.logger.add( Logger::INFO, msg, @classname, &block )
|
171
|
-
end
|
172
|
-
|
173
|
-
### Delegate warn messages to the global logger with the appropriate class name.
|
174
|
-
def warn( msg=nil, &block )
|
175
|
-
return self.debug( msg, &block ) if @force_debug
|
176
|
-
Treequel.logger.add( Logger::WARN, msg, @classname, &block )
|
177
|
-
end
|
178
|
-
|
179
|
-
### Delegate error messages to the global logger with the appropriate class name.
|
180
|
-
def error( msg=nil, &block )
|
181
|
-
return self.debug( msg, &block ) if @force_debug
|
182
|
-
Treequel.logger.add( Logger::ERROR, msg, @classname, &block )
|
183
|
-
end
|
184
|
-
|
185
|
-
### Delegate fatal messages to the global logger with the appropriate class name.
|
186
|
-
def fatal( msg=nil, &block )
|
187
|
-
Treequel.logger.add( Logger::FATAL, msg, @classname, &block )
|
188
|
-
end
|
189
|
-
|
190
|
-
end # ClassNameProxy
|
191
|
-
|
192
|
-
#########
|
193
|
-
protected
|
194
|
-
#########
|
195
|
-
|
196
|
-
### Copy constructor -- clear the original's log proxy.
|
197
|
-
def initialize_copy( original )
|
198
|
-
@log_proxy = @log_debug_proxy = nil
|
199
|
-
super
|
200
|
-
end
|
201
|
-
|
202
|
-
### Return the proxied logger.
|
203
|
-
def log
|
204
|
-
@log_proxy ||= ClassNameProxy.new( self.class )
|
205
|
-
end
|
206
|
-
|
207
|
-
### Return a proxied "debug" logger that ignores other level specification.
|
208
|
-
def log_debug
|
209
|
-
@log_debug_proxy ||= ClassNameProxy.new( self.class, true )
|
152
|
+
### Inclusion callback -- extend including modules with Loggability instead for
|
153
|
+
### backward-compatibility.
|
154
|
+
def self::included( mod )
|
155
|
+
mod.extend( Loggability )
|
156
|
+
mod.log_to( :treequel )
|
210
157
|
end
|
211
158
|
|
212
159
|
end # module Loggable
|
data/lib/treequel/model.rb
CHANGED
@@ -10,17 +10,22 @@ require 'treequel/branchset'
|
|
10
10
|
|
11
11
|
# An object interface to LDAP entries.
|
12
12
|
class Treequel::Model < Treequel::Branch
|
13
|
+
extend Loggability
|
14
|
+
|
13
15
|
require 'treequel/model/objectclass'
|
14
16
|
require 'treequel/model/errors'
|
15
17
|
require 'treequel/model/schemavalidations'
|
16
18
|
|
17
|
-
include Treequel::
|
18
|
-
Treequel::Constants,
|
19
|
+
include Treequel::Constants,
|
19
20
|
Treequel::Normalization,
|
20
21
|
Treequel::Constants::Patterns,
|
21
22
|
Treequel::Model::SchemaValidations
|
22
23
|
|
23
24
|
|
25
|
+
# Loggability API -- Log to the Treequel module's logger
|
26
|
+
log_to :treequel
|
27
|
+
|
28
|
+
|
24
29
|
# A prototype Hash that autovivifies its members as Sets, for use in
|
25
30
|
# the objectclass_registry and the base_registry
|
26
31
|
SET_HASH = Hash.new {|h,k| h[k] = Set.new }
|
@@ -33,8 +33,12 @@ require 'treequel/constants'
|
|
33
33
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
34
34
|
#
|
35
35
|
class Treequel::Model::Errors < ::Hash
|
36
|
-
|
37
|
-
|
36
|
+
extend Loggability
|
37
|
+
include Treequel::HashUtilities
|
38
|
+
|
39
|
+
# Loggability API -- Log to the Treequel module's logger
|
40
|
+
log_to :treequel
|
41
|
+
|
38
42
|
|
39
43
|
# The word to use between attributes in error messages
|
40
44
|
ATTRIBUTE_CONJUNCTION = ' and '
|
data/lib/treequel/schema.rb
CHANGED
@@ -22,8 +22,11 @@ require 'treequel/mixins'
|
|
22
22
|
# Please see the file LICENSE in the base directory for licensing details.
|
23
23
|
#
|
24
24
|
class Treequel::Schema
|
25
|
-
|
26
|
-
|
25
|
+
extend Loggability
|
26
|
+
include Treequel::Constants::Patterns
|
27
|
+
|
28
|
+
# Loggability API -- Log to the Treequel module's logger
|
29
|
+
log_to :treequel
|
27
30
|
|
28
31
|
require 'treequel/schema/table'
|
29
32
|
require 'treequel/schema/objectclass'
|
@@ -22,11 +22,15 @@ require 'treequel/exceptions'
|
|
22
22
|
# Please see the file LICENSE in the base directory for licensing details.
|
23
23
|
#
|
24
24
|
class Treequel::Schema::AttributeType
|
25
|
-
include Treequel::
|
26
|
-
Treequel::Normalization,
|
25
|
+
include Treequel::Normalization,
|
27
26
|
Treequel::Constants::Patterns
|
28
27
|
|
29
|
-
extend
|
28
|
+
extend Loggability,
|
29
|
+
Treequel::AttributeDeclarations
|
30
|
+
|
31
|
+
# Loggability API -- Log to the Treequel module's logger
|
32
|
+
log_to :treequel
|
33
|
+
|
30
34
|
|
31
35
|
# Regex for splitting a syntax OID from its length specifier
|
32
36
|
OID_SPLIT_PATTERN = /
|
@@ -10,10 +10,13 @@ require 'treequel/exceptions'
|
|
10
10
|
|
11
11
|
# This is a class for representing ldapSyntax declarations in a Treequel::Schema.
|
12
12
|
class Treequel::Schema::LDAPSyntax
|
13
|
-
include Treequel::
|
14
|
-
|
13
|
+
include Treequel::Constants::Patterns
|
14
|
+
extend Loggability,
|
15
|
+
Treequel::AttributeDeclarations
|
15
16
|
|
16
|
-
|
17
|
+
|
18
|
+
# Loggability API -- Log to the Treequel module's logger
|
19
|
+
log_to :treequel
|
17
20
|
|
18
21
|
|
19
22
|
#############################################################
|
@@ -10,10 +10,13 @@ require 'treequel/exceptions'
|
|
10
10
|
|
11
11
|
# This is a class for representing matchingRule declarations in a Treequel::Schema.
|
12
12
|
class Treequel::Schema::MatchingRule
|
13
|
-
include Treequel::
|
14
|
-
|
13
|
+
include Treequel::Constants::Patterns
|
14
|
+
extend Loggability,
|
15
|
+
Treequel::AttributeDeclarations
|
15
16
|
|
16
|
-
|
17
|
+
|
18
|
+
# Loggability API -- Log to the Treequel module's logger
|
19
|
+
log_to :treequel
|
17
20
|
|
18
21
|
|
19
22
|
#############################################################
|
@@ -10,10 +10,14 @@ require 'treequel/exceptions'
|
|
10
10
|
|
11
11
|
# This is a class for representing matchingRuleUse declarations in a Treequel::Schema.
|
12
12
|
class Treequel::Schema::MatchingRuleUse
|
13
|
-
include Treequel::
|
14
|
-
Treequel::Constants::Patterns
|
13
|
+
include Treequel::Constants::Patterns
|
15
14
|
|
16
|
-
extend
|
15
|
+
extend Loggability,
|
16
|
+
Treequel::AttributeDeclarations
|
17
|
+
|
18
|
+
|
19
|
+
# Loggability API -- Log to the Treequel module's logger
|
20
|
+
log_to :treequel
|
17
21
|
|
18
22
|
|
19
23
|
#############################################################
|
@@ -29,12 +29,17 @@ class Treequel::Schema
|
|
29
29
|
|
30
30
|
### objectClass entries in a Treequel::Schema.
|
31
31
|
class ObjectClass
|
32
|
-
include Treequel::
|
33
|
-
Treequel::Constants::Patterns
|
32
|
+
include Treequel::Constants::Patterns
|
34
33
|
|
35
|
-
extend
|
34
|
+
extend Loggability,
|
35
|
+
Treequel::AttributeDeclarations
|
36
36
|
|
37
37
|
|
38
|
+
# Loggability API -- Log to the Treequel module's logger
|
39
|
+
log_to :treequel
|
40
|
+
|
41
|
+
|
42
|
+
# Hide the constructor
|
38
43
|
private_class_method :new
|
39
44
|
|
40
45
|
# The 'kind' of objectClasses which don't specify a 'kind' explicitly
|
@@ -12,12 +12,16 @@ require 'treequel/mixins'
|
|
12
12
|
# This is an object that is used to store LDAP schema information in a
|
13
13
|
# case-insensitive table.
|
14
14
|
class Treequel::Schema::Table
|
15
|
-
extend Forwardable
|
15
|
+
extend Forwardable,
|
16
|
+
Loggability
|
16
17
|
include Enumerable,
|
17
|
-
Treequel::Loggable,
|
18
18
|
Treequel::Normalization,
|
19
19
|
Treequel::Constants::Patterns
|
20
20
|
|
21
|
+
# Loggability API -- Log to the Treequel module's logger
|
22
|
+
log_to :treequel
|
23
|
+
|
24
|
+
|
21
25
|
# The list of methods that should be delegated through the key-normalization
|
22
26
|
# method.
|
23
27
|
KEYED_METHODS = [ :"[]", :"[]=", :delete, :fetch, :key?, :has_key?, :include?,
|
data/spec/lib/helpers.rb
CHANGED
@@ -28,73 +28,13 @@ require 'treequel'
|
|
28
28
|
require 'spec/lib/constants'
|
29
29
|
require 'spec/lib/matchers'
|
30
30
|
|
31
|
-
|
32
|
-
require 'irb'
|
33
|
-
require 'irb/completion'
|
34
|
-
|
35
|
-
module IRB # :nodoc:
|
36
|
-
def self.start_session( obj )
|
37
|
-
unless @__initialized
|
38
|
-
args = ARGV
|
39
|
-
ARGV.replace( ARGV.dup )
|
40
|
-
IRB.setup( nil )
|
41
|
-
ARGV.replace( args )
|
42
|
-
@__initialized = true
|
43
|
-
end
|
44
|
-
|
45
|
-
workspace = WorkSpace.new( obj )
|
46
|
-
irb = Irb.new( workspace )
|
47
|
-
|
48
|
-
@CONF[:IRB_RC].call( irb.context ) if @CONF[:IRB_RC]
|
49
|
-
@CONF[:MAIN_CONTEXT] = irb.context
|
50
|
-
|
51
|
-
begin
|
52
|
-
prevhandler = Signal.trap( 'INT' ) do
|
53
|
-
irb.signal_handle
|
54
|
-
end
|
55
|
-
|
56
|
-
catch( :IRB_EXIT ) do
|
57
|
-
irb.eval_input
|
58
|
-
end
|
59
|
-
ensure
|
60
|
-
Signal.trap( 'INT', prevhandler )
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
31
|
+
require 'loggability/spechelpers'
|
65
32
|
|
66
33
|
|
67
34
|
### RSpec helper functions.
|
68
35
|
module Treequel::SpecHelpers
|
69
36
|
include Treequel::TestConstants
|
70
37
|
|
71
|
-
class ArrayLogger
|
72
|
-
### Create a new ArrayLogger that will append content to +array+.
|
73
|
-
def initialize( array )
|
74
|
-
@array = array
|
75
|
-
end
|
76
|
-
|
77
|
-
### Write the specified +message+ to the array.
|
78
|
-
def write( message )
|
79
|
-
@array << message
|
80
|
-
end
|
81
|
-
|
82
|
-
### No-op -- this is here just so Logger doesn't complain
|
83
|
-
def close; end
|
84
|
-
|
85
|
-
end # class ArrayLogger
|
86
|
-
|
87
|
-
|
88
|
-
unless defined?( LEVEL )
|
89
|
-
LEVEL = {
|
90
|
-
:debug => Logger::DEBUG,
|
91
|
-
:info => Logger::INFO,
|
92
|
-
:warn => Logger::WARN,
|
93
|
-
:error => Logger::ERROR,
|
94
|
-
:fatal => Logger::FATAL,
|
95
|
-
}
|
96
|
-
end
|
97
|
-
|
98
38
|
###############
|
99
39
|
module_function
|
100
40
|
###############
|
@@ -105,35 +45,6 @@ module Treequel::SpecHelpers
|
|
105
45
|
end
|
106
46
|
|
107
47
|
|
108
|
-
### Reset the logging subsystem to its default state.
|
109
|
-
def reset_logging
|
110
|
-
Treequel.reset_logger
|
111
|
-
end
|
112
|
-
|
113
|
-
|
114
|
-
### Alter the output of the default log formatter to be pretty in SpecMate output
|
115
|
-
def setup_logging( level=Logger::FATAL )
|
116
|
-
|
117
|
-
# Turn symbol-style level config into Logger's expected Fixnum level
|
118
|
-
if Treequel::LOG_LEVELS.key?( level.to_s )
|
119
|
-
level = Treequel::LOG_LEVELS[ level.to_s ]
|
120
|
-
end
|
121
|
-
|
122
|
-
logger = Logger.new( $stderr )
|
123
|
-
Treequel.logger = logger
|
124
|
-
Treequel.logger.level = level
|
125
|
-
|
126
|
-
# Only do this when executing from a spec in TextMate
|
127
|
-
if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
|
128
|
-
Thread.current['logger-output'] = []
|
129
|
-
logdevice = ArrayLogger.new( Thread.current['logger-output'] )
|
130
|
-
Treequel.logger = Logger.new( logdevice )
|
131
|
-
# Treequel.logger.level = level
|
132
|
-
Treequel.logger.formatter = Treequel::HtmlLogFormatter.new( logger )
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
|
137
48
|
### Make a Treequel::Directory that will use the given +conn+ object as its
|
138
49
|
### LDAP connection. Also pre-loads the schema object and fixtures some other
|
139
50
|
### external data.
|
@@ -176,7 +87,8 @@ abort "You need a version of RSpec >= 2.6.0" unless defined?( RSpec )
|
|
176
87
|
|
177
88
|
### Mock with RSpec
|
178
89
|
RSpec.configure do |c|
|
179
|
-
include Treequel::TestConstants
|
90
|
+
include Treequel::TestConstants,
|
91
|
+
Loggability::SpecHelpers
|
180
92
|
|
181
93
|
c.mock_with :rspec
|
182
94
|
|
@@ -185,6 +97,7 @@ RSpec.configure do |c|
|
|
185
97
|
c.include( Treequel::TestConstants )
|
186
98
|
c.include( Treequel::SpecHelpers )
|
187
99
|
c.include( Treequel::Matchers )
|
100
|
+
c.include( Loggability::SpecHelpers )
|
188
101
|
|
189
102
|
c.treat_symbols_as_metadata_keys_with_true_values = true
|
190
103
|
|
@@ -150,15 +150,8 @@ describe Treequel::Directory do
|
|
150
150
|
describe "instances with a connection" do
|
151
151
|
|
152
152
|
before( :each ) do
|
153
|
-
@
|
154
|
-
|
155
|
-
@dir = Treequel::Directory.new( @options )
|
153
|
+
@dir = Treequel.directory( TEST_LDAPURI )
|
156
154
|
@dir.instance_variable_set( :@conn, @conn )
|
157
|
-
|
158
|
-
@schema = mock( "Directory schema" )
|
159
|
-
@conn.stub( :schema ).and_return( :the_schema )
|
160
|
-
Treequel::Schema.stub( :new ).with( :the_schema ).and_return( @schema )
|
161
|
-
@schema.stub( :attribute_types ).and_return({ :cn => :a_value, :ou => :a_value })
|
162
155
|
end
|
163
156
|
|
164
157
|
it "can bind with the given user DN and password" do
|
@@ -359,7 +352,7 @@ describe Treequel::Directory do
|
|
359
352
|
@conn.stub( :search_ext2 ).and_raise( LDAP::ResultError.new("Can't contact LDAP server") )
|
360
353
|
|
361
354
|
second_conn = mock( "LDAP connection", :set_option => true, :bound? => false )
|
362
|
-
LDAP::
|
355
|
+
LDAP::SSLConn.should_receive( :new ).and_return( second_conn )
|
363
356
|
second_conn.should_receive( :search_ext2 ).and_return([])
|
364
357
|
|
365
358
|
already_tried_reconnect = false
|
@@ -374,7 +367,7 @@ describe Treequel::Directory do
|
|
374
367
|
end
|
375
368
|
|
376
369
|
it "re-raises an exception rescued during a reconnect as a RuntimeError" do
|
377
|
-
LDAP::
|
370
|
+
LDAP::SSLConn.should_receive( :new ).
|
378
371
|
and_raise( LDAP::ResultError.new("Can't contact LDAP server") )
|
379
372
|
|
380
373
|
expect {
|
@@ -384,6 +377,10 @@ describe Treequel::Directory do
|
|
384
377
|
|
385
378
|
|
386
379
|
it "doesn't retain its connection when duplicated" do
|
380
|
+
LDAP::SSLConn.stub( :new ).and_return do
|
381
|
+
mock( "LDAP connection", :set_option => true, :bound? => false )
|
382
|
+
end
|
383
|
+
|
387
384
|
@dir.dup.conn.should_not equal( @dir.conn )
|
388
385
|
end
|
389
386
|
|
@@ -469,25 +466,15 @@ describe Treequel::Directory do
|
|
469
466
|
end
|
470
467
|
|
471
468
|
it "can fetch the server's schema" do
|
472
|
-
@
|
473
|
-
Treequel::Schema.should_receive( :new ).with( :the_schema ).
|
474
|
-
and_return( :the_parsed_schema )
|
475
|
-
@dir.schema.should == :the_parsed_schema
|
469
|
+
@dir.schema.should be_a( Treequel::Schema )
|
476
470
|
end
|
477
471
|
|
478
472
|
it "creates branches for messages that match valid attributeType OIDs" do
|
479
|
-
@schema.should_receive( :attribute_types ).
|
480
|
-
and_return({ :cn => :a_value, :ou => :a_value })
|
481
|
-
|
482
|
-
@dir.stub( :bound? ).and_return( false )
|
483
473
|
rval = @dir.ou( :people )
|
484
474
|
rval.dn.downcase.should == TEST_PEOPLE_DN.downcase
|
485
475
|
end
|
486
476
|
|
487
477
|
it "doesn't create branches for messages that don't match valid attributeType OIDs" do
|
488
|
-
@schema.should_receive( :attribute_types ).
|
489
|
-
and_return({ :cn => :a_value, :ou => :a_value })
|
490
|
-
|
491
478
|
expect { @dir.void('sbc') }.to raise_error( NoMethodError )
|
492
479
|
end
|
493
480
|
|
@@ -32,8 +32,9 @@ describe Treequel, "mixin" do
|
|
32
32
|
|
33
33
|
describe Treequel::Loggable, "mixed into a class" do
|
34
34
|
before(:each) do
|
35
|
-
@
|
36
|
-
Treequel.logger
|
35
|
+
@log_output = []
|
36
|
+
Treequel.logger.output_to( @log_output )
|
37
|
+
Treequel.logger.level = :debug
|
37
38
|
|
38
39
|
@test_class = Class.new do
|
39
40
|
include Treequel::Loggable
|
@@ -41,10 +42,6 @@ describe Treequel, "mixin" do
|
|
41
42
|
def log_test_message( level, msg )
|
42
43
|
self.log.send( level, msg )
|
43
44
|
end
|
44
|
-
|
45
|
-
def logdebug_test_message( msg )
|
46
|
-
self.log_debug.debug( msg )
|
47
|
-
end
|
48
45
|
end
|
49
46
|
@obj = @test_class.new
|
50
47
|
end
|
@@ -52,14 +49,7 @@ describe Treequel, "mixin" do
|
|
52
49
|
|
53
50
|
it "is able to output to the log via its #log method" do
|
54
51
|
@obj.log_test_message( :debug, "debugging message" )
|
55
|
-
@
|
56
|
-
@logfile.read.should =~ /debugging message/
|
57
|
-
end
|
58
|
-
|
59
|
-
it "is able to output to the log via its #log_debug method" do
|
60
|
-
@obj.logdebug_test_message( "sexydrownwatch" )
|
61
|
-
@logfile.rewind
|
62
|
-
@logfile.read.should =~ /sexydrownwatch/
|
52
|
+
@log_output.last.should =~ /debugging message/i
|
63
53
|
end
|
64
54
|
end
|
65
55
|
|