kensa 1.4.0 → 1.4.1
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/.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
|