bubble-wrap 0.4.0 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -0
- data/GEM.md +104 -0
- data/HACKING.md +101 -0
- data/README.md +32 -4
- data/Rakefile +8 -9
- data/bubble-wrap.gemspec +2 -1
- data/lib/bubble-wrap/core.rb +1 -1
- data/lib/bubble-wrap/ext.rb +2 -2
- data/lib/bubble-wrap/ext/motion_project_app.rb +3 -3
- data/lib/bubble-wrap/ext/motion_project_config.rb +1 -0
- data/lib/bubble-wrap/http.rb +1 -1
- data/lib/bubble-wrap/loader.rb +3 -3
- data/lib/bubble-wrap/requirement.rb +1 -1
- data/lib/bubble-wrap/test.rb +8 -0
- data/lib/bubble-wrap/version.rb +1 -1
- data/lib_spec/bubble-wrap/ext/motion_project_app_spec.rb +138 -0
- data/lib_spec/bubble-wrap/requirement/path_manipulation_spec.rb +11 -12
- data/lib_spec/bubble-wrap/requirement_spec.rb +23 -22
- data/lib_spec/bubble-wrap_spec.rb +2 -1
- data/motion/core/app.rb +5 -0
- data/motion/core/device/screen.rb +2 -2
- data/motion/core/kvo.rb +91 -0
- data/motion/core/persistence.rb +7 -5
- data/motion/core/time.rb +15 -4
- data/motion/http.rb +54 -33
- data/{lib/tests → motion}/test_suite_delegate.rb +0 -0
- data/spec/core/app_spec.rb +15 -5
- data/spec/core/device/screen_spec.rb +8 -8
- data/spec/core/kvo_spec.rb +191 -0
- data/spec/core/ns_index_path_spec.rb +0 -1
- data/spec/core/persistence_spec.rb +28 -6
- data/spec/core/time_spec.rb +15 -0
- data/spec/http_spec.rb +434 -280
- metadata +95 -56
- data/spec_helper_patch.diff +0 -31
@@ -1,50 +1,49 @@
|
|
1
1
|
require File.expand_path('../../../../lib/bubble-wrap/requirement/path_manipulation', __FILE__)
|
2
2
|
|
3
3
|
describe BubbleWrap::Requirement::PathManipulation do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
o
|
4
|
+
|
5
|
+
before do
|
6
|
+
@subject = Object.new
|
7
|
+
@subject.extend BubbleWrap::Requirement::PathManipulation
|
9
8
|
end
|
10
9
|
|
11
10
|
describe '#convert_caller_to_path' do
|
12
11
|
it 'strips off from the second-to-last colon' do
|
13
|
-
subject.convert_caller_to_path("/fake/:path:91:in `fake_method'").
|
12
|
+
@subject.convert_caller_to_path("/fake/:path:91:in `fake_method'").
|
14
13
|
should == '/fake/:path'
|
15
14
|
end
|
16
15
|
|
17
16
|
it 'leaves plain old paths unmolested' do
|
18
|
-
subject.convert_caller_to_path("/fake/path").
|
17
|
+
@subject.convert_caller_to_path("/fake/path").
|
19
18
|
should == '/fake/path'
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
23
22
|
describe '#convert_to_absolute_path' do
|
24
23
|
it 'converts relative paths to absolute paths' do
|
25
|
-
subject.convert_to_absolute_path('foo')[0].should == '/'
|
24
|
+
@subject.convert_to_absolute_path('foo')[0].should == '/'
|
26
25
|
end
|
27
26
|
|
28
27
|
it "doesn't modify absolute paths" do
|
29
|
-
subject.convert_to_absolute_path('/foo').should == '/foo'
|
28
|
+
@subject.convert_to_absolute_path('/foo').should == '/foo'
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
33
32
|
describe '#strip_up_to_last_lib' do
|
34
33
|
it 'strips off from the last lib' do
|
35
|
-
subject.strip_up_to_last_lib('/fake/lib/dir/lib/foo').
|
34
|
+
@subject.strip_up_to_last_lib('/fake/lib/dir/lib/foo').
|
36
35
|
should == '/fake/lib/dir'
|
37
36
|
end
|
38
37
|
|
39
38
|
it "doesn't modify the path otherwise" do
|
40
|
-
subject.strip_up_to_last_lib('/fake/path').
|
39
|
+
@subject.strip_up_to_last_lib('/fake/path').
|
41
40
|
should == '/fake/path'
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
44
|
describe "#convert_to_relative" do
|
46
45
|
it 'strips off the root portion' do
|
47
|
-
subject.convert_to_relative('/foo/bar/baz', '/foo').
|
46
|
+
@subject.convert_to_relative('/foo/bar/baz', '/foo').
|
48
47
|
should == 'bar/baz'
|
49
48
|
end
|
50
49
|
end
|
@@ -3,68 +3,69 @@ require 'bubble-wrap'
|
|
3
3
|
|
4
4
|
describe BubbleWrap::Requirement do
|
5
5
|
|
6
|
-
|
6
|
+
before do
|
7
|
+
@subject = BubbleWrap::Requirement
|
8
|
+
end
|
7
9
|
|
8
10
|
describe '.scan' do
|
9
11
|
before do
|
10
|
-
subject.paths = {}
|
12
|
+
@subject.paths = {}
|
13
|
+
@root_path = File.expand_path('../../../', __FILE__)
|
11
14
|
end
|
12
15
|
|
13
|
-
let(:root_path) { File.expand_path('../../../', __FILE__) }
|
14
|
-
|
15
16
|
it 'asking for a not-yet-found file raises an exception' do
|
16
|
-
|
17
|
-
subject.find('foo')
|
18
|
-
end
|
17
|
+
should.raise(Exception) do
|
18
|
+
@subject.find('foo')
|
19
|
+
end
|
19
20
|
end
|
20
21
|
|
21
22
|
it 'finds the specified file' do
|
22
|
-
subject.scan(root_path, 'motion/core.rb')
|
23
|
-
subject.paths.keys.first.should == 'motion/core.rb'
|
23
|
+
@subject.scan(@root_path, 'motion/core.rb')
|
24
|
+
@subject.paths.keys.first.should == 'motion/core.rb'
|
24
25
|
end
|
25
26
|
|
26
27
|
it 'finds multiple files according to spec' do
|
27
|
-
subject.scan(root_path, 'motion/**/*.rb')
|
28
|
-
subject.files.size.should > 1
|
28
|
+
@subject.scan(@root_path, 'motion/**/*.rb')
|
29
|
+
@subject.files.size.should > 1
|
29
30
|
end
|
30
31
|
|
31
32
|
it 'never depends on itself' do
|
32
|
-
subject.scan(root_path, 'motion/core.rb') do
|
33
|
+
@subject.scan(@root_path, 'motion/core.rb') do
|
33
34
|
file('motion/core.rb').depends_on 'motion/core.rb'
|
34
35
|
end
|
35
|
-
subject.file('motion/core.rb').file_dependencies.should == []
|
36
|
+
@subject.file('motion/core.rb').file_dependencies.should == []
|
36
37
|
end
|
37
38
|
|
38
39
|
it 'can depend on another file' do
|
39
|
-
subject.scan(root_path, 'motion/*.rb') do
|
40
|
+
@subject.scan(@root_path, 'motion/*.rb') do
|
40
41
|
file('motion/http.rb').depends_on('motion/core.rb')
|
41
42
|
end
|
42
|
-
subject.file('motion/http.rb').file_dependencies.should
|
43
|
+
@subject.file('motion/http.rb').file_dependencies.size.should == 1
|
43
44
|
end
|
44
45
|
|
45
46
|
it 'can use a framework' do
|
46
|
-
subject.scan(root_path, 'motion/core.rb') do
|
47
|
+
@subject.scan(@root_path, 'motion/core.rb') do
|
47
48
|
file('motion/core.rb').uses_framework('FakeFramework')
|
48
49
|
end
|
49
|
-
subject.file('motion/core.rb').frameworks.
|
50
|
+
@subject.file('motion/core.rb').frameworks.member?('FakeFramework').should == true
|
50
51
|
end
|
51
52
|
|
52
53
|
it "figures out the root of the project" do
|
53
|
-
subject.scan(File.join(root_path, 'lib/bubble-wrap.rb'), 'motion/core.rb')
|
54
|
-
subject.paths.values.first.root.should == root_path
|
54
|
+
@subject.scan(File.join(@root_path, 'lib/bubble-wrap.rb'), 'motion/core.rb')
|
55
|
+
@subject.paths.values.first.root.should == @root_path
|
55
56
|
end
|
56
57
|
|
57
58
|
describe '.frameworks' do
|
58
59
|
it 'includes UIKit by default' do
|
59
|
-
subject.frameworks.
|
60
|
+
@subject.frameworks.member?('UIKit').should == true
|
60
61
|
end
|
61
62
|
|
62
63
|
it 'includes Foundation by default' do
|
63
|
-
subject.frameworks.
|
64
|
+
@subject.frameworks.member?('Foundation').should == true
|
64
65
|
end
|
65
66
|
|
66
67
|
it 'includes CoreGraphics by default' do
|
67
|
-
subject.frameworks.
|
68
|
+
@subject.frameworks.member?('CoreGraphics').should == true
|
68
69
|
end
|
69
70
|
end
|
70
71
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'mocha-on-bacon'
|
1
2
|
require File.expand_path('../motion_stub.rb', __FILE__)
|
2
3
|
require 'bubble-wrap'
|
3
4
|
|
@@ -10,7 +11,7 @@ describe BubbleWrap do
|
|
10
11
|
|
11
12
|
describe '.require' do
|
12
13
|
it 'delegates to Requirement.scan' do
|
13
|
-
BW::Requirement.
|
14
|
+
BW::Requirement.expects(:scan)
|
14
15
|
BW.require('foo')
|
15
16
|
end
|
16
17
|
end
|
data/motion/core/app.rb
CHANGED
@@ -67,6 +67,11 @@ module BubbleWrap
|
|
67
67
|
UIScreen.mainScreen.applicationFrame
|
68
68
|
end
|
69
69
|
|
70
|
+
# Main Screen bounds. Useful when starting the app
|
71
|
+
def bounds
|
72
|
+
UIScreen.mainScreen.bounds
|
73
|
+
end
|
74
|
+
|
70
75
|
# Application Delegate
|
71
76
|
def delegate
|
72
77
|
UIApplication.sharedApplication.delegate
|
@@ -52,7 +52,7 @@ module BubbleWrap
|
|
52
52
|
# The same as `.width` and `.height` but
|
53
53
|
# compensating for screen rotation (which
|
54
54
|
# can do your head in).
|
55
|
-
def
|
55
|
+
def width_for_orientation(o=orientation)
|
56
56
|
return height if (o == :landscape_left) || (o == :landscape_right)
|
57
57
|
width
|
58
58
|
end
|
@@ -60,7 +60,7 @@ module BubbleWrap
|
|
60
60
|
# The same as `.width` and `.height` but
|
61
61
|
# compensating for screen rotation (which
|
62
62
|
# can do your head in).
|
63
|
-
def
|
63
|
+
def height_for_orientation(o=orientation)
|
64
64
|
return width if (o == :landscape_left) || (o == :landscape_right)
|
65
65
|
height
|
66
66
|
end
|
data/motion/core/kvo.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# Usage example:
|
2
|
+
#
|
3
|
+
# class ExampleViewController < UIViewController
|
4
|
+
# include BW::KVO
|
5
|
+
#
|
6
|
+
# def viewDidLoad
|
7
|
+
# @label = create_ui_label()
|
8
|
+
#
|
9
|
+
# observe(@label, "text") do |old_value, new_value|
|
10
|
+
# puts "Changed #{old_value} to #{new_value}"
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# @see https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177i
|
17
|
+
module BubbleWrap
|
18
|
+
module KVO
|
19
|
+
COLLECTION_OPERATIONS = [ NSKeyValueChangeInsertion, NSKeyValueChangeRemoval, NSKeyValueChangeReplacement ]
|
20
|
+
DEFAULT_OPTIONS = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
|
21
|
+
|
22
|
+
def observe(target, key_path, &block)
|
23
|
+
target.addObserver(self, forKeyPath:key_path, options:DEFAULT_OPTIONS, context:nil) unless registered?(target, key_path)
|
24
|
+
add_observer_block(target, key_path, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def unobserve(target, key_path)
|
28
|
+
return unless registered?(target, key_path)
|
29
|
+
|
30
|
+
target.removeObserver(self, forKeyPath:key_path)
|
31
|
+
remove_observer_block(target, key_path)
|
32
|
+
end
|
33
|
+
|
34
|
+
def unobserve_all
|
35
|
+
return if @targets.nil?
|
36
|
+
|
37
|
+
@targets.each do |target, key_paths|
|
38
|
+
key_paths.each_key do |key_path|
|
39
|
+
target.removeObserver(self, forKeyPath:key_path)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
remove_all_observer_blocks
|
43
|
+
end
|
44
|
+
|
45
|
+
# Observer blocks
|
46
|
+
|
47
|
+
private
|
48
|
+
def registered?(target, key_path)
|
49
|
+
!@targets.nil? && !@targets[target].nil? && @targets[target].has_key?(key_path)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_observer_block(target, key_path, &block)
|
53
|
+
return if target.nil? || key_path.nil? || block.nil?
|
54
|
+
|
55
|
+
@targets ||= {}
|
56
|
+
@targets[target] ||= {}
|
57
|
+
@targets[target][key_path] ||= []
|
58
|
+
@targets[target][key_path] << block
|
59
|
+
end
|
60
|
+
|
61
|
+
def remove_observer_block(target, key_path)
|
62
|
+
return if @targets.nil? || target.nil? || key_path.nil?
|
63
|
+
|
64
|
+
key_paths = @targets[target]
|
65
|
+
if !key_paths.nil? && key_paths.has_key?(key_path)
|
66
|
+
key_paths.delete(key_path)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def remove_all_observer_blocks
|
71
|
+
@targets.clear unless @targets.nil?
|
72
|
+
end
|
73
|
+
|
74
|
+
# NSKeyValueObserving Protocol
|
75
|
+
|
76
|
+
def observeValueForKeyPath(key_path, ofObject:target, change:change, context:context)
|
77
|
+
key_paths = @targets[target] || {}
|
78
|
+
blocks = key_paths[key_path] || []
|
79
|
+
blocks.each do |block|
|
80
|
+
args = [ change[NSKeyValueChangeOldKey], change[NSKeyValueChangeNewKey] ]
|
81
|
+
args << change[NSKeyValueChangeIndexesKey] if collection?(change)
|
82
|
+
block.call(*args)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def collection?(change)
|
87
|
+
COLLECTION_OPERATIONS.include?(change[NSKeyValueChangeKindKey])
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
data/motion/core/persistence.rb
CHANGED
@@ -8,14 +8,16 @@ module BubbleWrap
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def []=(key, value)
|
11
|
-
|
12
|
-
|
13
|
-
defaults.synchronize
|
11
|
+
storage.setObject(value, forKey: storage_key(key.to_s))
|
12
|
+
storage.synchronize
|
14
13
|
end
|
15
14
|
|
16
15
|
def [](key)
|
17
|
-
|
18
|
-
|
16
|
+
storage.objectForKey storage_key(key.to_s)
|
17
|
+
end
|
18
|
+
|
19
|
+
def storage
|
20
|
+
NSUserDefaults.standardUserDefaults
|
19
21
|
end
|
20
22
|
|
21
23
|
def storage_key(key)
|
data/motion/core/time.rb
CHANGED
@@ -1,8 +1,19 @@
|
|
1
1
|
class Time
|
2
|
+
|
2
3
|
def self.iso8601(time)
|
3
|
-
|
4
|
-
|
5
|
-
formatter.timeZone = NSTimeZone.timeZoneWithAbbreviation "UTC"
|
6
|
-
formatter.dateFromString time
|
4
|
+
cached_date_formatter("yyyy-MM-dd'T'HH:mm:ss'Z'").
|
5
|
+
dateFromString(time)
|
7
6
|
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def self.cached_date_formatter(dateFormat)
|
11
|
+
Thread.current[:date_formatters] ||= {}
|
12
|
+
Thread.current[:date_formatters][dateFormat] ||=
|
13
|
+
NSDateFormatter.alloc.init.tap do |formatter|
|
14
|
+
formatter.dateFormat = dateFormat
|
15
|
+
formatter.timeZone = NSTimeZone.timeZoneWithAbbreviation "UTC"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
8
19
|
end
|
data/motion/http.rb
CHANGED
@@ -21,38 +21,38 @@ module BubbleWrap
|
|
21
21
|
# end
|
22
22
|
#
|
23
23
|
def self.get(url, options={}, &block)
|
24
|
-
|
25
|
-
HTTP::Query.new( url, :get, options.merge({:action => delegator}) )
|
24
|
+
create_query url, :get, options, block
|
26
25
|
end
|
27
26
|
|
28
27
|
# Make a POST request
|
29
28
|
def self.post(url, options={}, &block)
|
30
|
-
|
31
|
-
HTTP::Query.new( url, :post, options.merge({:action => delegator}) )
|
29
|
+
create_query url, :post, options, block
|
32
30
|
end
|
33
31
|
|
34
32
|
# Make a PUT request
|
35
33
|
def self.put(url, options={}, &block)
|
36
|
-
|
37
|
-
HTTP::Query.new( url, :put, options.merge({:action => delegator}) )
|
34
|
+
create_query url, :put, options, block
|
38
35
|
end
|
39
36
|
|
40
37
|
# Make a DELETE request
|
41
38
|
def self.delete(url, options={}, &block)
|
42
|
-
|
43
|
-
HTTP::Query.new( url, :delete, options.merge({:action => delegator}) )
|
39
|
+
create_query url, :delete, options, block
|
44
40
|
end
|
45
41
|
|
46
42
|
# Make a HEAD request
|
47
43
|
def self.head(url, options={}, &block)
|
48
|
-
|
49
|
-
HTTP::Query.new( url, :head, options.merge({:action => delegator}) )
|
44
|
+
create_query url, :head, options, block
|
50
45
|
end
|
51
46
|
|
52
47
|
# Make a PATCH request
|
53
48
|
def self.patch(url, options={}, &block)
|
54
|
-
|
55
|
-
|
49
|
+
create_query url, :patch, options, block
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def self.create_query(url, method, options, passed_block)
|
54
|
+
options[:action] = passed_block if passed_block
|
55
|
+
HTTP::Query.new( url, method, options )
|
56
56
|
end
|
57
57
|
|
58
58
|
# Response class wrapping the results of a Query's response
|
@@ -113,12 +113,8 @@ module BubbleWrap
|
|
113
113
|
@credentials = options.delete(:credentials) || {}
|
114
114
|
@credentials = {:username => '', :password => ''}.merge(@credentials)
|
115
115
|
@timeout = options.delete(:timeout) || 30.0
|
116
|
-
headers = options.delete
|
117
|
-
|
118
|
-
@headers = {}
|
119
|
-
headers.each{|k,v| @headers[k] = v.gsub("\n", '\\n') } # escaping LFs
|
120
|
-
end
|
121
|
-
@cachePolicy = options.delete(:cache_policy) || NSURLRequestUseProtocolCachePolicy
|
116
|
+
@headers = escape_line_feeds(options.delete :headers)
|
117
|
+
@cache_policy = options.delete(:cache_policy) || NSURLRequestUseProtocolCachePolicy
|
122
118
|
@options = options
|
123
119
|
@response = HTTP::Response.new
|
124
120
|
initiate_request(url)
|
@@ -127,16 +123,22 @@ module BubbleWrap
|
|
127
123
|
connection
|
128
124
|
end
|
129
125
|
|
130
|
-
def
|
126
|
+
def generate_params(payload, prefix=nil)
|
131
127
|
list = []
|
132
128
|
payload.each do |k,v|
|
133
129
|
if v.is_a?(Hash)
|
134
130
|
new_prefix = prefix ? "#{prefix}[#{k.to_s}]" : k.to_s
|
135
|
-
param =
|
131
|
+
param = generate_params(v, new_prefix)
|
132
|
+
list << param
|
133
|
+
elsif v.is_a?(Array)
|
134
|
+
v.each do |val|
|
135
|
+
param = prefix ? "#{prefix}[#{k}][]=#{val}" : "#{k}[]=#{val}"
|
136
|
+
list << param
|
137
|
+
end
|
136
138
|
else
|
137
139
|
param = prefix ? "#{prefix}[#{k}]=#{v}" : "#{k}=#{v}"
|
140
|
+
list << param
|
138
141
|
end
|
139
|
-
list << param
|
140
142
|
end
|
141
143
|
return list.flatten
|
142
144
|
end
|
@@ -147,16 +149,16 @@ module BubbleWrap
|
|
147
149
|
|
148
150
|
unless @payload.nil?
|
149
151
|
if @payload.is_a?(Hash)
|
150
|
-
params =
|
152
|
+
params = generate_params(@payload)
|
151
153
|
@payload = params.join("&")
|
152
154
|
end
|
153
155
|
url_string = "#{url_string}?#{@payload}" if @method == "GET"
|
154
156
|
end
|
155
|
-
|
156
|
-
|
157
|
+
#this method needs a refactor when the specs are done. (especially this utf8 escaping part)
|
158
|
+
log "BubbleWrap::HTTP building a NSRequest for #{url_string}"
|
157
159
|
@url = NSURL.URLWithString(url_string.stringByAddingPercentEscapesUsingEncoding NSUTF8StringEncoding)
|
158
160
|
@request = NSMutableURLRequest.requestWithURL(@url,
|
159
|
-
cachePolicy:@
|
161
|
+
cachePolicy:@cache_policy,
|
160
162
|
timeoutInterval:@timeout)
|
161
163
|
@request.setHTTPMethod @method
|
162
164
|
@request.setAllHTTPHeaderFields(@headers) if @headers
|
@@ -168,11 +170,8 @@ module BubbleWrap
|
|
168
170
|
end
|
169
171
|
|
170
172
|
# NSHTTPCookieStorage.sharedHTTPCookieStorage
|
171
|
-
|
172
173
|
@connection = create_connection(request, self)
|
173
|
-
|
174
|
-
def @request.done_loading; @done_loading; end
|
175
|
-
def @request.done_loading!; @done_loading = true; end
|
174
|
+
patch_nsurl_request
|
176
175
|
end
|
177
176
|
|
178
177
|
def connection(connection, didReceiveResponse:response)
|
@@ -188,7 +187,7 @@ module BubbleWrap
|
|
188
187
|
end
|
189
188
|
|
190
189
|
def connection(connection, willSendRequest:request, redirectResponse:redirect_response)
|
191
|
-
|
190
|
+
log "HTTP redirected #{request.description}"
|
192
191
|
new_request = request.mutableCopy
|
193
192
|
# new_request.setValue(@credentials.inspect, forHTTPHeaderField:'Authorization') # disabled while we figure this one out
|
194
193
|
new_request.setAllHTTPHeaderFields(@headers) if @headers
|
@@ -200,7 +199,7 @@ module BubbleWrap
|
|
200
199
|
def connection(connection, didFailWithError: error)
|
201
200
|
UIApplication.sharedApplication.networkActivityIndicatorVisible = false
|
202
201
|
@request.done_loading!
|
203
|
-
|
202
|
+
log "HTTP Connection failed #{error.localizedDescription}"
|
204
203
|
@response.error_message = error.localizedDescription
|
205
204
|
call_delegator_with_response
|
206
205
|
end
|
@@ -225,15 +224,37 @@ module BubbleWrap
|
|
225
224
|
# NSURLCredentialPersistenceNone,
|
226
225
|
# NSURLCredentialPersistenceForSession,
|
227
226
|
# NSURLCredentialPersistencePermanent
|
228
|
-
|
227
|
+
log "auth challenged, answered with credentials: #{credentials.inspect}"
|
229
228
|
new_credential = NSURLCredential.credentialWithUser(credentials[:username], password:credentials[:password], persistence:NSURLCredentialPersistenceForSession)
|
230
229
|
challenge.sender.useCredential(new_credential, forAuthenticationChallenge:challenge)
|
231
230
|
else
|
232
231
|
challenge.sender.cancelAuthenticationChallenge(challenge)
|
233
|
-
|
232
|
+
log 'Auth Failed :('
|
234
233
|
end
|
235
234
|
end
|
236
235
|
|
236
|
+
|
237
|
+
private
|
238
|
+
|
239
|
+
def log(message)
|
240
|
+
NSLog message if SETTINGS[:debug]
|
241
|
+
end
|
242
|
+
|
243
|
+
def escape_line_feeds(hash)
|
244
|
+
return nil if hash.nil?
|
245
|
+
escaped_hash = {}
|
246
|
+
|
247
|
+
hash.each{|k,v| escaped_hash[k] = v.gsub("\n", '\\n') }
|
248
|
+
escaped_hash
|
249
|
+
end
|
250
|
+
|
251
|
+
def patch_nsurl_request
|
252
|
+
@request.instance_variable_set("@done_loading", false)
|
253
|
+
|
254
|
+
def @request.done_loading; @done_loading; end
|
255
|
+
def @request.done_loading!; @done_loading = true; end
|
256
|
+
end
|
257
|
+
|
237
258
|
def call_delegator_with_response
|
238
259
|
if @delegator.respond_to?(:call)
|
239
260
|
@delegator.call( @response, self )
|