microslop_one_drive 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +67 -7
  3. data/lib/microslop_one_drive/batch/batch_response.rb +15 -0
  4. data/lib/microslop_one_drive/batch/response.rb +18 -0
  5. data/lib/microslop_one_drive/client.rb +98 -42
  6. data/lib/microslop_one_drive/deserializers/drive_deserializer.rb +57 -0
  7. data/lib/microslop_one_drive/deserializers/drive_item_deserializer.rb +67 -0
  8. data/lib/microslop_one_drive/deserializers/parent_reference_deserializer.rb +20 -0
  9. data/lib/microslop_one_drive/deserializers/quota_deserializer.rb +24 -0
  10. data/lib/microslop_one_drive/deserializers/shared_with_me_item_deserializer.rb +48 -0
  11. data/lib/microslop_one_drive/deserializers/user_deserializer.rb +29 -0
  12. data/lib/microslop_one_drive/drive.rb +40 -10
  13. data/lib/microslop_one_drive/drive_item.rb +61 -63
  14. data/lib/microslop_one_drive/file.rb +13 -0
  15. data/lib/microslop_one_drive/folder.rb +13 -0
  16. data/lib/microslop_one_drive/list_responses/drive_item_list.rb +21 -0
  17. data/lib/microslop_one_drive/list_responses/drive_list.rb +15 -0
  18. data/lib/microslop_one_drive/list_responses/list_response.rb +21 -0
  19. data/lib/microslop_one_drive/list_responses/permission_list.rb +27 -0
  20. data/lib/microslop_one_drive/list_responses/shared_with_me_list.rb +15 -0
  21. data/lib/microslop_one_drive/parent_reference.rb +14 -0
  22. data/lib/microslop_one_drive/permission_set.rb +13 -15
  23. data/lib/microslop_one_drive/quota.rb +14 -0
  24. data/lib/microslop_one_drive/root_folder.rb +13 -0
  25. data/lib/microslop_one_drive/shared_with_me_item.rb +44 -0
  26. data/lib/microslop_one_drive/user.rb +33 -5
  27. data/lib/microslop_one_drive/utils.rb +10 -0
  28. data/lib/microslop_one_drive/version.rb +1 -1
  29. data/lib/microslop_one_drive.rb +33 -8
  30. metadata +25 -67
  31. data/lib/microslop_one_drive/batch_response.rb +0 -13
  32. data/lib/microslop_one_drive/drive_item_list.rb +0 -32
  33. data/lib/microslop_one_drive/drive_list.rb +0 -13
  34. data/lib/microslop_one_drive/list_response.rb +0 -21
  35. data/lib/microslop_one_drive/permission_list.rb +0 -29
  36. data/lib/microslop_one_drive/response.rb +0 -16
@@ -1,18 +1,48 @@
1
1
  module MicroslopOneDrive
2
2
  class Drive
3
- attr_reader :id, :name, :description, :url, :drive_type, :created_at, :updated_at
3
+ attr_reader :id, :name, :description, :web_url, :drive_type, :created_date_time, :last_modified_date_time,
4
+ :created_by, :last_modified_by, :owner, :quota
4
5
 
5
- def initialize(drive_hash)
6
- @drive_hash = drive_hash
6
+ def initialize(
7
+ id:,
8
+ name:,
9
+ description:,
10
+ web_url:,
11
+ drive_type:,
12
+ created_date_time:,
13
+ last_modified_date_time:,
14
+ created_by:,
15
+ last_modified_by:,
16
+ owner:,
17
+ quota:
18
+ )
19
+ @id = id
20
+ @name = name
21
+ @description = description
22
+ @web_url = web_url
23
+ @drive_type = drive_type
24
+ @created_date_time = created_date_time
25
+ @last_modified_date_time = last_modified_date_time
26
+ @created_by = created_by
27
+ @last_modified_by = last_modified_by
28
+ @owner = owner
29
+ @quota = quota
30
+ end
31
+
32
+ def created_at
33
+ @created_date_time
34
+ end
7
35
 
8
- @id = drive_hash.fetch("id", nil)
9
- @name = drive_hash.fetch("name", nil)
10
- @description = drive_hash.fetch("description", nil)
11
- @url = drive_hash.fetch("webUrl", nil)
12
- @drive_type = drive_hash.fetch("driveType", nil)
36
+ def updated_at
37
+ @last_modified_date_time
38
+ end
39
+
40
+ def url
41
+ @web_url
42
+ end
13
43
 
14
- @created_at = Utils.safe_parse_time(drive_hash.fetch("createdDateTime", nil))
15
- @updated_at = Utils.safe_parse_time(drive_hash.fetch("lastModifiedDateTime", nil))
44
+ def updated_by
45
+ @last_modified_by
16
46
  end
17
47
  end
18
48
  end
@@ -4,53 +4,70 @@ module MicroslopOneDrive
4
4
 
5
5
  attr_reader :id,
6
6
  :name,
7
- :created_at,
8
- :updated_at,
9
- :url,
7
+ :download_url,
8
+ :web_url,
10
9
  :size,
10
+ :created_date_time,
11
+ :last_modified_date_time,
12
+ :e_tag,
13
+ :c_tag,
11
14
  :file_or_folder,
12
- :parent_id,
13
15
  :mime_type,
14
- :parent,
15
- :children,
16
- :path,
17
- :full_path
18
-
19
- def initialize(item_hash)
20
- @item_hash = item_hash
21
-
22
- @id = @item_hash.fetch("id", nil)
23
- @name = @item_hash.fetch("name", nil)
24
- @url = @item_hash.fetch("webUrl", nil)
25
- @size = @item_hash.fetch("size", nil)
26
-
27
- @created_at = Utils.safe_parse_time(@item_hash.fetch("createdDateTime", nil))
28
- @updated_at = Utils.safe_parse_time(@item_hash.fetch("lastModifiedDateTime", nil))
29
-
30
- if @item_hash.key?("file")
31
- @file_or_folder = :file
32
- @mime_type = @item_hash.dig("file", "mimeType")
33
- elsif @item_hash.key?("folder")
34
- @file_or_folder = :folder
35
- @mime_type = DIRECTORY_MIME_TYPE
36
- end
37
-
38
- @parent_id = @item_hash.dig("parentReference", "id")
39
-
40
- @deleted = @item_hash.dig("deleted", "state") == "deleted"
16
+ :parent_reference,
17
+ :is_deleted,
18
+ :is_shared,
19
+ :full_path,
20
+ :path
21
+
22
+ def initialize(
23
+ id:,
24
+ name:,
25
+ download_url:,
26
+ web_url:,
27
+ size:,
28
+ created_date_time:,
29
+ last_modified_date_time:,
30
+ e_tag:,
31
+ c_tag:,
32
+ file_or_folder:,
33
+ mime_type:,
34
+ parent_reference:,
35
+ is_deleted:,
36
+ is_shared:
37
+ )
38
+ @id = id
39
+ @name = name
40
+ @download_url = download_url
41
+ @web_url = web_url
42
+ @size = size
43
+ @created_date_time = created_date_time
44
+ @last_modified_date_time = last_modified_date_time
45
+ @e_tag = e_tag
46
+ @c_tag = c_tag
47
+ @file_or_folder = file_or_folder
48
+ @mime_type = mime_type
49
+ @parent_reference = parent_reference
50
+ @is_deleted = is_deleted
51
+ @is_shared = is_shared
52
+
53
+ @full_path = build_full_path
54
+ @path = build_path(@full_path)
55
+ end
41
56
 
42
- @path = build_path
57
+ def created_at
58
+ @created_date_time
59
+ end
43
60
 
44
- @parent = nil
45
- @children = []
61
+ def updated_at
62
+ @last_modified_date_time
46
63
  end
47
64
 
48
65
  def deleted?
49
- @deleted
66
+ @is_deleted
50
67
  end
51
68
 
52
69
  def shared?
53
- @item_hash.key?("shared")
70
+ @is_shared
54
71
  end
55
72
 
56
73
  def file?
@@ -61,39 +78,20 @@ module MicroslopOneDrive
61
78
  @file_or_folder == :folder
62
79
  end
63
80
 
64
- def set_parent(parent)
65
- if @parent
66
- @parent.remove_child(self)
67
- end
68
-
69
- @parent = parent
70
- @parent.add_child(self)
71
- end
72
-
73
- def is_root?
74
- @item_hash.key?("root")
81
+ def root?
82
+ false
75
83
  end
76
84
 
77
- protected
85
+ def build_full_path
86
+ return nil if parent_reference&.path.nil? || name.nil?
78
87
 
79
- def add_child(child)
80
- @children << child
88
+ ::File.join(parent_reference.path, name)
81
89
  end
82
90
 
83
- def remove_child(child)
84
- @children.delete(child)
85
- end
86
-
87
- private
88
-
89
- def build_path
90
- return "root:" if is_root?
91
-
92
- full_parent_path = @item_hash.dig("parentReference", "path")
93
- return nil if full_parent_path.nil?
91
+ def build_path(full_path)
92
+ return "" if full_path.nil?
94
93
 
95
- full_path_with_name = File.join(full_parent_path, @name)
96
- full_path_with_name.sub(/\A.*root:\//, "root:/")
94
+ full_path.gsub(%r{\A/?drive/root:/?}, "").chomp("/")
97
95
  end
98
96
  end
99
97
  end
@@ -0,0 +1,13 @@
1
+ require "microslop_one_drive/drive_item"
2
+
3
+ module MicroslopOneDrive
4
+ class File < DriveItem
5
+ def folder?
6
+ false
7
+ end
8
+
9
+ def file?
10
+ true
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require "microslop_one_drive/drive_item"
2
+
3
+ module MicroslopOneDrive
4
+ class Folder < DriveItem
5
+ def folder?
6
+ true
7
+ end
8
+
9
+ def file?
10
+ false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ module MicroslopOneDrive
2
+ module ListResponses
3
+ class DriveItemList < ListResponse
4
+ attr_reader :items
5
+
6
+ def initialize(parsed_response)
7
+ super
8
+
9
+ @items = build_items(parsed_response)
10
+ end
11
+
12
+ private
13
+
14
+ def build_items(parsed_response)
15
+ parsed_response.fetch("value", []).map do
16
+ MicroslopOneDrive::Deserializers::DriveItemDeserializer.create_from_hash(it)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module MicroslopOneDrive
2
+ module ListResponses
3
+ class DriveList < ListResponse
4
+ attr_reader :drives
5
+
6
+ def initialize(response_hash)
7
+ super
8
+
9
+ @drives = response_hash.fetch("value", []).map do
10
+ MicroslopOneDrive::Deserializers::DriveDeserializer.create_from_hash(it)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module MicroslopOneDrive
2
+ module ListResponses
3
+ class ListResponse
4
+ attr_reader :next_link, :next_token, :delta_link, :delta_token, :context
5
+
6
+ def initialize(response_hash)
7
+ @context = response_hash.fetch("@odata.context", nil)
8
+
9
+ @next_link = response_hash.fetch("@odata.nextLink", nil)
10
+ @next_token = @next_link.split("?token=").last if @next_link && !@next_link.empty?
11
+
12
+ @delta_link = response_hash.fetch("@odata.deltaLink", nil)
13
+ @delta_token = @delta_link.split("?token=").last if @delta_link && !@delta_link.empty?
14
+ end
15
+
16
+ def next_page?
17
+ !next_link.nil?
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module MicroslopOneDrive
2
+ module ListResponses
3
+ class PermissionList < ListResponse
4
+ attr_reader :permissions
5
+
6
+ def initialize(drive_item_id:, parsed_response:)
7
+ super(parsed_response)
8
+
9
+ @permissions = build_permissions(drive_item_id, parsed_response)
10
+ end
11
+
12
+ private
13
+
14
+ def build_permissions(drive_item_id, parsed_response)
15
+ permission_sets = parsed_response.fetch("value", []).map do
16
+ MicroslopOneDrive::PermissionSet.new(drive_item_id: drive_item_id, parsed_response: it)
17
+ end
18
+
19
+ # At this stage, the permissions could contain multiple Audiences for the same Permission.
20
+ # This is because OneDrive can return multiple permissions for the same thing.
21
+ # For example, a file shared with one person and a public link will return in a single permission object.
22
+ # We therefore need to "explode" the permission sets into multiple permissions, one for each Audience.
23
+ permission_sets.flat_map(&:to_permissions)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module MicroslopOneDrive
2
+ module ListResponses
3
+ class SharedWithMeList < ListResponse
4
+ attr_reader :shared_with_me_items
5
+
6
+ def initialize(response_hash)
7
+ super
8
+
9
+ @shared_with_me_items = response_hash.fetch("value", []).map do
10
+ MicroslopOneDrive::Deserializers::SharedWithMeItemDeserializer.create_from_hash(it)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module MicroslopOneDrive
2
+ class ParentReference
3
+ attr_reader :drive_type, :drive_id, :id, :name, :path, :site_id
4
+
5
+ def initialize(drive_type:, drive_id:, id:, name:, path:, site_id:)
6
+ @drive_type = drive_type
7
+ @drive_id = drive_id
8
+ @id = id
9
+ @name = name
10
+ @path = path
11
+ @site_id = site_id
12
+ end
13
+ end
14
+ end
@@ -3,12 +3,10 @@ module MicroslopOneDrive
3
3
  attr_reader :id, :role, :audiences
4
4
 
5
5
  def initialize(drive_item_id:, parsed_response:)
6
- @parsed_response = parsed_response
7
-
8
6
  @drive_item_id = drive_item_id
9
- @id = @parsed_response.fetch("id", nil)
10
- @role = build_role
11
- @audiences = build_audiences
7
+ @id = parsed_response.fetch("id", nil)
8
+ @role = build_role(parsed_response)
9
+ @audiences = build_audiences(parsed_response)
12
10
  end
13
11
 
14
12
  def to_permissions
@@ -17,31 +15,31 @@ module MicroslopOneDrive
17
15
 
18
16
  private
19
17
 
20
- def build_role
21
- roles = @parsed_response.fetch("roles", [])
18
+ def build_role(parsed_response)
19
+ roles = parsed_response.fetch("roles", [])
22
20
  roles.is_a?(Array) ? roles.first : roles
23
21
  end
24
22
 
25
- def build_audiences
23
+ def build_audiences(parsed_response)
26
24
  audiences = []
27
25
 
28
- audiences += audiences_from_site_users
29
- audiences += audiences_from_anonymous_links
26
+ audiences += audiences_from_site_users(parsed_response)
27
+ audiences += audiences_from_anonymous_links(parsed_response)
30
28
 
31
29
  audiences.compact
32
30
  end
33
31
 
34
- def audiences_from_site_users
32
+ def audiences_from_site_users(parsed_response)
35
33
  site_users = []
36
- site_users += @parsed_response.fetch("grantedToIdentitiesV2", []).flat_map { it.fetch("siteUser", nil) }
37
- site_users << @parsed_response.dig("grantedToV2", "siteUser")
34
+ site_users += parsed_response.fetch("grantedToIdentitiesV2", []).flat_map { it.fetch("siteUser", nil) }
35
+ site_users << parsed_response.dig("grantedToV2", "siteUser")
38
36
  site_users.compact!
39
37
 
40
38
  site_users.map { Audience.from_site_user(it) }
41
39
  end
42
40
 
43
- def audiences_from_anonymous_links
44
- link = @parsed_response.fetch("link", nil)
41
+ def audiences_from_anonymous_links(parsed_response)
42
+ link = parsed_response.fetch("link", nil)
45
43
  return [] if link.nil? || (link.respond_to?(:empty?) && link.empty?)
46
44
 
47
45
  link_scope = link.fetch("scope", nil)
@@ -0,0 +1,14 @@
1
+ module MicroslopOneDrive
2
+ class Quota
3
+ attr_reader :deleted, :remaining, :state, :total, :used, :upgrade_available
4
+
5
+ def initialize(deleted:, remaining:, state:, total:, used:, upgrade_available:)
6
+ @deleted = deleted
7
+ @remaining = remaining
8
+ @state = state
9
+ @total = total
10
+ @used = used
11
+ @upgrade_available = upgrade_available
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require "microslop_one_drive/folder"
2
+
3
+ module MicroslopOneDrive
4
+ class RootFolder < Folder
5
+ def root?
6
+ true
7
+ end
8
+
9
+ def build_full_path
10
+ "/drive/root:"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,44 @@
1
+ module MicroslopOneDrive
2
+ class SharedWithMeItem
3
+ attr_reader :id, :name, :web_url, :size, :last_modified_date_time, :created_date_time, :created_by,
4
+ :last_modified_by, :remote_item
5
+
6
+ def initialize(
7
+ id:,
8
+ name:,
9
+ web_url:,
10
+ size:,
11
+ last_modified_date_time:,
12
+ created_date_time:,
13
+ created_by:,
14
+ last_modified_by:,
15
+ remote_item:
16
+ )
17
+ @id = id
18
+ @name = name
19
+ @web_url = web_url
20
+ @size = size
21
+ @last_modified_date_time = last_modified_date_time
22
+ @created_date_time = created_date_time
23
+ @created_by = created_by
24
+ @last_modified_by = last_modified_by
25
+ @remote_item = remote_item
26
+ end
27
+
28
+ def created_at
29
+ @created_date_time
30
+ end
31
+
32
+ def updated_at
33
+ @last_modified_date_time
34
+ end
35
+
36
+ def url
37
+ @web_url
38
+ end
39
+
40
+ def updated_by
41
+ @last_modified_by
42
+ end
43
+ end
44
+ end
@@ -1,12 +1,40 @@
1
1
  module MicroslopOneDrive
2
2
  class User
3
- attr_reader :email_address, :display_name
3
+ attr_reader :principal_name, :id, :display_name, :surname, :given_name, :preferred_language, :mail, :mobile_phone,
4
+ :job_title, :office_location, :business_phones
4
5
 
5
- def initialize(user_hash)
6
- @user_hash = user_hash
6
+ def initialize(
7
+ principal_name: nil,
8
+ id: nil,
9
+ display_name: nil,
10
+ surname: nil,
11
+ given_name: nil,
12
+ preferred_language: nil,
13
+ mail: nil,
14
+ mobile_phone: nil,
15
+ job_title: nil,
16
+ office_location: nil,
17
+ business_phones: []
18
+ )
19
+ @principal_name = principal_name
20
+ @id = id
21
+ @display_name = display_name
22
+ @surname = surname
23
+ @given_name = given_name
24
+ @preferred_language = preferred_language
25
+ @mail = mail
26
+ @mobile_phone = mobile_phone
27
+ @job_title = job_title
28
+ @office_location = office_location
29
+ @business_phones = business_phones
30
+ end
31
+
32
+ def email_address
33
+ mail
34
+ end
7
35
 
8
- @email_address = @user_hash.fetch("mail", nil)
9
- @display_name = @user_hash.fetch("displayName", nil)
36
+ def last_name
37
+ surname
10
38
  end
11
39
  end
12
40
  end
@@ -2,6 +2,16 @@ require "time"
2
2
 
3
3
  module MicroslopOneDrive
4
4
  module Utils
5
+ def self.deep_symbolize_keys(hash)
6
+ hash.transform_keys(&:to_sym).transform_values do
7
+ case it
8
+ when Hash then deep_symbolize_keys(it)
9
+ when Array then it.map { it.is_a?(Hash) ? deep_symbolize_keys(it) : it }
10
+ else it
11
+ end
12
+ end
13
+ end
14
+
5
15
  def self.safe_parse_time(value)
6
16
  return nil if value.nil? || value.to_s.strip.empty?
7
17
 
@@ -1,3 +1,3 @@
1
1
  module MicroslopOneDrive
2
- VERSION = "2.2.0"
2
+ VERSION = "3.0.0".freeze
3
3
  end
@@ -3,17 +3,42 @@ require "json"
3
3
 
4
4
  require_relative "microslop_one_drive/version"
5
5
  require_relative "microslop_one_drive/utils"
6
- require_relative "microslop_one_drive/errors/client_error"
6
+
7
+ # Deserializers
8
+ require_relative "microslop_one_drive/deserializers/user_deserializer"
9
+ require_relative "microslop_one_drive/deserializers/drive_deserializer"
10
+ require_relative "microslop_one_drive/deserializers/quota_deserializer"
11
+ require_relative "microslop_one_drive/deserializers/drive_item_deserializer"
12
+ require_relative "microslop_one_drive/deserializers/parent_reference_deserializer"
13
+ require_relative "microslop_one_drive/deserializers/shared_with_me_item_deserializer"
14
+
15
+ # Drive items
16
+ require_relative "microslop_one_drive/file"
17
+ require_relative "microslop_one_drive/folder"
18
+ require_relative "microslop_one_drive/root_folder"
19
+ require_relative "microslop_one_drive/drive_item"
20
+
21
+ # List Responses
22
+ require_relative "microslop_one_drive/list_responses/list_response"
23
+ require_relative "microslop_one_drive/list_responses/drive_list"
24
+ require_relative "microslop_one_drive/list_responses/drive_item_list"
25
+ require_relative "microslop_one_drive/list_responses/permission_list"
26
+ require_relative "microslop_one_drive/list_responses/shared_with_me_list"
27
+
28
+ # Batch
29
+ require_relative "microslop_one_drive/batch/batch_response"
30
+ require_relative "microslop_one_drive/batch/response"
31
+
32
+ # Other models
7
33
  require_relative "microslop_one_drive/user"
8
- require_relative "microslop_one_drive/list_response"
9
- require_relative "microslop_one_drive/drive_list"
34
+ require_relative "microslop_one_drive/parent_reference"
10
35
  require_relative "microslop_one_drive/drive"
11
- require_relative "microslop_one_drive/drive_item"
12
- require_relative "microslop_one_drive/drive_item_list"
13
- require_relative "microslop_one_drive/permission_list"
14
36
  require_relative "microslop_one_drive/permission_set"
15
37
  require_relative "microslop_one_drive/permission"
16
38
  require_relative "microslop_one_drive/audience"
17
- require_relative "microslop_one_drive/batch_response"
18
- require_relative "microslop_one_drive/response"
39
+ require_relative "microslop_one_drive/quota"
40
+ require_relative "microslop_one_drive/shared_with_me_item"
41
+
42
+ # Client
43
+ require_relative "microslop_one_drive/errors/client_error"
19
44
  require_relative "microslop_one_drive/client"