Class: GitPivotalTrackerIntegration::Command::Base Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/git-pivotal-tracker-integration/command/base.rb

Overview

This class is abstract.

Subclass and override #run to implement command functionality

An abstract base class for all commands

Direct Known Subclasses

Deliver, Finish, Release, Report, Start

Constant Summary collapse

TIMER_TOKENS =

Toggl keys name : The name of the task (string, required, unique in project) pid : project ID for the task (integer, required) wid : workspace ID, where the task will be saved (integer, project’s workspace id is used when not supplied) uid : user ID, to whom the task is assigned to (integer, not required) estimated_seconds : estimated duration of task in seconds (integer, not required) active : whether the task is done or not (boolean, by default true) at : timestamp that is sent in the response for PUT, indicates the time task was last updated – Additional fields – done_seconds : duration (in seconds) of all the time entries registered for this task uname : full name of the person to whom the task is assigned to

{
    "m" => (60),
    "h" => (60 * 60),
    "d" => (60 * 60 * 8) # a work day is 8 hours
}

Instance Method Summary collapse

Constructor Details

#initializeBase

Common initialization functionality for all command classes. This enforces that:

  • the command is being run within a valid Git repository

  • the user has specified their Pivotal Tracker API token

  • all communication with Pivotal Tracker will be protected with SSL

  • the user has configured the project id for this repository



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 33

def initialize
  self.start_logging
  self.check_version

  git_global_push_default = (GitPivotalTrackerIntegration::Util::Shell.exec "git config --global push.default", false).chomp
  if git_global_push_default != "simple"
    puts "git config --global push.default simple"
    puts GitPivotalTrackerIntegration::Util::Shell.exec "git config --global push.default simple"
  end

  @repository_root = GitPivotalTrackerIntegration::Util::Git.repository_root
  @configuration = GitPivotalTrackerIntegration::Command::Configuration.new
  @toggl = Toggl.new

  PivotalTracker::Client.token = @configuration.api_token
  PivotalTracker::Client.use_ssl = true

  @project = PivotalTracker::Project.find @configuration.project_id
end

Instance Method Details

#check_versionObject



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 65

def check_version
  gem_latest_version = (GitPivotalTrackerIntegration::Util::Shell.exec "gem list v2gpti --remote")[/\(.*?\)/].delete "()"
  gem_installed_version = Gem.loaded_specs["v2gpti"].version.version
  if (gem_installed_version == gem_latest_version)
      $LOG.info("v2gpti verison #{gem_installed_version} is up to date.")
  else
      $LOG.fatal("Out of date")
      abort "\n\nYou are using v2gpti version #{gem_installed_version}, but the current version is #{gem_latest_version}.\nPlease update your gem with the following command.\n\n    sudo gem update v2gpti\n\n"  
      
  end
end

#create_story(args) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 143

def create_story(args)
  story_types = {"f" => "feature", "b" => "bug", "c" => "chore"}
  new_story_type = nil
  new_story_title = nil
  new_story_estimate = -1
  args.each do |arg|
    new_story_type = story_types[arg[-1]] if arg.include? '-n'
    new_story_title = arg if arg[0] != "-"
  end

  while new_story_type.nil?
    nst = ask("Please enter f for feature, b for bug, or c for chore")
    new_story_type = story_types[nst]
  end

  while (new_story_title.nil? || new_story_title.empty?)
    new_story_title = ask("Please enter the title for this #{new_story_type}.")
  end

  while (new_story_type == "feature" && (new_story_estimate < 0 || new_story_estimate > 3))
    nse = ask("Please enter an estimate for this #{new_story_type}. (0,1,2,3)")
    if !nse.empty?
      new_story_estimate = nse.to_i
    end
  end

  new_story = PivotalTracker::Story.new
  new_story.project_id = @project.id
  new_story.story_type = new_story_type
  new_story.current_state = "unstarted"
  new_story.name = new_story_title
  if new_story_type == "feature"
    new_story.estimate = new_story_estimate
  end

  uploaded_story = new_story.create

end

#estimated_seconds(story) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 125

def estimated_seconds(story)
  estimate = story.estimate
  seconds = 0
  case estimate
    when 0
      estimate = 15 * 60
    when 1
      estimate = 1.25 * 60 * 60
    when 2
      estimate = 3 * 60 * 60
    when 3
      estimate = 8 * 60 * 60
    else
      estimate = -1 * 60 * 60
  end
  estimate
end

#finish_toggle(configuration, time_spent) ⇒ Object



52
53
54
55
56
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 52

def finish_toggle(configuration, time_spent)
  current_story = @configuration.story(@project)
  @toggl.create_task(parameters(configuration, time_spent))
  @toggl.create_time_entry(parameters(configuration, time_spent))
end

#logger_filenameObject



61
62
63
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 61

def logger_filename
  return "#{Dir.home}/.v2gpti_local.log"
end

#parameters(configuration, time_spent) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 99

def parameters(configuration, time_spent)
  current_story = configuration.story(@project)
  params = Hash.new
  params[:name] = "#{current_story.id}" + " - " + "#{current_story.name}"
  params[:estimated_seconds] = estimated_seconds current_story
  params[:pid] = configuration.toggl_project_id
  params[:uid] = @toggl.me["id"]
  params[:tags] = [current_story.story_type]
  params[:active] = false
  params[:description] = "#{current_story.id}" + " commit:" + "#{(GitPivotalTrackerIntegration::Util::Shell.exec "git rev-parse HEAD").chomp[0..6]}"
  params[:created_with] = "v2gpti"
  params[:duration] = seconds_spent(time_spent)
  params[:start] = (Time.now - params[:duration]).iso8601
  task = @toggl.get_project_task_with_name(configuration.toggl_project_id, "#{current_story.id}")
   if !task.nil?
     params[:tid] = task['id']
   end
  params
end

#runObject

This method is abstract.

Override this method to implement command functionality

The main entry point to the command’s execution

Raises:

  • (NotImplementedError)


79
80
81
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 79

def run
  raise NotImplementedError
end

#seconds_spent(time_spent) ⇒ Object



118
119
120
121
122
123
124
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 118

def seconds_spent(time_spent)
  seconds = 0
  time_spent.scan(/(\d+)(\w)/).each do |amount, measure|
    seconds += amount.to_i * TIMER_TOKENS[measure]
  end
  seconds
end

#start_loggingObject



57
58
59
# File 'lib/git-pivotal-tracker-integration/command/base.rb', line 57

def start_logging
  $LOG = Logger.new("#{logger_filename}", 'weekly')
end