Class: Omnizip::Metadata::ArchiveMetadata

Inherits:
Object
  • Object
show all
Defined in:
lib/omnizip/metadata/archive_metadata.rb

Overview

Model for archive-level metadata

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(archive) ⇒ ArchiveMetadata

Initialize archive metadata

Parameters:



11
12
13
14
# File 'lib/omnizip/metadata/archive_metadata.rb', line 11

def initialize(archive)
  @archive = archive
  @modified = false
end

Instance Attribute Details

#archiveObject (readonly)

Returns the value of attribute archive.



7
8
9
# File 'lib/omnizip/metadata/archive_metadata.rb', line 7

def archive
  @archive
end

Instance Method Details

#commentString

Get archive comment

Returns:

  • (String)

    Archive comment



18
19
20
# File 'lib/omnizip/metadata/archive_metadata.rb', line 18

def comment
  archive.comment
end

#comment=(value) ⇒ Object

Set archive comment

Parameters:

  • value (String)

    New comment



24
25
26
27
# File 'lib/omnizip/metadata/archive_metadata.rb', line 24

def comment=(value)
  archive.comment = value.to_s
  @modified = true
end

#compression_ratioFloat

Get compression ratio

Returns:

  • (Float)

    Compression ratio (0.0 to 1.0)



59
60
61
62
63
64
65
66
# File 'lib/omnizip/metadata/archive_metadata.rb', line 59

def compression_ratio
  return 0.0 if total_size.zero?

  ratio = 1.0 - (total_compressed_size.to_f / total_size)
  # Clamp ratio between 0.0 and 1.0 (compressed size can exceed
  # original size for small files or incompressible data)
  [[ratio, 0.0].max, 1.0].min
end

#created_atTime?

Get creation date (approximated from first entry)

Returns:

  • (Time, nil)

    Creation date or nil



31
32
33
34
35
# File 'lib/omnizip/metadata/archive_metadata.rb', line 31

def created_at
  return nil if archive.entries.empty?

  archive.entries.map(&:time).min
end

#directory_countInteger

Get directory count

Returns:

  • (Integer)

    Number of directories



82
83
84
# File 'lib/omnizip/metadata/archive_metadata.rb', line 82

def directory_count
  archive.entries.count(&:directory?)
end

#entry_countInteger

Get entry count

Returns:

  • (Integer)

    Number of entries



70
71
72
# File 'lib/omnizip/metadata/archive_metadata.rb', line 70

def entry_count
  archive.entries.size
end

#file_countInteger

Get file count (excluding directories)

Returns:

  • (Integer)

    Number of files



76
77
78
# File 'lib/omnizip/metadata/archive_metadata.rb', line 76

def file_count
  archive.entries.count(&:file?)
end

#modified?Boolean

Check if metadata has been modified

Returns:

  • (Boolean)

    True if modified



88
89
90
# File 'lib/omnizip/metadata/archive_metadata.rb', line 88

def modified?
  @modified
end

#modified_atTime?

Get modification date (from newest entry)

Returns:

  • (Time, nil)

    Modification date or nil



39
40
41
42
43
# File 'lib/omnizip/metadata/archive_metadata.rb', line 39

def modified_at
  return nil if archive.entries.empty?

  archive.entries.map(&:time).max
end

#reset_modifiedObject

Reset modified flag



93
94
95
# File 'lib/omnizip/metadata/archive_metadata.rb', line 93

def reset_modified
  @modified = false
end

#to_hHash

Get all metadata as a hash

Returns:

  • (Hash)

    Metadata hash



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/omnizip/metadata/archive_metadata.rb', line 99

def to_h
  {
    comment: comment,
    created_at: created_at,
    modified_at: modified_at,
    total_size: total_size,
    total_compressed_size: total_compressed_size,
    compression_ratio: compression_ratio,
    entry_count: entry_count,
    file_count: file_count,
    directory_count: directory_count,
  }
end

#total_compressed_sizeInteger

Get total compressed size

Returns:

  • (Integer)

    Total compressed size in bytes



53
54
55
# File 'lib/omnizip/metadata/archive_metadata.rb', line 53

def total_compressed_size
  archive.entries.sum(&:compressed_size)
end

#total_sizeInteger

Get total uncompressed size

Returns:

  • (Integer)

    Total uncompressed size in bytes



47
48
49
# File 'lib/omnizip/metadata/archive_metadata.rb', line 47

def total_size
  archive.entries.sum(&:size)
end