@@ -10,13 +10,14 @@ namespace :news do
1010
1111 logger . info ( '==== START news:fetch ====' )
1212
13- # 本番/開発環境では実サイトのフィード 、それ以外(テスト環境など)ではテスト用フィード
13+ # 本番/開発環境では実フィード 、それ以外(テスト環境など)ではテスト用フィード
1414 DOJO_NEWS_FEED = 'https://news.coderdojo.jp/feed/'
1515 TEST_NEWS_FEED = Rails . root . join ( 'spec' , 'fixtures' , 'sample_news.rss' )
1616 RSS_FEED_LIST = ( Rails . env . test? || Rails . env . staging? ) ?
1717 [ TEST_NEWS_FEED ] :
1818 [ DOJO_NEWS_FEED ]
1919
20+ # RSS のデータ構造を、News のデータ構造に変換
2021 fetched_items = RSS_FEED_LIST . flat_map do |feed |
2122 feed = RSS ::Parser . parse ( feed , false )
2223 feed . items . map { |item |
@@ -38,16 +39,14 @@ namespace :news do
3839 updated_items = [ ]
3940
4041 fetched_items . each do |fetched_item |
41- existing_item = existing_items [ fetched_item [ 'url' ] ]
42+ existing_item = existing_items [ fetched_item [ 'url' ] ]
4243
43- if existing_item
44- # タイトルまたは公開日が変わっていたら更新
45- if existing_item [ 'title' ] != fetched_item [ 'title' ] || existing_item [ 'published_at' ] != fetched_item [ 'published_at' ]
46- updated_items << existing_item . merge ( fetched_item )
47- end
48- else
44+ if existing_item . nil?
4945 # 新規アイテムならそのまま追加
5046 created_items << fetched_item
47+ elsif existing_item [ 'title' ] != fetched_item [ 'title' ] || existing_item [ 'published_at' ] != fetched_item [ 'published_at' ]
48+ # タイトルまたは公開日が変わっていたら更新
49+ updated_items << existing_item . merge ( fetched_item )
5150 end
5251 end
5352
@@ -57,21 +56,18 @@ namespace :news do
5756 item [ 'id' ] = existing_max_id + index + 1
5857 end
5958
60- # 更新されなかった既存アイテムを取得
59+ # URL をキーに、更新されなかった既存の YAML データを取得・保持
6160 updated_urls = updated_items . map { it [ 'url' ] }
6261 unchanged_items = existing_items . values . reject { updated_urls . include? ( it [ 'url' ] ) }
6362
64- # 全アイテムをマージ
65- all_items = unchanged_items + updated_items + created_items
66-
67- # 日付降順ソート
68- sorted_items = all_items . sort_by { |item |
69- Time . parse ( item [ 'published_at' ] )
63+ # 新規・更新・既存の各アイテムをマージし、日付降順でソート
64+ merged_items = ( unchanged_items + updated_items + created_items ) . sort_by {
65+ Time . parse ( it [ 'published_at' ] )
7066 } . reverse
7167
7268 # YAML ファイルに書き出し
7369 File . open ( 'db/news.yml' , 'w' ) do |f |
74- formatted_items = sorted_items . map do |item |
70+ formatted_items = merged_items . map do |item |
7571 {
7672 'id' => item [ 'id' ] ,
7773 'url' => item [ 'url' ] ,
@@ -83,7 +79,7 @@ namespace :news do
8379 f . write ( formatted_items . to_yaml )
8480 end
8581
86- logger . info ( "✅ Wrote #{ sorted_items . size } items to db/news.yml (#{ created_items . size } new, #{ updated_items . size } updated)" )
82+ logger . info ( "✅ Wrote #{ merged_items . size } items to db/news.yml (#{ created_items . size } new, #{ updated_items . size } updated)" )
8783 logger . info ( '==== END news:fetch ====' )
8884 end
8985
0 commit comments