hu 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/hu.gemspec +1 -0
- data/lib/hu/cli.rb +8 -31
- data/lib/hu/collab.rb +123 -0
- data/lib/hu/version.rb +1 -1
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 135742548802f1cf65c42791d2c27839da18c4d6
|
4
|
+
data.tar.gz: 5873b031208439a1f552d4a1bdedf8864d592b96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 362abd3e5beed4cb0ffbfb96610be2663c2afe689ff858417375cf6f06d15e436902a4156faf994820093f16be30cb959d0cbfe39ef4d523c4c8edeba7e0d136
|
7
|
+
data.tar.gz: e2b6081abd344ee8f36a2b06bd1095d1594dfb7b675631bdc9ecc78c58849b0e9b41774433fc0897f9b48e56fdcd6dec22aca28ed014b35ae81dd94edfc04b95
|
data/hu.gemspec
CHANGED
data/lib/hu/cli.rb
CHANGED
@@ -4,15 +4,18 @@ require 'powerbar'
|
|
4
4
|
require 'yaml'
|
5
5
|
require 'platform-api'
|
6
6
|
|
7
|
+
require 'hu/collab'
|
8
|
+
|
7
9
|
module Hu
|
8
10
|
class Cli < Optix::Cli
|
9
11
|
API_TOKEN = ENV['HEROKU_API_TOKEN']
|
10
|
-
|
12
|
+
Optix::command do
|
11
13
|
text "Hu v#{Hu::VERSION} - Heroku Utility"
|
12
14
|
if API_TOKEN.nil?
|
13
15
|
text ""
|
14
16
|
text "\e[1mWARNING: Environment variable 'HEROKU_API_TOKEN' must be set.\e[0m"
|
15
17
|
end
|
18
|
+
opt :quiet, "Don't show progress bar", :default => false
|
16
19
|
opt :version, "Print version and exit", :short => :none
|
17
20
|
trigger :version do
|
18
21
|
puts "Hu v#{Hu::VERSION}"
|
@@ -23,37 +26,11 @@ module Hu
|
|
23
26
|
exit 1
|
24
27
|
end
|
25
28
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
opt :format, "yaml|json", :default => 'yaml'
|
30
|
-
parent "collab", "Application collaborators"
|
31
|
-
def export(cmd, opts, argv)
|
32
|
-
#raise Optix::HelpNeeded unless opts.values_at(:capslock, :numlock, :verbose).any?
|
33
|
-
data = {}
|
34
|
-
pb = PowerBar.new
|
35
|
-
app_names = h.app.list.map{|e| e['name']}
|
36
|
-
app_names.each_with_index do |app_name,i|
|
37
|
-
pb.show :msg => app_name, :total => app_names.length, :done => i
|
38
|
-
data[app_name] = { 'collaborators' => [] }
|
39
|
-
h.collaborator.list(app_name).map{|e|
|
40
|
-
case e['role']
|
41
|
-
when 'owner'
|
42
|
-
data[app_name]['owner'] = e['user']['email']
|
43
|
-
when nil
|
44
|
-
data[app_name]['collaborators'] << e['user']['email']
|
45
|
-
else
|
46
|
-
raise RuntimeError, "Unknown collaborator role: #{e['role']}"
|
47
|
-
end
|
48
|
-
}
|
29
|
+
filter do |cmd, opts, argv|
|
30
|
+
$quiet = opts[:quiet]
|
31
|
+
$quiet = true unless STDOUT.isatty
|
49
32
|
end
|
50
|
-
pb.wipe
|
51
|
-
puts data.send("to_#{opts[:format]}".to_sym)
|
52
33
|
end
|
53
|
-
|
54
|
-
def h
|
55
|
-
@h ||= PlatformAPI.connect_oauth(API_TOKEN)
|
56
|
-
end
|
57
|
-
|
58
34
|
end
|
59
35
|
end
|
36
|
+
|
data/lib/hu/collab.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'powerbar'
|
2
|
+
require 'yaml'
|
3
|
+
require 'hashdiff'
|
4
|
+
require 'platform-api'
|
5
|
+
|
6
|
+
module Hu
|
7
|
+
class Cli < Optix::Cli
|
8
|
+
class Collab < Optix::Cli
|
9
|
+
|
10
|
+
desc "Print current mapping to stdout"
|
11
|
+
opt :format, "yaml|json", :default => 'yaml'
|
12
|
+
parent "collab", "Application collaborators"
|
13
|
+
def export(cmd, opts, argv)
|
14
|
+
puts heroku_state.send("to_#{opts[:format]}".to_sym)
|
15
|
+
end
|
16
|
+
|
17
|
+
OP_COLORS = {
|
18
|
+
'+' => "\e[0;1;32m",
|
19
|
+
'-' => "\e[0;1;31m",
|
20
|
+
'~' => "\e[0;32m",
|
21
|
+
}
|
22
|
+
desc "Read mapping from stdin and diff to heroku state"
|
23
|
+
parent "collab"
|
24
|
+
def diff(cmd, opts, argv)
|
25
|
+
parsed_state = parse_as_json_or_yaml(STDIN.read)
|
26
|
+
plan(HashDiff.diff(heroku_state, parsed_state)).each do |s|
|
27
|
+
color = OP_COLORS[s[:op]]
|
28
|
+
msg = ''
|
29
|
+
if s[:method].nil?
|
30
|
+
color = "\e[0;41;33;1m"
|
31
|
+
msg = "Can not resolve this."
|
32
|
+
end
|
33
|
+
printf "%s%6s %-30s %-15s %-30s %s\e[0m\n", color, s[:op_name], s[:app_name], s[:role], s[:value], msg
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
OP_MAP = {
|
38
|
+
'+' => 'add',
|
39
|
+
'-' => 'remove',
|
40
|
+
'~' => 'change',
|
41
|
+
}
|
42
|
+
def plan(diff)
|
43
|
+
plan = []
|
44
|
+
diff.each do |op, target, value|
|
45
|
+
app_name, role = target.split('.')
|
46
|
+
role = role.split('[')[0]
|
47
|
+
op_name = OP_MAP[op]
|
48
|
+
method_name = "op_#{op_name}_#{role}".to_sym
|
49
|
+
plan << {
|
50
|
+
app_name: app_name,
|
51
|
+
op: op,
|
52
|
+
op_name: op_name,
|
53
|
+
method: self.respond_to?(method_name) ? method_name : nil,
|
54
|
+
value: value,
|
55
|
+
role: role,
|
56
|
+
}
|
57
|
+
end
|
58
|
+
plan
|
59
|
+
end
|
60
|
+
|
61
|
+
def op_add_collaborators(name)
|
62
|
+
raise NotImplementedError
|
63
|
+
end
|
64
|
+
|
65
|
+
def op_remove_collaborators(name)
|
66
|
+
raise NotImplementedError
|
67
|
+
end
|
68
|
+
|
69
|
+
def parse_as_json_or_yaml(input)
|
70
|
+
begin
|
71
|
+
parsed = JSON.load(input)
|
72
|
+
rescue => jex
|
73
|
+
begin
|
74
|
+
parsed = YAML.load(input)
|
75
|
+
if parsed.is_a? String
|
76
|
+
raise ArgumentError, "Input parsed as YAML yields a String"
|
77
|
+
end
|
78
|
+
rescue => yex
|
79
|
+
STDERR.puts "Error: Could neither parse stdin as YAML nor as JSON."
|
80
|
+
STDERR.puts "-- JSON Error --"
|
81
|
+
STDERR.puts jex
|
82
|
+
STDERR.puts "-- YAML Error --"
|
83
|
+
STDERR.puts yex
|
84
|
+
raise ArgumentError
|
85
|
+
end
|
86
|
+
end
|
87
|
+
parsed
|
88
|
+
end
|
89
|
+
|
90
|
+
def heroku_state
|
91
|
+
data = {}
|
92
|
+
app_names = h.app.list.map{|e| e['name']}
|
93
|
+
app_names.each_with_index do |app_name,i|
|
94
|
+
pb :msg => app_name, :total => app_names.length, :done => i+1
|
95
|
+
data[app_name] = { 'collaborators' => [] }
|
96
|
+
h.collaborator.list(app_name).map{|e|
|
97
|
+
case e['role']
|
98
|
+
when 'owner'
|
99
|
+
data[app_name]['owner'] = e['user']['email']
|
100
|
+
when nil
|
101
|
+
data[app_name]['collaborators'] << e['user']['email']
|
102
|
+
else
|
103
|
+
raise RuntimeError, "Unknown collaborator role: #{e['role']}"
|
104
|
+
end
|
105
|
+
}
|
106
|
+
end
|
107
|
+
pb :wipe
|
108
|
+
data
|
109
|
+
end
|
110
|
+
|
111
|
+
def h
|
112
|
+
@h ||= PlatformAPI.connect_oauth(Hu::Cli::API_TOKEN)
|
113
|
+
end
|
114
|
+
|
115
|
+
def pb(show_opts)
|
116
|
+
return if $quiet
|
117
|
+
@pb ||= PowerBar.new
|
118
|
+
show_opts == :wipe ? @pb.wipe : @pb.show(show_opts)
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/lib/hu/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- moe
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: hashdiff
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
description: Heroku Utility.
|
84
98
|
email:
|
85
99
|
- moe@busyloop.net
|
@@ -96,6 +110,7 @@ files:
|
|
96
110
|
- bin/hu
|
97
111
|
- hu.gemspec
|
98
112
|
- lib/hu/cli.rb
|
113
|
+
- lib/hu/collab.rb
|
99
114
|
- lib/hu/version.rb
|
100
115
|
homepage: https://github.com/busyloop/hu
|
101
116
|
licenses:
|