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 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: