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.tar.gz.sig
CHANGED
Binary file
|
data/ChangeLog
CHANGED
@@ -1,8 +1,43 @@
|
|
1
|
+
2012-05-22 Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
* .rvm.gems, .tm_properties, README.rdoc, lib/treequel.rb,
|
4
|
+
lib/treequel/branch.rb, lib/treequel/branchcollection.rb,
|
5
|
+
lib/treequel/branchset.rb, lib/treequel/directory.rb,
|
6
|
+
lib/treequel/filter.rb, lib/treequel/mixins.rb,
|
7
|
+
lib/treequel/model.rb, lib/treequel/model/errors.rb,
|
8
|
+
lib/treequel/schema.rb, lib/treequel/schema/attributetype.rb,
|
9
|
+
lib/treequel/schema/ldapsyntax.rb,
|
10
|
+
lib/treequel/schema/matchingrule.rb,
|
11
|
+
lib/treequel/schema/matchingruleuse.rb,
|
12
|
+
lib/treequel/schema/objectclass.rb, lib/treequel/schema/table.rb,
|
13
|
+
spec/lib/helpers.rb, spec/treequel/directory_spec.rb,
|
14
|
+
spec/treequel/mixins_spec.rb, spec/treequel_spec.rb:
|
15
|
+
Convert to Loggability for logging
|
16
|
+
[2e32ed84d899] [tip]
|
17
|
+
|
18
|
+
2012-04-16 Michael Granger <ged@FaerieMUD.org>
|
19
|
+
|
20
|
+
* README.rdoc, Rakefile:
|
21
|
+
Update README, use Fivefish if available.
|
22
|
+
[4dcbdee767aa]
|
23
|
+
|
1
24
|
2012-03-20 Michael Granger <ged@FaerieMUD.org>
|
2
25
|
|
26
|
+
* .hgtags:
|
27
|
+
Added tag v1.8.6 for changeset 85858da99269
|
28
|
+
[e1a894f09484]
|
29
|
+
|
30
|
+
* .hgsigs:
|
31
|
+
Added signature for changeset 4b71de99d5fd
|
32
|
+
[85858da99269] [v1.8.6]
|
33
|
+
|
34
|
+
* History.rdoc, Rakefile, lib/treequel.rb:
|
35
|
+
Bump the patch version, update History.
|
36
|
+
[4b71de99d5fd]
|
37
|
+
|
3
38
|
* experiments/spec-profile-r408f5fadc4c5.graffle:
|
4
39
|
Add spec profile
|
5
|
-
[654ba9e47642] [github/master
|
40
|
+
[654ba9e47642] [github/master]
|
6
41
|
|
7
42
|
* .hgignore, Manifest.txt, Rakefile, lib/treequel/constants.rb,
|
8
43
|
lib/treequel/directory.rb, spec/lib/helpers.rb,
|
data/History.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== v1.9.0 [2012-06-06] Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
- Convert to Loggability for logging
|
4
|
+
- Update README, use Fivefish if available.
|
5
|
+
|
6
|
+
|
1
7
|
== v1.8.6 [2012-03-20] Michael Granger <ged@FaerieMUD.org>
|
2
8
|
|
3
9
|
- Fix encoding of directory strings under Ruby 1.9 and newer versions
|
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -1,19 +1,21 @@
|
|
1
|
-
= Treequel
|
1
|
+
= Treequel
|
2
|
+
|
3
|
+
home :: http://deveiate.org/projects/Treequel
|
4
|
+
code :: http://repo.deveiate.org/Treequel
|
5
|
+
docs :: http://deveiate.org/code/treequel
|
6
|
+
github :: http://github.com/ged/treequel
|
2
7
|
|
3
|
-
* http://deveiate.org/projects/Treequel
|
4
8
|
|
5
9
|
== Description
|
6
10
|
|
7
11
|
Treequel is an LDAP toolkit for Ruby. It is intended to allow quick, easy
|
8
12
|
access to LDAP directories in a manner consistent with LDAP's hierarchical,
|
9
|
-
free-form nature.
|
13
|
+
free-form nature.
|
10
14
|
|
11
15
|
It's inspired by and modeled after {Sequel}[http://sequel.rubyforge.org/], a
|
12
16
|
kick-ass database library.
|
13
17
|
|
14
18
|
|
15
|
-
|
16
|
-
|
17
19
|
== Contributing
|
18
20
|
|
19
21
|
You can check out the current development source
|
@@ -27,7 +29,7 @@ You can submit bug reports, suggestions, and read more about future plans at
|
|
27
29
|
|
28
30
|
== License
|
29
31
|
|
30
|
-
Copyright (c) 2008-
|
32
|
+
Copyright (c) 2008-2012, Michael Granger and Mahlon E. Smith
|
31
33
|
All rights reserved.
|
32
34
|
|
33
35
|
Redistribution and use in source and binary forms, with or without
|
@@ -55,7 +57,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
55
57
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
56
58
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
57
59
|
|
58
|
-
This software includes some code from the Sequel database toolkit, used under
|
60
|
+
This software includes some code from the Sequel database toolkit, used under
|
59
61
|
the following license terms:
|
60
62
|
|
61
63
|
Copyright (c) 2007-2008 Sharon Rosner
|
data/Rakefile
CHANGED
@@ -19,6 +19,7 @@ hoespec = Hoe.spec 'treequel' do
|
|
19
19
|
self.readme_file = 'README.rdoc'
|
20
20
|
self.history_file = 'History.rdoc'
|
21
21
|
self.extra_rdoc_files = Rake::FileList[ '*.rdoc' ]
|
22
|
+
self.spec_extras[:rdoc_options] = ['-f', 'fivefish', '-t', 'Treequel']
|
22
23
|
|
23
24
|
self.need_tar = true
|
24
25
|
self.need_zip = true
|
@@ -31,6 +32,8 @@ hoespec = Hoe.spec 'treequel' do
|
|
31
32
|
else
|
32
33
|
self.dependency 'ruby-ldap', '~> 0.9'
|
33
34
|
end
|
35
|
+
self.dependency 'loggability', '~> 0.4'
|
36
|
+
|
34
37
|
self.dependency 'rspec', '~> 2.8', :developer
|
35
38
|
self.dependency 'ruby-termios', '~> 0.9', :developer
|
36
39
|
self.dependency 'ruby-terminfo', '~> 0.1', :developer
|
data/lib/treequel.rb
CHANGED
@@ -4,7 +4,7 @@ require 'ldap'
|
|
4
4
|
require 'ldap/schema'
|
5
5
|
require 'ldap/control'
|
6
6
|
|
7
|
-
require '
|
7
|
+
require 'loggability'
|
8
8
|
require 'pathname'
|
9
9
|
|
10
10
|
require 'uri'
|
@@ -24,12 +24,18 @@ end
|
|
24
24
|
|
25
25
|
# A library for interacting with LDAP modelled after Sequel[http://sequel.rubyforge.org/].
|
26
26
|
module Treequel
|
27
|
+
extend Loggability
|
28
|
+
|
29
|
+
|
30
|
+
# Loggability API -- set up a Logger for all Treequel-related logging
|
31
|
+
log_as :treequel
|
32
|
+
|
27
33
|
|
28
34
|
# Library version
|
29
|
-
VERSION = '1.
|
35
|
+
VERSION = '1.9.0'
|
30
36
|
|
31
37
|
# VCS revision
|
32
|
-
REVISION = %q$Revision:
|
38
|
+
REVISION = %q$Revision: 29134510ef85 $
|
33
39
|
|
34
40
|
# Common paths for ldap.conf
|
35
41
|
COMMON_LDAP_CONF_PATHS = %w[
|
@@ -60,58 +66,6 @@ module Treequel
|
|
60
66
|
end
|
61
67
|
|
62
68
|
|
63
|
-
#
|
64
|
-
# :section: Logging
|
65
|
-
#
|
66
|
-
|
67
|
-
# Log levels
|
68
|
-
LOG_LEVELS = {
|
69
|
-
'debug' => Logger::DEBUG,
|
70
|
-
'info' => Logger::INFO,
|
71
|
-
'warn' => Logger::WARN,
|
72
|
-
'error' => Logger::ERROR,
|
73
|
-
'fatal' => Logger::FATAL,
|
74
|
-
}.freeze
|
75
|
-
LOG_LEVEL_NAMES = LOG_LEVELS.invert.freeze
|
76
|
-
|
77
|
-
@default_logger = Logger.new( $stderr )
|
78
|
-
@default_logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
|
79
|
-
|
80
|
-
@default_log_formatter = Treequel::LogFormatter.new( @default_logger )
|
81
|
-
@default_logger.formatter = @default_log_formatter
|
82
|
-
|
83
|
-
@logger = @default_logger
|
84
|
-
|
85
|
-
|
86
|
-
class << self
|
87
|
-
# The log formatter that will be used when the logging subsystem is reset
|
88
|
-
attr_accessor :default_log_formatter
|
89
|
-
|
90
|
-
# The logger that will be used when the logging subsystem is reset
|
91
|
-
attr_accessor :default_logger
|
92
|
-
|
93
|
-
# The logger that's currently in effect
|
94
|
-
attr_accessor :logger
|
95
|
-
alias_method :log, :logger
|
96
|
-
alias_method :log=, :logger=
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
|
-
### Reset the global logger object to the default
|
101
|
-
def self::reset_logger
|
102
|
-
self.logger = self.default_logger
|
103
|
-
self.logger.level = Logger::WARN
|
104
|
-
self.logger.formatter = self.default_log_formatter
|
105
|
-
end
|
106
|
-
|
107
|
-
|
108
|
-
### Returns +true+ if the global logger has not been set to something other than
|
109
|
-
### the default one.
|
110
|
-
def self::using_default_logger?
|
111
|
-
return self.logger == self.default_logger
|
112
|
-
end
|
113
|
-
|
114
|
-
|
115
69
|
#
|
116
70
|
# :section:
|
117
71
|
#
|
@@ -318,6 +272,22 @@ module Treequel
|
|
318
272
|
end
|
319
273
|
|
320
274
|
|
275
|
+
### Reset the logger associated with Treequel. Backward-compatibility method.
|
276
|
+
def self::reset_logger
|
277
|
+
Treequel.logger = Treequel.default_logger
|
278
|
+
Treequel.logger.formatter = nil
|
279
|
+
Treequel.logger.output_to( $stderr )
|
280
|
+
Treequel.logger.level = :fatal
|
281
|
+
end
|
282
|
+
|
283
|
+
|
284
|
+
### Returns +true+ if the current logger for Treequel is the default one.
|
285
|
+
### Backward-compatibility method.
|
286
|
+
def self::using_default_logger?
|
287
|
+
return Loggability[ Treequel ] == Treequel.default_logger
|
288
|
+
end
|
289
|
+
|
290
|
+
|
321
291
|
# Now load the rest of the library
|
322
292
|
require 'treequel/exceptions'
|
323
293
|
require 'treequel/directory'
|
data/lib/treequel/branch.rb
CHANGED
@@ -15,15 +15,19 @@ require 'treequel/branchcollection'
|
|
15
15
|
# for the entries below itself, and how to search for those entries.
|
16
16
|
class Treequel::Branch
|
17
17
|
include Comparable,
|
18
|
-
Treequel::Loggable,
|
19
18
|
Treequel::Constants,
|
20
19
|
Treequel::Constants::Patterns,
|
21
20
|
Treequel::HashUtilities
|
22
21
|
|
23
|
-
extend
|
22
|
+
extend Loggability,
|
23
|
+
Treequel::Delegation,
|
24
24
|
Treequel::AttributeDeclarations
|
25
25
|
|
26
26
|
|
27
|
+
# Loggability API -- Log to the Treequel module's logger
|
28
|
+
log_to :treequel
|
29
|
+
|
30
|
+
|
27
31
|
# The default width of LDIF output
|
28
32
|
DEFAULT_LDIF_WIDTH = 70
|
29
33
|
|
@@ -12,29 +12,33 @@ require 'treequel/branch'
|
|
12
12
|
# A Treequel::BranchCollection is a union of Treequel::Branchset
|
13
13
|
# objects, suitable for performing operations on multiple branches
|
14
14
|
# of the directory at once.
|
15
|
-
#
|
15
|
+
#
|
16
16
|
# For example, if you have hosts under ou=Hosts in two different
|
17
17
|
# subdomains (e.g., acme.com, seattle.acme.com, and newyork.acme.com),
|
18
18
|
# and you want to search for a host by its CN, you could do so like
|
19
19
|
# this:
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# # Top-level hosts, and those in the 'seattle' subdomain, but not
|
22
22
|
# # those in the 'newyork' subdomain:
|
23
23
|
# west_coast_hosts = dir.ou( :hosts ) + dir.dc( :seattle ).ou( :hosts )
|
24
24
|
# west_coast_www_hosts = west_coast_hosts.filter( :cn => 'www' )
|
25
|
-
#
|
25
|
+
#
|
26
26
|
# # And one that includes hosts in all three DCs:
|
27
27
|
# all_hosts = west_coast_hosts + dir.dc( :newyork ).ou( :hosts )
|
28
28
|
# all_ns_hosts = all_hosts.filter( :cn => 'ns*' )
|
29
|
-
#
|
29
|
+
#
|
30
30
|
# Note that you could accomplish most of what BranchCollection does
|
31
31
|
# using filters, but some people might find this a bit more readable.
|
32
32
|
class Treequel::BranchCollection
|
33
33
|
include Enumerable,
|
34
|
-
Treequel::Loggable,
|
35
34
|
Treequel::Constants
|
36
35
|
|
37
|
-
extend
|
36
|
+
extend Loggability,
|
37
|
+
Treequel::Delegation
|
38
|
+
|
39
|
+
|
40
|
+
# Loggability API -- Log to the Treequel module's logger
|
41
|
+
log_to :treequel
|
38
42
|
|
39
43
|
|
40
44
|
#################################################################
|
data/lib/treequel/branchset.rb
CHANGED
@@ -43,11 +43,14 @@ require 'treequel/control'
|
|
43
43
|
# Branchsets are Enumerable objects, so they can be manipulated using any of the
|
44
44
|
# Enumerable methods, such as map, inject, etc.
|
45
45
|
class Treequel::Branchset
|
46
|
+
extend Loggability
|
46
47
|
include Enumerable,
|
47
|
-
Treequel::Loggable,
|
48
48
|
Treequel::Constants,
|
49
49
|
Treequel::Control
|
50
50
|
|
51
|
+
# Loggability API -- Log to the Treequel module's logger
|
52
|
+
log_to :treequel
|
53
|
+
|
51
54
|
# The default scope to use when searching if none is specified
|
52
55
|
DEFAULT_SCOPE = :subtree
|
53
56
|
DEFAULT_SCOPE.freeze
|
data/lib/treequel/directory.rb
CHANGED
@@ -15,11 +15,15 @@ require 'treequel/branch'
|
|
15
15
|
# The object in Treequel that represents a connection to a directory, the
|
16
16
|
# binding to that directory, and the base from which all DNs start.
|
17
17
|
class Treequel::Directory
|
18
|
-
include Treequel::
|
19
|
-
Treequel::Constants,
|
18
|
+
include Treequel::Constants,
|
20
19
|
Treequel::HashUtilities
|
21
20
|
|
22
|
-
extend
|
21
|
+
extend Loggability,
|
22
|
+
Treequel::Delegation
|
23
|
+
|
24
|
+
# Loggability API -- Log to the Treequel module's logger
|
25
|
+
log_to :treequel
|
26
|
+
|
23
27
|
|
24
28
|
# The default directory options
|
25
29
|
DEFAULT_OPTIONS = {
|
@@ -146,7 +150,7 @@ class Treequel::Directory
|
|
146
150
|
end
|
147
151
|
|
148
152
|
|
149
|
-
### Copy constructor -- the duplicate should have a distinct connection, bound user,
|
153
|
+
### Copy constructor -- the duplicate should have a distinct connection, bound user,
|
150
154
|
### and should have a distinct copy of the +original+'s registered controls.
|
151
155
|
def initialize_copy( original )
|
152
156
|
@conn = nil
|
data/lib/treequel/filter.rb
CHANGED
@@ -37,12 +37,20 @@ require 'treequel/sequel_integration'
|
|
37
37
|
# value = AttributeValue from Section 4.1.6 of [1]
|
38
38
|
#
|
39
39
|
class Treequel::Filter
|
40
|
-
|
41
|
-
|
40
|
+
extend Loggability
|
41
|
+
include Treequel::Constants::Patterns
|
42
|
+
|
43
|
+
|
44
|
+
# Loggability API -- Log to the Treequel module's logger
|
45
|
+
log_to :treequel
|
46
|
+
|
42
47
|
|
43
48
|
### Filter list component of a Treequel::Filter.
|
44
49
|
class FilterList
|
45
|
-
|
50
|
+
extend Loggability
|
51
|
+
|
52
|
+
# Loggability API -- Log to the Treequel module's logger
|
53
|
+
log_to :treequel
|
46
54
|
|
47
55
|
### Create a new filter list with the given +filters+ in it.
|
48
56
|
def initialize( *filters )
|
@@ -75,11 +83,15 @@ class Treequel::Filter
|
|
75
83
|
### An abstract class for filter components.
|
76
84
|
### Subclass and override #to_s to implement a custom Component class.
|
77
85
|
class Component
|
78
|
-
|
86
|
+
extend Loggability
|
87
|
+
|
88
|
+
# Loggability API -- Log to the Treequel module's logger
|
89
|
+
log_to :treequel
|
79
90
|
|
80
91
|
# Hide this class's new method
|
81
92
|
private_class_method :new
|
82
93
|
|
94
|
+
|
83
95
|
### Inherited hook: re-expose inheriting class's .new method
|
84
96
|
def self::inherited( klass )
|
85
97
|
klass.module_eval( 'public_class_method :new' )
|
@@ -323,7 +335,7 @@ class Treequel::Filter
|
|
323
335
|
raise Treequel::ExpressionError,
|
324
336
|
"unable to parse %p as a substring literal" % [ literal ]
|
325
337
|
|
326
|
-
|
338
|
+
self.log.debug " parsed substring literal as: %p" % [ match.captures ]
|
327
339
|
return self.new( *(match.captures.values_at(1,3,2)) )
|
328
340
|
end
|
329
341
|
|
@@ -408,7 +420,7 @@ class Treequel::Filter
|
|
408
420
|
### Turn the specified filter +expression+ into a Treequel::Filter::Component
|
409
421
|
### object and return it.
|
410
422
|
def self::parse_expression( expression )
|
411
|
-
|
423
|
+
self.log.debug "Parsing expression %p" % [ expression ]
|
412
424
|
expression = expression[0] if expression.is_a?( Array ) && expression.length == 1
|
413
425
|
|
414
426
|
case expression
|
@@ -447,19 +459,19 @@ class Treequel::Filter
|
|
447
459
|
### Turn the specified expression Array into a Treequel::Filter::Component object
|
448
460
|
### and return it.
|
449
461
|
def self::parse_array_expression( expression )
|
450
|
-
|
462
|
+
self.log.debug "Parsing Array expression %p" % [ expression ]
|
451
463
|
|
452
464
|
case
|
453
465
|
|
454
466
|
# [ ] := '(objectClass=*)'
|
455
467
|
when expression.empty?
|
456
|
-
|
468
|
+
self.log.debug " empty expression -> objectClass presence item component"
|
457
469
|
return Treequel::Filter::PresentItemComponent.new
|
458
470
|
|
459
471
|
# Collection of subfilters
|
460
472
|
# [ [:uid, 'mahlon'], [:employeeNumber, 20202] ]
|
461
473
|
when expression.all? {|elem| elem.is_a?(Array) }
|
462
|
-
|
474
|
+
self.log.debug " parsing array of subfilters"
|
463
475
|
filters = expression.collect {|exp| Treequel::Filter.new(exp) }
|
464
476
|
if filters.length > 1
|
465
477
|
return Treequel::Filter::AndComponent.new( filters )
|
@@ -494,22 +506,22 @@ class Treequel::Filter
|
|
494
506
|
### Parse one or more tuples contained in a Hash into an ANDed set of
|
495
507
|
### Treequel::Filter::Components and return it.
|
496
508
|
def self::parse_hash_expression( expression )
|
497
|
-
|
509
|
+
self.log.debug "Parsing Hash expression %p" % [ expression ]
|
498
510
|
|
499
511
|
filterlist = expression.collect do |key, expr|
|
500
|
-
|
512
|
+
self.log.debug " adding %p => %p to the filter list" % [ key, expr ]
|
501
513
|
if expr.respond_to?( :fetch )
|
502
514
|
if expr.respond_to?( :length ) && expr.length > 1
|
503
|
-
|
515
|
+
self.log.debug " ORing together %d subfilters since %p has indices" %
|
504
516
|
[ expr.length, expr ]
|
505
517
|
subfilters = expr.collect {|val| Treequel::Filter.new(key, val) }
|
506
518
|
Treequel::Filter.new( :or, subfilters )
|
507
519
|
else
|
508
|
-
|
520
|
+
self.log.debug " unwrapping singular subfilter"
|
509
521
|
Treequel::Filter.new([ key.to_sym, expr.first ])
|
510
522
|
end
|
511
523
|
else
|
512
|
-
|
524
|
+
self.log.debug " value is a scalar; creating a single filter"
|
513
525
|
Treequel::Filter.new( key.to_sym, expr )
|
514
526
|
end
|
515
527
|
end
|
@@ -525,7 +537,7 @@ class Treequel::Filter
|
|
525
537
|
### Parse a tuple of the form: [ Symbol, Object ] into a Treequel::Filter::Component
|
526
538
|
### and return it.
|
527
539
|
def self::parse_tuple_array_expression( expression )
|
528
|
-
|
540
|
+
self.log.debug "Parsing tuple Array expression %p" % [ expression ]
|
529
541
|
|
530
542
|
case expression[1]
|
531
543
|
|
@@ -535,7 +547,7 @@ class Treequel::Filter
|
|
535
547
|
return self.parse_logical_array_expression( *expression )
|
536
548
|
|
537
549
|
when Range
|
538
|
-
|
550
|
+
self.log.debug " two ANDed item expressions from a Range"
|
539
551
|
attribute = expression[0]
|
540
552
|
range = expression[1]
|
541
553
|
left = "#{attribute}>=#{range.begin}"
|
@@ -545,7 +557,7 @@ class Treequel::Filter
|
|
545
557
|
# [ :attribute, 'value' ] := '(attribute=value)'
|
546
558
|
# when String, Symbol, Numeric, Time
|
547
559
|
else
|
548
|
-
|
560
|
+
self.log.debug " item expression from a %p" % [ expression[1].class ]
|
549
561
|
return self.parse_item_component( *expression )
|
550
562
|
end
|
551
563
|
end
|
@@ -554,7 +566,7 @@ class Treequel::Filter
|
|
554
566
|
### Break down the given +expression+ as a logical (AND, OR, or NOT)
|
555
567
|
### filter component and return it.
|
556
568
|
def self::parse_logical_array_expression( op, *components )
|
557
|
-
|
569
|
+
self.log.debug "Parsing logical %p expression with components: %p" %
|
558
570
|
[ op, components ]
|
559
571
|
|
560
572
|
compclass = LOGICAL_COMPONENTS[ op ] or
|
@@ -562,7 +574,7 @@ class Treequel::Filter
|
|
562
574
|
[ op, LOGICAL_COMPONENTS.keys ]
|
563
575
|
|
564
576
|
filterlist = components.collect do |filterexp|
|
565
|
-
|
577
|
+
self.log.debug " making %p into a component" % [ filterexp ]
|
566
578
|
Treequel::Filter.new( filterexp )
|
567
579
|
end.flatten
|
568
580
|
|
@@ -572,7 +584,7 @@ class Treequel::Filter
|
|
572
584
|
|
573
585
|
### Parse an item component from the specified +attribute+ and +value+
|
574
586
|
def self::parse_item_component( attribute, value )
|
575
|
-
|
587
|
+
self.log.debug " tuple expression (%p=%p)-> item component" %
|
576
588
|
[ attribute, value ]
|
577
589
|
|
578
590
|
case
|
@@ -590,7 +602,7 @@ class Treequel::Filter
|
|
590
602
|
|
591
603
|
### Parse a Sequel::SQL::Expression as a Treequel::Filter::Component and return it.
|
592
604
|
def self::parse_sequel_expression( expression )
|
593
|
-
|
605
|
+
self.log.debug " parsing Sequel expression: %p" % [ expression ]
|
594
606
|
|
595
607
|
if expression.respond_to?( :op )
|
596
608
|
op = expression.op.to_s.downcase.to_sym
|
@@ -601,11 +613,11 @@ class Treequel::Filter
|
|
601
613
|
# Turn :sn.like( 'bob' ) into (cn~=bob) 'cause it has no asterisks
|
602
614
|
if op == :like
|
603
615
|
if value.index( '*' )
|
604
|
-
|
616
|
+
self.log.debug \
|
605
617
|
" turning a LIKE expression with an asterisk into a substring filter"
|
606
618
|
return Treequel::Filter::SubstringItemComponent.new( attribute, value )
|
607
619
|
else
|
608
|
-
|
620
|
+
self.log.debug \
|
609
621
|
" turning a LIKE expression with no wildcards into an 'approx' filter"
|
610
622
|
equivalent = :approx
|
611
623
|
end
|
@@ -618,7 +630,7 @@ class Treequel::Filter
|
|
618
630
|
return Treequel::Filter::NotComponent.new( contents )
|
619
631
|
|
620
632
|
elsif op == :'not like'
|
621
|
-
|
633
|
+
self.log.debug " making a NOT LIKE expression out of: %p" % [ expression ]
|
622
634
|
attribute, value = *expression.args
|
623
635
|
component = nil
|
624
636
|
|