cronofy 0.15.0 → 0.16.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 +4 -4
- data/lib/cronofy/client.rb +75 -0
- data/lib/cronofy/types.rb +18 -0
- data/lib/cronofy/version.rb +1 -1
- data/spec/lib/cronofy/client_spec.rb +132 -15
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12dca20c7955f97eac5e93f6f793e38a0363e0f1
|
4
|
+
data.tar.gz: a9017b0ee2708bb4cbb792507959658fd9f9a138
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c627b9fc733638bd60bf6248919a6fa6ccbfc27f3c0836d487ca9712867cb328b0d0dd5f80c7c1f97f001b1304646f0791cda7a632583da7132e034549b81690
|
7
|
+
data.tar.gz: 804e5ac5f5353050105435fda63a03bbbe2577b4e214464dd8c221782719c4c2f96530bbc45f081d38650d2e6dee6eb99510f80f961781e1e38f60461eeb5dbc
|
data/lib/cronofy/client.rb
CHANGED
@@ -649,8 +649,83 @@ module Cronofy
|
|
649
649
|
parse_collection(Resource, "resources", response)
|
650
650
|
end
|
651
651
|
|
652
|
+
# Public: Performs an availability query.
|
653
|
+
#
|
654
|
+
# options - The Hash options used to refine the selection (default: {}):
|
655
|
+
# :participants - An Array of participant groups (or required
|
656
|
+
# particpants for the simple case).
|
657
|
+
# :required_duration - An Integer representing the minimum number
|
658
|
+
# of minutes of availability required.
|
659
|
+
# :available_periods - An Array of available time periods Hashes,
|
660
|
+
# each must specify a start and end Time.
|
661
|
+
#
|
662
|
+
# Returns an Array of AvailablePeriods.
|
663
|
+
#
|
664
|
+
# Raises Cronofy::CredentialsMissingError if no credentials available.
|
665
|
+
# Raises Cronofy::AuthenticationFailureError if the access token is no
|
666
|
+
# longer valid.
|
667
|
+
# Raises Cronofy::AuthorizationFailureError if the access token does not
|
668
|
+
# include the required scope.
|
669
|
+
# Raises Cronofy::InvalidRequestError if the request contains invalid
|
670
|
+
# parameters.
|
671
|
+
# Raises Cronofy::TooManyRequestsError if the request exceeds the rate
|
672
|
+
# limits for the application.
|
673
|
+
def availability(options = {})
|
674
|
+
options[:participants] = map_availability_participants(options[:participants])
|
675
|
+
options[:required_duration] = map_availability_required_duration(options[:required_duration])
|
676
|
+
|
677
|
+
options[:available_periods].each do |params|
|
678
|
+
AVAILABLE_PERIODS_TIME_PARAMS.select { |tp| params.key?(tp) }.each do |tp|
|
679
|
+
params[tp] = to_iso8601(params[tp])
|
680
|
+
end
|
681
|
+
end
|
682
|
+
|
683
|
+
response = post("/v1/availability", options)
|
684
|
+
parse_collection(AvailablePeriod, "available_periods", response)
|
685
|
+
end
|
686
|
+
|
652
687
|
private
|
653
688
|
|
689
|
+
def map_availability_participants(participants)
|
690
|
+
case participants
|
691
|
+
when Hash
|
692
|
+
participants[:members].map! do |member|
|
693
|
+
map_availability_member(member)
|
694
|
+
end
|
695
|
+
|
696
|
+
unless participants.key?(:required)
|
697
|
+
participants[:required] = :all
|
698
|
+
end
|
699
|
+
|
700
|
+
[participants]
|
701
|
+
else
|
702
|
+
participants
|
703
|
+
end
|
704
|
+
end
|
705
|
+
|
706
|
+
def map_availability_member(member)
|
707
|
+
case member
|
708
|
+
when String
|
709
|
+
{ sub: member }
|
710
|
+
else
|
711
|
+
member
|
712
|
+
end
|
713
|
+
end
|
714
|
+
|
715
|
+
def map_availability_required_duration(required_duration)
|
716
|
+
case required_duration
|
717
|
+
when Fixnum
|
718
|
+
{ minutes: required_duration }
|
719
|
+
else
|
720
|
+
required_duration
|
721
|
+
end
|
722
|
+
end
|
723
|
+
|
724
|
+
AVAILABLE_PERIODS_TIME_PARAMS = %i{
|
725
|
+
start
|
726
|
+
end
|
727
|
+
}.freeze
|
728
|
+
|
654
729
|
FREE_BUSY_DEFAULT_PARAMS = { tzid: "Etc/UTC" }.freeze
|
655
730
|
FREE_BUSY_TIME_PARAMS = %i{
|
656
731
|
from
|
data/lib/cronofy/types.rb
CHANGED
@@ -278,4 +278,22 @@ module Cronofy
|
|
278
278
|
|
279
279
|
class PermissionsResponse < Hashie::Mash
|
280
280
|
end
|
281
|
+
|
282
|
+
class Participant < Hashie::Mash
|
283
|
+
end
|
284
|
+
|
285
|
+
module ParticipantEnumerable
|
286
|
+
def self.coerce(values)
|
287
|
+
values.map { |v| Participant.new(v) }
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
class AvailablePeriod < Hashie::Mash
|
292
|
+
include Hashie::Extensions::Coercion
|
293
|
+
|
294
|
+
coerce_key :start, EventTime
|
295
|
+
coerce_key :end, EventTime
|
296
|
+
|
297
|
+
coerce_key :participants, ParticipantEnumerable
|
298
|
+
end
|
281
299
|
end
|
data/lib/cronofy/version.rb
CHANGED
@@ -749,14 +749,14 @@ describe Cronofy::Client do
|
|
749
749
|
end
|
750
750
|
|
751
751
|
let(:correct_mapped_result) do
|
752
|
-
Cronofy::PermissionsResponse.new(correct_response_body[
|
752
|
+
Cronofy::PermissionsResponse.new(correct_response_body['permissions_request'])
|
753
753
|
end
|
754
754
|
|
755
755
|
describe "with uri supplied" do
|
756
756
|
let(:correct_response_body) do
|
757
757
|
{
|
758
|
-
permissions_request
|
759
|
-
url
|
758
|
+
"permissions_request" => {
|
759
|
+
"url" => "http://app.cronofy.com/permissions/"
|
760
760
|
}
|
761
761
|
}
|
762
762
|
end
|
@@ -770,8 +770,8 @@ describe Cronofy::Client do
|
|
770
770
|
describe "without uri supplied" do
|
771
771
|
let(:correct_response_body) do
|
772
772
|
{
|
773
|
-
permissions_request
|
774
|
-
accepted
|
773
|
+
"permissions_request" => {
|
774
|
+
"accepted" => true
|
775
775
|
}
|
776
776
|
}
|
777
777
|
end
|
@@ -1072,16 +1072,16 @@ describe Cronofy::Client do
|
|
1072
1072
|
let(:correct_response_code) { 200 }
|
1073
1073
|
let(:correct_response_body) do
|
1074
1074
|
{
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1075
|
+
'resources' => [
|
1076
|
+
{
|
1077
|
+
'email' => 'board-room-london@example.com',
|
1078
|
+
'name' => 'Board room (London)',
|
1079
|
+
},
|
1080
|
+
{
|
1081
|
+
'email' => 'board-room-madrid@example.com',
|
1082
|
+
'name' => 'Board room (Madrid)',
|
1083
|
+
}
|
1084
|
+
]
|
1085
1085
|
}
|
1086
1086
|
end
|
1087
1087
|
|
@@ -1095,4 +1095,121 @@ describe Cronofy::Client do
|
|
1095
1095
|
it_behaves_like 'a Cronofy request with mapped return value'
|
1096
1096
|
end
|
1097
1097
|
end
|
1098
|
+
|
1099
|
+
describe 'Availability', focus: true do
|
1100
|
+
describe '#availability' do
|
1101
|
+
let(:method) { :post }
|
1102
|
+
let(:request_url) { 'https://api.cronofy.com/v1/availability' }
|
1103
|
+
let(:request_headers) { json_request_headers }
|
1104
|
+
|
1105
|
+
let(:request_body) do
|
1106
|
+
{
|
1107
|
+
"participants" => [
|
1108
|
+
{
|
1109
|
+
"members" => [
|
1110
|
+
{ "sub" => "acc_567236000909002" },
|
1111
|
+
{ "sub" => "acc_678347111010113" }
|
1112
|
+
],
|
1113
|
+
"required" => "all"
|
1114
|
+
}
|
1115
|
+
],
|
1116
|
+
"required_duration" => { "minutes" => 60 },
|
1117
|
+
"available_periods" => [
|
1118
|
+
{
|
1119
|
+
"start" => "2017-01-03T09:00:00Z",
|
1120
|
+
"end" => "2017-01-03T18:00:00Z"
|
1121
|
+
},
|
1122
|
+
{
|
1123
|
+
"start" => "2017-01-04T09:00:00Z",
|
1124
|
+
"end" => "2017-01-04T18:00:00Z"
|
1125
|
+
}
|
1126
|
+
]
|
1127
|
+
}
|
1128
|
+
end
|
1129
|
+
|
1130
|
+
let(:correct_response_code) { 200 }
|
1131
|
+
let(:correct_response_body) do
|
1132
|
+
{
|
1133
|
+
"available_periods" => [
|
1134
|
+
{
|
1135
|
+
"start" => "2017-01-03T09:00:00Z",
|
1136
|
+
"end" => "2017-01-03T11:00:00Z",
|
1137
|
+
"participants" => [
|
1138
|
+
{ "sub" => "acc_567236000909002" },
|
1139
|
+
{ "sub" => "acc_678347111010113" }
|
1140
|
+
]
|
1141
|
+
},
|
1142
|
+
{
|
1143
|
+
"start" => "2017-01-03T14 =>00:00Z",
|
1144
|
+
"end" => "2017-01-03T16:00:00Z",
|
1145
|
+
"participants" => [
|
1146
|
+
{ "sub" => "acc_567236000909002" },
|
1147
|
+
{ "sub" => "acc_678347111010113" }
|
1148
|
+
]
|
1149
|
+
},
|
1150
|
+
{
|
1151
|
+
"start" => "2017-01-04T11:00:00Z",
|
1152
|
+
"end" => "2017-01-04T17:00:00Z",
|
1153
|
+
"participants" => [
|
1154
|
+
{ "sub" => "acc_567236000909002" },
|
1155
|
+
{ "sub" => "acc_678347111010113" }
|
1156
|
+
]
|
1157
|
+
},
|
1158
|
+
]
|
1159
|
+
}
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
let(:correct_mapped_result) do
|
1163
|
+
correct_response_body['available_periods'].map { |ap| Cronofy::AvailablePeriod.new(ap) }
|
1164
|
+
end
|
1165
|
+
|
1166
|
+
subject { client.availability(participants: participants, required_duration: required_duration, available_periods: available_periods) }
|
1167
|
+
|
1168
|
+
context "fully specified" do
|
1169
|
+
let(:participants) do
|
1170
|
+
[
|
1171
|
+
{
|
1172
|
+
members: [
|
1173
|
+
{ sub: "acc_567236000909002" },
|
1174
|
+
{ sub: "acc_678347111010113" },
|
1175
|
+
],
|
1176
|
+
required: :all,
|
1177
|
+
}
|
1178
|
+
]
|
1179
|
+
end
|
1180
|
+
|
1181
|
+
let(:required_duration) do
|
1182
|
+
{ minutes: 60 }
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
let(:available_periods) do
|
1186
|
+
[
|
1187
|
+
{ start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
|
1188
|
+
{ start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
|
1189
|
+
]
|
1190
|
+
end
|
1191
|
+
|
1192
|
+
it_behaves_like 'a Cronofy request'
|
1193
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
1194
|
+
end
|
1195
|
+
|
1196
|
+
context "simple values to defaults" do
|
1197
|
+
let(:participants) do
|
1198
|
+
{ members: %w{acc_567236000909002 acc_678347111010113} }
|
1199
|
+
end
|
1200
|
+
|
1201
|
+
let(:required_duration) { 60 }
|
1202
|
+
|
1203
|
+
let(:available_periods) do
|
1204
|
+
[
|
1205
|
+
{ start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
|
1206
|
+
{ start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
|
1207
|
+
]
|
1208
|
+
end
|
1209
|
+
|
1210
|
+
it_behaves_like 'a Cronofy request'
|
1211
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
1212
|
+
end
|
1213
|
+
end
|
1214
|
+
end
|
1098
1215
|
end
|
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.
|
4
|
+
version: 0.16.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: 2017-01-
|
12
|
+
date: 2017-01-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: oauth2
|
@@ -148,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
148
|
version: '0'
|
149
149
|
requirements: []
|
150
150
|
rubyforge_project:
|
151
|
-
rubygems_version: 2.6.
|
151
|
+
rubygems_version: 2.6.6
|
152
152
|
signing_key:
|
153
153
|
specification_version: 4
|
154
154
|
summary: Cronofy - one API for all the calendars
|