simple_enum 1.6.9 → 2.3.2

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +9 -6
  4. data/LICENSE +1 -1
  5. data/README.md +331 -0
  6. data/Rakefile +9 -17
  7. data/lib/simple_enum/accessors/accessor.rb +61 -0
  8. data/lib/simple_enum/accessors/ignore_accessor.rb +11 -0
  9. data/lib/simple_enum/accessors/whiny_accessor.rb +12 -0
  10. data/lib/simple_enum/accessors.rb +28 -0
  11. data/lib/simple_enum/attribute.rb +109 -0
  12. data/lib/simple_enum/enum.rb +58 -0
  13. data/lib/simple_enum/hasher.rb +26 -0
  14. data/lib/simple_enum/mongoid.rb +16 -18
  15. data/lib/simple_enum/railtie.rb +17 -0
  16. data/lib/simple_enum/translation.rb +21 -0
  17. data/lib/simple_enum/version.rb +2 -2
  18. data/lib/simple_enum/view_helpers.rb +55 -0
  19. data/lib/simple_enum.rb +22 -278
  20. data/simple_enum.gemspec +9 -9
  21. data/spec/simple_enum/accessors_spec.rb +298 -0
  22. data/spec/simple_enum/attribute_spec.rb +272 -0
  23. data/spec/simple_enum/enum_spec.rb +136 -0
  24. data/spec/simple_enum/hasher_spec.rb +63 -0
  25. data/spec/simple_enum/mongoid_spec.rb +44 -0
  26. data/spec/simple_enum/translation_spec.rb +70 -0
  27. data/spec/simple_enum/view_helpers_spec.rb +71 -0
  28. data/spec/spec_helper.rb +27 -0
  29. data/spec/support/active_record_support.rb +27 -0
  30. data/spec/support/i18n_support.rb +12 -0
  31. data/spec/support/model_support.rb +47 -0
  32. data/spec/support/mongoid_support.rb +47 -0
  33. metadata +55 -57
  34. data/README.rdoc +0 -293
  35. data/lib/simple_enum/enum_hash.rb +0 -64
  36. data/lib/simple_enum/validation.rb +0 -58
  37. data/locales/en.yml +0 -10
  38. data/test/array_conversions_test.rb +0 -21
  39. data/test/class_methods_test.rb +0 -114
  40. data/test/dirty_attributes_test.rb +0 -37
  41. data/test/enum_hash_test.rb +0 -73
  42. data/test/finders_test.rb +0 -45
  43. data/test/locales.yml +0 -25
  44. data/test/mongoid_test.rb +0 -66
  45. data/test/object_backed_test.rb +0 -61
  46. data/test/orm/active_record.rb +0 -114
  47. data/test/orm/common.rb +0 -23
  48. data/test/orm/mongoid.rb +0 -114
  49. data/test/poro_test.rb +0 -20
  50. data/test/prefixes_test.rb +0 -36
  51. data/test/simple_enum_test.rb +0 -314
  52. data/test/test_helper.rb +0 -40
  53. data/test/without_shortcuts_test.rb +0 -39
data/test/finders_test.rb DELETED
@@ -1,45 +0,0 @@
1
- require 'test_helper'
2
-
3
- class FindersTest < MiniTest::Unit::TestCase
4
- def setup
5
- reload_db
6
- end
7
-
8
- def test_find_all_female_genders
9
- girls = Dummy.where(:gender_cd => Dummy.genders[:female]).sort { |a,b| a.name <=> b.name }
10
-
11
- assert_equal 2, girls.length
12
-
13
- assert_equal 'Anna', girls.first.name
14
- assert_equal :female, girls.first.gender
15
- assert_equal true, girls.first.female?
16
- end
17
-
18
- def test_find_all_gamma_words
19
- gammas = Dummy.where(:word_cd => Dummy.words(:gamma)).all
20
-
21
- assert_equal 1, gammas.length
22
- assert_equal 'Chris', gammas.first.name
23
- assert_equal true, gammas.first.male?
24
- assert_equal 'gamma', gammas.first.word_cd
25
- assert_equal :gamma, gammas.first.word
26
- end
27
-
28
- def test_find_all_with_attribute_didum_equal_to_foo
29
- skip('Not available in Mongoid') if mongoid?
30
-
31
- foos = Dummy.where('other = ?', Dummy.didums(:foo)).all
32
-
33
- assert_equal 1, foos.length
34
- assert_equal false, foos.first.foobar?
35
- end
36
-
37
- def test_find_using_insecure_inline_string_conditions
38
- skip('Not available in Mongoid') if mongoid?
39
-
40
- men = Dummy.where("gender_cd = #{Dummy.genders(:male)}").all
41
-
42
- assert_equal 1, men.length
43
- assert_equal true, men.first.male?
44
- end
45
- end
data/test/locales.yml DELETED
@@ -1,25 +0,0 @@
1
- # english translation
2
- en:
3
- activerecord:
4
- errors:
5
- models:
6
- validated_computer:
7
- attributes:
8
- operating_system:
9
- invalid_enum: y u no os?
10
- mongoid:
11
- errors:
12
- models:
13
- validated_computer:
14
- attributes:
15
- operating_system:
16
- invalid_enum: y u no os?
17
-
18
- enums:
19
- dummy:
20
- genders:
21
- female: Girl
22
- didums:
23
- foo:
24
- one: Foo
25
- other: Foos
data/test/mongoid_test.rb DELETED
@@ -1,66 +0,0 @@
1
- require 'test_helper'
2
-
3
- class MongoidTest < MiniTest::Unit::TestCase
4
- def setup
5
- @default_options = SimpleEnum.default_options
6
- reload_db
7
- end
8
-
9
- def teardown
10
- SimpleEnum.default_options.clear.update(@default_options)
11
- end
12
-
13
- def test_creates_a_field_per_default
14
- skip('Only available in mongoid') unless mongoid?
15
- klass = anonymous_dummy do
16
- as_enum :gender, [:male, :female]
17
- end
18
- refute_nil klass.new.fields['gender_cd']
19
- end
20
-
21
- def test_passing_custom_field_options
22
- skip('Only available in mongoid') unless mongoid?
23
- klass = anonymous_dummy do
24
- field :verify, :type => Integer
25
- as_enum :gender, [:male, :female], :field => { :type => Integer, :default => 1 }
26
- end
27
-
28
- gender_field = klass.new.fields['gender_cd']
29
- refute_nil gender_field
30
- assert_equal 1, gender_field.default
31
- assert_equal klass.fields['verify'].class, gender_field.class
32
- assert_equal :female, klass.new.gender
33
- end
34
-
35
- def test_skip_field_creation_if_field_false
36
- skip('Only available in mongoid') unless mongoid?
37
- klass = anonymous_dummy do
38
- as_enum :gender, [:male, :female], :field => false
39
- end
40
-
41
- assert_nil klass.new.fields['gender_cd']
42
- end
43
-
44
- def test_default_field_options
45
- skip('Only available in mongoid') unless mongoid?
46
- SimpleEnum.default_options[:field] = { :type => String }
47
- klass = anonymous_dummy do
48
- as_enum :gender, [:male, :female]
49
- end
50
-
51
- refute_nil klass.new.fields['gender_cd']
52
- assert_equal String, klass.new.fields['gender_cd'].options[:type]
53
- end
54
-
55
- def test_default_field_options_are_merged_recursivly
56
- skip('Only available in mongoid') unless mongoid?
57
- SimpleEnum.default_options[:field] = { :type => String }
58
- klass = anonymous_dummy do
59
- as_enum :gender, [:male, :female], :field => { :default => "0" }
60
- end
61
-
62
- refute_nil klass.new.fields['gender_cd']
63
- assert_equal String, klass.new.fields['gender_cd'].options[:type]
64
- assert_equal "0", klass.new.fields['gender_cd'].options[:default]
65
- end
66
- end
@@ -1,61 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ObjectBackedTest < MiniTest::Unit::TestCase
4
- def setup
5
- reload_db :genders => true
6
- end
7
-
8
- def test_how_working_with_object_backed_columns_work
9
- # simple object -> not db backed instance
10
- simple_obj = Class.new do
11
- attr_accessor :name
12
- def initialize(name)
13
- @name = name
14
- end
15
- end
16
-
17
- # create new class by using simple_obj
18
- with_object = anonymous_dummy do
19
- as_enum :gender, { simple_obj.new('Male') => 0, simple_obj.new('Female') => 1 }
20
- end
21
-
22
- d = with_object.where(:name => 'Anna').first
23
-
24
- assert_same simple_obj, d.gender.class
25
- assert_equal 'Female', d.gender.name
26
- assert_same true, d.female?
27
- assert_same false, d.male?
28
- assert_same 0, with_object.male
29
- end
30
-
31
- def test_db_backed_objects
32
- # using method described in 'Advanced Rails Recipes - Recipe 61: Look Up Constant Data Efficiently'
33
- # "cache" as defined in ARR#61
34
- genders = Gender.all
35
- # works without mapping... .map { |g| [g, g.id] }
36
-
37
- # use cached array of values
38
- with_db_obj = anonymous_dummy do
39
- as_enum :gender, genders
40
- end
41
-
42
- d = with_db_obj.where(:name => 'Bella').first
43
-
44
- assert_respond_to with_db_obj, :female
45
- assert_respond_to with_db_obj, :male
46
- assert_equal 0, with_db_obj.male
47
- end
48
-
49
- def test_that_accesing_keys_and_values_of_each_enumeration_value_works_as_expected
50
-
51
- with_db_obj = anonymous_dummy do
52
- as_enum :gender, Gender.all.to_a
53
- end
54
-
55
- assert_same 0, with_db_obj.male
56
- assert_equal @male.id, with_db_obj.male(true).id
57
-
58
- assert_same :male, Dummy.male(true)
59
- assert_same 0, Dummy.male
60
- end
61
- end
@@ -1,114 +0,0 @@
1
- require 'active_record/version'
2
-
3
- def orm_version
4
- ActiveRecord::VERSION::STRING
5
- end
6
-
7
- def ar32?
8
- ActiveRecord::VERSION::MAJOR >= 3 && ActiveRecord::VERSION::MINOR >= 2
9
- end
10
-
11
- def setup_db
12
- # create database connection (in memory db!)
13
- ActiveRecord::Base.establish_connection({
14
- :adapter => RUBY_PLATFORM =~ /java/ ? 'jdbcsqlite3' : 'sqlite3',
15
- :database => ':memory:'})
16
-
17
- # Fix visitor, for JRuby
18
- if RUBY_PLATFORM =~ /java/ && ar32?
19
- ActiveRecord::ConnectionAdapters::SQLiteAdapter.send(:define_method, :visitor) do
20
- @visitor ||= Arel::Visitors::SQLite.new(self)
21
- end
22
- end
23
- end
24
-
25
- # Reload database
26
- def reload_db(options = {})
27
- ActiveRecord::Base.connection.create_table :dummies, :force => true do |t|
28
- t.column :name, :string
29
- t.column :gender_cd, :integer
30
- t.column :word_cd, :string, :limit => 5
31
- t.column :role_cd, :string
32
- t.column :other, :integer
33
- t.column :numeric_cd, :string
34
- t.column :nilish_cd, :string
35
- end
36
-
37
- # Create ref-data table and fill with records
38
- ActiveRecord::Base.connection.create_table :genders, :force => true do |t|
39
- t.column :name, :string
40
- end
41
-
42
- # Validations
43
- ActiveRecord::Base.connection.create_table :computers, :force => true do |t|
44
- t.column :name, :string
45
- t.column :operating_system_cd, :integer
46
- t.column :manufacturer_cd, :integer
47
- end
48
-
49
- fill_db(options)
50
- end
51
-
52
- # Models
53
- def anonymous_dummy(&block)
54
- Class.new(ActiveRecord::Base) do
55
- ar32? ? self.table_name = 'dummies' : set_table_name('dummies')
56
- instance_eval &block
57
- end
58
- end
59
-
60
- def extend_computer(current_i18n_name = "Computer", &block)
61
- Class.new(Computer) do
62
- ar32? ? self.table_name = 'computers' : set_table_name('computers')
63
- instance_eval &block
64
- instance_eval <<-RUBY
65
- def self.model_name; MockName.mock!(#{current_i18n_name.inspect}) end
66
- RUBY
67
- end
68
- end
69
-
70
- def extend_dummy(current_i18n_name = "Dummy", &block)
71
- Class.new(Dummy) do
72
- ar32? ? self.table_name = 'dummies' : set_table_name('dummies')
73
- instance_eval &block
74
- instance_eval <<-RUBY
75
- def self.model_name; MockName.mock!(#{current_i18n_name.inspect}) end
76
- RUBY
77
- end
78
- end
79
-
80
- def named_dummy(class_name, &block)
81
- begin
82
- return class_name.constantize
83
- rescue NameError
84
- klass = Object.const_set(class_name, Class.new(ActiveRecord::Base))
85
- klass.module_eval do
86
- ar32? ? self.table_name = 'dummies' : set_table_name('dummies')
87
- instance_eval &block
88
- end
89
- klass
90
- end
91
- end
92
-
93
- class Dummy < ActiveRecord::Base
94
- as_enum :gender, [:male, :female]
95
- as_enum :word, { :alpha => 'alpha', :beta => 'beta', :gamma => 'gamma'}
96
- as_enum :didum, [ :foo, :bar, :foobar ], :column => 'other'
97
- as_enum :role, [:admin, :member, :anon], :strings => true
98
- as_enum :numeric, [:"100", :"3.14"], :strings => true
99
- as_enum :nilish, [:nil], :strings => true
100
- end
101
-
102
- class Gender < ActiveRecord::Base
103
- end
104
-
105
- class Computer < ActiveRecord::Base
106
- as_enum :manufacturer, [:dell, :compaq, :apple]
107
- as_enum :operating_system, [:windows, :osx, :linux, :bsd]
108
- end
109
-
110
- # Used to test STI stuff
111
- class SpecificDummy < Dummy
112
- ar32? ? self.table_name = 'dummies' : set_table_name('dummies')
113
- end
114
-
data/test/orm/common.rb DELETED
@@ -1,23 +0,0 @@
1
- class MockName < String
2
- def name; to_s end
3
-
4
- def self.mock!(name)
5
- ActiveModel::Name.new(MockName.new(name))
6
- end
7
- end
8
-
9
- def fill_db(options={})
10
- options = { :fill => true, :genders => false }.merge(options)
11
-
12
- if options[:fill]
13
- # fill db with some rows
14
- Dummy.create({ :name => 'Anna', :gender_cd => 1, :word_cd => 'alpha', :other => 0})
15
- Dummy.create({ :name => 'Bella', :gender_cd => 1, :word_cd => 'beta', :other => 1})
16
- Dummy.create({ :name => 'Chris', :gender_cd => 0, :word_cd => 'gamma', :other => 2})
17
- end
18
-
19
- if options[:genders]
20
- @male = Gender.create!({ :name => 'male' })
21
- @female = Gender.create!({ :name => 'female' })
22
- end
23
- end
data/test/orm/mongoid.rb DELETED
@@ -1,114 +0,0 @@
1
- require 'mongoid/version'
2
- require 'simple_enum/mongoid'
3
-
4
- def orm_version
5
- Mongoid::VERSION
6
- end
7
-
8
- def setup_db
9
- # create database connection
10
- Mongoid.configure do |config|
11
- config.master = Mongo::Connection.new('localhost').db("simple-enum-test-suite")
12
- config.use_utc = true
13
- config.include_root_in_json = true
14
- end
15
- end
16
-
17
-
18
- # Reload database
19
- def reload_db(options = {})
20
-
21
- # clear collections except system
22
- Mongoid.master.collections.select do |collection|
23
- collection.name !~ /system/
24
- end.each(&:drop)
25
-
26
- fill_db(options)
27
- end
28
-
29
- # models
30
- def anonymous_dummy(&block)
31
- Class.new do
32
- include Mongoid::Document
33
- include SimpleEnum::Mongoid
34
- self.collection_name = 'dummies'
35
- instance_eval &block
36
- end
37
- end
38
-
39
- def extend_computer(current_i18n_name = "Computer", &block)
40
- Class.new(Computer) do
41
- self.collection_name = 'computers'
42
- instance_eval &block
43
- instance_eval <<-RUBY
44
- def self.model_name; MockName.mock!(#{current_i18n_name.inspect}) end
45
- RUBY
46
- end
47
- end
48
-
49
- def extend_dummy(current_i18n_name = "Dummy", &block)
50
- Class.new(Dummy) do
51
- self.collection_name = 'dummies'
52
- instance_eval &block
53
- instance_eval <<-RUBY
54
- def self.model_name; MockName.mock!(#{current_i18n_name.inspect}) end
55
- RUBY
56
- end
57
- end
58
-
59
- def named_dummy(class_name, &block)
60
- begin
61
- return class_name.constantize
62
- rescue NameError
63
- klass = Object.const_set(class_name, Class.new)
64
- klass.module_eval do
65
- include Mongoid::Document
66
- include SimpleEnum::Mongoid
67
-
68
- self.collection_name = 'dummies'
69
- instance_eval &block
70
- end
71
-
72
- klass
73
- end
74
-
75
- end
76
-
77
- class Dummy
78
- include Mongoid::Document
79
- include SimpleEnum::Mongoid
80
-
81
- as_enum :gender, [:male, :female]
82
- as_enum :word, { :alpha => 'alpha', :beta => 'beta', :gamma => 'gamma'}
83
- as_enum :didum, [ :foo, :bar, :foobar ], :column => 'other'
84
- as_enum :role, [:admin, :member, :anon], :strings => true
85
- as_enum :numeric, [:"100", :"3.14"], :strings => true
86
- as_enum :nilish, [:nil], :strings => true
87
-
88
- before_save :check_typed
89
-
90
- def check_typed
91
- attributes['_type'] = nil unless (self.hereditary? || self.polymorphic?)
92
- end
93
-
94
- end
95
-
96
- class Gender
97
- include Mongoid::Document
98
- include SimpleEnum::Mongoid
99
-
100
- field :name, :type => String
101
- end
102
-
103
- class Computer
104
- include Mongoid::Document
105
- include SimpleEnum::Mongoid
106
-
107
- field :name, :type => String
108
-
109
- as_enum :manufacturer, [:dell, :compaq, :apple]
110
- as_enum :operating_system, [:windows, :osx, :linux, :bsd]
111
- end
112
-
113
- # Used to test STI stuff
114
- class SpecificDummy < Dummy; end
data/test/poro_test.rb DELETED
@@ -1,20 +0,0 @@
1
- require 'test_helper'
2
-
3
- class POROTest < MiniTest::Unit::TestCase
4
- class MyPORO
5
- include SimpleEnum
6
-
7
- attr_accessor :gender_cd
8
- as_enum :gender, [:male, :female]
9
- end
10
-
11
- def test_reading_and_writing
12
- poro = POROTest::MyPORO.new
13
- poro.gender_cd = 1
14
- assert_equal :female, poro.gender
15
-
16
- poro.male!
17
- assert_equal 0, poro.gender_cd
18
- assert_equal :male, poro.gender
19
- end
20
- end
@@ -1,36 +0,0 @@
1
- require 'test_helper'
2
-
3
- class PrefixesTest < MiniTest::Unit::TestCase
4
- def setup
5
- reload_db
6
- end
7
-
8
- def test_that_gender_is_prefixed_in_getters_and_setters
9
- with_prefix = anonymous_dummy do
10
- as_enum :gender, [:male, :female], :prefix => true
11
- end
12
-
13
- d = with_prefix.new :gender => :male
14
- assert_respond_to d, :gender_male?
15
- assert_respond_to d, :gender_male!
16
- assert_respond_to d, :gender_female?
17
- assert_respond_to d, :gender_female!
18
-
19
- # just ensure that it DOES NOT RESPOND TO good old male!
20
- assert !d.respond_to?(:male!)
21
- end
22
-
23
- def test_that_custom_prefix_is_applied_to_getters_and_setters
24
- with_string_prefix = anonymous_dummy do
25
- as_enum :gender, [:male, :female], :prefix => 'didum'
26
- end
27
-
28
- d = with_string_prefix.new :gender => :female
29
- assert_respond_to d, :didum_female?
30
- assert_respond_to d, :didum_female!
31
-
32
- # just check wheter the results are still correct :)
33
- assert d.didum_female?
34
- assert !d.didum_male?
35
- end
36
- end