pco_api 1.1.1 → 1.3.0
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.
- checksums.yaml +5 -5
- data/README.md +40 -24
- data/lib/pco/api/endpoint.rb +10 -2
- data/lib/pco/api/errors.rb +40 -13
- data/lib/pco/api/version.rb +1 -1
- data/spec/pco/api/endpoint_spec.rb +2 -0
- metadata +14 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cb681a310a78eeb3ac455edc7ab2b4696a246e74a54077b1f0c5ce26e9a31c10
|
4
|
+
data.tar.gz: fe3398a9fd3c50f784e139fd65879a31cdf56d210a97e3e46e5f66309058b0f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
"
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
"
|
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
|
-
"
|
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
|
234
|
+
Copyright Ministry Centered Technologies. Licensed MIT.
|
data/lib/pco/api/endpoint.rb
CHANGED
@@ -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
|
data/lib/pco/api/errors.rb
CHANGED
@@ -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
|
-
@
|
11
|
+
@detail = response.body
|
12
|
+
@headers = response.headers
|
12
13
|
end
|
13
14
|
|
14
15
|
def to_s
|
15
|
-
|
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=#{
|
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
|
24
|
-
class BadRequest
|
25
|
-
class Unauthorized
|
26
|
-
class Forbidden
|
27
|
-
class NotFound
|
28
|
-
class MethodNotAllowed
|
29
|
-
class UnprocessableEntity
|
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
|
32
|
-
class InternalServerError
|
58
|
+
class ServerError < BaseError; end # 500..599
|
59
|
+
class InternalServerError < ServerError; end # 500
|
33
60
|
end
|
34
61
|
end
|
35
62
|
end
|
data/lib/pco/api/version.rb
CHANGED
@@ -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.
|
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:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
133
|
-
|
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:
|