de 0.0.3 → 0.0.4

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/CHANGELOG ADDED
@@ -0,0 +1,18 @@
1
+ Change log:
2
+ ===========
3
+
4
+ Version 0.0.2 (August 30, 2011)
5
+ ===============================
6
+ Evaluate parametrization possibility is added; parameter page is used for sunspot solr search evaluation
7
+
8
+ Version 0.0.3 (September 11, 2011)
9
+ ==================================
10
+ Date type support added for SunspotSolr::Search
11
+
12
+ Version 0.0.4 (September 23, 2011)
13
+ ==================================
14
+ *) De::Expression#to_s method overriden
15
+ *) De::Expression @name attribute is writable
16
+ *) Bug fix: De::Expression prevents error-prone trials to add child with name already existent in tree
17
+ *) De::SunspotSolr::Search#evaluate support for per_page parameter
18
+ *) De::SunspotSolr::Search#results method added
@@ -36,9 +36,9 @@ module De
36
36
  # operands<Array>:: (optional) array of Operand objects.
37
37
  # If given they are added as children to current operator
38
38
  #
39
- def initialize(name, operands = nil)
39
+ def initialize(name, content, operands = nil)
40
40
  raise Error::AbstractClassObjectCreationError if instance_of? BooleanOperator
41
- super(name, operands)
41
+ super(name, content, operands)
42
42
  end
43
43
 
44
44
  #
@@ -67,7 +67,7 @@ module De
67
67
  # If given they are added as children to current operator
68
68
  #
69
69
  def initialize(operands = nil)
70
- super("AND-#{rand(1000)}", operands)
70
+ super("AND-#{rand(1000)}", 'AND', operands)
71
71
  end
72
72
 
73
73
  def evaluate
@@ -92,7 +92,7 @@ module De
92
92
  # If given they are added as children to current operator
93
93
  #
94
94
  def initialize(operands = nil)
95
- super("OR-#{rand(1000)}", operands)
95
+ super("OR-#{rand(1000)}", 'OR', operands)
96
96
  end
97
97
 
98
98
  def evaluate
@@ -117,7 +117,7 @@ module De
117
117
  # If given it is added as child to current operator
118
118
  #
119
119
  def initialize(operand = nil)
120
- super("NOT-#{rand(1000)}", operand ? [operand] : nil)
120
+ super("NOT-#{rand(1000)}", 'NOT', operand ? [operand] : nil)
121
121
  end
122
122
 
123
123
  def <<(obj)
data/lib/de/de.rb CHANGED
@@ -27,7 +27,9 @@
27
27
  # - Sunspot Solr search expressions
28
28
  #
29
29
 
30
+
30
31
  require 'tree'
32
+ require 'active_support/inflector'
31
33
  require 'de/error'
32
34
 
33
35
  module De
@@ -52,7 +54,8 @@ module De
52
54
  #
53
55
  def <<(obj)
54
56
  raise Error::TypeError unless (obj.is_a?(Operator) or obj.is_a?(Operand))
55
- super(obj)
57
+ added = added_obj(obj)
58
+ super(added)
56
59
  end
57
60
 
58
61
  #
@@ -104,6 +107,65 @@ module De
104
107
  @content.hash
105
108
  end
106
109
 
110
+ def to_s
111
+ str = @content.nil? ? '' : @content
112
+ str += '(%s)' % children.map { |child| child.to_s }.join(', ') if children.length > 0
113
+
114
+ str
115
+ end
116
+
117
+ # def to_hash
118
+ # {
119
+ # :name => @name,
120
+ # :content => @content,
121
+ # :class => self.class.name,
122
+ # :children => children.map { |child| child.to_hash }
123
+ # }
124
+ # end
125
+
126
+ class << self
127
+
128
+ # def load(hash)
129
+ # raise Error::InvalidExpressionError if (hash.keys - [:name, :content, :class, :children]).length > 0
130
+ #
131
+ # klass = hash[:class].constantize
132
+ # params = case klass.method(:new).arity
133
+ # when -1,0 then []
134
+ # when -2,1 then [hash[:name]]
135
+ # else [hash[:name], hash[:content]]
136
+ # end
137
+ #
138
+ # obj = klass.send(:new, *params)
139
+ # hash[:children].each { |child| obj << load(child) }
140
+ # end
141
+ end
142
+
143
+ private
144
+
145
+ #
146
+ # Object to be added to current one
147
+ #
148
+ # Checks and prevents trial to add element with name already existent in objects children
149
+ #
150
+ # === Input
151
+ #
152
+ # obj <Operator|Operand>:: potential child object
153
+ #
154
+ # === Output
155
+ #
156
+ # <Operator|Operand>
157
+ #
158
+ def added_obj(obj)
159
+ dup_obj = obj
160
+ counter = 0
161
+ while @children_hash.key?(dup_obj.name) && counter < 5
162
+ dup_obj.name = "#{dup_obj.name}_#{rand(1000000)}"
163
+ counter += 1
164
+ end
165
+
166
+ dup_obj
167
+ end
168
+
107
169
  end
108
170
 
109
171
  #
@@ -126,9 +188,9 @@ module De
126
188
  # operands<Array>:: (optional) array of Operand objects.
127
189
  # If given they are added as children to current operator
128
190
  #
129
- def initialize(name, operands = nil)
191
+ def initialize(name, content, operands = nil)
130
192
  raise Error::AbstractClassObjectCreationError if instance_of? Operator
131
- super(name)
193
+ super(name, content)
132
194
 
133
195
  unless operands.nil?
134
196
  raise Error::TypeError unless operands.is_a?(Array)
@@ -165,7 +227,7 @@ module De
165
227
  # Define hash function to get equal results for operators from the same class and with the equal children
166
228
  #
167
229
  def hash
168
- [self.class.name, children.map { |el| el.hash}].hash
230
+ [self.class.name, children.map { |el| el.hash }].hash
169
231
  end
170
232
  end
171
233
 
@@ -210,3 +272,8 @@ module De
210
272
 
211
273
  end
212
274
 
275
+ module Tree
276
+ class TreeNode
277
+ attr_accessor :name
278
+ end
279
+ end
@@ -31,13 +31,13 @@ module De
31
31
 
32
32
  def initialize(operator, operands = nil)
33
33
  @operator = operator
34
- super("#{operator}-#{rand(1000)}", operands)
34
+ super("#{operator}-#{rand(1000)}", operator, operands)
35
35
  end
36
36
 
37
37
  def evaluate
38
38
  super
39
39
  "#{@operator} do
40
- #{children.map {|child| child.evaluate + "\n" } }
40
+ #{children.map { |child| child.evaluate + "\n" } }
41
41
  end"
42
42
  end
43
43
 
@@ -161,11 +161,13 @@ module De
161
161
  #
162
162
  # Evaluator
163
163
  #
164
+ # === Input
165
+ #
164
166
  # params<Hash>:: optional parameters hash
165
167
  # Supported hash keys:
166
- # :page - gives page for paging.
167
- # Number of results per page is defined by @option[:per_page] parameter
168
- # Default values: page - 1, per_page - 10000
168
+ # :page - gives page for paging (default - 1)
169
+ # :per_page - gives number of results per page for paging
170
+ # If not given Number of results per page is defined by @option[:per_page] parameter (default - 10000)
169
171
  #
170
172
  # === Output
171
173
  #
@@ -176,7 +178,7 @@ module De
176
178
  super
177
179
 
178
180
  page = params && params[:page] ? params[:page] : 1
179
- per_page = @options[:per_page] || 10000
181
+ per_page = params && params[:per_page] ? params[:per_page] : @options[:per_page] || 10000
180
182
 
181
183
  search_string = "Sunspot.search(#{Kernel.const_get(@klass)}) do
182
184
  #{children.map {|child| child.evaluate + "\n" } }
@@ -186,6 +188,22 @@ module De
186
188
 
187
189
  instance_eval search_string
188
190
  end
191
+
192
+ #
193
+ # Evaluates expression and returns results of obtained sunspot request
194
+ #
195
+ # === Input
196
+ #
197
+ # params<Hash>:: optional parameters hash passed to evaluate method
198
+ #
199
+ # === Output
200
+ #
201
+ # <mixed> - object of class @klass Sunspot search is built on
202
+ #
203
+ def results(params = nil)
204
+ evaluate(params).results
205
+ end
206
+
189
207
  end
190
208
  end
191
209
  end
data/lib/de/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module De
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -9,13 +9,45 @@ class DeBooleanOperatorTest < Test::Unit::TestCase
9
9
  class NotSuitableOperand < De::Operand; end
10
10
 
11
11
  def test_constructor
12
- assert_raise(De::Error::AbstractClassObjectCreationError) { De::Boolean::BooleanOperator.new('first') }
13
- assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { SomeOperator.new('some name') }
12
+ assert_raise(De::Error::AbstractClassObjectCreationError) { De::Boolean::BooleanOperator.new('first', 'some operator') }
13
+ assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { SomeOperator.new('some name', 'some operator') }
14
+ end
15
+
16
+ # def test_to_hash
17
+ # and1 = De::Boolean::And.new
18
+ # operand1 = De::Boolean::Operand.new('some name', true)
19
+ #
20
+ # and1 << operand1
21
+ # assert_equal({
22
+ # :class => "De::Boolean::And",
23
+ # :children => [{:class=>"De::Boolean::Operand", :children=>[], :name=>"some name", :content=>true}],
24
+ # :name => and1.name,
25
+ # :content => "AND"},
26
+ # and1.to_hash)
27
+ # end
28
+
29
+ # def test_load
30
+ # and1 = De::Boolean::And.new
31
+ # operand1 = De::Boolean::Operand.new('some name', true)
32
+ #
33
+ # and1 << operand1
34
+ # hsh = and1.to_hash
35
+ # assert_equal(and1, De::Expression.load(hsh))
36
+ #
37
+ #
38
+ # end
39
+
40
+ def test_to_s
41
+ and1 = De::Boolean::And.new
42
+ operand1 = De::Boolean::Operand.new('some name', true)
43
+
44
+ and1 << operand1
45
+ assert_equal('AND(true)', and1.to_s)
14
46
  end
15
47
 
16
48
  def test_add
17
- operator = SomeOperator.new('first')
18
- operator2 = SomeOperator.new('second')
49
+ operator = SomeOperator.new('first', 'some operator')
50
+ operator2 = SomeOperator.new('second', 'some operator')
19
51
  operand = De::Boolean::Operand.new('third', true)
20
52
  not_suitable_operand = NotSuitableOperand.new('four', true)
21
53
 
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require 'de'
2
+ require File.expand_path('../lib/de.rb', File.dirname(__FILE__))
3
3
 
4
4
  class DeExpressionTest < Test::Unit::TestCase
5
5
  class SomeOperator < De::Operator; end
@@ -15,7 +15,7 @@ class DeExpressionTest < Test::Unit::TestCase
15
15
  end
16
16
 
17
17
  def test_add
18
- operator = SomeOperator.new('some operator')
18
+ operator = SomeOperator.new('some operator', 'some operator')
19
19
  assert_nothing_raised(De::Error::TypeError) { @expression << operator }
20
20
  assert_equal(@expression.children[0], operator)
21
21
 
@@ -26,10 +26,29 @@ class DeExpressionTest < Test::Unit::TestCase
26
26
  obj = Object.new
27
27
  assert_raise(De::Error::TypeError, "Cannot add object to expression") { @expression << obj }
28
28
  assert_equal(3, @expression.size)
29
+
30
+ old_name = operand.name
31
+ @expression << operand
32
+ assert_equal(4, @expression.size)
33
+ assert_instance_of(SomeOperand, @expression.children[2])
34
+ assert_equal(operand.name, @expression.children[2].name)
35
+ assert(old_name != @expression.children[2].name)
29
36
  end
30
37
 
31
38
  def test_valid?
32
39
  assert_raise(De::Error::MethodShouldBeOverridenByExtendingClassError, "Cannot add object to expression") { @expression.valid? }
33
40
  end
34
41
 
42
+ def test_to_s
43
+ assert_equal('some content', @expression.to_s)
44
+
45
+ operand = SomeOperand.new('some operand', 'operand content')
46
+ @expression << operand
47
+
48
+ assert_equal('some content(operand content)', @expression.to_s)
49
+
50
+ operand = SomeOperand.new('some operand 2', 'operand content 2')
51
+ @expression << operand
52
+ assert_equal('some content(operand content, operand content 2)', @expression.to_s)
53
+ end
35
54
  end
@@ -16,24 +16,24 @@ class DeOperatorTest < Test::Unit::TestCase
16
16
  end
17
17
 
18
18
  def test_constructor
19
- assert_raise(De::Error::AbstractClassObjectCreationError, "Cannot create operator object") { De::Operator.new('some name') }
19
+ assert_raise(De::Error::AbstractClassObjectCreationError, "Cannot create operator object") { De::Operator.new('some name', 'some content') }
20
20
 
21
21
  assert_nothing_raised(De::Error::AbstractClassObjectCreationError) {
22
- operator = SomeOperator.new('some name')
22
+ operator = SomeOperator.new('some name', 'some operator')
23
23
  assert_equal('some name', operator.name)
24
- assert_equal(1, operator.size, 'No children noDes should be adDed')
24
+ assert_equal(1, operator.size, 'No children noDes should be added')
25
25
 
26
- operator2 = SomeOperator.new('another name', [operator])
26
+ operator2 = SomeOperator.new('another name', 'some operator', [operator])
27
27
  assert_equal(2, operator2.size, 'First operator should be adDed as child to second one')
28
- assert_equal(operator, operator2.children[0], 'First operator should be adDed as child to second one')
28
+ assert_equal(operator, operator2.children[0], 'First operator should be added as child to second one')
29
29
  }
30
30
 
31
- assert_raise(De::Error::TypeError, "Cannot create operator object") { SomeOperator.new('some name', 10) }
31
+ assert_raise(De::Error::TypeError, "Cannot create operator object") { SomeOperator.new('some name', 'some operator', 10) }
32
32
  end
33
33
 
34
34
  def test_valid?
35
35
 
36
- operator = SomeOperator.new('some name')
36
+ operator = SomeOperator.new('some name', 'some operator')
37
37
  assert_equal(false, operator.valid?)
38
38
 
39
39
  operand = SomeValidOperand.new('another name', 5)
data/test/test.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+
3
+ dir = File.expand_path(File.dirname(__FILE__))
4
+ Dir.glob("#{dir}/*.rb").each do |file|
5
+ require file unless file =~ /\/test\.rb$/
6
+ end
7
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: de
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Olga Gorun
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-12 00:00:00 +03:00
18
+ date: 2011-09-23 00:00:00 +03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -78,6 +78,7 @@ extra_rdoc_files: []
78
78
  files:
79
79
  - .gitignore
80
80
  - .rvmrc
81
+ - CHANGELOG
81
82
  - Gemfile
82
83
  - README
83
84
  - Rakefile
@@ -107,6 +108,7 @@ files:
107
108
  - test/de_sunspot_solr_or_test.rb
108
109
  - test/de_sunspot_solr_search_test.rb
109
110
  - test/de_sunspot_solr_sunspot_operand_test.rb
111
+ - test/test.rb
110
112
  has_rdoc: true
111
113
  homepage: ""
112
114
  licenses: []