module TimeLogRobot

Constants

VERSION

Public Class Methods

create_settings_file_if_nonexistent() click to toggle source
# File lib/time_log_robot.rb, line 137
def create_settings_file_if_nonexistent
  File.new(settings_file_path, "w+") unless File.file?(settings_file_path)
end
envars() click to toggle source
# File lib/time_log_robot.rb, line 172
def envars
  envars_help.keys
end
envars_help() click to toggle source
# File lib/time_log_robot.rb, line 176
def envars_help
  {
    'MAPPING_FILE_PATH' =>
      "This is the path to your mapping file. By default, this file is named `.time_log_robot_mapping.yml` and lives in your home directory.\n\n",

    'TOGGL_TOKEN' =>
      "In your Toggl account, go to your profile page and look for the API token at the bottom.\n\n",

    'TOGGL_WORKSPACE_ID' =>
      "This is a little trickier. Your workspaces usually only show a human-readable name to you in Toggl's UI, and here you need the workspace machine ID. But you can do a curl request to find it like this (replacing TOGGL_TOKEN with your token from above):

      \tcurl -v -u TOGGL_TOKEN:api_token \ -X GET https://www.toggl.com/api/v8/workspaces

      Look at the result and find the id given for the workspace you want to use.\n\n",

    'TOGGL_USER_AGENT' =>
      "This is your Toggl username, usually your email.\n\n",

    'TOGGL_DEFAULT_LOG_TAG' =>
      "This is the tag name you would like to use for tagging your Toggl time entries as they are logged to JIRA.\n\n",

    'JIRA_USERNAME' =>
      "This is your JIRA username, which can be found in your JIRA user profile.\n\n",

    'JIRA_PASSWORD' =>
      "I know there's a lot of jargon, but some of these are pretty self-explanatory\n"
  }
end
fetch_envars_from_config() click to toggle source
# File lib/time_log_robot.rb, line 114
def fetch_envars_from_config
  return unless envars = YAML.load_file(settings_file_path)
  envars.each_pair do |key, value|
    value.strip! unless should_not_strip?(key)
    ENV[key.upcase] = value
  end
end
fetch_time_report(since) click to toggle source
# File lib/time_log_robot.rb, line 164
def fetch_time_report(since)
  if since.nil?
    Toggl::Report.fetch
  else
    Toggl::Report.fetch(since: since)
  end
end
get_envar(key) click to toggle source
# File lib/time_log_robot.rb, line 98
def get_envar(key)
  print "Enter your #{key}: "
  env_value = gets.chomp
  env_value.strip! unless should_not_strip?(key)
  ENV[key] = env_value
  if ENV[key].length == 0
    puts 'Invalid input. This is a required field.'
    exit
  end
  ENV[key]
end
get_missing_envars() click to toggle source
# File lib/time_log_robot.rb, line 87
def get_missing_envars
  missing_envars = {}

  TimeLogRobot.envars.each do |key|
    next if key == 'MAPPING_FILE_PATH' || ENV[key]
    missing_envars[key] = get_envar(key)
  end

  return missing_envars
end
parse(args) click to toggle source
# File lib/time_log_robot.rb, line 28
def parse(args)
  options = OpenStruct.new
  options.mapping   = nil
  options.overwrite = false
  options.since     = nil

  opt_parser = OptionParser.new do |opts|
    opts.separator ''
    opts.banner = 'Usage: time_log_robot [options]'

    opts.separator ''
    opts.separator 'Specific options:'

    opts.separator ''
    opts.on('-m', '--mapping PATH', String,
            'Description to JIRA key mapping file is located by default at',
            '`~/.time_log_robot_mapping.yml`. Use this flag if you have a', 'mapping file elsewhere and would like to define the path to', 'point to your file instead.') do |mapping|
      options.mapping = mapping
    end

    opts.separator ''
    opts.on('-o', '--overwrite',
            'Your settings are automatically written to a file -',
            '`~/.time_log_robot_settings.yml` - to be used again the next', 'time you invoke the robot. Use this flag if you need to', 'overwrite those settings.') do |overwrite|
      options.overwrite = overwrite
    end

    opts.separator ''
    opts.on('-s', '--since DATE', Date,
            'The date from which to log time entries.',
            'Must be in YYYY-MM-DD format.',
            'Default is the previous Saturday.') do |date|
      options.since = date
    end

    opts.separator ''
    opts.separator 'Common options:'

    opts.on_tail('-i', '--inputs_help',
                 'Learn how and where to find the inputs you need to get', 'this working') do
      print_inputs_help
      exit
    end

    opts.on_tail('-h', '--help', 'Show this message') do
      puts opts
      exit
    end

    opts.on_tail('-v', '--version', 'Show version') do
      puts TimeLogRobot::VERSION
      exit
    end
  end

  opt_parser.parse!(args)
  options
end
print_inputs_help() click to toggle source
root() click to toggle source
# File lib/time_log_robot.rb, line 152
def root
  File.dirname __dir__
end
run(args) click to toggle source
# File lib/time_log_robot.rb, line 9
def run(args)
  options = TimeLogRobot.parse(args)

  create_settings_file_if_nonexistent

  fetch_envars_from_config unless options.overwrite

  missing_envars = get_missing_envars
  if options.mapping
    missing_envars['MAPPING_FILE_PATH'] = get_envar('MAPPING_FILE_PATH')
  end

  since = options.since.to_time unless options.since.nil?

  TimeLogRobot.start(since)

  write_missing_envars(missing_envars) if missing_envars.any?
end
settings_file_path() click to toggle source
# File lib/time_log_robot.rb, line 141
def settings_file_path
  File.join(ENV['HOME'], '.time_log_robot_settings.yml')
end
should_not_strip?(key) click to toggle source
# File lib/time_log_robot.rb, line 110
def should_not_strip?(key)
  %w(JIRA_PASSWORD).include? key
end
start(since) click to toggle source
# File lib/time_log_robot.rb, line 156
def start(since)
  report = fetch_time_report(since)
  JIRA::WorkLogger.log_all(
    service: report[:service],
    time_entries: report[:entries]
  )
end
write_missing_envars(missing_envars={}) click to toggle source
# File lib/time_log_robot.rb, line 122
def write_missing_envars(missing_envars={})
  puts "\nTo avoid entering setup information each time, the following configuration has been stored in `#{settings_file_path}`:"
  missing_envars.each_pair do |key, value|
    if key =~ /password|token/i
      puts "\t#{key}=[FILTERED]"
    else
      puts "\t#{key}=#{value}"
    end

    data = YAML.load_file(settings_file_path) || {}
    data[key.downcase] = value
    File.open(settings_file_path, 'w') { |f| YAML.dump(data, f) }
  end
end