zip-container 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZmM2M2M1M2YyMWUwOTk2NWRkNjllMjU0MDc0ZjQ4NGU3OWRiNTFlMg==
4
+ NmZhNWQzYmVkZGVjNDczNTNjN2M3M2Q2ZmJjYmI5YTEzMDYwZTE0Nw==
5
5
  data.tar.gz: !binary |-
6
- OWFjNzFmYjM4NTliZjc4ZGE0NTZjYzNhMjBiMjJjY2Q3NGVmZjdmMw==
6
+ Mzg5YjU5ZjYyYjMzOGUyZWU1ZTk5NjI4YWRmNTQwNTk1NTU1OGJmZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZmQxZTFjNzY2NjEyZGIzM2IzOTc2ZGU1ZjlkM2IwMzljZmM4NmUyN2JmNWYx
10
- ZGU4YWU0ZjYzOTU3MjU3ZWVhZjdlNzI4MjY3MzhkYTEyNmNkOGFjNWNkZjFh
11
- NmE1YWU3YWFjMzM0ODI0YTM2YTc4NzU3MDYyYzE2MTVjMDZjMTc=
9
+ N2NjNjI1ZmJhNTQ5NzdiMGU3MjgxZTEwNjM5Zjk5NDgyMGYxYzRjZmYwMmNm
10
+ ODg2M2ZmZTllNjU2YjNmMWU2ZGQzOTlhYTE3ODAzNzI3NjY2YmRiY2JiYjg2
11
+ MjZkN2E5NTljMmIzYjIyNTcyZTE4ZDg3OGY4M2Q1NzkxOGJhZjc=
12
12
  data.tar.gz: !binary |-
13
- MDBmMWJmMjE2YzY4ZjkxYWZiOWU2NzNhOTU3Njk4MDViYWIzOGYyMDEzZDlk
14
- NTNiYTM4YmFmMjAwNDZmZGVlMjYxMTAxMDU3YTcyYWVmMmE1NjFjMGY5MGFm
15
- YmE0MjQwOTFkZjk1MGM2ZDQyY2ZhMDViYTA0NWYyM2ZlMjk3YTU=
13
+ NzNhYjc1YmQ5MTg5YWU1ZDNlN2U0MDlkMDYxNDgxNDYxOTA2YWM5MzI2Njgz
14
+ MmRjOTkyNWM1NWMzZmE5ZDA1ZTBiNGJhMzRhNWZkMGU5MWEwMDBjNjcxNzUx
15
+ NDU2ZGMwNGEyNjBkYjFkM2Q3MzMwMzAzMzcyYjMyZTEwZjcyNjA=
@@ -1,5 +1,13 @@
1
1
  = Changes log for the ZIP Container Ruby Gem
2
2
 
3
+ == Version 2.2.0
4
+
5
+ * Fix pathname bug in ZipContainer::Dir.
6
+ * Fixup docs to refer to containers rather than documents.
7
+ * Fix the base class in the recursive methods.
8
+ * Add an internal compatibility method Dir#entries.
9
+ * Add a compatibility method Dir#read.
10
+
3
11
  == Version 2.1.0
4
12
 
5
13
  * Set up the Container superclass.
@@ -48,8 +48,8 @@ module ZipContainer
48
48
  class Dir < Container
49
49
 
50
50
  extend Forwardable
51
- def_delegators :@container, :close, :each, :path, :pos, :pos=, :read,
52
- :rewind, :seek, :tell
51
+ def_delegators :@container, :close, :each, :path, :pos, :pos=, :rewind,
52
+ :seek, :tell
53
53
 
54
54
  private_class_method :new
55
55
 
@@ -60,14 +60,14 @@ module ZipContainer
60
60
  # :startdoc:
61
61
 
62
62
  # :call-seq:
63
- # create(pathname, mimetype) -> document
64
- # create(pathname, mimetype) {|document| ...}
63
+ # create(pathname, mimetype) -> container
64
+ # create(pathname, mimetype) {|container| ...}
65
65
  #
66
66
  # Create a new (or convert an existing) directory as a ZipContainer with
67
67
  # the specified mimetype.
68
68
  def self.create(pathname, mimetype, &block)
69
69
  ::Dir.mkdir(pathname) unless ::File.directory?(pathname)
70
- ::File.write(full_path(MIMETYPE_FILE), mimetype)
70
+ ::File.write(::File.join(pathname, MIMETYPE_FILE), mimetype)
71
71
 
72
72
  # Now open the newly created container.
73
73
  c = new(pathname)
@@ -83,6 +83,53 @@ module ZipContainer
83
83
  c
84
84
  end
85
85
 
86
+ # :call-seq:
87
+ # read
88
+ # read(path) -> file contents
89
+ #
90
+ # Provides compatibility between directory and zip containers. If called
91
+ # without any parameters it acts like
92
+ # {::Dir.read}[http://ruby-doc.org/core-1.9.3/Dir.html#method-i-read] but
93
+ # if called with a path then it acts like
94
+ # {Zip::File#read}[http://www.rubydoc.info/gems/rubyzip/1.1.6/Zip/File#read-instance_method].
95
+ #
96
+ # Please see the documentation of the relevant method for more details.
97
+ def read(name = nil)
98
+ return @container.read if name.nil?
99
+
100
+ ::File.read(full_path(name))
101
+ end
102
+
103
+ # :stopdoc:
104
+ # For internal use only!
105
+ # This method and the Entry and Entries classes provide compatibility
106
+ # between zip-style and dir-style entries
107
+ def entries
108
+ Entries.new(@container)
109
+ end
110
+
111
+ class Entries
112
+ include Enumerable
113
+
114
+ Entry = Struct.new(:name, :ftype)
115
+
116
+ def initialize(dir)
117
+ @entries = []
118
+
119
+ dir.each do |name|
120
+ type = ::File.directory?(name) ? :directory : :file
121
+ @entries << Entry.new(name, type)
122
+ end
123
+ end
124
+
125
+ def each(&block)
126
+ @entries.each do |entry|
127
+ yield entry
128
+ end
129
+ end
130
+ end
131
+ # :startdoc:
132
+
86
133
  private
87
134
 
88
135
  # Prepend the full path of the directory name to whatever is passed in
@@ -155,14 +202,6 @@ module ZipContainer
155
202
  # Equal to
156
203
  # {::Dir.pos=}[http://ruby-doc.org/core-1.9.3/Dir.html#method-i-pos-3D]
157
204
 
158
- ##
159
- # :method: read
160
- # :call-seq:
161
- # read -> string or nil
162
- #
163
- # Equal to
164
- # {::Dir.read}[http://ruby-doc.org/core-1.9.3/Dir.html#method-i-read]
165
-
166
205
  ##
167
206
  # :method: rewind
168
207
  # :call-seq:
@@ -60,7 +60,7 @@ module ZipContainer
60
60
  #
61
61
  # The fully qualified name of this ManagedEntry.
62
62
  def full_name
63
- @parent.is_a?(ZipContainer::File) ? @name : "#{@parent.full_name}/#{@name}"
63
+ @parent.is_a?(ZipContainer::Container) ? @name : "#{@parent.full_name}/#{@name}"
64
64
  end
65
65
 
66
66
  # :call-seq:
@@ -78,7 +78,7 @@ module ZipContainer
78
78
  # Is this ManagedEntry hidden for normal operations?
79
79
  def hidden?
80
80
  # An entry is hidden if its parent is hidden.
81
- @parent.is_a?(ZipContainer::File) ? @hidden : @hidden || @parent.hidden?
81
+ @parent.is_a?(ZipContainer::Container) ? @hidden : @hidden || @parent.hidden?
82
82
  end
83
83
 
84
84
  # :call-seq:
@@ -140,7 +140,7 @@ module ZipContainer
140
140
  #
141
141
  # Return the Container that this ManagedEntry resides in.
142
142
  def container
143
- @parent.is_a?(ZipContainer::File) ? @parent : @parent.container
143
+ @parent.is_a?(ZipContainer::Container) ? @parent : @parent.container
144
144
  end
145
145
 
146
146
  end
@@ -70,8 +70,8 @@ module ZipContainer
70
70
  # :startdoc:
71
71
 
72
72
  # :call-seq:
73
- # File.create(filename, mimetype) -> document
74
- # File.create(filename, mimetype) {|document| ...}
73
+ # File.create(filename, mimetype) -> container
74
+ # File.create(filename, mimetype) {|container| ...}
75
75
  #
76
76
  # Create a new ZipContainer file on disk with the specified mimetype.
77
77
  def self.create(filename, mimetype, &block)
File without changes
@@ -0,0 +1 @@
1
+ Hello, World!
@@ -0,0 +1 @@
1
+ application/epub+zip
@@ -36,23 +36,20 @@ require 'zip-container'
36
36
 
37
37
  class TestCreateDir < Test::Unit::TestCase
38
38
 
39
- # Check that a mimetype which is not readable does not verify. We have to
40
- # build this fixture programmatically as there's no way to add a file
41
- # without read permissions into git.
42
- def test_verify_unreadable_mimetype
39
+ def test_create_container
43
40
  Dir.mktmpdir do |dir|
44
- container = File.join(dir, "unreadable")
45
- Dir.mkdir(container)
46
- mime_path = File.join(container, ZipContainer::Container::MIMETYPE_FILE)
47
- File.open(mime_path, "w") { |file| file.write "MIMETYPE" }
48
- File.chmod(0000, mime_path)
41
+ container = File.join(dir, "empty.container")
49
42
 
50
- refute File.readable?(mime_path)
51
- assert_raise(ZipContainer::MalformedContainerError) do
43
+ assert_nothing_raised do
44
+ ZipContainer::Dir.create(container, $mimetype) do |c|
45
+ assert File.exists?(File.join(container, "mimetype"))
46
+ end
47
+ end
48
+
49
+ assert_nothing_raised(ZipContainer::MalformedContainerError, ZipContainer::ZipError) do
52
50
  ZipContainer::Dir.verify!(container)
53
51
  end
54
52
 
55
- refute(ZipContainer::Dir.verify(container))
56
53
  end
57
54
  end
58
55
 
@@ -85,6 +85,28 @@ class ExampleZipContainer2 < ZipContainer::File
85
85
 
86
86
  end
87
87
 
88
+ class ExampleDirContainer < ZipContainer::Dir
89
+
90
+ private_class_method :new
91
+
92
+ def initialize(filename)
93
+ super(filename)
94
+
95
+ valid = Proc.new { |contents| contents.match(/[Hh]ello/) }
96
+
97
+ test_file = ZipContainer::ManagedFile.new("test.txt")
98
+ register_managed_entry(ZipContainer::ManagedDirectory.new("dir",
99
+ :required => true, :entries => [test_file]))
100
+ register_managed_entry(ZipContainer::ManagedFile.new("greeting.txt",
101
+ :required => true, :validation_proc => valid))
102
+ end
103
+
104
+ #def ExampleDirContainer.create(filename, &block)
105
+ # super(filename, "application/example+zip", &block)
106
+ #end
107
+
108
+ end
109
+
88
110
  class TestManagedEntries < Test::Unit::TestCase
89
111
 
90
112
  # Check that the example ZipContainer file does not validate as a
@@ -140,6 +162,38 @@ class TestManagedEntries < Test::Unit::TestCase
140
162
  end
141
163
  end
142
164
 
165
+ # Check that a subclassed container with managed files verifies correctly.
166
+ def test_verify_subclassed_dir_container
167
+ assert_nothing_raised do
168
+ ExampleDirContainer.verify!($dir_managed)
169
+ end
170
+ end
171
+
172
+ # Create a subclassed container. Check it doesn't verify at first; satisfy
173
+ # the conditions; then assert that it verifies correctly.
174
+ def test_create_subclassed_dir_container
175
+ Dir.mktmpdir do |dir|
176
+ filename = File.join(dir, "test.container")
177
+
178
+ assert_nothing_raised do
179
+ ExampleDirContainer.create(filename, $mimetype) do |c|
180
+ assert_raises(ZipContainer::MalformedContainerError) do
181
+ c.verify!
182
+ end
183
+
184
+ Dir.mkdir(File.join(filename, "dir"))
185
+ File.open(File.join(filename, "greeting.txt"), "w") do |f|
186
+ f.puts "Yo means hello."
187
+ end
188
+
189
+ assert_nothing_raised(ZipContainer::MalformedContainerError) do
190
+ c.verify!
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+
143
197
  # Check that a ManagedZipContainer does not verify immediately after
144
198
  # creation.
145
199
  def test_create_bad_subclassed_container
@@ -31,6 +31,7 @@
31
31
  # Author: Robert Haines
32
32
 
33
33
  require 'test/unit'
34
+ require 'tmpdir'
34
35
  require 'zip-container'
35
36
 
36
37
  class TestReadDir < Test::Unit::TestCase
@@ -62,4 +63,24 @@ class TestReadDir < Test::Unit::TestCase
62
63
  refute(ZipContainer::Dir.verify($dir_dir_mimetype))
63
64
  end
64
65
 
66
+ # Check that a mimetype which is not readable does not verify. We have to
67
+ # build this fixture programmatically as there's no way to add a file
68
+ # without read permissions into git.
69
+ def test_verify_unreadable_mimetype
70
+ Dir.mktmpdir do |dir|
71
+ container = File.join(dir, "unreadable.container")
72
+ Dir.mkdir(container)
73
+ mime_path = File.join(container, ZipContainer::Container::MIMETYPE_FILE)
74
+ File.open(mime_path, "w") { |file| file.write "MIMETYPE" }
75
+ File.chmod(0000, mime_path)
76
+
77
+ refute File.readable?(mime_path)
78
+ assert_raise(ZipContainer::MalformedContainerError) do
79
+ ZipContainer::Dir.verify!(container)
80
+ end
81
+
82
+ refute(ZipContainer::Dir.verify(container))
83
+ end
84
+ end
85
+
65
86
  end
@@ -40,6 +40,7 @@ $mimetype = "application/epub+zip"
40
40
  $dir_null = "test/data/dirs/null"
41
41
  $dir_empty = "test/data/dirs/empty"
42
42
  $dir_dir_mimetype = "test/data/dirs/dir-mimetype"
43
+ $dir_managed = "test/data/dirs/managed"
43
44
  $file_null = "test/data/null.file"
44
45
  $empty = "test/data/empty.container"
45
46
  $empty_zip = "test/data/empty.zip"
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 2
3
- :minor: 1
3
+ :minor: 2
4
4
  :patch: 0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zip-container
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Haines
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-07 00:00:00.000000000 Z
11
+ date: 2014-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -134,6 +134,9 @@ files:
134
134
  - test/data/compressed_mimetype.container
135
135
  - test/data/dirs/dir-mimetype/mimetype/.gitkeep
136
136
  - test/data/dirs/empty/mimetype
137
+ - test/data/dirs/managed/dir/.gitkeep
138
+ - test/data/dirs/managed/greeting.txt
139
+ - test/data/dirs/managed/mimetype
137
140
  - test/data/dirs/null/.gitkeep
138
141
  - test/data/empty.container
139
142
  - test/data/empty.zip
@@ -183,6 +186,9 @@ test_files:
183
186
  - test/data/compressed_mimetype.container
184
187
  - test/data/dirs/dir-mimetype/mimetype/.gitkeep
185
188
  - test/data/dirs/empty/mimetype
189
+ - test/data/dirs/managed/dir/.gitkeep
190
+ - test/data/dirs/managed/greeting.txt
191
+ - test/data/dirs/managed/mimetype
186
192
  - test/data/dirs/null/.gitkeep
187
193
  - test/data/empty.container
188
194
  - test/data/empty.zip