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