Skip to content

Commit 7d71463

Browse files
committed
refactor: news.rake の可読性と保守性を向上
- if/elsif構文に統一して条件分岐を簡素化 - 変数名を明確化(all_items → merged_items) - ソート処理をメソッドチェーンで一行に統合 - コメントを具体的な処理内容に改善 - YAGNI原則に基づく不要な複雑さの除去
1 parent 43e0f56 commit 7d71463

File tree

1 file changed

+13
-17
lines changed

1 file changed

+13
-17
lines changed

lib/tasks/news.rake

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)