Skip to content
This repository has been archived by the owner on Aug 17, 2021. It is now read-only.

その日の歩数を fitbit API から取得し fluentd に送る #54

Merged
merged 5 commits into from
Feb 6, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions .fitbit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
oauth:
consumer_key: <%= ENV['FITBIT_CONSUMER_KEY'] %>
consumer_secret: <%= ENV['FITBIT_CONSUMER_SECRET'] %>
token: <%= ENV['FITBIT_TOKEN'] %>
secret: <%= ENV['FITBIT_SECRET'] %>
user_id: <%= ENV['FITBIT_USER_ID'] %>
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ gem 'rails', '~> 5.0.0.beta1.1'
# gem 'jbuilder', '~> 2.0'
# Use Puma as the app server
gem 'dotenv-rails'
gem 'fitgem'
gem 'ltsv_log_formatter'
gem 'fluent-logger'
gem 'google-api-client', '~> 0.8.6'
Expand Down
4 changes: 4 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ GEM
faye-websocket (0.10.2)
eventmachine (>= 0.12.0)
websocket-driver (>= 0.5.1)
fitgem (0.12.1)
oauth
flay (2.7.0)
erubis (~> 2.7.0)
ruby_parser (~> 3.0)
Expand Down Expand Up @@ -186,6 +188,7 @@ GEM
net-ssh (3.0.2)
nokogiri (1.6.7.2)
mini_portile2 (~> 2.0.0.rc2)
oauth (0.4.7)
os (0.9.6)
pry (0.10.3)
coderay (~> 1.1.0)
Expand Down Expand Up @@ -315,6 +318,7 @@ DEPENDENCIES
capistrano3-unicorn
dotenv-rails
factory_girl_rails
fitgem
flay
fluent-logger
google-api-client (~> 0.8.6)
Expand Down
14 changes: 14 additions & 0 deletions app/controllers/activity_metricks_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class ActivityMetricksController < SendToFluentController
def collect_steps
return if send_fitbit_timing?

fitbit = Fitbit.new unit_system: 'METRIC'
return if fitbit.errors?

fluent_logger('a-know-metricks').post('activity',
{
todays_steps: fitbit.todays_steps,
}
)
end
end
6 changes: 6 additions & 0 deletions app/controllers/send_to_fluent_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
class SendToFluentController < ActionController::API
SEND_FREQUENCY_MIN = 15
SEND_FREQUENCY_FITBIT = 5

def fluent_logger(primary_tag)
@logger ||= if Rails.env == 'test'
Expand All @@ -15,4 +16,9 @@ def every_15min?
min = DateTime.now.min
min % SEND_FREQUENCY_MIN == 0
end

def send_fitbit_timing?
min = DateTime.now.min
min % SEND_FREQUENCY_FITBIT == 0
end
end
4 changes: 4 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
# blog_metricks_subscribers GET /blog_metricks/subscribers(.:format) blog_metricks#count_subscribers
# blog_metricks_hatena_stars GET /blog_metricks/hatena_stars(.:format) blog_metricks#count_hatena_stars
# blog_metricks_active_visitors GET /blog_metricks/active_visitors(.:format) blog_metricks#count_active_visitors
# a_know_metricks_steps GET /a_know_metricks/steps(.:format) activity_metricks#collect_steps
#

Rails.application.routes.draw do
Expand All @@ -20,6 +21,9 @@
get '/blog_metricks/hatena_stars' => 'blog_metricks#count_hatena_stars'
get '/blog_metricks/active_visitors' => 'blog_metricks#count_active_visitors'

# collect a-know metricks
get '/a_know_metricks/steps' => 'activity_metricks#collect_steps'

# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

# Serve websocket cable requests in-process
Expand Down
28 changes: 28 additions & 0 deletions lib/fitbit.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require 'fitgem'

# https://github.com/a-know/a-know-dashing/blob/master/lib/fitbit.rb
class Fitbit

attr_reader :client, :options, :config

def initialize(options = {})
@options = options
@config = Fitgem::Client.symbolize_keys YAML.load(ERB.new(IO.read('.fitbit.yml')).result)
@client = Fitgem::Client.new config[:oauth].merge!(options)
end

def todays_steps
summary['steps']
end

private

def today
@today ||= client.activities_on_date('today')
end

def summary
today['summary']
end

end
9 changes: 9 additions & 0 deletions spec/request/activity_metricks_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# encoding: utf-8

require 'rails_helper'

RSpec.describe '/a_know_metricks/steps', type: :request do
describe 'GET /a_know_metricks/steps' do
pending 'fitbit API をリクエストし当日の歩数を取得、fluentd に送る'
end
end
66 changes: 33 additions & 33 deletions spec/routing/routing_spec.rb
Original file line number Diff line number Diff line change
@@ -1,44 +1,44 @@
require 'rails_helper'

RSpec.describe 'routing to bookmarks', type: :routing do
it 'get /bookmarks to bookmarks#index' do
expect(get: '/bookmarks').
to route_to(controller: 'bookmarks', action: 'index')
end
end
RSpec.describe 'Routes', type: :routing do
describe 'for a-know-home routes' do
it 'get /bookmarks to bookmarks#index' do
expect(get: '/bookmarks').
to route_to(controller: 'bookmarks', action: 'index')
end

RSpec.describe 'routing to knock', type: :routing do
it 'post /knock to knock#notify' do
expect(post: '/knock').
to route_to(controller: 'knock', action: 'notify')
it 'post /knock to knock#notify' do
expect(post: '/knock').
to route_to(controller: 'knock', action: 'notify')
end
end
end

RSpec.describe 'routing to count bookmarks', type: :routing do
it 'get /blog_metricks/bookmarks to blog_metricks#count_bookmarks' do
expect(get: '/blog_metricks/bookmarks').
to route_to(controller: 'blog_metricks', action: 'count_bookmarks')
end
end
describe 'for blog-metricks' do
it 'get /blog_metricks/bookmarks to blog_metricks#count_bookmarks' do
expect(get: '/blog_metricks/bookmarks').
to route_to(controller: 'blog_metricks', action: 'count_bookmarks')
end

RSpec.describe 'routing to count subscribers', type: :routing do
it 'get /blog_metricks/subscribers to blog_metricks#count_subscribers' do
expect(get: '/blog_metricks/subscribers').
to route_to(controller: 'blog_metricks', action: 'count_subscribers')
end
end
it 'get /blog_metricks/subscribers to blog_metricks#count_subscribers' do
expect(get: '/blog_metricks/subscribers').
to route_to(controller: 'blog_metricks', action: 'count_subscribers')
end

it 'get /blog_metricks/hatena_stars to blog_metricks#count_hatena_stars' do
expect(get: '/blog_metricks/hatena_stars').
to route_to(controller: 'blog_metricks', action: 'count_hatena_stars')
end

RSpec.describe 'routing to count hatena-star', type: :routing do
it 'get /blog_metricks/hatena_stars to blog_metricks#count_hatena_stars' do
expect(get: '/blog_metricks/hatena_stars').
to route_to(controller: 'blog_metricks', action: 'count_hatena_stars')
it 'get /blog_metricks/active_visitors to blog_metricks#count_active_visitors' do
expect(get: '/blog_metricks/active_visitors').
to route_to(controller: 'blog_metricks', action: 'count_active_visitors')
end
end
end

RSpec.describe 'routing to count active visitors', type: :routing do
it 'get /blog_metricks/active_visitors to blog_metricks#count_active_visitors' do
expect(get: '/blog_metricks/active_visitors').
to route_to(controller: 'blog_metricks', action: 'count_active_visitors')
describe 'for a-know-metricks' do
it 'get /a_know_metricks/steps to activity_metricks#collect_steps' do
expect(get: '/a_know_metricks/steps').
to route_to(controller: 'activity_metricks', action: 'collect_steps')
end
end
end