filesize 0.0.1
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/CHANGELOG +1 -0
- data/Manifest +5 -0
- data/README.markdown +37 -0
- data/Rakefile +17 -0
- data/filesize.gemspec +34 -0
- data/lib/filesize.rb +121 -0
- data.tar.gz.sig +3 -0
- metadata +86 -0
- metadata.gz.sig +4 -0
data/CHANGELOG
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
v0.0.1. first version. enjoy!
|
data/Manifest
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
## filesize
|
2
|
+
filesize.rb provides a class for easily working with file sizes.
|
3
|
+
That means:
|
4
|
+
|
5
|
+
* Parsing strings (e.g. "1 GiB") and saving it internally as bytes
|
6
|
+
* Handling both SI and binary prefixes
|
7
|
+
* Converting from any type and unit to any other (SI to SI, SI to Binary and so on)
|
8
|
+
* doing calculatings with filesizes (in a smart way, see Usage for more)
|
9
|
+
* filesize.rb also provides some default sizes, like the ones of DVDs
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
### Parsing a string
|
13
|
+
Filesize.from("1 GiB") # => #<Filesize:0x93c06c8 @bytes=1073741824, @type={:regexp=>/^([\d,.]+)?\s?(?:([kmgtpezy])i)?b$/i, :multiplier=>1024, :presuffix=>"i"}>
|
14
|
+
|
15
|
+
### Converting filesizes
|
16
|
+
Filesize.from("1 GiB").to_f('KiB') # => 1048576.0
|
17
|
+
Filesize.from("1 GiB").to_f('KB') # => 1073741.824
|
18
|
+
Filesize.from("1 GB").to_i # => 1000000000
|
19
|
+
|
20
|
+
### Outputting filesizes
|
21
|
+
Filesize.from("12502343 B").to_s('GiB') # => "0.01 GiB"
|
22
|
+
Filesize.from("12502343 B").pretty # => "11.92 MiB"
|
23
|
+
|
24
|
+
### Calculating with filesizes
|
25
|
+
#### The file size on the left side sets the type
|
26
|
+
(Filesize.from("1400 MB") + Filesize.from("1400 MiB")).pretty # => "2.87 GB"
|
27
|
+
(Filesize.from("1400 MiB") + Filesize.from("1400 MB")).pretty # => "2.67 GiB"
|
28
|
+
|
29
|
+
#### Filesizes can also be coerced
|
30
|
+
(Filesize.from("1400 MiB") + 1024).pretty # => "1.37 GiB"
|
31
|
+
(1024 + Filesize.from("1400 MB")).pretty # => "1.40 GB"
|
32
|
+
|
33
|
+
#### filesize.rb is smart about the return value
|
34
|
+
Filesize.from("1400 MiB") / Filesize.from("700 MiB") # => 2.0
|
35
|
+
|
36
|
+
#### One can also use predefined sizes
|
37
|
+
Filesize::DVD / Filesize::CD # => 6.13566756571429
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'echoe'
|
2
|
+
Echoe.new('filesize') do |p|
|
3
|
+
p.author = "Dominik Honnef"
|
4
|
+
p.email = "dominikho@gmx.net"
|
5
|
+
|
6
|
+
p.description = %q{filesize is a small class for handling filesizes with both the SI and binary prefixes, allowing conversion from any size to any other size.}
|
7
|
+
p.summary = %q{filesize is a small class for handling filesizes with both the SI and binary prefixes, allowing conversion from any size to any other size.}
|
8
|
+
|
9
|
+
p.url = "http://filesize.rubyforge.org/"
|
10
|
+
p.docs_host = "rubyforge.org:/var/www/gforge-projects/"
|
11
|
+
|
12
|
+
p.ruby_version = '>= 1.8.6'
|
13
|
+
|
14
|
+
p.require_signed = true
|
15
|
+
|
16
|
+
p.project = 'filesize'
|
17
|
+
end
|
data/filesize.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{filesize}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Dominik Honnef"]
|
9
|
+
s.cert_chain = ["/home/dominikh/.rubyforge/gem-public_cert.pem"]
|
10
|
+
s.date = %q{2009-07-26}
|
11
|
+
s.description = %q{filesize is a small class for handling filesizes with both the SI and binary prefixes, allowing conversion from any size to any other size.}
|
12
|
+
s.email = %q{dominikho@gmx.net}
|
13
|
+
s.extra_rdoc_files = ["README.markdown", "CHANGELOG", "lib/filesize.rb"]
|
14
|
+
s.files = ["Rakefile", "README.markdown", "CHANGELOG", "lib/filesize.rb", "Manifest", "filesize.gemspec"]
|
15
|
+
s.has_rdoc = true
|
16
|
+
s.homepage = %q{http://filesize.rubyforge.org/}
|
17
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Filesize", "--main", "README.markdown"]
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.required_ruby_version = Gem::Requirement.new(">= 1.8.6")
|
20
|
+
s.rubyforge_project = %q{filesize}
|
21
|
+
s.rubygems_version = %q{1.3.1}
|
22
|
+
s.signing_key = %q{/home/dominikh/.rubyforge/gem-private_key.pem}
|
23
|
+
s.summary = %q{filesize is a small class for handling filesizes with both the SI and binary prefixes, allowing conversion from any size to any other size.}
|
24
|
+
|
25
|
+
if s.respond_to? :specification_version then
|
26
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
27
|
+
s.specification_version = 2
|
28
|
+
|
29
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
30
|
+
else
|
31
|
+
end
|
32
|
+
else
|
33
|
+
end
|
34
|
+
end
|
data/lib/filesize.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
class Filesize
|
2
|
+
SI = {:regexp => /^([\d,.]+)?\s?([kmgtpezy]?)b$/i, :multiplier => 1000, :presuffix => ''}
|
3
|
+
BINARY = {:regexp => /^([\d,.]+)?\s?(?:([kmgtpezy])i)?b$/i, :multiplier => 1024, :presuffix => 'i'}
|
4
|
+
PREFIXES = %w{k M G T P E Z Y}
|
5
|
+
|
6
|
+
def initialize(size, type = BINARY)
|
7
|
+
@bytes = size.to_i
|
8
|
+
@type = type
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns the size in bytes
|
12
|
+
def to_i
|
13
|
+
@bytes
|
14
|
+
end
|
15
|
+
alias_method :to_int, :to_i
|
16
|
+
|
17
|
+
# Returns the size in the given unit, as a float
|
18
|
+
def to(unit = 'B')
|
19
|
+
to_parts = self.class.parse(unit)
|
20
|
+
prefix = to_parts[:prefix]
|
21
|
+
|
22
|
+
if prefix == 'B' or prefix.empty?
|
23
|
+
return to_i.to_f
|
24
|
+
end
|
25
|
+
|
26
|
+
to_type = to_parts[:type]
|
27
|
+
size = @bytes
|
28
|
+
|
29
|
+
pos = (PREFIXES.map{|s|s.downcase}.index(prefix.downcase) || -1) + 1
|
30
|
+
|
31
|
+
size = size/(to_type[:multiplier].to_f**(pos)) unless pos < 1
|
32
|
+
end
|
33
|
+
alias_method :to_f, :to
|
34
|
+
|
35
|
+
# Same as to_f, but as a string, with the unit appended
|
36
|
+
def to_s(unit = 'B')
|
37
|
+
"%.2f %s" % [to(unit).to_f.to_s, unit]
|
38
|
+
end
|
39
|
+
|
40
|
+
# Same as to_s but with an automatic determinition of the most
|
41
|
+
# sensible unit
|
42
|
+
def pretty
|
43
|
+
size = @bytes
|
44
|
+
if size < @type[:multiplier]
|
45
|
+
unit = "B"
|
46
|
+
else
|
47
|
+
pos = (Math.log(size) / Math.log(@type[:multiplier])).floor
|
48
|
+
pos = PREFIXES.size-1 if pos > PREFIXES.size - 1
|
49
|
+
|
50
|
+
unit = PREFIXES[pos-1].to_s + @type[:presuffix] + "B"
|
51
|
+
end
|
52
|
+
|
53
|
+
to_s(unit)
|
54
|
+
end
|
55
|
+
|
56
|
+
def +(other)
|
57
|
+
self.class.new(@bytes + other.to_i, @type)
|
58
|
+
end
|
59
|
+
|
60
|
+
def -(other)
|
61
|
+
self.class.new(@bytes - other.to_i, @type)
|
62
|
+
end
|
63
|
+
|
64
|
+
def *(other)
|
65
|
+
self.class.new(@bytes * other.to_i, @type)
|
66
|
+
end
|
67
|
+
|
68
|
+
def /(other)
|
69
|
+
result = @bytes / other.to_f
|
70
|
+
if other.is_a? Filesize
|
71
|
+
result
|
72
|
+
else
|
73
|
+
self.class.new(result, @type)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def coerce(other)
|
78
|
+
return self, other
|
79
|
+
end
|
80
|
+
|
81
|
+
class << self
|
82
|
+
def from(arg)
|
83
|
+
parts = parse(arg)
|
84
|
+
prefix = parts[:prefix]
|
85
|
+
size = parts[:size]
|
86
|
+
type = parts[:type]
|
87
|
+
|
88
|
+
raise ArgumentError, "Unparseable filesize" unless type
|
89
|
+
|
90
|
+
offset = (PREFIXES.map{|s|s.downcase}.index(prefix.downcase) || -1) + 1
|
91
|
+
|
92
|
+
new(size * (type[:multiplier] ** (offset)), type)
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse(string)
|
96
|
+
type = nil
|
97
|
+
# in this order, so we prefer binary :)
|
98
|
+
[BINARY, SI].each { |_type|
|
99
|
+
if string =~ _type[:regexp]
|
100
|
+
type = _type
|
101
|
+
break
|
102
|
+
end
|
103
|
+
}
|
104
|
+
|
105
|
+
prefix = $2 || ''
|
106
|
+
size = ($1 || "0").gsub(", ", "").to_i
|
107
|
+
|
108
|
+
return { :prefix => prefix, :size => size, :type => type}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
Floppy = Filesize.from("1474 KiB")
|
113
|
+
CD = Filesize.from("700 MB")
|
114
|
+
DVD_5 = Filesize.from("4.38 GiB")
|
115
|
+
DVD = DVD_5
|
116
|
+
DVD_9 = Filesize.from("7.92 GiB")
|
117
|
+
DVD_10 = DVD_5 * 2
|
118
|
+
DVD_14 = Filesize.from("7.92 GiB") + DVD_5
|
119
|
+
DVD_18 = DVD_14 * 2
|
120
|
+
ZIP = Filesize.from("100 MB")
|
121
|
+
end
|
data.tar.gz.sig
ADDED
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: filesize
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dominik Honnef
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDMDCCAhigAwIBAgIBADANBgkqhkiG9w0BAQUFADA+MRIwEAYDVQQDDAlkb21p
|
14
|
+
bmlraG8xEzARBgoJkiaJk/IsZAEZFgNnbXgxEzARBgoJkiaJk/IsZAEZFgNuZXQw
|
15
|
+
HhcNMDkwNzI0MjE1NDQ3WhcNMTAwNzI0MjE1NDQ3WjA+MRIwEAYDVQQDDAlkb21p
|
16
|
+
bmlraG8xEzARBgoJkiaJk/IsZAEZFgNnbXgxEzARBgoJkiaJk/IsZAEZFgNuZXQw
|
17
|
+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgfogFNoAcdrR5mK0t5NiN
|
18
|
+
MbWCH2QVLqOvpuaHN6uiaE30R9fT+1CcF97PSboMHMKaQFgiyAcBj8c2uGw5Sk7+
|
19
|
+
Kv9TE2TIIG8l8oslnf9PVqrHSz823IjzbXo4WET4khI2v02pE2wx/souJ4PRgnEr
|
20
|
+
gxQaOF7fqJRT2eYiZAMQye1y9tNSShRoKP3JIlp51KBXUMzGdzq4Mopp32zhEcio
|
21
|
+
yEzcp1PYqu6D1Pr00fS/Alurnp/My5o3oIk0vBfJ6Q8j/6OSk+ck5xev2Z2Y9AUK
|
22
|
+
iwipCxKrAsfOjpPc/Y66okMeTmKxx5N/8h/xNp/HiUApHQwjbYgFOAwmht5UzoPp
|
23
|
+
AgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFLlluBMEZ3rFvxFcB+ULjUNd
|
24
|
+
V+7WMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAoDJGicQwBqMnhMkC
|
25
|
+
JY7bgsrIwxoTMQT6B1keUtt9VQ3deywQu0ogawNmee5wy5oFqnMZFcSCXcJE/zIE
|
26
|
+
iuSYU5t87iF09BIsSHWg2OlHAB4+GTUL0PkVsCVBDFukqEiXpNcqMUjTr8U+fe7V
|
27
|
+
oD/qvzyMG1ooAFuTDfPknIQxTcavdnmUmO9Sfw10yXkomX8jjwaGduF/JHDIufub
|
28
|
+
/f4b22rpLBhrOD6dqHCl7WuAfAhpobLqc7sa6Ro8caSUnpq9blOrT/PRtiTXwN6h
|
29
|
+
p3eI3JV0LC6/tMHoeLAbHqauVbWUqDB+AfFw24sgZBqFA+MtMkDpqZ+BKiwiHl+S
|
30
|
+
YEfDWg==
|
31
|
+
-----END CERTIFICATE-----
|
32
|
+
|
33
|
+
date: 2009-07-26 00:00:00 +02:00
|
34
|
+
default_executable:
|
35
|
+
dependencies: []
|
36
|
+
|
37
|
+
description: filesize is a small class for handling filesizes with both the SI and binary prefixes, allowing conversion from any size to any other size.
|
38
|
+
email: dominikho@gmx.net
|
39
|
+
executables: []
|
40
|
+
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files:
|
44
|
+
- README.markdown
|
45
|
+
- CHANGELOG
|
46
|
+
- lib/filesize.rb
|
47
|
+
files:
|
48
|
+
- Rakefile
|
49
|
+
- README.markdown
|
50
|
+
- CHANGELOG
|
51
|
+
- lib/filesize.rb
|
52
|
+
- Manifest
|
53
|
+
- filesize.gemspec
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://filesize.rubyforge.org/
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options:
|
58
|
+
- --line-numbers
|
59
|
+
- --inline-source
|
60
|
+
- --title
|
61
|
+
- Filesize
|
62
|
+
- --main
|
63
|
+
- README.markdown
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.8.6
|
71
|
+
version:
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: "1.2"
|
77
|
+
version:
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project: filesize
|
81
|
+
rubygems_version: 1.3.1
|
82
|
+
signing_key:
|
83
|
+
specification_version: 2
|
84
|
+
summary: filesize is a small class for handling filesizes with both the SI and binary prefixes, allowing conversion from any size to any other size.
|
85
|
+
test_files: []
|
86
|
+
|
metadata.gz.sig
ADDED