globus_client 0.4.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -7
- data/README.md +7 -3
- data/api_test.rb +10 -7
- data/lib/globus_client/endpoint.rb +37 -14
- data/lib/globus_client/identity.rb +4 -4
- data/lib/globus_client/version.rb +1 -1
- data/lib/globus_client.rb +6 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48a7e0a937ea5e51b5803b69237c2d03afdc95a14a26008b6df31b708b086600
|
4
|
+
data.tar.gz: 431c01307b660f6cab3240963e508f57d1d1a8412e75b3468b7c16a48fc220c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccb73a4b9709b88f4bcf2bfcd59775beeee645c3b79b7c9a1083cb922ea4cb014ed07141579bf92532be103eb79bf23b7a65b727f0343b8f4ecec9f294fdfd05
|
7
|
+
data.tar.gz: 4aa6ff81e7ac5109526ca7608c089e2b5a1f8f7ce4e4f9a8c4eabaf14805dc22d4c0380624aef82179dee222ef1e7997fd7a485355e152a13fd81f1f64e20425
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
globus_client (0.
|
4
|
+
globus_client (0.6.0)
|
5
5
|
activesupport (>= 4.2, < 8)
|
6
6
|
faraday
|
7
7
|
zeitwerk
|
@@ -30,13 +30,13 @@ GEM
|
|
30
30
|
hashdiff (1.0.1)
|
31
31
|
i18n (1.12.0)
|
32
32
|
concurrent-ruby (~> 1.0)
|
33
|
-
json (2.6.
|
34
|
-
language_server-protocol (3.17.0.
|
33
|
+
json (2.6.3)
|
34
|
+
language_server-protocol (3.17.0.2)
|
35
35
|
minitest (5.16.3)
|
36
36
|
parallel (1.22.1)
|
37
37
|
parser (3.1.3.0)
|
38
38
|
ast (~> 2.4.1)
|
39
|
-
public_suffix (5.0.
|
39
|
+
public_suffix (5.0.1)
|
40
40
|
rainbow (3.1.1)
|
41
41
|
rake (13.0.6)
|
42
42
|
regexp_parser (2.6.1)
|
@@ -50,7 +50,7 @@ GEM
|
|
50
50
|
rspec-expectations (3.12.0)
|
51
51
|
diff-lcs (>= 1.2.0, < 2.0)
|
52
52
|
rspec-support (~> 3.12.0)
|
53
|
-
rspec-mocks (3.12.
|
53
|
+
rspec-mocks (3.12.1)
|
54
54
|
diff-lcs (>= 1.2.0, < 2.0)
|
55
55
|
rspec-support (~> 3.12.0)
|
56
56
|
rspec-support (3.12.0)
|
@@ -79,8 +79,8 @@ GEM
|
|
79
79
|
simplecov_json_formatter (~> 0.1)
|
80
80
|
simplecov-html (0.12.3)
|
81
81
|
simplecov_json_formatter (0.1.4)
|
82
|
-
standard (1.19.
|
83
|
-
language_server-protocol (
|
82
|
+
standard (1.19.1)
|
83
|
+
language_server-protocol (~> 3.17.0.2)
|
84
84
|
rubocop (= 1.39.0)
|
85
85
|
rubocop-performance (= 1.15.1)
|
86
86
|
tzinfo (2.0.5)
|
data/README.md
CHANGED
@@ -31,9 +31,9 @@ client = GlobusClient.configure(
|
|
31
31
|
uploads_directory: Settings.globus.uploads_directory,
|
32
32
|
transfer_endpoint_id: Settings.globus.transfer_endpoint_id
|
33
33
|
)
|
34
|
-
client.mkdir(user_id: 'mjgiarlo',
|
34
|
+
client.mkdir(user_id: 'mjgiarlo@stanford.edu', path: 'mjgiarlo/work1234/version1')
|
35
35
|
|
36
|
-
result = client.user_exists?('mjgiarlo')
|
36
|
+
result = client.user_exists?('mjgiarlo@stanford.edu')
|
37
37
|
```
|
38
38
|
|
39
39
|
You can also invoke methods directly on the client class, which is useful in a
|
@@ -53,7 +53,11 @@ GlobusClient.configure(
|
|
53
53
|
# app/services/my_globus_service.rb
|
54
54
|
# ...
|
55
55
|
def create_user_directory
|
56
|
-
GlobusClient.mkdir(user_id: 'mjgiarlo',
|
56
|
+
GlobusClient.mkdir(user_id: 'mjgiarlo@stanford.edu', path: 'mjgiarlo/work1234/version1')
|
57
|
+
end
|
58
|
+
|
59
|
+
def lookup_dir_contents
|
60
|
+
GlobusClient.get_filenames(user_id: 'mjgiarlo@stanford.edu', path: 'mjgiarlo/work1234/version1')
|
57
61
|
end
|
58
62
|
# ...
|
59
63
|
```
|
data/api_test.rb
CHANGED
@@ -11,27 +11,30 @@ GlobusClient.configure(
|
|
11
11
|
transfer_endpoint_id: ENV["GLOBUS_ENDPOINT"]
|
12
12
|
)
|
13
13
|
|
14
|
-
user_id,
|
14
|
+
user_id, path = *ARGV
|
15
15
|
|
16
16
|
# Test public API methods here.
|
17
|
-
GlobusClient.mkdir(user_id:,
|
17
|
+
GlobusClient.mkdir(user_id:, path:)
|
18
18
|
|
19
19
|
user_exists = GlobusClient.user_exists?(user_id)
|
20
20
|
|
21
21
|
# Not part of the public API but this allows us to test access changes
|
22
|
-
before_permissions = GlobusClient::Endpoint.new(GlobusClient.config, user_id
|
22
|
+
before_permissions = GlobusClient::Endpoint.new(GlobusClient.config, user_id:, path:).send(:access_rule)["permissions"]
|
23
23
|
|
24
|
-
files_count = GlobusClient.file_count(user_id:,
|
24
|
+
files_count = GlobusClient.file_count(user_id:, path:)
|
25
25
|
|
26
|
-
total_size = GlobusClient.total_size(user_id:,
|
26
|
+
total_size = GlobusClient.total_size(user_id:, path:)
|
27
27
|
|
28
|
-
GlobusClient.disallow_writes(user_id:,
|
28
|
+
GlobusClient.disallow_writes(user_id:, path:)
|
29
|
+
|
30
|
+
files_list = GlobusClient.get_filenames(user_id:, path:)
|
29
31
|
|
30
32
|
# Not part of the public API but this allows us to test access changes
|
31
|
-
after_permissions = GlobusClient::Endpoint.new(GlobusClient.config, user_id
|
33
|
+
after_permissions = GlobusClient::Endpoint.new(GlobusClient.config, user_id:, path:).send(:access_rule)["permissions"]
|
32
34
|
|
33
35
|
puts "User #{user_id} exists: #{user_exists}"
|
34
36
|
puts "Initial directory permissions: #{before_permissions}"
|
35
37
|
puts "Number of files in directory: #{files_count}"
|
36
38
|
puts "Total size of files in directory: #{total_size}"
|
39
|
+
puts "List of files in directory: #{files_list}"
|
37
40
|
puts "Final directory permissions: #{after_permissions}"
|
@@ -3,15 +3,15 @@
|
|
3
3
|
class GlobusClient
|
4
4
|
# The namespace for endpoint API operations
|
5
5
|
class Endpoint
|
6
|
+
PATH_SEPARATOR = "/"
|
7
|
+
|
6
8
|
# @param config [#token, #uploads_directory, #transfer_endpoint_id, #transfer_url, #auth_url] configuration for the gem
|
7
|
-
# @param
|
8
|
-
# @param
|
9
|
-
|
10
|
-
def initialize(config, user_id:, work_id:, work_version:)
|
9
|
+
# @param path [String] the path to operate on
|
10
|
+
# @param user_id [String] a Globus user ID (e.g., a @stanford.edu email address)
|
11
|
+
def initialize(config, path:, user_id:)
|
11
12
|
@config = config
|
12
13
|
@user_id = user_id
|
13
|
-
@
|
14
|
-
@work_version = work_version
|
14
|
+
@path = path
|
15
15
|
end
|
16
16
|
|
17
17
|
def file_count
|
@@ -56,9 +56,13 @@ class GlobusClient
|
|
56
56
|
access_request(permissions: "r")
|
57
57
|
end
|
58
58
|
|
59
|
+
def get_filenames
|
60
|
+
ls_path(full_path, [])
|
61
|
+
end
|
62
|
+
|
59
63
|
private
|
60
64
|
|
61
|
-
attr_reader :config, :
|
65
|
+
attr_reader :config, :path, :user_id
|
62
66
|
|
63
67
|
def connection
|
64
68
|
# Transfer API connection
|
@@ -68,17 +72,19 @@ class GlobusClient
|
|
68
72
|
)
|
69
73
|
end
|
70
74
|
|
71
|
-
def
|
75
|
+
def globus_identity_id
|
72
76
|
Identity.new(config).get_identity_id(user_id)
|
73
77
|
end
|
74
78
|
|
75
79
|
# Builds up a path from a list of path elements. E.g., input would look like:
|
76
|
-
#
|
80
|
+
# "mjgiarlo/work123/version1"
|
77
81
|
# And this method returns:
|
78
82
|
# ["/uploads/mjgiarlo/", "/uploads/mjgiarlo/work123/", "/uploads/mjgiarlo/work123/version1/"]
|
79
83
|
def paths
|
80
84
|
path_segments.map.with_index do |_segment, index|
|
81
|
-
File
|
85
|
+
File
|
86
|
+
.join(config.uploads_directory, path_segments.slice(..index))
|
87
|
+
.concat(PATH_SEPARATOR)
|
82
88
|
end
|
83
89
|
end
|
84
90
|
|
@@ -88,7 +94,7 @@ class GlobusClient
|
|
88
94
|
end
|
89
95
|
|
90
96
|
def path_segments
|
91
|
-
|
97
|
+
path.split(PATH_SEPARATOR)
|
92
98
|
end
|
93
99
|
|
94
100
|
def objects
|
@@ -103,6 +109,23 @@ class GlobusClient
|
|
103
109
|
objects["DATA"].select { |object| object["DATA_TYPE"] == "file" }
|
104
110
|
end
|
105
111
|
|
112
|
+
# @param filepath [String] an absolute path to look up contents e.g. /uploads/example/work123/version1
|
113
|
+
# @param filenames [Array<String>] a list of filenames, with absolute filepaths
|
114
|
+
def ls_path(filepath, filenames)
|
115
|
+
# List files recursively at an endpoint https://docs.globus.org/api/transfer/file_operations/#list_directory_contents
|
116
|
+
response = connection.get("#{transfer_path}/ls?path=#{filepath}")
|
117
|
+
if response.success?
|
118
|
+
data = JSON.parse(response.body)["DATA"]
|
119
|
+
data.select { |object| object["type"] == "file" }.map { |file| file["name"] }
|
120
|
+
.each { |file| filenames << "#{filepath}#{file}" }
|
121
|
+
data.select { |object| object["type"] == "dir" }.map { |dir| dir["name"] }
|
122
|
+
.each { |dir| ls_path("#{filepath}#{dir}/", filenames) }
|
123
|
+
else
|
124
|
+
UnexpectedResponse.call(response)
|
125
|
+
end
|
126
|
+
filenames
|
127
|
+
end
|
128
|
+
|
106
129
|
def access_request(permissions:)
|
107
130
|
response = if access_rule_id
|
108
131
|
connection.put("#{access_path}/#{access_rule_id}") do |req|
|
@@ -117,16 +140,16 @@ class GlobusClient
|
|
117
140
|
req.body = {
|
118
141
|
DATA_TYPE: "access",
|
119
142
|
principal_type: "identity",
|
120
|
-
principal:
|
143
|
+
principal: globus_identity_id,
|
121
144
|
path: full_path,
|
122
145
|
permissions:,
|
123
|
-
notify_email:
|
146
|
+
notify_email: user_id
|
124
147
|
}.to_json
|
125
148
|
req.headers["Content-Type"] = "application/json"
|
126
149
|
end
|
127
150
|
end
|
128
151
|
|
129
|
-
return
|
152
|
+
return true if response.success?
|
130
153
|
|
131
154
|
UnexpectedResponse.call(response)
|
132
155
|
end
|
@@ -7,8 +7,8 @@ class GlobusClient
|
|
7
7
|
@config = config
|
8
8
|
end
|
9
9
|
|
10
|
-
def get_identity_id(
|
11
|
-
@email =
|
10
|
+
def get_identity_id(user_id)
|
11
|
+
@email = user_id
|
12
12
|
|
13
13
|
response = lookup_identity
|
14
14
|
UnexpectedResponse.call(response) unless response.success?
|
@@ -17,8 +17,8 @@ class GlobusClient
|
|
17
17
|
extract_id(data)
|
18
18
|
end
|
19
19
|
|
20
|
-
def exists?(
|
21
|
-
get_identity_id(
|
20
|
+
def exists?(user_id)
|
21
|
+
get_identity_id(user_id)
|
22
22
|
true
|
23
23
|
rescue
|
24
24
|
false
|
data/lib/globus_client.rb
CHANGED
@@ -32,7 +32,7 @@ class GlobusClient
|
|
32
32
|
self
|
33
33
|
end
|
34
34
|
|
35
|
-
delegate :config, :disallow_writes, :file_count, :mkdir, :total_size, :user_exists?, to: :instance
|
35
|
+
delegate :config, :disallow_writes, :file_count, :mkdir, :total_size, :user_exists?, :get_filenames, to: :instance
|
36
36
|
|
37
37
|
def default_transfer_url
|
38
38
|
"https://transfer.api.globusonline.org"
|
@@ -66,6 +66,11 @@ class GlobusClient
|
|
66
66
|
endpoint.total_size
|
67
67
|
end
|
68
68
|
|
69
|
+
def get_filenames(...)
|
70
|
+
endpoint = Endpoint.new(config, ...)
|
71
|
+
endpoint.get_filenames
|
72
|
+
end
|
73
|
+
|
69
74
|
def user_exists?(...)
|
70
75
|
identity = Identity.new(config)
|
71
76
|
identity.exists?(...)
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: globus_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Collier
|
8
8
|
- Laura Wrubel
|
9
9
|
- Mike Giarlo
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-12-
|
13
|
+
date: 2022-12-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -179,7 +179,7 @@ metadata:
|
|
179
179
|
source_code_uri: https://github.com/sul-dlss/globus_client
|
180
180
|
changelog_uri: https://github.com/sul-dlss/globus_client/releases
|
181
181
|
rubygems_mfa_required: 'true'
|
182
|
-
post_install_message:
|
182
|
+
post_install_message:
|
183
183
|
rdoc_options: []
|
184
184
|
require_paths:
|
185
185
|
- lib
|
@@ -194,8 +194,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
194
|
- !ruby/object:Gem::Version
|
195
195
|
version: '0'
|
196
196
|
requirements: []
|
197
|
-
rubygems_version: 3.3.
|
198
|
-
signing_key:
|
197
|
+
rubygems_version: 3.3.3
|
198
|
+
signing_key:
|
199
199
|
specification_version: 4
|
200
200
|
summary: Interface for interacting with the Globus API.
|
201
201
|
test_files: []
|