kensa 1.0.0 → 1.0.1.pre
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.
- data/Rakefile +3 -3
- data/bin/kensa +7 -0
- data/kensa.gemspec +10 -8
- data/lib/heroku/kensa.rb +1 -1
- data/lib/heroku/kensa/check.rb +41 -4
- data/lib/heroku/kensa/client.rb +55 -10
- data/lib/heroku/kensa/http.rb +4 -0
- data/test/{deprovision_check.rb → deprovision_check_test.rb} +0 -0
- data/test/plan_change_check_test.rb +28 -0
- data/test/resources/server.rb +16 -0
- metadata +17 -12
data/Rakefile
CHANGED
@@ -15,10 +15,10 @@ begin
|
|
15
15
|
require 'heroku/kensa'
|
16
16
|
Jeweler::Tasks.new do |gemspec|
|
17
17
|
gemspec.name = "kensa"
|
18
|
-
gemspec.summary = ""
|
19
|
-
gemspec.description = ""
|
18
|
+
gemspec.summary = "Tool to help Heroku add-on providers integrating their services"
|
19
|
+
gemspec.description = "Kensa is a command-line tool to help add-on providers integrating their services with Heroku. It manages manifest files, and provides a TDD-like approach for programmers to test and develop their APIs."
|
20
20
|
gemspec.email = "pedro@heroku.com"
|
21
|
-
gemspec.homepage = "http://heroku.com"
|
21
|
+
gemspec.homepage = "http://provider.heroku.com/resources"
|
22
22
|
gemspec.authors = ["Blake Mizerany", "Pedro Belo", "Adam Wiggins"]
|
23
23
|
|
24
24
|
gemspec.add_development_dependency(%q<turn>, [">= 0"])
|
data/bin/kensa
CHANGED
@@ -18,6 +18,7 @@ ARGV.options do |o|
|
|
18
18
|
o.on("--production") { options[:env] = "production" }
|
19
19
|
o.on("--without-sso") { options[:sso] = false }
|
20
20
|
o.on("-h", "--help") { command = "help" }
|
21
|
+
o.on("-p plan", "--plan") { |plan| options[:plan] = plan }
|
21
22
|
o.on("-v", "--version") { options[:command] = "version" }
|
22
23
|
o.parse!
|
23
24
|
end
|
@@ -44,6 +45,9 @@ OPTIONS
|
|
44
45
|
-h, --help
|
45
46
|
Show this message
|
46
47
|
|
48
|
+
-p, --plan
|
49
|
+
Provision the specified plan instead of "test"
|
50
|
+
|
47
51
|
--async
|
48
52
|
Check provision call with async response.
|
49
53
|
|
@@ -70,6 +74,9 @@ TEST TYPES
|
|
70
74
|
deprovision <id>
|
71
75
|
Simulate a deprovision call from Heroku.
|
72
76
|
|
77
|
+
planchange <id> <new_plan>
|
78
|
+
Simulate a plan change call from Heroku.
|
79
|
+
|
73
80
|
sso <id>
|
74
81
|
Simulate a single sign-on call from Heroku.
|
75
82
|
|
data/kensa.gemspec
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{kensa}
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.1.pre"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Blake Mizerany", "Pedro Belo", "Adam Wiggins"]
|
12
|
-
s.date = %q{2010-09-
|
12
|
+
s.date = %q{2010-09-27}
|
13
13
|
s.default_executable = %q{kensa}
|
14
|
-
s.description = %q{}
|
14
|
+
s.description = %q{Kensa is a command-line tool to help add-on providers integrating their services with Heroku. It manages manifest files, and provides a TDD-like approach for programmers to test and develop their APIs.}
|
15
15
|
s.email = %q{pedro@heroku.com}
|
16
16
|
s.executables = ["kensa"]
|
17
17
|
s.extra_rdoc_files = [
|
@@ -31,10 +31,11 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/heroku/kensa/sso.rb",
|
32
32
|
"set-env.sh",
|
33
33
|
"test/all_check_test.rb",
|
34
|
-
"test/
|
34
|
+
"test/deprovision_check_test.rb",
|
35
35
|
"test/helper.rb",
|
36
36
|
"test/manifest_check_test.rb",
|
37
37
|
"test/manifest_test.rb",
|
38
|
+
"test/plan_change_check_test.rb",
|
38
39
|
"test/provision_check_test.rb",
|
39
40
|
"test/provision_response_check_test.rb",
|
40
41
|
"test/resources/runner.rb",
|
@@ -42,17 +43,18 @@ Gem::Specification.new do |s|
|
|
42
43
|
"test/sso_check_test.rb",
|
43
44
|
"test/sso_test.rb"
|
44
45
|
]
|
45
|
-
s.homepage = %q{http://heroku.com}
|
46
|
+
s.homepage = %q{http://provider.heroku.com/resources}
|
46
47
|
s.rdoc_options = ["--charset=UTF-8"]
|
47
48
|
s.require_paths = ["lib"]
|
48
49
|
s.rubygems_version = %q{1.3.6}
|
49
|
-
s.summary = %q{}
|
50
|
+
s.summary = %q{Tool to help Heroku add-on providers integrating their services}
|
50
51
|
s.test_files = [
|
51
52
|
"test/all_check_test.rb",
|
52
|
-
"test/
|
53
|
+
"test/deprovision_check_test.rb",
|
53
54
|
"test/helper.rb",
|
54
55
|
"test/manifest_check_test.rb",
|
55
56
|
"test/manifest_test.rb",
|
57
|
+
"test/plan_change_check_test.rb",
|
56
58
|
"test/provision_check_test.rb",
|
57
59
|
"test/provision_response_check_test.rb",
|
58
60
|
"test/resources/runner.rb",
|
data/lib/heroku/kensa.rb
CHANGED
data/lib/heroku/kensa/check.rb
CHANGED
@@ -148,10 +148,13 @@ module Heroku
|
|
148
148
|
def call!
|
149
149
|
response = data[:provision_response]
|
150
150
|
test "response"
|
151
|
+
|
151
152
|
check "contains an id" do
|
152
153
|
response.is_a?(Hash) && response.has_key?("id")
|
153
154
|
end
|
154
155
|
|
156
|
+
screen.message " (id #{response['id']})"
|
157
|
+
|
155
158
|
if response.has_key?("config")
|
156
159
|
test "config data"
|
157
160
|
check "is a hash" do
|
@@ -225,7 +228,7 @@ module Heroku
|
|
225
228
|
|
226
229
|
payload = {
|
227
230
|
:heroku_id => APPID,
|
228
|
-
:plan => 'test',
|
231
|
+
:plan => data[:plan] || 'test',
|
229
232
|
:callback_url => callback
|
230
233
|
}
|
231
234
|
|
@@ -328,6 +331,40 @@ module Heroku
|
|
328
331
|
end
|
329
332
|
|
330
333
|
|
334
|
+
class PlanChangeCheck < ApiCheck
|
335
|
+
include HTTP
|
336
|
+
|
337
|
+
def call!
|
338
|
+
id = data[:id]
|
339
|
+
raise ArgumentError, "No id specified" if id.nil?
|
340
|
+
|
341
|
+
new_plan = data[:plan]
|
342
|
+
raise ArgumentError, "No plan specified" if new_plan.nil?
|
343
|
+
|
344
|
+
path = "/heroku/resources/#{CGI::escape(id.to_s)}"
|
345
|
+
|
346
|
+
test "PUT #{path}"
|
347
|
+
check "response" do
|
348
|
+
code, _ = put(credentials, path, { :plan => new_plan})
|
349
|
+
if code == 200
|
350
|
+
true
|
351
|
+
elsif code == -1
|
352
|
+
error("unable to connect to #{url}")
|
353
|
+
else
|
354
|
+
error("expected 200, got #{code}")
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
check "authentication" do
|
359
|
+
wrong_credentials = ['wrong', 'secret']
|
360
|
+
code, _ = delete(wrong_credentials, path, nil)
|
361
|
+
error("expected 401, got #{code}") if code != 401
|
362
|
+
true
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
|
331
368
|
class SsoCheck < ApiCheck
|
332
369
|
include HTTP
|
333
370
|
|
@@ -406,13 +443,13 @@ module Heroku
|
|
406
443
|
if args
|
407
444
|
screen.message "\n\n"
|
408
445
|
screen.message "Starting #{args.first}..."
|
409
|
-
screen.message ""
|
446
|
+
screen.message "\n\n"
|
410
447
|
|
411
448
|
run_in_env(config) { system(*args) }
|
412
449
|
error("run exited abnormally, expected 0, got #{$?.to_i}") unless $?.to_i == 0
|
413
450
|
|
414
|
-
screen.message ""
|
415
|
-
screen.message "End of #{args.first}"
|
451
|
+
screen.message "\n"
|
452
|
+
screen.message "End of #{args.first}\n"
|
416
453
|
end
|
417
454
|
|
418
455
|
run DeprovisionCheck, data
|
data/lib/heroku/kensa/client.rb
CHANGED
@@ -39,6 +39,11 @@ module Heroku
|
|
39
39
|
id = ARGV.shift || abort("! no id specified; see usage")
|
40
40
|
run_check ManifestCheck
|
41
41
|
run_check DeprovisionCheck, :id => id
|
42
|
+
when "planchange"
|
43
|
+
id = ARGV.shift || abort("! no id specified; see usage")
|
44
|
+
plan = ARGV.shift || abort("! no plan specified; see usage")
|
45
|
+
run_check ManifestCheck
|
46
|
+
run_check PlanChangeCheck, :id => id, :plan => plan
|
42
47
|
when "sso"
|
43
48
|
id = ARGV.shift || abort("! no id specified; see usage")
|
44
49
|
run_check ManifestCheck
|
@@ -63,11 +68,10 @@ module Heroku
|
|
63
68
|
end
|
64
69
|
|
65
70
|
def push
|
66
|
-
|
67
|
-
client = Heroku::Command.run "auth:client", ['--ignore-keys']
|
71
|
+
user, password = ask_for_credentials
|
68
72
|
host = ENV['ADDONS_HOST'] || 'https://addons.heroku.com'
|
69
73
|
data = Yajl::Parser.parse(resolve_manifest)
|
70
|
-
resource = RestClient::Resource.new(host,
|
74
|
+
resource = RestClient::Resource.new(host, user, password)
|
71
75
|
resource['provider/addons'].post(resolve_manifest)
|
72
76
|
puts "-----> Manifest for \"#{data['id']}\" was pushed successfully"
|
73
77
|
puts " Continue at https://provider.heroku.com/addons/#{data['id']}"
|
@@ -99,12 +103,53 @@ module Heroku
|
|
99
103
|
screen.finish
|
100
104
|
end
|
101
105
|
|
102
|
-
def
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
106
|
+
def running_on_windows?
|
107
|
+
RUBY_PLATFORM =~ /mswin32|mingw32/
|
108
|
+
end
|
109
|
+
|
110
|
+
def echo_off
|
111
|
+
system "stty -echo"
|
112
|
+
end
|
113
|
+
|
114
|
+
def echo_on
|
115
|
+
system "stty echo"
|
116
|
+
end
|
117
|
+
|
118
|
+
def ask_for_credentials
|
119
|
+
puts "Enter your Heroku Provider credentials."
|
120
|
+
|
121
|
+
print "Email: "
|
122
|
+
user = gets.strip
|
123
|
+
|
124
|
+
print "Password: "
|
125
|
+
password = running_on_windows? ? ask_for_password_on_windows : ask_for_password
|
126
|
+
|
127
|
+
[ user, password ]
|
128
|
+
end
|
129
|
+
|
130
|
+
def ask_for_password_on_windows
|
131
|
+
require "Win32API"
|
132
|
+
char = nil
|
133
|
+
password = ''
|
134
|
+
|
135
|
+
while char = Win32API.new("crtdll", "_getch", [ ], "L").Call do
|
136
|
+
break if char == 10 || char == 13 # received carriage return or newline
|
137
|
+
if char == 127 || char == 8 # backspace and delete
|
138
|
+
password.slice!(-1, 1)
|
139
|
+
else
|
140
|
+
password << char.chr
|
141
|
+
end
|
142
|
+
end
|
143
|
+
puts
|
144
|
+
return password
|
145
|
+
end
|
146
|
+
|
147
|
+
def ask_for_password
|
148
|
+
echo_off
|
149
|
+
password = gets.strip
|
150
|
+
puts
|
151
|
+
echo_on
|
152
|
+
return password
|
108
153
|
end
|
109
154
|
|
110
155
|
|
@@ -132,7 +177,7 @@ module Heroku
|
|
132
177
|
end
|
133
178
|
|
134
179
|
def message(msg)
|
135
|
-
$stdout.
|
180
|
+
$stdout.print msg
|
136
181
|
end
|
137
182
|
|
138
183
|
def finish
|
data/lib/heroku/kensa/http.rb
CHANGED
@@ -13,6 +13,10 @@ module Heroku
|
|
13
13
|
request(:post, credentials, path, payload)
|
14
14
|
end
|
15
15
|
|
16
|
+
def put(credentials, path, payload=nil)
|
17
|
+
request(:put, credentials, path, payload)
|
18
|
+
end
|
19
|
+
|
16
20
|
def delete(credentials, path, payload=nil)
|
17
21
|
request(:delete, credentials, path, payload)
|
18
22
|
end
|
File without changes
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test/helper'
|
2
|
+
|
3
|
+
class PlanChangeCheckTest < Test::Unit::TestCase
|
4
|
+
include Heroku::Kensa
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@data = Manifest.new.skeleton.merge :id => 123, :plan => 'premium'
|
8
|
+
@data['api']['username'] = 'test'
|
9
|
+
@data['api']['password'] = 'secret'
|
10
|
+
end
|
11
|
+
|
12
|
+
def check ; PlanChangeCheck ; end
|
13
|
+
|
14
|
+
test "working plan change call" do
|
15
|
+
@data['api']['test'] += "working"
|
16
|
+
assert_valid
|
17
|
+
end
|
18
|
+
|
19
|
+
test "detects invalid status" do
|
20
|
+
@data['api']['test'] += "invalid-status"
|
21
|
+
assert_invalid
|
22
|
+
end
|
23
|
+
|
24
|
+
test "detects missing auth" do
|
25
|
+
@data['api']['test'] += "invalid-missing-auth"
|
26
|
+
assert_invalid
|
27
|
+
end
|
28
|
+
end
|
data/test/resources/server.rb
CHANGED
@@ -64,6 +64,22 @@ post '/invalid-missing-auth/heroku/resources' do
|
|
64
64
|
end
|
65
65
|
|
66
66
|
|
67
|
+
put '/working/heroku/resources/:id' do
|
68
|
+
heroku_only!
|
69
|
+
{}.to_json
|
70
|
+
end
|
71
|
+
|
72
|
+
put '/invalid-missing-auth/heroku/resources/:id' do
|
73
|
+
{ :id => 123 }.to_json
|
74
|
+
end
|
75
|
+
|
76
|
+
put '/invalid-status/heroku/resources/:id' do
|
77
|
+
heroku_only!
|
78
|
+
status 422
|
79
|
+
{}.to_json
|
80
|
+
end
|
81
|
+
|
82
|
+
|
67
83
|
delete '/working/heroku/resources/:id' do
|
68
84
|
heroku_only!
|
69
85
|
"Ok"
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kensa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
4
|
+
prerelease: true
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
|
8
|
+
- 1
|
9
|
+
- pre
|
10
|
+
version: 1.0.1.pre
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Blake Mizerany
|
@@ -16,7 +17,7 @@ autorequire:
|
|
16
17
|
bindir: bin
|
17
18
|
cert_chain: []
|
18
19
|
|
19
|
-
date: 2010-09-
|
20
|
+
date: 2010-09-27 00:00:00 -07:00
|
20
21
|
default_executable: kensa
|
21
22
|
dependencies:
|
22
23
|
- !ruby/object:Gem::Dependency
|
@@ -138,7 +139,7 @@ dependencies:
|
|
138
139
|
version: 1.0.0
|
139
140
|
type: :runtime
|
140
141
|
version_requirements: *id009
|
141
|
-
description:
|
142
|
+
description: Kensa is a command-line tool to help add-on providers integrating their services with Heroku. It manages manifest files, and provides a TDD-like approach for programmers to test and develop their APIs.
|
142
143
|
email: pedro@heroku.com
|
143
144
|
executables:
|
144
145
|
- kensa
|
@@ -160,10 +161,11 @@ files:
|
|
160
161
|
- lib/heroku/kensa/sso.rb
|
161
162
|
- set-env.sh
|
162
163
|
- test/all_check_test.rb
|
163
|
-
- test/
|
164
|
+
- test/deprovision_check_test.rb
|
164
165
|
- test/helper.rb
|
165
166
|
- test/manifest_check_test.rb
|
166
167
|
- test/manifest_test.rb
|
168
|
+
- test/plan_change_check_test.rb
|
167
169
|
- test/provision_check_test.rb
|
168
170
|
- test/provision_response_check_test.rb
|
169
171
|
- test/resources/runner.rb
|
@@ -171,7 +173,7 @@ files:
|
|
171
173
|
- test/sso_check_test.rb
|
172
174
|
- test/sso_test.rb
|
173
175
|
has_rdoc: true
|
174
|
-
homepage: http://heroku.com
|
176
|
+
homepage: http://provider.heroku.com/resources
|
175
177
|
licenses: []
|
176
178
|
|
177
179
|
post_install_message:
|
@@ -188,24 +190,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
188
190
|
version: "0"
|
189
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
192
|
requirements:
|
191
|
-
- - "
|
193
|
+
- - ">"
|
192
194
|
- !ruby/object:Gem::Version
|
193
195
|
segments:
|
194
|
-
-
|
195
|
-
|
196
|
+
- 1
|
197
|
+
- 3
|
198
|
+
- 1
|
199
|
+
version: 1.3.1
|
196
200
|
requirements: []
|
197
201
|
|
198
202
|
rubyforge_project:
|
199
203
|
rubygems_version: 1.3.6
|
200
204
|
signing_key:
|
201
205
|
specification_version: 3
|
202
|
-
summary:
|
206
|
+
summary: Tool to help Heroku add-on providers integrating their services
|
203
207
|
test_files:
|
204
208
|
- test/all_check_test.rb
|
205
|
-
- test/
|
209
|
+
- test/deprovision_check_test.rb
|
206
210
|
- test/helper.rb
|
207
211
|
- test/manifest_check_test.rb
|
208
212
|
- test/manifest_test.rb
|
213
|
+
- test/plan_change_check_test.rb
|
209
214
|
- test/provision_check_test.rb
|
210
215
|
- test/provision_response_check_test.rb
|
211
216
|
- test/resources/runner.rb
|