iota 1.0.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/README.rdoc +30 -0
- data/lib/iota.rb +26 -0
- data/test/tests.rb +60 -0
- metadata +58 -0
data/README.rdoc
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
=Summary
|
2
|
+
|
3
|
+
Iota is a Ruby module that emulates the iota keyword(?) from Google's Go
|
4
|
+
programming language. Here is the example from golang.org/doc/effective_go.html:
|
5
|
+
type ByteSize float64
|
6
|
+
const (
|
7
|
+
_ = iota; // ignore first value by assigning to blank identifier
|
8
|
+
KB ByteSize = 1<<(10*iota);
|
9
|
+
MB;
|
10
|
+
GB;
|
11
|
+
TB;
|
12
|
+
PB;
|
13
|
+
YB;
|
14
|
+
)
|
15
|
+
The equivalent Ruby Iota code is:
|
16
|
+
require 'iota'
|
17
|
+
include Iota
|
18
|
+
set_iota 1
|
19
|
+
iota(%w(KB MB GB TB PB YB)) do |i|
|
20
|
+
1 << i * 10
|
21
|
+
end
|
22
|
+
MarkCC gives a simpler example:
|
23
|
+
type Color int; const ( RED Color = iota; ORANGE = iota; YELLOW = iota;
|
24
|
+
GREEN = iota; BLUE = iota; INDIGO = iota; VIOLET = iota; )
|
25
|
+
And the Ruby Iota code:
|
26
|
+
RED = iota; ORANGE = iota; YELLOW = iota; GREEN = iota; BLUE = iota; INDIGO = iota; VIOLET = iota
|
27
|
+
OK, but that is painfully inefficient. Let's go back to the array notation:
|
28
|
+
iota %w(RED ORANGE YELLOW GREEN BLUE INDIGO VIOLET)
|
29
|
+
Aaand... that's all. This is of course one of the least innovative things about
|
30
|
+
the Go language, but we can perhaps strive to implement more.
|
data/lib/iota.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Iota
|
2
|
+
@@iota = -1
|
3
|
+
|
4
|
+
def iota(names = nil)
|
5
|
+
if names.nil?
|
6
|
+
@@iota += 1
|
7
|
+
return @@iota
|
8
|
+
end
|
9
|
+
|
10
|
+
values = []
|
11
|
+
names.each do |name|
|
12
|
+
@@iota += 1
|
13
|
+
if block_given?
|
14
|
+
Iota.const_set name, yield(@@iota)
|
15
|
+
else
|
16
|
+
Iota.const_set name, @@iota
|
17
|
+
end
|
18
|
+
values << Iota.const_get(name.to_sym)
|
19
|
+
end
|
20
|
+
values
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_iota(value = 0)
|
24
|
+
@@iota = value - 1
|
25
|
+
end
|
26
|
+
end
|
data/test/tests.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require "../lib/iota"
|
2
|
+
require "test/unit"
|
3
|
+
include Iota
|
4
|
+
|
5
|
+
class Iota_Basics < Test::Unit::TestCase
|
6
|
+
# Using the real test_setup, we get a:
|
7
|
+
# "dynamic constant assignment" error.
|
8
|
+
#def test_setup
|
9
|
+
Zero = iota
|
10
|
+
One = iota
|
11
|
+
Two = iota
|
12
|
+
Three = iota
|
13
|
+
#end
|
14
|
+
|
15
|
+
def test_basic
|
16
|
+
assert_equal(0, Zero, "First iota should be 0.")
|
17
|
+
assert_equal(1, One, "iota should increment.")
|
18
|
+
assert_equal(2, Two, "iota should increment.")
|
19
|
+
assert_equal(3, Three, "iota should increment.")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Iota_Arrays < Test::Unit::TestCase
|
24
|
+
# Using the real test_setup, we get a:
|
25
|
+
# "dynamic constant assignment" error.
|
26
|
+
#def test_setup
|
27
|
+
set_iota 0
|
28
|
+
iota %w(Cero Uno Dos Tres Quatro)
|
29
|
+
iota %w(Cinco Seis Siete Ocho)
|
30
|
+
#end
|
31
|
+
|
32
|
+
def test_arrays
|
33
|
+
assert_equal(0, Iota::Cero, "First iota in an array should be 0.")
|
34
|
+
assert_equal(1, Uno, "iota in an array should increment.")
|
35
|
+
assert_equal(2, Dos, "iota in an array should increment.")
|
36
|
+
assert_equal(3, Tres, "iota in an array should increment.")
|
37
|
+
assert_equal(4, Quatro, "iota in an array should increment.")
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_continuation
|
41
|
+
assert_equal(5, Cinco, "iota should continue to increment, array to array.")
|
42
|
+
assert_equal(6, Seis, "iota should continue to increment, array to array.")
|
43
|
+
assert_equal(7, Siete, "iota should continue to increment, array to array.")
|
44
|
+
assert_equal(8, Ocho, "iota should continue to increment, array to array.")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Iota_Block < Test::Unit::TestCase
|
49
|
+
set_iota 1
|
50
|
+
iota(%w(KB MB GB TB)) do |x|
|
51
|
+
1 << x*10
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_block
|
55
|
+
assert_equal( 1024, KB, "iota should increment in blocks.")
|
56
|
+
assert_equal( 1048576, MB, "iota should increment in blocks.")
|
57
|
+
assert_equal( 1073741824, GB, "iota should increment in blocks.")
|
58
|
+
assert_equal(1099511627776, TB, "iota should increment in blocks.")
|
59
|
+
end
|
60
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iota
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sam Rawlins
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-11 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: iota - emulating Go's iota... thing.
|
17
|
+
email:
|
18
|
+
- sam.rawlins@gmail.com
|
19
|
+
executables: []
|
20
|
+
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files: []
|
24
|
+
|
25
|
+
files:
|
26
|
+
- lib/iota.rb
|
27
|
+
- test/tests.rb
|
28
|
+
- README.rdoc
|
29
|
+
has_rdoc: false
|
30
|
+
homepage: http://github.com/srawlins/iota
|
31
|
+
licenses: []
|
32
|
+
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.8.1
|
43
|
+
version:
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: "0"
|
49
|
+
version:
|
50
|
+
requirements: []
|
51
|
+
|
52
|
+
rubyforge_project:
|
53
|
+
rubygems_version: 1.3.5
|
54
|
+
signing_key:
|
55
|
+
specification_version: 3
|
56
|
+
summary: Emulates Go's iota... thing.
|
57
|
+
test_files: []
|
58
|
+
|