submit_hw 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []