rails_string_enum 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3b9e6d5bf513ef92f4a9811d1b7156db72a41a92
4
+ data.tar.gz: 5b72388e7ee40dc6bae33b4932c3fd43d5a3c203
5
+ SHA512:
6
+ metadata.gz: b08ec344d78a24b071d4b597313e0f683f8d416e031cb9f8dee6ee8d3f3be87ee17c7043b1ccd3c7152d02675c98b22bb1733f3538afbb55c70b5d4134b34d8b
7
+ data.tar.gz: 1ffb81727cdf171425a883e2f123e3c95d7622d58ae7519dcf856f2616e38e2db38f8b1e91f9409fd62b886e673759a05ee2da7f9865748e701c51de1f421513
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /.idea/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails_string_enum.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Ermolaev Andrey
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,133 @@
1
+ ## rails_string_enum
2
+ support in rails db enums or string (using as flexible enum)
3
+
4
+ This gem inspired rails native enum and https://github.com/zmbacker/enum_help
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rails_string_enum'
10
+
11
+
12
+ Tested on Rails 4.2, ruby 2.2
13
+
14
+ #### Native postgresql enum (migrations)
15
+ ```ruby
16
+
17
+ create_enum :color, %w(red green blue) # default schema is 'public'
18
+ create_enum :color, %w(red green blue), schema: 'cmyk'
19
+
20
+ add_enum_value :color, 'black'
21
+ add_enum_value :color, 'black', after: 'red'
22
+ add_enum_value :color, 'black', before: 'blue'
23
+ add_enum_value :color, 'black', schema: 'public'
24
+
25
+ drop_enum :color
26
+ drop_enum :color, schema: 'cmyk'
27
+
28
+ rename_enum_value :color, 'gray', 'black'
29
+ reorder_enum_values :order_state_enum, %w(black white) # other color will be latest
30
+
31
+ delete_enum_value :color, 'black'
32
+ # you should delete record with deleting value
33
+ # if exists index with condition method raise exeption
34
+ # "ERROR: operator does not exist: order_type_enum <> order_type_enum_new"
35
+ # you should first remove and then create an index
36
+ Product.where(color: 'black').delete_all # or Product.where(color: 'black').update_all(state: nil)
37
+ remove_index :product, :color, where: "color NOT IN ('pink')"
38
+ delete_enum_value :color, 'black'
39
+ add_index :product, :color, where: "color NOT IN ('pink')"
40
+ ```
41
+
42
+ ###### Convert exist columns (int, string) to postgresql enum
43
+ ```ruby
44
+ string_to_enums :product, :color, enum_name: 'product_color_enum', definitions: %w(red green blue)
45
+ string_to_enums :product, :color, enum_name: 'product_color_enum', definitions: Product.uniq.pluck(:color)
46
+
47
+ int_to_enums :product, :color, enum_name: 'product_color_enum', definitions: { red: 0, green: 1, blue: 2 }
48
+ ```
49
+
50
+
51
+ #### Usage
52
+ ```ruby
53
+ class CreateTables < ActiveRecord::Migration
54
+ def change
55
+ create_table :products do |t|
56
+ t.string :color
57
+ end
58
+
59
+ create_enum :enum_color, %w(red green blue)
60
+
61
+ create_table :pages do |t|
62
+ t.column :color, :enum_color, default: 'red'
63
+ end
64
+ end
65
+ end
66
+
67
+ class Product < ActiveRecord::Base
68
+ string_enum :color, %w(red green yellow black white), scope: true # default false
69
+
70
+ def self.colored
71
+ where.not(color: [COLOR::BLACK, COLOR::WHITE])
72
+ end
73
+ end
74
+
75
+ class Page < ActiveRecord::Base
76
+ string_enum :background, %w(red green), i18n_scope: 'product.color'
77
+ end
78
+
79
+ Product::COLORS # => ["red", "green", "yellow"]
80
+ Product::COLOR::RED # => "red"
81
+ Product::COLOR::GREEN # => "green"
82
+
83
+ @product = Product.new
84
+ @product.color_i18n # => nil
85
+ @product.red!
86
+ @product.color_i18n # => 'Красный'
87
+
88
+ Product.color_i18n_for('red') # => 'Красный'
89
+ Product.colors_i18n # => {green: 'Зеленый', red: 'Красный', yellow: 'Желтый'}
90
+ Product.red # if scope: true
91
+ ```
92
+
93
+
94
+ I18n local file example (compatible with https://github.com/zmbacker/enum_help):
95
+
96
+ ```yaml
97
+ # config/locals/ru.yml
98
+ ru:
99
+ enums:
100
+ product:
101
+ color:
102
+ red: Красный
103
+ green: Зеленый
104
+ yellow: Желтый
105
+ ```
106
+
107
+ Support `simple_form`:
108
+ ```erb
109
+ <%= f.input :color %>
110
+ ```
111
+
112
+ #### Benchmark i18n methods (rails_string_enum faster 2x then enum_help)
113
+
114
+ ```ruby
115
+ Benchmark.ips do |x|
116
+ x.report('rails_string_enum') { u.social_app_i18n }
117
+ x.report('enum_help') { u.social_app_i18n_eh }
118
+ x.report('rails_string_enum_c') { Order.states_i18n }
119
+ x.report('enum_help_c') { Order.states_i18n_eh }
120
+ end
121
+
122
+ Calculating -------------------------------------
123
+ rails_string_enum 3.149k i/100ms
124
+ enum_help 1.489k i/100ms
125
+ rails_string_enum_c 3.002k i/100ms
126
+ enum_help_c 1.384k i/100ms
127
+ -------------------------------------------------
128
+ rails_string_enum 42.727k (± 4.4%) i/s - 214.132k
129
+ enum_help 16.686k (±11.9%) i/s - 81.895k
130
+ rails_string_enum_c 38.159k (± 5.3%) i/s - 192.128k
131
+ enum_help_c 15.939k (± 4.5%) i/s - 80.272k
132
+ ```
133
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,17 @@
1
+ require 'active_record/connection_adapters/postgresql/oid/enum'
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module PostgreSQL
6
+ module OID # :nodoc:
7
+ class Enum < Type::Value # :nodoc:
8
+ def type_cast(value)
9
+ unless value.nil?
10
+ value.to_s
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,143 @@
1
+ module PgEnumMigrations
2
+
3
+ # create_enum :color, %w(red green blue) # default schema is 'public'
4
+ # create_enum :color, %w(red green blue), schema: 'cmyk'
5
+ def create_enum(enum_name, values, schema: nil)
6
+ execute "CREATE TYPE #{enum_name(enum_name, schema)} AS ENUM (#{escape_enum_values(values)})"
7
+ end
8
+
9
+
10
+ # add_enum_value :color, 'black'
11
+ # add_enum_value :color, 'purple', after: 'red'
12
+ # add_enum_value :color, 'pink', before: 'purple'
13
+ # add_enum_value :color, 'white', schema: 'public'
14
+ def add_enum_value(enum_name, value, before: nil, after: nil, schema: nil)
15
+ opts = if before then "BEFORE #{escape_enum_value(before)}"
16
+ elsif after then "AFTER #{escape_enum_value(after)}"
17
+ else ''
18
+ end
19
+ execute "ALTER TYPE #{enum_name(enum_name, schema)} ADD VALUE #{escape_enum_value(value)} #{opts}"
20
+ end
21
+
22
+ # drop_enum :color
23
+ # drop_enum :color, schema: 'cmyk'
24
+ def drop_enum(enum_name, schema: nil)
25
+ execute "DROP TYPE #{enum_name(enum_name, schema)}"
26
+ end
27
+
28
+
29
+ # you should delete record with deleting value
30
+ # Order.back_picking.delete_all or Order.back_picking.update_all(state: nil)
31
+ #
32
+ # if exists index with condition - add_index :orders, :state, where: "state NOT IN ('closed', 'canceled', 'returned')"
33
+ # this method show exeption ERROR: operator does not exist: order_type_enum <> order_type_enum_new
34
+ # you must first remove and then create an index
35
+ #
36
+ # delete_enum_value :order_state_enum, 'back_picking'
37
+ def delete_enum_value(enum_name, value_name, scheme: nil)
38
+ old_values = select_values("SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid = #{enum_name_as_srt(enum_name, scheme)}::regtype::oid")
39
+ new_values = old_values - Array(value_name)
40
+
41
+ execute <<-SQL
42
+ ALTER TYPE #{enum_name} rename to #{enum_name}_old;
43
+ CREATE TYPE #{enum_name} AS enum (#{escape_enum_values(new_values)});
44
+ SQL
45
+
46
+ cols_using_enum = select_rows("SELECT table_name, column_name FROM information_schema.columns WHERE udt_name = '#{enum_name}_old'")
47
+ cols_using_enum.each do |table_name, column_name|
48
+ execute <<-SQL
49
+ ALTER TABLE #{table_name}
50
+ ALTER COLUMN #{column_name} TYPE #{enum_name} USING #{column_name}::text::#{enum_name};
51
+ SQL
52
+ end
53
+
54
+ execute <<-SQL
55
+ DROP TYPE #{enum_name}_old
56
+ SQL
57
+ end
58
+
59
+
60
+
61
+ # rename_enum_value :order_state_enum, 'accept', 'init'
62
+ def rename_enum_value(enum_name, old_value_name, new_value_name, scheme: nil)
63
+ execute <<-SQL
64
+ UPDATE pg_catalog.pg_enum
65
+ SET enumlabel = '#{new_value_name}'
66
+ WHERE enumtypid = #{enum_name_as_srt(enum_name, scheme)}::regtype::oid AND enumlabel = '#{old_value_name}'
67
+ SQL
68
+ end
69
+
70
+
71
+
72
+ # reorder_enum_values :order_state_enum, %w(lost returning obtain accept)
73
+ def reorder_enum_values(enum_name, ordered_values, scheme: nil)
74
+ all_values = select_values("SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid = '#{scheme}.#{enum_name}'::regtype::oid")
75
+ max_order = select_value("SELECT max(enumsortorder) FROM pg_catalog.pg_enum WHERE enumtypid = '#{scheme}.#{enum_name}'::regtype::oid").to_i + 1
76
+
77
+ ordered_sql = (ordered_values | all_values).map.with_index{|v, i| "WHEN '#{v}' THEN #{i + max_order}"}.join(' ')
78
+
79
+ execute <<-SQL
80
+ UPDATE pg_catalog.pg_enum
81
+ SET enumsortorder = CASE enumlabel #{ordered_sql} END
82
+ WHERE enumtypid = #{enum_name_as_srt(enum_name, scheme)}::regtype::oid
83
+ SQL
84
+ end
85
+
86
+
87
+
88
+ # string_to_enums :order, :state, enum_name: 'order_state_enum', definitions: %w(accept confirmed)
89
+ def string_to_enums(table, col_name, enum_name:, definitions: nil, default: nil, use_exist_enum: false)
90
+ convert_to_enum table, col_name, enum_name, definitions, col_name, default, use_exist_enum
91
+ end
92
+
93
+
94
+
95
+ # int_to_enums :users, :partner_type, enum_name: 'user_partner_type_enum', definitions: { retail: 0, affiliate: 1, wholesale: 2 }
96
+ def int_to_enums(table, col_name, enum_name:, definitions: nil, default: nil, use_exist_enum: false)
97
+ convert_sql = definitions.map {|str, int| "WHEN #{int} THEN '#{str}'" }.join(' ')
98
+ convert_sql = "CASE #{col_name} #{convert_sql} END"
99
+
100
+ convert_to_enum table, col_name, enum_name, definitions.keys, convert_sql, default, use_exist_enum
101
+ end
102
+
103
+
104
+
105
+ private
106
+
107
+ def enum_name(name, schema)
108
+ [schema || 'public', name].map { |s|
109
+ %Q{"#{s}"}
110
+ }.join('.')
111
+ end
112
+
113
+ def enum_name_as_srt(name, schema)
114
+ [schema || 'public', name].map { |s|
115
+ %Q{'#{s}'}
116
+ }.join('.')
117
+ end
118
+
119
+ def escape_enum_value(value)
120
+ escaped_value = value.to_s.sub("'", "''")
121
+ "'#{escaped_value}'"
122
+ end
123
+
124
+ def escape_enum_values(values)
125
+ values.map { |value| escape_enum_value(value) }.join(',')
126
+ end
127
+
128
+ def convert_to_enum(table, col_name, enum_name, keys, convert_sql, default, use_exist_enum)
129
+ schema = select_value("SELECT table_schema FROM information_schema.columns WHERE table_name = '#{table}'")
130
+
131
+ execute "CREATE TYPE #{enum_name(enum_name, schema)} AS ENUM (#{escape_enum_values(keys)})" unless use_exist_enum
132
+
133
+ default_sql = ", ALTER COLUMN #{col_name} DROP DEFAULT" if default
134
+
135
+ execute <<-SQL
136
+ ALTER TABLE #{table}
137
+ ALTER COLUMN #{col_name} DROP DEFAULT,
138
+ ALTER COLUMN #{col_name} TYPE #{enum_name} USING #{convert_sql}::#{enum_name}
139
+ #{default_sql};
140
+ SQL
141
+ end
142
+
143
+ end
@@ -0,0 +1,69 @@
1
+ require 'simple_form'
2
+
3
+ module EnumHelp
4
+ module SimpleForm
5
+ module BuilderExtension
6
+
7
+ def default_input_type_with_enum(*args, &block)
8
+ attr_name = (args.first || @attribute_name).to_s
9
+ options = args.last
10
+
11
+ const_for_attr = object.respond_to? "#{attr_name}_i18n"
12
+
13
+ return :enum_radio_buttons if options.is_a?(Hash) && options[:as] == :radio_buttons && const_for_attr
14
+ return :enum if (options.is_a?(Hash) ? options[:as] : @options[:as]).nil? && const_for_attr
15
+
16
+ default_input_type_without_enum(*args, &block)
17
+ end
18
+ end
19
+
20
+ module InputExtension
21
+
22
+ def initialize(*args)
23
+ super
24
+ enum = input_options[:collection] || @builder.options[:collection]
25
+ raise "Attribute '#{attribute_name}' has no enum class" unless enum ||= object.class.const_get(attribute_name.to_s.pluralize.upcase)
26
+
27
+ collect = begin
28
+ collection = object.class.send("#{attribute_name.to_s.pluralize}_i18n")
29
+ collection.slice!(*enum) if enum
30
+ collection.invert.to_a
31
+ end
32
+
33
+ # collect.unshift [args.last[:prompt],''] if args.last.is_a?(Hash) && args.last[:prompt]
34
+
35
+ if respond_to?(:input_options)
36
+ input_options[:collection] = collect
37
+ else
38
+ @builder.options[:collection] = collect
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
46
+
47
+
48
+ class EnumHelp::SimpleForm::EnumInput < ::SimpleForm::Inputs::CollectionSelectInput
49
+ include EnumHelp::SimpleForm::InputExtension
50
+ def input_html_classes
51
+ super.push('form-control')
52
+ end
53
+ end
54
+
55
+
56
+ class EnumHelp::SimpleForm::EnumRadioButtons < ::SimpleForm::Inputs::CollectionRadioButtonsInput
57
+ include EnumHelp::SimpleForm::InputExtension
58
+ end
59
+
60
+
61
+ SimpleForm::FormBuilder.class_eval do
62
+ include EnumHelp::SimpleForm::BuilderExtension
63
+
64
+ map_type :enum, :to => EnumHelp::SimpleForm::EnumInput
65
+ map_type :enum_radio_buttons, :to => EnumHelp::SimpleForm::EnumRadioButtons
66
+ alias_method :collection_enum_radio_buttons, :collection_radio_buttons
67
+ alias_method :collection_enum, :collection_select
68
+ alias_method_chain :default_input_type, :enum
69
+ end
@@ -0,0 +1,131 @@
1
+ module RailsStringEnum
2
+
3
+ # product.rb
4
+ # string_enum :color, %w(red green yellow)
5
+ # page.rb
6
+ # string_enum :background, %w(red green), i18n_scope: 'product.color'
7
+
8
+ def string_enum(name, enums, scopes: false, i18n_scope: nil)
9
+ # create constant with all values
10
+ # Product::COLORS # => ["red", "green", "yellow"]
11
+ const_name_all_values = name.to_s.pluralize.upcase
12
+ const_set const_name_all_values, enums.map(&:to_s)
13
+
14
+ # create constant for each value
15
+ # Product::COLOR::RED # => "red"
16
+ # Product::COLOR::GREEN #=> "green"
17
+ new_module = const_set name.to_s.upcase, Module.new
18
+ enums.each { |const| new_module.const_set(const.to_s.upcase, const.to_s) }
19
+
20
+
21
+ klass = self
22
+ enums.each do |value|
23
+ # def red?() color == 'red' end
24
+ klass.send(:detect_enum_conflict!, name, "#{value}?")
25
+ define_method("#{value}?") { self[name] == value }
26
+
27
+ # def red!() update! color: :red end
28
+ klass.send(:detect_enum_conflict!, name, "#{value}!")
29
+ define_method("#{value}!") { update! name => value }
30
+
31
+ if scopes
32
+ # scope :red, -> { where color: 'red' }
33
+ klass.send(:detect_enum_conflict!, name, value, true)
34
+ klass.scope value, -> { klass.where name => value }
35
+ end
36
+ end
37
+
38
+ define_attr_i18n_method(self, name, i18n_scope)
39
+ define_collection_i18n_method(self, name, i18n_scope)
40
+ define_collection_i18n_method_for_value(self, name, i18n_scope)
41
+ end
42
+
43
+
44
+ private
45
+
46
+ ENUM_CONFLICT_MESSAGE = \
47
+ "You tried to define an enum named \"%{enum}\" on the model \"%{klass}\", but " \
48
+ "this will generate a %{type} method \"%{method}\", which is already defined " \
49
+ "by %{source}."
50
+
51
+ def detect_enum_conflict!(enum_name, method_name, klass_method = false)
52
+ if klass_method && dangerous_class_method?(method_name)
53
+ raise ArgumentError, ENUM_CONFLICT_MESSAGE % {
54
+ enum: enum_name,
55
+ klass: self.name,
56
+ type: 'class',
57
+ method: method_name,
58
+ source: 'Active Record'
59
+ }
60
+ elsif !klass_method && dangerous_attribute_method?(method_name)
61
+ raise ArgumentError, ENUM_CONFLICT_MESSAGE % {
62
+ enum: enum_name,
63
+ klass: self.name,
64
+ type: 'instance',
65
+ method: method_name,
66
+ source: 'Active Record'
67
+ }
68
+ elsif !klass_method && method_defined_within?(method_name, _enum_methods_module, Module)
69
+ raise ArgumentError, ENUM_CONFLICT_MESSAGE % {
70
+ enum: enum_name,
71
+ klass: self.name,
72
+ type: 'instance',
73
+ method: method_name,
74
+ source: 'another enum'
75
+ }
76
+ end
77
+ end
78
+
79
+
80
+ # @product.color_i18n => 'Красный'
81
+ def define_attr_i18n_method(klass, attr_name, i18n_scope)
82
+ attr_i18n_method_name = "#{attr_name}_i18n"
83
+
84
+ klass.class_eval <<-METHOD, __FILE__, __LINE__
85
+ def #{attr_i18n_method_name}
86
+ if enum_label = self.send(:#{attr_name})
87
+ #{ruby_string_for_enum_label(klass, attr_name, i18n_scope)}
88
+ else
89
+ nil
90
+ end
91
+ end
92
+
93
+ def #{attr_i18n_method_name}_for
94
+ #{ruby_string_for_enum_label(klass, attr_name, i18n_scope)}
95
+ end
96
+ METHOD
97
+ end
98
+
99
+ # Product.color_i18n_for('red') => 'Красный'
100
+ def define_collection_i18n_method_for_value(klass, attr_name, i18n_scope)
101
+ attr_i18n_method_name = "#{attr_name}_i18n"
102
+
103
+ klass.class_eval <<-METHOD, __FILE__, __LINE__
104
+ def #{attr_i18n_method_name}_for
105
+ #{ruby_string_for_enum_label(klass, attr_name, i18n_scope)}
106
+ end
107
+ METHOD
108
+ end
109
+
110
+ # Product.colors_i18n => {green: 'Зеленый', red: 'Красный', yellow: 'Желтый'}
111
+ def define_collection_i18n_method(klass, attr_name, i18n_scope)
112
+ collection_method_name = "#{attr_name.to_s.pluralize}_i18n"
113
+ collection_const_name = "#{attr_name.to_s.pluralize.upcase}"
114
+
115
+ klass.instance_eval <<-METHOD, __FILE__, __LINE__
116
+ def #{collection_method_name}
117
+ h = HashWithIndifferentAccess.new
118
+ self::#{collection_const_name}.each do |enum_label|
119
+ h[enum_label] = #{ruby_string_for_enum_label(klass, attr_name, i18n_scope)}
120
+ end
121
+ h
122
+ end
123
+ METHOD
124
+ end
125
+
126
+ def ruby_string_for_enum_label(klass, attr_name, i18n_scope)
127
+ part_scope = i18n_scope || "#{klass.base_class.to_s.underscore}.#{attr_name}"
128
+ %Q{::I18n.t(enum_label, scope: "enums.#{part_scope}", default: enum_label)}
129
+ end
130
+
131
+ end
@@ -0,0 +1,3 @@
1
+ module RailsStringEnum
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,20 @@
1
+ require 'rails_string_enum/version'
2
+
3
+
4
+ require 'rails_string_enum/pg_enum_migration'
5
+ require 'active_record/connection_adapters/postgresql_adapter'
6
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :include, PgEnumMigrations
7
+
8
+
9
+ require 'rails_string_enum/string_enum'
10
+ ActiveRecord::Base.send :extend, RailsStringEnum
11
+
12
+
13
+ require 'rails_string_enum/patch_enum_null' if Rails.version <= "4.2.1"
14
+
15
+
16
+ begin
17
+ require 'simple_form'
18
+ require 'rails_string_enum/simple_form'
19
+ rescue
20
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rails_string_enum/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rails_string_enum"
8
+ spec.version = RailsStringEnum::VERSION
9
+ spec.authors = ["Ermolaev Andrey"]
10
+ spec.email = ["andrey@ermolaev.me"]
11
+
12
+ spec.summary = %q{support in rails db enums or string (using as flexible enum)}
13
+ spec.description = %q{migration methods for postgresql, internationalization, simple_form}
14
+ spec.homepage = 'https://github.com/ermolaev/rails_string_enum'
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.9"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+
25
+ spec.add_dependency "activerecord", "~> 4.2"
26
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_string_enum
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ermolaev Andrey
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-05-07 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.9'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.2'
55
+ description: migration methods for postgresql, internationalization, simple_form
56
+ email:
57
+ - andrey@ermolaev.me
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - lib/rails_string_enum.rb
68
+ - lib/rails_string_enum/patch_enum_null.rb
69
+ - lib/rails_string_enum/pg_enum_migration.rb
70
+ - lib/rails_string_enum/simple_form.rb
71
+ - lib/rails_string_enum/string_enum.rb
72
+ - lib/rails_string_enum/version.rb
73
+ - rails_string_enum.gemspec
74
+ homepage: https://github.com/ermolaev/rails_string_enum
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.4.5
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: support in rails db enums or string (using as flexible enum)
98
+ test_files: []