cronofy 0.10.0 → 0.11.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: e337b294d628d5677d58763c49dd46441d66edcf
4
- data.tar.gz: 7ad6ea54a3fd5cba4b43f7f2533368574fa1639e
3
+ metadata.gz: e0de9ce12744013f0db7eb1dccbe156fc28451b1
4
+ data.tar.gz: 63f12bd7138884230847c5fb9797f135ca01232d
5
5
  SHA512:
6
- metadata.gz: ae50423467418330fbe878fbf70fbb2e8547c69e17b94858b0d66e1c9e700d0e54d1c827fbdb2abb16f7aa796f5ad5c8d81d3878d742266858051918c508dd76
7
- data.tar.gz: 747e9ef78b0da42569496a3ff48ebdce4213be8848dc1a8332cd1c4d507e419fd23c5c8c057f49b08b6a055cae017a22d31ee7f7407422abefea714edb3d8dca
6
+ metadata.gz: 4f0e9d054650efa325932f5986cff49bd00b91b56edcd38bb2428675b097ce1278e53e4d7ed8f91848a59677ae1e459a2f146b40561f8cb341ae31abe87cda37
7
+ data.tar.gz: 870cf96a3fca25d8da9d73d3da16363e1f52d1a9b09a84c4bdc490557abe8bf60277f0fb3b74ffe568abc09595db87d63231af208cde2bb06849712ed1f24f6f
@@ -401,6 +401,54 @@ module Cronofy
401
401
  parse_collection(Profile, "profiles", response)
402
402
  end
403
403
 
404
+ # Public: Retrieves the userinfo for the account
405
+ #
406
+ # See http://openid.net/specs/openid-connect-core-1_0.html#UserInfo for
407
+ # reference.
408
+ #
409
+ # Returns an UserInfo.
410
+ #
411
+ # Raises Cronofy::CredentialsMissingError if no credentials available.
412
+ # Raises Cronofy::AuthenticationFailureError if the access token is no
413
+ # longer valid.
414
+ # Raises Cronofy::AuthorizationFailureError if the access token does not
415
+ # include the required scope.
416
+ # Raises Cronofy::TooManyRequestsError if the request exceeds the rate
417
+ # limits for the application.
418
+ def userinfo
419
+ response = get("/v1/userinfo")
420
+ parse_json(UserInfo, nil, response)
421
+ end
422
+
423
+ # Public: Attempts to authorize the email with impersonation from a service
424
+ # account
425
+ #
426
+ # email - the email address to impersonate
427
+ # scope - Array or String of scopes describing the access to
428
+ # request from the user to the users calendars (required).
429
+ # callback_url - the url to callback to
430
+ #
431
+ # Returns nothing
432
+ #
433
+ # Raises Cronofy::CredentialsMissingError if no credentials available.
434
+ # Raises Cronofy::AuthenticationFailureError if the access token is no
435
+ # longer valid.
436
+ # Raises Cronofy::TooManyRequestsError if the request exceeds the rate
437
+ # limits for the application.
438
+ def authorize_with_service_account(email, scope, callback_url)
439
+ if scope.respond_to?(:join)
440
+ scope = scope.join(' ')
441
+ end
442
+
443
+ params = {
444
+ email: email,
445
+ scope: scope,
446
+ callback_url: callback_url
447
+ }
448
+ post("/v1/service_account_authorizations", params)
449
+ nil
450
+ end
451
+
404
452
  # Public: Generates a URL to send the user to in order to perform the OAuth
405
453
  # 2.0 authorization process.
406
454
  #
@@ -477,6 +525,40 @@ module Cronofy
477
525
  @auth.revoke!
478
526
  end
479
527
 
528
+ # Public: Requests elevated permissions for a set of calendars.
529
+ #
530
+ # args - A Hash of options used to initialize the request (default: {}):
531
+ # :permissions - An Array of calendar permission hashes to set on
532
+ # the each hash must contain symbols for both
533
+ # `calendar_id` and `permission_level`
534
+ # :redirect_uri - A uri to redirect the end user back to after they
535
+ # have either granted or rejected the request for
536
+ # elevated permission.
537
+ #
538
+ # In the case of normal accounts:
539
+ # After making this call the end user will have to grant the extended
540
+ # permissions to their calendar via rhe url returned from the response.
541
+ #
542
+ # In the case of service accounts:
543
+ # After making this call the exteneded permissions will be granted provided
544
+ # the relevant scope has been granted to the account
545
+ #
546
+ # Returns a extended permissions response.
547
+ #
548
+ # Raises Cronofy::AuthenticationFailureError if the client ID and secret are
549
+ # not valid.
550
+ def elevated_permissions(args = {})
551
+ filtered_permissions = args[:permissions].map do |permission|
552
+ { calendar_id: permission[:calendar_id], permission_level: permission[:permission_level] }
553
+ end
554
+
555
+ body = { permissions: filtered_permissions }
556
+ body[:redirect_uri] = args[:redirect_uri] if args[:redirect_uri]
557
+
558
+ response = post("/v1/permissions", body)
559
+ parse_json(PermissionsResponse, "permissions_request", response)
560
+ end
561
+
480
562
  private
481
563
 
482
564
  FREE_BUSY_DEFAULT_PARAMS = { tzid: "Etc/UTC" }.freeze
data/lib/cronofy/types.rb CHANGED
@@ -187,6 +187,9 @@ module Cronofy
187
187
  class Account < Hashie::Mash
188
188
  end
189
189
 
190
+ class UserInfo < Hashie::Mash
191
+ end
192
+
190
193
  class Calendar < Hashie::Mash
191
194
  end
192
195
 
@@ -269,4 +272,7 @@ module Cronofy
269
272
 
270
273
  class Profile < Hashie::Mash
271
274
  end
275
+
276
+ class PermissionsResponse < Hashie::Mash
277
+ end
272
278
  end
@@ -1,3 +1,3 @@
1
1
  module Cronofy
2
- VERSION = "0.10.0".freeze
2
+ VERSION = "0.11.0".freeze
3
3
  end
@@ -541,6 +541,23 @@ describe Cronofy::Client do
541
541
  end
542
542
  end
543
543
 
544
+ describe 'Service Account impersonation' do
545
+ let(:calendar_id) { 'calendar_id_123'}
546
+ let(:request_url) { "https://api.cronofy.com/v1/service_account_authorizations" }
547
+ let(:method) { :post }
548
+ let(:request_headers) { json_request_headers }
549
+ let(:request_body) { { email: email, scope: scope.join(' '), callback_url: callback_url } }
550
+ let(:correct_response_code) { 202 }
551
+ let(:correct_response_body) { nil }
552
+ let(:email) { "foo@example.com" }
553
+ let(:scope) { ['foo', 'bar'] }
554
+ let(:callback_url) { "http://example.com/not_found" }
555
+
556
+ subject { client.authorize_with_service_account(email, scope, callback_url) }
557
+
558
+ it_behaves_like 'a Cronofy request'
559
+ end
560
+
544
561
  describe 'Channels' do
545
562
  let(:request_url) { 'https://api.cronofy.com/v1/channels' }
546
563
 
@@ -645,6 +662,71 @@ describe Cronofy::Client do
645
662
  end
646
663
  end
647
664
 
665
+ describe "ElevatedPermissions" do
666
+
667
+ describe '#elevated_permissions' do
668
+ let(:method) { :post }
669
+ let(:request_url) { "https://api.cronofy.com/v1/permissions" }
670
+
671
+ let(:correct_response_code) { 202 }
672
+
673
+ let(:redirect_uri) { "http://www.example.com/redirect" }
674
+ let(:permissions) do
675
+ [
676
+ {
677
+ calendar_id: "cal_1234567",
678
+ permission_level: "unrestricted"
679
+ },
680
+ {
681
+ calendar_id: "cal_1234453",
682
+ permission_level: "sandbox"
683
+ }
684
+ ]
685
+ end
686
+
687
+ let(:request_body) do
688
+ {
689
+ permissions: permissions,
690
+ redirect_uri: redirect_uri,
691
+ }
692
+ end
693
+
694
+ let(:correct_mapped_result) do
695
+ Cronofy::PermissionsResponse.new(correct_response_body[:permissions_request])
696
+ end
697
+
698
+ describe "with uri supplied" do
699
+ let(:correct_response_body) do
700
+ {
701
+ permissions_request: {
702
+ url: "http://app.cronofy.com/permissions/"
703
+ }
704
+ }
705
+ end
706
+
707
+ subject { client.elevated_permissions(permissions: permissions, redirect_uri: redirect_uri) }
708
+
709
+ it_behaves_like 'a Cronofy request'
710
+ it_behaves_like 'a Cronofy request with mapped return value'
711
+ end
712
+
713
+ describe "without uri supplied" do
714
+ let(:correct_response_body) do
715
+ {
716
+ permissions_request: {
717
+ accepted: true
718
+ }
719
+ }
720
+ end
721
+
722
+ subject { client.elevated_permissions(permissions: permissions, redirect_uri: redirect_uri) }
723
+
724
+ it_behaves_like 'a Cronofy request'
725
+ it_behaves_like 'a Cronofy request with mapped return value'
726
+ end
727
+ end
728
+ end
729
+
648
730
  describe "Account" do
649
731
  let(:request_url) { "https://api.cronofy.com/v1/account" }
650
732
 
@@ -672,6 +754,32 @@ describe Cronofy::Client do
672
754
  end
673
755
  end
674
756
 
757
+ describe "Userinfo" do
758
+ let(:request_url) { "https://api.cronofy.com/v1/userinfo" }
759
+
760
+ describe "#userinfo" do
761
+ let(:method) { :get }
762
+
763
+ let(:correct_response_code) { 200 }
764
+ let(:correct_response_body) do
765
+ {
766
+ "sub" => "ser_5700a00eb0ccd07000000000",
767
+ "cronofy.type" => "service_account",
768
+ "cronofy.service_account.domain" => "example.com"
769
+ }
770
+ end
771
+
772
+ let(:correct_mapped_result) do
773
+ Cronofy::UserInfo.new(correct_response_body)
774
+ end
775
+
776
+ subject { client.userinfo }
777
+
778
+ it_behaves_like "a Cronofy request"
779
+ it_behaves_like "a Cronofy request with mapped return value"
780
+ end
781
+ end
782
+
675
783
  describe 'Profiles' do
676
784
  let(:request_url) { 'https://api.cronofy.com/v1/profiles' }
677
785
 
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.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergii Paryzhskyi
@@ -15,90 +15,90 @@ dependencies:
15
15
  name: oauth2
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '1.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '1.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: hashie
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '2.1'
35
- - - <
35
+ - - "<"
36
36
  - !ruby/object:Gem::Version
37
37
  version: '4'
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  requirements:
42
- - - '>='
42
+ - - ">="
43
43
  - !ruby/object:Gem::Version
44
44
  version: '2.1'
45
- - - <
45
+ - - "<"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '4'
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: bundler
50
50
  requirement: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.6'
55
55
  type: :development
56
56
  prerelease: false
57
57
  version_requirements: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.6'
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: rake
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10.0'
69
69
  type: :development
70
70
  prerelease: false
71
71
  version_requirements: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '10.0'
76
76
  - !ruby/object:Gem::Dependency
77
77
  name: rspec
78
78
  requirement: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.2'
83
83
  type: :development
84
84
  prerelease: false
85
85
  version_requirements: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '3.2'
90
90
  - !ruby/object:Gem::Dependency
91
91
  name: webmock
92
92
  requirement: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.21'
97
97
  type: :development
98
98
  prerelease: false
99
99
  version_requirements: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ~>
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: '1.21'
104
104
  description: Ruby wrapper for Cronofy's unified calendar API
@@ -138,17 +138,17 @@ require_paths:
138
138
  - lib
139
139
  required_ruby_version: !ruby/object:Gem::Requirement
140
140
  requirements:
141
- - - '>='
141
+ - - ">="
142
142
  - !ruby/object:Gem::Version
143
143
  version: '0'
144
144
  required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  requirements:
146
- - - '>='
146
+ - - ">="
147
147
  - !ruby/object:Gem::Version
148
148
  version: '0'
149
149
  requirements: []
150
150
  rubyforge_project:
151
- rubygems_version: 2.4.8
151
+ rubygems_version: 2.6.1
152
152
  signing_key:
153
153
  specification_version: 4
154
154
  summary: Cronofy - one API for all the calendars
@@ -160,3 +160,4 @@ test_files:
160
160
  - spec/lib/cronofy/event_spec.rb
161
161
  - spec/response_parser_spec.rb
162
162
  - spec/spec_helper.rb
163
+ has_rdoc: