@@ -7,8 +7,8 @@ require 'active_support/broadcast_logger'
77
88def safe_open ( url )
99 uri = URI . parse ( url )
10- return File . read ( url ) if uri . scheme . nil? || uri . scheme == 'file'
1110 raise "不正なURLです: #{ url } " unless uri . is_a? ( URI ::HTTP ) || uri . is_a? ( URI ::HTTPS )
11+
1212 Net ::HTTP . start ( uri . host , uri . port , use_ssl : uri . scheme == 'https' ) do |http |
1313 request = Net ::HTTP ::Get . new ( uri )
1414 response = http . request ( request )
@@ -26,19 +26,25 @@ namespace :news do
2626
2727 logger . info ( '==== START news:fetch ====' )
2828
29- # YAML出力先を環境変数で上書きできるようにする
30- yaml_path = ENV [ 'NEWS_YAML_PATH' ] ? Pathname . new ( ENV [ 'NEWS_YAML_PATH' ] ) : Rails . root . join ( 'db' , 'news.yml' )
31- feed_urls = ENV [ 'NEWS_RSS_PATH' ] ? [ ENV [ 'NEWS_RSS_PATH' ] ] :
32- ( Rails . env . test? || Rails . env . staging? ?
33- [ Rails . root . join ( 'spec' , 'fixtures' , 'sample_news.rss' ) . to_s ] :
34- [ 'https://news.coderdojo.jp/feed/' ] )
35-
29+ # 既存の news.yml を読み込み
30+ yaml_path = Rails . root . join ( 'db' , 'news.yml' )
3631 existing_news = if File . exist? ( yaml_path )
3732 YAML . safe_load ( File . read ( yaml_path ) , permitted_classes : [ Time ] , aliases : true ) [ 'news' ] || [ ]
3833 else
3934 [ ]
4035 end
4136
37+ # テスト/ステージング環境ではサンプルファイル、本番は実サイトのフィード
38+ feed_urls = if Rails . env . test? || Rails . env . staging?
39+ [ Rails . root . join ( 'spec' , 'fixtures' , 'sample_news.rss' ) . to_s ]
40+ else
41+ [
42+ 'https://news.coderdojo.jp/feed/'
43+ # 必要に応じて他 Dojo の RSS もここに追加可能
44+ # 'https://coderdojotokyo.org/feed',
45+ ]
46+ end
47+
4248 # RSS 取得&パース
4349 new_items = feed_urls . flat_map do |url |
4450 logger . info ( "Fetching RSS → #{ url } " )
@@ -101,11 +107,7 @@ namespace :news do
101107 Time . parse ( item [ 'published_at' ] )
102108 } . reverse
103109
104- sorted_items . each_with_index do |item , index |
105- item [ 'id' ] = index + 1
106- end
107-
108- File . open ( yaml_path , 'w' ) do |f |
110+ File . open ( 'db/news.yml' , 'w' ) do |f |
109111 formatted_items = sorted_items . map do |item |
110112 {
111113 'id' => item [ 'id' ] ,
@@ -118,7 +120,7 @@ namespace :news do
118120 f . write ( { 'news' => formatted_items } . to_yaml )
119121 end
120122
121- logger . info ( "✅ Wrote #{ sorted_items . size } items to #{ yaml_path } (#{ truly_new_items_sorted . size } new, #{ updated_items . size } updated)" )
123+ logger . info ( "✅ Wrote #{ sorted_items . size } items to db/news.yml (#{ truly_new_items_sorted . size } new, #{ updated_items . size } updated)" )
122124 logger . info ( '==== END news:fetch ====' )
123125 end
124126end
0 commit comments