diff --git a/lib/tasks/docs/statistics_aggregation.md b/docs/statistics_aggregation.md similarity index 70% rename from lib/tasks/docs/statistics_aggregation.md rename to docs/statistics_aggregation.md index ab8ae6534..e8da102ca 100644 --- a/lib/tasks/docs/statistics_aggregation.md +++ b/docs/statistics_aggregation.md @@ -1,8 +1,8 @@ -# rake statistics:aggregation[from,to] +# rake statistics:aggregation[from,to,provider] ## 概要 -指定期間のイベント履歴を集計する +指定期間/プロバイダのイベント履歴を集計する ## 引数 @@ -10,15 +10,18 @@ |--|--|--|--| |from|string|(省略可)|集計期間開始年/年月/年月日| |to|string|(省略可)|集計期間終了年/年月/年月日| +|provider|string|(省略可)|集計対象プロバイダ| ## 説明 from/to で指定された期間のイベント履歴を集計する。 +provider が指定されたとき、指定プロバイダに対してのみ集計を行う。 + + from, to を共に省略した場合、前週一週間分の履歴を集計する。 + 全期間(2012年以降前日まで)を集計する場合、from/to 共に '-' を指定する。 ``` -rake statistics:aggregation[-,-] +rake statistics:aggregation[-,-,] ``` + from/to に期間を指定する場合、それぞれ以下の形式で指定可能。 ``` @@ -27,3 +30,5 @@ rake statistics:aggregation[-,-] + to は前日、前日の年月、もしくは前日の年を最大とする。これより未来を指定された場合でも、最大以降は集計対象外とする。 + from, to いずれかを省略した場合、指定された他方の年/年月/年月日の履歴を集計する。 + ++ provider には、connpass, doorkeeper, facebook, static_yaml が指定可能。 diff --git a/lib/statistics/aggregation.rb b/lib/statistics/aggregation.rb index afa6880f6..1d3115d92 100644 --- a/lib/statistics/aggregation.rb +++ b/lib/statistics/aggregation.rb @@ -2,7 +2,7 @@ module Statistics class Aggregation def initialize(args) @from, @to = aggregation_period(args[:from], args[:to]) - dojos = fetch_dojos + dojos = fetch_dojos(args[:provider]) @externals = dojos[:externals] @internals = dojos[:internals] end @@ -56,12 +56,27 @@ def date_from(str) d end - def fetch_dojos + def fetch_dojos(provider) + if provider.blank? + # 全プロバイダ対象 + external_services = DojoEventService::EXTERNAL_SERVICES + internal_services = DojoEventService::INTERNAL_SERVICES + else + external_services = [] + internal_services = [] + case provider + when 'connpass', 'doorkeeper', 'facebook' + external_services = [provider] + when 'static_yaml' + internal_services = [provider] + end + end + { - externals: find_dojos_by(DojoEventService::EXTERNAL_SERVICES), - internals: find_dojos_by(DojoEventService::INTERNAL_SERVICES) + externals: find_dojos_by(external_services), + internals: find_dojos_by(internal_services) } - end + end def find_dojos_by(services) services.each.with_object({}) do |name, hash| diff --git a/lib/tasks/statistics.rake b/lib/tasks/statistics.rake index 64e28a358..46d6b5cfe 100644 --- a/lib/tasks/statistics.rake +++ b/lib/tasks/statistics.rake @@ -1,9 +1,8 @@ require_relative '../statistics.rb' namespace :statistics do - desc '月次/週次のイベント履歴を集計します' - task :aggregation, [:from, :to] => :environment do |tasks, args| - # EventService::Providers::Facebook.access_token = Koala::Facebook::OAuth.new(ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET']).get_app_access_token + desc '指定期間/プロバイダのイベント履歴を集計します' + task :aggregation, [:from, :to, :provider] => :environment do |tasks, args| EventHistory.transaction do Statistics::Aggregation.new(args).run end diff --git a/spec/lib/statistics/aggregation_spec.rb b/spec/lib/statistics/aggregation_spec.rb index 8f649b44f..6c16198dd 100644 --- a/spec/lib/statistics/aggregation_spec.rb +++ b/spec/lib/statistics/aggregation_spec.rb @@ -104,5 +104,43 @@ expect{ sa.send(:date_from, 'abc') }.to raise_error(ArgumentError) end end + + context 'fetch_dojos(provider)' do + it '指定なし' do + dojos = sa.send(:fetch_dojos, nil) + expect(dojos[:externals].keys).to eq(DojoEventService::EXTERNAL_SERVICES) + expect(dojos[:internals].keys).to eq(DojoEventService::INTERNAL_SERVICES) + end + + it 'connpass' do + dojos = sa.send(:fetch_dojos, 'connpass') + expect(dojos[:externals].keys).to eq(['connpass']) + expect(dojos[:internals].keys).to eq([]) + end + + it 'doorkeeper' do + dojos = sa.send(:fetch_dojos, 'doorkeeper') + expect(dojos[:externals].keys).to eq(['doorkeeper']) + expect(dojos[:internals].keys).to eq([]) + end + + it 'facebook' do + dojos = sa.send(:fetch_dojos, 'facebook') + expect(dojos[:externals].keys).to eq(['facebook']) + expect(dojos[:internals].keys).to eq([]) + end + + it 'static_yaml' do + dojos = sa.send(:fetch_dojos, 'static_yaml') + expect(dojos[:externals].keys).to eq([]) + expect(dojos[:internals].keys).to eq(['static_yaml']) + end + + it 'other' do + dojos = sa.send(:fetch_dojos, 'abc') + expect(dojos[:externals].keys).to eq([]) + expect(dojos[:internals].keys).to eq([]) + end + end end end