giraffesoft-enum_field 0.1.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/README.rdoc ADDED
@@ -0,0 +1,32 @@
1
+ = EnumField
2
+
3
+ Macro to emulate a MySQL enum_field type thing.
4
+
5
+ == Usage
6
+
7
+ This plugin encapsulates a validates_inclusion_of and automatically gives you a
8
+ few more goodies automatically. That's it!
9
+
10
+ class Computer < ActiveRecord:Base
11
+ enum_field :status, ['on', 'off', 'standby', 'sleep', 'out of this world']
12
+
13
+ # Optionally with a message to replace the default one
14
+ # enum_field :status, ['on', 'off', 'standby', 'sleep', 'out of this world'], :message => "incorrect status"
15
+
16
+ #...
17
+ end
18
+
19
+ This will give you a few things:
20
+
21
+ - add a validates_inclusion_of with a simple error message ("invalid #{field}") or your custom message
22
+ - define the following query methods, in the name of expressive code:
23
+ - on?
24
+ - off?
25
+ - standby?
26
+ - sleep?
27
+ - out_of_this_world?
28
+ - define the STATUSES constant, which contains the acceptable values
29
+
30
+ = License
31
+
32
+ Copyright (c) 2008 James Golick, released under the MIT license
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :patch: 1
3
+ :major: 0
4
+ :minor: 1
data/lib/enum_field.rb ADDED
@@ -0,0 +1,43 @@
1
+ module EnumField
2
+ def self.included(klass)
3
+ klass.class_eval { extend EnumField::ClassMethods }
4
+ end
5
+
6
+ module ClassMethods
7
+ # enum_field encapsulates a validates_inclusion_of and automatically gives you a
8
+ # few more goodies automatically.
9
+ #
10
+ # class Computer < ActiveRecord:Base
11
+ # enum_field :status, ['on', 'off', 'standby', 'sleep', 'out of this world']
12
+ #
13
+ # # Optionally with a message to replace the default one
14
+ # # enum_field :status, ['on', 'off', 'standby', 'sleep'], :message => "incorrect status"
15
+ #
16
+ # #...
17
+ # end
18
+ #
19
+ # This will give you a few things:
20
+ #
21
+ # - add a validates_inclusion_of with a simple error message ("invalid #{field}") or your custom message
22
+ # - define the following query methods, in the name of expressive code:
23
+ # - on?
24
+ # - off?
25
+ # - standby?
26
+ # - sleep?
27
+ # - out_of_this_world?
28
+ # - define the STATUSES constant, which contains the acceptable values
29
+ def enum_field(field, possible_values, options={})
30
+ message = options[:message] || "invalid #{field}"
31
+ const_set field.to_s.pluralize.upcase, possible_values unless const_defined?(field.to_s.pluralize.upcase)
32
+
33
+ possible_values.each do |current_value|
34
+ method_name = current_value.downcase.gsub(/[-\s]/, '_')
35
+ define_method("#{method_name}?") do
36
+ self.send(field) == current_value
37
+ end
38
+ end
39
+
40
+ validates_inclusion_of field, :in => possible_values, :message => message
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,104 @@
1
+ $LOAD_PATH.reject! { |path| path.include?('TextMate') }
2
+ require 'test/unit'
3
+ require 'rubygems'
4
+ require 'active_support'
5
+ require 'mocha'
6
+ require 'shoulda'
7
+ require 'active_record'
8
+ require File.dirname(__FILE__)+'/../lib/enum_field'
9
+ require File.dirname(__FILE__)+'/../init'
10
+
11
+ class MockedModel; include EnumField; end;
12
+
13
+ class EnumFieldTest < Test::Unit::TestCase
14
+ context "with a simple gender enum" do
15
+ setup do
16
+ @possible_values = %w( male female )
17
+ MockedModel.expects(:validates_inclusion_of).with(:gender, :in => @possible_values, :message => "invalid gender")
18
+ MockedModel.send(:enum_field, :gender, @possible_values)
19
+ end
20
+
21
+ should "create constant with possible values named as pluralized field" do
22
+ assert_equal @possible_values, MockedModel::GENDERS
23
+ end
24
+
25
+ should "create query methods for each enum type" do
26
+ model = MockedModel.new
27
+
28
+ model.stubs(:gender).returns("male")
29
+ assert model.male?
30
+ assert !model.female?
31
+ model.stubs(:gender).returns("female")
32
+ assert !model.male?
33
+ assert model.female?
34
+ end
35
+
36
+ should "extend active record base with method" do
37
+ assert_respond_to ActiveRecord::Base, :enum_field
38
+ end
39
+ end
40
+
41
+ context "Specifying a message" do
42
+ setup do
43
+ @possible_values = %w(on off)
44
+ MockedModel.expects(:validates_inclusion_of).with(:status, :in => @possible_values, :message => "custom insult")
45
+ end
46
+
47
+ should "override the default message" do
48
+ MockedModel.send(:enum_field, :status, @possible_values, :message => 'custom insult')
49
+ end
50
+ end
51
+
52
+ context "With an enum containing multiple word choices" do
53
+ setup do
54
+ MockedModel.stubs(:validates_inclusion_of)
55
+ MockedModel.send :enum_field, :field, ['choice one', 'choice-two', 'other']
56
+ @model = MockedModel.new
57
+ end
58
+
59
+ should "define an underscored query method for the multiple word choice" do
60
+ assert_respond_to @model, :choice_one?
61
+ end
62
+
63
+ should "define an underscored query method for the dasherized choice" do
64
+ assert_respond_to @model, :choice_two?
65
+ end
66
+ end
67
+
68
+ context "With an enum containing mixed case choices" do
69
+ setup do
70
+ MockedModel.stubs(:validates_inclusion_of)
71
+ MockedModel.send :enum_field, :field, ['Choice One', 'ChoiceTwo', 'Other']
72
+ @model = MockedModel.new
73
+ end
74
+
75
+ should "define a lowercase, underscored query method for the multiple word choice" do
76
+ assert_respond_to @model, :choice_one?
77
+ end
78
+
79
+ should "define a lowercase query method for the camelcase choice" do
80
+ assert_respond_to @model, :choicetwo?
81
+ end
82
+ end
83
+
84
+ context "With an enum containing strange characters" do
85
+ setup do
86
+ MockedModel.stubs(:validates_inclusion_of)
87
+ MockedModel.send :enum_field, :field, ['choice%one', 'choice☺two', 'other.']
88
+ @model = MockedModel.new
89
+ end
90
+
91
+ should "define a normal query method for the unicode choice" do
92
+ assert_respond_to @model, :choice_two?
93
+ end
94
+
95
+ should "define a normal query method for the % choice" do
96
+ assert_respond_to @model, :choice_one?
97
+ end
98
+
99
+ should "define a query method without the trailing punctuation for the other choice" do
100
+ assert_respond_to @model, :other?
101
+ end
102
+ end
103
+ end
104
+
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: giraffesoft-enum_field
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - James Golick
8
+ - Mathieu Martin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-03-01 00:00:00 -08:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: enum_field encapsulates a bunch of common idioms around ActiveRecord validates_inclusion_of
18
+ email: james@giraffesoft.ca
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files: []
24
+
25
+ files:
26
+ - README.rdoc
27
+ - VERSION.yml
28
+ - lib/enum_field.rb
29
+ - test/enum_field_test.rb
30
+ has_rdoc: false
31
+ homepage: http://github.com/giraffesoft/enum_field
32
+ post_install_message:
33
+ rdoc_options: []
34
+
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: "0"
42
+ version:
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ requirements: []
50
+
51
+ rubyforge_project:
52
+ rubygems_version: 1.2.0
53
+ signing_key:
54
+ specification_version: 2
55
+ summary: ActiveRecord enum fields on steroid
56
+ test_files: []
57
+