pkwde-renum 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,109 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ enum :Status, [ :NOT_STARTED, :IN_PROGRESS, :COMPLETE ]
4
+
5
+ module MyNamespace
6
+ enum :FooValue, %w( Bar Baz Bat )
7
+ end
8
+
9
+ enum :Color, [ :RED, :GREEN, :BLUE ] do
10
+ def abbr
11
+ name[0..0]
12
+ end
13
+ end
14
+
15
+ enum :Size do
16
+ Small("Really really tiny")
17
+ Medium("Sort of in the middle")
18
+ Large("Quite big")
19
+
20
+ attr_reader :description
21
+
22
+ def init description
23
+ @description = description
24
+ end
25
+ end
26
+
27
+ enum :HairColor do
28
+ BLONDE()
29
+ BRUNETTE()
30
+ RED()
31
+ end
32
+
33
+ describe "basic enum" do
34
+
35
+ it "creates a class for the value type" do
36
+ Status.should be_an_instance_of(Class)
37
+ end
38
+
39
+ it "makes each value an instance of the value type" do
40
+ Status::NOT_STARTED.should be_an_instance_of(Status)
41
+ end
42
+
43
+ it "exposes array of values" do
44
+ Status.values.should == [Status::NOT_STARTED, Status::IN_PROGRESS, Status::COMPLETE]
45
+ end
46
+
47
+ it "enumerates over values" do
48
+ Status.map {|s| s.name}.should == %w[NOT_STARTED IN_PROGRESS COMPLETE]
49
+ end
50
+
51
+ it "indexes values" do
52
+ Status[2].should == Status::COMPLETE
53
+ Color[0].should == Color::RED
54
+ end
55
+
56
+ it "provides index lookup on values" do
57
+ Status::IN_PROGRESS.index.should == 1
58
+ Color::GREEN.index.should == 1
59
+ end
60
+
61
+ it "provides a reasonable to_s for values" do
62
+ Status::NOT_STARTED.to_s.should == "Status::NOT_STARTED"
63
+ end
64
+
65
+ it "makes values comparable" do
66
+ Color::RED.should < Color::GREEN
67
+ Color::RED.should_not == Status::NOT_STARTED
68
+ end
69
+ end
70
+
71
+ describe "nested enum" do
72
+ it "is namespaced in the containing module or class" do
73
+ MyNamespace::FooValue::Bar.class.should == MyNamespace::FooValue
74
+ end
75
+ end
76
+
77
+ describe "enum with a block" do
78
+ it "can define additional instance methods" do
79
+ Color::RED.abbr.should == "R"
80
+ end
81
+ end
82
+
83
+ describe "enum with no values array and values declared in the block" do
84
+ it "provides an alternative means of declaring values where extra information can be provided for initialization" do
85
+ Size::Small.description.should == "Really really tiny"
86
+ end
87
+
88
+ it "works the same as the basic form with respect to ordering" do
89
+ Size.values.should == [Size::Small, Size::Medium, Size::Large]
90
+ end
91
+
92
+ it "responds as expected to arbitrary method calls, in spite of using method_missing for value definition" do
93
+ lambda { Size.ExtraLarge() }.should raise_error(NoMethodError)
94
+ end
95
+
96
+ it "supprts there being no extra data and no init() method defined, if you don't need them" do
97
+ HairColor::BLONDE.name.should == "BLONDE"
98
+ end
99
+ end
100
+
101
+ # It was reported on my blog that <=> was causing segfaults.
102
+ # I'd love to figure out why, but first I'd love to fix that.
103
+ describe "digging into this segfault/illegal instruction issue, renum" do
104
+ it "doesn't cause the ruby process to bomb!" do
105
+ Color::RED.should < Color::GREEN
106
+ Color::RED.should_not > Color::GREEN
107
+ Color::RED.should < Color::BLUE
108
+ end
109
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ if ENV['USE_GEM']
10
+ require 'rubygems'
11
+ require 'renum'
12
+ else
13
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/renum')
14
+ end
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :install_gem, :spec_gem, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,26 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/*_spec.rb']
21
+ end
22
+
23
+ task :spec_gem do
24
+ ENV['USE_GEM'] = 'y'
25
+ Rake::Task[:spec].invoke
26
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,143 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ renum
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>renum</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/renum"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/renum" class="numbers">1.0.0</a>
37
+ </div>
38
+ <p>Renum provides a readable but terse enum facility for Ruby. Enums are sometimes called object constants and are analogous to the type-safe enum pattern in Java, though obviously Ruby&#8217;s flexibility means there&#8217;s no such thing as type-safety.</p>
39
+
40
+
41
+ <h2>Installing</h2>
42
+
43
+
44
+ <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">renum</span></pre></p>
45
+
46
+
47
+ <h2>Demonstration of usage</h2>
48
+
49
+
50
+ <p>Renum allows you to do things like this:</p>
51
+
52
+
53
+ <p><pre class='syntax'><span class="ident">enum</span> <span class="symbol">:Status</span><span class="punct">,</span> <span class="punct">%w(</span><span class="string"> NOT_STARTED IN_PROGRESS COMPLETE </span><span class="punct">)</span>
54
+
55
+ <span class="ident">enum</span> <span class="symbol">:Size</span> <span class="keyword">do</span>
56
+ <span class="constant">Small</span><span class="punct">(&quot;</span><span class="string">Really really tiny</span><span class="punct">&quot;)</span>
57
+ <span class="constant">Medium</span><span class="punct">(&quot;</span><span class="string">Sort of in the middle</span><span class="punct">&quot;)</span>
58
+ <span class="constant">Large</span><span class="punct">(&quot;</span><span class="string">Quite big</span><span class="punct">&quot;)</span>
59
+
60
+ <span class="ident">attr_reader</span> <span class="symbol">:description</span>
61
+
62
+ <span class="keyword">def </span><span class="method">init</span> <span class="ident">description</span>
63
+ <span class="attribute">@description</span> <span class="punct">=</span> <span class="ident">description</span>
64
+ <span class="keyword">end</span>
65
+ <span class="keyword">end</span>
66
+
67
+ <span class="keyword">module </span><span class="module">MyNamespace</span>
68
+ <span class="ident">enum</span> <span class="symbol">:FooValue</span><span class="punct">,</span> <span class="punct">[</span> <span class="symbol">:Bar</span><span class="punct">,</span> <span class="symbol">:Baz</span><span class="punct">,</span> <span class="symbol">:Bat</span> <span class="punct">]</span>
69
+ <span class="keyword">end</span></pre></p>
70
+
71
+
72
+ <p>Giving you something that satisfies this spec, plus a bit more:</p>
73
+
74
+
75
+ <p><pre class='syntax'><span class="ident">describe</span> <span class="punct">&quot;</span><span class="string">enum</span><span class="punct">&quot;</span> <span class="keyword">do</span>
76
+
77
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">creates a class for the value type</span><span class="punct">&quot;</span> <span class="keyword">do</span>
78
+ <span class="constant">Status</span><span class="punct">.</span><span class="ident">class</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="constant">Class</span>
79
+ <span class="keyword">end</span>
80
+
81
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">makes each value an instance of the value type</span><span class="punct">&quot;</span> <span class="keyword">do</span>
82
+ <span class="constant">Status</span><span class="punct">::</span><span class="constant">NOT_STARTED</span><span class="punct">.</span><span class="ident">class</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="constant">Status</span>
83
+ <span class="keyword">end</span>
84
+
85
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">exposes array of values</span><span class="punct">&quot;</span> <span class="keyword">do</span>
86
+ <span class="constant">Status</span><span class="punct">.</span><span class="ident">values</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="punct">[</span><span class="constant">Status</span><span class="punct">::</span><span class="constant">NOT_STARTED</span><span class="punct">,</span> <span class="constant">Status</span><span class="punct">::</span><span class="constant">IN_PROGRESS</span><span class="punct">,</span> <span class="constant">Status</span><span class="punct">::</span><span class="constant">COMPLETE</span><span class="punct">]</span>
87
+ <span class="keyword">end</span>
88
+
89
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">provides an alternative means of declaring values where extra information can be provided for initialization</span><span class="punct">&quot;</span> <span class="keyword">do</span>
90
+ <span class="constant">Size</span><span class="punct">::</span><span class="constant">Small</span><span class="punct">.</span><span class="ident">description</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="punct">&quot;</span><span class="string">Really really tiny</span><span class="punct">&quot;</span>
91
+ <span class="keyword">end</span>
92
+
93
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">enumerates over values</span><span class="punct">&quot;</span> <span class="keyword">do</span>
94
+ <span class="constant">Status</span><span class="punct">.</span><span class="ident">map</span> <span class="punct">{|</span><span class="ident">s</span><span class="punct">|</span> <span class="ident">s</span><span class="punct">.</span><span class="ident">name</span><span class="punct">}.</span><span class="ident">should</span> <span class="punct">==</span> <span class="punct">%w[</span><span class="string">NOT_STARTED IN_PROGRESS COMPLETE</span><span class="punct">]</span>
95
+ <span class="keyword">end</span>
96
+
97
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">indexes values</span><span class="punct">&quot;</span> <span class="keyword">do</span>
98
+ <span class="constant">Status</span><span class="punct">[</span><span class="number">2</span><span class="punct">].</span><span class="ident">should</span> <span class="punct">==</span> <span class="constant">Status</span><span class="punct">::</span><span class="constant">COMPLETE</span>
99
+ <span class="keyword">end</span>
100
+
101
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">provides index lookup on values</span><span class="punct">&quot;</span> <span class="keyword">do</span>
102
+ <span class="constant">Status</span><span class="punct">::</span><span class="constant">IN_PROGRESS</span><span class="punct">.</span><span class="ident">index</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="number">1</span>
103
+ <span class="keyword">end</span>
104
+
105
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">provides a reasonable to_s for values</span><span class="punct">&quot;</span> <span class="keyword">do</span>
106
+ <span class="constant">Status</span><span class="punct">::</span><span class="constant">NOT_STARTED</span><span class="punct">.</span><span class="ident">to_s</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="punct">&quot;</span><span class="string">Status::NOT_STARTED</span><span class="punct">&quot;</span>
107
+ <span class="keyword">end</span>
108
+
109
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">makes values comparable</span><span class="punct">&quot;</span> <span class="keyword">do</span>
110
+ <span class="constant">Status</span><span class="punct">::</span><span class="constant">NOT_STARTED</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">&lt;</span> <span class="constant">Status</span><span class="punct">::</span><span class="constant">COMPLETE</span>
111
+ <span class="keyword">end</span>
112
+
113
+ <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">allows enums to be nested in other modules or classes</span><span class="punct">&quot;</span> <span class="keyword">do</span>
114
+ <span class="constant">MyNamespace</span><span class="punct">::</span><span class="constant">FooValue</span><span class="punct">::</span><span class="constant">Bar</span><span class="punct">.</span><span class="ident">class</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="constant">MyNamespace</span><span class="punct">::</span><span class="constant">FooValue</span>
115
+ <span class="keyword">end</span>
116
+
117
+ <span class="keyword">end</span></pre></p>
118
+
119
+
120
+ <h2>License</h2>
121
+
122
+
123
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
124
+
125
+
126
+ <h2>Contact</h2>
127
+
128
+
129
+ <p>Renum was created by John D. Hume. Comments are welcome. Send an email to duelin dot markers at gmail or <a href="http://elhumidor.blogspot.com/">contact me via my blog</a>.</p>
130
+ <p class="coda">
131
+ <a href="http://elhumidor.blogspot.com/">John D. Hume</a>, 25th January 2008<br>
132
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
133
+ </p>
134
+ </div>
135
+
136
+ <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
137
+ </script>
138
+ <script type="text/javascript">
139
+ _uacct = "UA-2039575-4";
140
+ urchinTracker();
141
+ </script>
142
+ </body>
143
+ </html>
data/website/index.txt ADDED
@@ -0,0 +1,84 @@
1
+ h1. renum
2
+
3
+ Renum provides a readable but terse enum facility for Ruby. Enums are sometimes called object constants and are analogous to the type-safe enum pattern in Java, though obviously Ruby's flexibility means there's no such thing as type-safety.
4
+
5
+ h2. Installing
6
+
7
+ <pre syntax="ruby">sudo gem install renum</pre>
8
+
9
+ h2. Demonstration of usage
10
+
11
+ Renum allows you to do things like this:
12
+
13
+ <pre syntax="ruby">enum :Status, %w( NOT_STARTED IN_PROGRESS COMPLETE )
14
+
15
+ enum :Size do
16
+ Small("Really really tiny")
17
+ Medium("Sort of in the middle")
18
+ Large("Quite big")
19
+
20
+ attr_reader :description
21
+
22
+ def init description
23
+ @description = description
24
+ end
25
+ end
26
+
27
+ module MyNamespace
28
+ enum :FooValue, [ :Bar, :Baz, :Bat ]
29
+ end</pre>
30
+
31
+ Giving you something that satisfies this spec, plus a bit more:
32
+
33
+ <pre syntax="ruby">describe "enum" do
34
+
35
+ it "creates a class for the value type" do
36
+ Status.class.should == Class
37
+ end
38
+
39
+ it "makes each value an instance of the value type" do
40
+ Status::NOT_STARTED.class.should == Status
41
+ end
42
+
43
+ it "exposes array of values" do
44
+ Status.values.should == [Status::NOT_STARTED, Status::IN_PROGRESS, Status::COMPLETE]
45
+ end
46
+
47
+ it "provides an alternative means of declaring values where extra information can be provided for initialization" do
48
+ Size::Small.description.should == "Really really tiny"
49
+ end
50
+
51
+ it "enumerates over values" do
52
+ Status.map {|s| s.name}.should == %w[NOT_STARTED IN_PROGRESS COMPLETE]
53
+ end
54
+
55
+ it "indexes values" do
56
+ Status[2].should == Status::COMPLETE
57
+ end
58
+
59
+ it "provides index lookup on values" do
60
+ Status::IN_PROGRESS.index.should == 1
61
+ end
62
+
63
+ it "provides a reasonable to_s for values" do
64
+ Status::NOT_STARTED.to_s.should == "Status::NOT_STARTED"
65
+ end
66
+
67
+ it "makes values comparable" do
68
+ Status::NOT_STARTED.should < Status::COMPLETE
69
+ end
70
+
71
+ it "allows enums to be nested in other modules or classes" do
72
+ MyNamespace::FooValue::Bar.class.should == MyNamespace::FooValue
73
+ end
74
+
75
+ end</pre>
76
+
77
+ h2. License
78
+
79
+ This code is free to use under the terms of the MIT license.
80
+
81
+ h2. Contact
82
+
83
+ Renum was created by John D. Hume. Comments are welcome. Send an email to duelin dot markers at gmail or "contact me via my blog":http://elhumidor.blogspot.com/.
84
+