motion-resource 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  This is a library for using JSON APIs in RubyMotion apps. It is based on [RemoteModel](https://github.com/clayallsopp/remote_model), however it is an almost complete rewrite. Also, it is inspired by ActiveResource.
4
4
 
5
+ This gem needs RubyMotion version 2.3 or higher.
6
+
5
7
  ## Installation
6
8
 
7
9
  Add MotionResource to your Gemfile, like this:
@@ -43,6 +45,38 @@ Now, we can access a user's posts like that:
43
45
 
44
46
  Note that the blocks are called asynchronously.
45
47
 
48
+ ## URL encoding
49
+
50
+ A different url encoding implementation can be substituted by setting MotionResource::Base.url_encoder.
51
+ For instance to include the fixed parameter 'foo' on every request:
52
+
53
+ class CustomEncoder < MotionResource::UrlEncoder
54
+ def build_query_string(url, params = {})
55
+ params[:foo] => 42
56
+ super(url,params)
57
+ end
58
+ end
59
+ MotionResource::Base.url_encoder = CustomEncoder.new
60
+
61
+ ## Error Handling
62
+
63
+ Pass a second block parameter to capture error information:
64
+
65
+ User.find_all do |users, response|
66
+ if response.ok?
67
+ puts users.inspect
68
+ else
69
+ App.alert response.error_message
70
+ end
71
+ end
72
+
73
+ `response` will be an instance of [BubbleWrap::HTTP::Response](http://rdoc.info/github/rubymotion/BubbleWrap/master/file/README.md#HTTP)
74
+
75
+ ## Reachability
76
+
77
+ It's important to check the reachability status of a host before making a request, or you may get intermitent connectivity errors.
78
+ For an example of how to do so, see `when_reachable` in [TinyMon](https://github.com/tkadauke/TinyMon).
79
+
46
80
  ## Setup
47
81
 
48
82
  You can configure every model separately; however you will most likely want to configure things like the root_url the same for every model:
@@ -54,3 +88,4 @@ Don't forget the trailing '/' here!
54
88
  # Forking
55
89
 
56
90
  Feel free to fork and submit pull requests!
91
+
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env rake
2
2
  $:.unshift("/Library/RubyMotion/lib")
3
- require 'motion/project'
3
+ require 'motion/project/template/ios'
4
4
  require "bundler/gem_tasks"
5
5
  Bundler.setup
6
6
  Bundler.require
@@ -28,7 +28,7 @@ module MotionResource
28
28
 
29
29
  define_method name do |&block|
30
30
  if block.nil?
31
- instance_variable_get("@#{name}") || []
31
+ instance_variable_get("@#{name}") || instance_variable_set("@#{name}", [])
32
32
  else
33
33
  if cached = instance_variable_get("@#{name}")
34
34
  cached_response = instance_variable_get("@#{name}_response")
@@ -67,7 +67,12 @@ module MotionResource
67
67
  end
68
68
  end
69
69
 
70
- def belongs_to(name, params = lambda { |o| Hash.new })
70
+ def belongs_to(name, options = {})
71
+ default_options = {
72
+ :params => lambda { |o| Hash.new },
73
+ :class_name => name.to_s.classify
74
+ }
75
+ options = default_options.merge(options)
71
76
  define_method name do |&block|
72
77
  if block.nil?
73
78
  instance_variable_get("@#{name}")
@@ -77,8 +82,8 @@ module MotionResource
77
82
  MotionResource::Base.request_block_call(block, cached, cached_response)
78
83
  return
79
84
  end
80
-
81
- Object.const_get(name.to_s.classify).find(self.send("#{name}_id"), params.call(self)) do |result, response|
85
+ klass = Object.const_get(options[:class_name])
86
+ klass.find(self.send("#{name}_id"), options[:params].call(self)) do |result, response|
82
87
  instance_variable_set("@#{name}", result)
83
88
  instance_variable_set("@#{name}_response", response)
84
89
  MotionResource::Base.request_block_call(block, result, response)
@@ -87,8 +92,8 @@ module MotionResource
87
92
  end
88
93
 
89
94
  define_method "#{name}=" do |value|
90
- klass = Object.const_get(name.to_s.classify)
91
- value = klass.instantiate(value) if value.is_a?(Hash)
95
+ value = Object.const_get(options[:class_name]).instantiate(value) if value.is_a?(Hash)
96
+ instance_variable_set("@#{name}_id", value.id) if value.respond_to?(:id)
92
97
  instance_variable_set("@#{name}", value)
93
98
  end
94
99
 
@@ -18,7 +18,12 @@ module MotionResource
18
18
 
19
19
  class << self
20
20
  def instantiate(json)
21
- json = json.symbolize_keys
21
+ if json.is_a?(Hash)
22
+ json = json.symbolize_keys
23
+ else
24
+ json = { primary_key => json.to_i }
25
+ end
26
+
22
27
  raise ArgumentError, "No :#{primary_key} parameter given for #{self.name}.instantiate" unless json[primary_key]
23
28
 
24
29
  klass = if json[:type]
@@ -41,6 +46,10 @@ module MotionResource
41
46
  result
42
47
  end
43
48
 
49
+ def json_root
50
+ self.name.underscore.pluralize
51
+ end
52
+
44
53
  def identity_map
45
54
  @identity_map ||= {}
46
55
  end
@@ -1,24 +1,22 @@
1
1
  module MotionResource
2
2
  class Base
3
- def save(&block)
3
+ def save(options = {}, &block)
4
4
  run_callbacks :save do
5
- @new_record ? create(&block) : update(&block)
5
+ @new_record ? create(options, &block) : update(options, &block)
6
6
  end
7
7
  end
8
8
 
9
- def update(&block)
9
+ def update(options = {}, &block)
10
10
  run_callbacks :update do
11
- self.class.put(member_url, :payload => { self.class.name.underscore => attributes }) do |response, json|
11
+ self.class.put(member_url, :payload => build_payload(options)) do |response, json|
12
12
  self.class.request_block_call(block, json.blank? ? self : self.class.instantiate(json), response) if block
13
13
  end
14
14
  end
15
15
  end
16
16
 
17
- def create(&block)
18
- # weird heisenbug: Specs crash without that line :(
19
- dummy = self
17
+ def create(options = {}, &block)
20
18
  run_callbacks :create do
21
- self.class.post(collection_url, :payload => { self.class.name.underscore => attributes }) do |response, json|
19
+ self.class.post(collection_url, :payload => build_payload(options)) do |response, json|
22
20
  self.class.request_block_call(block, json.blank? ? self : self.class.instantiate(json), response) if block
23
21
  end
24
22
  end
@@ -43,5 +41,26 @@ module MotionResource
43
41
  self.class.request_block_call(block, json.blank? ? nil : self.class.instantiate(json), response) if block
44
42
  end
45
43
  end
44
+
45
+ protected
46
+ def build_payload(options)
47
+ includes = Array(options[:include]).inject({}) do |hash, var|
48
+ if var.to_s =~ /^(.*?)_attributes$/
49
+ association_name = $1
50
+ else
51
+ association_name = var.to_s
52
+ end
53
+
54
+ if respond_to?(association_name)
55
+ hash[var.to_s] = send(association_name).map(&:attributes)
56
+ else
57
+ raise ArgumentError, "No association #{var} found"
58
+ end
59
+
60
+ hash
61
+ end
62
+
63
+ { self.class.name.underscore => attributes.merge(includes) }
64
+ end
46
65
  end
47
66
  end
@@ -2,11 +2,11 @@ module MotionResource
2
2
  class Base
3
3
  class << self
4
4
  def find(id, params = {}, &block)
5
- fetch_member(member_url_or_default.fill_url_params(params.merge(id: id)), &block)
5
+ fetch_member(self.url_encoder.fill_url_params(member_url_or_default, params.merge(id: id)), &block)
6
6
  end
7
7
 
8
8
  def find_all(params = {}, &block)
9
- fetch_collection(collection_url_or_default.fill_url_params(params), &block)
9
+ fetch_collection(self.url_encoder.fill_url_params(collection_url_or_default, params), &block)
10
10
  end
11
11
 
12
12
  def fetch_member(url, &block)
@@ -28,9 +28,9 @@ module MotionResource
28
28
  if json.class == Array
29
29
  arr_rep = json
30
30
  elsif json.class == Hash
31
- plural = self.name.underscore.pluralize
32
- if json.has_key?(plural) || json.has_key?(plural.to_sym)
33
- arr_rep = json[plural] || json[plural.to_sym]
31
+ root = self.json_root
32
+ if json.has_key?(root) || json.has_key?(root.to_sym)
33
+ arr_rep = json[root] || json[root.to_sym]
34
34
  end
35
35
  else
36
36
  # the returned data was something else
@@ -38,9 +38,11 @@ module MotionResource
38
38
  request_block_call(block, nil, response)
39
39
  return
40
40
  end
41
- arr_rep.each { |one_obj_hash|
42
- objs << instantiate(one_obj_hash)
43
- }
41
+ if arr_rep
42
+ arr_rep.each { |one_obj_hash|
43
+ objs << instantiate(one_obj_hash)
44
+ }
45
+ end
44
46
  request_block_call(block, objs, response)
45
47
  else
46
48
  request_block_call(block, nil, response)
@@ -63,4 +65,4 @@ module MotionResource
63
65
  end
64
66
  end
65
67
  end
66
- end
68
+ end
@@ -29,7 +29,27 @@ module MotionResource
29
29
  @on_auth_failure = block
30
30
  end
31
31
 
32
- private
32
+ protected
33
+
34
+ def decode_response(response, url, options)
35
+ if response.ok?
36
+ body = response.body.to_str.strip rescue nil
37
+ logger.log "response: #{body}"
38
+ if body.blank?
39
+ return {}
40
+ else
41
+ return BubbleWrap::JSON.parse(body)
42
+ end
43
+ else
44
+ if response.status_code.to_s =~ /401/ && @on_auth_failure
45
+ @on_auth_failure.call
46
+ end
47
+ return nil
48
+ end
49
+ end
50
+
51
+ private
52
+
33
53
  def complete_url(fragment)
34
54
  if fragment[0..3] == "http"
35
55
  return fragment
@@ -43,30 +63,19 @@ module MotionResource
43
63
  options = call_options
44
64
  options.merge!(MotionResource::Base.default_url_options || {})
45
65
  if query = options.delete(:query)
46
- url.build_query_string!(query)
66
+ url = self.url_encoder.build_query_string(url, query)
47
67
  end
48
68
  if self.default_url_options
49
69
  options.merge!(self.default_url_options)
50
70
  end
51
71
 
52
- url.insert_extension!(self.extension)
72
+ url = self.url_encoder.insert_extension(url, self.extension)
53
73
 
54
74
  logger.log "#{method.upcase} #{url}"
75
+ logger.log "payload: #{options[:payload]}" if options[:payload]
55
76
 
56
77
  BubbleWrap::HTTP.send(method, url, options) do |response|
57
- if response.ok?
58
- body = response.body.to_str.strip rescue nil
59
- logger.log "response: #{body}"
60
- if body.blank?
61
- block.call(response, {})
62
- else
63
- block.call response, BubbleWrap::JSON.parse(body)
64
- end
65
- elsif response.status_code.to_s =~ /401/ && @on_auth_failure
66
- @on_auth_failure.call
67
- else
68
- block.call response, nil
69
- end
78
+ block.call response, decode_response(response, url, options)
70
79
  end
71
80
  end
72
81
  end
@@ -0,0 +1,45 @@
1
+ module MotionResource
2
+ class UrlEncoder
3
+ def fill_url_params(url, params = {}, delegate = nil)
4
+ params ||= {}
5
+ url = url.split('/').collect { |path|
6
+ ret = path
7
+ if path[0] == ':'
8
+ path_sym = path[1..-1].to_sym
9
+
10
+ curr = nil
11
+ if delegate && delegate.respond_to?(path_sym)
12
+ curr = delegate.send(path_sym)
13
+ end
14
+
15
+ ret = (curr || params.delete(path_sym) || path).to_s
16
+ end
17
+
18
+ ret
19
+ }.join '/'
20
+ self.build_query_string(url, params)
21
+ end
22
+
23
+ def build_query_string(url, params = {})
24
+ return url if params.keys.empty?
25
+ # fake a url so we avoid regex nastiness with URL's
26
+ url = NSURL.URLWithString("http://blah.com/#{url}")
27
+ # build our query string (needs encoding support!)
28
+ query_string = params.to_query
29
+ if url.query.nil? || url.query.empty?
30
+ # strip the beginning / and add the query
31
+ "#{url.path[1..-1]}?#{query_string}"
32
+ else
33
+ "#{url.path[1..-1]}?#{url.query}&#{query_string}"
34
+ end
35
+ end
36
+
37
+ def insert_extension(url,extension)
38
+ return url if extension.blank?
39
+
40
+ url = NSURL.URLWithString(url)
41
+ extension = extension.gsub(".", "")
42
+ url.URLByAppendingPathExtension(extension).absoluteString
43
+ end
44
+ end
45
+ end
@@ -3,13 +3,16 @@ module MotionResource
3
3
  class_attribute :collection_url, :member_url
4
4
  class_attribute :root_url, :default_url_options
5
5
  class_attribute :extension
6
+ class_attribute :url_encoder
7
+
6
8
  self.extension = '.json'
7
-
9
+ self.url_encoder = UrlEncoder.new
10
+
8
11
  class << self
9
12
  def custom_urls(params = {})
10
13
  params.each do |name, url_format|
11
- define_method name do |params = {}|
12
- url_format.fill_url_params(params, self)
14
+ define_method name do |method_params = {}|
15
+ self.url_encoder.fill_url_params(url_format, method_params, self)
13
16
  end
14
17
  define_singleton_method name do
15
18
  url_format
@@ -24,14 +27,15 @@ module MotionResource
24
27
  def member_url_or_default
25
28
  member_url || "#{name.underscore.pluralize}/:#{primary_key}"
26
29
  end
30
+
27
31
  end
28
32
 
29
33
  def collection_url(params = {})
30
- self.class.collection_url_or_default.fill_url_params(params, self)
34
+ self.class.url_encoder.fill_url_params(self.class.collection_url_or_default, params, self)
31
35
  end
32
36
 
33
37
  def member_url(params = {})
34
- self.class.member_url_or_default.fill_url_params(params, self)
38
+ self.class.url_encoder.fill_url_params(self.class.member_url_or_default, params, self)
35
39
  end
36
40
  end
37
41
  end
@@ -1,3 +1,3 @@
1
1
  module MotionResource
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -10,18 +10,23 @@ class Post < MotionResource::Base
10
10
  end
11
11
 
12
12
  class Comment < MotionResource::Base
13
- attr_accessor :post_id, :text
13
+ attr_accessor :post_id, :account_id, :text
14
14
 
15
15
  self.member_url = 'comments/:id'
16
16
  self.collection_url = 'comments'
17
17
 
18
18
  belongs_to :post
19
-
19
+ belongs_to :account, :class_name => 'User'
20
20
  scope :recent, :url => 'comments/recent'
21
-
22
21
  custom_urls :by_user_url => 'comments/by_user/:name'
23
22
  end
24
23
 
24
+ class CustomRootComment < Comment
25
+ def self.json_root
26
+ 'custom'
27
+ end
28
+ end
29
+
25
30
  class User < MotionResource::Base
26
31
  self.member_url = 'users/:id'
27
32
 
@@ -91,6 +91,21 @@ describe "belongs_to" do
91
91
  @response.should.be.ok
92
92
  end
93
93
  end
94
+
95
+ it "should return correct type of object" do
96
+ stub_request(:get, "http://example.com/users/1.json").to_return(json: { id: 1, text: 'Hello' })
97
+ @comment = Comment.new(:account_id => 1)
98
+ @comment.account do |results, response|
99
+ @account = results
100
+ @response = response
101
+ resume
102
+ end
103
+ wait_max 1.0 do
104
+ @response.should.be.ok
105
+ @account.class.should == User
106
+ end
107
+ end
108
+
94
109
  end
95
110
 
96
111
  describe "writer" do
@@ -99,11 +114,18 @@ describe "belongs_to" do
99
114
  comment.post = { :id => 1, :text => 'Hello' }
100
115
  comment.post.should.is_a Post
101
116
  end
117
+
118
+ it "should convert hash to proper type" do
119
+ comment = Comment.new
120
+ comment.account = { :id => 1, :text => 'Hello' }
121
+ comment.account.class.should == User
122
+ end
102
123
 
103
124
  it "should set attributes when assigned with hash" do
104
125
  comment = Comment.new
105
126
  comment.post = { :id => 1, :text => 'Hello' }
106
127
  comment.post.text.should == 'Hello'
128
+ comment.post.class.should == Post
107
129
  end
108
130
 
109
131
  it "should use identity map when assigned with hash" do
@@ -119,6 +141,18 @@ describe "belongs_to" do
119
141
  comment.post = post
120
142
  comment.post.should == post
121
143
  end
144
+
145
+ it "should set association id when assigned with hash" do
146
+ comment = Comment.new
147
+ comment.post = { :id => 10 }
148
+ comment.post_id.should == 10
149
+ end
150
+
151
+ it "should set association id when assigned with object" do
152
+ comment = Comment.new
153
+ comment.post = Post.new(:id => 10)
154
+ comment.post_id.should == 10
155
+ end
122
156
  end
123
157
 
124
158
  describe "piggybacking" do
@@ -65,5 +65,15 @@ describe "base" do
65
65
  shape1.should.be.identical_to shape2
66
66
  shape1.contents.should == 'something'
67
67
  end
68
+
69
+ it "should instantiate with ID number" do
70
+ shape = Shape.instantiate(3)
71
+ shape.id.should == 3
72
+ end
73
+
74
+ it "should instantiate with ID string" do
75
+ shape = Shape.instantiate("5")
76
+ shape.id.should == 5
77
+ end
68
78
  end
69
79
  end
@@ -65,6 +65,35 @@ describe "crud" do
65
65
  @response.should.not.be.ok
66
66
  end
67
67
  end
68
+
69
+ it "should include association" do
70
+ stub_request(:post, "http://example.com/posts.json").to_return(body: "")
71
+ Post.new.create(:include => :comments) do |result, response|
72
+ @response = response
73
+ resume
74
+ end
75
+
76
+ wait_max 1.0 do
77
+ @response.should.be.ok
78
+ end
79
+ end
80
+
81
+ it "should include association with _attributes suffix" do
82
+ stub_request(:post, "http://example.com/posts.json").to_return(body: "")
83
+ Post.new.create(:include => :comments_attributes) do |result, response|
84
+ @response = response
85
+ resume
86
+ end
87
+
88
+ wait_max 1.0 do
89
+ @response.should.be.ok
90
+ end
91
+ end
92
+
93
+ it "should raise error when included association is not found" do
94
+ stub_request(:post, "http://example.com/posts.json").to_return(body: "")
95
+ lambda { Post.new.create(:include => :foobar) { |result, response| } }.should.raise(ArgumentError)
96
+ end
68
97
  end
69
98
 
70
99
  describe "update" do
@@ -131,6 +160,19 @@ describe "crud" do
131
160
  @response.should.not.be.ok
132
161
  end
133
162
  end
163
+
164
+
165
+ it "should include association" do
166
+ stub_request(:put, "http://example.com/posts/10.json").to_return(body: "")
167
+ Post.instantiate(:id => 10).update(:include => :comments) do |result, response|
168
+ @response = response
169
+ resume
170
+ end
171
+
172
+ wait_max 1.0 do
173
+ @response.should.be.ok
174
+ end
175
+ end
134
176
  end
135
177
 
136
178
  describe "destroy" do
@@ -76,6 +76,20 @@ describe "find" do
76
76
  end
77
77
  end
78
78
 
79
+ it "should allow hash JSON response with custom JSON root" do
80
+ stub_request(:get, "http://example.com/bar.json").to_return(json: { custom: [{ id: 10, text: '42' }] })
81
+ CustomRootComment.fetch_collection("bar") do |result|
82
+ @result = result
83
+ resume
84
+ end
85
+
86
+ wait_max 1.0 do
87
+ @result.should.is_a Array
88
+ @result.first.should.is_a CustomRootComment
89
+ @result.first.text.should == '42'
90
+ end
91
+ end
92
+
79
93
  it "should give nil object if fetching collection fails" do
80
94
  stub_request(:get, "http://example.com/bar.json").to_return(status_code: 404)
81
95
  Comment.fetch_collection("bar") do |result|
@@ -120,7 +120,8 @@ describe "requests" do
120
120
  it "should call a block given to on_auth_failure on 401" do
121
121
  stub_request(:get, "http://example.com/comments/10.json").to_return(status_code: 401)
122
122
  @fail = false
123
- Comment.on_auth_failure { @fail = true; resume }
123
+ Comment.on_auth_failure { @fail = true }
124
+
124
125
  Comment.new.get("comments/10") do |response, json|
125
126
  resume
126
127
  end
@@ -2,34 +2,38 @@ class DelegateObject
2
2
  attr_accessor :id, :name
3
3
  end
4
4
 
5
- describe "String" do
5
+ describe "url encoder" do
6
+ before do
7
+ @encoder = MotionResource::Base.url_encoder
8
+ end
9
+
6
10
  it "should fill url params from params hash" do
7
- string = "accounts/:id/users/:name".fill_url_params(id: 10, name: 'john')
11
+ string = @encoder.fill_url_params("accounts/:id/users/:name", {id: 10, name: 'john'})
8
12
  string.should == "accounts/10/users/john"
9
13
  end
10
14
 
11
15
  it "should insert an extension if missing" do
12
- string = "accounts/fabulous".insert_extension!(".json")
16
+ string = @encoder.insert_extension("accounts/fabulous",".json")
13
17
  string.should == "accounts/fabulous.json"
14
18
  end
15
19
 
16
20
  it "should not insert extension if it is blank" do
17
- string = "accounts/fabulous".insert_extension!("")
21
+ string = @encoder.insert_extension("accounts/fabulous","")
18
22
  string.should == "accounts/fabulous"
19
23
  end
20
24
 
21
25
  it "should add a query string for non-url params" do
22
- string = "accounts/fabulous".build_query_string!(foo: 10, moo: "rar")
26
+ string = @encoder.build_query_string("accounts/fabulous", {foo: 10, moo: "rar"})
23
27
  string.should == "accounts/fabulous?foo=10&moo=rar"
24
28
  end
25
29
 
26
30
  it "should not add a ? when building a query string if it exists" do
27
- string = "accounts/fabulous?".build_query_string!(foo: 10, moo: "rar")
31
+ string = @encoder.build_query_string("accounts/fabulous?", {foo: 10, moo: "rar"})
28
32
  string.should == "accounts/fabulous?foo=10&moo=rar"
29
33
  end
30
34
 
31
35
  it "should tag new query params onto existing ones" do
32
- string = "accounts/fabulous?moo=rar".build_query_string!(foo: 10)
36
+ string = @encoder.build_query_string("accounts/fabulous?moo=rar", {foo: 10})
33
37
  string.should == "accounts/fabulous?moo=rar&foo=10"
34
38
  end
35
39
 
@@ -37,15 +41,15 @@ describe "String" do
37
41
  obj = DelegateObject.new
38
42
  obj.id = 10
39
43
  obj.name = 'john'
40
- string = "accounts/:id/users/:name".fill_url_params({}, obj)
44
+ string = @encoder.fill_url_params("accounts/:id/users/:name", {}, obj)
41
45
  string.should == "accounts/10/users/john"
42
46
  end
43
47
 
44
48
  it "should not crash when a param is unknown" do
45
- lambda { "accounts/:id".fill_url_params({}) }.should.not.raise
49
+ lambda { @encoder.fill_url_params("accounts/:id", {}) }.should.not.raise
46
50
  end
47
51
 
48
52
  it "should not crash when params hash contains an unused value" do
49
- lambda { "accounts".fill_url_params(foo: 'bar') }.should.not.raise
53
+ lambda { @encoder.fill_url_params("accounts", {foo:'bar'}) }.should.not.raise
50
54
  end
51
55
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-23 00:00:00.000000000 Z
12
+ date: 2013-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bubble-wrap
@@ -90,7 +90,7 @@ files:
90
90
  - lib/motion-resource/logger.rb
91
91
  - lib/motion-resource/requests.rb
92
92
  - lib/motion-resource/spec_helpers.rb
93
- - lib/motion-resource/string.rb
93
+ - lib/motion-resource/url_encoder.rb
94
94
  - lib/motion-resource/urls.rb
95
95
  - lib/motion-resource/version.rb
96
96
  - motion-resource.gemspec
@@ -105,7 +105,7 @@ files:
105
105
  - spec/motion-resource/crud_spec.rb
106
106
  - spec/motion-resource/find_spec.rb
107
107
  - spec/motion-resource/requests_spec.rb
108
- - spec/motion-resource/string_spec.rb
108
+ - spec/motion-resource/url_encoder_spec.rb
109
109
  - spec/motion-resource/urls_spec.rb
110
110
  homepage: https://github.com/tkadauke/motion-resource
111
111
  licenses: []
@@ -121,7 +121,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
121
  version: '0'
122
122
  segments:
123
123
  - 0
124
- hash: -3993476988303272926
124
+ hash: 3639631242463817566
125
125
  required_rubygems_version: !ruby/object:Gem::Requirement
126
126
  none: false
127
127
  requirements:
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  version: '0'
131
131
  segments:
132
132
  - 0
133
- hash: -3993476988303272926
133
+ hash: 3639631242463817566
134
134
  requirements: []
135
135
  rubyforge_project:
136
136
  rubygems_version: 1.8.25
@@ -149,5 +149,5 @@ test_files:
149
149
  - spec/motion-resource/crud_spec.rb
150
150
  - spec/motion-resource/find_spec.rb
151
151
  - spec/motion-resource/requests_spec.rb
152
- - spec/motion-resource/string_spec.rb
152
+ - spec/motion-resource/url_encoder_spec.rb
153
153
  - spec/motion-resource/urls_spec.rb
@@ -1,46 +0,0 @@
1
- class String
2
- # Takes in a hash and spits out the formatted string
3
- # Checks the delegate first
4
- def fill_url_params(params = {}, delegate = nil)
5
- params ||= {}
6
- split = self.split '/'
7
- url = split.collect { |path|
8
- ret = path
9
- if path[0] == ':'
10
- path_sym = path[1..-1].to_sym
11
-
12
- curr = nil
13
- if delegate && delegate.respond_to?(path_sym)
14
- curr = delegate.send(path_sym)
15
- end
16
-
17
- ret = (curr || params.delete(path_sym) || path).to_s
18
- end
19
-
20
- ret
21
- }.join '/'
22
- url.build_query_string! params
23
- end
24
-
25
- def build_query_string!(params = {})
26
- return self if params.keys.empty?
27
- # fake a url so we avoid regex nastiness with URL's
28
- url = NSURL.URLWithString("http://blah.com/#{self}")
29
- # build our query string (needs encoding support!)
30
- query_string = params.to_query
31
- if url.query.nil? || url.query.empty?
32
- # strip the beginning / and add the query
33
- self.replace "#{url.path[1..-1]}?#{query_string}"
34
- else
35
- self.replace "#{url.path[1..-1]}?#{url.query}&#{query_string}"
36
- end
37
- end
38
-
39
- def insert_extension!(extension)
40
- return self if extension.blank?
41
-
42
- url = NSURL.URLWithString(self)
43
- extension = extension.gsub(".", "")
44
- self.replace url.URLByAppendingPathExtension(extension).absoluteString
45
- end
46
- end