acts_as_type 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,12 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
6
+ *.tmproj
7
+ .rbenv-version
8
+ .ruby-gemset
9
+ .ruby-version
10
+ # Appraisal generated lockfiles
11
+ *.gemfile.lock
12
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "sqlite3"
4
+ gem "rack", "~> 1"
5
+
6
+ gemspec
7
+
8
+ gem "rake"
9
+
10
+ group :test do
11
+ gem "minitest", "~> 5.0"
12
+ gem "test_after_commit", "~> 0.4.2"
13
+ end
@@ -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.
@@ -0,0 +1 @@
1
+ ## acts_as_type
@@ -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
@@ -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,3 @@
1
+ module ActsAsType
2
+ VERSION = "0.0.1"
3
+ end
@@ -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
@@ -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