treequel 1.7.0 → 1.7.1
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/History.rdoc +9 -0
- data/README.rdoc +0 -23
- data/lib/treequel.rb +2 -2
- data/lib/treequel/filter.rb +12 -6
- data/lib/treequel/model.rb +43 -33
- data/lib/treequel/model/errors.rb +1 -0
- data/spec/treequel/filter_spec.rb +4 -0
- data/spec/treequel/model/schemavalidations_spec.rb +6 -4
- data/spec/treequel/model_spec.rb +43 -14
- metadata +180 -137
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== v1.7.1 [2011-11-28] Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
- Modified filter expressions to eliminate unnecessary ORing
|
4
|
+
- Efficiency fixes for Treequel::Model#modifications (delete/add -> replace)
|
5
|
+
- Fixing missing DN attribute/s on Treequel::Model objects created via
|
6
|
+
attribute traversal methods.
|
7
|
+
- Log errors added during validation at ERROR level
|
8
|
+
|
9
|
+
|
1
10
|
== v1.7.0 [2011-11-09] Michael Granger <ged@FaerieMUD.org>
|
2
11
|
|
3
12
|
- Treat Treequel::Model#[]= with a nil value on a SINGLE-VALUE
|
data/README.rdoc
CHANGED
@@ -12,29 +12,6 @@ It's inspired by and modeled after [Sequel](http://sequel.rubyforge.org/), a
|
|
12
12
|
kick-ass database library.
|
13
13
|
|
14
14
|
|
15
|
-
== Examples
|
16
|
-
|
17
|
-
Here are a few short examples to whet your appetite:
|
18
|
-
|
19
|
-
# Connect to the directory at the specified URL
|
20
|
-
dir = Treequel.directory( 'ldap://ldap.company.com/dc=company,dc=com' )
|
21
|
-
|
22
|
-
# Get a list of email addresses of every person in the directory (as
|
23
|
-
# long as people are under ou=people)
|
24
|
-
dir.ou( :people ).filter( :mail ).map( :mail ).flatten
|
25
|
-
|
26
|
-
# Get a list of all IP addresses for all hosts in any ou=hosts group
|
27
|
-
# in the whole directory:
|
28
|
-
dir.filter( :ou => :hosts ).collection.filter( :ipHostNumber ).
|
29
|
-
map( :ipHostNumber ).flatten
|
30
|
-
|
31
|
-
# Get all people in the directory in the form of a hash of names
|
32
|
-
# keyed by email addresses
|
33
|
-
dir.ou( :people ).filter( :mail ).to_hash( :mail, :cn )
|
34
|
-
|
35
|
-
More elaborate examples of real-world usage can be found
|
36
|
-
{in the examples/ directory}[http://deveiate.org/projects/Treequel/browser/examples]
|
37
|
-
in the distribution.
|
38
15
|
|
39
16
|
|
40
17
|
== Contributing
|
data/lib/treequel.rb
CHANGED
@@ -26,10 +26,10 @@ end
|
|
26
26
|
module Treequel
|
27
27
|
|
28
28
|
# Library version
|
29
|
-
VERSION = '1.7.
|
29
|
+
VERSION = '1.7.1'
|
30
30
|
|
31
31
|
# VCS revision
|
32
|
-
REVISION = %q$Revision:
|
32
|
+
REVISION = %q$Revision: d2ba344f87e8 $
|
33
33
|
|
34
34
|
# Common paths for ldap.conf
|
35
35
|
COMMON_LDAP_CONF_PATHS = %w[
|
data/lib/treequel/filter.rb
CHANGED
@@ -499,13 +499,18 @@ class Treequel::Filter
|
|
499
499
|
filterlist = expression.collect do |key, expr|
|
500
500
|
Treequel.logger.debug " adding %p => %p to the filter list" % [ key, expr ]
|
501
501
|
if expr.respond_to?( :fetch )
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
502
|
+
if expr.respond_to?( :length ) && expr.length > 1
|
503
|
+
Treequel.logger.debug " ORing together %d subfilters since %p has indices" %
|
504
|
+
[ expr.length, expr ]
|
505
|
+
subfilters = expr.collect {|val| Treequel::Filter.new(key, val) }
|
506
|
+
Treequel::Filter.new( :or, subfilters )
|
507
|
+
else
|
508
|
+
Treequel.logger.debug " unwrapping singular subfilter"
|
509
|
+
Treequel::Filter.new([ key.to_sym, expr.first ])
|
510
|
+
end
|
506
511
|
else
|
507
512
|
Treequel.logger.debug " value is a scalar; creating a single filter"
|
508
|
-
Treequel::Filter.new(
|
513
|
+
Treequel::Filter.new( key.to_sym, expr )
|
509
514
|
end
|
510
515
|
end
|
511
516
|
|
@@ -655,8 +660,9 @@ class Treequel::Filter
|
|
655
660
|
|
656
661
|
### Create a new Treequel::Branchset::Filter with the specified +expression+.
|
657
662
|
def initialize( *expression_parts )
|
663
|
+
self.log.debug "New filter for expression: %p" % [ expression_parts ]
|
658
664
|
@component = self.class.parse_expression( expression_parts )
|
659
|
-
self.log.debug "
|
665
|
+
self.log.debug " expression parsed into component: %p" % [ @component ]
|
660
666
|
|
661
667
|
super()
|
662
668
|
end
|
data/lib/treequel/model.rb
CHANGED
@@ -212,7 +212,7 @@ class Treequel::Model < Treequel::Branch
|
|
212
212
|
@dirty = false
|
213
213
|
else
|
214
214
|
super( directory, dn )
|
215
|
-
@values = entry ?
|
215
|
+
@values = symbolify_keys( entry ? entry : self.rdn_attributes )
|
216
216
|
@dirty = true
|
217
217
|
end
|
218
218
|
|
@@ -233,6 +233,12 @@ class Treequel::Model < Treequel::Branch
|
|
233
233
|
public
|
234
234
|
######
|
235
235
|
|
236
|
+
attr_reader :values
|
237
|
+
|
238
|
+
# Unsaved attribute values hash
|
239
|
+
attr_reader :values
|
240
|
+
|
241
|
+
|
236
242
|
### Set up the empty hook methods
|
237
243
|
HOOKS.each do |hook|
|
238
244
|
define_method( hook ) do |*args|
|
@@ -406,42 +412,46 @@ class Treequel::Model < Treequel::Branch
|
|
406
412
|
self.log.debug "Gathering modifications..."
|
407
413
|
|
408
414
|
mods = []
|
409
|
-
entry = self.entry || {}
|
410
|
-
self.log.debug " directory entry is: %p" % [ entry ]
|
411
|
-
|
412
415
|
@values.sort_by {|k, _| k.to_s }.each do |attribute, vals|
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
attrmods[:delete] << change.old_element
|
429
|
-
elsif change.deleting?
|
430
|
-
attrmods[:delete] << change.old_element
|
431
|
-
# else
|
432
|
-
# self.log.debug " no mod necessary for %p" % [ change.action ]
|
433
|
-
end
|
434
|
-
end
|
416
|
+
self.log.debug " finding mods for %s" % [ attribute ]
|
417
|
+
mods += self.diff_with_entry( attribute, vals )
|
418
|
+
end
|
419
|
+
|
420
|
+
return mods
|
421
|
+
end
|
422
|
+
|
423
|
+
|
424
|
+
### Diff the specified +values+ for the given +attribute+ against those in the directory
|
425
|
+
### entry and return LDAP::Mod objects for any differences.
|
426
|
+
def diff_with_entry( attribute, values )
|
427
|
+
mods = []
|
428
|
+
attribute = attribute.to_s
|
429
|
+
entry = self.entry || {}
|
430
|
+
entry_values = entry.key?( attribute ) ? entry[attribute] : []
|
435
431
|
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
432
|
+
values = Array( values ).compact.
|
433
|
+
collect {|val| self.get_converted_attribute(attribute, val) }
|
434
|
+
self.log.debug " comparing %s values to entry: %p vs. %p" %
|
435
|
+
[ attribute, values, entry_values ]
|
436
|
+
|
437
|
+
Diff::LCS.sdiff( entry_values.sort, values.sort ) do |change|
|
438
|
+
if change.adding?
|
439
|
+
self.log.debug " found an addition: %p" % [ change ]
|
440
|
+
mods << LDAP::Mod.new( LDAP::LDAP_MOD_ADD, attribute, [change.new_element] )
|
441
|
+
|
442
|
+
elsif change.changed?
|
443
|
+
self.log.debug " found a modification: %p" % [ change ]
|
444
|
+
mods << LDAP::Mod.new( LDAP::LDAP_MOD_REPLACE, attribute,
|
445
|
+
[change.old_element, change.new_element] )
|
446
|
+
|
447
|
+
elsif change.deleting?
|
448
|
+
self.log.debug " found a deletion: %p" % [ change ]
|
449
|
+
mods << LDAP::Mod.new( LDAP::LDAP_MOD_DELETE, attribute, [change.old_element] )
|
450
|
+
end
|
442
451
|
end
|
443
452
|
|
444
|
-
self.log.debug "
|
453
|
+
self.log.debug " attribute %p has modifications: %p" %
|
454
|
+
[ attribute, mods ] unless mods.empty?
|
445
455
|
|
446
456
|
return mods
|
447
457
|
end
|
@@ -123,6 +123,10 @@ describe Treequel::Filter do
|
|
123
123
|
should == '(|(uid=lar)(uid=bin)(uid=fon)(uid=guh))'
|
124
124
|
end
|
125
125
|
|
126
|
+
it "doesn't make an OR-hash if the expression is singular" do
|
127
|
+
Treequel::Filter.new( :uid => ['lar'] ).to_s.should == '(uid=lar)'
|
128
|
+
end
|
129
|
+
|
126
130
|
it "correctly includes OR subfilters in a Hash if the value is an Array" do
|
127
131
|
fstr = Treequel::Filter.new( :objectClass => 'inetOrgPerson', :uid => %w[lar bin fon guh] ).to_s
|
128
132
|
|
@@ -47,9 +47,11 @@ describe Treequel::Model::SchemaValidations do
|
|
47
47
|
|
48
48
|
it "adds an error if the object doesn't have at least one structural objectClass" do
|
49
49
|
@conn.stub( :search_ext2 ).and_return( [] )
|
50
|
-
@modelobj.object_class =
|
51
|
-
@modelobj.cn = '
|
52
|
-
@modelobj.
|
50
|
+
@modelobj.object_class = :posixAccount
|
51
|
+
@modelobj.cn = 'jrandom'
|
52
|
+
@modelobj.uid_number = 2881
|
53
|
+
@modelobj.gid_number = 761
|
54
|
+
@modelobj.home_directory = '/home/jrandom'
|
53
55
|
|
54
56
|
@modelobj.should_not be_valid()
|
55
57
|
@modelobj.errors.should have( 1 ).member
|
@@ -59,7 +61,7 @@ describe Treequel::Model::SchemaValidations do
|
|
59
61
|
|
60
62
|
it "adds an error if the object doesn't have at least one value for all of its MUST attributes" do
|
61
63
|
@conn.stub( :search_ext2 ).and_return( [] )
|
62
|
-
@modelobj.object_class =
|
64
|
+
@modelobj.object_class = [:person, :uidObject]
|
63
65
|
|
64
66
|
@modelobj.should_not be_valid()
|
65
67
|
@modelobj.errors.should have( 2 ).members
|
data/spec/treequel/model_spec.rb
CHANGED
@@ -308,6 +308,37 @@ describe Treequel::Model do
|
|
308
308
|
end
|
309
309
|
|
310
310
|
|
311
|
+
describe "created via attribute transition from their parent" do
|
312
|
+
|
313
|
+
before( :each ) do
|
314
|
+
@entry = TEST_HOSTS_ENTRY.dup
|
315
|
+
@parent = Treequel::Model.new_from_entry( @entry, @directory )
|
316
|
+
end
|
317
|
+
|
318
|
+
|
319
|
+
it "has its RDN attributes set when it's a simple RDN" do
|
320
|
+
@conn.stub( :search_ext2 ).
|
321
|
+
with( "cn=wafflebreaker,#{TEST_HOSTS_DN}", LDAP::LDAP_SCOPE_BASE, "(objectClass=*)").
|
322
|
+
and_return( [] )
|
323
|
+
|
324
|
+
host = @parent.cn( :wafflebreaker )
|
325
|
+
host.object_class = :ipHost
|
326
|
+
host.cn.should == ['wafflebreaker']
|
327
|
+
end
|
328
|
+
|
329
|
+
it "has its RDN attributes set when it's a multi-value RDN" do
|
330
|
+
@conn.stub( :search_ext2 ).
|
331
|
+
with( "cn=wiffle+l=downtown,#{TEST_HOSTS_DN}", LDAP::LDAP_SCOPE_BASE, "(objectClass=*)").
|
332
|
+
and_return( [] )
|
333
|
+
|
334
|
+
host = @parent.cn( :wiffle, :l => 'downtown' )
|
335
|
+
host.object_class = :ipHost
|
336
|
+
|
337
|
+
host.cn.should == ['wiffle']
|
338
|
+
host.l.should == ['downtown']
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
311
342
|
describe "objects loaded from entries" do
|
312
343
|
|
313
344
|
before( :each ) do
|
@@ -501,9 +532,8 @@ describe Treequel::Model do
|
|
501
532
|
result = @obj.modifications
|
502
533
|
|
503
534
|
result.should be_an( Array )
|
504
|
-
result.should have(
|
505
|
-
result.should include(
|
506
|
-
result.should include( ldap_mod_delete 'uid', 'slappy' )
|
535
|
+
result.should have( 1 ).members
|
536
|
+
result.should include( ldap_mod_replace 'uid', 'slappy', 'slippy' )
|
507
537
|
end
|
508
538
|
|
509
539
|
it "reverts the attribute if its #revert method is called" do
|
@@ -519,8 +549,7 @@ describe Treequel::Model do
|
|
519
549
|
|
520
550
|
it "updates the modified attribute when saved" do
|
521
551
|
@conn.should_receive( :modify ).
|
522
|
-
with( TEST_PERSON_DN,
|
523
|
-
[ ldap_mod_delete(:uid, 'slappy'), ldap_mod_add(:uid, 'slippy') ] )
|
552
|
+
with( TEST_PERSON_DN, [ldap_mod_replace(:uid, 'slappy', 'slippy')] )
|
524
553
|
@obj.save
|
525
554
|
end
|
526
555
|
|
@@ -606,15 +635,13 @@ describe Treequel::Model do
|
|
606
635
|
result = @obj.modifications
|
607
636
|
|
608
637
|
result.should be_an( Array )
|
609
|
-
result.should have(
|
610
|
-
result.should include(
|
611
|
-
result.should include(
|
612
|
-
result.should include(
|
613
|
-
|
614
|
-
result.should include( ldap_mod_delete :displayName, 'Slappy the Frog' )
|
615
|
-
result.should include( ldap_mod_add :displayName, 'Fappy the Bear' )
|
616
|
-
result.should include( ldap_mod_add :description, 'The new mascot.' )
|
638
|
+
result.should have( 6 ).members
|
639
|
+
result.should include( ldap_mod_replace :uid, 'slappy', 'fappy' )
|
640
|
+
result.should include( ldap_mod_replace :givenName, 'Slappy', 'Fappy' )
|
641
|
+
result.should include( ldap_mod_replace :displayName, 'Slappy the Frog',
|
642
|
+
'Fappy the Bear' )
|
617
643
|
result.should include( ldap_mod_delete :description, 'Alright.' )
|
644
|
+
result.should include( ldap_mod_add :description, 'The new mascot.' )
|
618
645
|
result.should include( ldap_mod_delete :l, 'a forest in England' )
|
619
646
|
|
620
647
|
end
|
@@ -674,7 +701,9 @@ describe Treequel::Model do
|
|
674
701
|
ldap_mod_add("gidNumber", "200"),
|
675
702
|
ldap_mod_add("homeDirectory", "/u/j/jrandom"),
|
676
703
|
ldap_mod_add("l", "a forest in England"),
|
677
|
-
ldap_mod_add("objectClass", "inetOrgPerson"
|
704
|
+
ldap_mod_add("objectClass", "inetOrgPerson"),
|
705
|
+
ldap_mod_add("objectClass", "person"),
|
706
|
+
ldap_mod_add("objectClass", "posixAccount"),
|
678
707
|
ldap_mod_add("sn", "Hacker"),
|
679
708
|
ldap_mod_add("uid", "jrandom"),
|
680
709
|
ldap_mod_add("uidNumber", "1121")
|
metadata
CHANGED
@@ -1,205 +1,231 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: treequel
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 9
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 7
|
9
|
+
- 1
|
10
|
+
version: 1.7.1
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Michael Granger
|
9
14
|
- Mahlon E. Smith
|
10
15
|
autorequire:
|
11
16
|
bindir: bin
|
12
|
-
cert_chain:
|
13
|
-
-
|
14
|
-
|
17
|
+
cert_chain:
|
18
|
+
- |
|
19
|
+
-----BEGIN CERTIFICATE-----
|
15
20
|
MIIDLDCCAhSgAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQwwCgYDVQQDDANnZWQx
|
16
|
-
|
17
21
|
FzAVBgoJkiaJk/IsZAEZFgdfYWVyaWVfMRMwEQYKCZImiZPyLGQBGRYDb3JnMB4X
|
18
|
-
|
19
22
|
DTEwMDkxNjE0NDg1MVoXDTExMDkxNjE0NDg1MVowPDEMMAoGA1UEAwwDZ2VkMRcw
|
20
|
-
|
21
23
|
FQYKCZImiZPyLGQBGRYHX2FlcmllXzETMBEGCgmSJomT8ixkARkWA29yZzCCASIw
|
22
|
-
|
23
24
|
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALy//BFxC1f/cPSnwtJBWoFiFrir
|
24
|
-
|
25
25
|
h7RicI+joq/ocVXQqI4TDWPyF/8tqkvt+rD99X9qs2YeR8CU/YiIpLWrQOYST70J
|
26
|
-
|
27
26
|
vDn7Uvhb2muFVqq6+vobeTkILBEO6pionWDG8jSbo3qKm1RjKJDwg9p4wNKhPuu8
|
28
|
-
|
29
27
|
KGue/BFb67KflqyApPmPeb3Vdd9clspzqeFqp7cUBMEpFS6LWxy4Gk+qvFFJBJLB
|
30
|
-
|
31
28
|
BUHE/LZVJMVzfpC5Uq+QmY7B+FH/QqNndn3tOHgsPadLTNimuB1sCuL1a4z3Pepd
|
32
|
-
|
33
29
|
TeLBEFmEao5Dk3K/Q8o8vlbIB/jBDTUx6Djbgxw77909x6gI9doU4LD5XMcCAwEA
|
34
|
-
|
35
30
|
AaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFJeoGkOr9l4B
|
36
|
-
|
37
31
|
+saMkW/ZXT4UeSvVMA0GCSqGSIb3DQEBBQUAA4IBAQBG2KObvYI2eHyyBUJSJ3jN
|
38
|
-
|
39
32
|
vEnU3d60znAXbrSd2qb3r1lY1EPDD3bcy0MggCfGdg3Xu54z21oqyIdk8uGtWBPL
|
40
|
-
|
41
33
|
HIa9EgfFGSUEgvcIvaYqiN4jTUtidfEFw+Ltjs8AP9gWgSIYS6Gr38V0WGFFNzIH
|
42
|
-
|
43
34
|
aOD2wmu9oo/RffW4hS/8GuvfMzcw7CQ355wFR4KB/nyze+EsZ1Y5DerCAagMVuDQ
|
44
|
-
|
45
35
|
U0BLmWDFzPGGWlPeQCrYHCr+AcJz+NRnaHCKLZdSKj/RHuTOt+gblRex8FAh8NeA
|
46
|
-
|
47
36
|
cmlhXe46pZNJgWKbxZah85jIjx95hR8vOI+NAM5iH9kOqK13DrxacTKPhqj5PjwF
|
48
|
-
|
49
37
|
-----END CERTIFICATE-----
|
50
38
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
- !ruby/object:Gem::Dependency
|
39
|
+
date: 2011-11-28 00:00:00 Z
|
40
|
+
dependencies:
|
41
|
+
- !ruby/object:Gem::Dependency
|
55
42
|
name: ruby-ldap
|
56
|
-
|
43
|
+
prerelease: false
|
44
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
57
45
|
none: false
|
58
|
-
requirements:
|
46
|
+
requirements:
|
59
47
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
hash: 25
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
- 9
|
53
|
+
version: "0.9"
|
62
54
|
type: :runtime
|
63
|
-
|
64
|
-
|
65
|
-
- !ruby/object:Gem::Dependency
|
55
|
+
version_requirements: *id001
|
56
|
+
- !ruby/object:Gem::Dependency
|
66
57
|
name: diff-lcs
|
67
|
-
|
58
|
+
prerelease: false
|
59
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
68
60
|
none: false
|
69
|
-
requirements:
|
61
|
+
requirements:
|
70
62
|
- - ~>
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 13
|
65
|
+
segments:
|
66
|
+
- 1
|
67
|
+
- 1
|
68
|
+
version: "1.1"
|
73
69
|
type: :runtime
|
74
|
-
|
75
|
-
|
76
|
-
- !ruby/object:Gem::Dependency
|
70
|
+
version_requirements: *id002
|
71
|
+
- !ruby/object:Gem::Dependency
|
77
72
|
name: hoe-mercurial
|
78
|
-
requirement: &70222008766400 !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
|
-
requirements:
|
81
|
-
- - ~>
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version: 1.3.1
|
84
|
-
type: :development
|
85
73
|
prerelease: false
|
86
|
-
|
87
|
-
- !ruby/object:Gem::Dependency
|
88
|
-
name: hoe-manualgen
|
89
|
-
requirement: &70222008782300 !ruby/object:Gem::Requirement
|
74
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
90
75
|
none: false
|
91
|
-
requirements:
|
76
|
+
requirements:
|
92
77
|
- - ~>
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 25
|
80
|
+
segments:
|
81
|
+
- 1
|
82
|
+
- 3
|
83
|
+
- 1
|
84
|
+
version: 1.3.1
|
95
85
|
type: :development
|
96
|
-
|
97
|
-
|
98
|
-
- !ruby/object:Gem::Dependency
|
86
|
+
version_requirements: *id003
|
87
|
+
- !ruby/object:Gem::Dependency
|
99
88
|
name: hoe-highline
|
100
|
-
|
89
|
+
prerelease: false
|
90
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
101
91
|
none: false
|
102
|
-
requirements:
|
92
|
+
requirements:
|
103
93
|
- - ~>
|
104
|
-
- !ruby/object:Gem::Version
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
hash: 29
|
96
|
+
segments:
|
97
|
+
- 0
|
98
|
+
- 0
|
99
|
+
- 1
|
105
100
|
version: 0.0.1
|
106
101
|
type: :development
|
107
|
-
|
108
|
-
|
109
|
-
- !ruby/object:Gem::Dependency
|
102
|
+
version_requirements: *id004
|
103
|
+
- !ruby/object:Gem::Dependency
|
110
104
|
name: rspec
|
111
|
-
|
105
|
+
prerelease: false
|
106
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
112
107
|
none: false
|
113
|
-
requirements:
|
108
|
+
requirements:
|
114
109
|
- - ~>
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
hash: 13
|
112
|
+
segments:
|
113
|
+
- 2
|
114
|
+
- 7
|
115
|
+
version: "2.7"
|
117
116
|
type: :development
|
118
|
-
|
119
|
-
|
120
|
-
- !ruby/object:Gem::Dependency
|
117
|
+
version_requirements: *id005
|
118
|
+
- !ruby/object:Gem::Dependency
|
121
119
|
name: ruby-termios
|
122
|
-
|
120
|
+
prerelease: false
|
121
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
123
122
|
none: false
|
124
|
-
requirements:
|
123
|
+
requirements:
|
125
124
|
- - ~>
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 25
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
- 9
|
130
|
+
version: "0.9"
|
128
131
|
type: :development
|
129
|
-
|
130
|
-
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
+
version_requirements: *id006
|
133
|
+
- !ruby/object:Gem::Dependency
|
132
134
|
name: ruby-terminfo
|
133
|
-
|
135
|
+
prerelease: false
|
136
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
134
137
|
none: false
|
135
|
-
requirements:
|
138
|
+
requirements:
|
136
139
|
- - ~>
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
hash: 9
|
142
|
+
segments:
|
143
|
+
- 0
|
144
|
+
- 1
|
145
|
+
version: "0.1"
|
139
146
|
type: :development
|
140
|
-
|
141
|
-
|
142
|
-
- !ruby/object:Gem::Dependency
|
147
|
+
version_requirements: *id007
|
148
|
+
- !ruby/object:Gem::Dependency
|
143
149
|
name: columnize
|
144
|
-
|
150
|
+
prerelease: false
|
151
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
145
152
|
none: false
|
146
|
-
requirements:
|
153
|
+
requirements:
|
147
154
|
- - ~>
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 13
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
- 3
|
160
|
+
version: "0.3"
|
150
161
|
type: :development
|
151
|
-
|
152
|
-
|
153
|
-
- !ruby/object:Gem::Dependency
|
162
|
+
version_requirements: *id008
|
163
|
+
- !ruby/object:Gem::Dependency
|
154
164
|
name: sysexits
|
155
|
-
|
165
|
+
prerelease: false
|
166
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
156
167
|
none: false
|
157
|
-
requirements:
|
168
|
+
requirements:
|
158
169
|
- - ~>
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
hash: 15
|
172
|
+
segments:
|
173
|
+
- 1
|
174
|
+
- 0
|
175
|
+
version: "1.0"
|
161
176
|
type: :development
|
162
|
-
|
163
|
-
|
164
|
-
- !ruby/object:Gem::Dependency
|
177
|
+
version_requirements: *id009
|
178
|
+
- !ruby/object:Gem::Dependency
|
165
179
|
name: sequel
|
166
|
-
|
180
|
+
prerelease: false
|
181
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
167
182
|
none: false
|
168
|
-
requirements:
|
183
|
+
requirements:
|
169
184
|
- - ~>
|
170
|
-
- !ruby/object:Gem::Version
|
171
|
-
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
hash: 47
|
187
|
+
segments:
|
188
|
+
- 3
|
189
|
+
- 20
|
190
|
+
version: "3.20"
|
172
191
|
type: :development
|
173
|
-
|
174
|
-
|
175
|
-
- !ruby/object:Gem::Dependency
|
192
|
+
version_requirements: *id010
|
193
|
+
- !ruby/object:Gem::Dependency
|
176
194
|
name: hoe
|
177
|
-
|
195
|
+
prerelease: false
|
196
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
178
197
|
none: false
|
179
|
-
requirements:
|
198
|
+
requirements:
|
180
199
|
- - ~>
|
181
|
-
- !ruby/object:Gem::Version
|
182
|
-
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
hash: 27
|
202
|
+
segments:
|
203
|
+
- 2
|
204
|
+
- 12
|
205
|
+
version: "2.12"
|
183
206
|
type: :development
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
nature.
|
189
|
-
|
190
|
-
|
207
|
+
version_requirements: *id011
|
208
|
+
description: |-
|
209
|
+
Treequel is an LDAP toolkit for Ruby. It is intended to allow quick, easy
|
210
|
+
access to LDAP directories in a manner consistent with LDAP's hierarchical,
|
211
|
+
free-form nature.
|
212
|
+
|
213
|
+
It's inspired by and modeled after [Sequel](http://sequel.rubyforge.org/), a
|
214
|
+
kick-ass database library.
|
215
|
+
email:
|
191
216
|
- ged@FaerieMUD.org
|
192
217
|
- mahlon@martini.nu
|
193
|
-
executables:
|
218
|
+
executables:
|
194
219
|
- treeirb
|
195
220
|
- treequel
|
196
221
|
- treewhat
|
197
222
|
extensions: []
|
198
|
-
|
223
|
+
|
224
|
+
extra_rdoc_files:
|
199
225
|
- Manifest.txt
|
200
226
|
- History.rdoc
|
201
227
|
- README.rdoc
|
202
|
-
files:
|
228
|
+
files:
|
203
229
|
- .gemtest
|
204
230
|
- ChangeLog
|
205
231
|
- History.rdoc
|
@@ -273,33 +299,50 @@ files:
|
|
273
299
|
- spec/treequel/schema_spec.rb
|
274
300
|
- spec/treequel_spec.rb
|
275
301
|
homepage: http://deveiate.org/projects/Treequel
|
276
|
-
licenses:
|
302
|
+
licenses:
|
277
303
|
- BSD
|
278
|
-
post_install_message:
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
304
|
+
post_install_message: |-
|
305
|
+
If you want to use the included 'treequel' LDAP shell, you'll need to install
|
306
|
+
the following libraries as well:
|
307
|
+
|
308
|
+
- ruby-termios
|
309
|
+
- ruby-terminfo
|
310
|
+
- columnize
|
311
|
+
- sysexits
|
312
|
+
|
313
|
+
You can install them automatically if you use the --development flag when
|
314
|
+
installing Treequel.
|
315
|
+
rdoc_options:
|
283
316
|
- --main
|
284
317
|
- README.rdoc
|
285
|
-
require_paths:
|
318
|
+
require_paths:
|
286
319
|
- lib
|
287
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
320
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
288
321
|
none: false
|
289
|
-
requirements:
|
290
|
-
- -
|
291
|
-
- !ruby/object:Gem::Version
|
322
|
+
requirements:
|
323
|
+
- - ">="
|
324
|
+
- !ruby/object:Gem::Version
|
325
|
+
hash: 57
|
326
|
+
segments:
|
327
|
+
- 1
|
328
|
+
- 8
|
329
|
+
- 7
|
292
330
|
version: 1.8.7
|
293
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
331
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
294
332
|
none: false
|
295
|
-
requirements:
|
296
|
-
- -
|
297
|
-
- !ruby/object:Gem::Version
|
298
|
-
|
333
|
+
requirements:
|
334
|
+
- - ">="
|
335
|
+
- !ruby/object:Gem::Version
|
336
|
+
hash: 3
|
337
|
+
segments:
|
338
|
+
- 0
|
339
|
+
version: "0"
|
299
340
|
requirements: []
|
341
|
+
|
300
342
|
rubyforge_project: treequel
|
301
343
|
rubygems_version: 1.8.11
|
302
344
|
signing_key:
|
303
345
|
specification_version: 3
|
304
346
|
summary: Treequel is an LDAP toolkit for Ruby
|
305
347
|
test_files: []
|
348
|
+
|
metadata.gz.sig
CHANGED
Binary file
|