-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathprefixed_collection.rb
85 lines (77 loc) · 2.66 KB
/
prefixed_collection.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
module AWS
class S3
module PrefixedCollection
include PaginatedCollection
# @api private
def initialize *args
options = args.last.is_a?(Hash) ? args.pop : {}
@prefix = options[:prefix]
args.push(options)
super(*args)
end
# @return [String,nil] The prefix of this collection.
attr_reader :prefix
# Returns a new collection with a different prefix
#
# @example
#
# objects = collection.with_prefix('photos')
# objects.prefix #=> 'photos'
#
# @example Chaining with_prefix replaces previous prefix
#
# objects = collection.with_prefix('photos').with_prefix('videos')
# objects.prefix #=> 'videos'
#
# @example Chaining with_prefix with :append
#
# objects = collection.with_prefix('a/').with_prefix('b/', :append)
# objects.prefix #=> 'a/b/'
#
# @example Chaining with_prefix with :prepend
#
# objects = collection.with_prefix('a/').with_prefix('b/', :prepend)
# objects.prefix #=> 'b/a/'
#
# @param [String] prefix The prefix condition that limits what objects
# are returned by this collection.
# @param [Symbol] mode (:replace) If you chain calls to #with_prefix
# the `mode` affects if the prefix prepends, appends, or replaces.
# Valid modes are:
# * `:replace`
# * `:append`
# * `:prepend`
# @return [Collection] Returns a new collection with a modified prefix.
def with_prefix prefix, mode = :replace
new_prefix = case mode
when :replace then prefix
when :append then "#{@prefix}#{prefix}"
when :prepend then "#{prefix}#{@prefix}"
else
raise ArgumentError, "invalid prefix mode `#{mode}`, it must be " +
":replace, :append or :prepend"
end
self.class.new(bucket, :prefix => new_prefix)
end
# @api private
protected
def list_options(options)
opts = super
opts[:prefix] = prefix if prefix
opts
end
end
end
end