active_enum 0.9.12 → 1.0.0.pre

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4aae7beff8dddf1e7a626ce7c6de2b35fa820f38
4
+ data.tar.gz: 3995d9471445a83cf36a771c5ef85c73ca63e54a
5
+ SHA512:
6
+ metadata.gz: 1047ed7a0228ddb9b1969a5222e6b080cf3f7e8453cc4d635d5ee90cda8206446e4c5b7a178d5f1496ca00c0ec0dd236ae495b3269e60add8878c84bc8147343
7
+ data.tar.gz: 008696a99059da7b5a343502ec0a4639d6ffc009acbc2beb5ed80c8903c98afb249ad9ce9c9f0165734fc14870da2c8e808bbc21e6917755c8138d2ac00d7de6
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ env:
2
+ - "RAILS_VERSION=3.1.0"
3
+ - "RAILS_VERSION=3.2.0"
4
+ - "RAILS_VERSION=4.0.0"
5
+ - "RAILS_VERSION=master"
6
+ rvm:
7
+ - 1.9.3
8
+ - 2.0.0
data/README.rdoc CHANGED
@@ -7,13 +7,15 @@ Enum values are stored in memory at the moment but I plan to add database and po
7
7
 
8
8
  == Install
9
9
 
10
- From version 0.7 onwards this plugin will only have Rails 3 support. If you need Rails 2 compatibility, {check the 0.6 branch}[https://github.com/adzap/active_enum/tree/0.6].
10
+ Supprots Ruby versions 2.0+.
11
+
12
+ From gem version 1.0 onwards this plugin will only have Rails 4+ support. If you need Rails 3 compatibility, {check the 0.9 branch}[https://github.com/adzap/active_enum/tree/0.9].
11
13
 
12
14
  gem install active_enum
13
15
 
14
16
  Put this in your Gemfile
15
17
 
16
- gem 'active_enum'
18
+ gem 'active_enum', '~> 1.0.0.pre'
17
19
 
18
20
  Then generate the config initializer file
19
21
 
@@ -135,11 +137,17 @@ Access the enum values and the enum class using the attribute method with a symb
135
137
  user.sex(:enum) # => Sex
136
138
  user.sex(:symbol) # => ♂ ( Can use any meta data key )
137
139
 
138
- You can set the default to return the enum name value for enumerated attribute
140
+ You can set the default to return the enum name value for enumerated attributes
141
+
142
+ ActiveEnum.setup do |config|
143
+ config.use_name_as_value = true
144
+ end
145
+
146
+ And now the name is returned for the regular attribute read method.
139
147
 
140
- ActiveEnum.use_name_as_value = true
141
148
  user.sex # => 'Male'
142
149
 
150
+
143
151
  === Boolean check
144
152
 
145
153
  You can check if the attribute value matches a particular enum value by passing the enum value as an argument to the question method
@@ -155,6 +163,25 @@ A convenience method on the class is available to the enum class of any enumerat
155
163
 
156
164
  User.active_enum_for(:sex) # => Sex
157
165
 
166
+ == Raise exception when value not found
167
+
168
+ When a value if not found for a given id or name the default behaviour is to return nil. If you would like to raise an error use
169
+
170
+ ActiveEnum.setup do |config|
171
+ config.raise_on_not_found = true
172
+ end
173
+
174
+ Then for the following examples
175
+
176
+ Sex['Other']
177
+
178
+ # Or
179
+
180
+ Sex[3]
181
+
182
+ will raise an ActiveEnum::NotFound exception.
183
+
184
+
158
185
  === Bulk definition
159
186
 
160
187
  Define enum classes in bulk without class files, in an initializer file for example.
@@ -194,19 +221,10 @@ Giving you the familiar enum methods
194
221
 
195
222
  === Form Helpers
196
223
 
197
- There is support for Formtastic[http://github.com/justinfrench/formtastic] and SimpleForm[http://github.com/plataformatec/simple_form]
198
- to make it easier to use the enum values as select options. The plugins have an almost identical API which is handy.
199
- You just need to require the extension for the respective plugin in an initialiser:
224
+ There is support for SimpleForm[http://github.com/plataformatec/simple_form] version 3+.
225
+ to make it easier to use the enum values as select options.
200
226
 
201
- Formtastic 2.x:
202
-
203
- require 'active_enum/form_helpers/formtastic2'
204
-
205
- Formtastic <2:
206
-
207
- require 'active_enum/form_helpers/formtastic'
208
-
209
- Or, SimpleForm:
227
+ In the initializer:
210
228
 
211
229
  require 'active_enum/form_helpers/simple_form'
212
230
 
@@ -266,4 +284,6 @@ nest the translations under the underscored model name
266
284
  female: Female
267
285
 
268
286
 
287
+ == License
288
+
269
289
  Copyright (c) 2009 Adam Meehan, released under the MIT license
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
3
 
4
- require 'rake/rdoctask'
4
+ require 'rdoc/task'
5
5
  require 'rspec/core/rake_task'
6
6
 
7
7
  desc "Run specs"
data/active_enum.gemspec CHANGED
@@ -16,5 +16,5 @@ Gem::Specification.new do |s|
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.extra_rdoc_files = ["README.rdoc", "CHANGELOG", "MIT-LICENSE"]
18
18
 
19
- s.add_runtime_dependency(%q<activesupport>, ["~> 3.0"])
19
+ s.add_runtime_dependency(%q<activesupport>, [">= 3.0"])
20
20
  end
data/lib/active_enum.rb CHANGED
@@ -11,6 +11,9 @@ module ActiveEnum
11
11
  mattr_accessor :use_name_as_value
12
12
  @@use_name_as_value = false
13
13
 
14
+ mattr_accessor :raise_on_not_found
15
+ @@raise_on_not_found = false
16
+
14
17
  mattr_accessor :storage
15
18
  @@storage = :memory
16
19
 
@@ -27,10 +30,14 @@ module ActiveEnum
27
30
 
28
31
  # Setup method for plugin configuration
29
32
  def self.setup
30
- yield self
33
+ yield config
31
34
  extend_classes!
32
35
  end
33
36
 
37
+ def self.config
38
+ self
39
+ end
40
+
34
41
  class EnumDefinitions
35
42
  def enum(name, &block)
36
43
  class_name = name.to_s.camelize
@@ -7,9 +7,9 @@ module ActiveEnum
7
7
  extend ClassMethods
8
8
  class_attribute :active_enum_options
9
9
  self.active_enum_options = options.reverse_merge(:name_column => 'name')
10
- scope :enum_values, select("#{primary_key}, #{active_enum_options[:name_column]}").
11
- where(active_enum_options[:conditions]).
12
- order("#{primary_key} #{active_enum_options[:order]}")
10
+ scope :enum_values, proc { select("#{primary_key}, #{active_enum_options[:name_column]}").
11
+ where(active_enum_options[:conditions]).
12
+ order("#{primary_key} #{active_enum_options[:order]}") }
13
13
  end
14
14
 
15
15
  end
@@ -45,7 +45,7 @@ module ActiveEnum
45
45
  end
46
46
 
47
47
  def lookup_by_name(index)
48
- enum_values.where("#{active_enum_options[:name_column]} like ?", index.to_s).first
48
+ enum_values.where("#{active_enum_options[:name_column]} like lower(?)", index.to_s).first
49
49
  end
50
50
 
51
51
  end
@@ -1,6 +1,7 @@
1
1
  module ActiveEnum
2
2
  class DuplicateValue < StandardError; end
3
3
  class InvalidValue < StandardError; end
4
+ class NotFound < StandardError; end
4
5
 
5
6
  class Base
6
7
 
@@ -37,6 +38,10 @@ module ActiveEnum
37
38
  store.values
38
39
  end
39
40
 
41
+ def each(&block)
42
+ all.each(&block)
43
+ end
44
+
40
45
  # Array of all enum id values
41
46
  def ids
42
47
  store.values.map {|v| v[0] }
@@ -55,15 +60,20 @@ module ActiveEnum
55
60
  # Access id or name value. Pass an id number to retrieve the name or
56
61
  # a symbol or string to retrieve the matching id.
57
62
  def get(index)
63
+ row = get_value(index)
64
+ return if row.nil?
65
+ index.is_a?(Fixnum) ? row[1] : row[0]
66
+ end
67
+ alias_method :[], :get
68
+
69
+ # Access value row array for a given id or name value.
70
+ def get_value(index)
58
71
  if index.is_a?(Fixnum)
59
- row = store.get_by_id(index)
60
- row[1] if row
72
+ store.get_by_id(index)
61
73
  else
62
- row = store.get_by_name(index)
63
- row[0] if row
64
- end
74
+ store.get_by_name(index)
75
+ end || (ActiveEnum.raise_on_not_found ? raise(ActiveEnum::NotFound, "#{self} value for '#{index}' was not found") : nil)
65
76
  end
66
- alias_method :[], :get
67
77
 
68
78
  def include?(value)
69
79
  !get(value).nil?
@@ -71,11 +81,7 @@ module ActiveEnum
71
81
 
72
82
  # Access any meta data defined for a given id or name. Returns a hash.
73
83
  def meta(index)
74
- row = if index.is_a?(Fixnum)
75
- store.get_by_id(index)
76
- else
77
- store.get_by_name(index)
78
- end
84
+ row = get_value(index)
79
85
  row[2] || {} if row
80
86
  end
81
87
 
@@ -80,10 +80,12 @@ module ActiveEnum
80
80
  def define_active_enum_read_method(attribute)
81
81
  class_eval <<-DEF
82
82
  def #{attribute}(arg=nil)
83
+ enum = self.class.active_enum_for(:#{attribute})
84
+ return enum if arg == :enum
85
+
83
86
  value = super()
84
- return if value.nil? && arg.nil?
87
+ return if value.nil?
85
88
 
86
- enum = self.class.active_enum_for(:#{attribute})
87
89
  case arg
88
90
  when nil
89
91
  #{ActiveEnum.use_name_as_value ? 'enum[value]' : 'value' }
@@ -91,8 +93,6 @@ module ActiveEnum
91
93
  value if enum[value]
92
94
  when :name
93
95
  enum[value]
94
- when :enum
95
- enum
96
96
  when Symbol
97
97
  (enum.meta(value) || {})[arg]
98
98
  end
@@ -127,7 +127,7 @@ module ActiveEnum
127
127
  class_eval <<-DEF
128
128
  def #{attribute}?(arg=nil)
129
129
  if arg
130
- self.#{attribute} == self.class.active_enum_for(:#{attribute})[arg]
130
+ self.#{attribute}(:id) == self.class.active_enum_for(:#{attribute})[arg]
131
131
  else
132
132
  super()
133
133
  end
@@ -5,46 +5,27 @@ module ActiveEnum
5
5
  module SimpleForm
6
6
  module BuilderExtension
7
7
 
8
- def default_input_type_with_active_enum(*args, &block)
9
- return :enum if (args.last.is_a?(Hash) ? args.last[:as] : @options[:as]).nil? &&
10
- object.class.respond_to?(:active_enum_for) &&
11
- object.class.active_enum_for(args.first || @attribute_name)
12
- default_input_type_without_active_enum(*args, &block)
13
- end
14
-
15
- end
16
-
17
- module InputExtension
18
-
19
- def initialize(*args)
8
+ def find_custom_type(attribute_name)
9
+ return :enum if object.class.active_enum_for(attribute_name) if object.class.respond_to?(:active_enum_for)
20
10
  super
21
- raise "Attribute '#{attribute_name}' has no enum class" unless enum = object.class.active_enum_for(attribute_name)
22
- if respond_to?(:input_options)
23
- input_options[:collection] = enum.to_select
24
- else
25
- @builder.options[:collection] = enum.to_select
26
- end
27
11
  end
28
-
12
+
29
13
  end
30
14
  end
31
15
  end
32
16
  end
33
17
 
34
- if SimpleForm::VERSION < '2.0.0'
35
- class ActiveEnum::FormHelpers::SimpleForm::EnumInput < ::SimpleForm::Inputs::CollectionInput
36
- include ActiveEnum::FormHelpers::SimpleForm::InputExtension
37
- end
38
- else
39
- class ActiveEnum::FormHelpers::SimpleForm::EnumInput < ::SimpleForm::Inputs::CollectionSelectInput
40
- include ActiveEnum::FormHelpers::SimpleForm::InputExtension
18
+ class ActiveEnum::FormHelpers::SimpleForm::EnumInput < ::SimpleForm::Inputs::CollectionSelectInput
19
+ def initialize(*args)
20
+ super
21
+ raise "Attribute '#{attribute_name}' has no enum class" unless enum = object.class.active_enum_for(attribute_name)
22
+ input_options[:collection] = enum.to_select
41
23
  end
42
24
  end
43
25
 
44
26
  SimpleForm::FormBuilder.class_eval do
45
- include ActiveEnum::FormHelpers::SimpleForm::BuilderExtension
27
+ prepend ActiveEnum::FormHelpers::SimpleForm::BuilderExtension
46
28
 
47
29
  map_type :enum, :to => ActiveEnum::FormHelpers::SimpleForm::EnumInput
48
30
  alias_method :collection_enum, :collection_select
49
- alias_method_chain :default_input_type, :active_enum
50
31
  end
@@ -22,6 +22,14 @@ module ActiveEnum
22
22
  raise NotImplemented
23
23
  end
24
24
 
25
+ def check_duplicate(id, name)
26
+ if get_by_id(id)
27
+ raise ActiveEnum::DuplicateValue, "#{@enum}: Duplicate id #{id}"
28
+ elsif get_by_name(name)
29
+ raise ActiveEnum::DuplicateValue, "#{@enum}: Duplicate name '#{name}'"
30
+ end
31
+ end
32
+
25
33
  def values
26
34
  _values
27
35
  end
@@ -17,12 +17,6 @@ module ActiveEnum
17
17
  _values.map { |(id, name)| get_by_id(id) }
18
18
  end
19
19
 
20
- def check_duplicate(id, name)
21
- if _values.assoc(id) || _values.rassoc(name.to_s)
22
- raise ActiveEnum::DuplicateValue
23
- end
24
- end
25
-
26
20
  def i18n_scope
27
21
  @i18n_scope ||= [ :active_enum ] + @enum.name.split("::").map { |nesting| nesting.underscore.to_sym }
28
22
  end
@@ -16,12 +16,6 @@ module ActiveEnum
16
16
  _values.rassoc(name.to_s) || _values.rassoc(name.to_s.titleize)
17
17
  end
18
18
 
19
- def check_duplicate(id, name)
20
- if get_by_id(id) || get_by_name(name)
21
- raise ActiveEnum::DuplicateValue
22
- end
23
- end
24
-
25
19
  def sort!
26
20
  case @order
27
21
  when :asc
@@ -1,3 +1,3 @@
1
1
  module ActiveEnum
2
- VERSION = '0.9.12'
2
+ VERSION = '1.0.0.pre'
3
3
  end
@@ -1,6 +1,5 @@
1
1
  # Form helper integration
2
- # require 'active_enum/form_helpers/formtastic' # for Formtastic <2
3
- # require 'active_enum/form_helpers/formtastic2' # for Formtastic 2.x
2
+ # require 'active_enum/form_helpers/simple_form' # for SimpleForm
4
3
 
5
4
  ActiveEnum.setup do |config|
6
5
 
@@ -10,6 +9,9 @@ ActiveEnum.setup do |config|
10
9
  # Return name string as value for attribute method
11
10
  # config.use_name_as_value = false
12
11
 
12
+ # Raise exception ActiveEnum::NotFound if enum value for a given id or name is not found
13
+ # config.raise_on_not_found = false
14
+
13
15
  # Storage of values (:memory, :i18n)
14
16
  # config.storage = :memory
15
17
 
@@ -13,36 +13,41 @@ describe ActiveEnum::ActsAsEnum do
13
13
  end
14
14
  end
15
15
 
16
+ class SortedPerson < ActiveRecord::Base
17
+ acts_as_enum :name_column => 'first_name', :order => :desc
18
+ end
19
+
16
20
  before(:all) do
17
21
  Person.create!(:first_name => 'Dave', :last_name => 'Smith')
18
22
  Person.create!(:first_name => 'John', :last_name => 'Doe')
23
+ SortedPerson.create!(:first_name => 'Dave', :last_name => 'Smith')
24
+ SortedPerson.create!(:first_name => 'John', :last_name => 'Doe')
19
25
  end
20
26
 
21
27
  it "should mixin enum class methods only when act_as_enum defined" do
22
- TestPerson.extended_modules.should_not include(ActiveEnum::ActsAsEnum::ClassMethods)
28
+ expect(TestPerson.extended_modules).not_to include(ActiveEnum::ActsAsEnum::ClassMethods)
23
29
  TestPerson.acts_as_enum
24
- TestPerson.extended_modules.should include(ActiveEnum::ActsAsEnum::ClassMethods)
30
+ expect(TestPerson.extended_modules).to include(ActiveEnum::ActsAsEnum::ClassMethods)
25
31
  end
26
32
 
27
33
  it "should return name column value when passing id to [] method" do
28
- Person[1].should == 'Dave'
34
+ expect(Person[1]).to eq('Dave')
29
35
  end
30
36
 
31
37
  it "should return id column value when passing string name to [] method" do
32
- Person['Dave'].should == 1
33
- Person['dave'].should == 1
38
+ expect(Person['Dave']).to eq(1)
39
+ expect(Person['dave']).to eq(1)
34
40
  end
35
41
 
36
42
  it "should return id column value when passing symbol name to [] method" do
37
- Person[:dave].should == 1
43
+ expect(Person[:dave]).to eq(1)
38
44
  end
39
45
 
40
46
  it "should return array for select helpers from to_select" do
41
- Person.to_select.should == [['Dave', 1], ['John', 2]]
47
+ expect(Person.to_select).to eq([['Dave', 1], ['John', 2]])
42
48
  end
43
49
 
44
- it "should return sorted array from order value for select helpers from to_select" do
45
- Person.acts_as_enum :name_column => 'first_name', :order => :desc
46
- Person.to_select.should == [['John', 2], ['Dave', 1]]
50
+ it "should return sorted array from order value for select helpers from to_select when an order is specified" do
51
+ expect(SortedPerson.to_select).to eq([['John', 2], ['Dave', 1]])
47
52
  end
48
53
  end