lib/feed_tools/helpers/generic_helper.rb in feedtools-0.2.22 vs lib/feed_tools/helpers/generic_helper.rb in feedtools-0.2.23
- old
+ new
@@ -20,181 +20,39 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#++
require 'feed_tools'
-require 'rexml/document'
module FeedTools
# Generic methods needed in numerous places throughout FeedTools
module GenericHelper
# Raises an exception if an invalid option has been specified to prevent
# misspellings from slipping through
- def validate_options(valid_option_keys, supplied_option_keys)
+ def self.validate_options(valid_option_keys, supplied_option_keys)
unknown_option_keys = supplied_option_keys - valid_option_keys
unless unknown_option_keys.empty?
raise "Unknown options: #{unknown_option_keys}"
end
end
- # Selects the first non-blank result.
- def select_not_blank(results, &block)
- for result in results
- blank_result = false
- if !block.nil?
- blank_result = block.call(result)
- else
- blank_result = result.to_s.blank?
- end
- unless result.nil? || blank_result
- return result
- end
+ # Nifty little method that takes a block and returns nil if recursion
+ # occurs or the block's result value if it doesn't.
+ def self.recursion_trap(lock_object, &block)
+ if @lock_ids.nil?
+ @lock_ids = []
end
- return nil
- end
-
- # Runs through a list of XPath queries on an element or document and
- # returns the first non-blank result. Subsequent XPath queries will
- # not be evaluated.
- def try_xpaths(element, xpath_list,
- options={}, &block)
- validate_options([ :select_result_value ],
- options.keys)
- options = { :select_result_value => false }.merge(options)
-
- result = nil
- if element.nil?
+ if !@lock_ids.include?(lock_object.object_id)
+ @lock_ids << lock_object.object_id
+ else
return nil
end
- for xpath in xpath_list
- result = REXML::XPath.liberal_first(element, xpath,
- FEED_TOOLS_NAMESPACES)
- if options[:select_result_value] && !result.nil?
- if result.respond_to?(:value)
- result = result.value
- else
- result = result.to_s
- end
- end
- blank_result = false
- if block_given?
- blank_result = yield(result)
- else
- blank_result = result.to_s.blank?
- end
- if !blank_result
- if result.respond_to? :strip
- result.strip!
- end
- return result
- end
+ begin
+ result = block.call
+ rescue SystemStackError
+ result = nil
end
- for xpath in xpath_list
- result = REXML::XPath.liberal_first(element, xpath)
- if options[:select_result_value] && !result.nil?
- if result.respond_to?(:value)
- result = result.value
- else
- result = result.to_s
- end
- end
- blank_result = false
- if block_given?
- blank_result = yield(result)
- else
- blank_result = result.to_s.blank?
- end
- if !blank_result
- if result.respond_to? :strip
- result.strip!
- end
- return result
- end
- end
- for xpath in xpath_list
- if xpath =~ /^\w+$/
- for child in element.children
- if child.class == REXML::Element
- if child.name.downcase == xpath.downcase
- result = child
- end
- end
- end
- if options[:select_result_value] && !result.nil?
- if result.respond_to?(:value)
- result = result.value
- else
- result = result.to_s
- end
- end
- blank_result = false
- if block_given?
- blank_result = yield(result)
- else
- blank_result = result.to_s.blank?
- end
- if !blank_result
- if result.respond_to? :strip
- result.strip!
- end
- return result
- end
- end
- end
- return nil
- end
-
- # Runs through a list of XPath queries on an element or document and
- # returns the first non-empty result. Subsequent XPath queries will
- # not be evaluated.
- def try_xpaths_all(element, xpath_list, options={})
- validate_options([ :select_result_value ],
- options.keys)
- options = { :select_result_value => false }.merge(options)
-
- results = []
- if element.nil?
- return []
- end
- for xpath in xpath_list
- results = REXML::XPath.liberal_match(element, xpath,
- FEED_TOOLS_NAMESPACES)
- if options[:select_result_value] && !results.nil? && !results.empty?
- results =
- results.map { |x| x.respond_to?(:value) ? x.value : x.to_s }
- end
- if results.blank?
- results = REXML::XPath.liberal_match(element, xpath)
- else
- return results
- end
- if options[:select_result_value] && !results.nil? && !results.empty?
- results =
- results.map { |x| x.respond_to?(:value) ? x.value : x.to_s }
- end
- if !results.blank?
- return results
- end
- end
- for xpath in xpath_list
- if xpath =~ /^\w+$/
- results = []
- for child in element.children
- if child.class == REXML::Element
- if child.name.downcase == xpath.downcase
- results << child
- end
- end
- end
- if options[:select_result_value] && !results.nil? && !results.empty?
- results =
- results.map { |x| x.inner_xml }
- end
- if !results.blank?
- return results
- end
- end
- end
- return []
+ @lock_ids.delete(lock_object.object_id)
+ return result
end
end
end
\ No newline at end of file