submit_hw 0.0.3 → 0.1.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/submit_hw +192 -12
  3. metadata +55 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 79cf37b70301d1612a5d414f1156faf3160f7b0f
4
- data.tar.gz: 2ff8d2e53a831cc2caa602b11af60d23b9d94bbf
3
+ metadata.gz: 5fe0b4d00bf33cad21a46e12a00f1e172fc2596a
4
+ data.tar.gz: 4d2726dff1336853609eb8f1b7133f438d2436b9
5
5
  SHA512:
6
- metadata.gz: 8ec863084985ba6654e0bf8abb62c4d84a3be3551813724cfc3f7ab22167b51c203ea564d706dbb4aaa60a9750dd9d7a40a8f2d3dd56990d6678cb3a3cc087c1
7
- data.tar.gz: 7c8b96e6b274f7afccf8c086971acecb3517f4d56c3dbfc3476f893a12e612cf9b46209e585f21469c647a8a4002eda45a32b6d267b672950e16eebfe5ee346a
6
+ metadata.gz: 7d8afe66783582c979410b1855a6003d11b70b11ec7a23457e876f6f3b73898218e74cbe46243c6e0de2a2836fd50f324753401d98103d96371e5bab140fb8ce
7
+ data.tar.gz: 03fc8a1e7ebb8acf115a1400ff7dc21cc35b9725552c477f1956f2b72b8cdac36063ceb761b02a65ca8509b55b2d9abfaabe16e5ad83a2bbf4e124cd153790b7
data/bin/submit_hw CHANGED
@@ -1,23 +1,203 @@
1
1
  #!/usr/bin/env ruby
2
- require 'json'
3
2
 
4
- hub_not_installed = `brew list --versions hub`.empty?
3
+ # require dependencies
4
+ require "octokit"
5
+ require "colorize"
5
6
 
6
- if hub_not_installed
7
- puts "Please install the \`hub\` utility."
7
+ # require standard libraries
8
+ require "json"
9
+ require "yaml"
10
+ require "io/console"
11
+
12
+ # require development dependencies (#TODO add a verbose format for debugging)
13
+ if ARGV[0] == "--debug"
14
+ puts "(running in debug mode...)".yellow
15
+ require "pry"
16
+ def debug(output); puts "[DEBUG] #{output.chomp}".yellow; end
17
+ else
18
+ def debug(output); return false; end
19
+ end
20
+ if ["-h","--help"].include? ARGV[0]
21
+ puts "This must be run from the Class Repo; it submits a " + \
22
+ "Pull Request for homework."
23
+ puts "If you are having trouble, run in debug mode:"
24
+ puts "$ submit_hw --debug"
25
+ exit(true)
26
+ end
27
+ ARGV.clear # clean out arguments from $stdin so they don't get `gets`-ed below
28
+
29
+ # TODO (phlco) remove Hub dependency and use github gem/api directly...
30
+
31
+ # NOTE: Removed in order to clean up the bash profile (this shouldn't touch it)
32
+ # storing data in the ~/.gitconfig instead
33
+ #
34
+ # unless ENV['HUMAN_NAME']
35
+ # puts "Please enter your full name (first and last)"
36
+ # human_name = gets.chomp.strip.downcase.gsub(' ', '_')
37
+ # system("export HUMAN_NAME=#{human_name}")
38
+ # system("echo '\nexport HUMAN_NAME=#{human_name}\n' >> ~/.bash_profile")
39
+ # end
40
+ #
41
+ # def prompt_to_reload
42
+ # puts "WARNING: this script changed your ~/.bash_profile file." + \
43
+ # " When possible immediately run the following command:".yellow
44
+ # puts " $ reload"
45
+ # puts "or, if that fails:".yellow
46
+ # puts " $ source ~/.bash_profile"
47
+ # end
48
+
49
+ # Gracefully exit on error.
50
+ def exit_script
51
+ puts "\nPlease type 'submit_hw' and restart the submission process.".red
8
52
  exit(false)
9
53
  end
10
54
 
55
+ # Check if their gitconfig has a "human_name" entry, and if not, add it.
56
+ # The purpose of the human_name is to make their commits more readable for
57
+ # the IAs.
58
+ output = `git config --get user.humanname`
59
+ debug "user.humanname: #{output}"
60
+ if output.empty?
61
+ print "Please enter your full, human name: "
62
+ human_name = gets.chomp
63
+ output = `git config --add user.humanname '#{human_name}'`
64
+ debug "new user.humanname: #{output}"
65
+ end
66
+
67
+ # Ensure their gitconfig has a "name" entry with their GH username, and if not,
68
+ # add it.
69
+ output = `git config --get user.name`
70
+ debug "user.name: #{output}"
71
+ if output.empty?
72
+ puts "Please enter your Github username (it is case sensitive)."
73
+ github_username = gets.chomp
74
+ output = `git config --add user.name '#{github_username}'`
75
+ debug "new user.name: #{output}"
76
+ end
77
+
78
+ # Check to see if they have a hub config file, which stores an auth token that
79
+ # allows the hub command to act on their behalf with GitHub. If not, use Octokit
80
+ # to get an auth token and save it in a new hub config file.
81
+ unless File.exists? File.expand_path(".config/hub","~")
82
+ puts "You haven't used the GitHub API with Hub before."
83
+ puts "We need your credentials (one time)."
84
+ print "Please enter your GitHub username: "
85
+ username = gets.chomp
86
+ print "Please enter your GitHub password: "
87
+ password = $stdin.noecho(&:gets).chomp
88
+ debug "uname:pass #{username}:#{password}" || puts # spacin' out bru!
89
+
90
+ client = Octokit::Client.new \
91
+ :login => username,
92
+ :password => password
93
+
94
+ begin
95
+ client.user # check for bad auth and fail
96
+ rescue
97
+ puts "Authentication error. Check your username and password."
98
+ exit_script
99
+ end
100
+
101
+ # add random number to token name to allow multiple tokens
102
+ random_number = (Random.rand * 10000).to_i
103
+
104
+ response = client.create_authorization \
105
+ :scopes => ["user","repo"],
106
+ :note => "hub token added by submit_hw [#{random_number}]"
107
+
108
+ hub_config = {
109
+ "github.com" => [
110
+ {
111
+ "oauth_token" => response[:token],
112
+ "user" => username
113
+ }
114
+ ]
115
+ }.to_yaml
116
+
117
+ debug "hub yaml: #{hub_config}"
118
+
119
+ # ensure ~/.config exists
120
+ FileUtils.mkdir_p File.expand_path(".config","~")
121
+
122
+ File.write(File.expand_path(".config/hub","~"), hub_config)
123
+ end
124
+
125
+
126
+ # Get data from students for HW metrics.
11
127
  data = {}
12
128
 
13
- puts "Completeness [1 - 5]"
14
- data["completeness"] = gets.gsub(/\W+/, '')
129
+ print "How many parts of the homework did you finish? "
130
+ data["completeness"] = gets
131
+ begin
132
+ data["completeness"] = Integer(data["completeness"])
133
+ raise ArgumentError if data["completeness"] < 0
134
+ rescue ArgumentError
135
+ puts "Invalid: not an integer (0 or greater)".red
136
+ exit_script
137
+ end
138
+
139
+ # TODO (CentroDL) Confirm what data we want to capture
140
+ # print "\nDid you finish the all of the required parts of the homework? (y/n)"
141
+ # data["completeness"] = gets
142
+
143
+ # unless ["y","n"].include? data["completeness"].downcase
144
+ # puts "Must enter 'y' or 'n'".red
145
+ # exit_script
146
+ # end
15
147
 
16
- puts "Comfortability [1 - 5]"
17
- data["comfortability"] = gets.gsub(/\W+/, '')
148
+ # print "Comfortability [1 - 5]? "
149
+ # data["comfortability"] = gets.gsub(/\W+/, '').to_i
18
150
 
19
- github_name = `git config --get user.name`.strip
20
- upstream = `git config --get remote.upstream.url`.strip.match(/:(.*[^\.git])/).captures.first
21
- branch = "#{upstream}:#{github_name}"
151
+ # unless (1..5).member?(data["comfortability"])
152
+ # puts "Invalid numbers (only 1 - 5)".red
153
+ # exit_script
154
+ # end
22
155
 
23
- puts `hub pull-request -m $'HW #{Time.now.strftime('%Y-%m-%d')}\n\n#{data.to_json}' -b '#{branch}'`
156
+ debug "data: #{data}"
157
+
158
+ # Get the necessary metadata to submit the push and PR to GitHub.
159
+ begin
160
+ upstream = `git config --get remote.upstream.url`
161
+ upstream = upstream.strip.match(/:(.*)\.git/).captures.first
162
+ rescue NoMethodError
163
+ # Upstream has not been set
164
+ puts ("You haven't configured a remote that points to the " + \
165
+ "upstream repository!").red
166
+ puts "\nRun the following then try again:".red
167
+ puts " $ git remote add upstream CLASS_REPO_SSH_URL"
168
+ exit_script
169
+ end
170
+
171
+ # Get the necessary data to form a commit message.
172
+ human_name = `git config --get user.humanname`.chomp
173
+ github_name = `git config --get user.name`.chomp
174
+ branch = "#{upstream}:#{github_name}"
175
+ submitted_at = Time.now.strftime("%H:%m")
176
+ submitted_on = Time.now.strftime('%Y-%m-%d')
177
+ message = "HW for #{human_name}: #{submitted_on} at #{submitted_at}" + \
178
+ "\n\n#{data.to_json}"
179
+ debug "message: #{message.split("\n").first}"
180
+
181
+ # Push to their fork.
182
+ puts "Pushing your work to your fork...\n"
183
+ push_msg = `git push origin master 2>&1`
184
+ debug "push_message: #{push_msg}" #|| puts # spacin' it out bru
185
+
186
+ # Submit PR to class repo in their GH named branch
187
+ puts "Submitting a pull request...\n"
188
+ submission_msg = `hub pull-request -m '#{message}' -b '#{branch}' 2>&1`
189
+ debug "pr_message: #{submission_msg}"
190
+
191
+ # Check the submission message to ensure there were no errors
192
+ if submission_msg.include? "pull request already exists"
193
+ puts ("You already have an outstanding pull request which the instructors" + \
194
+ "\nhave yet to merge! Have a great day.").yellow
195
+ elsif submission_msg.include? "pull request: Unprocessable Entity (HTTP 422)"
196
+ puts ("We may not have an upstream branch for you yet. " + \
197
+ "Contact your Instructors!").yellow
198
+ elsif submission_msg.include? "No commits between"
199
+ # NOTE: (phlco) we'll ignore this for now bc we probably won't get this error.
200
+ puts "You haven't commited any changes.".red
201
+ else
202
+ puts "Thanks for submitting your homework.".green
203
+ end
metadata CHANGED
@@ -1,17 +1,65 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: submit_hw
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeffrey Konowitch
8
+ - PJ Hughes
9
+ - Phillip Lamplugh
10
+ - Travis Vander Hoop
11
+ - Neel Patel
8
12
  autorequire:
9
13
  bindir: bin
10
14
  cert_chain: []
11
- date: 2014-07-31 00:00:00.000000000 Z
12
- dependencies: []
15
+ date: 2015-04-23 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: hub
19
+ requirement: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - "~>"
22
+ - !ruby/object:Gem::Version
23
+ version: '1.12'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '1.12'
31
+ - !ruby/object:Gem::Dependency
32
+ name: octokit
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - "~>"
36
+ - !ruby/object:Gem::Version
37
+ version: '3.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - "~>"
43
+ - !ruby/object:Gem::Version
44
+ version: '3.0'
45
+ - !ruby/object:Gem::Dependency
46
+ name: colorize
47
+ requirement: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - "~>"
50
+ - !ruby/object:Gem::Version
51
+ version: 0.7.3
52
+ type: :runtime
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: 0.7.3
13
59
  description: ''
14
- email: jeff.konowitch@ga.co
60
+ email:
61
+ - jeff.konowitch@ga.co
62
+ - pj@ga.co
15
63
  executables:
16
64
  - submit_hw
17
65
  extensions: []
@@ -19,7 +67,7 @@ extra_rdoc_files: []
19
67
  files:
20
68
  - "./bin/submit_hw"
21
69
  - bin/submit_hw
22
- homepage: https://github.com/jkonowitch/submit_hw
70
+ homepage: https://github.com/ga-instructors/submit_hw
23
71
  licenses:
24
72
  - MIT
25
73
  metadata: {}
@@ -39,8 +87,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
87
  version: '0'
40
88
  requirements: []
41
89
  rubyforge_project:
42
- rubygems_version: 2.2.1
90
+ rubygems_version: 2.2.2
43
91
  signing_key:
44
92
  specification_version: 4
45
- summary: Submitting homework for GA's WDI.
93
+ summary: A script to submit homework for GA's WDI.
46
94
  test_files: []