ar-enums 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.3.3
data/ar-enums.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ar-enums}
8
- s.version = "0.3.2"
8
+ s.version = "0.3.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Emmanuel Nicolau"]
12
- s.date = %q{2010-08-09}
12
+ s.date = %q{2010-08-12}
13
13
  s.description = %q{Provides a simple way for defining enumerations in ActiveRecord models}
14
14
  s.email = %q{emmanicolau@gmail.com}
15
15
  s.extra_rdoc_files = [
data/lib/enum.rb CHANGED
@@ -36,7 +36,7 @@ module ActiveRecord
36
36
  end
37
37
 
38
38
  def self.enumeration *config, &block
39
- add_option config, :enum_class => self
39
+ add_option config, :class_name => self
40
40
  define_enums_getter ActiveRecord::Enumerations::Factory.make_enums(*config, &block)
41
41
  end
42
42
 
data/lib/enum_block.rb CHANGED
@@ -1,16 +1,17 @@
1
1
  module ActiveRecord
2
2
  module Enumerations
3
3
  class EnumBlock
4
- def initialize options = {}
4
+ def initialize enum_class, options = {}
5
5
  @enums = []
6
6
  @last_id = 0
7
+ @enum_class = enum_class
7
8
  @options = options
8
9
  end
9
10
 
10
11
  def method_missing method, args = {}
11
12
  attrs = @options.merge(args).merge(:name => method)
12
13
  attrs[:id] ||= @last_id += 1
13
- @enums << @options[:enum_class].new(attrs)
14
+ @enums << @enum_class.new(attrs)
14
15
  end
15
16
  end
16
17
  end
@@ -9,10 +9,8 @@ module ActiveRecord
9
9
 
10
10
  def enum field_name, *config, &block
11
11
  field = EnumField.new field_name
12
- enum_class = Class.new Enum
13
- const_set field.name.camelize, enum_class
14
- add_options config, :enum_class => enum_class, :on_style_not_matched => asume_external_style(field)
15
- enums = Factory.new.make_enums *config, &block
12
+ add_option config, :field => field, :active_record => self
13
+ enums = Factory.make_enums *config, &block
16
14
  define_enums_getter field, enums
17
15
  define_enum_getter_and_setter field, enums
18
16
  end
data/lib/factory.rb CHANGED
@@ -1,41 +1,63 @@
1
1
  module ActiveRecord
2
2
  module Enumerations
3
3
  class Factory
4
- include OptionsHelper
4
+ extend OptionsHelper
5
5
 
6
6
  def self.make_enums *config, &block
7
- new.make_enums *config, &block
7
+ values, options = extract_values_and_options config
8
+ new(values, options, &block).make_enums
9
+ end
10
+
11
+ def initialize values, options, &block
12
+ @values, @options, @block = values, options, block
13
+ @active_record = @options.delete :active_record
14
+ @field = @options.delete :field
15
+ @class_name = @options.delete(:class_name) || @field.name.camelize
16
+ @label_method = @options.delete(:label) || :desc
8
17
  end
9
18
 
10
- def make_enums *config, &block
11
- values, options = extract_values_and_options config
12
- options[:enum_class].label_method = options.delete(:label) || :desc
13
- create_enums(values, options, &block).tap do |enums|
14
- define_question_methods options[:enum_class], enums
15
- define_extra_columns_methods options[:enum_class], enums
19
+ def make_enums
20
+ enum_class.label_method = @label_method
21
+ create_enums.tap do |enums|
22
+ define_question_methods enums
23
+ define_extra_columns_methods enums
16
24
  end
17
25
  end
26
+
27
+ def enum_class
28
+ @enum_class ||= eval_external_class || create_inner_enum_class
29
+ end
18
30
 
19
- private
20
- def create_enums values, options, &block
21
- enums = if block_given?
22
- block_style options, &block
23
- elsif values.any?
24
- array_of_values_or_hashes_style values, options
25
- elsif options[:on_style_not_matched]
26
- options[:on_style_not_matched].call options
31
+ private
32
+ def eval_external_class
33
+ @class_name.is_a?(String) || @class_name.is_a?(Symbol) ? @active_record.send(:compute_type, @class_name) : @class_name
34
+ rescue NameError
35
+ nil
36
+ end
37
+
38
+ def create_inner_enum_class
39
+ @active_record.const_set @class_name, Class.new(Enum)
40
+ end
41
+
42
+ def create_enums
43
+ enums = if @block
44
+ block_style
45
+ elsif @values.any?
46
+ array_of_values_or_hashes_style
47
+ else
48
+ enum_class.all
27
49
  end
28
50
  end
29
51
 
30
- def block_style options, &block
31
- EnumBlock.new(options).instance_eval(&block)
52
+ def block_style
53
+ EnumBlock.new(enum_class, @options).instance_eval(&@block)
32
54
  end
33
55
 
34
- def array_of_values_or_hashes_style values, options
35
- values.map { |value| options[:enum_class].create_from(value, values, options) }
56
+ def array_of_values_or_hashes_style
57
+ @values.map { |value| enum_class.create_from(value, @values, @options) }
36
58
  end
37
59
 
38
- def define_question_methods enum_class, enums
60
+ def define_question_methods enums
39
61
  enums.each do |e|
40
62
  enum_class.class_eval %Q{
41
63
  def #{e.name}?
@@ -45,7 +67,7 @@ module ActiveRecord
45
67
  end
46
68
  end
47
69
 
48
- def define_extra_columns_methods enum_class, enums
70
+ def define_extra_columns_methods enums
49
71
  extra_columns_names = enums.map(&:extra_columns).map(&:keys).flatten.uniq
50
72
  extra_columns_names.each do |ecn|
51
73
  enum_class.class_eval %Q{
@@ -83,23 +83,23 @@ end
83
83
 
84
84
  describe "External enumerations" do
85
85
  before do
86
- define_model_class 'CountryState', 'ActiveRecord::Enum' do
86
+ define_model_class 'State', 'ActiveRecord::Enum' do
87
87
  enumeration do
88
88
  ca
89
89
  tx
90
90
  end
91
91
  end
92
-
92
+
93
93
  define_model_class 'Country' do
94
- enum :state, :class_name => 'CountryState'
95
- end
94
+ enum :state
95
+ end
96
96
 
97
97
  define_model_class 'TrafficLightState', 'ActiveRecord::Enum' do
98
98
  enumeration do
99
99
  green :rgb => 0x0F0
100
100
  red :rgb => 0xF00
101
101
  end
102
- end
102
+ end
103
103
 
104
104
  define_model_class 'TrafficLight' do
105
105
  enum :state, :class_name => 'TrafficLightState'
@@ -113,7 +113,7 @@ describe "External enumerations" do
113
113
 
114
114
  it "should be posible to access all enums from withing the owner" do
115
115
  TrafficLight.states.should equal(TrafficLightState.all)
116
- Country.states.should equal(CountryState.all)
116
+ Country.states.should equal(State.all)
117
117
  end
118
118
 
119
119
  it "should accept :class_name options to override de class of the external enum" do
@@ -139,6 +139,13 @@ describe "External enumerations" do
139
139
  def double_factor() factor * 2 end
140
140
  end
141
141
  State.all.map(&:double_factor).should == [2, 4]
142
- end
142
+ end
143
+
144
+ it "should not define new constant form enum class" do
145
+ define_model_class 'TrafficLight' do
146
+ enum :estado, :class_name => 'TrafficLightState'
147
+ end
148
+ expect { TrafficLight.const_get(:Estado) }.to raise_error NameError
149
+ end
143
150
  end
144
151
  end
data/spec/factory_spec.rb CHANGED
@@ -4,7 +4,7 @@ describe "Enums creation styles" do
4
4
  include ActiveRecord::Enumerations::OptionsHelper
5
5
 
6
6
  def make_enums *config, &block
7
- add_option config, :enum_class => ActiveRecord::Enum
7
+ add_option config, :class_name => ActiveRecord::Enum
8
8
  ActiveRecord::Enumerations::Factory.make_enums *config, &block
9
9
  end
10
10
 
data/spec/spec.opts CHANGED
@@ -1,2 +1,3 @@
1
1
  --color
2
2
  --debugger
3
+ --backtrace
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 2
9
- version: 0.3.2
8
+ - 3
9
+ version: 0.3.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Emmanuel Nicolau
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-09 00:00:00 -03:00
17
+ date: 2010-08-12 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency