zip-container 0.8.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.
- data/Changes.rdoc +59 -0
- data/Licence.rdoc +29 -0
- data/Rakefile +85 -0
- data/ReadMe.rdoc +34 -0
- data/examples/create-zip-container.rb +61 -0
- data/examples/verify-zip-container.rb +44 -0
- data/examples/zip-container-info +70 -0
- data/lib/zip-container.rb +60 -0
- data/lib/zip-container/container.rb +491 -0
- data/lib/zip-container/entries/directory.rb +71 -0
- data/lib/zip-container/entries/entry.rb +135 -0
- data/lib/zip-container/entries/file.rb +101 -0
- data/lib/zip-container/entries/managed.rb +183 -0
- data/lib/zip-container/entries/reserved.rb +88 -0
- data/lib/zip-container/exceptions.rb +70 -0
- data/test/data/compressed_mimetype.container +0 -0
- data/test/data/empty.container +0 -0
- data/test/data/empty.zip +0 -0
- data/test/data/example.container +0 -0
- data/test/data/null.file +0 -0
- data/test/tc_create.rb +140 -0
- data/test/tc_managed_entries.rb +230 -0
- data/test/tc_read.rb +109 -0
- data/test/tc_reserved_names.rb +334 -0
- data/test/ts_container.rb +47 -0
- data/version.yml +4 -0
- data/zip-container.gemspec +77 -0
- metadata +145 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
# Copyright (c) 2013 The University of Manchester, UK.
|
2
|
+
#
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# * Neither the names of The University of Manchester nor the names of its
|
16
|
+
# contributors may be used to endorse or promote products derived from this
|
17
|
+
# software without specific prior written permission.
|
18
|
+
#
|
19
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
22
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
23
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
#
|
31
|
+
# Author: Robert Haines
|
32
|
+
|
33
|
+
#
|
34
|
+
module ZipContainer
|
35
|
+
|
36
|
+
# A ManagedDirectory acts as the interface to a set of (possibly) managed
|
37
|
+
# files within it and also reserves the directory name in the Container
|
38
|
+
# namespace.
|
39
|
+
#
|
40
|
+
# Once a ManagedDirectory is registered in a Container then only it can be
|
41
|
+
# used to write to its contents.
|
42
|
+
class ManagedDirectory < ManagedEntry
|
43
|
+
include ReservedNames
|
44
|
+
include ManagedEntries
|
45
|
+
|
46
|
+
# :call-seq:
|
47
|
+
# new(name, required = false) -> ManagedDirectory
|
48
|
+
#
|
49
|
+
# Create a new ManagedDirectory with the supplied name and whether it is
|
50
|
+
# required to exist or not. Any ManagedFile or ManagedDirectory objects
|
51
|
+
# that are within this directory can also be given if required.
|
52
|
+
def initialize(name, required = false, entries = [])
|
53
|
+
super(name, required)
|
54
|
+
|
55
|
+
initialize_managed_entries(entries)
|
56
|
+
end
|
57
|
+
|
58
|
+
# :call-seq:
|
59
|
+
# verify!
|
60
|
+
#
|
61
|
+
# Verify this ManagedDirectory for correctness. ManagedFiles registered
|
62
|
+
# within it are verified recursively.
|
63
|
+
#
|
64
|
+
# A MalformedZipContainerError is raised if it does not pass verification.
|
65
|
+
def verify!
|
66
|
+
super
|
67
|
+
@files.values.each { |f| f.verify! }
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# Copyright (c) 2013 The University of Manchester, UK.
|
2
|
+
#
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# * Neither the names of The University of Manchester nor the names of its
|
16
|
+
# contributors may be used to endorse or promote products derived from this
|
17
|
+
# software without specific prior written permission.
|
18
|
+
#
|
19
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
22
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
23
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
#
|
31
|
+
# Author: Robert Haines
|
32
|
+
|
33
|
+
#
|
34
|
+
module ZipContainer
|
35
|
+
|
36
|
+
# ManagedEntry is the superclass of ManagedDirectory and ManagedFile. It
|
37
|
+
# should not be used directly but may be subclassed if necessary.
|
38
|
+
class ManagedEntry
|
39
|
+
|
40
|
+
# The name of the ManagedEntry. For the full path name of this entry use
|
41
|
+
# full_name.
|
42
|
+
attr_reader :name
|
43
|
+
|
44
|
+
# :call-seq:
|
45
|
+
# new(name, required) -> ManagedEntry
|
46
|
+
#
|
47
|
+
# Create a new ManagedEntry with the supplied name. The entry should also
|
48
|
+
# be marked as required or not.
|
49
|
+
def initialize(name, required)
|
50
|
+
@parent = nil
|
51
|
+
@name = name
|
52
|
+
@required = required
|
53
|
+
end
|
54
|
+
|
55
|
+
# :call-seq:
|
56
|
+
# full_name -> string
|
57
|
+
#
|
58
|
+
# The fully qualified name of this ManagedEntry.
|
59
|
+
def full_name
|
60
|
+
@parent.is_a?(Container) ? @name : "#{@parent.name}/#{@name}"
|
61
|
+
end
|
62
|
+
|
63
|
+
# :call-seq:
|
64
|
+
# required? -> true or false
|
65
|
+
#
|
66
|
+
# Is this ManagedEntry required to be present according to the
|
67
|
+
# specification of its Container?
|
68
|
+
def required?
|
69
|
+
@required
|
70
|
+
end
|
71
|
+
|
72
|
+
# :call-seq:
|
73
|
+
# exists? -> true or false
|
74
|
+
#
|
75
|
+
# Does this ManagedEntry exist in the Container?
|
76
|
+
def exists?
|
77
|
+
container.entries.each do |entry|
|
78
|
+
test = (entry.ftype == :directory) ? "#{full_name}/" : full_name
|
79
|
+
return true if entry.name == test
|
80
|
+
end
|
81
|
+
|
82
|
+
false
|
83
|
+
end
|
84
|
+
|
85
|
+
# :stopdoc:
|
86
|
+
# Allows the object in which this entry has been registered in to tell it
|
87
|
+
# who it is.
|
88
|
+
def parent=(parent)
|
89
|
+
@parent = parent
|
90
|
+
end
|
91
|
+
# :startdoc:
|
92
|
+
|
93
|
+
# :call-seq:
|
94
|
+
# verify -> true or false
|
95
|
+
#
|
96
|
+
# Verify this ManagedEntry by checking that it exists if it is required
|
97
|
+
# according to its Container specification and validating its contents if
|
98
|
+
# necessary.
|
99
|
+
def verify
|
100
|
+
begin
|
101
|
+
verify!
|
102
|
+
rescue
|
103
|
+
return false
|
104
|
+
end
|
105
|
+
|
106
|
+
true
|
107
|
+
end
|
108
|
+
|
109
|
+
protected
|
110
|
+
|
111
|
+
# :call-seq:
|
112
|
+
# verify!
|
113
|
+
#
|
114
|
+
# Verify this ManagedEntry raising a MalformedZipContainerError if it
|
115
|
+
# fails.
|
116
|
+
#
|
117
|
+
# Subclasses should override this method if they require more complex
|
118
|
+
# verification to be done.
|
119
|
+
def verify!
|
120
|
+
unless !@required || exists?
|
121
|
+
raise MalformedZipContainerError.new("Entry '#{full_name}' is required but "\
|
122
|
+
"missing.")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# :call-seq:
|
127
|
+
# container -> Container
|
128
|
+
#
|
129
|
+
# Return the Container that this ManagedEntry resides in.
|
130
|
+
def container
|
131
|
+
@parent.is_a?(Container) ? @parent : @parent.container
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# Copyright (c) 2013 The University of Manchester, UK.
|
2
|
+
#
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# * Neither the names of The University of Manchester nor the names of its
|
16
|
+
# contributors may be used to endorse or promote products derived from this
|
17
|
+
# software without specific prior written permission.
|
18
|
+
#
|
19
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
22
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
23
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
#
|
31
|
+
# Author: Robert Haines
|
32
|
+
|
33
|
+
#
|
34
|
+
module ZipContainer
|
35
|
+
|
36
|
+
# A ManagedFile is used to reserve a filename in a Container namespace.
|
37
|
+
class ManagedFile < ManagedEntry
|
38
|
+
|
39
|
+
# :call-seq:
|
40
|
+
# new(name, required = false, validation_proc = nil) -> ManagedFile
|
41
|
+
#
|
42
|
+
# Create a new ManagedFile with the supplied name and whether it is
|
43
|
+
# required to exist or not.
|
44
|
+
#
|
45
|
+
# If supplied <tt>validation_proc</tt> should be a Proc that takes a
|
46
|
+
# single parameter and returns +true+ or +false+ depending on whether the
|
47
|
+
# contents of the file were validated or not.
|
48
|
+
#
|
49
|
+
# For more complex content validation subclasses may override the validate
|
50
|
+
# method.
|
51
|
+
#
|
52
|
+
# The following example creates a ManagedFile that is not required to be
|
53
|
+
# present in the container, but if it is, its contents must be the single
|
54
|
+
# word "Boo!".
|
55
|
+
#
|
56
|
+
# valid = Proc.new { |contents| contents == "Boo!" }
|
57
|
+
# ManagedFile.new("Surprize.txt", false, valid)
|
58
|
+
def initialize(name, required = false, validation_proc = nil)
|
59
|
+
super(name, required)
|
60
|
+
|
61
|
+
@validation_proc = validation_proc.is_a?(Proc) ? validation_proc : nil
|
62
|
+
end
|
63
|
+
|
64
|
+
# :call-seq:
|
65
|
+
# verify!
|
66
|
+
#
|
67
|
+
# Verify this ManagedFile for correctness. The contents are validated if
|
68
|
+
# required.
|
69
|
+
#
|
70
|
+
# A MalformedZipContainerError is raised if it does not pass verification.
|
71
|
+
def verify!
|
72
|
+
super
|
73
|
+
unless (exists? ? validate : true)
|
74
|
+
raise MalformedZipContainerError.new("The contents of file "\
|
75
|
+
"'#{full_name}' do not pass validation.")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
protected
|
80
|
+
|
81
|
+
# :call-seq:
|
82
|
+
# validate -> boolean
|
83
|
+
#
|
84
|
+
# Validate the contents of this ManagedFile. By default this methods uses
|
85
|
+
# the validation Proc supplied on object initialization if there is one.
|
86
|
+
# If not it simply returns true (no validation was required).
|
87
|
+
#
|
88
|
+
# For complex validations of content subclasses can override this method.
|
89
|
+
def validate
|
90
|
+
@validation_proc.nil? ? true : @validation_proc.call(contents)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
# Grab the contents of this ManagedFile
|
96
|
+
def contents
|
97
|
+
container.read(full_name)
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# Copyright (c) 2013 The University of Manchester, UK.
|
2
|
+
#
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# * Neither the names of The University of Manchester nor the names of its
|
16
|
+
# contributors may be used to endorse or promote products derived from this
|
17
|
+
# software without specific prior written permission.
|
18
|
+
#
|
19
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
22
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
23
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
#
|
31
|
+
# Author: Robert Haines
|
32
|
+
|
33
|
+
require 'zip/zip_entry'
|
34
|
+
|
35
|
+
module ZipContainer
|
36
|
+
|
37
|
+
# This module provides support for managed file and directory entries.
|
38
|
+
#
|
39
|
+
# <b>Note!</b> If you mix this module in you *must* call
|
40
|
+
# +initialize_managed_entries+ in your constructor to ensure that the
|
41
|
+
# internal lists of managed entries are correctly assigned.
|
42
|
+
module ManagedEntries
|
43
|
+
|
44
|
+
# :call-seq:
|
45
|
+
# managed_directories -> Array
|
46
|
+
#
|
47
|
+
# Return the list of managed directories.
|
48
|
+
def managed_directories
|
49
|
+
@directories.values
|
50
|
+
end
|
51
|
+
|
52
|
+
# :call-seq:
|
53
|
+
# managed_directory_names -> Array
|
54
|
+
#
|
55
|
+
# Return the list of managed directory names.
|
56
|
+
def managed_directory_names
|
57
|
+
expand_names(@directories.keys)
|
58
|
+
end
|
59
|
+
|
60
|
+
# :call-seq:
|
61
|
+
# managed_directory?(entry) -> boolean
|
62
|
+
#
|
63
|
+
# Is the supplied entry/name a managed directory?
|
64
|
+
def managed_directory?(entry)
|
65
|
+
managed_entry?(entry, managed_directory_names)
|
66
|
+
end
|
67
|
+
|
68
|
+
# :call-seq:
|
69
|
+
# managed_entries -> Array
|
70
|
+
#
|
71
|
+
# Return the list of managed files and directories.
|
72
|
+
def managed_entries
|
73
|
+
managed_files + managed_directories
|
74
|
+
end
|
75
|
+
|
76
|
+
# :call-seq:
|
77
|
+
# managed_entry_names -> Array
|
78
|
+
#
|
79
|
+
# Return the list of managed file and directory names.
|
80
|
+
def managed_entry_names
|
81
|
+
managed_file_names + managed_directory_names
|
82
|
+
end
|
83
|
+
|
84
|
+
# :call-seq:
|
85
|
+
# managed_entry?(entry) -> boolean
|
86
|
+
#
|
87
|
+
# Is the supplied entry/name a managed entry?
|
88
|
+
def managed_entry?(entry, list = managed_entry_names)
|
89
|
+
name = entry.kind_of?(::Zip::ZipEntry) ? entry.name : entry
|
90
|
+
name.chop! if name.end_with? "/"
|
91
|
+
list.map { |n| n.downcase }.include? name.downcase
|
92
|
+
end
|
93
|
+
|
94
|
+
# :call-seq:
|
95
|
+
# managed_file?(entry) -> boolean
|
96
|
+
#
|
97
|
+
# Is the supplied entry/name a managed file?
|
98
|
+
def managed_file?(entry)
|
99
|
+
managed_entry?(entry, managed_file_names)
|
100
|
+
end
|
101
|
+
|
102
|
+
# :call-seq:
|
103
|
+
# managed_files -> Array
|
104
|
+
#
|
105
|
+
# Return the list of managed files.
|
106
|
+
def managed_files
|
107
|
+
@files.values + managed_directories.map { |d| d.managed_files }.flatten
|
108
|
+
end
|
109
|
+
|
110
|
+
# :call-seq:
|
111
|
+
# managed_file_names -> Array
|
112
|
+
#
|
113
|
+
# Return the list of managed file names.
|
114
|
+
def managed_file_names
|
115
|
+
expand_names(@files.keys) +
|
116
|
+
managed_directories.map { |d| d.managed_file_names }.flatten
|
117
|
+
end
|
118
|
+
|
119
|
+
# :call-seq:
|
120
|
+
# verify_managed_entries!
|
121
|
+
#
|
122
|
+
# All managed files and directories are checked to make sure that they
|
123
|
+
# exist, if required.
|
124
|
+
def verify_managed_entries!
|
125
|
+
@directories.each_value do |dir|
|
126
|
+
dir.verify!
|
127
|
+
end
|
128
|
+
|
129
|
+
@files.each_value do |file|
|
130
|
+
file.verify!
|
131
|
+
end
|
132
|
+
|
133
|
+
true
|
134
|
+
end
|
135
|
+
|
136
|
+
protected
|
137
|
+
|
138
|
+
# :call-seq:
|
139
|
+
# initialize_managed_entries
|
140
|
+
# initialize_managed_entries(entry)
|
141
|
+
# initialize_managed_entries(entries)
|
142
|
+
#
|
143
|
+
# Initialize the managed entries and register any that are supplied. A
|
144
|
+
# single ManagedFile or ManagedDirectory or a list of them can be
|
145
|
+
# provided.
|
146
|
+
def initialize_managed_entries(entries = [])
|
147
|
+
list = [*entries]
|
148
|
+
@directories ||= {}
|
149
|
+
@files ||= {}
|
150
|
+
|
151
|
+
list.each { |item| register_managed_entry(item) }
|
152
|
+
end
|
153
|
+
|
154
|
+
# :call-seq:
|
155
|
+
# register_managed_entry(entry)
|
156
|
+
#
|
157
|
+
# Register a ManagedFile or ManagedDirectory.
|
158
|
+
#
|
159
|
+
# A ManagedFile is used to reserve the name of a file in the container
|
160
|
+
# namespace and can describe how to verify the contents of it if required.
|
161
|
+
#
|
162
|
+
# A ManagedDirectory is used to both reserve the name of a directory in
|
163
|
+
# the container namespace and act as an interface to the (possibly)
|
164
|
+
# managed files within it.
|
165
|
+
def register_managed_entry(entry)
|
166
|
+
unless entry.is_a?(ManagedDirectory) || entry.is_a?(ManagedFile)
|
167
|
+
raise ArgumentError.new("The supplied entry must be of type "\
|
168
|
+
"ManagedDirectory or ManagedFile or a subclass of either.")
|
169
|
+
end
|
170
|
+
|
171
|
+
entry.parent = self
|
172
|
+
@directories[entry.name] = entry if entry.is_a? ManagedDirectory
|
173
|
+
@files[entry.name] = entry if entry.is_a? ManagedFile
|
174
|
+
end
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def expand_names(names)
|
179
|
+
names.map { |n| self.is_a?(Container) ? n : "#{name}/#{n}" }
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
end
|