attribute_enums 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/CHANGELOG +4 -0
- data/Gemfile +4 -0
- data/Guardfile +22 -0
- data/README.markdown +126 -0
- data/Rakefile +1 -0
- data/attribute_enums.gemspec +28 -0
- data/lib/attribute_enums/active_record_extension.rb +80 -0
- data/lib/attribute_enums/railtie.rb +12 -0
- data/lib/attribute_enums/version.rb +4 -0
- data/lib/attribute_enums.rb +13 -0
- data/spec/spec_helper.rb +6 -0
- metadata +125 -0
data/.gitignore
ADDED
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :version => 2 do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch(%r{^spec/.+_spec\.rb$})
|
11
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
12
|
+
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
13
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
14
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
15
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
16
|
+
watch('spec/spec_helper.rb') { "spec" }
|
17
|
+
watch('config/routes.rb') { "spec/routing" }
|
18
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
19
|
+
# Capybara request specs
|
20
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
21
|
+
end
|
22
|
+
|
data/README.markdown
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
#AttributeEnums
|
2
|
+
|
3
|
+
AttributeEnums is a model attribute enums plugin for Rails3. like 'symbolize' gem.
|
4
|
+
|
5
|
+
* https://github.com/vkill/attribute_enums
|
6
|
+
|
7
|
+
##Supported versions
|
8
|
+
|
9
|
+
* Ruby 1.8.7, 1.9.2, 1.9.3
|
10
|
+
|
11
|
+
* Rails 3.0.x, 3.1
|
12
|
+
|
13
|
+
|
14
|
+
##Installation
|
15
|
+
|
16
|
+
In your app's `Gemfile`, add:
|
17
|
+
|
18
|
+
gem "attribute_enums"
|
19
|
+
|
20
|
+
Then run:
|
21
|
+
|
22
|
+
> bundle
|
23
|
+
|
24
|
+
|
25
|
+
##Usage Example
|
26
|
+
|
27
|
+
###ActiveRecord
|
28
|
+
|
29
|
+
#db/migrate/xxxxxxxxxxxxxx_create_users.rb
|
30
|
+
class CreateUsers < ActiveRecord::Migration
|
31
|
+
def change
|
32
|
+
create_table :users do |t|
|
33
|
+
t.string :gender
|
34
|
+
t.boolean :enable
|
35
|
+
|
36
|
+
t.timestamps
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
#app/models/user.rb
|
43
|
+
class User < ActiveRecord::Basse
|
44
|
+
attribute_enums :gender, :in => [:female, :male]
|
45
|
+
attribute_enums :enable, :booleans => true
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
##Options
|
50
|
+
|
51
|
+
###booleans
|
52
|
+
|
53
|
+
default `false`
|
54
|
+
|
55
|
+
if use this, please don't use `in/within`.
|
56
|
+
|
57
|
+
###in/within
|
58
|
+
|
59
|
+
default `[]`
|
60
|
+
|
61
|
+
if use this, please don't use `booleans`.
|
62
|
+
|
63
|
+
###i18n
|
64
|
+
|
65
|
+
default `true`
|
66
|
+
|
67
|
+
en:
|
68
|
+
activerecord: #active_record
|
69
|
+
models:
|
70
|
+
user: User
|
71
|
+
attributes:
|
72
|
+
user:
|
73
|
+
gender: Gender
|
74
|
+
enable: Enable
|
75
|
+
enums:
|
76
|
+
gender:
|
77
|
+
female: Girl
|
78
|
+
male: Boy
|
79
|
+
enable:
|
80
|
+
"true": "Yes"
|
81
|
+
"false": "No"
|
82
|
+
|
83
|
+
###scopes
|
84
|
+
|
85
|
+
default `true`
|
86
|
+
|
87
|
+
#active_record
|
88
|
+
User.male => User.where(:gender => :male)
|
89
|
+
User.female => User.where(:gender => :female)
|
90
|
+
User.enable => User.where(:enable => true)
|
91
|
+
User.not_enable => User.where(:enable => false)
|
92
|
+
|
93
|
+
###allow_blank
|
94
|
+
|
95
|
+
default `false`
|
96
|
+
|
97
|
+
###validate
|
98
|
+
|
99
|
+
default `true`
|
100
|
+
|
101
|
+
###methods
|
102
|
+
|
103
|
+
default `true`
|
104
|
+
|
105
|
+
#active_record
|
106
|
+
User.get_gender_values => [["female", "Girl"], ["male", "Boy"]]
|
107
|
+
User.gender_values => {"female"=>"Girl", "male"=>"Boy"}
|
108
|
+
User.get_enable_values => [[true, "Yes"], [false, "No"]]
|
109
|
+
User.enable_values => {true=>"Yes", false=>"No"}
|
110
|
+
user = User.create(:gender => :male, :enable => true)
|
111
|
+
user.gender_text => "Boy"
|
112
|
+
user.enable_text => "Yes"
|
113
|
+
user.male? => true
|
114
|
+
user.female? => false
|
115
|
+
user.enable => true
|
116
|
+
|
117
|
+
###default
|
118
|
+
|
119
|
+
if your defined `default`, it set attribute `default` value before validate.
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
##Copyright
|
124
|
+
|
125
|
+
Copyright (c) 2011 vkill.net .
|
126
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "attribute_enums/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "attribute_enums"
|
7
|
+
s.version = AttributeEnums::VERSION
|
8
|
+
s.authors = ["vkill"]
|
9
|
+
s.email = ["vkill.net@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/vkill/attribute_enums"
|
11
|
+
s.summary = "A model attribute enums plugin for Rails3. like 'symbolize' gem."
|
12
|
+
s.description = "A model attribute enums plugin for Rails3. like 'symbolize' gem."
|
13
|
+
|
14
|
+
s.rubyforge_project = "attribute_enums"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency 'bundler'
|
22
|
+
s.add_development_dependency "rake"
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
s.add_development_dependency "guard-rspec"
|
25
|
+
s.add_dependency "activerecord", "~> 3.0"
|
26
|
+
s.add_dependency "activesupport", "~> 3.0"
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module AttributeEnums
|
2
|
+
module ActiveRecordExtension
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
included do
|
5
|
+
extend ClassMethods
|
6
|
+
end
|
7
|
+
module ClassMethods
|
8
|
+
def attribute_enums(attribute_name, *options, &block)
|
9
|
+
attribute_name = attribute_name.to_s
|
10
|
+
options = options.extract_options!
|
11
|
+
within = options.delete(:in).to_a || options.delete(:within).to_a || []
|
12
|
+
scopes = options.delete(:scopes) || true
|
13
|
+
allow_blank = options.delete(:allow_blank) || false
|
14
|
+
use_validate = options.delete(:validate) || true
|
15
|
+
methods = options.delete(:methods) || true
|
16
|
+
i18n = options.delete(:i18n) || true
|
17
|
+
booleans = options.delete(:booleans) || false
|
18
|
+
default = options.delete(:default) || (booleans ? true : "")
|
19
|
+
|
20
|
+
raise "attribute #{ attribute_name } does not exist." unless column_names.index(attribute_name)
|
21
|
+
raise "in/within and booleans has one and only one exist." if (!within.blank? and !booleans.blank?) or
|
22
|
+
(within.blank? and booleans.blank?)
|
23
|
+
if booleans
|
24
|
+
within = [true, false]
|
25
|
+
else
|
26
|
+
within.keep_if{|x| x.respond_to?("to_sym")}.collect!(&:to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
attribute_values = Hash[ within.map {|x| [ x, i18n ? human_attribute_name(:"enums.#{ attribute_name }.#{ x }") : x ]} ]
|
30
|
+
eval(%Q`class_attribute :#{ attribute_name}_values`)
|
31
|
+
eval(%Q`self.#{ attribute_name}_values = #{ attribute_values }`)
|
32
|
+
|
33
|
+
if scopes
|
34
|
+
if booleans
|
35
|
+
scope attribute_name, where(attribute_name => true)
|
36
|
+
eval(%Q`scope :not_#{ attribute_name }, where(:#{ attribute_name } => false)`)
|
37
|
+
else
|
38
|
+
within.all? do |value|
|
39
|
+
scope value, where(attribute_name => value)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
unless allow_blank
|
45
|
+
validates attribute_name, :presence => true
|
46
|
+
end
|
47
|
+
|
48
|
+
if use_validate
|
49
|
+
validates attribute_name, :inclusion => { :in => booleans ? [true, false] : (within + within.collect{|x| x.to_sym}) },
|
50
|
+
:if => eval(%Q`Proc.new { |record| record.#{ attribute_name }? }`)
|
51
|
+
end
|
52
|
+
|
53
|
+
if methods
|
54
|
+
eval(%Q`def get_#{ attribute_name }_values; self.#{ attribute_name}_values.to_a; end`)
|
55
|
+
if booleans
|
56
|
+
class_eval(%Q`def #{ attribute_name }_text; self.class.#{ attribute_name}_values[read_attribute("#{ attribute_name }")]; end`)
|
57
|
+
else
|
58
|
+
class_eval(%Q`def #{ attribute_name }_text; self.class.#{ attribute_name}_values[read_attribute("#{ attribute_name }").to_s]; end`)
|
59
|
+
end
|
60
|
+
unless booleans
|
61
|
+
within.each {|name| class_eval(%Q`def #{ name }?; read_attribute("#{ attribute_name }").to_s == "#{ name }"; end`) }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
if default
|
66
|
+
if booleans
|
67
|
+
class_eval(%Q`def set_default_for_attr_#{ attribute_name }; self.#{ attribute_name } ||= #{ !default.blank? }; end`)
|
68
|
+
else
|
69
|
+
class_eval(%Q`def set_default_for_attr_#{ attribute_name }; self.#{ attribute_name } ||= "#{ default.to_s }"; end`)
|
70
|
+
end
|
71
|
+
eval(%Q`before_validation :set_default_for_attr_#{ attribute_name }`)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
module InstanceMethods
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'attribute_enums/active_record_extension'
|
2
|
+
|
3
|
+
module AttributeEnums
|
4
|
+
class Railtie < ::Rails::Railtie
|
5
|
+
initializer 'attribute_enums' do |app|
|
6
|
+
ActiveSupport.on_load :active_record do
|
7
|
+
include AttributeEnums::ActiveRecordExtension
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "active_support/concern"
|
2
|
+
require "active_support/core_ext/object"
|
3
|
+
require "active_support/core_ext/class/attribute_accessors"
|
4
|
+
|
5
|
+
require "attribute_enums/version"
|
6
|
+
|
7
|
+
if defined?(::Rails)
|
8
|
+
require "attribute_enums/railtie"
|
9
|
+
end
|
10
|
+
|
11
|
+
module AttributeEnums
|
12
|
+
end
|
13
|
+
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: attribute_enums
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- vkill
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-11-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: &70955630 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70955630
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70955300 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70955300
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70954940 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70954940
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: guard-rspec
|
49
|
+
requirement: &70954720 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70954720
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: activerecord
|
60
|
+
requirement: &70954430 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '3.0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70954430
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activesupport
|
71
|
+
requirement: &70954100 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3.0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70954100
|
80
|
+
description: A model attribute enums plugin for Rails3. like 'symbolize' gem.
|
81
|
+
email:
|
82
|
+
- vkill.net@gmail.com
|
83
|
+
executables: []
|
84
|
+
extensions: []
|
85
|
+
extra_rdoc_files: []
|
86
|
+
files:
|
87
|
+
- .gitignore
|
88
|
+
- CHANGELOG
|
89
|
+
- Gemfile
|
90
|
+
- Guardfile
|
91
|
+
- README.markdown
|
92
|
+
- Rakefile
|
93
|
+
- attribute_enums.gemspec
|
94
|
+
- lib/attribute_enums.rb
|
95
|
+
- lib/attribute_enums/active_record_extension.rb
|
96
|
+
- lib/attribute_enums/railtie.rb
|
97
|
+
- lib/attribute_enums/version.rb
|
98
|
+
- spec/spec_helper.rb
|
99
|
+
homepage: https://github.com/vkill/attribute_enums
|
100
|
+
licenses: []
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project: attribute_enums
|
119
|
+
rubygems_version: 1.8.10
|
120
|
+
signing_key:
|
121
|
+
specification_version: 3
|
122
|
+
summary: A model attribute enums plugin for Rails3. like 'symbolize' gem.
|
123
|
+
test_files:
|
124
|
+
- spec/spec_helper.rb
|
125
|
+
has_rdoc:
|