blend 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +38 -0
- data/bin/blend +34 -0
- data/lib/blend.rb +28 -0
- data/lib/blend/chatbot/bot.rb +352 -0
- data/lib/blend/cli.rb +38 -0
- data/lib/blend/cli/github.rb +140 -0
- data/lib/blend/cli/heroku.rb +232 -0
- data/lib/blend/cli/hipchat.rb +61 -0
- data/lib/blend/cli/juice.rb +493 -0
- data/lib/blend/client.rb +63 -0
- data/lib/blend/client/github_client.rb +106 -0
- data/lib/blend/client/heroku_client.rb +87 -0
- data/lib/blend/client/hipchat_client.rb +78 -0
- data/lib/blend/client/juice_client.rb +400 -0
- data/lib/blend/core_ext/fixnum.rb +5 -0
- data/lib/blend/core_ext/object.rb +13 -0
- data/lib/blend/core_ext/string.rb +9 -0
- data/lib/blend/exceptions.rb +16 -0
- data/lib/blend/status/domain.rb +225 -0
- data/lib/blend/status/environment.rb +167 -0
- data/lib/blend/status/project.rb +227 -0
- data/lib/blend/status/project_resolver.rb +183 -0
- data/lib/blend/status/repo.rb +51 -0
- data/lib/blend/status/team.rb +29 -0
- data/lib/blend/version.rb +10 -0
- metadata +225 -0
@@ -0,0 +1,183 @@
|
|
1
|
+
module Blend
|
2
|
+
module Status
|
3
|
+
class ProjectResolver
|
4
|
+
attr_accessor :project
|
5
|
+
|
6
|
+
def initialize( project )
|
7
|
+
@project = project
|
8
|
+
end
|
9
|
+
|
10
|
+
def juice_client
|
11
|
+
@project.juice_client
|
12
|
+
end
|
13
|
+
|
14
|
+
def github_client
|
15
|
+
Blend::Client.github_client
|
16
|
+
end
|
17
|
+
|
18
|
+
def name
|
19
|
+
@project.name
|
20
|
+
end
|
21
|
+
|
22
|
+
def set( s )
|
23
|
+
!s.nil? && s != ""
|
24
|
+
end
|
25
|
+
|
26
|
+
def resolve_project_found
|
27
|
+
puts "Trying to fix project_found"
|
28
|
+
|
29
|
+
choose do |menu|
|
30
|
+
menu.header = "No juice project found".red
|
31
|
+
|
32
|
+
menu.prompt = "Create?"
|
33
|
+
|
34
|
+
menu.choice "create" do
|
35
|
+
juice_client.create_project @name
|
36
|
+
end
|
37
|
+
|
38
|
+
menu.choice "ignore"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def resolve_hipchat
|
43
|
+
puts "Resolve hipchat"
|
44
|
+
|
45
|
+
choices = juice_client.hipchat_check.select do |x|
|
46
|
+
x[:projects].first == "_unassigned_"
|
47
|
+
end.collect do |x|
|
48
|
+
x[:room]
|
49
|
+
end
|
50
|
+
|
51
|
+
if choices.member? name
|
52
|
+
puts "Found a matching room... attaching"
|
53
|
+
juice_client.project_add_hipchat( @project.juice_id, name )
|
54
|
+
return
|
55
|
+
end
|
56
|
+
|
57
|
+
room = choose do |menu|
|
58
|
+
menu.header = "Select a hipchat room action"
|
59
|
+
menu.prompt = "Please choose a unassigned hipchat room to associate"
|
60
|
+
menu.choice "Create A Room called #{name}" do
|
61
|
+
"create"
|
62
|
+
end
|
63
|
+
|
64
|
+
menu.choices *choices
|
65
|
+
end
|
66
|
+
|
67
|
+
puts "You chose: #{room}"
|
68
|
+
|
69
|
+
if room == "create"
|
70
|
+
room = name
|
71
|
+
puts "Creating a room #{name}"
|
72
|
+
Blend::Client.hipchat_client.create_room( name, "Let's talk about #{name}!" )
|
73
|
+
end
|
74
|
+
|
75
|
+
if( set( room ) )
|
76
|
+
juice_client.project_add_hipchat( @project.juice_id, name )
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def resolve_github_teams
|
81
|
+
team = choose do |menu|
|
82
|
+
menu.header = "Select a github team"
|
83
|
+
menu.prompt = "Please select a team"
|
84
|
+
|
85
|
+
menu.choice "Create a new team" do
|
86
|
+
"create"
|
87
|
+
end
|
88
|
+
|
89
|
+
menu.choices *Blend::Client.juice_client.github_team_check.select { |k,v| v.length == 0}.keys
|
90
|
+
end
|
91
|
+
|
92
|
+
if team == "create"
|
93
|
+
team = name.downcase
|
94
|
+
puts "Creating team: #{name}"
|
95
|
+
pp github_client.create_team( name.downcase )
|
96
|
+
end
|
97
|
+
|
98
|
+
if( set( team ))
|
99
|
+
juice_client.project_add_team( @project.juice_id, team )
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def resolve_repos_setup
|
104
|
+
teams = @project.github_teams
|
105
|
+
|
106
|
+
if teams.length == 0
|
107
|
+
puts "Need to have a github team configured to create a repo".red
|
108
|
+
return
|
109
|
+
end
|
110
|
+
|
111
|
+
team = teams.first
|
112
|
+
|
113
|
+
repos = @project.repos
|
114
|
+
|
115
|
+
[ "", "-ios", "-android" ].each do |suffix|
|
116
|
+
repo_name = "#{name}#{suffix}".downcase
|
117
|
+
if repos.collect { |k,v| v }.select { |x,v| x['name'] == repo_name}.length > 0
|
118
|
+
puts "Found #{repo_name}".green
|
119
|
+
elsif agree "Create #{repo_name}? y/n ", true
|
120
|
+
puts "Creating #{repo_name} in team #{team}".yellow
|
121
|
+
github_client.repo_create( team, repo_name )
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def resolve_source_control
|
127
|
+
repos = @project.repos_setup
|
128
|
+
configured = (@project.feeds['github'] || []).collect { |x| "#{x['namespace']}/#{x['name']}" }
|
129
|
+
|
130
|
+
(repos-configured).each do |repo|
|
131
|
+
puts "Adding feed #{repo}".yellow
|
132
|
+
|
133
|
+
pp juice_client.add_feed( @project.juice_id, 'github', repo )
|
134
|
+
end
|
135
|
+
# exit
|
136
|
+
end
|
137
|
+
|
138
|
+
def resolve_github_members
|
139
|
+
people = juice_client.organization_users(1).collect { |x| { name: x["name"], github: x['github_handle']}}.select { |x| set(x[:github]) }
|
140
|
+
teams = @project.github_teams
|
141
|
+
|
142
|
+
if teams.length == 0
|
143
|
+
puts "Need to have a github team configured to add people to it!".red
|
144
|
+
return
|
145
|
+
end
|
146
|
+
|
147
|
+
team = teams.first
|
148
|
+
|
149
|
+
github = ""
|
150
|
+
|
151
|
+
begin
|
152
|
+
user = choose do |menu|
|
153
|
+
|
154
|
+
menu.header = "Select a user"
|
155
|
+
menu.prompt = "Please select a user"
|
156
|
+
|
157
|
+
menu.choice "Done" do
|
158
|
+
"done"
|
159
|
+
end
|
160
|
+
|
161
|
+
menu.choices *people.sort{|a,b| a[:name] <=> b[:name]}.collect { |x| "#{x[:github]}:#{x[:name]}"}
|
162
|
+
end
|
163
|
+
|
164
|
+
github = user.split( /:/ ).first
|
165
|
+
|
166
|
+
if github != "done"
|
167
|
+
github_client.add_team_member team, github
|
168
|
+
end
|
169
|
+
end while github != "done"
|
170
|
+
end
|
171
|
+
|
172
|
+
def resolve_juice_users_synced
|
173
|
+
not_in_juice = @project.juice_users_synced_diff
|
174
|
+
|
175
|
+
not_in_juice.each do |user_id|
|
176
|
+
puts "Adding juice user_id: #{user_id}".yellow
|
177
|
+
|
178
|
+
juice_client.project_add_user( @project.juice_id, user_id )
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Blend
|
2
|
+
module Status
|
3
|
+
class Repo
|
4
|
+
attr_accessor :project, :name, :repo
|
5
|
+
|
6
|
+
def initialize( project, name, repo)
|
7
|
+
@project = project
|
8
|
+
@name = name
|
9
|
+
@repo = repo
|
10
|
+
end
|
11
|
+
|
12
|
+
def github_client
|
13
|
+
Blend::Client.github_client
|
14
|
+
end
|
15
|
+
|
16
|
+
def private?
|
17
|
+
@repo['private']
|
18
|
+
end
|
19
|
+
|
20
|
+
def hooks
|
21
|
+
@hooks ||= github_client.list_hooks( repo['full_name'] ).group_by { |x| x['name'] }
|
22
|
+
end
|
23
|
+
|
24
|
+
def hipchat_hook
|
25
|
+
hooks['hipchat']
|
26
|
+
end
|
27
|
+
|
28
|
+
def resolve_hipchat_hook
|
29
|
+
puts "Adding hipchat hook...".yellow
|
30
|
+
Blend::CLI::Github.new.add_hipchat( repo['full_name'], @project.hipchat ) if @project.hipchat
|
31
|
+
end
|
32
|
+
|
33
|
+
def check key, method
|
34
|
+
ret = __send__( method )
|
35
|
+
ret = false if ret.nil?
|
36
|
+
printf "%20s: ", key
|
37
|
+
if( ret )
|
38
|
+
printf "\u2713\n".encode('utf-8').green
|
39
|
+
else
|
40
|
+
printf "\u2718\n".encode('utf-8').red
|
41
|
+
|
42
|
+
if( @project.resolve )
|
43
|
+
r = "resolve_#{method}".to_sym
|
44
|
+
__send__(r) if respond_to? r
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Blend
|
2
|
+
module Status
|
3
|
+
class Team
|
4
|
+
attr_accessor :name
|
5
|
+
|
6
|
+
def initialize( project, name )
|
7
|
+
@project = project
|
8
|
+
@name = name
|
9
|
+
end
|
10
|
+
|
11
|
+
def github_client
|
12
|
+
Blend::Client.github_client
|
13
|
+
end
|
14
|
+
|
15
|
+
def repos
|
16
|
+
@repos ||= github_client.list_team_repos @name
|
17
|
+
end
|
18
|
+
|
19
|
+
def members
|
20
|
+
@members ||= github_client.list_team_members( @name ).collect { |x| x['login'] }
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_only?
|
24
|
+
@github_team ||= github_client.list_team @name
|
25
|
+
return @github_team && @github_team['permission'] != 'push'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,225 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: blend
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ricky Reusser
|
8
|
+
- Will Schenk
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-01-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: thor
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: hipchat-api
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: github_api
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: httparty
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: highline
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: colorize
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: heroku-api
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: heroku
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :runtime
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: dnsruby
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
type: :runtime
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: whois
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
type: :runtime
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: httpclient
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
type: :runtime
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
description: Project management for HappyFunCorp projects.
|
169
|
+
email:
|
170
|
+
- ricky@happyfuncorp.com
|
171
|
+
- will@happyfuncorp.com
|
172
|
+
executables:
|
173
|
+
- blend
|
174
|
+
extensions: []
|
175
|
+
extra_rdoc_files: []
|
176
|
+
files:
|
177
|
+
- lib/blend/chatbot/bot.rb
|
178
|
+
- lib/blend/cli/github.rb
|
179
|
+
- lib/blend/cli/heroku.rb
|
180
|
+
- lib/blend/cli/hipchat.rb
|
181
|
+
- lib/blend/cli/juice.rb
|
182
|
+
- lib/blend/cli.rb
|
183
|
+
- lib/blend/client/github_client.rb
|
184
|
+
- lib/blend/client/heroku_client.rb
|
185
|
+
- lib/blend/client/hipchat_client.rb
|
186
|
+
- lib/blend/client/juice_client.rb
|
187
|
+
- lib/blend/client.rb
|
188
|
+
- lib/blend/core_ext/fixnum.rb
|
189
|
+
- lib/blend/core_ext/object.rb
|
190
|
+
- lib/blend/core_ext/string.rb
|
191
|
+
- lib/blend/exceptions.rb
|
192
|
+
- lib/blend/status/domain.rb
|
193
|
+
- lib/blend/status/environment.rb
|
194
|
+
- lib/blend/status/project.rb
|
195
|
+
- lib/blend/status/project_resolver.rb
|
196
|
+
- lib/blend/status/repo.rb
|
197
|
+
- lib/blend/status/team.rb
|
198
|
+
- lib/blend/version.rb
|
199
|
+
- lib/blend.rb
|
200
|
+
- Rakefile
|
201
|
+
- bin/blend
|
202
|
+
homepage: http://happyfuncorp.com
|
203
|
+
licenses: []
|
204
|
+
metadata: {}
|
205
|
+
post_install_message:
|
206
|
+
rdoc_options: []
|
207
|
+
require_paths:
|
208
|
+
- lib
|
209
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
210
|
+
requirements:
|
211
|
+
- - '>='
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '0'
|
214
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
215
|
+
requirements:
|
216
|
+
- - '>='
|
217
|
+
- !ruby/object:Gem::Version
|
218
|
+
version: '0'
|
219
|
+
requirements: []
|
220
|
+
rubyforge_project:
|
221
|
+
rubygems_version: 2.1.10
|
222
|
+
signing_key:
|
223
|
+
specification_version: 4
|
224
|
+
summary: Let's make some juice!
|
225
|
+
test_files: []
|