/tools/Ruby/lib/ruby/1.8/rss/syndication.rb

http://github.com/agross/netopenspace · Ruby · 67 lines · 53 code · 14 blank · 0 comment · 1 complexity · cb262a23b462d1d666f78a49574781c9 MD5 · raw file

  1. require "rss/1.0"
  2. module RSS
  3. SY_PREFIX = 'sy'
  4. SY_URI = "http://purl.org/rss/1.0/modules/syndication/"
  5. RDF.install_ns(SY_PREFIX, SY_URI)
  6. module SyndicationModel
  7. extend BaseModel
  8. ELEMENTS = []
  9. def self.append_features(klass)
  10. super
  11. klass.install_must_call_validator(SY_PREFIX, SY_URI)
  12. klass.module_eval do
  13. [
  14. ["updatePeriod"],
  15. ["updateFrequency", :positive_integer]
  16. ].each do |name, type|
  17. install_text_element(name, SY_URI, "?",
  18. "#{SY_PREFIX}_#{name}", type,
  19. "#{SY_PREFIX}:#{name}")
  20. end
  21. %w(updateBase).each do |name|
  22. install_date_element(name, SY_URI, "?",
  23. "#{SY_PREFIX}_#{name}", 'w3cdtf',
  24. "#{SY_PREFIX}:#{name}")
  25. end
  26. end
  27. klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1)
  28. alias_method(:_sy_updatePeriod=, :sy_updatePeriod=)
  29. def sy_updatePeriod=(new_value)
  30. new_value = new_value.strip
  31. validate_sy_updatePeriod(new_value) if @do_validate
  32. self._sy_updatePeriod = new_value
  33. end
  34. EOC
  35. end
  36. private
  37. SY_UPDATEPERIOD_AVAILABLE_VALUES = %w(hourly daily weekly monthly yearly)
  38. def validate_sy_updatePeriod(value)
  39. unless SY_UPDATEPERIOD_AVAILABLE_VALUES.include?(value)
  40. raise NotAvailableValueError.new("updatePeriod", value)
  41. end
  42. end
  43. end
  44. class RDF
  45. class Channel; include SyndicationModel; end
  46. end
  47. prefix_size = SY_PREFIX.size + 1
  48. SyndicationModel::ELEMENTS.uniq!
  49. SyndicationModel::ELEMENTS.each do |full_name|
  50. name = full_name[prefix_size..-1]
  51. BaseListener.install_get_text_element(SY_URI, name, full_name)
  52. end
  53. end