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 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