lean-microsoft-graph 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +53 -0
- data/README.md +31 -1
- data/bin/console +1 -1
- data/lib/lean_microsoft_graph/authentication/credentials.rb +15 -0
- data/lib/lean_microsoft_graph/authentication/token_retriever.rb +22 -0
- data/lib/lean_microsoft_graph/client.rb +39 -0
- data/lib/lean_microsoft_graph/error.rb +5 -0
- data/lib/lean_microsoft_graph/resource.rb +48 -0
- data/lib/lean_microsoft_graph/resources/token_resource/token.rb +29 -0
- data/lib/lean_microsoft_graph/resources/token_resource.rb +26 -0
- data/lib/lean_microsoft_graph/resources/users_resource/user.rb +51 -0
- data/lib/lean_microsoft_graph/resources/users_resource/users.rb +27 -0
- data/lib/lean_microsoft_graph/resources/users_resource.rb +27 -0
- data/lib/lean_microsoft_graph/version.rb +5 -0
- data/lib/lean_microsoft_graph.rb +17 -0
- metadata +45 -6
- data/lib/lean/microsoft/graph/version.rb +0 -9
- data/lib/lean/microsoft/graph.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68d12b40dc1ac7a49f0871b42827af0428474d472e9b06f6e6b18cdfaff67138
|
4
|
+
data.tar.gz: f6493c4f976717411ad7b1a0fb08ee97a0faf416dcfa99f05b7375675e89e0f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f38076f360a47acc6d05b4b985cf356503316bb90ab8c8e9ff826012005f26fbab25b03e092634987bda14987c2aefd887e7fe0c20d9c9ffce235e93e55e04ef
|
7
|
+
data.tar.gz: 25fe8eb56dafb3891d6b6409aa8e4605c4593e0272f9d3f60f131f7889e2da3d0f990ac1815643141baa14acff166ce22a4eb468c94b9e5096e80438f92a92f9
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
6
|
+
|
7
|
+
## [0.2.0] - 2023-11-04
|
8
|
+
### Added
|
9
|
+
- Ability to count users with `client.users.count`.
|
10
|
+
- Ability to retrieve users per page with `client.users.get_all(per_page)`.
|
11
|
+
- Ability to retrieve users by reference with `client.users.get_all_by_reference('reference')`.
|
12
|
+
|
1
13
|
## [Unreleased]
|
2
14
|
|
3
15
|
## [0.1.0] - 2023-08-28
|
4
16
|
|
5
17
|
- Initial release
|
18
|
+
|
19
|
+
[0.2.0]: https://github.com/betogrun/lean_microsoft_graph/releases/tag/v0.2.0
|
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
lean-microsoft-graph (0.1.0)
|
5
|
+
faraday (~> 1.10)
|
6
|
+
faraday_middleware (~> 1.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
faraday (1.10.3)
|
12
|
+
faraday-em_http (~> 1.0)
|
13
|
+
faraday-em_synchrony (~> 1.0)
|
14
|
+
faraday-excon (~> 1.1)
|
15
|
+
faraday-httpclient (~> 1.0)
|
16
|
+
faraday-multipart (~> 1.0)
|
17
|
+
faraday-net_http (~> 1.0)
|
18
|
+
faraday-net_http_persistent (~> 1.0)
|
19
|
+
faraday-patron (~> 1.0)
|
20
|
+
faraday-rack (~> 1.0)
|
21
|
+
faraday-retry (~> 1.0)
|
22
|
+
ruby2_keywords (>= 0.0.4)
|
23
|
+
faraday-em_http (1.0.0)
|
24
|
+
faraday-em_synchrony (1.0.0)
|
25
|
+
faraday-excon (1.1.0)
|
26
|
+
faraday-httpclient (1.0.1)
|
27
|
+
faraday-multipart (1.0.4)
|
28
|
+
multipart-post (~> 2)
|
29
|
+
faraday-net_http (1.0.1)
|
30
|
+
faraday-net_http_persistent (1.2.0)
|
31
|
+
faraday-patron (1.0.0)
|
32
|
+
faraday-rack (1.0.0)
|
33
|
+
faraday-retry (1.0.3)
|
34
|
+
faraday_middleware (1.2.0)
|
35
|
+
faraday (~> 1.0)
|
36
|
+
minitest (5.20.0)
|
37
|
+
mocha (2.1.0)
|
38
|
+
ruby2_keywords (>= 0.0.5)
|
39
|
+
multipart-post (2.3.0)
|
40
|
+
rake (13.0.6)
|
41
|
+
ruby2_keywords (0.0.5)
|
42
|
+
|
43
|
+
PLATFORMS
|
44
|
+
x86_64-linux
|
45
|
+
|
46
|
+
DEPENDENCIES
|
47
|
+
lean-microsoft-graph!
|
48
|
+
minitest (~> 5.0)
|
49
|
+
mocha (~> 2.1)
|
50
|
+
rake (~> 13.0)
|
51
|
+
|
52
|
+
BUNDLED WITH
|
53
|
+
2.2.31
|
data/README.md
CHANGED
@@ -22,7 +22,37 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
To start using the LeanMicrosoftGraph gem, you need to create a client instance by providing the tenant_id, client_id, and client_secret.
|
26
|
+
|
27
|
+
### Initialize the client
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
client = LeanMicrosoftGraph::Client.new(
|
31
|
+
tenant_id: 'your_tenant_id',
|
32
|
+
client_id: 'your_client_id',
|
33
|
+
client_secret: 'your_client_secret'
|
34
|
+
)
|
35
|
+
```
|
36
|
+
|
37
|
+
Replace 'your_tenant_id', 'your_client_id', and 'your_client_secret' with your actual Microsoft Azure credentials.
|
38
|
+
|
39
|
+
### Count the number of users
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
count = client.users.count
|
43
|
+
puts "Number of users: #{count}"
|
44
|
+
```
|
45
|
+
|
46
|
+
### Retrieving all users
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
per_page = 10 # Set the number of users you want per page
|
50
|
+
users = client.users.get_all(per_page)
|
51
|
+
|
52
|
+
users.each do |user|
|
53
|
+
puts "User ID: #{user.id}"
|
54
|
+
end
|
55
|
+
```
|
26
56
|
|
27
57
|
## Development
|
28
58
|
|
data/bin/console
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "bundler/setup"
|
5
|
-
require "
|
5
|
+
require "lean_microsoft_graph"
|
6
6
|
|
7
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
8
8
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
module Authentication
|
5
|
+
class Credentials
|
6
|
+
attr_reader :tenant_id, :client_id, :client_secret
|
7
|
+
|
8
|
+
def initialize(tenant_id, client_id, client_secret)
|
9
|
+
@tenant_id = tenant_id
|
10
|
+
@client_id = client_id
|
11
|
+
@client_secret = client_secret
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
module Authentication
|
5
|
+
class TokenRetriever
|
6
|
+
def initialize(token_resource)
|
7
|
+
@token_resource = token_resource
|
8
|
+
@token = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_proc
|
12
|
+
-> { retrieve }
|
13
|
+
end
|
14
|
+
|
15
|
+
def retrieve
|
16
|
+
return @token if @token && !@token.expired?
|
17
|
+
|
18
|
+
@token = @token_resource.renew
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
class Client
|
5
|
+
def initialize(tenant_id:, client_id:, client_secret:, adapter: Faraday.default_adapter, stubs: nil)
|
6
|
+
@tenant_id = tenant_id
|
7
|
+
@client_id = client_id
|
8
|
+
@client_secret = client_secret
|
9
|
+
@adapter = adapter
|
10
|
+
@stubs = stubs # Stubs for testing purpouses
|
11
|
+
end
|
12
|
+
|
13
|
+
def users
|
14
|
+
Resources::UsersResource.new(connection)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def connection
|
20
|
+
@connection ||= Faraday.new(url: 'https://graph.microsoft.com/v1.0') do |faraday|
|
21
|
+
faraday.request :authorization, 'Bearer', proc(&token_retriever)
|
22
|
+
faraday.request :url_encoded
|
23
|
+
faraday.request :retry, retry_statuses: [429]
|
24
|
+
faraday.adapter @adapter, @stubs
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def token_retriever
|
29
|
+
@token_retriever ||= begin
|
30
|
+
token_resource = Resources::TokenResource.new(credentials, @adapter, @stubs)
|
31
|
+
Authentication::TokenRetriever.new(token_resource)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def credentials
|
36
|
+
Authentication::Credentials.new(@tenant_id, @client_id, @client_secret)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
class Resource
|
5
|
+
def initialize(connection)
|
6
|
+
@connection = connection
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_request(url, params = {}, headers = {}, &block)
|
10
|
+
handle_response(@connection.get(url, params, headers, &block))
|
11
|
+
end
|
12
|
+
|
13
|
+
def post_request(url, body = {}, headers = {}, &block)
|
14
|
+
handle_response(@connection.post(url, body, headers, &block))
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def handle_response(response)
|
20
|
+
parsed_response = JSON.parse(response.body, symbolize_names: true)
|
21
|
+
return parsed_response if (200..299).include?(response.status)
|
22
|
+
|
23
|
+
error_message = parsed_response[:error_description]
|
24
|
+
error_code = parsed_response[:error_codes]
|
25
|
+
|
26
|
+
puts parsed_response
|
27
|
+
|
28
|
+
case { status: response.status, code: error_code, message: error_message }
|
29
|
+
in { status: 400, code: code, message: message }
|
30
|
+
raise Error, "Bad request. Code: #{code}. Message: #{message}"
|
31
|
+
in { status: 401, code: code, message: message }
|
32
|
+
raise Error, "Unauthorized. Check permissions or authentication token. Code: #{code}. Message: #{message}"
|
33
|
+
in { status: 403, code: code, message: message }
|
34
|
+
raise Error, "Forbidden. Insufficient permissions. Code: #{code}. Message: #{message}"
|
35
|
+
in { status: 404, code: code, message: message }
|
36
|
+
raise Error, "Resource not found. Code: #{code}. Message: #{message}"
|
37
|
+
in { status: 429, code: code, message: message }
|
38
|
+
raise Error, "Too many requests. Rate limit exceeded. Code: #{code}. Message: #{message}"
|
39
|
+
in { status: 500, code: code, message: message }
|
40
|
+
raise Error, "Internal server error. Code: #{code}. Message: #{message}"
|
41
|
+
in { status: 503, code: code, message: message }
|
42
|
+
raise Error, "Service unavailable. Try again later. Code: #{code}. Message: #{message}"
|
43
|
+
else
|
44
|
+
raise Error, "An unknown error occurred with status: #{response.status}."
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
module Resources
|
5
|
+
class TokenResource
|
6
|
+
class Token
|
7
|
+
attr_reader :value, :expires_in
|
8
|
+
|
9
|
+
def initialize(value, expires_in)
|
10
|
+
@value = value
|
11
|
+
@expires_in = expires_in
|
12
|
+
@created_at = Time.now
|
13
|
+
end
|
14
|
+
|
15
|
+
def expires_at
|
16
|
+
@created_at + @expires_in
|
17
|
+
end
|
18
|
+
|
19
|
+
def expired?
|
20
|
+
Time.now > expires_at
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
@value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
module Resources
|
5
|
+
class TokenResource < ::LeanMicrosoftGraph::Resource
|
6
|
+
def initialize(credentials, adapter = Faraday.default_adapter, stubs = nil)
|
7
|
+
super(Faraday.new { |faraday| faraday.adapter(adapter, stubs)})
|
8
|
+
@credentials = credentials
|
9
|
+
end
|
10
|
+
|
11
|
+
def renew
|
12
|
+
url = "https://login.microsoftonline.com/#{@credentials.tenant_id}/oauth2/v2.0/token"
|
13
|
+
headers = { 'Content-Type' => 'application/x-www-form-urlencoded' }
|
14
|
+
body = {
|
15
|
+
'client_id' => @credentials.client_id,
|
16
|
+
'scope' => 'https://graph.microsoft.com/.default',
|
17
|
+
'client_secret' => @credentials.client_secret,
|
18
|
+
'grant_type' => 'client_credentials'
|
19
|
+
}
|
20
|
+
response = post_request(url, URI.encode_www_form(body), headers)
|
21
|
+
|
22
|
+
Token.new(response[:access_token], response[:expires_in].to_i)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
module Resources
|
5
|
+
class UsersResource
|
6
|
+
class User
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
end
|
10
|
+
|
11
|
+
def id = @response[:id]
|
12
|
+
|
13
|
+
def display_name = @response[:displayName]
|
14
|
+
|
15
|
+
def mail = @response[:mail]
|
16
|
+
|
17
|
+
def user_principal_name = @response[:userPrincipalName]
|
18
|
+
|
19
|
+
def job_title = @response[:jobTitle]
|
20
|
+
|
21
|
+
def mobile_phone = @response[:mobilePhone]
|
22
|
+
|
23
|
+
def business_phones = @response[:businessPhones]
|
24
|
+
|
25
|
+
def given_name = @response[:givenName]
|
26
|
+
|
27
|
+
def surname = @response[:surname]
|
28
|
+
|
29
|
+
def preferred_language = @response[:preferredLanguage]
|
30
|
+
|
31
|
+
def office_location = @response[:officeLocation]
|
32
|
+
|
33
|
+
def to_h
|
34
|
+
{
|
35
|
+
id: id,
|
36
|
+
display_name: display_name,
|
37
|
+
mail: mail,
|
38
|
+
user_principal_name: user_principal_name,
|
39
|
+
job_title: job_title,
|
40
|
+
mobile_phone: mobile_phone,
|
41
|
+
business_phones: business_phones,
|
42
|
+
given_name: given_name,
|
43
|
+
surname: surname,
|
44
|
+
preferred_language: preferred_language,
|
45
|
+
office_location: office_location
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
module Resources
|
5
|
+
class UsersResource
|
6
|
+
class Users
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
def initialize(response)
|
10
|
+
@response = response
|
11
|
+
end
|
12
|
+
|
13
|
+
def each(&block)
|
14
|
+
collection.each(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def next_batch_reference = @response[:'@odata.nextLink']
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def collection
|
22
|
+
@collection ||= @response[:value].map { |user| User.new(user) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LeanMicrosoftGraph
|
4
|
+
module Resources
|
5
|
+
class UsersResource < ::LeanMicrosoftGraph::Resource
|
6
|
+
def count
|
7
|
+
get_request('users/$count') do |req|
|
8
|
+
req.headers['ConsistencyLevel'] = 'eventual'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_all(per_page)
|
13
|
+
response = get_request('users') do |req|
|
14
|
+
req.params['$top'] = per_page
|
15
|
+
end
|
16
|
+
|
17
|
+
Users.new(response)
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_all_by_reference(url)
|
21
|
+
response = get_request(url)
|
22
|
+
|
23
|
+
Users.new(response)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module LeanMicrosoftGraph
|
6
|
+
require 'lean_microsoft_graph/version'
|
7
|
+
require 'lean_microsoft_graph/error'
|
8
|
+
require 'lean_microsoft_graph/resource'
|
9
|
+
require 'lean_microsoft_graph/client'
|
10
|
+
require 'lean_microsoft_graph/authentication/credentials'
|
11
|
+
require 'lean_microsoft_graph/authentication/token_retriever'
|
12
|
+
require 'lean_microsoft_graph/resources/token_resource'
|
13
|
+
require 'lean_microsoft_graph/resources/token_resource/token'
|
14
|
+
require 'lean_microsoft_graph/resources/users_resource'
|
15
|
+
require 'lean_microsoft_graph/resources/users_resource/user'
|
16
|
+
require 'lean_microsoft_graph/resources/users_resource/users'
|
17
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lean-microsoft-graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alberto Rocha
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
12
|
-
dependencies:
|
11
|
+
date: 2023-11-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday_middleware
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
13
41
|
description: This gem provides a set of methods to interact with Microsoft Graph API.
|
14
42
|
email:
|
15
43
|
- betogrun@gmail.com
|
@@ -19,13 +47,24 @@ extra_rdoc_files: []
|
|
19
47
|
files:
|
20
48
|
- CHANGELOG.md
|
21
49
|
- Gemfile
|
50
|
+
- Gemfile.lock
|
22
51
|
- LICENSE.txt
|
23
52
|
- README.md
|
24
53
|
- Rakefile
|
25
54
|
- bin/console
|
26
55
|
- bin/setup
|
27
|
-
- lib/
|
28
|
-
- lib/
|
56
|
+
- lib/lean_microsoft_graph.rb
|
57
|
+
- lib/lean_microsoft_graph/authentication/credentials.rb
|
58
|
+
- lib/lean_microsoft_graph/authentication/token_retriever.rb
|
59
|
+
- lib/lean_microsoft_graph/client.rb
|
60
|
+
- lib/lean_microsoft_graph/error.rb
|
61
|
+
- lib/lean_microsoft_graph/resource.rb
|
62
|
+
- lib/lean_microsoft_graph/resources/token_resource.rb
|
63
|
+
- lib/lean_microsoft_graph/resources/token_resource/token.rb
|
64
|
+
- lib/lean_microsoft_graph/resources/users_resource.rb
|
65
|
+
- lib/lean_microsoft_graph/resources/users_resource/user.rb
|
66
|
+
- lib/lean_microsoft_graph/resources/users_resource/users.rb
|
67
|
+
- lib/lean_microsoft_graph/version.rb
|
29
68
|
homepage: https://github.com/betogrun/lean-microsoft-graph
|
30
69
|
licenses:
|
31
70
|
- MIT
|
@@ -47,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
47
86
|
- !ruby/object:Gem::Version
|
48
87
|
version: '0'
|
49
88
|
requirements: []
|
50
|
-
rubygems_version: 3.1
|
89
|
+
rubygems_version: 3.4.1
|
51
90
|
signing_key:
|
52
91
|
specification_version: 4
|
53
92
|
summary: "'lean-microsoft-graph' is a gem is a simple interface to Microsoft Graph
|