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 CHANGED
@@ -1,6 +1,7 @@
1
1
  rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
+ - 1.9.3
4
5
  notifications:
5
6
  email:
6
7
  - csquared@heroku.com
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kensa (1.3.0)
4
+ kensa (1.4.1)
5
5
  launchy (>= 0.3.2)
6
6
  mechanize (~> 1.0.0)
7
7
  rest-client (>= 1.4.0, < 1.7.0)
data/lib/heroku/kensa.rb CHANGED
@@ -7,3 +7,4 @@ require 'heroku/kensa/post_proxy'
7
7
  require 'heroku/kensa/screen'
8
8
  require 'heroku/kensa/git'
9
9
  require 'heroku/kensa/okjson'
10
+ require 'heroku/kensa/okjson-support'
@@ -301,6 +301,8 @@ module Heroku
301
301
  response = OkJson.decode(json)
302
302
  rescue OkJson::Error => boom
303
303
  error boom.message
304
+ rescue NoMethodError => boom
305
+ error "error parsing JSON"
304
306
  end
305
307
  true
306
308
  end
@@ -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
@@ -1,4 +1,6 @@
1
- # Copyright 2011 Keith Rarick
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
- w += ucharenc(a, w, uchar)
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 true
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
- if u < 0x10000
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
@@ -1,5 +1,5 @@
1
1
  module Heroku
2
2
  module Kensa
3
- VERSION = '1.4.0'
3
+ VERSION = '1.4.1'
4
4
  end
5
5
  end
@@ -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
@@ -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.merge(:id => 1)
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: 7
4
+ hash: 5
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 4
9
- - 0
10
- version: 1.4.0
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-01-27 00:00:00 -08:00
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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
- - !ruby/object:Gem::Dependency
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