almodovar 0.6.0 → 0.6.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.
@@ -11,6 +11,7 @@ require 'almodovar/http_accessor'
11
11
  require 'almodovar/resource'
12
12
  require 'almodovar/resource_collection'
13
13
  require 'almodovar/single_resource'
14
+ require 'almodovar/errors'
14
15
  require 'almodovar/to_xml'
15
16
  require 'almodovar/resource_presenter'
16
17
  require 'almodovar/resource_presenter/collection'
@@ -0,0 +1,3 @@
1
+ module Almodovar
2
+ class HttpError < Exception; end
3
+ end
@@ -3,6 +3,7 @@ module Almodovar
3
3
  def xml
4
4
  @xml ||= begin
5
5
  response = http.get(url_with_params)
6
+ check_errors(response)
6
7
  Nokogiri::XML.parse(response.body).root
7
8
  end
8
9
  end
@@ -16,11 +17,17 @@ module Almodovar
16
17
 
17
18
  def http
18
19
  @http ||= Patron::Session.new.tap do |session|
19
- session.username = @auth.username
20
- session.password = @auth.password
21
- session.auth_type = :digest
20
+ if @auth
21
+ session.username = @auth.username
22
+ session.password = @auth.password
23
+ session.auth_type = :digest
24
+ end
22
25
  end
23
26
  end
27
+
28
+ def check_errors(response)
29
+ raise(Almodovar::HttpError, "Status code: #{response.status}") if response.status >= 400
30
+ end
24
31
  end
25
32
 
26
33
  end
@@ -14,7 +14,8 @@ module Almodovar
14
14
  def create(attrs = {})
15
15
  raise ArgumentError.new("You must specify one only root element which is the type of resource (e.g. `:project => { :name => 'Wadus' }` instead of just `:name => 'Wadus'`)") if attrs.size > 1
16
16
  root, body = attrs.first
17
- response = http.post(url_with_params, body.to_xml(:root => root, :convert_links => true), :content_type => "application/xml")
17
+ response = http.post(url_with_params, body.to_xml(:root => root, :convert_links => true), "Content-Type" => "application/xml")
18
+ check_errors(response)
18
19
  Resource.new(nil, @auth, Nokogiri::XML.parse(response.body).root)
19
20
  end
20
21
 
@@ -2,17 +2,48 @@ module Almodovar
2
2
 
3
3
  class ResourcePresenter::Collection
4
4
 
5
- def initialize(resource_class, resources_args = [])
5
+ def initialize(resource_class, resources_args = [], options = {})
6
6
  @resource_class = resource_class
7
7
  @resources = resources_args.map { |arg| @resource_class.new(arg) }
8
+
9
+ @total = options[:total_entries]
10
+ @next = options[:next_link]
11
+ @prev = options[:prev_link]
8
12
  end
9
13
 
10
14
  def to_xml(options = {})
11
- @resources.to_xml(options.merge({:root => resource_type.pluralize}))
15
+ # Most of the following code is borrowed from ActiveSupport's Array#to_xml.
16
+ # We cannot use Array#to_xml because we need to add a few custom tags for
17
+ # pagination.
18
+ require 'active_support/builder' unless defined?(Builder)
19
+
20
+ options = options.dup
21
+ options[:indent] ||= 2
22
+ options[:builder] ||= ::Builder::XmlMarkup.new(:indent => options[:indent])
23
+
24
+ xml = options[:builder]
25
+
26
+ xml.instruct! unless options[:skip_instruct]
27
+ xml.tag! resource_type.pluralize.dasherize, :type => 'array' do
28
+ xml.tag!('total-entries', @total) if @total
29
+ xml.link :rel => 'next', :href => @next if @next
30
+ xml.link :rel => 'prev', :href => @prev if @prev
31
+ @resources.each { |value| value.to_xml(options.merge(:root => resource_type.singularize, :skip_instruct => true)) }
32
+ end
12
33
  end
13
34
 
14
35
  def as_json(options = {})
15
- { 'entries' => @resources.map { |resource| resource.as_json(options) }}
36
+ ActiveSupport::OrderedHash.new.tap do |message|
37
+ message[:total_entries] = @total if @total
38
+ message[:next_link] = @next if @next
39
+ message[:prev_link] = @prev if @prev
40
+ message[:entries] = @resources.map { |resource| resource.as_json(options) }
41
+ end
42
+ end
43
+
44
+ def to_json(options = {})
45
+ require 'yajl'
46
+ Yajl::Encoder.encode(as_json(options), :pretty => true) + "\n"
16
47
  end
17
48
 
18
49
  def resource_type
@@ -16,11 +16,12 @@ module Almodovar
16
16
  raise ArgumentError.new("You must specify one only root element which is the type of resource (e.g. `:project => { :name => 'Wadus' }` instead of just `:name => 'Wadus'`)") if attrs.size > 1
17
17
  root, body = attrs.first
18
18
  response = http.put(@url, body.to_xml(:root => root), :content_type => "application/xml")
19
+ check_errors(response)
19
20
  @xml = Nokogiri::XML.parse(response.body).root
20
21
  end
21
22
 
22
23
  def delete
23
- http.delete(@url)
24
+ check_errors(http.delete(@url))
24
25
  end
25
26
 
26
27
  def url
@@ -1,9 +1,9 @@
1
1
  module Almodovar
2
2
  module ArrayToXml
3
- def to_xml_with_links(options = {})
4
- return to_xml_without_links(options) unless options[:convert_links]
3
+ def to_xml_with_links(options = {}, &block)
4
+ return to_xml_without_links(options, &block) unless options[:convert_links]
5
5
  options[:builder].tag!(:link, :rel => options[:root]) do |xml|
6
- to_xml_without_links options.merge(:builder => xml)
6
+ to_xml_without_links options.merge(:builder => xml), &block
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,118 +1,122 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: almodovar
3
- version: !ruby/object:Gem::Version
4
- hash: 7
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 6
9
- - 0
10
- version: 0.6.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - BeBanjo S.L.
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-10-07 00:00:00 +02:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-05-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: patron
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: builder
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
39
25
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: builder
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
47
38
  type: :runtime
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: nokogiri
51
39
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
53
41
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: nokogiri
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
61
54
  type: :runtime
62
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
64
- name: activesupport
65
55
  prerelease: false
66
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: activesupport
64
+ requirement: !ruby/object:Gem::Requirement
67
65
  none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
75
70
  type: :runtime
76
- version_requirements: *id004
77
- - !ruby/object:Gem::Dependency
78
- name: i18n
79
71
  prerelease: false
80
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
81
73
  none: false
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- hash: 3
86
- segments:
87
- - 0
88
- version: "0"
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: i18n
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
89
86
  type: :runtime
90
- version_requirements: *id005
91
- - !ruby/object:Gem::Dependency
92
- name: yajl-ruby
93
87
  prerelease: false
94
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
95
89
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 3
100
- segments:
101
- - 0
102
- version: "0"
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: yajl-ruby
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
103
102
  type: :runtime
104
- version_requirements: *id006
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
105
110
  description:
106
111
  email: ballsbreaking@bebanjo.com
107
112
  executables: []
108
-
109
113
  extensions: []
110
-
111
- extra_rdoc_files:
114
+ extra_rdoc_files:
112
115
  - README.rdoc
113
- files:
116
+ files:
114
117
  - README.rdoc
115
118
  - lib/almodovar/digest_auth.rb
119
+ - lib/almodovar/errors.rb
116
120
  - lib/almodovar/http_accessor.rb
117
121
  - lib/almodovar/resource.rb
118
122
  - lib/almodovar/resource_collection.rb
@@ -122,40 +126,30 @@ files:
122
126
  - lib/almodovar/single_resource.rb
123
127
  - lib/almodovar/to_xml.rb
124
128
  - lib/almodovar.rb
125
- has_rdoc: true
126
129
  homepage: http://wiki.github.com/bebanjo/almodovar/
127
130
  licenses: []
128
-
129
131
  post_install_message:
130
- rdoc_options:
132
+ rdoc_options:
131
133
  - --main
132
134
  - README.rdoc
133
- require_paths:
135
+ require_paths:
134
136
  - lib
135
- required_ruby_version: !ruby/object:Gem::Requirement
137
+ required_ruby_version: !ruby/object:Gem::Requirement
136
138
  none: false
137
- requirements:
138
- - - ">="
139
- - !ruby/object:Gem::Version
140
- hash: 3
141
- segments:
142
- - 0
143
- version: "0"
144
- required_rubygems_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
144
  none: false
146
- requirements:
147
- - - ">="
148
- - !ruby/object:Gem::Version
149
- hash: 3
150
- segments:
151
- - 0
152
- version: "0"
145
+ requirements:
146
+ - - ! '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
153
149
  requirements: []
154
-
155
150
  rubyforge_project:
156
- rubygems_version: 1.6.2
151
+ rubygems_version: 1.8.24
157
152
  signing_key:
158
153
  specification_version: 3
159
154
  summary: BeBanjo API client
160
155
  test_files: []
161
-