cronofy 0.29.0 → 0.30.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
2
  SHA1:
3
- metadata.gz: ed8c9e154c5eba55604233b0d6c521fcce77288e
4
- data.tar.gz: c2a0fd0f4d6ea9413cbe802de3c98ec8ef491e54
3
+ metadata.gz: 855b1d8409f077ff215dc67c60607b3eb3845164
4
+ data.tar.gz: 60ded29938e28d782fc0eee85b07ef37ecbbbac0
5
5
  SHA512:
6
- metadata.gz: 80ae8094e1805000f4882d3ead3d2f7badf99e4ac080a76833ae1386ef718768a96f4314b8848740056ca6acd2b59890c9463820472e151d9072c314e70d3af8
7
- data.tar.gz: e91f2eca9e6916ec8db19e931dcf5813da98c99acb682a702a75fd9bfe3262d991cbfde6f40659d0cb5546125412a5c04857570aa746c8b3cd0f52e1b24156a6
6
+ metadata.gz: dc85f2f4bd445ba656e08ab9d62e40afdbcb03b2c86929f79b7975e81d759b30a507374b0e6c43b145c835611f711fa418bf4bd5da2eac7f85a9385e2b0ebd02
7
+ data.tar.gz: bc9795fce358b5e0c7d5b0412bc2de728a764a36a94e800b10da0850101f9f9f49c390db939cf03081117e89057e542b94b1d770fb624647790129934a459e33
@@ -1,3 +1,8 @@
1
+ ## [0.30.0]
2
+
3
+ * Added support for sequencing, buffers and intervals [#62]
4
+ * Dropped support for Ruby 2.1
5
+
1
6
  ## [0.29.0]
2
7
 
3
8
  * Added types for propose new time replies [#60]
@@ -121,6 +126,7 @@
121
126
  [0.28.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.28.0
122
127
  [0.28.1]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.28.1
123
128
  [0.29.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.29.0
129
+ [0.30.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.30.0
124
130
 
125
131
  [#13]: https://github.com/cronofy/cronofy-ruby/pull/13
126
132
  [#16]: https://github.com/cronofy/cronofy-ruby/pull/16
@@ -152,3 +158,4 @@
152
158
  [#58]: https://github.com/cronofy/cronofy-ruby/pull/58
153
159
  [#59]: https://github.com/cronofy/cronofy-ruby/pull/59
154
160
  [#60]: https://github.com/cronofy/cronofy-ruby/pull/60
161
+ [#62]: https://github.com/cronofy/cronofy-ruby/pull/62
@@ -795,6 +795,10 @@ module Cronofy
795
795
  # of minutes of availability required.
796
796
  # :available_periods - An Array of available time periods Hashes,
797
797
  # each must specify a start and end Time.
798
+ # :start_interval - An Integer representing the start interval
799
+ # of minutes for the availability query.
800
+ # :buffer - An Hash containing the buffer to apply to
801
+ # the availability query.
798
802
  #
799
803
  # Returns an Array of AvailablePeriods.
800
804
  #
@@ -811,12 +815,59 @@ module Cronofy
811
815
  options[:participants] = map_availability_participants(options[:participants])
812
816
  options[:required_duration] = map_availability_required_duration(options[:required_duration])
813
817
 
818
+ if options[:start_interval]
819
+ options[:start_interval] = map_availability_required_duration(options[:start_interval])
820
+ end
821
+
822
+ if buffer = options[:buffer]
823
+ options[:buffer] = map_availability_buffer(buffer)
824
+ end
825
+
814
826
  translate_available_periods(options[:available_periods])
815
827
 
816
828
  response = post("/v1/availability", options)
817
829
  parse_collection(AvailablePeriod, "available_periods", response)
818
830
  end
819
831
 
832
+ # Public: Performs an sequenced availability query.
833
+ #
834
+ # options - The Hash options used to refine the selection (default: {}):
835
+ # :sequence - An Array of sequence defintions containing
836
+ # a Hash of:
837
+ # :sequence_id - A String to uniquely identify this part
838
+ # of the proposed sequence.
839
+ # :ordinal - An integer to define the ordering of the
840
+ # proposed sequence. (Optional)
841
+ # :participants - An Array of participant groups or a Hash
842
+ # for a single participant group.
843
+ # :required_duration - An Integer representing the minimum
844
+ # number of minutes of availability required.
845
+ # :start_interval - An Integer representing the start interval
846
+ # of minutes for the availability query.
847
+ # :buffer - An Hash containing the buffer to apply to
848
+ # the availability query.
849
+ # :available_periods - An Array of available time periods Hashes,
850
+ # each must specify a start and end Time.
851
+ #
852
+ # Returns an Array of Sequences.
853
+ #
854
+ # Raises Cronofy::CredentialsMissingError if no credentials available.
855
+ # Raises Cronofy::AuthenticationFailureError if the access token is no
856
+ # longer valid.
857
+ # Raises Cronofy::AuthorizationFailureError if the access token does not
858
+ # include the required scope.
859
+ # Raises Cronofy::InvalidRequestError if the request contains invalid
860
+ # parameters.
861
+ # Raises Cronofy::TooManyRequestsError if the request exceeds the rate
862
+ # limits for the application.
863
+ def sequenced_availability(options = {})
864
+ options[:sequence] = map_availability_sequence(options[:sequence])
865
+
866
+ translate_available_periods(options[:available_periods])
867
+
868
+ response = post("/v1/sequenced_availability", options)
869
+ parse_collection(Sequence, "sequences", response)
870
+ end
820
871
 
821
872
  # Public: Generates an add to calendar link to start the OAuth process with
822
873
  # an event to be automatically upserted
@@ -959,6 +1010,10 @@ module Cronofy
959
1010
  # :required_duration - A hash stating the length of time the event will
960
1011
  # last for
961
1012
  # :available_periods - A hash stating the available periods for the event
1013
+ # :start_interval - An Integer representing the start interval
1014
+ # of minutes for the availability query.
1015
+ # :buffer - An Hash containing the buffer to apply to
1016
+ # the availability query.
962
1017
  # target_calendars - An array of hashes stating into which calendars to insert the created
963
1018
  # event
964
1019
  #
@@ -1001,7 +1056,7 @@ module Cronofy
1001
1056
  # }]
1002
1057
  # )
1003
1058
  #
1004
- # See http://www.cronofy.com/developers/api#upsert-event for reference.
1059
+ # See http://www.cronofy.com/developers/api#real-time-scheduling for reference.
1005
1060
  #
1006
1061
  # Returns a AddToCalendarResponse.
1007
1062
  #
@@ -1021,6 +1076,14 @@ module Cronofy
1021
1076
  if availability = args[:availability]
1022
1077
  availability[:participants] = map_availability_participants(availability[:participants])
1023
1078
  availability[:required_duration] = map_availability_required_duration(availability[:required_duration])
1079
+
1080
+ if value = availability[:start_interval]
1081
+ availability[:start_interval] = map_availability_required_duration(value)
1082
+ end
1083
+
1084
+ if buffer = availability[:buffer]
1085
+ availability[:buffer] = map_availability_buffer(buffer)
1086
+ end
1024
1087
  end
1025
1088
 
1026
1089
  translate_available_periods(availability[:available_periods])
@@ -1030,6 +1093,92 @@ module Cronofy
1030
1093
  parse_json(AddToCalendarResponse, nil , response)
1031
1094
  end
1032
1095
 
1096
+ # Public: Generates an real time sequencing link to start the OAuth process with
1097
+ # an event to be automatically upserted
1098
+ #
1099
+ # oauth - A Hash describing the OAuth flow required:
1100
+ # :scope - A String representing the scopes to ask for
1101
+ # within the OAuth flow
1102
+ # :redirect_uri - A String containing a url to redirect the
1103
+ # user to after completing the OAuth flow.
1104
+ # :scope - A String representing additional state to
1105
+ # be passed within the OAuth flow.
1106
+ #
1107
+ # availability - A Hash describing the availability details for the event:
1108
+ # :sequence - An Array of sequence defintions containing
1109
+ # a Hash of:
1110
+ # :sequence_id - A String to uniquely identify this part
1111
+ # of the proposed sequence.
1112
+ # :ordinal - An integer to define the ordering of the
1113
+ # proposed sequence. (Optional)
1114
+ # :participants - An Array of participant groups or a Hash
1115
+ # for a single participant group.
1116
+ # :required_duration - An Integer representing the minimum
1117
+ # number of minutes of availability required.
1118
+ # :start_interval - An Integer representing the start interval
1119
+ # of minutes for the availability query.
1120
+ # :buffer - An Hash containing the buffer to apply to
1121
+ # the availability query.
1122
+ # :event - A Hash describing the event:
1123
+ # :event_id - A String uniquely identifying the event for
1124
+ # your application (note: this is NOT an ID
1125
+ # generated by Cronofy).
1126
+ # :summary - A String to use as the summary, sometimes
1127
+ # referred to as the name or title, of the
1128
+ # event.
1129
+ # :description - A String to use as the description, sometimes
1130
+ # referred to as the notes or body, of the
1131
+ # event.
1132
+ # :url - The URL associated with the event.
1133
+ # :location - A Hash describing the location of the event
1134
+ # with symbolized keys (optional):
1135
+ # :description - A String describing the
1136
+ # location.
1137
+ # :lat - A String of the location's latitude.
1138
+ # :long - A String of the location's longitude.
1139
+ # :reminders - An Array of Hashes describing the desired
1140
+ # reminders for the event. Reminders should be
1141
+ # specified in priority order as, for example,
1142
+ # when the underlying provider only supports a
1143
+ # single reminder then the first reminder will
1144
+ # be used.
1145
+ # :minutes - An Integer specifying the number
1146
+ # of minutes before the start of the
1147
+ # event that the reminder should
1148
+ # occur.
1149
+ # :transparency - The transparency state for the event (optional).
1150
+ # Accepted values are "transparent" and "opaque".
1151
+ # :attendees - A Hash of :invite and :reject, each of which is
1152
+ # an array of invitees to invite to or reject from
1153
+ # the event. Invitees are represented by a hash of
1154
+ # :email and :display_name (optional).
1155
+ # :available_periods - A hash stating the available periods for the event
1156
+ # target_calendars - An array of hashes stating into which calendars to insert the created
1157
+ # event
1158
+ # Raises Cronofy::CredentialsMissingError if no credentials available.
1159
+ # Raises Cronofy::AuthenticationFailureError if the access token is no
1160
+ # longer valid.
1161
+ # Raises Cronofy::AuthorizationFailureError if the access token does not
1162
+ # include the required scope.
1163
+ # Raises Cronofy::NotFoundError if the calendar does not exist.
1164
+ # Raises Cronofy::InvalidRequestError if the request contains invalid
1165
+ # parameters.
1166
+ # Raises Cronofy::TooManyRequestsError if the request exceeds the rate
1167
+ # limits for the application.
1168
+ def real_time_sequencing(args)
1169
+ body = args.merge(client_id: @client_id, client_secret: @client_secret)
1170
+
1171
+ if availability = args[:availability]
1172
+ availability[:sequence] = map_availability_sequence(availability[:sequence])
1173
+ translate_available_periods(availability[:available_periods]) if availability[:available_periods]
1174
+ end
1175
+
1176
+ body[:availability] = availability
1177
+
1178
+ response = post("/v1/real_time_sequencing", body)
1179
+ parse_json(AddToCalendarResponse, nil , response)
1180
+ end
1181
+
1033
1182
  # Public: Creates a link_token to allow explicitly linking of an account
1034
1183
  #
1035
1184
  # See https://www.cronofy.com/developers/api/alpha/#auth-explicit-linking for
@@ -1069,7 +1218,7 @@ module Cronofy
1069
1218
  # send notifications to about user interactions with
1070
1219
  # the Smart Invite.
1071
1220
  # recipient - A Hash containing the intended recipient of the invite
1072
- # :email - A String for thee email address you are
1221
+ # :email - A String for the email address you are
1073
1222
  # going to send the Smart Invite to.
1074
1223
  # event - A Hash describing the event with symbolized keys:
1075
1224
  # :summary - A String to use as the summary, sometimes
@@ -1101,6 +1250,9 @@ module Cronofy
1101
1250
  # Accepted values are "transparent" and "opaque".
1102
1251
  # :color - The color of the event (optional).
1103
1252
  #
1253
+ # organizer - A Hash containing the details of the organizer.
1254
+ # :name - A String value for the display name of the
1255
+ # event organizer
1104
1256
  # Examples
1105
1257
  #
1106
1258
  # client.upsert_smart_invite(
@@ -1118,6 +1270,9 @@ module Cronofy
1118
1270
  # description: "Board room",
1119
1271
  # lat: "1.2345",
1120
1272
  # long: "0.1234"
1273
+ # },
1274
+ # organizer: {
1275
+ # name: "Smart invite application"
1121
1276
  # }
1122
1277
  # )
1123
1278
  #
@@ -1252,6 +1407,71 @@ module Cronofy
1252
1407
  end
1253
1408
  end
1254
1409
 
1410
+ def map_availability_buffer(buffer)
1411
+ result = {}
1412
+
1413
+ unless buffer.is_a?(Hash)
1414
+ return result
1415
+ end
1416
+
1417
+ if before_buffer = buffer[:before]
1418
+ result[:before] = map_buffer_details(before_buffer)
1419
+ end
1420
+
1421
+ if after_buffer = buffer[:after]
1422
+ result[:after] = map_buffer_details(after_buffer)
1423
+ end
1424
+
1425
+ result
1426
+ end
1427
+
1428
+ def map_buffer_details(buffer)
1429
+ result = map_availability_required_duration(buffer)
1430
+
1431
+ if minimum_buffer = buffer[:minimum]
1432
+ result[:minimum] = map_availability_required_duration(minimum_buffer)
1433
+ end
1434
+
1435
+ if maximum_buffer = buffer[:maximum]
1436
+ result[:maximum] = map_availability_required_duration(maximum_buffer)
1437
+ end
1438
+
1439
+ result
1440
+ end
1441
+
1442
+ def map_availability_sequence(sequence)
1443
+ case sequence
1444
+ when Enumerable
1445
+ sequence.map do |sequence_item|
1446
+ hash = {}
1447
+
1448
+ if value = sequence_item[:participants]
1449
+ hash[:participants] = map_availability_participants(value)
1450
+ end
1451
+
1452
+ if value = sequence_item[:required_duration]
1453
+ hash[:required_duration] = map_availability_required_duration(value)
1454
+ end
1455
+
1456
+ if sequence_item[:available_periods]
1457
+ translate_available_periods(sequence_item[:available_periods])
1458
+ end
1459
+
1460
+ if value = sequence_item[:start_interval]
1461
+ hash[:start_interval] = map_availability_required_duration(value)
1462
+ end
1463
+
1464
+ if buffer = sequence_item[:buffer]
1465
+ hash[:buffer] = map_availability_buffer(buffer)
1466
+ end
1467
+
1468
+ sequence_item.merge(hash)
1469
+ end
1470
+ else
1471
+ sequence
1472
+ end
1473
+ end
1474
+
1255
1475
  AVAILABLE_PERIODS_TIME_PARAMS = %i{
1256
1476
  start
1257
1477
  end
@@ -65,6 +65,9 @@ module Cronofy
65
65
  class ServerError < APIError
66
66
  end
67
67
 
68
+ class PaymentRequiredError < APIError
69
+ end
70
+
68
71
  class UnknownError < APIError
69
72
  end
70
73
 
@@ -73,6 +76,7 @@ module Cronofy
73
76
  ERROR_MAP = {
74
77
  400 => BadRequestError,
75
78
  401 => AuthenticationFailureError,
79
+ 402 => PaymentRequiredError,
76
80
  403 => AuthorizationFailureError,
77
81
  404 => NotFoundError,
78
82
  422 => InvalidRequestError,
@@ -354,6 +354,23 @@ module Cronofy
354
354
  end
355
355
  end
356
356
 
357
+ class SequenceItem < CronofyMash
358
+ coerce_key :start, EventTime
359
+ coerce_key :end, EventTime
360
+
361
+ coerce_key :participants, ParticipantEnumerable
362
+ end
363
+
364
+ module SequenceItemEnumerable
365
+ def self.coerce(values)
366
+ values.map { |v| SequenceItem.new(v) }
367
+ end
368
+ end
369
+
370
+ class Sequence < CronofyMash
371
+ coerce_key :sequence, SequenceItemEnumerable
372
+ end
373
+
357
374
  class AvailablePeriod < CronofyMash
358
375
  coerce_key :start, EventTime
359
376
  coerce_key :end, EventTime
@@ -1,3 +1,3 @@
1
1
  module Cronofy
2
- VERSION = "0.29.0".freeze
2
+ VERSION = "0.30.0".freeze
3
3
  end
@@ -1283,6 +1283,77 @@ describe Cronofy::Client do
1283
1283
  it_behaves_like 'a Cronofy request with mapped return value'
1284
1284
  end
1285
1285
 
1286
+ context "buffer and start_interval" do
1287
+ let(:request_body) do
1288
+ {
1289
+ "participants" => [
1290
+ {
1291
+ "members" => [
1292
+ { "sub" => "acc_567236000909002" },
1293
+ { "sub" => "acc_678347111010113" }
1294
+ ],
1295
+ "required" => "all"
1296
+ }
1297
+ ],
1298
+ "required_duration" => { "minutes" => 60 },
1299
+ "buffer" => {
1300
+ "before": { "minutes": 30 },
1301
+ "after": { "minutes": 60 },
1302
+ },
1303
+ "start_interval" => { "minutes" => 60 },
1304
+ "available_periods" => [
1305
+ {
1306
+ "start" => "2017-01-03T09:00:00Z",
1307
+ "end" => "2017-01-03T18:00:00Z"
1308
+ },
1309
+ {
1310
+ "start" => "2017-01-04T09:00:00Z",
1311
+ "end" => "2017-01-04T18:00:00Z"
1312
+ },
1313
+ ]
1314
+ }
1315
+ end
1316
+
1317
+ let(:participants) do
1318
+ [
1319
+ {
1320
+ members: [
1321
+ { sub: "acc_567236000909002" },
1322
+ { sub: "acc_678347111010113" },
1323
+ ],
1324
+ required: :all,
1325
+ }
1326
+ ]
1327
+ end
1328
+
1329
+ let(:buffer) do
1330
+ {
1331
+ before: { minutes: 30 },
1332
+ after: { minutes: 60 },
1333
+ }
1334
+ end
1335
+
1336
+ let(:start_interval) do
1337
+ { minutes: 60 }
1338
+ end
1339
+
1340
+ let(:required_duration) do
1341
+ { minutes: 60 }
1342
+ end
1343
+
1344
+ let(:available_periods) do
1345
+ [
1346
+ { start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
1347
+ { start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
1348
+ ]
1349
+ end
1350
+
1351
+ subject { client.availability(participants: participants, required_duration: required_duration, available_periods: available_periods, buffer: buffer, start_interval: start_interval) }
1352
+
1353
+ it_behaves_like 'a Cronofy request'
1354
+ it_behaves_like 'a Cronofy request with mapped return value'
1355
+ end
1356
+
1286
1357
  context "member-specific available periods" do
1287
1358
  let(:request_body) do
1288
1359
  {
@@ -1509,6 +1580,161 @@ describe Cronofy::Client do
1509
1580
  end
1510
1581
  end
1511
1582
 
1583
+ describe 'Sequenced Availability' do
1584
+ describe '#sequenced_availability' do
1585
+ let(:method) { :post }
1586
+ let(:request_url) { 'https://api.cronofy.com/v1/sequenced_availability' }
1587
+ let(:request_headers) { json_request_headers }
1588
+
1589
+ let(:request_body) do
1590
+ {
1591
+ "sequence" => [
1592
+ {
1593
+ "sequence_id" => 1234,
1594
+ "ordinal" => 1,
1595
+ "participants" => [
1596
+ {
1597
+ "members" => [
1598
+ { "sub" => "acc_567236000909002" },
1599
+ { "sub" => "acc_678347111010113" }
1600
+ ],
1601
+ "required" => "all"
1602
+ }
1603
+ ],
1604
+ "required_duration" => { "minutes" => 60 },
1605
+ "start_interval" => { "minutes" => 60 },
1606
+ "buffer" => {
1607
+ "before": {
1608
+ "minimum": { "minutes" => 30 },
1609
+ "maximum": { "minutes" => 45 },
1610
+ },
1611
+ "after": {
1612
+ "minimum": { "minutes" => 45 },
1613
+ "maximum": { "minutes" => 60 },
1614
+ },
1615
+ }
1616
+ },
1617
+ {
1618
+ "sequence_id" => 4567,
1619
+ "ordinal" => 2,
1620
+ "participants" => [
1621
+ {
1622
+ "members" => [
1623
+ { "sub" => "acc_567236000909002" },
1624
+ { "sub" => "acc_678347111010113" }
1625
+ ],
1626
+ "required" => "all"
1627
+ }
1628
+ ],
1629
+ "required_duration" => { "minutes" => 60 },
1630
+ }
1631
+ ],
1632
+ "available_periods" => [
1633
+ {
1634
+ "start" => "2017-01-03T09:00:00Z",
1635
+ "end" => "2017-01-03T18:00:00Z"
1636
+ },
1637
+ {
1638
+ "start" => "2017-01-04T09:00:00Z",
1639
+ "end" => "2017-01-04T18:00:00Z"
1640
+ }
1641
+ ]
1642
+ }
1643
+ end
1644
+
1645
+ let(:correct_response_code) { 200 }
1646
+ let(:correct_response_body) do
1647
+ {
1648
+ "sequences" => [
1649
+ {
1650
+ "sequence" => [
1651
+ {
1652
+ "sequence_id" => 1234,
1653
+ "start" => "2017-01-03T09:00:00Z",
1654
+ "end" => "2017-01-03T11:00:00Z",
1655
+ "participants" => [
1656
+ { "sub" => "acc_567236000909002" },
1657
+ { "sub" => "acc_678347111010113" }
1658
+ ]
1659
+ },
1660
+ {
1661
+ "sequence_id" => 4567,
1662
+ "start" => "2017-01-03T14:00:00Z",
1663
+ "end" => "2017-01-03T16:00:00Z",
1664
+ "participants" => [
1665
+ { "sub" => "acc_567236000909002" },
1666
+ { "sub" => "acc_678347111010113" }
1667
+ ]
1668
+ },
1669
+ ]
1670
+ }
1671
+ ]
1672
+ }
1673
+ end
1674
+
1675
+ let(:correct_mapped_result) do
1676
+ correct_response_body['sequences'].map { |sequence| Cronofy::Sequence.new(sequence) }
1677
+ end
1678
+
1679
+ let(:args) do
1680
+ {
1681
+ sequence: [{
1682
+ sequence_id: 1234,
1683
+ ordinal: 1,
1684
+ participants: participants,
1685
+ required_duration: required_duration,
1686
+ start_interval: { minutes: 60 },
1687
+ buffer: {
1688
+ before: {
1689
+ minimum: { minutes: 30 },
1690
+ maximum: { minutes: 45 },
1691
+ },
1692
+ after: {
1693
+ minimum: { minutes: 45 },
1694
+ maximum: { minutes: 60 },
1695
+ },
1696
+ },
1697
+ },
1698
+ {
1699
+ sequence_id: 4567,
1700
+ ordinal: 2,
1701
+ participants: participants,
1702
+ required_duration: required_duration,
1703
+ }],
1704
+ available_periods: available_periods
1705
+ }
1706
+ end
1707
+
1708
+ subject { client.sequenced_availability(args) }
1709
+
1710
+ let(:participants) do
1711
+ [
1712
+ {
1713
+ members: [
1714
+ { sub: "acc_567236000909002" },
1715
+ { sub: "acc_678347111010113" },
1716
+ ],
1717
+ required: :all,
1718
+ }
1719
+ ]
1720
+ end
1721
+
1722
+ let(:required_duration) do
1723
+ { minutes: 60 }
1724
+ end
1725
+
1726
+ let(:available_periods) do
1727
+ [
1728
+ { start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
1729
+ { start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
1730
+ ]
1731
+ end
1732
+
1733
+ it_behaves_like 'a Cronofy request'
1734
+ it_behaves_like 'a Cronofy request with mapped return value'
1735
+ end
1736
+ end
1737
+
1512
1738
  describe "Add to calendar" do
1513
1739
  let(:request_url) { "https://api.cronofy.com/v1/add_to_calendar" }
1514
1740
  let(:url) { URI("https://example.com") }
@@ -1686,7 +1912,12 @@ describe Cronofy::Client do
1686
1912
  available_periods: [{
1687
1913
  start: Time.utc(2017, 1, 1, 9, 00),
1688
1914
  end: Time.utc(2017, 1, 1, 17, 00),
1689
- }]
1915
+ }],
1916
+ start_interval: { minutes: 60 },
1917
+ buffer: {
1918
+ before: { minutes: 30 },
1919
+ after: { minutes: 45 },
1920
+ }
1690
1921
  }
1691
1922
  end
1692
1923
 
@@ -1702,6 +1933,11 @@ describe Cronofy::Client do
1702
1933
  }
1703
1934
  ],
1704
1935
  required_duration: { minutes: 60 },
1936
+ start_interval: { minutes: 60 },
1937
+ buffer: {
1938
+ before: { minutes: 30 },
1939
+ after: { minutes: 45 },
1940
+ },
1705
1941
  available_periods: [{
1706
1942
  start: "2017-01-01T09:00:00Z",
1707
1943
  end: "2017-01-01T17:00:00Z",
@@ -1755,6 +1991,189 @@ describe Cronofy::Client do
1755
1991
 
1756
1992
  end
1757
1993
 
1994
+ describe "Real time sequencing" do
1995
+ let(:request_url) { "https://api.cronofy.com/v1/real_time_sequencing" }
1996
+ let(:url) { URI("https://example.com") }
1997
+ let(:method) { :post }
1998
+ let(:request_headers) { json_request_headers }
1999
+
2000
+ let(:location) { { :description => "Board room" } }
2001
+ let(:transparency) { nil }
2002
+ let(:client_id) { 'example_id' }
2003
+ let(:client_secret) { 'example_secret' }
2004
+ let(:scope) { 'read_events delete_events' }
2005
+ let(:state) { 'example_state' }
2006
+ let(:redirect_uri) { 'http://example.com/redirect' }
2007
+
2008
+ let(:client) do
2009
+ Cronofy::Client.new(
2010
+ client_id: client_id,
2011
+ client_secret: client_secret,
2012
+ access_token: token,
2013
+ )
2014
+ end
2015
+
2016
+ let(:event) do
2017
+ {
2018
+ :event_id => "qTtZdczOccgaPncGJaCiLg",
2019
+ :summary => "Board meeting",
2020
+ :description => "Discuss plans for the next quarter.",
2021
+ :url => url,
2022
+ :location => location,
2023
+ :transparency => transparency,
2024
+ :reminders => [
2025
+ { :minutes => 60 },
2026
+ { :minutes => 0 },
2027
+ { :minutes => 10 },
2028
+ ],
2029
+ }
2030
+ end
2031
+
2032
+ let(:oauth_body) do
2033
+ {
2034
+ scope: scope,
2035
+ redirect_uri: redirect_uri,
2036
+ state: state,
2037
+ }
2038
+ end
2039
+
2040
+ let(:target_calendars) do
2041
+ [
2042
+ {
2043
+ sub: "acc_567236000909002",
2044
+ calendar_id: "cal_n23kjnwrw2_jsdfjksn234",
2045
+ }
2046
+ ]
2047
+ end
2048
+
2049
+ let(:availability) do
2050
+ {
2051
+ sequence: [
2052
+ {
2053
+ participants: [
2054
+ {
2055
+ members: [{
2056
+ sub: "acc_567236000909002",
2057
+ calendar_ids: ["cal_n23kjnwrw2_jsdfjksn234"]
2058
+ }],
2059
+ required: 'all'
2060
+ }
2061
+ ],
2062
+ required_duration: { minutes: 60 },
2063
+ start_interval: { minutes: 60 },
2064
+ available_periods: [{
2065
+ start: Time.utc(2017, 1, 1, 9, 00),
2066
+ end: Time.utc(2017, 1, 1, 17, 00),
2067
+ }],
2068
+ event: event,
2069
+ buffer: {
2070
+ before: {
2071
+ minimum: { minutes: 30 },
2072
+ maximum: { minutes: 30 },
2073
+ },
2074
+ after: {
2075
+ minimum: { minutes: 30 },
2076
+ maximum: { minutes: 30 },
2077
+ }
2078
+ }
2079
+ }
2080
+ ],
2081
+ available_periods: [{
2082
+ start: Time.utc(2017, 1, 1, 9, 00),
2083
+ end: Time.utc(2017, 1, 1, 17, 00),
2084
+ }],
2085
+ }
2086
+ end
2087
+
2088
+ let(:mapped_availability) do
2089
+ {
2090
+ sequence: [
2091
+ {
2092
+ participants: [
2093
+ {
2094
+ members: [{
2095
+ sub: "acc_567236000909002",
2096
+ calendar_ids: ["cal_n23kjnwrw2_jsdfjksn234"]
2097
+ }],
2098
+ required: 'all'
2099
+ }
2100
+ ],
2101
+ required_duration: { minutes: 60 },
2102
+ start_interval: { minutes: 60 },
2103
+ available_periods: [{
2104
+ start: "2017-01-01T09:00:00Z",
2105
+ end: "2017-01-01T17:00:00Z",
2106
+ }],
2107
+ event: mapped_event,
2108
+ buffer: {
2109
+ before: {
2110
+ minimum: { minutes: 30 },
2111
+ maximum: { minutes: 30 },
2112
+ },
2113
+ after: {
2114
+ minimum: { minutes: 30 },
2115
+ maximum: { minutes: 30 },
2116
+ }
2117
+ }
2118
+ }
2119
+ ],
2120
+ available_periods: [{
2121
+ start: "2017-01-01T09:00:00Z",
2122
+ end: "2017-01-01T17:00:00Z",
2123
+ }]
2124
+ }
2125
+ end
2126
+
2127
+ let(:mapped_event) do
2128
+ {
2129
+ :event_id => "qTtZdczOccgaPncGJaCiLg",
2130
+ :summary => "Board meeting",
2131
+ :description => "Discuss plans for the next quarter.",
2132
+ :url => url.to_s,
2133
+ :location => location,
2134
+ :transparency => transparency,
2135
+ :reminders => [
2136
+ { :minutes => 60 },
2137
+ { :minutes => 0 },
2138
+ { :minutes => 10 },
2139
+ ],
2140
+ }
2141
+ end
2142
+
2143
+ let(:args) do
2144
+ {
2145
+ oauth: oauth_body,
2146
+ event: event,
2147
+ target_calendars: target_calendars,
2148
+ availability: availability,
2149
+ }
2150
+ end
2151
+
2152
+ let(:request_body) do
2153
+ {
2154
+ client_id: client_id,
2155
+ client_secret: client_secret,
2156
+ oauth: oauth_body,
2157
+ event: mapped_event,
2158
+ target_calendars: target_calendars,
2159
+ availability: mapped_availability,
2160
+ }
2161
+ end
2162
+ let(:correct_response_code) { 202 }
2163
+ let(:correct_response_body) do
2164
+ {
2165
+ oauth_url: "http://www.example.com/oauth?token=example"
2166
+ }
2167
+ end
2168
+
2169
+ subject { client.real_time_sequencing(args) }
2170
+
2171
+ context 'when start/end are Times' do
2172
+ it_behaves_like 'a Cronofy request'
2173
+ end
2174
+
2175
+ end
2176
+
1758
2177
  describe "Specified data centre" do
1759
2178
  let(:data_centre) { :de }
1760
2179
 
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.29.0
4
+ version: 0.30.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: 2018-03-26 00:00:00.000000000 Z
12
+ date: 2018-08-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: oauth2