acts_as_type 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/Gemfile +13 -0
- data/MIT-LICENSE +19 -0
- data/README.md +1 -0
- data/Rakefile +34 -0
- data/acts_as_type.gemspec +26 -0
- data/lib/acts_as_type.rb +112 -0
- data/lib/acts_as_type/version.rb +3 -0
- data/test/acts_as_type_test.rb +93 -0
- data/test/test_helper.rb +12 -0
- metadata +112 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c7c78e657132e43ae16e058423e680f67d4e548d
|
4
|
+
data.tar.gz: d10cab3ba979246b71fd4b2b59916dc6f1eb90c1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a0791bdc7bfd09aa9a7c369ffa5c62184669f17adf05498cddfff4a16c367b3d86017e9c701742e9ebf284f0aa7b18445437c8ce31141248ce4c7d7eaa75e06e
|
7
|
+
data.tar.gz: d36543b6c4af648a2971eefbb50c52b9db72369743f306257946ecfde9b4cc82311c68747fc68c6e5fe0f0272303d207a05330d95f11df75ea0c439c2a28e341
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2007 David Heinemeier Hansson
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
## acts_as_type
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
Bundler::GemHelper.install_tasks
|
4
|
+
|
5
|
+
require "rake/testtask"
|
6
|
+
|
7
|
+
# Run the test with "rake" or "rake test"
|
8
|
+
desc "Default: run acts_as_type unit tests."
|
9
|
+
task default: :test
|
10
|
+
|
11
|
+
desc "Test the acts_as_type plugin."
|
12
|
+
Rake::TestTask.new(:test) do |t|
|
13
|
+
t.libs << "lib" << "test"
|
14
|
+
t.pattern = "test/**/*_test.rb"
|
15
|
+
t.verbose = false
|
16
|
+
end
|
17
|
+
|
18
|
+
begin
|
19
|
+
# Run the rdoc task to generate rdocs for this gem
|
20
|
+
require "rdoc/task"
|
21
|
+
RDoc::Task.new do |rdoc|
|
22
|
+
require "acts_as_type/version"
|
23
|
+
version = ActsAsType::VERSION
|
24
|
+
|
25
|
+
rdoc.rdoc_dir = "rdoc"
|
26
|
+
rdoc.title = "acts_as_type #{version}"
|
27
|
+
rdoc.rdoc_files.include("README*")
|
28
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
29
|
+
end
|
30
|
+
rescue LoadError
|
31
|
+
puts "RDocTask is not supported on this platform."
|
32
|
+
rescue StandardError
|
33
|
+
puts "RDocTask is not supported on this platform."
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'acts_as_type/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "acts_as_type"
|
7
|
+
spec.version = ActsAsType::VERSION
|
8
|
+
spec.authors = ["Franky"]
|
9
|
+
spec.email = ["zhanglinjie412@gmail.com"]
|
10
|
+
spec.description = %q{A gem make a model attribute acts as a type}
|
11
|
+
spec.summary = %q{}
|
12
|
+
spec.homepage = ""
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
# spec.add_dependency 'engtagger'
|
21
|
+
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
23
|
+
spec.add_development_dependency 'activerecord', ">= 3.0"
|
24
|
+
spec.add_development_dependency 'rake'
|
25
|
+
spec.add_development_dependency 'rspec'
|
26
|
+
end
|
data/lib/acts_as_type.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require "acts_as_type/version"
|
2
|
+
module ActsAsType
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
end
|
6
|
+
|
7
|
+
# Example
|
8
|
+
# class Person
|
9
|
+
# include ActsAsType
|
10
|
+
# acts_as_type :gender, { male: "男", female: "女" }
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# Person.gender_values # => [:male, :female]
|
14
|
+
# Person.gender_names # => ['男', '女']
|
15
|
+
# Person.gender_collection # => { male: "男", female: "女" }
|
16
|
+
# Person.gender_select_collection # => [["男", :male], ["女", :female]]
|
17
|
+
#
|
18
|
+
# person = Person.new(gender: :male)
|
19
|
+
# person.male? # => true
|
20
|
+
# person.not_male? # => false
|
21
|
+
# person.female? # => false
|
22
|
+
# person.not_female? # => true
|
23
|
+
# person.gender_name # => "男"
|
24
|
+
#
|
25
|
+
# class Person < ActiveRecord::Base
|
26
|
+
# acts_as_type :gender, { male: "男", female: "女" }, validate: true, scope: true
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# Person.male # => Person.where(gender: :male)
|
30
|
+
# person = Person.new(gender: "no_valid_value")
|
31
|
+
# person.valid? # => false
|
32
|
+
#
|
33
|
+
|
34
|
+
module ClassMethods
|
35
|
+
def acts_as_type(column, type_collection, options={})
|
36
|
+
is_active_record = Object.const_defined?("ActiveRecord::Base") && self < ActiveRecord::Base
|
37
|
+
unless is_active_record
|
38
|
+
attr_accessor column
|
39
|
+
end
|
40
|
+
if type_collection.is_a?(Hash)
|
41
|
+
type_values = type_collection.keys
|
42
|
+
type_names = type_collection.values
|
43
|
+
elsif type_collection.is_a?(Array)
|
44
|
+
type_values = type_collection
|
45
|
+
type_names = type_collection
|
46
|
+
type_collection = Hash[type_values.zip(type_names)]
|
47
|
+
end
|
48
|
+
|
49
|
+
define_singleton_method "#{column}_collection" do
|
50
|
+
type_collection
|
51
|
+
end
|
52
|
+
|
53
|
+
define_singleton_method "#{column}_select_collection" do
|
54
|
+
type_collection.map{|value, name| [name, value]}
|
55
|
+
end
|
56
|
+
|
57
|
+
define_singleton_method "#{column}_collection_as_select_data" do
|
58
|
+
type_collection.map{|value, name| { name: name, id: value }}
|
59
|
+
end
|
60
|
+
|
61
|
+
define_singleton_method "#{column}_values" do
|
62
|
+
type_values
|
63
|
+
end
|
64
|
+
|
65
|
+
define_singleton_method "#{column}_value" do |type_name|
|
66
|
+
(Hash[type_names.zip(type_values)][type_name] rescue nil)
|
67
|
+
end
|
68
|
+
|
69
|
+
define_singleton_method "#{column}_names" do
|
70
|
+
type_names
|
71
|
+
end
|
72
|
+
|
73
|
+
define_singleton_method "#{column}_name" do |type_value|
|
74
|
+
(Hash[type_values.zip(type_names)][type_value.to_sym] rescue nil)
|
75
|
+
end
|
76
|
+
|
77
|
+
self.class_eval do
|
78
|
+
if options[:validate]
|
79
|
+
allow_blank = options.fetch(:allow_blank, true)
|
80
|
+
if respond_to?(:validates)
|
81
|
+
validates column, inclusion: {:in => type_values.map{|value| [value, value.to_s]}.flatten}, allow_blank: allow_blank
|
82
|
+
end
|
83
|
+
end
|
84
|
+
if options[:scope] && is_active_record
|
85
|
+
scope column, ->(column_param){ where(column.to_sym => column_param) if column_param.present? }
|
86
|
+
type_values.each do |type_value|
|
87
|
+
scope type_value, ->{ where(column.to_sym => type_value)}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
type_values.each do |type_value|
|
93
|
+
define_method "#{type_value}?" do
|
94
|
+
self.send(column).try(:to_sym) == type_value.to_sym
|
95
|
+
end
|
96
|
+
|
97
|
+
define_method "not_#{type_value}?" do
|
98
|
+
self.send(column).try(:to_sym) != type_value.to_sym
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
unless self.instance_methods.include?("#{column}_name".to_sym)
|
103
|
+
define_method "#{column}_name" do
|
104
|
+
type_collection.fetch(self.send(column).try(:to_sym), nil)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
ActiveRecord::Base.send(:include, ActsAsType) if defined?(ActiveRecord)
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
ActiveRecord::Base.establish_connection(
|
4
|
+
adapter: "sqlite3",
|
5
|
+
database: 'file:memdb1?mode=memory&cache=shared'
|
6
|
+
)
|
7
|
+
ActiveRecord::Schema.verbose = false
|
8
|
+
|
9
|
+
def setup_db
|
10
|
+
# AR caches columns options like defaults etc. Clear them!
|
11
|
+
ActiveRecord::Base.connection.create_table :people do |t|
|
12
|
+
t.column :name, :string
|
13
|
+
t.column :gender, :string
|
14
|
+
t.column :created_at, :datetime
|
15
|
+
t.column :updated_at, :datetime
|
16
|
+
end
|
17
|
+
|
18
|
+
ActiveRecord::Base.connection.schema_cache.clear!
|
19
|
+
Person.reset_column_information
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown_db
|
23
|
+
if ActiveRecord::VERSION::MAJOR >= 5
|
24
|
+
tables = ActiveRecord::Base.connection.data_sources
|
25
|
+
else
|
26
|
+
tables = ActiveRecord::Base.connection.tables
|
27
|
+
end
|
28
|
+
|
29
|
+
tables.each do |table|
|
30
|
+
ActiveRecord::Base.connection.drop_table(table)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Person < ActiveRecord::Base
|
35
|
+
acts_as_type :gender, { male: "男", female: "女" }, validate: true, scope: true
|
36
|
+
end
|
37
|
+
|
38
|
+
class NormalPerson
|
39
|
+
include ActsAsType
|
40
|
+
acts_as_type :gender, { male: "男", female: "女" }
|
41
|
+
end
|
42
|
+
|
43
|
+
class NormalArrayPerson
|
44
|
+
include ActsAsType
|
45
|
+
acts_as_type :gender, [:male, :female]
|
46
|
+
end
|
47
|
+
|
48
|
+
class ActsAsTypeTestCase < Minitest::Test
|
49
|
+
def teardown
|
50
|
+
teardown_db
|
51
|
+
end
|
52
|
+
|
53
|
+
def setup
|
54
|
+
setup_db
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_normal_model_class_methods
|
58
|
+
assert_equal [:male, :female], NormalPerson.gender_values
|
59
|
+
assert_equal ["男", "女"], NormalPerson.gender_names
|
60
|
+
assert_equal({ male: "男", female: "女" }, NormalPerson.gender_collection)
|
61
|
+
assert_equal([["男", :male], ["女", :female]], NormalPerson.gender_select_collection)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_normal_model_instance_methods
|
65
|
+
person = NormalPerson.new
|
66
|
+
person.gender = :male
|
67
|
+
assert_equal true, person.male?
|
68
|
+
assert_equal false, person.not_male?
|
69
|
+
assert_equal false, person.female?
|
70
|
+
assert_equal true, person.not_female?
|
71
|
+
assert_equal "男", person.gender_name
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_normal_array_model
|
75
|
+
assert_equal [:male, :female], NormalArrayPerson.gender_values
|
76
|
+
assert_equal [:male, :female], NormalArrayPerson.gender_names
|
77
|
+
assert_equal({ male: :male, female: :female }, NormalArrayPerson.gender_collection)
|
78
|
+
assert_equal([[:male, :male], [:female, :female]], NormalArrayPerson.gender_select_collection)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_active_record_model_validate
|
82
|
+
person = Person.new(gender: :no_male)
|
83
|
+
assert_equal false, person.valid?
|
84
|
+
person.gender = :male
|
85
|
+
assert_equal true, person.valid?
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_active_record_model_scope
|
89
|
+
person = Person.create(gender: :male)
|
90
|
+
assert_equal 1, Person.male.count
|
91
|
+
assert_equal person.id, Person.male.first.id
|
92
|
+
end
|
93
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require "active_record"
|
11
|
+
require "minitest/autorun"
|
12
|
+
require "acts_as_type"
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acts_as_type
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Franky
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-09-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: A gem make a model attribute acts as a type
|
70
|
+
email:
|
71
|
+
- zhanglinjie412@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- Gemfile
|
78
|
+
- MIT-LICENSE
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- acts_as_type.gemspec
|
82
|
+
- lib/acts_as_type.rb
|
83
|
+
- lib/acts_as_type/version.rb
|
84
|
+
- test/acts_as_type_test.rb
|
85
|
+
- test/test_helper.rb
|
86
|
+
homepage: ''
|
87
|
+
licenses:
|
88
|
+
- MIT
|
89
|
+
metadata: {}
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
requirements: []
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 2.5.1
|
107
|
+
signing_key:
|
108
|
+
specification_version: 4
|
109
|
+
summary: ''
|
110
|
+
test_files:
|
111
|
+
- test/acts_as_type_test.rb
|
112
|
+
- test/test_helper.rb
|