attribute_enums 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/CHANGELOG ADDED
@@ -0,0 +1,4 @@
1
+ == 0.1.0
2
+
3
+ * First release
4
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in attribute_enums.gemspec
4
+ gemspec
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,4 @@
1
+ module AttributeEnums
2
+ VERSION = "0.1.0"
3
+ end
4
+
@@ -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
+
@@ -0,0 +1,6 @@
1
+ #encoding: utf-8
2
+
3
+ require "rubygems"
4
+ require "bundler/setup"
5
+ require "attribute_enums"
6
+
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: