cronofy 0.35.0 → 0.37.2
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/CHANGELOG.md +30 -0
- data/README.md +8 -7
- data/cronofy.gemspec +3 -3
- data/lib/cronofy.rb +27 -11
- data/lib/cronofy/auth.rb +37 -7
- data/lib/cronofy/client.rb +98 -10
- data/lib/cronofy/version.rb +1 -1
- data/spec/lib/cronofy/auth_spec.rb +92 -12
- data/spec/lib/cronofy/client_spec.rb +264 -4
- metadata +25 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e09c2030d7992753a4e8f0e52af1d00d2ab6ced77f5e5b81336cb97a5c98ec6
|
4
|
+
data.tar.gz: 464b7a63bdfb341f67da6f4556e4ee66b36db144d9d41270c9204ee6a10ca56c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6a6f59a184da190d6905b495a0c067437ab422561ccf26f23e1e7d6f48fd0a0d2c63bb033d46f760b9ce24e958539a58e319b8a160c2fc2a719f4f1e3f31bcd
|
7
|
+
data.tar.gz: a777db3452a6cc462ba526447c17fe0790d73dd8b08517d62363ac3f5d9b7cb076d2b77ef614ed51f981941451362bd0f568fab4749c08bdc9bc38533974729b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## [0.37.2]
|
2
|
+
|
3
|
+
* Support `query_periods` as well as the original `available_periods` for Availability Query and Sequenced Availability [#91]
|
4
|
+
|
5
|
+
## [0.37.1]
|
6
|
+
|
7
|
+
* Rename `data_centre` to `data_centre` (with aliases for backwards compatibility) [#90]
|
8
|
+
|
9
|
+
## [0.37.0]
|
10
|
+
|
11
|
+
* Add `revoke_by_token` and `revoke_by_sub` to the Client [#86]
|
12
|
+
|
13
|
+
## [0.36.1]
|
14
|
+
|
15
|
+
* Loosen the version requirement on Hashie to allow 4.X
|
16
|
+
|
17
|
+
## [0.36.0]
|
18
|
+
|
19
|
+
* Add support for Available Periods [#81]
|
20
|
+
|
1
21
|
## [0.35.0]
|
2
22
|
|
3
23
|
* Add specific errors for network issues [#77]
|
@@ -162,6 +182,11 @@
|
|
162
182
|
[0.33.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.33.0
|
163
183
|
[0.34.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.34.0
|
164
184
|
[0.35.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.35.0
|
185
|
+
[0.36.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.36.0
|
186
|
+
[0.36.1]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.36.1
|
187
|
+
[0.37.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.0
|
188
|
+
[0.37.1]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.1
|
189
|
+
[0.37.2]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.2
|
165
190
|
|
166
191
|
[#13]: https://github.com/cronofy/cronofy-ruby/pull/13
|
167
192
|
[#16]: https://github.com/cronofy/cronofy-ruby/pull/16
|
@@ -201,3 +226,8 @@
|
|
201
226
|
[#74]: https://github.com/cronofy/cronofy-ruby/pull/74
|
202
227
|
[#75]: https://github.com/cronofy/cronofy-ruby/pull/75
|
203
228
|
[#77]: https://github.com/cronofy/cronofy-ruby/pull/77
|
229
|
+
[#81]: https://github.com/cronofy/cronofy-ruby/pull/81
|
230
|
+
[#85]: https://github.com/cronofy/cronofy-ruby/pull/85
|
231
|
+
[#86]: https://github.com/cronofy/cronofy-ruby/pull/86
|
232
|
+
[#90]: https://github.com/cronofy/cronofy-ruby/pull/90
|
233
|
+
[#91]: https://github.com/cronofy/cronofy-ruby/pull/91
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[](https://travis-ci.org/cronofy/cronofy-ruby)
|
4
4
|
[](http://badge.fury.io/rb/cronofy)
|
5
5
|
|
6
|
-
[Cronofy](https://www.cronofy.com) -
|
6
|
+
[Cronofy](https://www.cronofy.com) - the scheduling platform for business
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -23,22 +23,21 @@ bundle install
|
|
23
23
|
|
24
24
|
In order to use the Cronofy API you will need to [create a developer account](https://app.cronofy.com/sign_up/new).
|
25
25
|
|
26
|
-
From there you can [
|
27
|
-
to
|
28
|
-
to obtain an OAuth `client_id` and `client_secret` to be able to use the full
|
29
|
-
API.
|
26
|
+
From there you can [create an OAuth application](https://app.cronofy.com/oauth/applications/new)
|
27
|
+
to obtain an OAuth `client_id` and `client_secret` to be able to use the full API.
|
30
28
|
|
31
29
|
## Creating a client
|
32
30
|
|
33
31
|
To make calls to the Cronofy API you must create a `Cronofy::Client`. This takes
|
34
|
-
|
32
|
+
five keyword arguments, all of which are optional:
|
35
33
|
|
36
34
|
```ruby
|
37
35
|
cronofy = Cronofy::Client.new(
|
38
36
|
client_id: 'CLIENT_ID',
|
39
37
|
client_secret: 'CLIENT_SECRET',
|
40
38
|
access_token: 'ACCESS_TOKEN',
|
41
|
-
refresh_token: 'REFRESH_TOKEN'
|
39
|
+
refresh_token: 'REFRESH_TOKEN',
|
40
|
+
data_center: :de
|
42
41
|
)
|
43
42
|
```
|
44
43
|
|
@@ -53,6 +52,8 @@ If `client_id` and `client_secret` are not specified explicitly the values from
|
|
53
52
|
the environment variables `CRONOFY_CLIENT_ID` and `CRONOFY_CLIENT_SECRET` will
|
54
53
|
be used if present.
|
55
54
|
|
55
|
+
`data_center` is the two-letter designation for the data center you want to operate against - for example `:de` for Germany, or `:au` for Australia. When omitted, this defaults to the US data center.
|
56
|
+
|
56
57
|
## Authorization
|
57
58
|
|
58
59
|
[API documentation](https://www.cronofy.com/developers/api/#authorization)
|
data/cronofy.gemspec
CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |spec|
|
|
5
5
|
spec.version = Cronofy::VERSION
|
6
6
|
spec.authors = ["Sergii Paryzhskyi", "Garry Shutler"]
|
7
7
|
spec.email = ["parizhskiy@gmail.com", "garry@cronofy.com"]
|
8
|
-
spec.summary = %q{Cronofy -
|
8
|
+
spec.summary = %q{Cronofy - the scheduling platform for business}
|
9
9
|
spec.description = %q{Ruby wrapper for Cronofy's unified calendar API}
|
10
10
|
spec.homepage = "https://github.com/cronofy/cronofy-ruby"
|
11
11
|
spec.license = "MIT"
|
@@ -17,11 +17,11 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.files += Dir['spec/**/*.rb']
|
18
18
|
spec.test_files = Dir['spec/**/*.rb']
|
19
19
|
|
20
|
+
spec.add_runtime_dependency "hashie", ">= 2.1", "< 5"
|
20
21
|
spec.add_runtime_dependency "oauth2", "~> 1.0"
|
21
|
-
spec.add_runtime_dependency "hashie", ">= 2.1", "< 4"
|
22
22
|
|
23
23
|
spec.add_development_dependency "bundler", ">= 1.6", "< 3"
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
25
|
spec.add_development_dependency "rspec", "~> 3.2"
|
26
|
-
spec.add_development_dependency "webmock", "~> 1
|
26
|
+
spec.add_development_dependency "webmock", "~> 3.9.1"
|
27
27
|
end
|
data/lib/cronofy.rb
CHANGED
@@ -13,18 +13,26 @@ require 'openssl'
|
|
13
13
|
|
14
14
|
module Cronofy
|
15
15
|
def self.default_data_centre
|
16
|
-
|
16
|
+
default_data_center
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.default_data_centre=(value)
|
20
|
-
|
20
|
+
default_data_center= value
|
21
21
|
end
|
22
22
|
|
23
|
-
def self.
|
24
|
-
|
25
|
-
|
23
|
+
def self.default_data_center
|
24
|
+
@default_data_center || ENV['CRONOFY_DATA_CENTER'] || ENV['CRONOFY_DATA_CENTRE']
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.default_data_center=(value)
|
28
|
+
@default_data_center = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.api_url(data_center_override)
|
32
|
+
if data_center_override
|
33
|
+
api_url_for_data_center(data_center_override)
|
26
34
|
else
|
27
|
-
ENV['CRONOFY_API_URL'] ||
|
35
|
+
ENV['CRONOFY_API_URL'] || api_url_for_data_center(default_data_center)
|
28
36
|
end
|
29
37
|
end
|
30
38
|
|
@@ -32,7 +40,11 @@ module Cronofy
|
|
32
40
|
@api_url = value
|
33
41
|
end
|
34
42
|
|
35
|
-
def self.api_url_for_data_centre
|
43
|
+
def self.api_url_for_data_centre
|
44
|
+
api_url_for_data_center
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.api_url_for_data_center(dc)
|
36
48
|
@api_urls ||= Hash.new do |hash, key|
|
37
49
|
if key.nil? || key.to_sym == :us
|
38
50
|
url = "https://api.cronofy.com"
|
@@ -46,11 +58,11 @@ module Cronofy
|
|
46
58
|
@api_urls[dc]
|
47
59
|
end
|
48
60
|
|
49
|
-
def self.app_url(
|
50
|
-
if
|
51
|
-
|
61
|
+
def self.app_url(data_center_override)
|
62
|
+
if data_center_override
|
63
|
+
app_url_for_data_center(data_center_override)
|
52
64
|
else
|
53
|
-
ENV['CRONOFY_APP_URL'] ||
|
65
|
+
ENV['CRONOFY_APP_URL'] || app_url_for_data_center(default_data_center)
|
54
66
|
end
|
55
67
|
end
|
56
68
|
|
@@ -59,6 +71,10 @@ module Cronofy
|
|
59
71
|
end
|
60
72
|
|
61
73
|
def self.app_url_for_data_centre(dc)
|
74
|
+
app_url_for_data_center(dc)
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.app_url_for_data_center(dc)
|
62
78
|
@app_urls ||= Hash.new do |hash, key|
|
63
79
|
if key.nil? || key.to_sym == :us
|
64
80
|
url = "https://app.cronofy.com"
|
data/lib/cronofy/auth.rb
CHANGED
@@ -11,13 +11,13 @@ module Cronofy
|
|
11
11
|
access_token = options[:access_token]
|
12
12
|
client_id = options[:client_id]
|
13
13
|
client_secret = options[:client_secret]
|
14
|
-
|
14
|
+
data_center = options[:data_center]
|
15
15
|
refresh_token = options[:refresh_token]
|
16
16
|
|
17
17
|
@client_credentials_missing = blank?(client_id) || blank?(client_secret)
|
18
18
|
|
19
|
-
@auth_client = OAuth2::Client.new(client_id, client_secret, site: ::Cronofy.app_url(
|
20
|
-
@api_client = OAuth2::Client.new(client_id, client_secret, site: ::Cronofy.api_url(
|
19
|
+
@auth_client = OAuth2::Client.new(client_id, client_secret, site: ::Cronofy.app_url(data_center), connection_opts: { headers: { "User-Agent" => "Cronofy Ruby #{::Cronofy::VERSION}" } })
|
20
|
+
@api_client = OAuth2::Client.new(client_id, client_secret, site: ::Cronofy.api_url(data_center), connection_opts: { headers: { "User-Agent" => "Cronofy Ruby #{::Cronofy::VERSION}" } })
|
21
21
|
|
22
22
|
set_access_token(access_token, refresh_token) if access_token || refresh_token
|
23
23
|
set_api_key(client_secret) if client_secret
|
@@ -118,20 +118,50 @@ module Cronofy
|
|
118
118
|
def revoke!
|
119
119
|
raise CredentialsMissingError.new("No credentials to revoke") unless access_token
|
120
120
|
|
121
|
+
token = access_token.refresh_token || access_token.token
|
122
|
+
revoke_by_token(token)
|
123
|
+
@access_token = nil
|
124
|
+
end
|
125
|
+
|
126
|
+
# Internal: Revokes an authorization by the sub
|
127
|
+
#
|
128
|
+
# Returns nothing.
|
129
|
+
#
|
130
|
+
# Raises Cronofy::CredentialsMissingError if no credentials available.
|
131
|
+
def revoke_by_sub(sub)
|
132
|
+
do_revoke(sub: sub)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Internal: Revokes an authorization via the token
|
136
|
+
#
|
137
|
+
# Returns nothing.
|
138
|
+
#
|
139
|
+
# Raises Cronofy::CredentialsMissingError if no credentials available.
|
140
|
+
def revoke_by_token(token)
|
141
|
+
do_revoke(token: token)
|
142
|
+
end
|
143
|
+
|
144
|
+
private
|
145
|
+
|
146
|
+
def do_revoke(token: nil, sub: nil)
|
147
|
+
raise CredentialsMissingError.new("No credentials to revoke") unless token || sub
|
148
|
+
|
121
149
|
do_request do
|
122
150
|
body = {
|
123
151
|
client_id: @api_client.id,
|
124
152
|
client_secret: @api_client.secret,
|
125
|
-
token: access_token.refresh_token || access_token.token,
|
126
153
|
}
|
127
154
|
|
155
|
+
if token
|
156
|
+
body.merge!(token: token)
|
157
|
+
else
|
158
|
+
body.merge!(sub: sub)
|
159
|
+
end
|
160
|
+
|
128
161
|
@api_client.request(:post, "/oauth/token/revoke", body: body)
|
129
|
-
@access_token = nil
|
130
162
|
end
|
131
163
|
end
|
132
164
|
|
133
|
-
private
|
134
|
-
|
135
165
|
def do_request(&block)
|
136
166
|
if @client_credentials_missing
|
137
167
|
raise CredentialsMissingError.new("OAuth client_id and client_secret must be set")
|
data/lib/cronofy/client.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
1
3
|
module Cronofy
|
2
4
|
# Public: Primary class for interacting with the Cronofy API.
|
3
5
|
class Client
|
@@ -25,22 +27,22 @@ module Cronofy
|
|
25
27
|
# ENV["CRONOFY_CLIENT_SECRET"]).
|
26
28
|
# :refresh_token - An existing refresh token String for the user's
|
27
29
|
# account (optional).
|
28
|
-
# :
|
29
|
-
#
|
30
|
+
# :data_center - An identifier to override the default data
|
31
|
+
# center (optional).
|
30
32
|
def initialize(options = {})
|
31
33
|
access_token = options[:access_token]
|
32
34
|
refresh_token = options[:refresh_token]
|
33
35
|
|
34
36
|
@client_id = options.fetch(:client_id, ENV["CRONOFY_CLIENT_ID"])
|
35
37
|
@client_secret = options.fetch(:client_secret, ENV["CRONOFY_CLIENT_SECRET"])
|
36
|
-
@
|
38
|
+
@data_center = options[:data_center] || options[:data_centre]
|
37
39
|
|
38
40
|
@auth = Auth.new(
|
39
41
|
client_id: @client_id,
|
40
42
|
client_secret: @client_secret,
|
41
43
|
access_token: access_token,
|
42
44
|
refresh_token: refresh_token,
|
43
|
-
|
45
|
+
data_center: @data_center
|
44
46
|
)
|
45
47
|
end
|
46
48
|
|
@@ -735,6 +737,14 @@ module Cronofy
|
|
735
737
|
@auth.revoke!
|
736
738
|
end
|
737
739
|
|
740
|
+
def revoke_by_sub(sub)
|
741
|
+
@auth.revoke_by_sub(sub)
|
742
|
+
end
|
743
|
+
|
744
|
+
def revoke_by_token(token)
|
745
|
+
@auth.revoke_by_token(token)
|
746
|
+
end
|
747
|
+
|
738
748
|
# Public: Requests elevated permissions for a set of calendars.
|
739
749
|
#
|
740
750
|
# args - A Hash of options used to initialize the request (default: {}):
|
@@ -793,7 +803,7 @@ module Cronofy
|
|
793
803
|
# for a single participant group.
|
794
804
|
# :required_duration - An Integer representing the minimum number
|
795
805
|
# of minutes of availability required.
|
796
|
-
# :
|
806
|
+
# :query_periods - An Array of available time periods Hashes,
|
797
807
|
# each must specify a start and end Time.
|
798
808
|
# :start_interval - An Integer representing the start interval
|
799
809
|
# of minutes for the availability query.
|
@@ -823,7 +833,7 @@ module Cronofy
|
|
823
833
|
options[:buffer] = map_availability_buffer(buffer)
|
824
834
|
end
|
825
835
|
|
826
|
-
translate_available_periods(options[:available_periods])
|
836
|
+
translate_available_periods(options[:query_periods] || options[:available_periods])
|
827
837
|
|
828
838
|
response = post("/v1/availability", options)
|
829
839
|
|
@@ -837,7 +847,7 @@ module Cronofy
|
|
837
847
|
# Public: Performs an sequenced availability query.
|
838
848
|
#
|
839
849
|
# options - The Hash options used to refine the selection (default: {}):
|
840
|
-
#
|
850
|
+
# :sequence - An Array of sequence defintions containing
|
841
851
|
# a Hash of:
|
842
852
|
# :sequence_id - A String to uniquely identify this part
|
843
853
|
# of the proposed sequence.
|
@@ -851,7 +861,7 @@ module Cronofy
|
|
851
861
|
# of minutes for the availability query.
|
852
862
|
# :buffer - An Hash containing the buffer to apply to
|
853
863
|
# the availability query.
|
854
|
-
#
|
864
|
+
# :query_periods - An Array of available time periods Hashes,
|
855
865
|
# each must specify a start and end Time.
|
856
866
|
#
|
857
867
|
# Returns an Array of Sequences.
|
@@ -868,7 +878,7 @@ module Cronofy
|
|
868
878
|
def sequenced_availability(options = {})
|
869
879
|
options[:sequence] = map_availability_sequence(options[:sequence])
|
870
880
|
|
871
|
-
translate_available_periods(options[:available_periods])
|
881
|
+
translate_available_periods(options[:query_periods] || options[:available_periods])
|
872
882
|
|
873
883
|
response = post("/v1/sequenced_availability", options)
|
874
884
|
parse_collection(Sequence, "sequences", response)
|
@@ -1492,6 +1502,84 @@ module Cronofy
|
|
1492
1502
|
nil
|
1493
1503
|
end
|
1494
1504
|
|
1505
|
+
# Public: Creates or updates an AvailablePeriod.
|
1506
|
+
#
|
1507
|
+
# available_period_id - A String uniquely identifying the available period
|
1508
|
+
# for the authenticated user in your application
|
1509
|
+
# (note: this is NOT an ID generated by Cronofy).
|
1510
|
+
# body - A Hash describing the available period with
|
1511
|
+
# symbolized keys:
|
1512
|
+
# :start - A String (ISO-8601 date/time)
|
1513
|
+
# :end - A String (ISO-8601 date/time)
|
1514
|
+
#
|
1515
|
+
# See https://docs.cronofy.com/developers/api/scheduling/available-periods/upsert/
|
1516
|
+
# for reference.
|
1517
|
+
#
|
1518
|
+
# Returns nothing.
|
1519
|
+
#
|
1520
|
+
# Raises Cronofy::CredentialsMissingError if no credentials available.
|
1521
|
+
# Raises Cronofy::InvalidRequestError if the request contains invalid
|
1522
|
+
# parameters.
|
1523
|
+
# Raises Cronofy::TooManyRequestsError if the request exceeds the rate
|
1524
|
+
# limits for the application.
|
1525
|
+
def upsert_available_period(available_period_id, body)
|
1526
|
+
payload = body.merge(available_period_id: available_period_id)
|
1527
|
+
wrapped_request { post("/v1/available_periods", payload) }
|
1528
|
+
nil
|
1529
|
+
end
|
1530
|
+
|
1531
|
+
# Public: Gets all AvailablePeriods for an account.
|
1532
|
+
#
|
1533
|
+
# options - The Hash options used to refine the selection (default: {}):
|
1534
|
+
# :from - The minimum Date from which to return periods
|
1535
|
+
# (optional).
|
1536
|
+
# :to - The Date to return periods up until (optional).
|
1537
|
+
# :tzid - A String representing a known time zone
|
1538
|
+
# identifier from the IANA Time Zone Database
|
1539
|
+
# (default: Etc/UTC).
|
1540
|
+
# :localized_times - A Boolean specifying whether the start and
|
1541
|
+
# end times should be returned with any
|
1542
|
+
# available localization information
|
1543
|
+
# (optional).
|
1544
|
+
#
|
1545
|
+
# Returns an array of AvailablePeriods.
|
1546
|
+
#
|
1547
|
+
# Raises Cronofy::CredentialsMissingError if no credentials available.
|
1548
|
+
# Raises Cronofy::InvalidRequestError if the request contains invalid
|
1549
|
+
# parameters.
|
1550
|
+
# Raises Cronofy::TooManyRequestsError if the request exceeds the rate
|
1551
|
+
# limits for the application.
|
1552
|
+
def get_available_periods(options={})
|
1553
|
+
query = {}
|
1554
|
+
query[:from] = to_iso8601(options[:from]) if options[:from]
|
1555
|
+
query[:to] = to_iso8601(options[:to]) if options[:to]
|
1556
|
+
query[:tzid] = options[:tzid] if options[:tzid]
|
1557
|
+
query[:localized_times] = options[:localized_times] if options[:localized_times]
|
1558
|
+
if query.any?
|
1559
|
+
query_string = "?#{URI.encode_www_form(query)}"
|
1560
|
+
end
|
1561
|
+
|
1562
|
+
response = wrapped_request { get("/v1/available_periods#{query_string}") }
|
1563
|
+
parse_collection(AvailablePeriod, 'available_periods', response)
|
1564
|
+
end
|
1565
|
+
|
1566
|
+
# Public: Deletes an AvailablePeriod.
|
1567
|
+
#
|
1568
|
+
# available_period_id - A String uniquely identifying the available period
|
1569
|
+
# for the authenticated user in your application
|
1570
|
+
#
|
1571
|
+
# Returns nothing.
|
1572
|
+
#
|
1573
|
+
# Raises Cronofy::CredentialsMissingError if no credentials available.
|
1574
|
+
# Raises Cronofy::InvalidRequestError if the request contains invalid
|
1575
|
+
# parameters.
|
1576
|
+
# Raises Cronofy::TooManyRequestsError if the request exceeds the rate
|
1577
|
+
# limits for the application.
|
1578
|
+
def delete_available_period(available_period_id)
|
1579
|
+
wrapped_request { delete("/v1/available_periods", available_period_id: available_period_id) }
|
1580
|
+
nil
|
1581
|
+
end
|
1582
|
+
|
1495
1583
|
# Public: Creates a scheduling conversation
|
1496
1584
|
#
|
1497
1585
|
# pre release end-point documentation to follow
|
@@ -1801,7 +1889,7 @@ module Cronofy
|
|
1801
1889
|
end
|
1802
1890
|
|
1803
1891
|
def api_url
|
1804
|
-
::Cronofy.api_url(@
|
1892
|
+
::Cronofy.api_url(@data_center)
|
1805
1893
|
end
|
1806
1894
|
end
|
1807
1895
|
|
data/lib/cronofy/version.rb
CHANGED
@@ -92,7 +92,7 @@ describe Cronofy::Auth do
|
|
92
92
|
let(:scheme) { 'https' }
|
93
93
|
let(:host) { 'app.cronofy.com' }
|
94
94
|
let(:path) { '/oauth/authorize' }
|
95
|
-
let(:
|
95
|
+
let(:data_center_override) { nil }
|
96
96
|
let(:default_params) do
|
97
97
|
{
|
98
98
|
'client_id' => client_id,
|
@@ -106,7 +106,7 @@ describe Cronofy::Auth do
|
|
106
106
|
Cronofy::Auth.new(
|
107
107
|
client_id: client_id,
|
108
108
|
client_secret: client_secret,
|
109
|
-
|
109
|
+
data_center: data_center_override,
|
110
110
|
)
|
111
111
|
end
|
112
112
|
|
@@ -156,8 +156,8 @@ describe Cronofy::Auth do
|
|
156
156
|
it_behaves_like 'a user auth link provider'
|
157
157
|
end
|
158
158
|
|
159
|
-
context 'when data
|
160
|
-
let(:
|
159
|
+
context 'when data center overridden' do
|
160
|
+
let(:data_center_override) { :de }
|
161
161
|
let(:host) { 'app-de.cronofy.com' }
|
162
162
|
let(:params) { default_params }
|
163
163
|
|
@@ -204,13 +204,13 @@ describe Cronofy::Auth do
|
|
204
204
|
end
|
205
205
|
|
206
206
|
describe '#get_token_from_code' do
|
207
|
-
let(:
|
207
|
+
let(:data_center_override) { nil }
|
208
208
|
|
209
209
|
subject do
|
210
210
|
Cronofy::Auth.new(
|
211
211
|
client_id: client_id,
|
212
212
|
client_secret: client_secret,
|
213
|
-
|
213
|
+
data_center: data_center_override,
|
214
214
|
).get_token_from_code(code, redirect_uri)
|
215
215
|
end
|
216
216
|
|
@@ -236,7 +236,7 @@ describe Cronofy::Auth do
|
|
236
236
|
end
|
237
237
|
|
238
238
|
describe '#application_calendar' do
|
239
|
-
let(:
|
239
|
+
let(:data_center_override) { nil }
|
240
240
|
|
241
241
|
let(:application_calendar_id) { "my-application-calendar" }
|
242
242
|
let(:cronofy_application_calendar_id) { "apc_54475485743" }
|
@@ -273,7 +273,7 @@ describe Cronofy::Auth do
|
|
273
273
|
Cronofy::Auth.new(
|
274
274
|
client_id: client_id,
|
275
275
|
client_secret: client_secret,
|
276
|
-
|
276
|
+
data_center: data_center_override,
|
277
277
|
).application_calendar(application_calendar_id)
|
278
278
|
end
|
279
279
|
|
@@ -308,8 +308,8 @@ describe Cronofy::Auth do
|
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
311
|
-
context "with data
|
312
|
-
let(:
|
311
|
+
context "with data center overridden" do
|
312
|
+
let(:data_center_override) { :de }
|
313
313
|
let(:api_token_url) { "https://api-de.cronofy.com/oauth/token" }
|
314
314
|
let(:app_token_url) { "https://app-de.cronofy.com/oauth/token" }
|
315
315
|
|
@@ -372,14 +372,14 @@ describe Cronofy::Auth do
|
|
372
372
|
it_behaves_like 'an authorization request'
|
373
373
|
end
|
374
374
|
|
375
|
-
context "with data
|
375
|
+
context "with data center overridden" do
|
376
376
|
subject do
|
377
377
|
Cronofy::Auth.new(
|
378
378
|
client_id: client_id,
|
379
379
|
client_secret: client_secret,
|
380
380
|
access_token: access_token,
|
381
381
|
refresh_token: refresh_token,
|
382
|
-
|
382
|
+
data_center: :de,
|
383
383
|
).refresh!
|
384
384
|
end
|
385
385
|
|
@@ -476,4 +476,84 @@ describe Cronofy::Auth do
|
|
476
476
|
end
|
477
477
|
end
|
478
478
|
end
|
479
|
+
|
480
|
+
describe "#revoke_by_sub" do
|
481
|
+
let(:auth) do
|
482
|
+
Cronofy::Auth.new(
|
483
|
+
client_id: client_id,
|
484
|
+
client_secret: client_secret,
|
485
|
+
access_token: access_token,
|
486
|
+
refresh_token: refresh_token,
|
487
|
+
)
|
488
|
+
end
|
489
|
+
|
490
|
+
let!(:revocation_request) do
|
491
|
+
stub_request(:post, "https://api.cronofy.com/oauth/token/revoke")
|
492
|
+
.with(
|
493
|
+
body: {
|
494
|
+
client_id: client_id,
|
495
|
+
client_secret: client_secret,
|
496
|
+
sub: sub,
|
497
|
+
},
|
498
|
+
headers: {
|
499
|
+
'Content-Type' => 'application/x-www-form-urlencoded',
|
500
|
+
'User-Agent' => "Cronofy Ruby #{Cronofy::VERSION}",
|
501
|
+
}
|
502
|
+
).to_return(status: response_status)
|
503
|
+
end
|
504
|
+
|
505
|
+
let(:sub) { "random_sub_value" }
|
506
|
+
|
507
|
+
before do
|
508
|
+
auth.revoke_by_sub(sub)
|
509
|
+
end
|
510
|
+
|
511
|
+
it "does not unset the access token for the current auth" do
|
512
|
+
expect(auth.access_token).not_to be_nil
|
513
|
+
end
|
514
|
+
|
515
|
+
it "makes the revocation request" do
|
516
|
+
expect(revocation_request).to have_been_requested
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
520
|
+
describe "#revoke_by_token" do
|
521
|
+
let(:auth) do
|
522
|
+
Cronofy::Auth.new(
|
523
|
+
client_id: client_id,
|
524
|
+
client_secret: client_secret,
|
525
|
+
access_token: access_token,
|
526
|
+
refresh_token: refresh_token,
|
527
|
+
)
|
528
|
+
end
|
529
|
+
|
530
|
+
let!(:revocation_request) do
|
531
|
+
stub_request(:post, "https://api.cronofy.com/oauth/token/revoke")
|
532
|
+
.with(
|
533
|
+
body: {
|
534
|
+
client_id: client_id,
|
535
|
+
client_secret: client_secret,
|
536
|
+
token: token,
|
537
|
+
},
|
538
|
+
headers: {
|
539
|
+
'Content-Type' => 'application/x-www-form-urlencoded',
|
540
|
+
'User-Agent' => "Cronofy Ruby #{Cronofy::VERSION}",
|
541
|
+
}
|
542
|
+
).to_return(status: response_status)
|
543
|
+
end
|
544
|
+
|
545
|
+
let(:token) { "random_token_value" }
|
546
|
+
|
547
|
+
before do
|
548
|
+
auth.revoke_by_token(token)
|
549
|
+
end
|
550
|
+
|
551
|
+
it "does not unset the access token for the current auth" do
|
552
|
+
expect(auth.access_token).not_to be_nil
|
553
|
+
end
|
554
|
+
|
555
|
+
it "makes the revocation request" do
|
556
|
+
expect(revocation_request).to have_been_requested
|
557
|
+
end
|
558
|
+
end
|
479
559
|
end
|
@@ -266,6 +266,7 @@ describe Cronofy::Client do
|
|
266
266
|
],
|
267
267
|
}
|
268
268
|
end
|
269
|
+
|
269
270
|
let(:request_body) do
|
270
271
|
{
|
271
272
|
:event_id => "qTtZdczOccgaPncGJaCiLg",
|
@@ -1718,6 +1719,57 @@ describe Cronofy::Client do
|
|
1718
1719
|
it_behaves_like 'a Cronofy request'
|
1719
1720
|
it_behaves_like 'a Cronofy request with mapped return value'
|
1720
1721
|
end
|
1722
|
+
|
1723
|
+
context "when given query_periods instead of available_periods" do
|
1724
|
+
let(:participants) do
|
1725
|
+
{ members: %w{acc_567236000909002 acc_678347111010113} }
|
1726
|
+
end
|
1727
|
+
|
1728
|
+
let(:required_duration) { 60 }
|
1729
|
+
|
1730
|
+
let(:query_periods) do
|
1731
|
+
[
|
1732
|
+
{ start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
|
1733
|
+
{ start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
|
1734
|
+
]
|
1735
|
+
end
|
1736
|
+
|
1737
|
+
let(:request_body) do
|
1738
|
+
{
|
1739
|
+
"participants" => [
|
1740
|
+
{
|
1741
|
+
"members" => [
|
1742
|
+
{ "sub" => "acc_567236000909002" },
|
1743
|
+
{ "sub" => "acc_678347111010113" }
|
1744
|
+
],
|
1745
|
+
"required" => "all"
|
1746
|
+
}
|
1747
|
+
],
|
1748
|
+
"query_periods" => [
|
1749
|
+
{
|
1750
|
+
"start" => "2017-01-03T09:00:00Z",
|
1751
|
+
"end" => "2017-01-03T18:00:00Z"
|
1752
|
+
},
|
1753
|
+
{
|
1754
|
+
"start" => "2017-01-04T09:00:00Z",
|
1755
|
+
"end" => "2017-01-04T18:00:00Z"
|
1756
|
+
}
|
1757
|
+
],
|
1758
|
+
"required_duration" => { "minutes" => 60 },
|
1759
|
+
}
|
1760
|
+
end
|
1761
|
+
|
1762
|
+
subject do
|
1763
|
+
client.availability(
|
1764
|
+
participants: participants,
|
1765
|
+
required_duration: required_duration,
|
1766
|
+
query_periods: query_periods
|
1767
|
+
)
|
1768
|
+
end
|
1769
|
+
|
1770
|
+
it_behaves_like 'a Cronofy request'
|
1771
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
1772
|
+
end
|
1721
1773
|
end
|
1722
1774
|
end
|
1723
1775
|
|
@@ -1873,6 +1925,18 @@ describe Cronofy::Client do
|
|
1873
1925
|
|
1874
1926
|
it_behaves_like 'a Cronofy request'
|
1875
1927
|
it_behaves_like 'a Cronofy request with mapped return value'
|
1928
|
+
|
1929
|
+
context "when passing query_periods instead" do
|
1930
|
+
before do
|
1931
|
+
args[:query_periods] = args[:available_periods]
|
1932
|
+
args.delete(:available_periods)
|
1933
|
+
request_body["query_periods"] = request_body["available_periods"]
|
1934
|
+
request_body.delete("available_periods")
|
1935
|
+
end
|
1936
|
+
|
1937
|
+
it_behaves_like 'a Cronofy request'
|
1938
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
1939
|
+
end
|
1876
1940
|
end
|
1877
1941
|
end
|
1878
1942
|
|
@@ -2325,8 +2389,8 @@ describe Cronofy::Client do
|
|
2325
2389
|
|
2326
2390
|
end
|
2327
2391
|
|
2328
|
-
describe "
|
2329
|
-
let(:
|
2392
|
+
describe "specifying data_centre" do
|
2393
|
+
let(:data_center) { :de }
|
2330
2394
|
|
2331
2395
|
let(:client) do
|
2332
2396
|
Cronofy::Client.new(
|
@@ -2334,12 +2398,52 @@ describe Cronofy::Client do
|
|
2334
2398
|
client_secret: 'client_secret_456',
|
2335
2399
|
access_token: token,
|
2336
2400
|
refresh_token: 'refresh_token_456',
|
2337
|
-
data_centre:
|
2401
|
+
data_centre: data_center,
|
2338
2402
|
)
|
2339
2403
|
end
|
2340
2404
|
|
2341
2405
|
describe "Userinfo" do
|
2342
|
-
let(:request_url) { "https://api-#{
|
2406
|
+
let(:request_url) { "https://api-#{data_center}.cronofy.com/v1/userinfo" }
|
2407
|
+
|
2408
|
+
describe "#userinfo" do
|
2409
|
+
let(:method) { :get }
|
2410
|
+
|
2411
|
+
let(:correct_response_code) { 200 }
|
2412
|
+
let(:correct_response_body) do
|
2413
|
+
{
|
2414
|
+
"sub" => "ser_5700a00eb0ccd07000000000",
|
2415
|
+
"cronofy.type" => "service_account",
|
2416
|
+
"cronofy.service_account.domain" => "example.com"
|
2417
|
+
}
|
2418
|
+
end
|
2419
|
+
|
2420
|
+
let(:correct_mapped_result) do
|
2421
|
+
Cronofy::UserInfo.new(correct_response_body)
|
2422
|
+
end
|
2423
|
+
|
2424
|
+
subject { client.userinfo }
|
2425
|
+
|
2426
|
+
it_behaves_like "a Cronofy request"
|
2427
|
+
it_behaves_like "a Cronofy request with mapped return value"
|
2428
|
+
end
|
2429
|
+
end
|
2430
|
+
end
|
2431
|
+
|
2432
|
+
describe "specifying data_center" do
|
2433
|
+
let(:data_center) { :au }
|
2434
|
+
|
2435
|
+
let(:client) do
|
2436
|
+
Cronofy::Client.new(
|
2437
|
+
client_id: 'client_id_123',
|
2438
|
+
client_secret: 'client_secret_456',
|
2439
|
+
access_token: token,
|
2440
|
+
refresh_token: 'refresh_token_456',
|
2441
|
+
data_center: data_center,
|
2442
|
+
)
|
2443
|
+
end
|
2444
|
+
|
2445
|
+
describe "Userinfo" do
|
2446
|
+
let(:request_url) { "https://api-#{data_center}.cronofy.com/v1/userinfo" }
|
2343
2447
|
|
2344
2448
|
describe "#userinfo" do
|
2345
2449
|
let(:method) { :get }
|
@@ -3152,4 +3256,160 @@ describe Cronofy::Client do
|
|
3152
3256
|
|
3153
3257
|
it_behaves_like 'a Cronofy request'
|
3154
3258
|
end
|
3259
|
+
|
3260
|
+
describe "#upsert_available_period" do
|
3261
|
+
let(:request_url) { 'https://api.cronofy.com/v1/available_periods' }
|
3262
|
+
let(:method) { :post }
|
3263
|
+
let(:available_period_id) { "test" }
|
3264
|
+
let(:request_body) do
|
3265
|
+
{
|
3266
|
+
available_period_id: available_period_id,
|
3267
|
+
start: "2020-07-26T15:30:00Z",
|
3268
|
+
end: "2020-07-26T17:00:00Z"
|
3269
|
+
}
|
3270
|
+
end
|
3271
|
+
|
3272
|
+
let(:correct_response_code) { 202 }
|
3273
|
+
let(:correct_response_body) { "" }
|
3274
|
+
let(:correct_mapped_result) { nil }
|
3275
|
+
|
3276
|
+
subject {
|
3277
|
+
client.upsert_available_period(available_period_id,
|
3278
|
+
start: request_body[:start],
|
3279
|
+
end: request_body[:end]
|
3280
|
+
)
|
3281
|
+
}
|
3282
|
+
|
3283
|
+
it_behaves_like 'a Cronofy request'
|
3284
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
3285
|
+
end
|
3286
|
+
|
3287
|
+
describe "#get_available_periods" do
|
3288
|
+
context "unfiltered" do
|
3289
|
+
let(:request_url) { "https://api.cronofy.com/v1/available_periods" }
|
3290
|
+
let(:method) { :get }
|
3291
|
+
|
3292
|
+
let(:correct_response_code) { 200 }
|
3293
|
+
let(:correct_response_body) do
|
3294
|
+
{
|
3295
|
+
"available_periods" => [
|
3296
|
+
{
|
3297
|
+
"available_period_id" => "qTtZdczOccgaPncGJaCiLg",
|
3298
|
+
"start" => "2020-07-26T15:30:00Z",
|
3299
|
+
"end" => "2020-07-26T17:00:00Z"
|
3300
|
+
}
|
3301
|
+
]
|
3302
|
+
}
|
3303
|
+
end
|
3304
|
+
|
3305
|
+
let(:correct_mapped_result) do
|
3306
|
+
period = correct_response_body['available_periods'][0]
|
3307
|
+
|
3308
|
+
[
|
3309
|
+
Cronofy::AvailablePeriod.new(
|
3310
|
+
available_period_id: period['available_period_id'],
|
3311
|
+
start: period['start'],
|
3312
|
+
end: period['end']
|
3313
|
+
)
|
3314
|
+
]
|
3315
|
+
end
|
3316
|
+
|
3317
|
+
subject { client.get_available_periods }
|
3318
|
+
|
3319
|
+
it_behaves_like 'a Cronofy request'
|
3320
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
3321
|
+
end
|
3322
|
+
|
3323
|
+
context "filterd by date range" do
|
3324
|
+
let(:tzid) { "America/New_York" }
|
3325
|
+
let(:from) { "2020-07-01" }
|
3326
|
+
let(:to) { "2020-07-31" }
|
3327
|
+
let(:request_url) { "https://api.cronofy.com/v1/available_periods?from=#{from}&to=#{to}&tzid=#{tzid}" }
|
3328
|
+
let(:method) { :get }
|
3329
|
+
|
3330
|
+
let(:correct_response_code) { 200 }
|
3331
|
+
let(:correct_response_body) do
|
3332
|
+
{
|
3333
|
+
"available_periods" => [
|
3334
|
+
{
|
3335
|
+
"available_period_id" => "qTtZdczOccgaPncGJaCiLg",
|
3336
|
+
"start" => "2020-07-26T15:30:00Z",
|
3337
|
+
"end" => "2020-07-26T17:00:00Z"
|
3338
|
+
}
|
3339
|
+
]
|
3340
|
+
}
|
3341
|
+
end
|
3342
|
+
|
3343
|
+
let(:correct_mapped_result) do
|
3344
|
+
period = correct_response_body['available_periods'][0]
|
3345
|
+
|
3346
|
+
[
|
3347
|
+
Cronofy::AvailablePeriod.new(
|
3348
|
+
available_period_id: period['available_period_id'],
|
3349
|
+
start: period['start'],
|
3350
|
+
end: period['end']
|
3351
|
+
)
|
3352
|
+
]
|
3353
|
+
end
|
3354
|
+
|
3355
|
+
subject { client.get_available_periods(from: from, to: to, tzid: tzid) }
|
3356
|
+
|
3357
|
+
it_behaves_like 'a Cronofy request'
|
3358
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
3359
|
+
end
|
3360
|
+
|
3361
|
+
context "requesting localized times" do
|
3362
|
+
let(:tzid) { "America/New_York" }
|
3363
|
+
let(:localized_times) { true }
|
3364
|
+
let(:request_url) { "https://api.cronofy.com/v1/available_periods?tzid=#{tzid}&localized_times=true" }
|
3365
|
+
let(:method) { :get }
|
3366
|
+
|
3367
|
+
let(:correct_response_code) { 200 }
|
3368
|
+
let(:correct_response_body) do
|
3369
|
+
{
|
3370
|
+
"available_periods" => [
|
3371
|
+
{
|
3372
|
+
"available_period_id" => "qTtZdczOccgaPncGJaCiLg",
|
3373
|
+
"start" => "2020-07-26T15:30:00Z",
|
3374
|
+
"end" => "2020-07-26T17:00:00Z"
|
3375
|
+
}
|
3376
|
+
]
|
3377
|
+
}
|
3378
|
+
end
|
3379
|
+
|
3380
|
+
let(:correct_mapped_result) do
|
3381
|
+
period = correct_response_body['available_periods'][0]
|
3382
|
+
|
3383
|
+
[
|
3384
|
+
Cronofy::AvailablePeriod.new(
|
3385
|
+
available_period_id: period['available_period_id'],
|
3386
|
+
start: period['start'],
|
3387
|
+
end: period['end']
|
3388
|
+
)
|
3389
|
+
]
|
3390
|
+
end
|
3391
|
+
|
3392
|
+
subject { client.get_available_periods(tzid: tzid, localized_times: true) }
|
3393
|
+
|
3394
|
+
it_behaves_like 'a Cronofy request'
|
3395
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
3396
|
+
end
|
3397
|
+
end
|
3398
|
+
|
3399
|
+
describe '#delete_available_period' do
|
3400
|
+
let(:available_period_id) { 'default'}
|
3401
|
+
let(:request_url) { "https://api.cronofy.com/v1/available_periods" }
|
3402
|
+
let(:method) { :delete }
|
3403
|
+
let(:request_body) {
|
3404
|
+
{ available_period_id: available_period_id}
|
3405
|
+
}
|
3406
|
+
let(:correct_response_code) { 202 }
|
3407
|
+
let(:correct_response_body) { "" }
|
3408
|
+
let(:correct_mapped_result) { nil }
|
3409
|
+
|
3410
|
+
subject { client.delete_available_period(available_period_id) }
|
3411
|
+
|
3412
|
+
it_behaves_like 'a Cronofy request'
|
3413
|
+
it_behaves_like 'a Cronofy request with mapped return value'
|
3414
|
+
end
|
3155
3415
|
end
|
metadata
CHANGED
@@ -1,30 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cronofy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.37.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergii Paryzhskyi
|
8
8
|
- Garry Shutler
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-01-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: oauth2
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '1.0'
|
21
|
-
type: :runtime
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - "~>"
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '1.0'
|
28
14
|
- !ruby/object:Gem::Dependency
|
29
15
|
name: hashie
|
30
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +20,7 @@ dependencies:
|
|
34
20
|
version: '2.1'
|
35
21
|
- - "<"
|
36
22
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
23
|
+
version: '5'
|
38
24
|
type: :runtime
|
39
25
|
prerelease: false
|
40
26
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -44,7 +30,21 @@ dependencies:
|
|
44
30
|
version: '2.1'
|
45
31
|
- - "<"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
33
|
+
version: '5'
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: oauth2
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
41
|
+
type: :runtime
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: bundler
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,14 +99,14 @@ dependencies:
|
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
102
|
+
version: 3.9.1
|
103
103
|
type: :development
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
109
|
+
version: 3.9.1
|
110
110
|
description: Ruby wrapper for Cronofy's unified calendar API
|
111
111
|
email:
|
112
112
|
- parizhskiy@gmail.com
|
@@ -141,7 +141,7 @@ homepage: https://github.com/cronofy/cronofy-ruby
|
|
141
141
|
licenses:
|
142
142
|
- MIT
|
143
143
|
metadata: {}
|
144
|
-
post_install_message:
|
144
|
+
post_install_message:
|
145
145
|
rdoc_options: []
|
146
146
|
require_paths:
|
147
147
|
- lib
|
@@ -156,10 +156,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
156
|
- !ruby/object:Gem::Version
|
157
157
|
version: '0'
|
158
158
|
requirements: []
|
159
|
-
rubygems_version: 3.
|
160
|
-
signing_key:
|
159
|
+
rubygems_version: 3.2.4
|
160
|
+
signing_key:
|
161
161
|
specification_version: 4
|
162
|
-
summary: Cronofy -
|
162
|
+
summary: Cronofy - the scheduling platform for business
|
163
163
|
test_files:
|
164
164
|
- spec/spec_helper.rb
|
165
165
|
- spec/response_parser_spec.rb
|