treequel 1.1.1 → 1.2.0pre320

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 (44) hide show
  1. data.tar.gz.sig +0 -0
  2. data/ChangeLog +49 -1
  3. data/README.md +65 -0
  4. data/Rakefile +24 -19
  5. data/bin/treequel +20 -3
  6. data/lib/treequel.rb +3 -3
  7. data/lib/treequel/branch.rb +21 -7
  8. data/lib/treequel/branchset.rb +10 -0
  9. data/lib/treequel/model.rb +12 -2
  10. data/lib/treequel/schema.rb +1 -1
  11. data/rake/documentation.rb +9 -2
  12. data/rake/hg.rb +16 -3
  13. data/rake/manual.rb +1 -1
  14. data/rake/packaging.rb +1 -1
  15. data/rake/publishing.rb +158 -95
  16. data/rake/testing.rb +52 -88
  17. data/spec/lib/constants.rb +1 -0
  18. data/spec/lib/control_behavior.rb +7 -5
  19. data/spec/lib/helpers.rb +40 -17
  20. data/spec/lib/matchers.rb +2 -0
  21. data/spec/treequel/branch_spec.rb +44 -21
  22. data/spec/treequel/branchcollection_spec.rb +4 -3
  23. data/spec/treequel/branchset_spec.rb +42 -31
  24. data/spec/treequel/control_spec.rb +2 -1
  25. data/spec/treequel/controls/contentsync_spec.rb +2 -1
  26. data/spec/treequel/controls/pagedresults_spec.rb +4 -7
  27. data/spec/treequel/controls/sortedresults_spec.rb +4 -7
  28. data/spec/treequel/directory_spec.rb +11 -12
  29. data/spec/treequel/filter_spec.rb +7 -14
  30. data/spec/treequel/mixins_spec.rb +4 -9
  31. data/spec/treequel/model/objectclass_spec.rb +2 -1
  32. data/spec/treequel/model_spec.rb +16 -35
  33. data/spec/treequel/monkeypatches_spec.rb +12 -1
  34. data/spec/treequel/schema/attributetype_spec.rb +2 -1
  35. data/spec/treequel/schema/ldapsyntax_spec.rb +2 -1
  36. data/spec/treequel/schema/matchingrule_spec.rb +2 -1
  37. data/spec/treequel/schema/matchingruleuse_spec.rb +2 -1
  38. data/spec/treequel/schema/objectclass_spec.rb +2 -1
  39. data/spec/treequel/schema/table_spec.rb +2 -1
  40. data/spec/treequel/schema_spec.rb +2 -1
  41. data/spec/treequel_spec.rb +10 -2
  42. metadata +16 -17
  43. metadata.gz.sig +0 -0
  44. data/README +0 -66
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
 
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
  require 'spec/lib/control_behavior'
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
  require 'spec/lib/control_behavior'
@@ -18,8 +19,6 @@ require 'spec/lib/control_behavior'
18
19
  require 'treequel'
19
20
  require 'treequel/controls/pagedresults'
20
21
 
21
- include Treequel::TestConstants
22
- include Treequel::Constants
23
22
 
24
23
  #####################################################################
25
24
  ### C O N T E X T S
@@ -32,13 +31,11 @@ describe Treequel::PagedResultsControl do
32
31
  end
33
32
 
34
33
  before( :each ) do
35
- # Used by the shared behavior
36
- @control = Treequel::PagedResultsControl
37
34
  @branch = mock( "Branch", :dn => 'cn=example,dc=acme,dc=com' )
38
35
  @directory = mock( "Directory" )
39
36
 
40
- @branch.stub!( :directory ).and_return( @directory )
41
- @directory.stub!( :registered_controls ).and_return([ Treequel::PagedResultsControl ])
37
+ @branch.stub( :directory ).and_return( @directory )
38
+ @directory.stub( :registered_controls ).and_return([ Treequel::PagedResultsControl ])
42
39
  @branchset = Treequel::Branchset.new( @branch )
43
40
  end
44
41
 
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
  require 'spec/lib/control_behavior'
@@ -19,8 +20,6 @@ require 'treequel'
19
20
  require 'treequel/branchset'
20
21
  require 'treequel/controls/sortedresults'
21
22
 
22
- include Treequel::TestConstants
23
- include Treequel::Constants
24
23
 
25
24
  #####################################################################
26
25
  ### C O N T E X T S
@@ -33,13 +32,11 @@ describe Treequel::SortedResultsControl do
33
32
  end
34
33
 
35
34
  before( :each ) do
36
- # Used by the shared behavior
37
- @control = Treequel::SortedResultsControl
38
35
  @branch = mock( "Branch", :dn => 'cn=example,dc=acme,dc=com' )
39
36
  @directory = mock( "Directory" )
40
37
 
41
- @branch.stub!( :directory ).and_return( @directory )
42
- @directory.stub!( :registered_controls ).and_return([ Treequel::SortedResultsControl ])
38
+ @branch.stub( :directory ).and_return( @directory )
39
+ @directory.stub( :registered_controls ).and_return([ Treequel::SortedResultsControl ])
43
40
  @branchset = Treequel::Branchset.new( @branch )
44
41
 
45
42
  end
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
 
@@ -19,8 +20,6 @@ require 'treequel/branch'
19
20
  require 'treequel/control'
20
21
 
21
22
 
22
- include Treequel::TestConstants
23
- include Treequel::Constants
24
23
 
25
24
  #####################################################################
26
25
  ### C O N T E X T S
@@ -46,8 +45,8 @@ describe Treequel::Directory do
46
45
  :connect_type => :plain,
47
46
  }
48
47
  @conn = mock( "LDAP connection", :set_option => true, :bound? => false )
49
- LDAP::SSLConn.stub!( :new ).and_return( @conn )
50
- @conn.stub!( :root_dse ).and_return( nil )
48
+ LDAP::SSLConn.stub( :new ).and_return( @conn )
49
+ @conn.stub( :root_dse ).and_return( nil )
51
50
  end
52
51
 
53
52
 
@@ -82,7 +81,7 @@ describe Treequel::Directory do
82
81
 
83
82
  it "uses the first namingContext from the Root DSE if no base is specified" do
84
83
  conn = mock( "LDAP connection", :set_option => true )
85
- LDAP::Conn.stub!( :new ).and_return( conn )
84
+ LDAP::Conn.stub( :new ).and_return( conn )
86
85
  conn.should_receive( :root_dse ).and_return( TEST_DSE )
87
86
 
88
87
  @dir = Treequel::Directory.new( @options.merge(:base_dn => nil) )
@@ -151,9 +150,9 @@ describe Treequel::Directory do
151
150
  @dir.instance_variable_set( :@conn, @conn )
152
151
 
153
152
  @schema = mock( "Directory schema" )
154
- @conn.stub!( :schema ).and_return( :the_schema )
155
- Treequel::Schema.stub!( :new ).with( :the_schema ).and_return( @schema )
156
- @schema.stub!( :attribute_types ).and_return({ :cn => :a_value, :ou => :a_value })
153
+ @conn.stub( :schema ).and_return( :the_schema )
154
+ Treequel::Schema.stub( :new ).with( :the_schema ).and_return( @schema )
155
+ @schema.stub( :attribute_types ).and_return({ :cn => :a_value, :ou => :a_value })
157
156
  end
158
157
 
159
158
  it "can bind with the given user DN and password" do
@@ -303,7 +302,7 @@ describe Treequel::Directory do
303
302
  and_return( true )
304
303
  branch.should_receive( :respond_to? ).with( :dn ).
305
304
  and_return( true )
306
- branch.stub!( :include_operational_attrs? ).and_return( true )
305
+ branch.stub( :include_operational_attrs? ).and_return( true )
307
306
 
308
307
  found_branch1 = stub( "entry1 branch" )
309
308
  found_branch2 = stub( "entry2 branch" )
@@ -437,7 +436,7 @@ describe Treequel::Directory do
437
436
  @schema.should_receive( :attribute_types ).
438
437
  and_return({ :cn => :a_value, :ou => :a_value })
439
438
 
440
- @dir.stub!( :bound? ).and_return( false )
439
+ @dir.stub( :bound? ).and_return( false )
441
440
  rval = @dir.ou( :people )
442
441
  rval.dn.downcase.should == TEST_PEOPLE_DN.downcase
443
442
  end
@@ -541,7 +540,7 @@ describe Treequel::Directory do
541
540
 
542
541
 
543
542
  it "can move a record to a new dn within the same branch" do
544
- @dir.stub!( :bound? ).and_return( false )
543
+ @dir.stub( :bound? ).and_return( false )
545
544
  branch = mock( "sibling branch obj" )
546
545
  branch.should_receive( :dn ).at_least( :once ).and_return( TEST_PERSON_DN )
547
546
  branch.should_receive( :split_dn ).at_least( :once ).
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
 
@@ -404,39 +405,31 @@ describe Treequel::Filter do
404
405
  end
405
406
  end
406
407
 
407
- describe "support for Sequel expressions" do
408
+ describe "support for Sequel expressions", :sequel_integration => true do
408
409
 
409
410
  before( :each ) do
410
411
  pending "requires the 'sequel' library" unless Sequel.const_defined?( :Model )
411
412
  end
412
413
 
413
- it "supports the boolean expression syntax" do
414
- pending( "inequality operators don't work under 1.9.1" ) if
415
- vvec( RUBY_VERSION ) > vvec( '1.8.7' )
414
+ it "supports the boolean expression syntax", :ruby_1_8_only => true do
416
415
  filter = Treequel::Filter.new( :uid >= 2000 )
417
416
  filter.should be_a( Treequel::Filter )
418
417
  filter.to_s.should == '(uid>=2000)'
419
418
  end
420
419
 
421
- it "supports Sequel expressions in ANDed subexpressions" do
422
- pending( "inequality operators don't work under 1.9.1" ) if
423
- vvec( RUBY_VERSION ) > vvec( '1.8.7' )
420
+ it "supports Sequel expressions in ANDed subexpressions", :ruby_1_8_only => true do
424
421
  filter = Treequel::Filter.new( :and, [:uid >= 1024], [:uid <= 65535] )
425
422
  filter.should be_a( Treequel::Filter )
426
423
  filter.to_s.should == '(&(uid>=1024)(uid<=65535))'
427
424
  end
428
425
 
429
- it "advises user to use '>=' instead of '>' in expressions" do
430
- pending( "inequality operators don't work under 1.9.1" ) if
431
- vvec( RUBY_VERSION ) > vvec( '1.8.7' )
426
+ it "advises user to use '>=' instead of '>' in expressions", :ruby_1_8_only => true do
432
427
  expect {
433
428
  Treequel::Filter.new( :uid > 1024 )
434
429
  }.to raise_error( Treequel::ExpressionError, /greater-than-or-equal/i )
435
430
  end
436
431
 
437
- it "advises user to use '<=' instead of '<' in expressions" do
438
- pending( "inequality operators don't work under 1.9.1" ) if
439
- vvec( RUBY_VERSION ) > vvec( '1.8.7' )
432
+ it "advises user to use '<=' instead of '<' in expressions", :ruby_1_8_only => true do
440
433
  expect {
441
434
  Treequel::Filter.new( :activated < Time.now )
442
435
  }.to raise_error( Treequel::ExpressionError, /less-than-or-equal/i )
@@ -12,7 +12,8 @@ BEGIN {
12
12
  $LOAD_PATH.unshift( extdir ) unless $LOAD_PATH.include?( extdir )
13
13
  }
14
14
 
15
- require 'spec'
15
+ require 'rspec'
16
+
16
17
  require 'spec/lib/constants'
17
18
  require 'spec/lib/helpers'
18
19
 
@@ -249,10 +250,7 @@ describe Treequel, "mixin" do
249
250
  @obj.delegated_method( :arg1, :arg2 )
250
251
  end
251
252
 
252
- it "reports errors from its caller's perspective" do
253
- pending "doesn't work under 1.9, but may not be necessary" if
254
- vvec(RUBY_VERSION) > vvec('1.8.7')
255
-
253
+ it "reports errors from its caller's perspective", :ruby_1_8_only => true do
256
254
  begin
257
255
  @obj.erroring_delegated_method
258
256
  rescue NoMethodError => err
@@ -298,10 +296,7 @@ describe Treequel, "mixin" do
298
296
  @obj.delegated_method( :arg1, :arg2 )
299
297
  end
300
298
 
301
- it "reports errors from its caller's perspective" do
302
- pending "doesn't work under 1.9, but may not be necessary" if
303
- vvec(RUBY_VERSION) > vvec('1.8.7')
304
-
299
+ it "reports errors from its caller's perspective", :ruby_1_8_only => true do
305
300
  begin
306
301
  @obj.erroring_delegated_method
307
302
  rescue NoMethodError => err
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
  require 'spec/lib/matchers'
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17
  require 'spec/lib/matchers'
@@ -28,13 +29,9 @@ describe Treequel::Model do
28
29
  include Treequel::SpecHelpers,
29
30
  Treequel::Matchers
30
31
 
31
- SCHEMA_DUMPFILE = Pathname( __FILE__ ).dirname.parent + 'data' + 'schema.yml'
32
- SCHEMAHASH = LDAP::Schema.new( YAML.load_file(SCHEMA_DUMPFILE) )
33
32
 
34
33
  before( :all ) do
35
34
  setup_logging( :fatal )
36
-
37
- @schema = Treequel::Schema.new( SCHEMAHASH )
38
35
  end
39
36
 
40
37
  after( :all ) do
@@ -42,19 +39,12 @@ describe Treequel::Model do
42
39
  end
43
40
 
44
41
  before( :each ) do
45
- @top_oc = @schema.object_classes[:top]
46
- @iphost_oc = @schema.object_classes[:ipHost]
47
- @device_oc = @schema.object_classes[:device]
48
-
49
- @iphost_oc.stub!( :ancestors ).and_return([ @iphost_oc, @top_oc ])
50
- @device_oc.stub!( :ancestors ).and_return([ @device_oc, @top_oc ])
51
-
52
42
  @simple_entry = {
53
43
  'dn' => TEST_HOST_DN,
54
44
  'objectClass' => ['ipHost', 'device']
55
45
  }
56
- @directory = mock( "treequel directory", :schema => @schema )
57
- @directory.stub!( :convert_to_object ).and_return {|oid,value| value }
46
+ @conn = double( "LDAP connection", :set_option => true, :bound? => false )
47
+ @directory = get_fixtured_directory( @conn )
58
48
  end
59
49
 
60
50
  after( :each ) do
@@ -186,7 +176,7 @@ describe Treequel::Model do
186
176
  end
187
177
 
188
178
  obj = Treequel::Model.new( @directory, TEST_HOST_DN )
189
- @directory.stub!( :get_entry ).with( obj ).and_return( @simple_entry )
179
+ @directory.stub( :get_entry ).with( obj ).and_return( @simple_entry )
190
180
  obj.exists? # Trigger the lookup
191
181
 
192
182
  obj.should be_a( mixin1 )
@@ -201,7 +191,7 @@ describe Treequel::Model do
201
191
  model_objectclasses :ipHost
202
192
  end
203
193
 
204
- @directory.stub!( :get_entry ).and_return( nil )
194
+ @directory.stub( :get_entry ).and_return( nil )
205
195
  obj = Treequel::Model.new( @directory, TEST_HOST_DN )
206
196
  obj.exists? # Trigger the lookup
207
197
 
@@ -225,39 +215,30 @@ describe Treequel::Model do
225
215
  @entry = {
226
216
  'dn' => [TEST_PERSON_DN],
227
217
  'cn' => ['Slappy the Frog'],
228
- 'objectClass' => %w[
229
- ipHost
230
- ],
218
+ 'objectClass' => ['ipHost'],
231
219
  }
232
220
  end
233
221
 
234
222
  before( :each ) do
223
+ Treequel::Model.objectclass_registry.clear
224
+ Treequel::Model.base_registry.clear
225
+
235
226
  @mixin = Module.new do
236
227
  extend Treequel::Model::ObjectClass
237
228
  model_objectclasses :ipHost
238
229
  def fqdn; "some.home.example.com"; end
239
230
  end
240
- @directory.stub!( :convert_to_object ).with( Treequel::OIDS::OID_SYNTAX, 'ipHost' ).
241
- and_return( 'ipHost' )
242
- @directory.stub!( :convert_to_object ).
243
- with( Treequel::OIDS::DIRECTORY_STRING_SYNTAX, 'Slappy the Frog' ).
244
- and_return( 'Slappy the Frog' )
245
231
  @obj = Treequel::Model.new( @directory, TEST_PERSON_DN )
246
232
  end
247
233
 
248
- after( :each ) do
249
- Treequel::Model.objectclass_registry.clear
250
- Treequel::Model.base_registry.clear
251
- end
252
-
253
234
  it "correctly dispatches to methods added via extension that are called before its " +
254
235
  "entry is loaded" do
255
- @directory.stub!( :get_entry ).with( @obj ).and_return( @entry )
236
+ @directory.should_receive( :get_entry ).with( @obj ).at_least( :once ).and_return( @entry )
256
237
  @obj.fqdn.should == 'some.home.example.com'
257
238
  end
258
239
 
259
240
  it "correctly falls through for methods not added by loading the entry" do
260
- @directory.stub!( :get_entry ).with( @obj ).and_return( @entry )
241
+ @directory.should_receive( :get_entry ).with( @obj ).and_return( @entry )
261
242
  @obj.cn.should == ['Slappy the Frog']
262
243
  end
263
244
  end
@@ -388,7 +369,7 @@ describe Treequel::Model do
388
369
  end
389
370
 
390
371
  it "falls through to the default proxy method for invalid attributes" do
391
- @obj.stub!( :valid_attribute_type ).and_return( nil )
372
+ @obj.stub( :valid_attribute_type ).and_return( nil )
392
373
  @entry.should_not_receive( :[] )
393
374
 
394
375
  expect {
@@ -398,7 +379,7 @@ describe Treequel::Model do
398
379
 
399
380
  it "adds the objectClass attribute to the attribute list when executing a search that " +
400
381
  "contains a select" do
401
- @directory.stub!( :convert_to_object ).and_return {|oid,str| str }
382
+ @directory.stub( :convert_to_object ).and_return {|oid,str| str }
402
383
  @directory.should_receive( :search ).
403
384
  with( @obj, :scope, :filter, :selectattrs => ['cn', 'objectClass'] )
404
385
  @obj.search( :scope, :filter, :selectattrs => ['cn'] )
@@ -406,14 +387,14 @@ describe Treequel::Model do
406
387
 
407
388
  it "doesn't add the objectClass attribute to the attribute list when the search " +
408
389
  "doesn't contain a select" do
409
- @directory.stub!( :convert_to_object ).and_return {|oid,str| str }
390
+ @directory.stub( :convert_to_object ).and_return {|oid,str| str }
410
391
  @directory.should_receive( :search ).
411
392
  with( @obj, :scope, :filter, :selectattrs => [] )
412
393
  @obj.search( :scope, :filter, :selectattrs => [] )
413
394
  end
414
395
 
415
396
  it "knows which attribute methods it responds to" do
416
- @directory.stub!( :convert_to_object ).and_return {|oid,str| str }
397
+ @directory.stub( :convert_to_object ).and_return {|oid,str| str }
417
398
  @obj.should respond_to( :cn )
418
399
  @obj.should_not respond_to( :humpsize )
419
400
  end
@@ -11,7 +11,8 @@ BEGIN {
11
11
 
12
12
  require 'time'
13
13
 
14
- require 'spec'
14
+ require 'rspec'
15
+
15
16
  require 'spec/lib/constants'
16
17
  require 'spec/lib/helpers'
17
18
 
@@ -72,10 +73,20 @@ end # module Treequel::LDAPControlExtensions
72
73
 
73
74
  describe Treequel::TimeExtensions do
74
75
 
76
+ before( :all ) do
77
+ # Make the local timezone PDT so offsets show up correctly
78
+ @real_tz = ENV['TZ']
79
+ ENV['TZ'] = ':PST8PDT'
80
+ end
81
+
75
82
  before( :each ) do
76
83
  @time = Time.parse( "Fri Aug 20 08:21:35.1876455 -0700 2010" )
77
84
  end
78
85
 
86
+ after( :all ) do
87
+ ENV['TZ'] = @real_tz
88
+ end
89
+
79
90
  describe "RFC4517 LDAP Generalized Time method" do
80
91
 
81
92
  it "returns the time in 'Generalized Time' format" do
@@ -10,7 +10,8 @@ BEGIN {
10
10
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
11
  }
12
12
 
13
- require 'spec'
13
+ require 'rspec'
14
+
14
15
  require 'spec/lib/constants'
15
16
  require 'spec/lib/helpers'
16
17