rubysl-rss 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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