gradesfirst 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/gradesfirst.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.platform = Gem::Platform::RUBY
3
3
  s.name = "gradesfirst"
4
- s.version = "0.4.0"
4
+ s.version = "0.5.0"
5
5
  s.summary = "GradesFirst command line utility for developers."
6
6
  s.description = "This utility will help manage the various tasks developers need to do on their workstation such as database updates."
7
7
  s.license = "MIT"
@@ -4,6 +4,7 @@ require 'gradesfirst/cli_helper'
4
4
  require 'gradesfirst/command'
5
5
  require 'gradesfirst/branch_command'
6
6
  require 'gradesfirst/commit_message_command'
7
+ require 'gradesfirst/pair_command'
7
8
  require 'gradesfirst/task_cli'
8
9
 
9
10
  require 'pivotal_tracker'
@@ -15,13 +16,18 @@ module GradesFirst
15
16
  desc 'branch', GradesFirst::BranchCommand.description
16
17
  def branch
17
18
  set_pivotal_tracker_api_token
18
- execute(GradesFirst::BranchCommand)
19
+ execute GradesFirst::BranchCommand
19
20
  end
20
21
 
21
22
  desc 'commit-message', GradesFirst::CommitMessageCommand.description
22
23
  def commit_message
23
24
  set_pivotal_tracker_api_token
24
- execute(GradesFirst::CommitMessageCommand)
25
+ execute GradesFirst::CommitMessageCommand
26
+ end
27
+
28
+ desc 'pair', GradesFirst::PairCommand.description
29
+ def pair
30
+ execute GradesFirst::PairCommand
25
31
  end
26
32
 
27
33
  desc 'task COMMAND', 'Manage tasks related to a PivotalTracker story.'
@@ -0,0 +1,107 @@
1
+ require 'time'
2
+ require 'gradesfirst/command'
3
+
4
+ module GradesFirst
5
+ # Implementation of a Thor command for determining who your next pair is for
6
+ # pair programming or code review.
7
+ class PairCommand < GradesFirst::Command
8
+ # Description of the "gf pair" Thor command that will be used in the
9
+ # commandline help.
10
+ def self.description
11
+ 'Show the current developer pairings.'
12
+ end
13
+
14
+ # Performs the gf pair Thor command which determines the current
15
+ # developer pairings.
16
+ def execute
17
+ @pairing = pairings[pairing_index]
18
+ end
19
+
20
+ # Generates the command line output response. The output of the pair
21
+ # command will be a list of developer pairings for code review, pair
22
+ # programming, etc.
23
+ def response
24
+ @pairing.map{|pair| pair.compact.join(' and ')}.join("\n") + "\n"
25
+ end
26
+
27
+ private
28
+
29
+ # Currently returns a hard coded list but could be moved to a configuration
30
+ # file in the future.
31
+ def developers
32
+ return @developers unless @developers.nil?
33
+
34
+ @developers = [
35
+ "Anthony Crumley",
36
+ "Tom Miller",
37
+ "Andrew Sellers",
38
+ "Matt Turney",
39
+ "Zac Williams",
40
+ "Ben Holley"
41
+ ].sort
42
+ @developers << nil if @developers.length.odd?
43
+
44
+ @developers
45
+ end
46
+
47
+ # This algorythm was written by Tom Miller based on the wikipedia article on
48
+ # round robin tournaments.
49
+ #
50
+ # https://en.wikipedia.org/wiki/Round-robin_tournament
51
+ def pairings
52
+ top, bottom = developers.each_slice(developers.length/2).to_a
53
+ pivot, *top = top
54
+
55
+ result = []
56
+ (developers.length-1).times do
57
+ top.unshift(bottom.shift)
58
+ bottom.push(top.pop)
59
+ result << [pivot, *top].zip(bottom)
60
+ end
61
+
62
+ result
63
+ end
64
+
65
+ def pairing_index
66
+ sprint % max_pairing_index
67
+ end
68
+
69
+ def max_pairing_index
70
+ developers.length - 1
71
+ end
72
+
73
+ def sprint
74
+ week / sprint_length_in_weeks
75
+ end
76
+
77
+ # Currently this is hard coded but could be moved to a configuration file
78
+ # in the future.
79
+ def sprint_length_in_weeks
80
+ 2
81
+ end
82
+
83
+ def week
84
+ (now.to_i - day_zero.to_i) / seconds_in_a_week
85
+ end
86
+
87
+ def seconds_in_a_week
88
+ days_in_a_week = 7
89
+ hours_in_a_day = 24
90
+ minutes_in_an_hour = 60
91
+ seconds_in_a_minute = 60
92
+
93
+ days_in_a_week * hours_in_a_day * minutes_in_an_hour * seconds_in_a_minute
94
+ end
95
+
96
+ def now
97
+ Time.now
98
+ end
99
+
100
+ # Currently hard coded to return the beginning of a GradesFirst sprint but
101
+ # could be put in a configuration file in the future.
102
+ def day_zero
103
+ Time.parse("2014-3-11 00:00:00")
104
+ end
105
+
106
+ end
107
+ end
data/test/cli_test.rb CHANGED
@@ -4,8 +4,16 @@ require 'gradesfirst/cli'
4
4
  describe GradesFirst::CLI do
5
5
 
6
6
  def assert_command_hooked_up(shell_command, klass)
7
- assert_includes klass.instance_methods, :execute
8
- assert_includes klass.instance_methods, :response
7
+ assert_includes(
8
+ klass.instance_methods,
9
+ :execute,
10
+ "#{klass.name} does not implement the #execute method"
11
+ )
12
+ assert_includes(
13
+ klass.instance_methods,
14
+ :response,
15
+ "#{klass.name} does not implement the #response method"
16
+ )
9
17
 
10
18
  execute_arity = klass.instance_method(:execute).arity
11
19
  if execute_arity < 0
@@ -38,6 +46,10 @@ describe GradesFirst::CLI do
38
46
  assert_command_hooked_up 'commit-message', GradesFirst::CommitMessageCommand
39
47
  end
40
48
 
49
+ specify 'pair command is hooked up' do
50
+ assert_command_hooked_up 'pair', GradesFirst::PairCommand
51
+ end
52
+
41
53
  # Waiting on fix for subcommands with default command.
42
54
  # https://github.com/erikhuda/thor/pull/374
43
55
  #specify 'task command is hooked up to default list subcommand' do
@@ -0,0 +1,3 @@
1
+ Mickey Mouse and Ironman
2
+ Minnie Mouse and Wonder Woman
3
+ Superman and Cat Woman
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+ require 'gradesfirst/pair_command'
3
+
4
+ describe GradesFirst::PairCommand do
5
+ before do
6
+ @command = GradesFirst::PairCommand.new
7
+ @developers = [
8
+ 'Mickey Mouse',
9
+ 'Cat Woman',
10
+ 'Wonder Woman',
11
+ 'Superman',
12
+ 'Minnie Mouse',
13
+ 'Ironman'
14
+ ]
15
+ end
16
+
17
+ specify '#execute pairs developers correctly' do
18
+ @command.stub :developers, @developers do
19
+ @command.stub :now, Time.parse("2014-3-25 00:00:00") do
20
+ @command.execute
21
+ end
22
+ end
23
+ assert_equal(
24
+ fixture_file('pair.txt'),
25
+ @command.response,
26
+ 'Programmer pairing is not correct.'
27
+ )
28
+ end
29
+ end
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gradesfirst
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - GradesFirst
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-03-10 00:00:00.000000000 Z
12
+ date: 2014-03-31 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: thor
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: http_magic
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ~>
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ~>
39
44
  - !ruby/object:Gem::Version
@@ -41,6 +46,7 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: minitest
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ~>
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
@@ -74,6 +81,7 @@ files:
74
81
  - lib/gradesfirst/cli_helper.rb
75
82
  - lib/gradesfirst/command.rb
76
83
  - lib/gradesfirst/commit_message_command.rb
84
+ - lib/gradesfirst/pair_command.rb
77
85
  - lib/gradesfirst/task_add_command.rb
78
86
  - lib/gradesfirst/task_cli.rb
79
87
  - lib/gradesfirst/task_command.rb
@@ -89,6 +97,7 @@ files:
89
97
  - test/fixtures/commit_message.txt
90
98
  - test/fixtures/gf_branch.txt
91
99
  - test/fixtures/git_branch.txt
100
+ - test/fixtures/pair.txt
92
101
  - test/fixtures/projects.json
93
102
  - test/fixtures/story_bar.json
94
103
  - test/fixtures/story_foo.json
@@ -99,6 +108,7 @@ files:
99
108
  - test/fixtures/task_toggled.txt
100
109
  - test/fixtures/tasks.json
101
110
  - test/fixtures/tasks.txt
111
+ - test/pair_command_test.rb
102
112
  - test/support/pivotal_test_helper.rb
103
113
  - test/support/request_expectation.rb
104
114
  - test/task_add_command_test.rb
@@ -110,25 +120,26 @@ files:
110
120
  homepage: http://www.gradesfirst.com
111
121
  licenses:
112
122
  - MIT
113
- metadata: {}
114
123
  post_install_message:
115
124
  rdoc_options: []
116
125
  require_paths:
117
126
  - lib
118
127
  required_ruby_version: !ruby/object:Gem::Requirement
128
+ none: false
119
129
  requirements:
120
130
  - - ! '>='
121
131
  - !ruby/object:Gem::Version
122
132
  version: 1.8.7
123
133
  required_rubygems_version: !ruby/object:Gem::Requirement
134
+ none: false
124
135
  requirements:
125
136
  - - ! '>='
126
137
  - !ruby/object:Gem::Version
127
138
  version: 1.3.6
128
139
  requirements: []
129
140
  rubyforge_project:
130
- rubygems_version: 2.2.2
141
+ rubygems_version: 1.8.25
131
142
  signing_key:
132
- specification_version: 4
143
+ specification_version: 3
133
144
  summary: GradesFirst command line utility for developers.
134
145
  test_files: []
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YTQ2ODU5MGIxYWQwM2QwZjc1YWVkMmRlNDE5OTY5MDk2NmI2ZmI5ZQ==
5
- data.tar.gz: !binary |-
6
- NjYxNmE1MmJlM2I5MmM1ZGQ3OWMyNWY3MGY1NjQ1MDRjMjZiYzdjMg==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- MDJmYmQxNzM1NzAzMTUzM2I5Yzc3MjdhMTRhYjRlNTUyMTg3YjIyN2VmOTkz
10
- MzExODcxMWRjOGQwMWUxN2E4NjE5MWVhY2I3YzkxODBjOGU3ZTNlZTdlOWY2
11
- MjUyZWU3YzZjY2E4N2ViOTExY2VlY2JhYWFkODY0NTdlYTdhZjQ=
12
- data.tar.gz: !binary |-
13
- ZGEyMjY5NjM3ZmQwMzY1Nzg3NDgwMzJjZjQ5ZGJiMDdiZmM4ODY1MThlMGQw
14
- MjU4ODhmMTVkNDIwODE5NDhiNTg3NTQ2NTk2NzZkNjgzZjM4ZmU3ZjcwNDdj
15
- NmQ5ZTZiYjRhOGEyNjQyZDBlZTJhOTVlYzQzZTQwYTZmNmE2YWI=