@@ -7,8 +7,8 @@ require 'active_support/broadcast_logger'
7
7
8
8
def safe_open ( url )
9
9
uri = URI . parse ( url )
10
- return File . read ( url ) if uri . scheme . nil? || uri . scheme == 'file'
11
10
raise "不正なURLです: #{ url } " unless uri . is_a? ( URI ::HTTP ) || uri . is_a? ( URI ::HTTPS )
11
+
12
12
Net ::HTTP . start ( uri . host , uri . port , use_ssl : uri . scheme == 'https' ) do |http |
13
13
request = Net ::HTTP ::Get . new ( uri )
14
14
response = http . request ( request )
@@ -26,19 +26,25 @@ namespace :news do
26
26
27
27
logger . info ( '==== START news:fetch ====' )
28
28
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' )
36
31
existing_news = if File . exist? ( yaml_path )
37
32
YAML . safe_load ( File . read ( yaml_path ) , permitted_classes : [ Time ] , aliases : true ) [ 'news' ] || [ ]
38
33
else
39
34
[ ]
40
35
end
41
36
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
+
42
48
# RSS 取得&パース
43
49
new_items = feed_urls . flat_map do |url |
44
50
logger . info ( "Fetching RSS → #{ url } " )
@@ -101,11 +107,7 @@ namespace :news do
101
107
Time . parse ( item [ 'published_at' ] )
102
108
} . reverse
103
109
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 |
109
111
formatted_items = sorted_items . map do |item |
110
112
{
111
113
'id' => item [ 'id' ] ,
@@ -118,7 +120,7 @@ namespace :news do
118
120
f . write ( { 'news' => formatted_items } . to_yaml )
119
121
end
120
122
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)" )
122
124
logger . info ( '==== END news:fetch ====' )
123
125
end
124
126
end
0 commit comments