rubysl-rss 1.0.0 → 2.0.0

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.
@@ -25,13 +25,14 @@ module RSS
25
25
  end
26
26
 
27
27
  class Channel < ChannelBase
28
+ include SetupDefaultLanguage
28
29
 
29
30
  def to_feed(rss)
30
31
  set_default_values do
31
32
  _not_set_required_variables = not_set_required_variables
32
33
  if _not_set_required_variables.empty?
33
34
  channel = RDF::Channel.new(@about)
34
- set = setup_values(channel)
35
+ setup_values(channel)
35
36
  channel.dc_dates.clear
36
37
  rss.channel = channel
37
38
  set_parent(channel, rss)
@@ -60,7 +61,7 @@ module RSS
60
61
  rss.channel.items = items
61
62
  set_parent(rss.channel, items)
62
63
  end
63
-
64
+
64
65
  def setup_image(rss)
65
66
  if @maker.image.have_required_values?
66
67
  image = RDF::Channel::Image.new(@maker.image.url)
@@ -91,11 +92,11 @@ module RSS
91
92
  class SkipDays < SkipDaysBase
92
93
  def to_feed(*args)
93
94
  end
94
-
95
+
95
96
  class Day < DayBase
96
97
  end
97
98
  end
98
-
99
+
99
100
  class SkipHours < SkipHoursBase
100
101
  def to_feed(*args)
101
102
  end
@@ -103,7 +104,7 @@ module RSS
103
104
  class Hour < HourBase
104
105
  end
105
106
  end
106
-
107
+
107
108
  class Cloud < CloudBase
108
109
  def to_feed(*args)
109
110
  end
@@ -403,7 +404,7 @@ module RSS
403
404
  end
404
405
  end
405
406
  end
406
-
407
+
407
408
  class Textinput < TextinputBase
408
409
  def to_feed(rss)
409
410
  if @link
@@ -4,9 +4,9 @@ require "rss/maker/0.9"
4
4
 
5
5
  module RSS
6
6
  module Maker
7
-
7
+
8
8
  class RSS20 < RSS09
9
-
9
+
10
10
  def initialize(feed_version="2.0")
11
11
  super
12
12
  end
@@ -17,17 +17,17 @@ module RSS
17
17
  def required_variable_names
18
18
  %w(link)
19
19
  end
20
-
20
+
21
21
  class SkipDays < RSS09::Channel::SkipDays
22
22
  class Day < RSS09::Channel::SkipDays::Day
23
23
  end
24
24
  end
25
-
25
+
26
26
  class SkipHours < RSS09::Channel::SkipHours
27
27
  class Hour < RSS09::Channel::SkipHours::Hour
28
28
  end
29
29
  end
30
-
30
+
31
31
  class Cloud < RSS09::Channel::Cloud
32
32
  def to_feed(rss, channel)
33
33
  cloud = Rss::Channel::Cloud.new
@@ -51,7 +51,7 @@ module RSS
51
51
  category.to_feed(rss, channel)
52
52
  end
53
53
  end
54
-
54
+
55
55
  class Category < RSS09::Channel::Categories::Category
56
56
  def to_feed(rss, channel)
57
57
  category = Rss::Channel::Category.new
@@ -81,14 +81,14 @@ module RSS
81
81
  end
82
82
  end
83
83
  end
84
-
84
+
85
85
  class Image < RSS09::Image
86
86
  private
87
87
  def required_element?
88
88
  false
89
89
  end
90
90
  end
91
-
91
+
92
92
  class Items < RSS09::Items
93
93
  class Item < RSS09::Items::Item
94
94
  private
@@ -179,7 +179,7 @@ module RSS
179
179
  category.to_feed(rss, item)
180
180
  end
181
181
  end
182
-
182
+
183
183
  class Category < RSS09::Items::Item::Categories::Category
184
184
  def to_feed(rss, item)
185
185
  category = Rss::Channel::Item::Category.new
@@ -212,11 +212,11 @@ module RSS
212
212
  end
213
213
  end
214
214
  end
215
-
215
+
216
216
  class Textinput < RSS09::Textinput
217
217
  end
218
218
  end
219
-
219
+
220
220
  add_maker("2.0", "2.0", RSS20)
221
221
  add_maker("rss2.0", "2.0", RSS20)
222
222
  end
@@ -23,15 +23,17 @@ module RSS
23
23
  end
24
24
 
25
25
  def inherited(subclass)
26
- subclass.const_set("OTHER_ELEMENTS", [])
27
- subclass.const_set("NEED_INITIALIZE_VARIABLES", [])
26
+ subclass.const_set(:OTHER_ELEMENTS, [])
27
+ subclass.const_set(:NEED_INITIALIZE_VARIABLES, [])
28
28
  end
29
29
 
30
30
  def add_other_element(variable_name)
31
31
  self::OTHER_ELEMENTS << variable_name
32
32
  end
33
33
 
34
- def add_need_initialize_variable(variable_name, init_value="nil")
34
+ def add_need_initialize_variable(variable_name, init_value=nil,
35
+ &init_block)
36
+ init_value ||= init_block
35
37
  self::NEED_INITIALIZE_VARIABLES << [variable_name, init_value]
36
38
  end
37
39
 
@@ -45,7 +47,7 @@ module RSS
45
47
  def_delegators("@#{plural}", :push, :pop, :shift, :unshift)
46
48
  def_delegators("@#{plural}", :each, :size, :empty?, :clear)
47
49
 
48
- add_need_initialize_variable(plural, "[]")
50
+ add_need_initialize_variable(plural) {[]}
49
51
 
50
52
  module_eval(<<-EOC, __FILE__, __LINE__ + 1)
51
53
  def new_#{name}
@@ -74,7 +76,9 @@ module RSS
74
76
  def def_classed_element_without_accessor(name, class_name=nil)
75
77
  class_name ||= Utils.to_class_name(name)
76
78
  add_other_element(name)
77
- add_need_initialize_variable(name, "make_#{name}")
79
+ add_need_initialize_variable(name) do |object|
80
+ object.send("make_#{name}")
81
+ end
78
82
  module_eval(<<-EOC, __FILE__, __LINE__ + 1)
79
83
  private
80
84
  def setup_#{name}(feed, current)
@@ -185,7 +189,19 @@ module RSS
185
189
  private
186
190
  def initialize_variables
187
191
  self.class.need_initialize_variables.each do |variable_name, init_value|
188
- instance_eval("@#{variable_name} = #{init_value}", __FILE__, __LINE__)
192
+ if init_value.nil?
193
+ value = nil
194
+ else
195
+ if init_value.respond_to?(:call)
196
+ value = init_value.call(self)
197
+ elsif init_value.is_a?(String)
198
+ # just for backward compatibility
199
+ value = instance_eval(init_value, __FILE__, __LINE__)
200
+ else
201
+ value = init_value
202
+ end
203
+ end
204
+ instance_variable_set("@#{variable_name}", value)
189
205
  end
190
206
  end
191
207
 
@@ -222,7 +238,7 @@ module RSS
222
238
  setter = "#{var}="
223
239
  if target.respond_to?(setter)
224
240
  value = __send__(var)
225
- if value
241
+ unless value.nil?
226
242
  target.__send__(setter, value)
227
243
  set = true
228
244
  end
@@ -238,7 +254,8 @@ module RSS
238
254
 
239
255
  def variables
240
256
  self.class.need_initialize_variables.find_all do |name, init|
241
- "nil" == init
257
+ # init == "nil" is just for backward compatibility
258
+ init.nil? or init == "nil"
242
259
  end.collect do |name, init|
243
260
  name
244
261
  end
@@ -336,36 +353,62 @@ module RSS
336
353
 
337
354
  module SetupDefaultDate
338
355
  private
339
- def _set_default_values(&block)
356
+ def _set_default_values
340
357
  keep = {
341
358
  :date => date,
342
359
  :dc_dates => dc_dates.to_a.dup,
343
360
  }
344
- _date = date
361
+ _date = _parse_date_if_needed(date)
345
362
  if _date and !dc_dates.any? {|dc_date| dc_date.value == _date}
346
363
  dc_date = self.class::DublinCoreDates::DublinCoreDate.new(self)
347
364
  dc_date.value = _date.dup
348
365
  dc_dates.unshift(dc_date)
349
366
  end
350
367
  self.date ||= self.dc_date
351
- super(&block)
368
+ super
352
369
  ensure
353
370
  date = keep[:date]
354
371
  dc_dates.replace(keep[:dc_dates])
355
372
  end
373
+
374
+ def _parse_date_if_needed(date_value)
375
+ date_value = Time.parse(date_value) if date_value.is_a?(String)
376
+ date_value
377
+ end
378
+ end
379
+
380
+ module SetupDefaultLanguage
381
+ private
382
+ def _set_default_values
383
+ keep = {
384
+ :dc_languages => dc_languages.to_a.dup,
385
+ }
386
+ _language = language
387
+ if _language and
388
+ !dc_languages.any? {|dc_language| dc_language.value == _language}
389
+ dc_language = self.class::DublinCoreLanguages::DublinCoreLanguage.new(self)
390
+ dc_language.value = _language.dup
391
+ dc_languages.unshift(dc_language)
392
+ end
393
+ super
394
+ ensure
395
+ dc_languages.replace(keep[:dc_languages])
396
+ end
356
397
  end
357
398
 
358
399
  class RSSBase < Base
359
400
  class << self
360
- def make(version, &block)
361
- new(version).make(&block)
401
+ def make(*args, &block)
402
+ new(*args).make(&block)
362
403
  end
363
404
  end
364
405
 
365
406
  %w(xml_stylesheets channel image items textinput).each do |element|
366
407
  attr_reader element
367
- add_need_initialize_variable(element, "make_#{element}")
368
- module_eval(<<-EOC, __FILE__, __LINE__)
408
+ add_need_initialize_variable(element) do |object|
409
+ object.send("make_#{element}")
410
+ end
411
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
369
412
  private
370
413
  def setup_#{element}(feed)
371
414
  @#{element}.to_feed(feed)
@@ -376,7 +419,7 @@ module RSS
376
419
  end
377
420
  EOC
378
421
  end
379
-
422
+
380
423
  attr_reader :feed_version
381
424
  alias_method(:rss_version, :feed_version)
382
425
  attr_accessor :version, :encoding, :standalone
@@ -390,14 +433,10 @@ module RSS
390
433
  @encoding = "UTF-8"
391
434
  @standalone = nil
392
435
  end
393
-
436
+
394
437
  def make
395
- if block_given?
396
- yield(self)
397
- to_feed
398
- else
399
- nil
400
- end
438
+ yield(self)
439
+ to_feed
401
440
  end
402
441
 
403
442
  def to_feed
@@ -405,13 +444,10 @@ module RSS
405
444
  setup_xml_stylesheets(feed)
406
445
  setup_elements(feed)
407
446
  setup_other_elements(feed)
408
- if feed.valid?
409
- feed
410
- else
411
- nil
412
- end
447
+ feed.validate
448
+ feed
413
449
  end
414
-
450
+
415
451
  private
416
452
  remove_method :make_xml_stylesheets
417
453
  def make_xml_stylesheets
@@ -428,7 +464,7 @@ module RSS
428
464
  attr_accessor attribute
429
465
  add_need_initialize_variable(attribute)
430
466
  end
431
-
467
+
432
468
  def to_feed(feed)
433
469
  xss = ::RSS::XMLStyleSheet.new
434
470
  guess_type_if_need(xss)
@@ -451,7 +487,7 @@ module RSS
451
487
  end
452
488
  end
453
489
  end
454
-
490
+
455
491
  class ChannelBase < Base
456
492
  include SetupDefaultDate
457
493
 
@@ -472,12 +508,24 @@ module RSS
472
508
  end
473
509
 
474
510
  %w(id about language
475
- managingEditor webMaster rating docs date
476
- lastBuildDate ttl).each do |element|
511
+ managingEditor webMaster rating docs ttl).each do |element|
477
512
  attr_accessor element
478
513
  add_need_initialize_variable(element)
479
514
  end
480
515
 
516
+ %w(date lastBuildDate).each do |date_element|
517
+ attr_reader date_element
518
+ add_need_initialize_variable(date_element)
519
+ end
520
+
521
+ def date=(_date)
522
+ @date = _parse_date_if_needed(_date)
523
+ end
524
+
525
+ def lastBuildDate=(_date)
526
+ @lastBuildDate = _parse_date_if_needed(_date)
527
+ end
528
+
481
529
  def pubDate
482
530
  date
483
531
  end
@@ -526,7 +574,7 @@ module RSS
526
574
  end
527
575
  end
528
576
  end
529
-
577
+
530
578
  class SkipHoursBase < Base
531
579
  def_array_element("hour")
532
580
 
@@ -537,7 +585,7 @@ module RSS
537
585
  end
538
586
  end
539
587
  end
540
-
588
+
541
589
  class CloudBase < Base
542
590
  %w(domain port path registerProcedure protocol).each do |element|
543
591
  attr_accessor element
@@ -607,7 +655,7 @@ module RSS
607
655
  include AtomTextConstructBase
608
656
  end
609
657
  end
610
-
658
+
611
659
  class ImageBase < Base
612
660
  %w(title url width height description).each do |element|
613
661
  attr_accessor element
@@ -618,18 +666,18 @@ module RSS
618
666
  @maker.channel.link
619
667
  end
620
668
  end
621
-
669
+
622
670
  class ItemsBase < Base
623
671
  def_array_element("item")
624
672
 
625
673
  attr_accessor :do_sort, :max_size
626
-
674
+
627
675
  def initialize(maker)
628
676
  super
629
677
  @do_sort = false
630
678
  @max_size = -1
631
679
  end
632
-
680
+
633
681
  def normalize
634
682
  if @max_size >= 0
635
683
  sort_if_need[0...@max_size]
@@ -670,13 +718,22 @@ module RSS
670
718
  ["contributor", "name"],
671
719
  ].each do |name, attribute|
672
720
  def_classed_elements(name, attribute)
673
- end
721
+ end
674
722
 
675
- %w(date comments id published).each do |element|
723
+ %w(comments id published).each do |element|
676
724
  attr_accessor element
677
725
  add_need_initialize_variable(element)
678
726
  end
679
727
 
728
+ %w(date).each do |date_element|
729
+ attr_reader date_element
730
+ add_need_initialize_variable(date_element)
731
+ end
732
+
733
+ def date=(_date)
734
+ @date = _parse_date_if_needed(_date)
735
+ end
736
+
680
737
  def pubDate
681
738
  date
682
739
  end
@@ -715,6 +772,14 @@ module RSS
715
772
  attr_accessor element
716
773
  add_need_initialize_variable(element)
717
774
  end
775
+
776
+ def permanent_link?
777
+ isPermaLink
778
+ end
779
+
780
+ def permanent_link=(bool)
781
+ self.isPermaLink = bool
782
+ end
718
783
  end
719
784
 
720
785
  class EnclosureBase < Base
@@ -725,6 +790,8 @@ module RSS
725
790
  end
726
791
 
727
792
  class SourceBase < Base
793
+ include SetupDefaultDate
794
+
728
795
  %w(authors categories contributors generator icon
729
796
  logo rights subtitle title).each do |name|
730
797
  def_classed_element(name)
@@ -736,7 +803,7 @@ module RSS
736
803
  def_classed_elements(name, attribute)
737
804
  end
738
805
 
739
- %w(id content date).each do |element|
806
+ %w(id content).each do |element|
740
807
  attr_accessor element
741
808
  add_need_initialize_variable(element)
742
809
  end
@@ -744,6 +811,15 @@ module RSS
744
811
  alias_method(:url, :link)
745
812
  alias_method(:url=, :link=)
746
813
 
814
+ %w(date).each do |date_element|
815
+ attr_reader date_element
816
+ add_need_initialize_variable(date_element)
817
+ end
818
+
819
+ def date=(_date)
820
+ @date = _parse_date_if_needed(_date)
821
+ end
822
+
747
823
  def updated
748
824
  date
749
825
  end