lib/openwfe/expressions/iterator.rb in ruote-0.9.18 vs lib/openwfe/expressions/iterator.rb in ruote-0.9.19

- old
+ new

@@ -1,34 +1,34 @@ # #-- # Copyright (c) 2007-2008, John Mettraux, OpenWFE.org # All rights reserved. -# -# Redistribution and use in source and binary forms, with or without +# +# Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: -# +# # . Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# . Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation +# list of conditions and the following disclaimer. +# +# . Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. -# +# # . Neither the name of the "OpenWFE" nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. #++ # # @@ -38,184 +38,184 @@ # module OpenWFE - # - # Iterator instances keep track of the position of an iteration. - # This class is meant to be used both by <iterator> and - # <concurrent-iterator>. - # - class Iterator + # + # Iterator instances keep track of the position of an iteration. + # This class is meant to be used both by <iterator> and + # <concurrent-iterator>. + # + class Iterator - ITERATOR_COUNT = "__ic__" - ITERATOR_POSITION = "__ip__" + ITERATOR_COUNT = "__ic__" + ITERATOR_POSITION = "__ip__" - attr_accessor :iteration_index - attr_accessor :iteration_list - attr_accessor :to_field - attr_accessor :to_variable - attr_accessor :value_separator + attr_accessor :iteration_index + attr_accessor :iteration_list + attr_accessor :to_field + attr_accessor :to_variable + attr_accessor :value_separator - # - # Builds a new iterator, serving a given iterator_expression. - # The second parameter is the workitem (as applied to the iterator - # expression). - # - def initialize (iterator_expression, workitem) + # + # Builds a new iterator, serving a given iterator_expression. + # The second parameter is the workitem (as applied to the iterator + # expression). + # + def initialize (iterator_expression, workitem) - @to_field = iterator_expression\ - .lookup_attribute(:to_field, workitem) - @to_variable = iterator_expression\ - .lookup_attribute(:to_variable, workitem) + @to_field = iterator_expression\ + .lookup_attribute(:to_field, workitem) + @to_variable = iterator_expression\ + .lookup_attribute(:to_variable, workitem) - @value_separator = iterator_expression\ - .lookup_attribute(:value_separator, workitem) + @value_separator = iterator_expression\ + .lookup_attribute(:value_separator, workitem) - @value_separator = /,\s*/ unless @value_separator + @value_separator = /,\s*/ unless @value_separator - @iteration_index = 0 + @iteration_index = 0 - #raw_list = iterator_expression.lookup_vf_attribute( - # workitem, :value, :prefix => :on) - #raw_list ||= iterator_expression.lookup_attribute(:on, workitem) + #raw_list = iterator_expression.lookup_vf_attribute( + # workitem, :value, :prefix => :on) + #raw_list ||= iterator_expression.lookup_attribute(:on, workitem) - raw_list = - iterator_expression.lookup_vf_attribute( - workitem, :value, :prefix => :on) || - iterator_expression.lookup_vf_attribute( - workitem, nil, :prefix => :on) + raw_list = + iterator_expression.lookup_vf_attribute( + workitem, :value, :prefix => :on) || + iterator_expression.lookup_vf_attribute( + workitem, nil, :prefix => :on) - @iteration_list = extract_iteration_list raw_list + @iteration_list = extract_iteration_list raw_list - workitem.attributes[ITERATOR_COUNT] = @iteration_list.length - end + workitem.attributes[ITERATOR_COUNT] = @iteration_list.length + end - # - # Has the iteration a next element ? - # - def has_next? + # + # Has the iteration a next element ? + # + def has_next? - @iteration_index < @iteration_list.size - end + @iteration_index < @iteration_list.size + end - # - # Returns the size of this iterator, or rather, the size of the - # underlying iteration list. - # - def size + # + # Returns the size of this iterator, or rather, the size of the + # underlying iteration list. + # + def size - @iteration_list.size - end + @iteration_list.size + end - # - # Prepares the iterator expression and the workitem for the next - # iteration. - # - def next (workitem) + # + # Prepares the iterator expression and the workitem for the next + # iteration. + # + def next (workitem) - position_at workitem, @iteration_index - end + position_at workitem, @iteration_index + end - # - # Positions the iterator back at position 0. - # - def rewind (workitem) + # + # Positions the iterator back at position 0. + # + def rewind (workitem) - position_at workitem, 0 - end + position_at workitem, 0 + end - # - # Jumps to a given position in the iterator - # - def jump (workitem, index) + # + # Jumps to a given position in the iterator + # + def jump (workitem, index) - index = if index < 0 - 0 - elsif index >= @iteration_list.size - @iteration_list.size - else - index - end + index = if index < 0 + 0 + elsif index >= @iteration_list.size + @iteration_list.size + else + index + end - position_at workitem, index - end + position_at workitem, index + end - # - # Jumps a certain number of positions in the iterator. - # - def skip (workitem, offset) + # + # Jumps a certain number of positions in the iterator. + # + def skip (workitem, offset) - jump workitem, @iteration_index + offset - end + jump workitem, @iteration_index + offset + end - # - # The current index (whereas @iteration_index already points to - # the next element). - # - def index + # + # The current index (whereas @iteration_index already points to + # the next element). + # + def index - @iteration_index - 1 - end + @iteration_index - 1 + end - protected + protected - # - # Positions the iterator absolutely. - # - def position_at (workitem, position) + # + # Positions the iterator absolutely. + # + def position_at (workitem, position) - result = {} + result = {} - value = @iteration_list[position] + value = @iteration_list[position] - return nil unless value + return nil unless value - if @to_field - workitem.attributes[@to_field] = value - else - result[@to_variable] = value - end + if @to_field + workitem.attributes[@to_field] = value + else + result[@to_variable] = value + end - workitem.attributes[ITERATOR_POSITION] = position - result[ITERATOR_POSITION] = position + workitem.attributes[ITERATOR_POSITION] = position + result[ITERATOR_POSITION] = position - @iteration_index = position + 1 + @iteration_index = position + 1 - result - end + result + end - # - # Extracts the iteration list from any value. - # - def extract_iteration_list (raw_list) + # + # Extracts the iteration list from any value. + # + def extract_iteration_list (raw_list) - if is_suitable_list?(raw_list) - raw_list - else - extract_list_from_string raw_list.to_s - end - end + if is_suitable_list?(raw_list) + raw_list + else + extract_list_from_string raw_list.to_s + end + end - # - # Returns true if the given instance can be directly - # used as a list. - # - def is_suitable_list? (instance) + # + # Returns true if the given instance can be directly + # used as a list. + # + def is_suitable_list? (instance) - (not instance.is_a?(String)) and \ - instance.respond_to? :[] and \ - instance.respond_to? :length - end + (not instance.is_a?(String)) and \ + instance.respond_to? :[] and \ + instance.respond_to? :length + end - # - # Extracts the list from the string (comma separated list - # usually). - # - def extract_list_from_string (s) + # + # Extracts the list from the string (comma separated list + # usually). + # + def extract_list_from_string (s) - s.split @value_separator - end - end + s.split @value_separator + end + end end