dpl 2.0.3.beta.4 → 2.0.3.beta.5

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +15 -3
  3. data/Gemfile.lock +444 -211
  4. data/Rakefile +36 -34
  5. data/bin/dpl +3 -1
  6. data/dpl.gemspec +25 -0
  7. data/lib/dpl/cli.rb +19 -14
  8. data/lib/dpl/ctx/bash.rb +18 -12
  9. data/lib/dpl/ctx/test.rb +21 -15
  10. data/lib/dpl/ctx.rb +2 -0
  11. data/lib/dpl/helper/assets.rb +4 -2
  12. data/lib/dpl/helper/cmd.rb +20 -18
  13. data/lib/dpl/helper/config_file.rb +5 -3
  14. data/lib/dpl/helper/cookbook_site_streaming_uploader.rb +249 -0
  15. data/lib/dpl/helper/env.rb +26 -22
  16. data/lib/dpl/helper/github.rb +2 -0
  17. data/lib/dpl/helper/interpolate.rb +8 -4
  18. data/lib/dpl/helper/memoize.rb +4 -1
  19. data/lib/dpl/helper/squiggle.rb +3 -1
  20. data/lib/dpl/helper/transliterate.rb +3 -1
  21. data/lib/dpl/helper/wrap.rb +3 -1
  22. data/lib/dpl/helper/zip.rb +3 -1
  23. data/lib/dpl/provider/dsl.rb +18 -4
  24. data/lib/dpl/provider/examples.rb +6 -2
  25. data/lib/dpl/provider/status.rb +26 -24
  26. data/lib/dpl/providers/anynines.rb +22 -20
  27. data/lib/dpl/providers/azure_web_apps.rb +21 -19
  28. data/lib/dpl/providers/bintray.rb +44 -37
  29. data/lib/dpl/providers/bluemixcloudfoundry.rb +38 -36
  30. data/lib/dpl/providers/boxfuse.rb +12 -10
  31. data/lib/dpl/providers/cargo.rb +7 -5
  32. data/lib/dpl/providers/chef_supermarket.rb +82 -80
  33. data/lib/dpl/providers/cloud66.rb +17 -15
  34. data/lib/dpl/providers/cloudfiles.rb +8 -6
  35. data/lib/dpl/providers/cloudformation.rb +191 -187
  36. data/lib/dpl/providers/cloudfoundry.rb +32 -30
  37. data/lib/dpl/providers/codedeploy.rb +35 -33
  38. data/lib/dpl/providers/convox.rb +32 -25
  39. data/lib/dpl/providers/datica.rb +30 -28
  40. data/lib/dpl/providers/ecr.rb +66 -64
  41. data/lib/dpl/providers/elasticbeanstalk.rb +14 -12
  42. data/lib/dpl/providers/engineyard.rb +60 -58
  43. data/lib/dpl/providers/firebase.rb +6 -4
  44. data/lib/dpl/providers/flynn.rb +8 -6
  45. data/lib/dpl/providers/gae.rb +28 -25
  46. data/lib/dpl/providers/gcs.rb +59 -57
  47. data/lib/dpl/providers/git_push.rb +199 -195
  48. data/lib/dpl/providers/gleis.rb +19 -17
  49. data/lib/dpl/providers/hackage.rb +15 -13
  50. data/lib/dpl/providers/hephy.rb +18 -16
  51. data/lib/dpl/providers/heroku/api.rb +72 -70
  52. data/lib/dpl/providers/heroku/git.rb +15 -13
  53. data/lib/dpl/providers/heroku.rb +40 -38
  54. data/lib/dpl/providers/lambda.rb +134 -134
  55. data/lib/dpl/providers/launchpad.rb +45 -43
  56. data/lib/dpl/providers/netlify.rb +7 -5
  57. data/lib/dpl/providers/npm.rb +61 -58
  58. data/lib/dpl/providers/nuget.rb +8 -6
  59. data/lib/dpl/providers/openshift.rb +8 -6
  60. data/lib/dpl/providers/opsworks.rb +23 -21
  61. data/lib/dpl/providers/pages/api.rb +14 -14
  62. data/lib/dpl/providers/pages/git.rb +53 -47
  63. data/lib/dpl/providers/pages.rb +3 -1
  64. data/lib/dpl/providers/puppetforge.rb +6 -4
  65. data/lib/dpl/providers/pypi.rb +55 -54
  66. data/lib/dpl/providers/releases.rb +30 -23
  67. data/lib/dpl/providers/rubygems.rb +35 -31
  68. data/lib/dpl/providers/s3.rb +148 -142
  69. data/lib/dpl/providers/scalingo.rb +18 -16
  70. data/lib/dpl/providers/script.rb +4 -2
  71. data/lib/dpl/providers/snap.rb +12 -9
  72. data/lib/dpl/providers/surge.rb +7 -5
  73. data/lib/dpl/providers/testfairy.rb +47 -43
  74. data/lib/dpl/providers/transifex.rb +20 -18
  75. data/lib/dpl/providers.rb +3 -1
  76. data/lib/dpl/string_ext.rb +3 -1
  77. data/lib/dpl/support/aws_sdk_patch.rb +4 -1
  78. data/lib/dpl/support/gems.rb +7 -3
  79. data/lib/dpl/support/gstore_patch.rb +3 -1
  80. data/lib/dpl/support/version.rb +13 -12
  81. data/lib/dpl/version.rb +3 -1
  82. data/lib/dpl.rb +2 -0
  83. data/status.json +237 -0
  84. metadata +32 -15
  85. /data/lib/dpl/providers/{packagecloud.rb → packagecloud.rb_} +0 -0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'dpl/helper/github'
2
4
 
3
5
  module Dpl
@@ -11,17 +13,17 @@ module Dpl
11
13
 
12
14
  full_name 'GitHub Releases'
13
15
 
14
- description sq(<<-str)
16
+ description sq(<<-STR)
15
17
  tbd
16
- str
18
+ STR
17
19
 
18
- gem 'octokit', '~> 4.15.0'
19
- gem 'mime-types', '~> 3.2.2'
20
- gem 'public_suffix', '~> 3.0.3'
20
+ gem 'octokit', '~> 7'
21
+ gem 'mime-types', '~> 3.4.1'
22
+ gem 'public_suffix', '~> 5'
21
23
 
22
24
  env :github, :releases
23
25
 
24
- required :token, [:username, :password]
26
+ required :token, %i[username password]
25
27
 
26
28
  opt '--token TOKEN', 'GitHub oauth token (needs public_repo or repo permission)', secret: true, alias: :api_key
27
29
  opt '--username LOGIN', 'GitHub login name', alias: :user
@@ -42,24 +44,24 @@ module Dpl
42
44
 
43
45
  needs :git
44
46
 
45
- msgs deploy: 'Deploying to repo: %{slug}',
46
- local_tag: 'Current tag is: %{local_tag}',
47
- login: 'Authenticated as %s',
48
- insufficient_scopes: 'Dpl does not have permission to upload assets. Make sure your token has the repo or public_repo scope.',
49
- insufficient_perm: 'Release resource not found. Make sure your token belongs to an account which has push permission to this repo.',
50
- overwrite_existing: 'File %s already exists, overwriting.',
51
- skip_existing: 'File %s already exists, skipping.',
52
- upload_file: 'Uploading file %s ...',
53
- set_tag_name: 'Setting tag_name to %s',
47
+ msgs deploy: 'Deploying to repo: %{slug}',
48
+ local_tag: 'Current tag is: %{local_tag}',
49
+ login: 'Authenticated as %s',
50
+ insufficient_scopes: 'Dpl does not have permission to upload assets. Make sure your token has the repo or public_repo scope.',
51
+ insufficient_perm: 'Release resource not found. Make sure your token belongs to an account which has push permission to this repo.',
52
+ overwrite_existing: 'File %s already exists, overwriting.',
53
+ skip_existing: 'File %s already exists, skipping.',
54
+ upload_file: 'Uploading file %s ...',
55
+ set_tag_name: 'Setting tag_name to %s',
54
56
  set_target_commitish: 'Setting target_commitish to %s',
55
- missing_file: 'File %s does not exist.',
56
- not_a_file: '%s is not a file, skipping.'
57
+ missing_file: 'File %s does not exist.',
58
+ not_a_file: '%s is not a file, skipping.'
57
59
 
58
60
  cmds git_fetch_tags: 'git fetch --tags'
59
61
 
60
62
  URL = 'https://api.github.com/repos/%s/releases/%s'
61
63
 
62
- OCTOKIT_OPTS = %i(
64
+ OCTOKIT_OPTS = %i[
63
65
  repo
64
66
  name
65
67
  body
@@ -67,12 +69,12 @@ module Dpl
67
69
  release_number
68
70
  tag_name
69
71
  target_commitish
70
- )
72
+ ].freeze
71
73
 
72
74
  TIMEOUTS = {
73
75
  timeout: 180,
74
76
  open_timeout: 180
75
- }
77
+ }.freeze
76
78
 
77
79
  def validate
78
80
  info :deploy
@@ -99,6 +101,7 @@ module Dpl
99
101
  file = normalize_filename(path)
100
102
  asset = asset(file)
101
103
  return info :skip_existing, file if asset && !overwrite?
104
+
102
105
  delete(asset, file) if asset
103
106
  info :upload_file, file
104
107
  api.upload_asset(url, path, name: file, content_type: content_type(path))
@@ -119,12 +122,14 @@ module Dpl
119
122
 
120
123
  def with_tag(opts)
121
124
  return opts if tag_name? || draft?
125
+
122
126
  info :set_tag_name, local_tag
123
127
  opts.merge(tag_name: local_tag)
124
128
  end
125
129
 
126
130
  def with_target_commitish(opts)
127
131
  return opts if target_commitish? || !same_repo?
132
+
128
133
  info :set_target_commitish, git_sha
129
134
  opts.merge(target_commitish: git_sha)
130
135
  end
@@ -137,7 +142,7 @@ module Dpl
137
142
 
138
143
  def url
139
144
  if release_number?
140
- URL % [slug, release_number]
145
+ format(URL, slug, release_number)
141
146
  elsif release
142
147
  release.rels[:self].href
143
148
  else
@@ -202,7 +207,7 @@ module Dpl
202
207
  end
203
208
 
204
209
  def creds
205
- username && password ? { login: username, password: password } : { access_token: token }
210
+ username && password ? { login: username, password: } : { access_token: token }
206
211
  end
207
212
 
208
213
  def files
@@ -212,13 +217,15 @@ module Dpl
212
217
  end
213
218
 
214
219
  def exists?(file)
215
- return true if File.exists?(file)
220
+ return true if File.exist?(file)
221
+
216
222
  error :missing_file, file
217
223
  false
218
224
  end
219
225
 
220
226
  def file?(file)
221
227
  return true if File.file?(file)
228
+
222
229
  warn :not_a_file, file
223
230
  false
224
231
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dpl
2
4
  module Providers
3
5
  class Rubygems < Provider
@@ -5,15 +7,15 @@ module Dpl
5
7
 
6
8
  status :stable
7
9
 
8
- description sq(<<-str)
10
+ description sq(<<-STR)
9
11
  tbd
10
- str
12
+ STR
11
13
 
12
14
  gem 'gems', '~> 1.1.1'
13
15
 
14
16
  env :rubygems
15
17
 
16
- required :api_key, [:username, :password]
18
+ required :api_key, %i[username password]
17
19
 
18
20
  opt '--api_key KEY', 'Rubygems api key', secret: true
19
21
  opt '--username USER', 'Rubygems user name', alias: :user
@@ -24,12 +26,12 @@ module Dpl
24
26
  opt '--host URL'
25
27
 
26
28
  msgs login_api_key: 'Authenticating with api key %{api_key}',
27
- login_creds: 'Authenticating with username %{username} and password %{password}',
28
- setup: 'Setting up host %{host}',
29
- gem_lookup: 'Looking up gem %{gem} ... ',
30
- gem_found: 'found.',
29
+ login_creds: 'Authenticating with username %{username} and password %{password}',
30
+ setup: 'Setting up host %{host}',
31
+ gem_lookup: 'Looking up gem %{gem} ... ',
32
+ gem_found: 'found.',
31
33
  gem_not_found: 'no such gem.',
32
- gem_push: 'Pushing gem %{gem}'
34
+ gem_push: 'Pushing gem %{gem}'
33
35
 
34
36
  cmds gem_build: 'gem build %{gemspec}'
35
37
 
@@ -37,6 +39,7 @@ module Dpl
37
39
 
38
40
  def setup
39
41
  return unless host?
42
+
40
43
  info :setup
41
44
  Gems.host = host
42
45
  end
@@ -58,36 +61,37 @@ module Dpl
58
61
 
59
62
  private
60
63
 
61
- def login_api_key
62
- info :login_api_key
63
- Gems.key = api_key
64
- end
64
+ def login_api_key
65
+ info :login_api_key
66
+ Gems.key = api_key
67
+ end
65
68
 
66
- def login_creds
67
- info :login_creds
68
- Gems.username, Gems.password = username, password
69
- end
69
+ def login_creds
70
+ info :login_creds
71
+ Gems.username = username
72
+ Gems.password = password
73
+ end
70
74
 
71
- def build
72
- Dir[gemspec_glob].each do |gemspec|
73
- shell :gem_build, gemspec: gemspec.whitelist
74
- end
75
+ def build
76
+ Dir[gemspec_glob].each do |gemspec|
77
+ shell :gem_build, gemspec: gemspec.whitelist
75
78
  end
79
+ end
76
80
 
77
- def push
78
- Dir["#{gem}-*.gem"].each do |file|
79
- info :gem_push, gem: file.whitelist
80
- info Gems.push(File.new(file), *[host].compact)
81
- end
81
+ def push
82
+ Dir["#{gem}-*.gem"].each do |file|
83
+ info :gem_push, gem: file.whitelist
84
+ info Gems.push(File.new(file), *[host].compact)
82
85
  end
86
+ end
83
87
 
84
- def gemspec_glob
85
- super || "#{gemspec || gem}.gemspec"
86
- end
88
+ def gemspec_glob
89
+ super || "#{gemspec || gem}.gemspec"
90
+ end
87
91
 
88
- def gemspec
89
- super.gsub('.gemspec', '') if gemspec?
90
- end
92
+ def gemspec
93
+ super.gsub('.gemspec', '') if gemspec?
94
+ end
91
95
  end
92
96
  end
93
97
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'uri'
2
4
 
3
5
  # we want this, don't we?
@@ -12,12 +14,12 @@ module Dpl
12
14
 
13
15
  full_name 'AWS S3'
14
16
 
15
- description sq(<<-str)
17
+ description sq(<<-STR)
16
18
  tbd
17
- str
19
+ STR
18
20
 
19
- gem 'aws-sdk-s3', '~> 1.0'
20
- gem 'mime-types', '~> 3.2.2'
21
+ gem 'aws-sdk-s3', '~> 1'
22
+ gem 'mime-types', '~> 3.4.1'
21
23
 
22
24
  env :aws, :s3
23
25
  config '~/.aws/credentials', '~/.aws/config', prefix: 'aws'
@@ -31,12 +33,12 @@ module Dpl
31
33
  opt '--local_dir DIR', 'Local directory to upload from', default: '.', example: '~/travis/build (absolute path) or ./build (relative path)'
32
34
  opt '--glob GLOB', 'Files to upload', default: '**/*'
33
35
  opt '--dot_match', 'Upload hidden files starting with a dot'
34
- opt '--acl ACL', 'Access control for the uploaded objects', default: 'private', enum: %w(private public_read public_read_write authenticated_read bucket_owner_read bucket_owner_full_control)
36
+ opt '--acl ACL', 'Access control for the uploaded objects', default: 'private', enum: %w[private public_read public_read_write authenticated_read bucket_owner_read bucket_owner_full_control]
35
37
  opt '--detect_encoding', 'HTTP header Content-Encoding for files compressed with gzip and compress utilities'
36
38
  opt '--cache_control STR', 'HTTP header Cache-Control to suggest that the browser cache the file', type: :array, default: 'no-cache', enum: [/^no-cache.*/, /^no-store.*/, /^max-age=\d+.*/, /^s-maxage=\d+.*/, /^no-transform/, /^public/, /^private/], note: 'accepts mapping values to globs', eg: 'public: *.css,*.js'
37
39
  opt '--expires DATE', 'Date and time that the cached object expires', type: :array, format: /^"?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} .+"?.*$/, note: 'accepts mapping values to globs', eg: '2020-01-01 00:00:00 UTC: *.css,*.js'
38
40
  opt '--default_text_charset CHARSET', 'Default character set to append to the content-type of text files'
39
- opt '--storage_class CLASS', 'S3 storage class to upload as', default: 'STANDARD', enum: %w(STANDARD STANDARD_IA REDUCED_REDUNDANCY)
41
+ opt '--storage_class CLASS', 'S3 storage class to upload as', default: 'STANDARD', enum: %w[STANDARD STANDARD_IA REDUCED_REDUNDANCY]
40
42
  opt '--server_side_encryption', 'Use S3 Server Side Encryption (SSE-AES256)'
41
43
  opt '--index_document_suffix SUFFIX', 'Index document suffix of a S3 website'
42
44
  opt '--overwrite', 'Whether or not to overwrite existing files', default: true
@@ -44,15 +46,15 @@ module Dpl
44
46
  opt '--max_threads NUM', 'The number of threads to use for S3 file uploads', default: 5, max: 15, type: :integer
45
47
  opt '--verbose', 'Be verbose about uploading files'
46
48
 
47
- msgs login: 'Using Access Key: %{access_key_id}',
48
- default_uri_schema: 'S3 endpoint does not specify a scheme; defaulting to https',
49
- access_denied: 'It looks like you tried to write to a bucket that is not yours or does not exist. Please create the bucket before trying to write to it.',
50
- checksum_error: 'AWS secret key does not match the access key id',
49
+ msgs login: 'Using Access Key: %{access_key_id}',
50
+ default_uri_schema: 'S3 endpoint does not specify a scheme; defaulting to https',
51
+ access_denied: 'It looks like you tried to write to a bucket that is not yours or does not exist. Please create the bucket before trying to write to it.',
52
+ checksum_error: 'AWS secret key does not match the access key id',
51
53
  invalid_access_key_id: 'Invalid S3 access key id',
52
- upload: 'Uploading %s files with up to %s threads ...',
53
- upload_file: 'Uploading %s to %s with %s',
54
- upload_skipped: 'Skipping %{file}, already exists',
55
- upload_failed: 'Failed to upload %s',
54
+ upload: 'Uploading %s files with up to %s threads ...',
55
+ upload_file: 'Uploading %s to %s with %s',
56
+ upload_skipped: 'Skipping %{file}, already exists',
57
+ upload_failed: 'Failed to upload %s',
56
58
  index_document_suffix: 'Setting index document suffix to %s'
57
59
 
58
60
  DEFAULT_CONTENT_TYPE = 'application/octet-stream'
@@ -80,166 +82,170 @@ module Dpl
80
82
 
81
83
  private
82
84
 
83
- def upload
84
- info :upload, files.length, max_threads
85
- threads = max_threads.times.map { |i| Thread.new(&method(:upload_files)) }
86
- threads.each(&:join)
87
- info "\n" unless verbose?
88
- end
85
+ def upload
86
+ info :upload, files.length, max_threads
87
+ threads = max_threads.times.map { |_i| Thread.new(&method(:upload_files)) }
88
+ threads.each(&:join)
89
+ info "\n" unless verbose?
90
+ end
89
91
 
90
- def upload_files
91
- while file = files.pop
92
- opts = upload_opts(file)
93
- progress(file, opts)
94
- upload_file(file, opts)
95
- end
92
+ def upload_files
93
+ while file = files.pop
94
+ opts = upload_opts(file)
95
+ progress(file, opts)
96
+ upload_file(file, opts)
96
97
  end
98
+ end
97
99
 
98
- def progress(file, data)
99
- if verbose?
100
- info :upload_file, file, upload_dir || '/', to_pairs(data)
101
- else
102
- print '.'
103
- end
100
+ def progress(file, data)
101
+ if verbose?
102
+ info :upload_file, file, upload_dir || '/', to_pairs(data)
103
+ else
104
+ print '.'
104
105
  end
106
+ end
105
107
 
106
- def upload_file(file, opts)
107
- object = bucket.object(upload_path(file))
108
- return warn :upload_skipped, file: file if !overwrite && object.exists?
109
- info :upload_file, file, upload_dir || '/', to_pairs(opts)
110
- object.upload_file(file, opts) || warn(:upload_failed, file)
111
- end
108
+ def upload_file(file, opts)
109
+ object = bucket.object(upload_path(file))
110
+ return warn :upload_skipped, file: file if !overwrite && object.exists?
112
111
 
113
- def index_document_suffix
114
- info :index_document_suffix, super
115
- body = { website_configuration: { index_document: { suffix: super } } }
116
- bucket.website.put(body)
117
- end
112
+ info :upload_file, file, upload_dir || '/', to_pairs(opts)
113
+ object.upload_file(file, opts) || warn(:upload_failed, file)
114
+ end
118
115
 
119
- def upload_path(file)
120
- [upload_dir, file].compact.join('/')
121
- end
116
+ def index_document_suffix
117
+ info :index_document_suffix, super
118
+ body = { website_configuration: { index_document: { suffix: super } } }
119
+ bucket.website.put(body)
120
+ end
122
121
 
123
- def upload_opts(file)
124
- compact(
125
- acl: acl,
126
- content_type: content_type(file),
127
- content_encoding: detect_encoding? ? encoding(file) : nil,
128
- cache_control: match_opt(cache_control, file),
129
- expires: match_opt(expires, file),
130
- storage_class: storage_class,
131
- server_side_encryption: server_side_encryption
132
- )
133
- end
122
+ def upload_path(file)
123
+ [upload_dir, file].compact.join('/')
124
+ end
134
125
 
135
- def files
136
- @files ||= Dir.glob(*glob).reject { |path| File.directory?(path) }
137
- end
126
+ def upload_opts(file)
127
+ compact(
128
+ acl:,
129
+ content_type: content_type(file),
130
+ content_encoding: detect_encoding? ? encoding(file) : nil,
131
+ cache_control: match_opt(cache_control, file),
132
+ expires: match_opt(expires, file),
133
+ storage_class:,
134
+ server_side_encryption:
135
+ )
136
+ end
138
137
 
139
- def glob
140
- [super, dot_match? ? File::FNM_DOTMATCH : nil].compact
141
- end
138
+ def files
139
+ @files ||= Dir.glob(*glob).reject { |path| File.directory?(path) }
140
+ end
142
141
 
143
- def acl
144
- super.gsub(/_/, '-') if acl?
145
- end
142
+ def glob
143
+ [super, dot_match? ? File::FNM_DOTMATCH : nil].compact
144
+ end
146
145
 
147
- def server_side_encryption
148
- 'AES256' if server_side_encryption?
149
- end
146
+ def acl
147
+ super.gsub(/_/, '-') if acl?
148
+ end
150
149
 
151
- def content_type(file)
152
- return DEFAULT_CONTENT_TYPE unless type = MIME::Types.type_for(file).first
153
- type = "#{type}; charset=#{default_text_charset}" if encoding(file) == 'text' && default_text_charset?
154
- type.to_s
155
- end
150
+ def server_side_encryption
151
+ 'AES256' if server_side_encryption?
152
+ end
156
153
 
157
- def compact(hash)
158
- hash.reject { |_, value| value.nil? }.to_h
159
- end
154
+ def content_type(file)
155
+ return DEFAULT_CONTENT_TYPE unless type = MIME::Types.type_for(file).first
160
156
 
161
- def endpoint
162
- @endpoint ||= normalize_endpoint(super) if endpoint?
163
- end
157
+ type = "#{type}; charset=#{default_text_charset}" if encoding(file) == 'text' && default_text_charset?
158
+ type.to_s
159
+ end
164
160
 
165
- def normalize_endpoint(url)
166
- uri = URI.parse(url)
167
- return uri if uri.scheme
168
- info :default_uri_scheme
169
- URI.parse("https://#{url}")
170
- end
161
+ def compact(hash)
162
+ hash.reject { |_, value| value.nil? }.to_h
163
+ end
171
164
 
172
- def handle_error(e)
173
- case e
174
- when Aws::S3::Errors::InvalidAccessKeyId
175
- error :invalid_access_key_id
176
- when Aws::S3::Errors::ChecksumError
177
- error :checksum_error
178
- when Aws::S3::Errors::AccessDenied
179
- error :access_denied
180
- else
181
- error e.message
182
- end
183
- end
165
+ def endpoint
166
+ @endpoint ||= normalize_endpoint(super) if endpoint?
167
+ end
184
168
 
185
- def bucket
186
- @bucket ||= Aws::S3::Resource.new(client: client).bucket(super)
187
- end
169
+ def normalize_endpoint(url)
170
+ uri = URI.parse(url)
171
+ return uri if uri.scheme
188
172
 
189
- def client
190
- Aws::S3::Client.new(s3_opts)
191
- end
173
+ info :default_uri_scheme
174
+ URI.parse("https://#{url}")
175
+ end
192
176
 
193
- def s3_opts
194
- compact(
195
- region: region,
196
- credentials: credentials,
197
- endpoint: endpoint,
198
- force_path_style: force_path_style?
199
- )
177
+ def handle_error(err)
178
+ case err
179
+ when Aws::S3::Errors::InvalidAccessKeyId
180
+ error :invalid_access_key_id
181
+ when Aws::S3::Errors::ChecksumError
182
+ error :checksum_error
183
+ when Aws::S3::Errors::AccessDenied
184
+ error :access_denied
185
+ else
186
+ error err.message
200
187
  end
188
+ end
201
189
 
202
- def credentials
203
- Aws::Credentials.new(access_key_id, secret_access_key)
204
- end
190
+ def bucket
191
+ @bucket ||= Aws::S3::Resource.new(client:).bucket(super)
192
+ end
205
193
 
206
- def to_pairs(hash)
207
- hash.map { |pair| pair.join('=') }.join(' ')
208
- end
194
+ def client
195
+ Aws::S3::Client.new(s3_opts)
196
+ end
209
197
 
210
- def match_opt(strs, file)
211
- maps = Array(strs).map { |str| Mapping.new(str, file) }
212
- maps.map(&:value).compact.first
213
- end
198
+ def s3_opts
199
+ compact(
200
+ region:,
201
+ credentials:,
202
+ endpoint:,
203
+ force_path_style: force_path_style?
204
+ )
205
+ end
214
206
 
215
- class Mapping < Struct.new(:str, :file)
216
- MATCH = File::FNM_DOTMATCH | File::FNM_EXTGLOB
207
+ def credentials
208
+ Aws::Credentials.new(access_key_id, secret_access_key)
209
+ end
210
+
211
+ def to_pairs(hash)
212
+ hash.map { |pair| pair.join('=') }.join(' ')
213
+ end
214
+
215
+ def match_opt(strs, file)
216
+ maps = Array(strs).map { |str| Mapping.new(str, file) }
217
+ maps.map(&:value).compact.first
218
+ end
219
+
220
+ class Mapping < Struct.new(:str, :file)
221
+ MATCH = File::FNM_DOTMATCH | File::FNM_EXTGLOB
217
222
 
218
- def value
219
- str, glob = parse
220
- unquote(str) if match?(glob)
221
- end
223
+ def value
224
+ str, glob = parse
225
+ unquote(str) if match?(glob)
226
+ end
227
+
228
+ private
222
229
 
223
- private
230
+ def unquote(str)
231
+ str =~ /^"(.*)"$/ && ::Regexp.last_match(1) || str
232
+ end
224
233
 
225
- def unquote(str)
226
- str =~ /^"(.*)"$/ && $1 || str
227
- end
234
+ def match?(glob)
235
+ glob.nil? || File.fnmatch?(normalize(glob), file, MATCH)
236
+ end
228
237
 
229
- def match?(glob)
230
- glob.nil? || File.fnmatch?(normalize(glob), file, MATCH)
231
- end
238
+ def normalize(glob)
239
+ return glob if glob.include?('{')
232
240
 
233
- def normalize(glob)
234
- return glob if glob.include?('{')
235
- "{#{glob.split(',').map(&:strip).join(',')}}"
236
- end
241
+ "{#{glob.split(',').map(&:strip).join(',')}}"
242
+ end
237
243
 
238
- def parse
239
- parts = str.split(': ')
240
- parts.size > 1 ? [parts[0..-2].join(': '), parts.last] : parts
241
- end
244
+ def parse
245
+ parts = str.split(': ')
246
+ parts.size > 1 ? [parts[0..-2].join(': '), parts.last] : parts
242
247
  end
248
+ end
243
249
  end
244
250
  end
245
251
  end