class Strava::App
Constants
- DESCRIPTION
- NAME
Attributes
activities[RW]
client[RW]
graph[RW]
publicize[RW]
simulate[RW]
types[RW]
Public Class Methods
new()
click to toggle source
# File lib/strava/app.rb, line 15 def initialize config.config_file_base_name = Strava::BASE_NAME config.describes_application app_name: NAME, app_version: Strava::VERSION, app_description: DESCRIPTION config.add_command_line_section('Strava options') do |slop| slop.on :strava_access_token, 'Strava access token', argument: true, as: String slop.on :activity, 'Display this activity type only (Run, Ride, Swim)', argument: true slop.on :graph, 'Display a graph instead of a table', argument: false slop.on :scope, 'Display limited scoped activities (public or private)', argument: true slop.on :publicize, 'Make private activities public', argument: false end if config[:help] puts config.command_line_help exit 0 end if config[:activity] @types = [config[:activity]] else @types = %w(Run Ride Swim) end @graph = config[:graph] @scope = config[:scope] @cache_key = config[:cache_key] || 'activities' @cache_time = config[:cache_time] || 24 * 3600 @publicize = config[:publicize] @simulate = config[:simulate] @activities = [] end
Public Instance Methods
configure_api_client()
click to toggle source
# File lib/strava/app.rb, line 48 def configure_api_client @client = Strava::Api::V3::Client.new(access_token: config[:strava_access_token]) end
run()
click to toggle source
# File lib/strava/app.rb, line 52 def run configure_api_client fetch_activities_data for type in types if publicize publicize_activities(type) elsif graph output_screen = build_graph_speed(type) else output_screen = build_table(type) end if output_screen.nil? puts "No activity found. Go out and start #{type}ing!" else puts output_screen end puts "\n" end end
Private Instance Methods
build_graph_speed(activity_type)
click to toggle source
# File lib/strava/app.rb, line 105 def build_graph_speed(activity_type) graph = '' all = select_activities(activity_type).map do |raw_activity| Activity.new(raw_activity) end activities_by_year = all.group_by do |activity| activity.date.year end activities_by_year.each do |year, a| data = [] activities_by_month = a.group_by do |activity| activity.date.month end activities_by_month.each do |month, activities| avg_speed = activities.sum(&:avg_speed) / activities.size data << [ "#{month}/#{year}", avg_speed ] end if data.size > 1 graph += AsciiCharts::Cartesian.new( data.reverse, title: "#{year} - #{activity_type} avg speed", step_size: 0.3 ).draw + "\n" end end graph unless graph.empty? end
build_table(activity_type)
click to toggle source
# File lib/strava/app.rb, line 78 def build_table(activity_type) fields = ["Date", "Distance", "Elapsed time", "Avg speed"] rows = [] date = -1 select_activities(activity_type).each do |raw_activity| activity = Activity.new(raw_activity) current_date = activity.date rows << :separator if date != -1 && current_date.month != date.month date = current_date rows << [ activity.human_date, activity.human_distance_km, activity.human_elapsed_time, activity.human_avg_speed ] end Terminal::Table.new( title: activity_type, headings: fields, rows: rows ) unless rows.empty? end
fetch_activities_data()
click to toggle source
# File lib/strava/app.rb, line 144 def fetch_activities_data VCR.use_cassette( @cache_key, record: :new_episodes, re_record_interval: @cache_time ) do page = 0 per_page = 100 while activities.count == page * per_page page += 1 @activities += client.list_athlete_activities( per_page: per_page, page: page ) end end end
publicize_activities(type)
click to toggle source
# File lib/strava/app.rb, line 172 def publicize_activities(type) filtered_activities = select_activities(type) $stdout.puts "You are about to make #{filtered_activities.count} public. Are you sure? (y/n)" if $stdin.gets.strip == 'y' && !simulate filtered_activities.each do |activity| client.update_an_activity(activity.id, private: false) end $stdout.puts "#{filtered_activities.count} activities were made public! /o/" end end
select_activities(type)
click to toggle source
# File lib/strava/app.rb, line 163 def select_activities(type) activities.select do |activity| activity.type == type && ( @scope.nil? || !activity.private ^ (@scope == 'private') ) end end