doo_dah 0.2.1 → 0.3.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
data/doo_dah.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{doo_dah}
8
- s.version = "0.2.1"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Michael Collas"]
12
- s.date = %q{2012-06-18}
12
+ s.date = %q{2012-06-22}
13
13
  s.description = %q{ This gem creates zip files using the STORE method - i.e. with no compression. This enables the generation of
14
14
  zip files with a known size from streamed data, providing the size of the input files is known.
15
15
  }
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  "lib/doo_dah/zip_entry.rb",
31
31
  "lib/doo_dah/zip_header.rb",
32
32
  "lib/doo_dah/zip_output_stream.rb",
33
+ "lib/doo_dah/zip_size_calculator.rb",
33
34
  "spec/central_directory_spec.rb",
34
35
  "spec/dos_time_spec.rb",
35
36
  "spec/local_directory_header_spec.rb",
@@ -5,6 +5,11 @@ module DooDah
5
5
  class ZipEntry
6
6
  include LocalDirectoryHeader
7
7
  include CentralDirectoryHeader
8
+
9
+ def self.overhead(name, size=0, crc=0)
10
+ LocalDirectoryHeader.local_header_size(name) + ((size == 0 || crc == 0) ? LocalDirectoryHeader.local_footer_size : 0) +
11
+ CentralDirectoryHeader.central_header_size(name)
12
+ end
8
13
 
9
14
  attr_reader :name, :closed
10
15
  alias_method :closed?, :closed
@@ -23,9 +23,15 @@ module DooDah
23
23
  end
24
24
 
25
25
  module ZipHeader
26
+
27
+ def self.signature_size
28
+ 4
29
+ end
30
+
26
31
  def write_signature(signature)
27
32
  write([signature].pack('V'))
28
33
  end
34
+
29
35
  end
30
36
 
31
37
  module ZipEntryHeader
@@ -42,6 +48,14 @@ module DooDah
42
48
  VERSION_NEEDED_TO_EXTRACT = 10
43
49
  GP_FLAGS_CRC_UNKNOWN = 0x0008
44
50
  GP_FLAGS_UTF8 = 0x0800
51
+
52
+ def self.common_header_size
53
+ 14 + 12
54
+ end
55
+
56
+ def self.name_size(name)
57
+ name.length
58
+ end
45
59
 
46
60
  def write_common_header()
47
61
  flags = GP_FLAGS_UTF8
@@ -72,6 +86,14 @@ module DooDah
72
86
 
73
87
  module LocalDirectoryHeader
74
88
  include ZipEntryHeader
89
+
90
+ def self.local_header_size(name)
91
+ ZipHeader.signature_size + ZipEntryHeader.common_header_size + ZipEntryHeader.name_size(name)
92
+ end
93
+
94
+ def self.local_footer_size
95
+ ZipHeader.signature_size + 12
96
+ end
75
97
 
76
98
  def write_local_header
77
99
  self.local_header_offset = current_offset
@@ -89,6 +111,18 @@ module DooDah
89
111
 
90
112
  module CentralDirectoryHeader
91
113
  include ZipEntryHeader
114
+
115
+ def self.central_header_size(name)
116
+ ZipHeader.signature_size + version_made_by_size + ZipEntryHeader.common_header_size + 6 + 8 + ZipEntryHeader.name_size(name)
117
+ end
118
+
119
+ def self.end_of_central_directory_size
120
+ ZipHeader.signature_size + 10 + 8
121
+ end
122
+
123
+ def self.version_made_by_size
124
+ 2
125
+ end
92
126
 
93
127
  def write_central_header
94
128
  write_signature(CENTRAL_ENTRY_HEADER_SIGNATURE)
@@ -0,0 +1,20 @@
1
+ module DooDah
2
+
3
+ class ZipSizeCalculator
4
+
5
+ attr_accessor :size, :overhead
6
+
7
+ def initialize
8
+ @overhead = CentralDirectoryHeader.end_of_central_directory_size
9
+ @size = @overhead
10
+ end
11
+
12
+ def add_file(name, size=0, crc=0)
13
+ new_overhead = ZipEntry.overhead(name, size, crc)
14
+ @overhead += new_overhead
15
+ @size += (size + new_overhead)
16
+ end
17
+
18
+ end
19
+
20
+ end
data/lib/doo_dah.rb CHANGED
@@ -2,3 +2,4 @@ require 'doo_dah/dos_time'
2
2
  require 'doo_dah/zip_header'
3
3
  require 'doo_dah/zip_entry'
4
4
  require 'doo_dah/zip_output_stream'
5
+ require 'doo_dah/zip_size_calculator'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doo_dah
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 1
10
- version: 0.2.1
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Collas
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-06-18 00:00:00 +10:00
18
+ date: 2012-06-22 00:00:00 +10:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -87,6 +87,7 @@ files:
87
87
  - lib/doo_dah/zip_entry.rb
88
88
  - lib/doo_dah/zip_header.rb
89
89
  - lib/doo_dah/zip_output_stream.rb
90
+ - lib/doo_dah/zip_size_calculator.rb
90
91
  - spec/central_directory_spec.rb
91
92
  - spec/dos_time_spec.rb
92
93
  - spec/local_directory_header_spec.rb