attribute_enums 0.1.0

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.
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: