cronofy 0.8.3 → 0.9.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
2
  SHA1:
3
- metadata.gz: a3f4ad1bcd1d60b04de2d5a623899783666eace5
4
- data.tar.gz: db32fd4cb307bd4c6b6d41c87dab2d7d7149091a
3
+ metadata.gz: 326fa8f77f51139784236c0a9e2f73cdc53edecc
4
+ data.tar.gz: 3b314897d498fcf530953ac9bd44bcfd7b21f533
5
5
  SHA512:
6
- metadata.gz: c25bdc2ca36a4b3350e2634e63a4bbd505e52ccc3fc53b661acdd44a4c5fe3acd0d3e15ed3e236fb4e15807a71d54d8bf2d1309812d92b54edfc373a7183574f
7
- data.tar.gz: b1d3651e5dad66f624c7c9d46dd95572f59f0701165bbe43af7df82c4bdf333460a1fc0be6965173f683acf5d66fd3c87692eb18d01225679f1680388a9d9e57
6
+ metadata.gz: b36221de26d3abf310b4be4ce4ea29a7c02bf0858ea36f9924488559fd9db24dea773b07c0a8d47863f940bb0484b4349a1b6796538c437c25b6d9dd1325591c
7
+ data.tar.gz: d78d17162887646dbfc909290ceabc2fb2bd080253597a54c0aa3be452504d01112dd1b1b91c323734b023bdae071b211a419a2994e0a5b7d7c60194544209c9
@@ -32,6 +32,32 @@ module Cronofy
32
32
  @auth = Auth.new(client_id, client_secret, access_token, refresh_token)
33
33
  end
34
34
 
35
+ # Public: Creates a new calendar for the account.
36
+ #
37
+ # profile_id - The String ID of the profile to create the calendar within.
38
+ # name - A String to use as the name of the calendar.
39
+ #
40
+ # See http://www.cronofy.com/developers/api/alpah#create-calendar for
41
+ # reference.
42
+ #
43
+ # Returns the created Calendar
44
+ #
45
+ # Raises Cronofy::CredentialsMissingError if no credentials available.
46
+ # Raises Cronofy::AuthenticationFailureError if the access token is no
47
+ # longer valid.
48
+ # Raises Cronofy::AuthorizationFailureError if the access token does not
49
+ # include the required scope.
50
+ # Raises Cronofy::InvalidRequestError if the request contains invalid
51
+ # parameters.
52
+ # Raises Cronofy::AccountLockedError if the profile is not in a writable
53
+ # state and so a calendar cannot be created.
54
+ # Raises Cronofy::TooManyRequestsError if the request exceeds the rate
55
+ # limits for the application.
56
+ def create_calendar(profile_id, name)
57
+ response = post("/v1/calendars", profile_id: profile_id, name: name)
58
+ parse_json(Calendar, "calendar", response)
59
+ end
60
+
35
61
  # Public: Lists all the calendars for the account.
36
62
  #
37
63
  # See http://www.cronofy.com/developers/api#calendars for reference.
@@ -269,6 +295,18 @@ module Cronofy
269
295
  # Public: Creates a notification channel with a callback URL
270
296
  #
271
297
  # callback_url - A String specifing the callback URL for the channel.
298
+ # options - The Hash options used to refine the notifications of the
299
+ # channel (default: {}):
300
+ # :filters - A Hash of filters to use for the notification
301
+ # channel (optional):
302
+ # :calendar_ids - An Array of calendar ID strings
303
+ # to restrict the returned events
304
+ # to (optional).
305
+ # :only_managed - A Boolean specifying whether
306
+ # only events that you are
307
+ # managing for the account should
308
+ # trigger notifications
309
+ # (optional).
272
310
  #
273
311
  # See http://www.cronofy.com/developers/api#create-channel for reference.
274
312
  #
@@ -283,8 +321,10 @@ module Cronofy
283
321
  # parameters.
284
322
  # Raises Cronofy::TooManyRequestsError if the request exceeds the rate
285
323
  # limits for the application.
286
- def create_channel(callback_url)
287
- response = post("/v1/channels", callback_url: callback_url)
324
+ def create_channel(callback_url, options = {})
325
+ params = options.merge(callback_url: callback_url)
326
+
327
+ response = post("/v1/channels", params)
288
328
  parse_json(Channel, "channel", response)
289
329
  end
290
330
 
@@ -52,9 +52,15 @@ module Cronofy
52
52
  end
53
53
  end
54
54
 
55
+ class AccountLockedError < APIError
56
+ end
57
+
55
58
  class TooManyRequestsError < APIError
56
59
  end
57
60
 
61
+ class ServerError < APIError
62
+ end
63
+
58
64
  class UnknownError < APIError
59
65
  end
60
66
 
@@ -66,7 +72,9 @@ module Cronofy
66
72
  403 => AuthorizationFailureError,
67
73
  404 => NotFoundError,
68
74
  422 => InvalidRequestError,
75
+ 423 => AccountLockedError,
69
76
  429 => TooManyRequestsError,
77
+ 500 => ServerError,
70
78
  }.freeze
71
79
 
72
80
  def self.map_error(error)
@@ -1,3 +1,3 @@
1
1
  module Cronofy
2
- VERSION = "0.8.3".freeze
2
+ VERSION = "0.9.0".freeze
3
3
  end
@@ -102,7 +102,17 @@ describe Cronofy::Client do
102
102
  expect{ subject }.to raise_error(::Cronofy::InvalidRequestError)
103
103
  end
104
104
 
105
- it 'raises AuthenticationFailureError on 401s' do
105
+ it 'raises AccountLockedError on 423s' do
106
+ stub_request(method, request_url)
107
+ .with(headers: request_headers,
108
+ body: request_body)
109
+ .to_return(status: 423,
110
+ headers: correct_response_headers,
111
+ body: correct_response_body.to_json)
112
+ expect{ subject }.to raise_error(::Cronofy::AccountLockedError)
113
+ end
114
+
115
+ it 'raises TooManyRequestsError on 429s' do
106
116
  stub_request(method, request_url)
107
117
  .with(headers: request_headers,
108
118
  body: request_body)
@@ -111,6 +121,50 @@ describe Cronofy::Client do
111
121
  body: correct_response_body.to_json)
112
122
  expect{ subject }.to raise_error(::Cronofy::TooManyRequestsError)
113
123
  end
124
+
125
+ it 'raises ServerError on 500s' do
126
+ stub_request(method, request_url)
127
+ .with(headers: request_headers,
128
+ body: request_body)
129
+ .to_return(status: 500,
130
+ headers: correct_response_headers,
131
+ body: correct_response_body.to_json)
132
+ expect{ subject }.to raise_error(::Cronofy::ServerError)
133
+ end
134
+ end
135
+
136
+ describe '#create_calendar' do
137
+ let(:request_url) { 'https://api.cronofy.com/v1/calendars' }
138
+ let(:method) { :post }
139
+ let(:request_body) do
140
+ {
141
+ :profile_id => "pro_1234",
142
+ :name => "Home",
143
+ }
144
+ end
145
+
146
+ let(:correct_response_code) { 200 }
147
+ let(:correct_response_body) do
148
+ {
149
+ "calendar" => {
150
+ "provider_name" => "google",
151
+ "profile_name" => "example@cronofy.com",
152
+ "calendar_id" => "cal_n23kjnwrw2_jsdfjksn234",
153
+ "calendar_name" => "Home",
154
+ "calendar_readonly" => false,
155
+ "calendar_deleted" => false
156
+ }
157
+ }
158
+ end
159
+
160
+ let(:correct_mapped_result) do
161
+ Cronofy::Calendar.new(correct_response_body["calendar"])
162
+ end
163
+
164
+ subject { client.create_calendar("pro_1234", "Home") }
165
+
166
+ it_behaves_like 'a Cronofy request'
167
+ it_behaves_like 'a Cronofy request with mapped return value'
114
168
  end
115
169
 
116
170
  describe '#list_calendars' do
@@ -177,14 +231,16 @@ describe Cronofy::Client do
177
231
  }
178
232
  end
179
233
  let(:request_body) do
180
- hash_including(:event_id => "qTtZdczOccgaPncGJaCiLg",
181
- :summary => "Board meeting",
182
- :description => "Discuss plans for the next quarter.",
183
- :start => encoded_start_datetime,
184
- :end => encoded_end_datetime,
185
- :location => {
186
- :description => "Board room"
187
- })
234
+ {
235
+ :event_id => "qTtZdczOccgaPncGJaCiLg",
236
+ :summary => "Board meeting",
237
+ :description => "Discuss plans for the next quarter.",
238
+ :start => encoded_start_datetime,
239
+ :end => encoded_end_datetime,
240
+ :location => {
241
+ :description => "Board room"
242
+ }
243
+ }
188
244
  end
189
245
  let(:correct_response_code) { 202 }
190
246
  let(:correct_response_body) { nil }
@@ -391,6 +447,24 @@ describe Cronofy::Client do
391
447
  it_behaves_like 'a Cronofy request with mapped return value'
392
448
  end
393
449
 
450
+ context "when calendar_ids are passed" do
451
+ let(:params) do
452
+ {
453
+ calendar_ids: ["cal_1234_abcd", "cal_1234_efgh", "cal_5678_ijkl"],
454
+ }
455
+ end
456
+
457
+ let(:request_url) do
458
+ "#{request_url_prefix}?tzid=Etc/UTC" \
459
+ "&calendar_ids[]=cal_1234_abcd" \
460
+ "&calendar_ids[]=cal_1234_efgh" \
461
+ "&calendar_ids[]=cal_5678_ijkl"
462
+ end
463
+
464
+ it_behaves_like 'a Cronofy request'
465
+ it_behaves_like 'a Cronofy request with mapped return value'
466
+ end
467
+
394
468
  context "next page not found" do
395
469
  before do
396
470
  stub_request(:get, next_page_url)
@@ -474,7 +548,6 @@ describe Cronofy::Client do
474
548
  let(:method) { :post }
475
549
  let(:callback_url) { 'http://call.back/url' }
476
550
  let(:request_headers) { json_request_headers }
477
- let(:request_body) { hash_including(:callback_url => callback_url) }
478
551
 
479
552
  let(:correct_response_code) { 200 }
480
553
  let(:correct_response_body) do
@@ -491,10 +564,40 @@ describe Cronofy::Client do
491
564
  Cronofy::Channel.new(correct_response_body["channel"])
492
565
  end
493
566
 
494
- subject { client.create_channel(callback_url) }
567
+ context "with filters" do
568
+ let(:request_body) do
569
+ {
570
+ callback_url: callback_url,
571
+ filters: filters,
572
+ }
573
+ end
495
574
 
496
- it_behaves_like 'a Cronofy request'
497
- it_behaves_like 'a Cronofy request with mapped return value'
575
+ let(:filters) do
576
+ {
577
+ calendar_ids: ["cal_1234_abcd", "cal_1234_efgh", "cal_5678_ijkl"],
578
+ only_managed: true,
579
+ future_parameter: "for flexibility",
580
+ }
581
+ end
582
+
583
+ subject { client.create_channel(callback_url, filters: filters) }
584
+
585
+ it_behaves_like 'a Cronofy request'
586
+ it_behaves_like 'a Cronofy request with mapped return value'
587
+ end
588
+
589
+ context "without filters" do
590
+ let(:request_body) do
591
+ {
592
+ callback_url: callback_url,
593
+ }
594
+ end
595
+
596
+ subject { client.create_channel(callback_url) }
597
+
598
+ it_behaves_like 'a Cronofy request'
599
+ it_behaves_like 'a Cronofy request with mapped return value'
600
+ end
498
601
  end
499
602
 
500
603
  describe '#list_channels' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cronofy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergii Paryzhskyi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-04-26 00:00:00.000000000 Z
12
+ date: 2016-05-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: oauth2