hu 1.3.16 → 1.3.17

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15212224c4c30a5e43535e72f4ade5aa8feccf8f
4
- data.tar.gz: 0a3164a2de293c69ab63e14c130bb57a84636cbd
3
+ metadata.gz: 940552e283a3cc03909ec0c01427ba5cc69df5ff
4
+ data.tar.gz: 1d0c4fde9af5ac93aa8dbd2f3e5597a6afa617cc
5
5
  SHA512:
6
- metadata.gz: 80cb800c1e63a61c3bebb37396b86619c0ab3b98e805e17a1406418e2b6c8b171d688a4b391f67c73e0a08c2d142000ddbb0b74c21f07aad8fd1c2491e39751f
7
- data.tar.gz: 25b832cf557c8c7957e1de0c085a5edfac5ddb3ff64fb21c0dc36498bb19240cfd6774ba5f8c6344f5571f7360497b2117b039b2f0c4057d19de1d711e29fa54
6
+ metadata.gz: 145d01c855f29a2404f2dfa902e05cc7198d054b2592fe21e306c604fc0e86ca9f91f267b48227ca1e44af5a06a19f7344368afbca4a188e5cdfadb6bfc80a9e
7
+ data.tar.gz: 8ccd30130baf37129041ad3c8d253b42a788519cd431f8c9d3dbac21626322e7ce696e026409c2ca440f66b35ca4a372cb234012a424aaa334d02d5bb6063bfc
@@ -1,26 +1,31 @@
1
- # Offense count: 13
1
+ # Offense count: 1
2
+ Lint/HandleExceptions:
3
+ Exclude:
4
+ - 'lib/hu/telemetry.rb'
5
+
6
+ # Offense count: 14
2
7
  Metrics/AbcSize:
3
- Max: 276
8
+ Max: 298
4
9
 
5
10
  # Offense count: 2
6
11
  # Configuration parameters: CountComments.
7
12
  Metrics/ClassLength:
8
- Max: 657
13
+ Max: 694
9
14
 
10
15
  # Offense count: 6
11
16
  Metrics/CyclomaticComplexity:
12
17
  Max: 45
13
18
 
14
- # Offense count: 83
19
+ # Offense count: 86
15
20
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
16
21
  # URISchemes: http, https
17
22
  Metrics/LineLength:
18
23
  Max: 176
19
24
 
20
- # Offense count: 14
25
+ # Offense count: 16
21
26
  # Configuration parameters: CountComments.
22
27
  Metrics/MethodLength:
23
- Max: 232
28
+ Max: 254
24
29
 
25
30
  # Offense count: 4
26
31
  Metrics/PerceivedComplexity:
@@ -31,7 +36,7 @@ Style/ClassVars:
31
36
  Exclude:
32
37
  - 'lib/hu/deploy.rb'
33
38
 
34
- # Offense count: 5
39
+ # Offense count: 6
35
40
  Style/Documentation:
36
41
  Exclude:
37
42
  - 'spec/**/*'
@@ -40,6 +45,7 @@ Style/Documentation:
40
45
  - 'lib/hu/collab.rb'
41
46
  - 'lib/hu/common.rb'
42
47
  - 'lib/hu/deploy.rb'
48
+ - 'lib/hu/telemetry.rb'
43
49
 
44
50
  # Offense count: 3
45
51
  # Configuration parameters: AllowedVariables.
data/hu.gemspec CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency 'hashdiff', '~> 0.3.0'
32
32
  spec.add_dependency 'version_sorter', '~> 2.0.0'
33
33
  spec.add_dependency 'versionomy', '~> 0.5.0'
34
- spec.add_dependency 'tty-prompt'
34
+ spec.add_dependency 'tty-prompt', '~> 0.6.0'
35
35
  spec.add_dependency 'tty-spinner'
36
36
  spec.add_dependency 'tty-table'
37
37
  spec.add_dependency 'rainbow'
@@ -41,4 +41,6 @@ Gem::Specification.new do |spec|
41
41
  spec.add_dependency 'rugged'
42
42
  spec.add_dependency 'paint'
43
43
  spec.add_dependency 'lolcat'
44
+ spec.add_dependency 'analytics-ruby'
45
+ spec.add_dependency 'config'
44
46
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require 'blackbox/gem'
3
+ require 'config'
3
4
 
4
5
  module Hu
5
6
  API_TOKEN = ENV['HEROKU_API_KEY'] || ENV['HEROKU_API_TOKEN'] || Netrc.read['api.heroku.com']&.password
7
+ CONFIG_FILE = File.join(ENV['HOME'], '.hu.yaml')
6
8
  end
7
9
 
8
10
  class String
@@ -12,9 +14,13 @@ class String
12
14
  end
13
15
  end
14
16
 
17
+ Config.load_and_set_settings Hu::CONFIG_FILE
18
+ require 'hu/telemetry'
19
+
15
20
  unless ENV['SKIP_VERSION_CHECK']
16
21
  version_info = BB::Gem.version_info(check_interval: 900)
17
22
  unless version_info[:installed_is_latest] == true
23
+ Hu::Tm.t(:gem_outdated, installed_version: version_info[:gem_installed_version], available_version: version_info[:gem_latest_version])
18
24
  puts
19
25
  puts "\e[33;1mWoops! \e[0mA newer version of #{version_info[:gem_name]} is available."
20
26
  puts " Please type '\e[1mgem install #{version_info[:gem_name]}\e[0m' to upgrade (v#{version_info[:gem_installed_version]} -> v#{version_info[:gem_latest_version]})."
@@ -23,3 +29,5 @@ unless ENV['SKIP_VERSION_CHECK']
23
29
  exit 1
24
30
  end
25
31
  end
32
+
33
+ Hu::Tm.t(:launch)
@@ -39,10 +39,11 @@ module Hu
39
39
  end
40
40
 
41
41
  def deploy(_cmd, _opts, _argv)
42
+ Hu::Tm.t(:invoke, cmd: 'deploy')
42
43
  trap('INT') { shutdown; safe_abort; exit 1 }
43
44
  at_exit do
45
+ shutdown
44
46
  if $ERROR_INFO.class == SystemExit && 130 == $ERROR_INFO.status
45
- shutdown
46
47
  puts
47
48
  safe_abort
48
49
  end
@@ -57,6 +58,7 @@ module Hu
57
58
  puts
58
59
  safe_abort
59
60
  print TTY::Cursor.prev_line
61
+ Hu::Tm.t(:error_not_in_working_copy, cmd: 'deploy')
60
62
  exit 1
61
63
  end
62
64
 
@@ -68,6 +70,7 @@ module Hu
68
70
  puts
69
71
  puts ' Sorry, we need an origin here. We really do.'
70
72
  puts
73
+ Hu::Tm.t(:error_no_git_origin, cmd: 'deploy')
71
74
  exit 1
72
75
  end
73
76
 
@@ -77,6 +80,7 @@ module Hu
77
80
  puts
78
81
  puts " Please run 'git flow init -d'"
79
82
  puts
83
+ Hu::Tm.t(:error_no_git_flow, cmd: 'deploy')
80
84
  exit 1
81
85
  end
82
86
 
@@ -89,6 +93,7 @@ module Hu
89
93
  puts
90
94
  puts " git config --add gitflow.prefix.versiontag ''".bright
91
95
  puts
96
+ Hu::Tm.t(:error_git_flow_prefix_enabled, cmd: 'deploy')
92
97
  exit 1
93
98
  end
94
99
 
@@ -105,6 +110,7 @@ module Hu
105
110
  puts
106
111
  puts " Please run 'git remote rm heroku'. Then run 'hu deploy' again to select a new remote."
107
112
  puts
113
+ Hu::Tm.t(:error_no_heroku_app_for_remote, cmd: 'deploy')
108
114
  exit 1
109
115
  end
110
116
 
@@ -120,6 +126,7 @@ module Hu
120
126
 
121
127
  puts " Please run 'git remote rm heroku'. Then run 'hu deploy' again to select a new remote."
122
128
  puts
129
+ Hu::Tm.t(:error_remote_not_staging, cmd: 'deploy')
123
130
  sleep 2
124
131
  exit 1
125
132
  end
@@ -199,6 +206,7 @@ module Hu
199
206
  puts ' Nothing else has happened so far. Push this branch to'
200
207
  puts ' ' + stag_app_name.to_s.bright + ' to begin the deploy procedure.'
201
208
  puts
209
+ Hu::Tm.t(:phase1, cmd: 'deploy')
202
210
  end
203
211
 
204
212
  if release_branch_exists && git_revisions[:release] == git_revisions[stag_app_name]
@@ -207,6 +215,7 @@ module Hu
207
215
  puts ' If everything looks good, you may proceed and finish the release.'
208
216
  puts ' If there are problems: Quit, delete the release branch and start fixing.'
209
217
  puts
218
+ Hu::Tm.t(:phase2, cmd: 'deploy')
210
219
  elsif git_revisions[prod_app_name] != git_revisions[stag_app_name] && !release_branch_exists && git_revisions[:release] != git_revisions[stag_app_name]
211
220
  puts 'Phase 3/3: HEADS UP. This is the last chance to detect problems.'
212
221
  puts ' The final version of ' + "release/#{release_tag}".bright + ' is now staged.'
@@ -217,6 +226,7 @@ module Hu
217
226
  puts ' This is the exact version that will be promoted to production.'
218
227
  puts " From here you are on your own. Good luck #{`whoami`.chomp}!"
219
228
  puts
229
+ Hu::Tm.t(:phase3, cmd: 'deploy')
220
230
  end
221
231
 
222
232
  choice = prompt.select('Choose your destiny') do |menu|
@@ -251,9 +261,12 @@ module Hu
251
261
 
252
262
  case choice
253
263
  when :DEPLOY
264
+ Hu::Tm.t(:promote_begin, cmd: 'deploy')
254
265
  promote_to_production
266
+ Hu::Tm.t(:promote_end, cmd: 'deploy')
255
267
  anykey
256
268
  when :finish_release
269
+ Hu::Tm.t(:finish_begin, cmd: 'deploy')
257
270
  old_editor = ENV['EDITOR']
258
271
  old_git_editor = ENV['GIT_EDITOR']
259
272
  tf = Tempfile.new('hu-tag')
@@ -270,36 +283,45 @@ module Hu
270
283
  puts '*** ERROR! Could not finish release *** '.color(:red)
271
284
  puts
272
285
  puts 'This usually means a merge conflict or'
273
- puts 'something similarly complicated has occured.'
286
+ puts 'something equally annoying has occured.'
274
287
  puts
275
288
  puts 'Please bring the universe into a state'
276
- puts 'where the above command succeeds, then try again.'
289
+ puts 'where the above sequence of commands can'
290
+ puts 'succeed. Then try again.'
277
291
  puts
292
+ Hu::Tm.t(:finish_fail, cmd: 'deploy')
278
293
  exit 1
279
294
  end
280
295
  ENV['EDITOR'] = old_editor
281
296
  ENV['GIT_EDITOR'] = old_git_editor
297
+ Hu::Tm.t(:finish_end, cmd: 'deploy')
282
298
  anykey
283
299
  when :push_to_staging
300
+ Hu::Tm.t(:stage_begin, cmd: 'deploy')
284
301
  run_each <<-EOS.strip_heredoc
285
302
  :stream
286
303
  git push #{push_url} release/#{release_tag}:master -f
287
304
  EOS
305
+ Hu::Tm.t(:stage_end, cmd: 'deploy')
288
306
  anykey
289
307
  when :abort_ask
308
+ Hu::Tm.t(:user_quit, cmd: 'deploy')
290
309
  puts if delete_branch("release/#{release_tag}")
291
310
  exit 0
292
311
  when :bump_tiny
293
312
  if delete_branch("release/#{release_tag}")
294
313
  release_tag, branch_already_exists = prompt_for_release_tag(tiny_bump, tiny_bump)
314
+ Hu::Tm.t(:switch_release_type, bump: 'patch', cmd: 'deploy')
295
315
  end
296
316
  when :bump_minor
297
317
  if delete_branch("release/#{release_tag}")
298
318
  release_tag, branch_already_exists = prompt_for_release_tag(minor_bump, minor_bump)
319
+ Hu::Tm.t(:switch_release_type, bump: 'minor', cmd: 'deploy')
299
320
  end
300
321
  when :bump_major
301
322
  if delete_branch("release/#{release_tag}")
302
323
  release_tag, branch_already_exists = prompt_for_release_tag(major_bump, major_bump)
324
+ Hu::Tm.t(:switch_release_type, bump: 'major', cmd: 'deploy')
303
325
  end
304
326
  end
305
327
  end
@@ -396,6 +418,7 @@ module Hu
396
418
  puts
397
419
 
398
420
  puts table.render(:unicode, padding: [0, 1, 0, 1], multiline: true)
421
+ Hu::Tm.t(:status_screen, cmd: 'deploy')
399
422
  revs
400
423
  end
401
424
 
@@ -514,6 +537,8 @@ module Hu
514
537
  next unless status.exitstatus != 0
515
538
  shutdown if opts[:failfast]
516
539
  puts "Error, exit #{status.exitstatus}: #{line} (L#{i})".color(:red).bright
540
+
541
+ Hu::Tm.t(:runeach_error, exitstatus: status.exitstatus, cmd: 'deploy')
517
542
  exit status.exitstatus if opts[:failfast]
518
543
  return status.exitstatus
519
544
  end
@@ -527,7 +552,13 @@ module Hu
527
552
  exit status.exitstatus
528
553
  end
529
554
 
530
- versions = output.lines.map(&:chomp).reject { |e| Versionomy.parse(e) rescue true; false }
555
+ versions = output.lines.map(&:chomp).reject do |e|
556
+ begin
557
+ Versionomy.parse(e)
558
+ rescue
559
+ true
560
+ end; false
561
+ end
531
562
  versions = versions.map { |e| e[0].casecmp('v').zero? ? e.downcase : "v#{e.downcase}" }
532
563
  versions = VersionSorter.sort(versions)
533
564
  latest = versions[-1] || 'v0.0.0'
@@ -549,6 +580,7 @@ module Hu
549
580
  git checkout develop
550
581
  git branch -D #{branch_name}
551
582
  EOS
583
+ Hu::Tm.t(:delete_release_branch, cmd: 'deploy')
552
584
  puts "Branch #{branch_name} deleted.".color(:red)
553
585
  true
554
586
  end
@@ -566,6 +598,7 @@ module Hu
566
598
  # Starting release #{release_tag.color(:green)}
567
599
  git flow release start #{release_tag} >/dev/null
568
600
  EOS
601
+ Hu::Tm.t(:start_release, cmd: 'deploy')
569
602
  end
570
603
 
571
604
  def update_working_copy
@@ -576,6 +609,7 @@ module Hu
576
609
  git checkout develop && git pull
577
610
  git checkout master && git pull --rebase origin master
578
611
  EOS
612
+ Hu::Tm.t(:update_working_copy, cmd: 'deploy')
579
613
  end
580
614
 
581
615
  def heroku_git_remote
@@ -736,6 +770,7 @@ module Hu
736
770
  # Abort failed merge
737
771
  git merge --abort
738
772
  EOS
773
+ Hu::Tm.t(:abort_merge, cmd: 'deploy')
739
774
  end
740
775
 
741
776
  def create_changelog(env)
@@ -748,6 +783,7 @@ module Hu
748
783
  end
749
784
 
750
785
  def shutdown
786
+ Hu::Tm.flush!
751
787
  @@shutting_down = true
752
788
  unbusy
753
789
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ require 'segment'
3
+ require 'tty-prompt'
4
+ require 'securerandom'
5
+
6
+ module Hu
7
+ class Tm
8
+ API_TOKEN = ENV['HEROKU_API_KEY'] || ENV['HEROKU_API_TOKEN'] || Netrc.read['api.heroku.com']&.password
9
+ @segment = nil
10
+ @context = {}
11
+
12
+ class << self
13
+ def t(event, props = {})
14
+ return if @segment.nil?
15
+ @segment.track(anonymous_id: Settings.userid,
16
+ event: event.to_s,
17
+ properties: props,
18
+ context: @context)
19
+ end
20
+
21
+ def flush!
22
+ return if @segment.nil?
23
+ @segment.flush
24
+ end
25
+
26
+ def start!
27
+ if Settings.send_anonymous_usage_statistics.nil?
28
+ puts <<-EOF.strip_heredoc
29
+
30
+ Hu would like to collect anonymous usage
31
+ statistics for the purpose of self-improvement.
32
+
33
+ No personal data or identifying information
34
+ about your projects will be collected.
35
+
36
+ EOF
37
+
38
+ prompt = TTY::Prompt.new
39
+ choice = prompt.select('Enable anonymous usage statistics?') do |menu|
40
+ menu.enum '.'
41
+ menu.choice 'Yes, I will help Hu!', true
42
+ menu.choice 'Nope', false
43
+ end
44
+
45
+ cfg = {
46
+ userid: SecureRandom.uuid
47
+ }
48
+ begin
49
+ cfg = YAML.parse(File.read(Hu::CONFIG_FILE))
50
+ rescue
51
+ end
52
+ cfg['send_anonymous_usage_statistics'] = choice
53
+ File.write(Hu::CONFIG_FILE, YAML.dump(cfg))
54
+
55
+ puts "\nThanks!\n"
56
+ puts "Your decision was saved to #{Hu::CONFIG_FILE}\n"
57
+ sleep 3
58
+ end
59
+
60
+ if Settings.send_anonymous_usage_statistics == true
61
+ @segment = Segment::Analytics.new(write_key: 'T32sCm68MMAsyoa9r5uPtHz0YwJ3MjXI')
62
+ @context = { version: Hu::VERSION }
63
+ @segment.identify(anonymous_id: Settings.userid || SecureRandom.uuid,
64
+ context: @context)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ Hu::Tm.start!
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Hu
3
- VERSION = '1.3.16'
3
+ VERSION = '1.3.17'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.16
4
+ version: 1.3.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - moe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-26 00:00:00.000000000 Z
11
+ date: 2016-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -154,16 +154,16 @@ dependencies:
154
154
  name: tty-prompt
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ">="
157
+ - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '0'
159
+ version: 0.6.0
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ">="
164
+ - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: '0'
166
+ version: 0.6.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: tty-spinner
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -290,6 +290,34 @@ dependencies:
290
290
  - - ">="
291
291
  - !ruby/object:Gem::Version
292
292
  version: '0'
293
+ - !ruby/object:Gem::Dependency
294
+ name: analytics-ruby
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ type: :runtime
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - ">="
305
+ - !ruby/object:Gem::Version
306
+ version: '0'
307
+ - !ruby/object:Gem::Dependency
308
+ name: config
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - ">="
312
+ - !ruby/object:Gem::Version
313
+ version: '0'
314
+ type: :runtime
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ">="
319
+ - !ruby/object:Gem::Version
320
+ version: '0'
293
321
  description: Heroku Utility.
294
322
  email:
295
323
  - moe@busyloop.net
@@ -311,6 +339,7 @@ files:
311
339
  - lib/hu/collab.rb
312
340
  - lib/hu/common.rb
313
341
  - lib/hu/deploy.rb
342
+ - lib/hu/telemetry.rb
314
343
  - lib/hu/version.rb
315
344
  homepage: https://github.com/busyloop/hu
316
345
  licenses: