jeffrafter-resource_party 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION.yml +2 -2
  3. data/lib/resource_party.rb +40 -24
  4. metadata +13 -2
data/Rakefile CHANGED
@@ -12,6 +12,7 @@ begin
12
12
  s.description = "Simple wrapper for HTTParty for basic operations with a restful resource"
13
13
  s.authors = ["Jeff Rafter"]
14
14
  s.add_dependency "jnunemaker-httparty"
15
+ s.add_dependency "htmlentities"
15
16
  s.files = FileList["[A-Z]*", "{lib,test}/**/*"]
16
17
  end
17
18
  rescue LoadError
@@ -1,4 +1,4 @@
1
1
  ---
2
- :minor: 1
3
- :patch: 2
2
+ :minor: 2
3
+ :patch: 0
4
4
  :major: 0
@@ -1,4 +1,5 @@
1
1
  require 'httparty'
2
+ require 'htmlentities'
2
3
 
3
4
  module ResourceParty
4
5
  class ServerError < RuntimeError; end
@@ -19,33 +20,30 @@ module ResourceParty
19
20
  def initialize(params = {}, query = {}, no_defaults = false)
20
21
  return self if no_defaults
21
22
  response = self.class.get("/#{self.class.route}/new.xml")
22
- raise ServerError.new(response.body) if response.code != "200"
23
+ handle_errors(response)
23
24
  hash = Hash.from_xml(response.body).values.first
24
25
  hash.merge! params
25
26
  self.class.from_xml hash, self
26
27
  end
27
28
 
28
- def self.find(id, query = {})
29
- response = self.get("/#{self.route}/#{id}.xml", :query => query)
30
- raise RecordNotFound.new(response.body) if response.code == "404"
31
- raise ServerError.new(response.body) if response.code != "200"
32
- hash = Hash.from_xml(response.body).values.first
33
- self.from_xml hash
29
+ def self.find(param, query = {})
30
+ response = self.get("/#{self.route}/#{param}.xml", :query => query)
31
+ handle_not_found(response)
32
+ handle_errors(response)
33
+ handle_response(response)
34
34
  end
35
35
 
36
36
  def self.create(params = {}, query = {})
37
37
  response = self.post("/#{self.route}.xml", :body => body_for(params), :query => query)
38
- raise ServerError.new(response.body) if response.code != "200"
39
- hash = Hash.from_xml(response.body).values.first
40
- self.from_xml hash
38
+ handle_errors(response)
39
+ handle_response(response)
41
40
  end
42
41
 
43
- def self.update(id, params = {}, query = {})
44
- response = self.put("/#{self.route}/#{id}.xml", :body => body_for(params), :query => query)
45
- raise RecordNotFound.new(response.body) if response.code == "404"
46
- raise ServerError.new(response.body) if response.code != "200"
47
- hash = Hash.from_xml(response.body).values.first
48
- self.from_xml hash
42
+ def self.update(param, params = {}, query = {})
43
+ response = self.put("/#{self.route}/#{param}.xml", :body => body_for(params), :query => query)
44
+ handle_not_found(response)
45
+ handle_errors(response)
46
+ handle_response(response)
49
47
  end
50
48
 
51
49
  def update(params = {}, query = {})
@@ -53,10 +51,10 @@ module ResourceParty
53
51
  end
54
52
 
55
53
  def self.destroy(id, query = {})
56
- response = self.delete("/#{self.route}/#{id}.xml", :query => query, :format => :text)
57
- raise RecordNotFound.new(response.body) if response.code == "404"
58
- raise ServerError.new(response.body) if response.code != "200"
59
- true
54
+ response = self.delete("/#{self.route}/#{id}.xml", :query => query)
55
+ handle_not_found(response)
56
+ handle_errors(response)
57
+ handle_response(response)
60
58
  end
61
59
 
62
60
  def destroy(query = {})
@@ -65,22 +63,40 @@ module ResourceParty
65
63
 
66
64
  def self.all(query = {})
67
65
  response = self.get("/#{self.route}.xml", :query => query)
68
- raise ServerError.new(response.body) if response.code != "200"
66
+ handle_errors(response)
69
67
  items = response.values.first
70
68
  items.map{|hash| self.from_xml hash }
71
69
  end
72
70
 
73
71
  private
74
72
 
73
+ def self.handle_not_found(response)
74
+ raise RecordNotFound.new(response.body) if response.code == "404"
75
+ end
76
+
77
+ def self.handle_errors(response)
78
+ raise ServerError.new(response.body) if response.code != "200"
79
+ end
80
+
81
+ def self.handle_response(response)
82
+ # Rails will return ' ' when you render :nothing => true
83
+ return nil if response.body.blank? || response.body == ' '
84
+ hash = Hash.from_xml(response.body).values.first
85
+ self.from_xml hash
86
+ end
87
+
75
88
  def self.body_for(params)
89
+ require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
76
90
  body = {}
77
91
  params.each{|n,v| body["#{self.resource}[#{n}]"] = v }
78
- body.to_query
92
+ body.map{|n,v| "#{CGI.escape(n.to_s)}=#{CGI.escape(v.to_s)}"} * "&"
79
93
  end
80
94
 
81
95
  def self.from_xml(params, obj = nil)
82
96
  obj ||= self.new({}, {}, true)
83
- obj.attributes = params
97
+ decoded_params = params.dup
98
+ params.each{|n,v| decoded_params[n] = HTMLEntities.new.decode(v) if v && v.is_a?(String) }
99
+ obj.attributes = decoded_params
84
100
  mod = Module.new do
85
101
  obj.attributes.keys.each do |k|
86
102
  define_method(k) do
@@ -88,7 +104,7 @@ module ResourceParty
88
104
  end
89
105
 
90
106
  define_method("#{k}=") do |val|
91
- self.attributes[k] = val
107
+ self.attributes[k] = HTMLEntities.new.decode(val)
92
108
  end
93
109
  end
94
110
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeffrafter-resource_party
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Rafter
@@ -9,11 +9,22 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-10 00:00:00 -08:00
12
+ date: 2009-03-05 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: jnunemaker-httparty
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: htmlentities
27
+ type: :runtime
17
28
  version_requirement:
18
29
  version_requirements: !ruby/object:Gem::Requirement
19
30
  requirements: