kensa 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -0
- data/Gemfile.lock +1 -1
- data/lib/heroku/kensa.rb +1 -0
- data/lib/heroku/kensa/check.rb +2 -0
- data/lib/heroku/kensa/client.rb +1 -1
- data/lib/heroku/kensa/okjson-support.rb +24 -0
- data/lib/heroku/kensa/okjson.rb +40 -40
- data/lib/heroku/kensa/version.rb +1 -1
- data/test/provision_check_test.rb +6 -0
- data/test/resources/server.rb +5 -1
- data/test/sso_test.rb +17 -2
- metadata +41 -40
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/lib/heroku/kensa.rb
CHANGED
data/lib/heroku/kensa/check.rb
CHANGED
data/lib/heroku/kensa/client.rb
CHANGED
@@ -78,7 +78,7 @@ module Heroku
|
|
78
78
|
def sso
|
79
79
|
id = @args.shift || abort("! no id specified; see usage")
|
80
80
|
data = decoded_manifest
|
81
|
-
sso = Sso.new(data.merge(@options)).start
|
81
|
+
sso = Sso.new(data.merge(@options).merge(:id => id)).start
|
82
82
|
puts sso.message
|
83
83
|
Launchy.open sso.sso_url
|
84
84
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Hash
|
2
|
+
def stringify_keys
|
3
|
+
new_hash = {}
|
4
|
+
each do |key, value|
|
5
|
+
case value
|
6
|
+
when Hash
|
7
|
+
value = value.stringify_keys
|
8
|
+
when Array
|
9
|
+
value = value.map { |v| v.stringify_keys if v.is_a? Hash }
|
10
|
+
end
|
11
|
+
|
12
|
+
new_hash[key.to_s] = value
|
13
|
+
end
|
14
|
+
new_hash
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module OkJson
|
19
|
+
alias encode_without_stringify encode
|
20
|
+
|
21
|
+
def encode(x)
|
22
|
+
encode_without_stringify(x.stringify_keys)
|
23
|
+
end
|
24
|
+
end
|
data/lib/heroku/kensa/okjson.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright 2011, 2012 Keith Rarick
|
2
4
|
#
|
3
5
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
6
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -260,6 +262,12 @@ module OkJson
|
|
260
262
|
def unquote(q)
|
261
263
|
q = q[1...-1]
|
262
264
|
a = q.dup # allocate a big enough string
|
265
|
+
rubydoesenc = false
|
266
|
+
# In ruby >= 1.9, a[w] is a codepoint, not a byte.
|
267
|
+
if a.class.method_defined?(:force_encoding)
|
268
|
+
a.force_encoding('UTF-8')
|
269
|
+
rubydoesenc = true
|
270
|
+
end
|
263
271
|
r, w = 0, 0
|
264
272
|
while r < q.length
|
265
273
|
c = q[r]
|
@@ -297,7 +305,12 @@ module OkJson
|
|
297
305
|
end
|
298
306
|
end
|
299
307
|
end
|
300
|
-
|
308
|
+
if rubydoesenc
|
309
|
+
a[w] = '' << uchar
|
310
|
+
w += 1
|
311
|
+
else
|
312
|
+
w += ucharenc(a, w, uchar)
|
313
|
+
end
|
301
314
|
else
|
302
315
|
raise Error, "invalid escape char #{q[r]} in \"#{q}\""
|
303
316
|
end
|
@@ -307,6 +320,8 @@ module OkJson
|
|
307
320
|
# Copy anything else byte-for-byte.
|
308
321
|
# Valid UTF-8 will remain valid UTF-8.
|
309
322
|
# Invalid UTF-8 will remain invalid UTF-8.
|
323
|
+
# In ruby >= 1.9, c is a codepoint, not a byte,
|
324
|
+
# in which case this is still what we want.
|
310
325
|
a[w] = c
|
311
326
|
r += 1
|
312
327
|
w += 1
|
@@ -441,6 +456,10 @@ module OkJson
|
|
441
456
|
t = StringIO.new
|
442
457
|
t.putc(?")
|
443
458
|
r = 0
|
459
|
+
|
460
|
+
# In ruby >= 1.9, s[r] is a codepoint, not a byte.
|
461
|
+
rubydoesenc = s.class.method_defined?(:encoding)
|
462
|
+
|
444
463
|
while r < s.length
|
445
464
|
case s[r]
|
446
465
|
when ?" then t.print('\\"')
|
@@ -455,21 +474,13 @@ module OkJson
|
|
455
474
|
case true
|
456
475
|
when Spc <= c && c <= ?~
|
457
476
|
t.putc(c)
|
458
|
-
when
|
477
|
+
when rubydoesenc
|
478
|
+
u = c.ord
|
479
|
+
surrenc(t, u)
|
480
|
+
else
|
459
481
|
u, size = uchardec(s, r)
|
460
482
|
r += size - 1 # we add one more at the bottom of the loop
|
461
|
-
|
462
|
-
t.print('\\u')
|
463
|
-
hexenc4(t, u)
|
464
|
-
else
|
465
|
-
u1, u2 = unsubst(u)
|
466
|
-
t.print('\\u')
|
467
|
-
hexenc4(t, u1)
|
468
|
-
t.print('\\u')
|
469
|
-
hexenc4(t, u2)
|
470
|
-
end
|
471
|
-
else
|
472
|
-
# invalid byte; skip it
|
483
|
+
surrenc(t, u)
|
473
484
|
end
|
474
485
|
end
|
475
486
|
r += 1
|
@@ -479,6 +490,20 @@ module OkJson
|
|
479
490
|
end
|
480
491
|
|
481
492
|
|
493
|
+
def surrenc(t, u)
|
494
|
+
if u < 0x10000
|
495
|
+
t.print('\\u')
|
496
|
+
hexenc4(t, u)
|
497
|
+
else
|
498
|
+
u1, u2 = unsubst(u)
|
499
|
+
t.print('\\u')
|
500
|
+
hexenc4(t, u1)
|
501
|
+
t.print('\\u')
|
502
|
+
hexenc4(t, u2)
|
503
|
+
end
|
504
|
+
end
|
505
|
+
|
506
|
+
|
482
507
|
def hexenc4(t, u)
|
483
508
|
t.putc(Hex[(u>>12)&0xf])
|
484
509
|
t.putc(Hex[(u>>8)&0xf])
|
@@ -579,28 +604,3 @@ module OkJson
|
|
579
604
|
Unesc = {?b=>?\b, ?f=>?\f, ?n=>?\n, ?r=>?\r, ?t=>?\t}
|
580
605
|
Hex = '0123456789abcdef'
|
581
606
|
end
|
582
|
-
|
583
|
-
class Hash
|
584
|
-
def stringify_keys
|
585
|
-
new_hash = {}
|
586
|
-
each do |key, value|
|
587
|
-
case value
|
588
|
-
when Hash
|
589
|
-
value = value.stringify_keys
|
590
|
-
when Array
|
591
|
-
value = value.map { |v| v.stringify_keys if v.is_a? Hash }
|
592
|
-
end
|
593
|
-
|
594
|
-
new_hash[key.to_s] = value
|
595
|
-
end
|
596
|
-
new_hash
|
597
|
-
end
|
598
|
-
end
|
599
|
-
|
600
|
-
module OkJson
|
601
|
-
alias encode_without_stringify encode
|
602
|
-
|
603
|
-
def encode(x)
|
604
|
-
encode_without_stringify(x.stringify_keys)
|
605
|
-
end
|
606
|
-
end
|
data/lib/heroku/kensa/version.rb
CHANGED
@@ -29,6 +29,12 @@ class ProvisionCheckTest < Test::Unit::TestCase
|
|
29
29
|
assert_valid
|
30
30
|
end
|
31
31
|
|
32
|
+
# OkJson doesn't handle short strings correctly
|
33
|
+
test "doesn't choke on foo" do
|
34
|
+
use_provider_endpoint "foo"
|
35
|
+
assert_invalid
|
36
|
+
end
|
37
|
+
|
32
38
|
test "detects invalid JSON" do
|
33
39
|
use_provider_endpoint "invalid-json"
|
34
40
|
assert_invalid
|
data/test/resources/server.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'sinatra/base'
|
3
|
-
require File.expand_path('../../../lib/heroku/kensa/okjson', __FILE__)
|
4
3
|
|
5
4
|
class Hash
|
6
5
|
def to_json
|
@@ -68,6 +67,11 @@ post '/cmd-line-options/heroku/resources' do
|
|
68
67
|
{ :id => 123 }.to_json
|
69
68
|
end
|
70
69
|
|
70
|
+
post '/foo/heroku/resources' do
|
71
|
+
heroku_only!
|
72
|
+
'foo'
|
73
|
+
end
|
74
|
+
|
71
75
|
post '/invalid-json/heroku/resources' do
|
72
76
|
heroku_only!
|
73
77
|
'invalidjson'
|
data/test/sso_test.rb
CHANGED
@@ -91,14 +91,29 @@ class SsoTest < Test::Unit::TestCase
|
|
91
91
|
end
|
92
92
|
|
93
93
|
context "via POST" do
|
94
|
+
include FsMock
|
94
95
|
setup do
|
95
96
|
Timecop.freeze Time.utc(2010, 1)
|
96
|
-
@data = Manifest.new(:method => :post).skeleton
|
97
|
+
@data = Manifest.new(:method => :post).skeleton
|
97
98
|
@data['api']['sso_salt'] = 'SSO_SALT'
|
98
99
|
end
|
99
100
|
|
101
|
+
test "command line" do
|
102
|
+
any_instance_of(Client) { |c| stub(c).puts }
|
103
|
+
stub(Launchy).open
|
104
|
+
start = Object.new
|
105
|
+
stub(start).message
|
106
|
+
stub(start).sso_url
|
107
|
+
stub(Sso).new.stub!.start.returns(start)
|
108
|
+
|
109
|
+
kensa "init"
|
110
|
+
kensa "sso 1234"
|
111
|
+
|
112
|
+
assert_received(Sso) { |sso| sso.new(hash_including(:id => '1234')) }
|
113
|
+
end
|
114
|
+
|
100
115
|
test "it starts the proxy server" do
|
101
|
-
@sso = Sso.new(@data).start
|
116
|
+
@sso = Sso.new(@data.merge(:id => 1)).start
|
102
117
|
body = RestClient.get(@sso.sso_url)
|
103
118
|
|
104
119
|
assert body.include? @sso.path
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kensa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 1.4.
|
9
|
+
- 1
|
10
|
+
version: 1.4.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Blake Mizerany
|
@@ -19,12 +19,10 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2012-
|
22
|
+
date: 2012-03-08 00:00:00 -08:00
|
23
23
|
default_executable: kensa
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name: contest
|
27
|
-
prerelease: false
|
28
26
|
requirement: &id001 !ruby/object:Gem::Requirement
|
29
27
|
none: false
|
30
28
|
requirements:
|
@@ -34,11 +32,11 @@ dependencies:
|
|
34
32
|
segments:
|
35
33
|
- 0
|
36
34
|
version: "0"
|
37
|
-
type: :development
|
38
35
|
version_requirements: *id001
|
39
|
-
|
40
|
-
name: timecop
|
36
|
+
name: contest
|
41
37
|
prerelease: false
|
38
|
+
type: :development
|
39
|
+
- !ruby/object:Gem::Dependency
|
42
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
43
41
|
none: false
|
44
42
|
requirements:
|
@@ -50,11 +48,11 @@ dependencies:
|
|
50
48
|
- 3
|
51
49
|
- 5
|
52
50
|
version: 0.3.5
|
53
|
-
type: :development
|
54
51
|
version_requirements: *id002
|
55
|
-
|
56
|
-
name: sinatra
|
52
|
+
name: timecop
|
57
53
|
prerelease: false
|
54
|
+
type: :development
|
55
|
+
- !ruby/object:Gem::Dependency
|
58
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
59
57
|
none: false
|
60
58
|
requirements:
|
@@ -65,11 +63,11 @@ dependencies:
|
|
65
63
|
- 0
|
66
64
|
- 9
|
67
65
|
version: "0.9"
|
68
|
-
type: :development
|
69
66
|
version_requirements: *id003
|
70
|
-
|
71
|
-
name: contest
|
67
|
+
name: sinatra
|
72
68
|
prerelease: false
|
69
|
+
type: :development
|
70
|
+
- !ruby/object:Gem::Dependency
|
73
71
|
requirement: &id004 !ruby/object:Gem::Requirement
|
74
72
|
none: false
|
75
73
|
requirements:
|
@@ -79,11 +77,11 @@ dependencies:
|
|
79
77
|
segments:
|
80
78
|
- 0
|
81
79
|
version: "0"
|
82
|
-
type: :development
|
83
80
|
version_requirements: *id004
|
84
|
-
|
85
|
-
name: haml
|
81
|
+
name: contest
|
86
82
|
prerelease: false
|
83
|
+
type: :development
|
84
|
+
- !ruby/object:Gem::Dependency
|
87
85
|
requirement: &id005 !ruby/object:Gem::Requirement
|
88
86
|
none: false
|
89
87
|
requirements:
|
@@ -93,11 +91,11 @@ dependencies:
|
|
93
91
|
segments:
|
94
92
|
- 0
|
95
93
|
version: "0"
|
96
|
-
type: :development
|
97
94
|
version_requirements: *id005
|
98
|
-
|
99
|
-
name: rr
|
95
|
+
name: haml
|
100
96
|
prerelease: false
|
97
|
+
type: :development
|
98
|
+
- !ruby/object:Gem::Dependency
|
101
99
|
requirement: &id006 !ruby/object:Gem::Requirement
|
102
100
|
none: false
|
103
101
|
requirements:
|
@@ -107,11 +105,11 @@ dependencies:
|
|
107
105
|
segments:
|
108
106
|
- 0
|
109
107
|
version: "0"
|
110
|
-
type: :development
|
111
108
|
version_requirements: *id006
|
112
|
-
|
113
|
-
name: fakefs
|
109
|
+
name: rr
|
114
110
|
prerelease: false
|
111
|
+
type: :development
|
112
|
+
- !ruby/object:Gem::Dependency
|
115
113
|
requirement: &id007 !ruby/object:Gem::Requirement
|
116
114
|
none: false
|
117
115
|
requirements:
|
@@ -121,11 +119,11 @@ dependencies:
|
|
121
119
|
segments:
|
122
120
|
- 0
|
123
121
|
version: "0"
|
124
|
-
type: :development
|
125
122
|
version_requirements: *id007
|
126
|
-
|
127
|
-
name: artifice
|
123
|
+
name: fakefs
|
128
124
|
prerelease: false
|
125
|
+
type: :development
|
126
|
+
- !ruby/object:Gem::Dependency
|
129
127
|
requirement: &id008 !ruby/object:Gem::Requirement
|
130
128
|
none: false
|
131
129
|
requirements:
|
@@ -135,11 +133,11 @@ dependencies:
|
|
135
133
|
segments:
|
136
134
|
- 0
|
137
135
|
version: "0"
|
138
|
-
type: :development
|
139
136
|
version_requirements: *id008
|
140
|
-
|
141
|
-
name: rest-client
|
137
|
+
name: artifice
|
142
138
|
prerelease: false
|
139
|
+
type: :development
|
140
|
+
- !ruby/object:Gem::Dependency
|
143
141
|
requirement: &id009 !ruby/object:Gem::Requirement
|
144
142
|
none: false
|
145
143
|
requirements:
|
@@ -159,11 +157,11 @@ dependencies:
|
|
159
157
|
- 4
|
160
158
|
- 0
|
161
159
|
version: 1.4.0
|
162
|
-
type: :runtime
|
163
160
|
version_requirements: *id009
|
164
|
-
|
165
|
-
name: term-ansicolor
|
161
|
+
name: rest-client
|
166
162
|
prerelease: false
|
163
|
+
type: :runtime
|
164
|
+
- !ruby/object:Gem::Dependency
|
167
165
|
requirement: &id010 !ruby/object:Gem::Requirement
|
168
166
|
none: false
|
169
167
|
requirements:
|
@@ -174,11 +172,11 @@ dependencies:
|
|
174
172
|
- 1
|
175
173
|
- 0
|
176
174
|
version: "1.0"
|
177
|
-
type: :runtime
|
178
175
|
version_requirements: *id010
|
179
|
-
|
180
|
-
name: launchy
|
176
|
+
name: term-ansicolor
|
181
177
|
prerelease: false
|
178
|
+
type: :runtime
|
179
|
+
- !ruby/object:Gem::Dependency
|
182
180
|
requirement: &id011 !ruby/object:Gem::Requirement
|
183
181
|
none: false
|
184
182
|
requirements:
|
@@ -190,11 +188,11 @@ dependencies:
|
|
190
188
|
- 3
|
191
189
|
- 2
|
192
190
|
version: 0.3.2
|
193
|
-
type: :runtime
|
194
191
|
version_requirements: *id011
|
195
|
-
|
196
|
-
name: mechanize
|
192
|
+
name: launchy
|
197
193
|
prerelease: false
|
194
|
+
type: :runtime
|
195
|
+
- !ruby/object:Gem::Dependency
|
198
196
|
requirement: &id012 !ruby/object:Gem::Requirement
|
199
197
|
none: false
|
200
198
|
requirements:
|
@@ -206,8 +204,10 @@ dependencies:
|
|
206
204
|
- 0
|
207
205
|
- 0
|
208
206
|
version: 1.0.0
|
209
|
-
type: :runtime
|
210
207
|
version_requirements: *id012
|
208
|
+
name: mechanize
|
209
|
+
prerelease: false
|
210
|
+
type: :runtime
|
211
211
|
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.
|
212
212
|
email: pedro@heroku.com
|
213
213
|
executables:
|
@@ -231,6 +231,7 @@ files:
|
|
231
231
|
- lib/heroku/kensa/git.rb
|
232
232
|
- lib/heroku/kensa/http.rb
|
233
233
|
- lib/heroku/kensa/manifest.rb
|
234
|
+
- lib/heroku/kensa/okjson-support.rb
|
234
235
|
- lib/heroku/kensa/okjson.rb
|
235
236
|
- lib/heroku/kensa/post_proxy.rb
|
236
237
|
- lib/heroku/kensa/screen.rb
|