pco_api 1.1.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fdf363aaf74caadf35c535566554358fbabe8a86
4
- data.tar.gz: b1222c3d2349a5617827b3256e63f53ac908d938
2
+ SHA256:
3
+ metadata.gz: cb681a310a78eeb3ac455edc7ab2b4696a246e74a54077b1f0c5ce26e9a31c10
4
+ data.tar.gz: fe3398a9fd3c50f784e139fd65879a31cdf56d210a97e3e46e5f66309058b0f6
5
5
  SHA512:
6
- metadata.gz: f2d8c40236d7c1cc27c3e51858aa42586fdfbc779143707da8293d960d2618b107ed8cd1a44a7d4be01b6b8cd929c48504ddd8f731e61d627879c783123c242a
7
- data.tar.gz: 0d75528107787fb437955582c5492aa57d7585ddbec65ebc40f2e1435a20b4e01d908fce67a8d7235f4c41780f0dd619b83e1fd11dd8daa3244d9e0ed3f65fad
6
+ metadata.gz: 41d1955114ffe087506d63c3907ebad24f9c0a34e9e3784d620bc2be8080bf309b3eb0fbed52a60b5805e1e2cf0ccfe07d6adcc0072a48f78336461d9e7ca14b
7
+ data.tar.gz: 1ead2832a8c2f62c13845b5c7c28254494efdbdedf404b6e70ccbd9791fd12ee9932acfad3ed9255dc9d3451eaf4dd4841cb2a1ed99721304a15fc5260c1301d
data/README.md CHANGED
@@ -42,6 +42,13 @@ gem install pco_api
42
42
  # GET /people/v2/households?order=name
43
43
  ```
44
44
 
45
+ 5. To query dataset according to `can_query_by` variables:
46
+
47
+ ```ruby
48
+ api.people.v2.people.get('where[membership]': 'Member')
49
+ # GET /people/v2/people?where[membership]=Member
50
+ ```
51
+
45
52
  ## Example
46
53
 
47
54
  ```ruby
@@ -63,22 +70,24 @@ api.people.v2.people.get(order: 'last_name')
63
70
  {
64
71
  "type" => "Person",
65
72
  "id" => "271",
66
- "first_name" => "Jean",
67
- "middle_name" => nil,
68
- "last_name" => "Abernathy",
69
- "birthdate" => "1885-01-01",
70
- "anniversary" => nil,
71
- "gender" => "F",
72
- "grade" => -1,
73
- "child" => false,
74
- "status" => "active",
75
- "school_type" => nil,
76
- "graduation_year" => nil,
77
- "site_administrator" => false,
78
- "people_permissions" => nil,
79
- "created_at" => "2015-04-01T20:18:22Z",
80
- "updated_at" => "2015-04-10T18:59:51Z",
81
- "avatar" => nil,
73
+ "attributes" => {
74
+ "first_name" => "Jean",
75
+ "middle_name" => nil,
76
+ "last_name" => "Abernathy",
77
+ "birthdate" => "1885-01-01",
78
+ "anniversary" => nil,
79
+ "gender" => "F",
80
+ "grade" => -1,
81
+ "child" => false,
82
+ "status" => "active",
83
+ "school_type" => nil,
84
+ "graduation_year" => nil,
85
+ "site_administrator" => false,
86
+ "people_permissions" => nil,
87
+ "created_at" => "2015-04-01T20:18:22Z",
88
+ "updated_at" => "2015-04-10T18:59:51Z",
89
+ "avatar" => nil,
90
+ },
82
91
  "links" => {
83
92
  "self" => "https://api.planningcenteronline.com/people/v2/people/271"
84
93
  }
@@ -91,7 +100,7 @@ api.people.v2.people.get(order: 'last_name')
91
100
  "next" => {
92
101
  "offset" => 25
93
102
  },
94
- "orderable_by" => [
103
+ "can_order_by" => [
95
104
  "first_name",
96
105
  "middle_name",
97
106
  "last_name",
@@ -108,7 +117,7 @@ api.people.v2.people.get(order: 'last_name')
108
117
  "created_at",
109
118
  "updated_at"
110
119
  ],
111
- "filterable_by" => [
120
+ "can_query_by" => [
112
121
  "first_name",
113
122
  "middle_name",
114
123
  "last_name",
@@ -137,7 +146,11 @@ api.people.v2.people.get(order: 'last_name')
137
146
  "name_suffix",
138
147
  "field_data",
139
148
  "apps"
140
- ]
149
+ ],
150
+ "parent" => {
151
+ "id" => "1",
152
+ "type" => "Organization"
153
+ }
141
154
  }
142
155
  }
143
156
  ```
@@ -203,16 +216,19 @@ The following errors may be raised by the library, depending on the API response
203
216
 
204
217
  The exception object has the following methods:
205
218
 
206
- | Method | Content |
207
- | ------- | --------------------------------------- |
208
- | status | HTTP status code returned by the server |
209
- | message | the message returned by the API |
219
+ | Method | Content |
220
+ | ------- | ------------------------------------------- |
221
+ | status | HTTP status code returned by the server |
222
+ | message | the message returned by the API |
223
+ | detail | the full error response returned by the API |
210
224
 
211
225
  The `message` should be a simple string given by the API, e.g. "Resource Not Found".
212
226
 
227
+ In the case of validation errors, the `message` is a summary string built from the raw `detail`.
228
+
213
229
  Alternatively, you may rescue `PCO::API::Errors::BaseError` and branch your code based on
214
230
  the status code returned by calling `error.status`.
215
231
 
216
232
  ## Copyright & License
217
233
 
218
- Copyright 2015, Ministry Centered Technologies. Licensed MIT.
234
+ Copyright Ministry Centered Technologies. Licensed MIT.
@@ -5,6 +5,10 @@ module PCO
5
5
  module API
6
6
  URL = 'https://api.planningcenteronline.com'
7
7
 
8
+ class Response < Hash
9
+ attr_accessor :headers
10
+ end
11
+
8
12
  class Endpoint
9
13
  attr_reader :url, :last_result
10
14
 
@@ -69,7 +73,9 @@ module PCO
69
73
  def _build_response(result)
70
74
  case result.status
71
75
  when 200..299
72
- result.body
76
+ res = Response[result.body]
77
+ res.headers = result.headers
78
+ res
73
79
  when 400
74
80
  fail Errors::BadRequest, result
75
81
  when 401
@@ -82,6 +88,8 @@ module PCO
82
88
  fail Errors::MethodNotAllowed, result
83
89
  when 422
84
90
  fail Errors::UnprocessableEntity, result
91
+ when 429
92
+ fail Errors::TooManyRequests, result
85
93
  when 400..499
86
94
  fail Errors::ClientError, result
87
95
  when 500
@@ -116,7 +124,6 @@ module PCO
116
124
 
117
125
  def _build_connection
118
126
  Faraday.new(url: url) do |faraday|
119
- faraday.adapter :excon
120
127
  faraday.response :json, content_type: /\bjson$/
121
128
  if @basic_auth_token && @basic_auth_secret
122
129
  faraday.basic_auth @basic_auth_token, @basic_auth_secret
@@ -125,6 +132,7 @@ module PCO
125
132
  else
126
133
  fail Errors::AuthRequiredError, "You must specify either HTTP basic auth credentials or an OAuth2 access token."
127
134
  end
135
+ faraday.adapter :excon
128
136
  end
129
137
  end
130
138
  end
@@ -4,32 +4,59 @@ module PCO
4
4
  class AuthRequiredError < StandardError; end
5
5
 
6
6
  class BaseError < StandardError
7
- attr_reader :status
7
+ attr_reader :status, :detail, :headers
8
8
 
9
9
  def initialize(response)
10
10
  @status = response.status
11
- @message = response.body.is_a?(Hash) && response.body['message'] || response.body.to_s
11
+ @detail = response.body
12
+ @headers = response.headers
12
13
  end
13
14
 
14
15
  def to_s
15
- @message
16
+ message
17
+ end
18
+
19
+ def message
20
+ return detail.to_s unless detail.is_a?(Hash)
21
+ detail['message'] || validation_message || detail.to_s
16
22
  end
17
23
 
18
24
  def inspect
19
- "<#{self.class.name} status=#{@status} message=#{@message}>"
25
+ "<#{self.class.name} status=#{status} message=#{message.inspect} detail=#{detail.inspect}>"
26
+ end
27
+
28
+ private
29
+
30
+ def validation_message
31
+ return if Array(detail['errors']).empty?
32
+ errors = detail['errors'].map do |error|
33
+ error_to_string(error)
34
+ end
35
+ errors.uniq.join('; ')
36
+ end
37
+
38
+ def error_to_string(error)
39
+ return unless error.is_a?(Hash)
40
+ [
41
+ "#{error['title']}:",
42
+ error.fetch('meta', {})['resource'],
43
+ error.fetch('source', {})['parameter'],
44
+ error['detail']
45
+ ].compact.join(' ')
20
46
  end
21
47
  end
22
48
 
23
- class ClientError < BaseError; end # 400..499
24
- class BadRequest < ClientError; end # 400
25
- class Unauthorized < ClientError; end # 401
26
- class Forbidden < ClientError; end # 403
27
- class NotFound < ClientError; end # 404
28
- class MethodNotAllowed < ClientError; end # 405
29
- class UnprocessableEntity < ClientError; end # 422
49
+ class ClientError < BaseError; end # 400..499
50
+ class BadRequest < ClientError; end # 400
51
+ class Unauthorized < ClientError; end # 401
52
+ class Forbidden < ClientError; end # 403
53
+ class NotFound < ClientError; end # 404
54
+ class MethodNotAllowed < ClientError; end # 405
55
+ class UnprocessableEntity < ClientError; end # 422
56
+ class TooManyRequests < ClientError; end # 429
30
57
 
31
- class ServerError < BaseError; end # 500..599
32
- class InternalServerError < ServerError; end # 500
58
+ class ServerError < BaseError; end # 500..599
59
+ class InternalServerError < ServerError; end # 500
33
60
  end
34
61
  end
35
62
  end
@@ -1,5 +1,5 @@
1
1
  module PCO
2
2
  module API
3
- VERSION = '1.1.1'
3
+ VERSION = '1.3.0'
4
4
  end
5
5
  end
@@ -50,6 +50,7 @@ describe PCO::API::Endpoint do
50
50
  it 'returns the result of making a GET request to the endpoint' do
51
51
  expect(@result).to be_a(Hash)
52
52
  expect(@result['data']).to eq(result)
53
+ expect(@result.headers).to eq('Content-Type' => 'application/vnd.api+json')
53
54
  end
54
55
  end
55
56
 
@@ -76,6 +77,7 @@ describe PCO::API::Endpoint do
76
77
  end
77
78
  expect(error.status).to eq(404)
78
79
  expect(error.message).to eq('Resource Not Found')
80
+ expect(error.headers).to eq('Content-Type' => 'application/vnd.api+json')
79
81
  end
80
82
  end
81
83
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pco_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Planning Center Online
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-06 00:00:00.000000000 Z
11
+ date: 2020-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.1
19
+ version: '0.10'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.1
26
+ version: '0.10'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: faraday_middleware
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.9.1
33
+ version: '0.10'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.9.1
40
+ version: '0.10'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: excon
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.30.0
47
+ version: 0.71.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.30.0
54
+ version: 0.71.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -114,7 +114,7 @@ homepage: https://github.com/planningcenter/pco_api_ruby
114
114
  licenses:
115
115
  - MIT
116
116
  metadata: {}
117
- post_install_message:
117
+ post_install_message:
118
118
  rdoc_options: []
119
119
  require_paths:
120
120
  - lib
@@ -129,9 +129,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0'
131
131
  requirements: []
132
- rubyforge_project:
133
- rubygems_version: 2.4.6
134
- signing_key:
132
+ rubygems_version: 3.0.3
133
+ signing_key:
135
134
  specification_version: 4
136
135
  summary: API wrapper for api.planningcenteronline.com
137
136
  test_files: