activerecord-mysql-enum 0.1.0.pre.1
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +14 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +124 -0
- data/LICENSE +20 -0
- data/README.md +64 -0
- data/Rakefile +4 -0
- data/enum_column.gemspec +32 -0
- data/init.rb +3 -0
- data/lib/active_record/mysql/enum.rb +27 -0
- data/lib/active_record/mysql/enum/active_record_helper.rb +65 -0
- data/lib/active_record/mysql/enum/enum_adapter.rb +27 -0
- data/lib/active_record/mysql/enum/enum_column_adapter.rb +113 -0
- data/lib/active_record/mysql/enum/enum_type.rb +31 -0
- data/lib/active_record/mysql/enum/mysql_adapter.rb +75 -0
- data/lib/active_record/mysql/enum/quoting.rb +29 -0
- data/lib/active_record/mysql/enum/schema_definitions.rb +13 -0
- data/lib/active_record/mysql/enum/validations.rb +41 -0
- data/lib/active_record/mysql/enum/version.rb +9 -0
- data/rails/init.rb +3 -0
- metadata +85 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: c37c82f5ddedde0545503bdb4c824964037844e1
|
|
4
|
+
data.tar.gz: 70ba4e27acd85d71c6343dabfa6e85de651d4a9d
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 0c7b178395cd972e7f48eb34ec889468fd356ade6af3fc234fb7bcc89bdf435fa151b4baac3e5fa655194b5c1fb7ef60218d5c8d22018bee2f60e4ba85ebe184
|
|
7
|
+
data.tar.gz: e85ffe4570a862afb670ae6095f9c1b792a51c9c00783776c8480090b3897edf5d16a1776bc7cdeb658e435ac9c877556c6cd331be414ce30b4111cd14f91828
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# CHANGELOG for `activerecord-mysql-enum`
|
|
2
|
+
|
|
3
|
+
Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
4
|
+
|
|
5
|
+
Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [0.1.0] - Unreleased
|
|
8
|
+
### Added
|
|
9
|
+
- Backwards compatibility with Rails 4
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- Renamed the gem from `enum_column3` to `activerecord-mysql-enum`
|
|
13
|
+
|
|
14
|
+
[0.1.0]: https://github.com/Invoca/activerecord-mysql-enum/tree/0.1.0
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
activerecord-mysql-enum (0.1.0.pre.1)
|
|
5
|
+
activerecord (>= 4.2, < 6)
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: https://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
actionmailer (4.2.11.3)
|
|
11
|
+
actionpack (= 4.2.11.3)
|
|
12
|
+
actionview (= 4.2.11.3)
|
|
13
|
+
activejob (= 4.2.11.3)
|
|
14
|
+
mail (~> 2.5, >= 2.5.4)
|
|
15
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
16
|
+
actionpack (4.2.11.3)
|
|
17
|
+
actionview (= 4.2.11.3)
|
|
18
|
+
activesupport (= 4.2.11.3)
|
|
19
|
+
rack (~> 1.6)
|
|
20
|
+
rack-test (~> 0.6.2)
|
|
21
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
22
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
23
|
+
actionview (4.2.11.3)
|
|
24
|
+
activesupport (= 4.2.11.3)
|
|
25
|
+
builder (~> 3.1)
|
|
26
|
+
erubis (~> 2.7.0)
|
|
27
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
28
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
|
29
|
+
activejob (4.2.11.3)
|
|
30
|
+
activesupport (= 4.2.11.3)
|
|
31
|
+
globalid (>= 0.3.0)
|
|
32
|
+
activemodel (4.2.11.3)
|
|
33
|
+
activesupport (= 4.2.11.3)
|
|
34
|
+
builder (~> 3.1)
|
|
35
|
+
activerecord (4.2.11.3)
|
|
36
|
+
activemodel (= 4.2.11.3)
|
|
37
|
+
activesupport (= 4.2.11.3)
|
|
38
|
+
arel (~> 6.0)
|
|
39
|
+
activesupport (4.2.11.3)
|
|
40
|
+
i18n (~> 0.7)
|
|
41
|
+
minitest (~> 5.1)
|
|
42
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
|
43
|
+
tzinfo (~> 1.1)
|
|
44
|
+
arel (6.0.4)
|
|
45
|
+
builder (3.2.4)
|
|
46
|
+
byebug (11.1.3)
|
|
47
|
+
coderay (1.1.3)
|
|
48
|
+
concurrent-ruby (1.1.7)
|
|
49
|
+
crass (1.0.6)
|
|
50
|
+
erubis (2.7.0)
|
|
51
|
+
globalid (0.4.2)
|
|
52
|
+
activesupport (>= 4.2.0)
|
|
53
|
+
i18n (0.9.5)
|
|
54
|
+
concurrent-ruby (~> 1.0)
|
|
55
|
+
loofah (2.6.0)
|
|
56
|
+
crass (~> 1.0.2)
|
|
57
|
+
nokogiri (>= 1.5.9)
|
|
58
|
+
mail (2.7.1)
|
|
59
|
+
mini_mime (>= 0.1.1)
|
|
60
|
+
method_source (1.0.0)
|
|
61
|
+
mini_mime (1.0.2)
|
|
62
|
+
mini_portile2 (2.4.0)
|
|
63
|
+
minitest (5.14.1)
|
|
64
|
+
nokogiri (1.10.10)
|
|
65
|
+
mini_portile2 (~> 2.4.0)
|
|
66
|
+
pry (0.13.1)
|
|
67
|
+
coderay (~> 1.1)
|
|
68
|
+
method_source (~> 1.0)
|
|
69
|
+
pry-byebug (3.9.0)
|
|
70
|
+
byebug (~> 11.0)
|
|
71
|
+
pry (~> 0.13.0)
|
|
72
|
+
rack (1.6.13)
|
|
73
|
+
rack-test (0.6.3)
|
|
74
|
+
rack (>= 1.0)
|
|
75
|
+
rails (4.2.11.3)
|
|
76
|
+
actionmailer (= 4.2.11.3)
|
|
77
|
+
actionpack (= 4.2.11.3)
|
|
78
|
+
actionview (= 4.2.11.3)
|
|
79
|
+
activejob (= 4.2.11.3)
|
|
80
|
+
activemodel (= 4.2.11.3)
|
|
81
|
+
activerecord (= 4.2.11.3)
|
|
82
|
+
activesupport (= 4.2.11.3)
|
|
83
|
+
bundler (>= 1.3.0, < 2.0)
|
|
84
|
+
railties (= 4.2.11.3)
|
|
85
|
+
sprockets-rails
|
|
86
|
+
rails-deprecated_sanitizer (1.0.3)
|
|
87
|
+
activesupport (>= 4.2.0.alpha)
|
|
88
|
+
rails-dom-testing (1.0.9)
|
|
89
|
+
activesupport (>= 4.2.0, < 5.0)
|
|
90
|
+
nokogiri (~> 1.6)
|
|
91
|
+
rails-deprecated_sanitizer (>= 1.0.1)
|
|
92
|
+
rails-html-sanitizer (1.3.0)
|
|
93
|
+
loofah (~> 2.3)
|
|
94
|
+
railties (4.2.11.3)
|
|
95
|
+
actionpack (= 4.2.11.3)
|
|
96
|
+
activesupport (= 4.2.11.3)
|
|
97
|
+
rake (>= 0.8.7)
|
|
98
|
+
thor (>= 0.18.1, < 2.0)
|
|
99
|
+
rake (13.0.1)
|
|
100
|
+
sprockets (3.7.2)
|
|
101
|
+
concurrent-ruby (~> 1.0)
|
|
102
|
+
rack (> 1, < 3)
|
|
103
|
+
sprockets-rails (3.2.1)
|
|
104
|
+
actionpack (>= 4.0)
|
|
105
|
+
activesupport (>= 4.0)
|
|
106
|
+
sprockets (>= 3.0.0)
|
|
107
|
+
thor (1.0.1)
|
|
108
|
+
thread_safe (0.3.6)
|
|
109
|
+
tzinfo (1.2.7)
|
|
110
|
+
thread_safe (~> 0.1)
|
|
111
|
+
|
|
112
|
+
PLATFORMS
|
|
113
|
+
ruby
|
|
114
|
+
|
|
115
|
+
DEPENDENCIES
|
|
116
|
+
activerecord-mysql-enum!
|
|
117
|
+
bundler (~> 1.8)
|
|
118
|
+
pry
|
|
119
|
+
pry-byebug
|
|
120
|
+
rails (~> 4.2)
|
|
121
|
+
rake (~> 13.0)
|
|
122
|
+
|
|
123
|
+
BUNDLED WITH
|
|
124
|
+
1.17.3
|
data/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2010-2011 Nick Pohodnya
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# ActiveRecord::Mysql::Enum
|
|
2
|
+
|
|
3
|
+
This gem is an extension to ActiveRecord which enables native support of
|
|
4
|
+
enumerations in the database schema using the ENUM type in MySQL. Forked
|
|
5
|
+
and revitalized from the early work that Nick Pohodnya did with [enum_column3](https://github.com/jewlr/enum_column).
|
|
6
|
+
|
|
7
|
+
## Support
|
|
8
|
+
Currently this has been manually tested with Rails version 4 and 5, and works with scaffolding.
|
|
9
|
+
|
|
10
|
+
**Supported adapters:**
|
|
11
|
+
- mysql
|
|
12
|
+
- mysql2
|
|
13
|
+
- jdbcmysql (by Nilesh Trivedi)
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
In your `Gemfile` add the following snippet
|
|
17
|
+
```ruby
|
|
18
|
+
gem 'activerecord-mysql-enum', '~> 0.1', require: 'active_support/mysql/enum'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
### Schema Definitions
|
|
23
|
+
When defining an enum in your schema, specify the constraint as a limit:
|
|
24
|
+
```ruby
|
|
25
|
+
create_table :enumerations, :force => true do |t|
|
|
26
|
+
t.column :severity, :enum, :limit => [:low, :medium, :high, :critical], :default => :medium
|
|
27
|
+
t.column :color, :enum, :limit => [:red, :blue, :green, :yellow]
|
|
28
|
+
end
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Model Validations
|
|
32
|
+
You can then automatically validate this column using:
|
|
33
|
+
```ruby
|
|
34
|
+
validates_columns :severity, :color
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Setting/Getting Values
|
|
38
|
+
All enumerated values will be given as symbols.
|
|
39
|
+
```ruby
|
|
40
|
+
@e = Enumeration.new
|
|
41
|
+
@e.severity = :medium
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
You can always use the column reflection to get the list of possible values from the database column.
|
|
45
|
+
```ruby
|
|
46
|
+
irb(1)> Enumeration.columns_hash['color'].limit
|
|
47
|
+
=> [:red, :blue, :green, :yellow]
|
|
48
|
+
irb(2)> @enumeration.column_for_attribute(:color).limit
|
|
49
|
+
=> [:red, :blue, :green, :yellow]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Form Helpers
|
|
53
|
+
You can use enum_select helper to generate input for enumerated attribute as:
|
|
54
|
+
```ruby
|
|
55
|
+
<%= enum_select(@enumeration, 'severity')%>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Or using `form_for`:
|
|
59
|
+
```ruby
|
|
60
|
+
<%= form_for @enumeration do |f| %>
|
|
61
|
+
<%= f.label :severity %>
|
|
62
|
+
<%= f.enum_select :severity %>
|
|
63
|
+
<% end %>
|
|
64
|
+
```
|
data/Rakefile
ADDED
data/enum_column.gemspec
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
|
+
require "active_record/mysql/enum/version"
|
|
6
|
+
|
|
7
|
+
Gem::Specification.new do |spec|
|
|
8
|
+
spec.name = "activerecord-mysql-enum"
|
|
9
|
+
spec.version = ActiveRecord::Mysql::Enum::VERSION
|
|
10
|
+
spec.authors = ["Nick Pohodnya", "Invoca Development"]
|
|
11
|
+
spec.email = ["development@invoca.com"]
|
|
12
|
+
|
|
13
|
+
spec.summary = "Enable enum type for the MySQL Adapter in ActiveRecord"
|
|
14
|
+
spec.description = "Enable enum type for the MySQL Adapter in ActiveRecord"
|
|
15
|
+
spec.homepage = "http://github.com/Invoca/activerecord-mysql-enum"
|
|
16
|
+
|
|
17
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
|
18
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
|
19
|
+
spec.metadata = {
|
|
20
|
+
"source_code_uri" => "https://github.com/Invoca/activerecord-mysql-enum",
|
|
21
|
+
'allowed_push_host' => "https://rubygems.org"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# Specify which files should be added to the gem when it is released.
|
|
25
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
26
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
|
27
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
28
|
+
end
|
|
29
|
+
spec.require_paths = ["lib"]
|
|
30
|
+
|
|
31
|
+
spec.add_dependency 'activerecord', '>= 4.2', '< 6'
|
|
32
|
+
end
|
data/init.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
if defined?(::Rails::Railtie)
|
|
4
|
+
module ActiveRecord
|
|
5
|
+
module Mysql
|
|
6
|
+
module Enum
|
|
7
|
+
class Railtie < Rails::Railtie
|
|
8
|
+
initializer 'active_record-mysql-enum.initialize', :after => 'active_record.initialize_database' do |app|
|
|
9
|
+
ActiveSupport.on_load :active_record do
|
|
10
|
+
require 'active_record/mysql/enum/mysql_adapter'
|
|
11
|
+
require 'active_record/mysql/enum/enum_type'
|
|
12
|
+
require 'active_record/mysql/enum/enum_adapter'
|
|
13
|
+
require 'active_record/mysql/enum/enum_column_adapter'
|
|
14
|
+
require 'active_record/mysql/enum/schema_definitions'
|
|
15
|
+
require 'active_record/mysql/enum/quoting'
|
|
16
|
+
require 'active_record/mysql/enum/validations'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
ActiveSupport.on_load :action_view do
|
|
20
|
+
require 'active_record/mysql/enum/active_record_helper'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
if defined?(Rails::Generator)
|
|
4
|
+
module Rails
|
|
5
|
+
module Generator
|
|
6
|
+
class GeneratedAttribute
|
|
7
|
+
def field_type_with_enumerated_attribute
|
|
8
|
+
return (@field_type = :enum_select) if type == :enum
|
|
9
|
+
field_type_without_enumerated_attribute
|
|
10
|
+
end
|
|
11
|
+
alias_method_chain :field_type, :enumerated_attribute
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if defined?(ActionView::Base)
|
|
18
|
+
module ActionView
|
|
19
|
+
module Helpers
|
|
20
|
+
|
|
21
|
+
#form_options_helper.rb
|
|
22
|
+
module FormOptionsHelper
|
|
23
|
+
#def select
|
|
24
|
+
def enum_select(object, method, options={}, html_options={})
|
|
25
|
+
InstanceTag.new(object, method, self, options.delete(:object)).to_enum_select_tag(options, html_options)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class InstanceTag
|
|
30
|
+
def to_enum_select_tag(options, html_options={})
|
|
31
|
+
if self.object.respond_to?(method_name.to_sym)
|
|
32
|
+
column = self.object.column_for_attribute(method_name)
|
|
33
|
+
if (value = self.object.__send__(method_name.to_sym))
|
|
34
|
+
options[:selected] ||= value.to_s
|
|
35
|
+
else
|
|
36
|
+
options[:include_blank] = column.null if options[:include_blank].nil?
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
to_select_tag(column.limit, options, html_options)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#initialize record_name, method, self
|
|
43
|
+
if respond_to?(:to_tag)
|
|
44
|
+
def to_tag_with_enumerated_attribute(options={})
|
|
45
|
+
#look for an enum
|
|
46
|
+
if (column_type == :enum && self.object.class.respond_to?(method_name.to_sym))
|
|
47
|
+
to_enum_select_tag(options)
|
|
48
|
+
else
|
|
49
|
+
to_tag_without_enumerated_attribute(options)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
alias_method_chain :to_tag, :enumerated_attribute
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class FormBuilder
|
|
58
|
+
def enum_select(method, options={}, html_options={})
|
|
59
|
+
@template.enum_select(@object_name, method, objectify_options(options), @default_options.merge(html_options))
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This module provides all the column helper methods to deal with the
|
|
4
|
+
# values and adds the common type management code for the adapters.
|
|
5
|
+
|
|
6
|
+
adapter_class = if defined? ActiveRecord::ConnectionAdapters::Mysql2Adapter
|
|
7
|
+
ActiveRecord::ConnectionAdapters::Mysql2Adapter
|
|
8
|
+
elsif defined? ActiveRecord::ConnectionAdapters::MysqlAdapter
|
|
9
|
+
ActiveRecord::ConnectionAdapters::MysqlAdapter
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
if adapter_class
|
|
13
|
+
adapter_class.class_eval do
|
|
14
|
+
|
|
15
|
+
protected
|
|
16
|
+
if instance_methods.include?(:initialize_type_map)
|
|
17
|
+
def initialize_type_map_with_enum_types(m)
|
|
18
|
+
initialize_type_map_without_enum_types(m)
|
|
19
|
+
m.register_type(%r(enum)i) do |sql_type|
|
|
20
|
+
limit = sql_type.sub(/^enum\('(.+)'\)/i, '\1').split("','").map { |v| v.intern }
|
|
21
|
+
ActiveRecord::Type::Enum.new(limit: limit)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
alias_method_chain :initialize_type_map, :enum_types
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This module provides all the column helper methods to deal with the
|
|
4
|
+
# values and adds the common type management code for the adapters.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# try rails 3.1, then rails 3.2+, mysql column adapters
|
|
8
|
+
column_class = if defined? ActiveRecord::ConnectionAdapters::Mysql2Column
|
|
9
|
+
ActiveRecord::ConnectionAdapters::Mysql2Column
|
|
10
|
+
elsif defined? ActiveRecord::ConnectionAdapters::MysqlColumn
|
|
11
|
+
ActiveRecord::ConnectionAdapters::MysqlColumn
|
|
12
|
+
elsif defined? ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column
|
|
13
|
+
ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column
|
|
14
|
+
elsif defined? ActiveRecord::ConnectionAdapters::MysqlAdapter::Column
|
|
15
|
+
ActiveRecord::ConnectionAdapters::MysqlAdapter::Column
|
|
16
|
+
elsif defined? ActiveRecord::ConnectionAdapters::MySQL::Column
|
|
17
|
+
ActiveRecord::ConnectionAdapters::MySQL::Column
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
if column_class
|
|
21
|
+
column_class.class_eval do
|
|
22
|
+
|
|
23
|
+
if instance_methods.include?(:extract_default)
|
|
24
|
+
alias __extract_default_enum extract_default
|
|
25
|
+
def extract_default
|
|
26
|
+
if type == :enum
|
|
27
|
+
if @default == '' || @default.nil?
|
|
28
|
+
@default = nil
|
|
29
|
+
else
|
|
30
|
+
@default = @default.intern
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
__extract_default_enum
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def __enum_type_cast(value)
|
|
38
|
+
if type == :enum
|
|
39
|
+
self.class.value_to_symbol(value)
|
|
40
|
+
else
|
|
41
|
+
__type_cast_enum(value)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
if instance_methods.include?(:type_cast_from_database)
|
|
46
|
+
alias __type_cast_enum type_cast_from_database
|
|
47
|
+
# Convert to a symbol.
|
|
48
|
+
def type_cast_from_database(value)
|
|
49
|
+
__enum_type_cast(value)
|
|
50
|
+
end
|
|
51
|
+
elsif instance_methods.include?(:type_cast)
|
|
52
|
+
alias __type_cast_enum type_cast
|
|
53
|
+
def type_cast(value)
|
|
54
|
+
__enum_type_cast(value)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Deprecated in Rails 4.1
|
|
59
|
+
if instance_methods.include?(:type_cast_code)
|
|
60
|
+
alias __type_cast_code_enum type_cast_code
|
|
61
|
+
# Code to convert to a symbol.
|
|
62
|
+
def type_cast_code(var_name)
|
|
63
|
+
if type == :enum
|
|
64
|
+
"#{self.class.name}.value_to_symbol(#{var_name})"
|
|
65
|
+
else
|
|
66
|
+
__type_cast_code_enum(var_name)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class << self
|
|
72
|
+
# Safely convert the value to a symbol.
|
|
73
|
+
def value_to_symbol(value)
|
|
74
|
+
case value
|
|
75
|
+
when Symbol
|
|
76
|
+
value
|
|
77
|
+
when String
|
|
78
|
+
value.empty? ? nil : value.intern
|
|
79
|
+
else
|
|
80
|
+
nil
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
# Deprecated in Rails 4.2
|
|
88
|
+
if private_instance_methods.include?(:simplified_type)
|
|
89
|
+
alias __simplified_type_enum simplified_type
|
|
90
|
+
# The enum simple type.
|
|
91
|
+
def simplified_type(field_type)
|
|
92
|
+
if field_type =~ /enum/i
|
|
93
|
+
:enum
|
|
94
|
+
else
|
|
95
|
+
__simplified_type_enum(field_type)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Deprecated in Rails 4.2
|
|
101
|
+
if private_instance_methods.include?(:extract_limit)
|
|
102
|
+
alias __extract_limit_enum extract_limit
|
|
103
|
+
def extract_limit(sql_type)
|
|
104
|
+
if sql_type =~ /^enum/i
|
|
105
|
+
sql_type.sub(/^enum\('(.+)'\)/i, '\1').split("','").map { |v| v.intern }
|
|
106
|
+
else
|
|
107
|
+
__extract_limit_enum(sql_type)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
if defined? ActiveRecord::Type::Value
|
|
4
|
+
module ActiveRecord
|
|
5
|
+
module Type
|
|
6
|
+
class Enum < Value # :nodoc:
|
|
7
|
+
def type
|
|
8
|
+
:enum
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def type_cast_for_database(value)
|
|
12
|
+
if value.nil? || value == ''
|
|
13
|
+
nil
|
|
14
|
+
else
|
|
15
|
+
value.to_s
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def cast_value(value)
|
|
22
|
+
if value.nil? || value == ''
|
|
23
|
+
nil
|
|
24
|
+
else
|
|
25
|
+
value.to_sym
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
adapter_class = if defined? ActiveRecord::ConnectionAdapters::MySQLJdbcConnection
|
|
4
|
+
ActiveRecord::ConnectionAdapters::MySQLJdbcConnection
|
|
5
|
+
# elsif defined? ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
|
|
6
|
+
# ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
|
|
7
|
+
elsif defined? ActiveRecord::ConnectionAdapters::Mysql2Adapter
|
|
8
|
+
ActiveRecord::ConnectionAdapters::Mysql2Adapter
|
|
9
|
+
elsif defined? ActiveRecord::ConnectionAdapters::MysqlAdapter
|
|
10
|
+
ActiveRecord::ConnectionAdapters::MysqlAdapter
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module ActiveRecord
|
|
14
|
+
module Mysql
|
|
15
|
+
module Enum
|
|
16
|
+
module MysqlAdapter
|
|
17
|
+
def native_database_types #:nodoc
|
|
18
|
+
types = super
|
|
19
|
+
types[:enum] = { :name => "enum" }
|
|
20
|
+
types
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Add enumeration support for schema statement creation. This
|
|
24
|
+
# will have to be adapted for every adapter if the type requires
|
|
25
|
+
# anything by a list of allowed values. The overrides the standard
|
|
26
|
+
# type_to_sql method and chains back to the default. This could
|
|
27
|
+
# be done on a per adapter basis, but is generalized here.
|
|
28
|
+
#
|
|
29
|
+
# will generate enum('a', 'b', 'c') for :limit => [:a, :b, :c]
|
|
30
|
+
if Rails::VERSION::MAJOR < 5
|
|
31
|
+
def type_to_sql(type, limit = nil, precision = nil, scale = nil, unsigned = nil, **) # :nodoc:
|
|
32
|
+
if type.to_s == 'enum'
|
|
33
|
+
native = native_database_types[type]
|
|
34
|
+
column_type_sql = (native || {})[:name] || 'enum'
|
|
35
|
+
|
|
36
|
+
column_type_sql << "(#{limit.map { |v| quote(v) }.join(',')})"
|
|
37
|
+
|
|
38
|
+
column_type_sql
|
|
39
|
+
else
|
|
40
|
+
super(type, limit, precision, scale, unsigned)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
else
|
|
44
|
+
def type_to_sql(type, limit: nil, precision: nil, scale: nil, unsigned: nil, **) # :nodoc:
|
|
45
|
+
if type.to_s == 'enum'
|
|
46
|
+
native = native_database_types[type]
|
|
47
|
+
column_type_sql = (native || {})[:name] || 'enum'
|
|
48
|
+
|
|
49
|
+
column_type_sql << "(#{limit.map { |v| quote(v) }.join(',')})"
|
|
50
|
+
|
|
51
|
+
column_type_sql
|
|
52
|
+
else
|
|
53
|
+
super(type, limit: limit, precision: precision, scale: scale, unsigned: unsigned)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
def initialize_type_map(m = type_map)
|
|
61
|
+
super
|
|
62
|
+
|
|
63
|
+
m.register_type(%r(enum)i) do |sql_type|
|
|
64
|
+
limit = sql_type.sub(/^enum\('(.+)'\)/i, '\1').split("','").map { |v| v.intern }
|
|
65
|
+
ActiveRecord::Type::Enum.new(limit: limit)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
if adapter_class
|
|
74
|
+
adapter_class.prepend(ActiveRecord::Mysql::Enum::MysqlAdapter)
|
|
75
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ConnectionAdapters # :nodoc:
|
|
5
|
+
module Quoting
|
|
6
|
+
alias __quote_enum quote
|
|
7
|
+
|
|
8
|
+
# Quote a symbol as a normal string. This will support quoting of
|
|
9
|
+
# enumerated values.
|
|
10
|
+
if Rails::VERSION::MAJOR < 5
|
|
11
|
+
def quote(value, column = nil)
|
|
12
|
+
if !value.is_a? Symbol
|
|
13
|
+
__quote_enum(value, column)
|
|
14
|
+
else
|
|
15
|
+
ActiveRecord::Base.send(:quote_bound_value, value.to_s)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
else
|
|
19
|
+
def quote(value)
|
|
20
|
+
if !value.is_a? Symbol
|
|
21
|
+
__quote_enum(value)
|
|
22
|
+
else
|
|
23
|
+
ActiveRecord::Base.send(:quote_bound_value, value.to_s)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ConnectionAdapters
|
|
5
|
+
class TableDefinition
|
|
6
|
+
def enum(*args)
|
|
7
|
+
options = args.extract_options!
|
|
8
|
+
column_names = args
|
|
9
|
+
column_names.each { |name| column(name, 'enum', options) }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Validations
|
|
5
|
+
module ClassMethods
|
|
6
|
+
# Automatically validates the column against the schema definition
|
|
7
|
+
# for nullability, format, and enumerations. Handles integers, floats,
|
|
8
|
+
# enumerations, and string limits.
|
|
9
|
+
#
|
|
10
|
+
# Usage: validates_columns :severity, :name
|
|
11
|
+
def validates_columns(*column_names)
|
|
12
|
+
begin
|
|
13
|
+
cols = columns_hash
|
|
14
|
+
column_names.each do |name|
|
|
15
|
+
col = cols[name.to_s]
|
|
16
|
+
raise ArgumentError, "Cannot find column #{name}" unless col
|
|
17
|
+
|
|
18
|
+
# test for nullability
|
|
19
|
+
validates_presence_of(name) if !col.null
|
|
20
|
+
|
|
21
|
+
# Test various known types.
|
|
22
|
+
case col.type
|
|
23
|
+
when :enum
|
|
24
|
+
validates_inclusion_of name, :in => col.limit, :allow_nil => true
|
|
25
|
+
|
|
26
|
+
when :integer, :float
|
|
27
|
+
validates_numericality_of name, :allow_nil => true
|
|
28
|
+
|
|
29
|
+
when :string
|
|
30
|
+
if col.limit
|
|
31
|
+
validates_length_of name, :maximum => col.limit, :allow_nil => true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
rescue ActiveRecord::StatementInvalid=>e
|
|
36
|
+
raise e unless e.message.include?("42S02") # swallow the exception if its for a missing table
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
data/rails/init.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: activerecord-mysql-enum
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0.pre.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Nick Pohodnya
|
|
8
|
+
- Invoca Development
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2020-08-17 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: activerecord
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - ">="
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '4.2'
|
|
21
|
+
- - "<"
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: '6'
|
|
24
|
+
type: :runtime
|
|
25
|
+
prerelease: false
|
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
27
|
+
requirements:
|
|
28
|
+
- - ">="
|
|
29
|
+
- !ruby/object:Gem::Version
|
|
30
|
+
version: '4.2'
|
|
31
|
+
- - "<"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '6'
|
|
34
|
+
description: Enable enum type for the MySQL Adapter in ActiveRecord
|
|
35
|
+
email:
|
|
36
|
+
- development@invoca.com
|
|
37
|
+
executables: []
|
|
38
|
+
extensions: []
|
|
39
|
+
extra_rdoc_files: []
|
|
40
|
+
files:
|
|
41
|
+
- CHANGELOG.md
|
|
42
|
+
- Gemfile
|
|
43
|
+
- Gemfile.lock
|
|
44
|
+
- LICENSE
|
|
45
|
+
- README.md
|
|
46
|
+
- Rakefile
|
|
47
|
+
- enum_column.gemspec
|
|
48
|
+
- init.rb
|
|
49
|
+
- lib/active_record/mysql/enum.rb
|
|
50
|
+
- lib/active_record/mysql/enum/active_record_helper.rb
|
|
51
|
+
- lib/active_record/mysql/enum/enum_adapter.rb
|
|
52
|
+
- lib/active_record/mysql/enum/enum_column_adapter.rb
|
|
53
|
+
- lib/active_record/mysql/enum/enum_type.rb
|
|
54
|
+
- lib/active_record/mysql/enum/mysql_adapter.rb
|
|
55
|
+
- lib/active_record/mysql/enum/quoting.rb
|
|
56
|
+
- lib/active_record/mysql/enum/schema_definitions.rb
|
|
57
|
+
- lib/active_record/mysql/enum/validations.rb
|
|
58
|
+
- lib/active_record/mysql/enum/version.rb
|
|
59
|
+
- rails/init.rb
|
|
60
|
+
homepage: http://github.com/Invoca/activerecord-mysql-enum
|
|
61
|
+
licenses: []
|
|
62
|
+
metadata:
|
|
63
|
+
source_code_uri: https://github.com/Invoca/activerecord-mysql-enum
|
|
64
|
+
allowed_push_host: https://rubygems.org
|
|
65
|
+
post_install_message:
|
|
66
|
+
rdoc_options: []
|
|
67
|
+
require_paths:
|
|
68
|
+
- lib
|
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
|
+
requirements:
|
|
71
|
+
- - ">="
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
version: '0'
|
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
|
+
requirements:
|
|
76
|
+
- - ">"
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: 1.3.1
|
|
79
|
+
requirements: []
|
|
80
|
+
rubyforge_project:
|
|
81
|
+
rubygems_version: 2.6.13
|
|
82
|
+
signing_key:
|
|
83
|
+
specification_version: 4
|
|
84
|
+
summary: Enable enum type for the MySQL Adapter in ActiveRecord
|
|
85
|
+
test_files: []
|