rails_string_enum 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43182f0552462fba5ee90d62eeceb8f684190e0f
4
- data.tar.gz: cd4c5618c68b62407c8d0adc53ac96a689bbd0b1
3
+ metadata.gz: 5a89d7aa241c25ea1f29072f16f75d0fe4a36897
4
+ data.tar.gz: de151b0233565f9d35b2f6794660df13c681a25a
5
5
  SHA512:
6
- metadata.gz: 0a092b9281df9dc19c2ddb62a69c5be38491a109036ff44348972be0415fd4153dc99a60d00d373d36c7138a7a5d77f54de7860c81d831e06ff07cddbfcf3ffe
7
- data.tar.gz: 394a21ebf8889f446d64f26ae2f4a7e9e6ea37598f4c322cc4085e8ea98590c93d6aa1e99f038592a4a8acc04d964e52abecc0dd877a71b823f90489031f5086
6
+ metadata.gz: 9c85604c44e26365ecdf8742fbb68666529cd20c800864f98eeff60e7741e0425fa5747827a811c89747472ae724815df09f174284a864a9025512e8c911c0fe
7
+ data.tar.gz: 542eac4498a6ad9661d996831d295f4736843cbf8c840a0940769fdc1d39d0d9e7720707513be4133b43038f36867fa3713640896764ecc7f4f504e4f0d46c7b
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ## rails_string_enum
2
- support in rails db enums or string (using as flexible enum)
2
+ support in rails native postgresql enums or string (using as flexible enum)
3
3
 
4
4
  This gem inspired rails native enum and https://github.com/zmbacker/enum_help
5
5
  ## Installation
@@ -11,11 +11,7 @@ Add this line to your application's Gemfile:
11
11
 
12
12
  Tested on Rails 4.2, ruby 2.2
13
13
 
14
- #### Broken changes from 0.1 to 0.2
15
- `Product::COLOR::GREEN -> Product::GREEN`
16
14
 
17
- #### Broken changes from 0.2 to 0.3
18
- `added prefix for scopes: Product.red -> Product.only_red or Product.only_reds`
19
15
 
20
16
  #### Native postgresql enum (migrations)
21
17
  ```ruby
@@ -28,18 +24,20 @@ add_enum_value :color, 'black', after: 'red'
28
24
  add_enum_value :color, 'black', before: 'blue'
29
25
  add_enum_value :color, 'black', schema: 'public'
30
26
 
27
+ # add_enum_value cannot run inside a transaction block, using outside change method
28
+
31
29
  drop_enum :color
32
30
  drop_enum :color, schema: 'cmyk'
33
31
 
34
32
  rename_enum_value :color, 'gray', 'black'
35
- reorder_enum_values :order_state_enum, %w(black white) # other color will be latest
33
+ reorder_enum_values :color, %w(black white) # other color will be latest
36
34
 
37
35
  delete_enum_value :color, 'black'
38
36
  # you should delete record with deleting value
39
37
  # if exists index with condition, method raise exception
40
- # "ERROR: operator does not exist: order_type_enum <> order_type_enum_new"
38
+ # "ERROR: operator does not exist: color <> color_new"
41
39
  # you should first remove and then create an index
42
- Product.where(color: 'black').delete_all # or Product.where(color: 'black').update_all(state: nil)
40
+ Product.where(color: 'black').delete_all # or Product.where(color: 'black').update_all(color: nil)
43
41
  remove_index :product, :color, where: "color NOT IN ('pink')"
44
42
  delete_enum_value :color, 'black'
45
43
  add_index :product, :color, where: "color NOT IN ('pink')"
@@ -61,9 +59,9 @@ class CreateTables < ActiveRecord::Migration
61
59
  create_table :products do |t|
62
60
  t.string :color
63
61
  end
64
-
62
+
65
63
  create_enum :enum_color, %w(red green blue)
66
-
64
+
67
65
  create_table :pages do |t|
68
66
  t.column :color, :enum_color, default: 'red'
69
67
  end
@@ -72,7 +70,7 @@ end
72
70
 
73
71
  class Product < ActiveRecord::Base
74
72
  string_enum :color, %w(red green yellow black white), scopes: true # default false
75
-
73
+
76
74
  def self.colored
77
75
  where.not(color: [BLACK, WHITE])
78
76
  end
@@ -101,6 +99,15 @@ Product.only_red # if scopes: true
101
99
  Product.only_reds # if scopes: { pluralize: true }
102
100
  ```
103
101
 
102
+ Using constants to any `Class` or `Module`
103
+ ```ruby
104
+ module ValidateStatesFromApi
105
+
106
+ extend MixinStringEnum
107
+ string_enum :states, %w(accept obtain canceled lost)
108
+
109
+ end
110
+ ```
104
111
 
105
112
  I18n local file example (compatible with https://github.com/zmbacker/enum_help):
106
113
 
@@ -141,4 +148,3 @@ Calculating -------------------------------------
141
148
  rails_string_enum_c 38.159k (± 5.3%) i/s - 192.128k
142
149
  enum_help_c 15.939k (± 4.5%) i/s - 80.272k
143
150
  ```
144
-
@@ -1,20 +1,24 @@
1
1
  require 'rails_string_enum/version'
2
+ require 'rails_string_enum/mixin_string_enum'
2
3
 
3
4
 
4
- require 'rails_string_enum/pg_enum_migration'
5
- require 'active_record/connection_adapters/postgresql_adapter'
6
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :include, PgEnumMigrations
7
-
5
+ if defined? ActiveRecord::Base
6
+ require 'rails_string_enum/active_record_string_enum'
7
+ ActiveRecord::Base.send :extend, ActiveRecordStringEnum
8
+ end
8
9
 
9
- require 'rails_string_enum/string_enum'
10
- ActiveRecord::Base.send :extend, RailsStringEnum
11
10
 
11
+ require 'active_record/connection_adapters/postgresql_adapter'
12
+ if defined? ActiveRecord::ConnectionAdapters::PostgreSQL
13
+ require 'rails_string_enum/pg_enum_migration'
14
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :include, PgEnumMigrations
12
15
 
13
- require 'rails_string_enum/patch_enum_null' if Rails.version <= "4.2.1"
16
+ require 'rails_string_enum/patch_enum_null' if Rails.version <= "4.2.1"
17
+ end
14
18
 
15
19
 
16
20
  begin
17
21
  require 'simple_form'
18
22
  require 'rails_string_enum/simple_form'
19
23
  rescue LoadError
20
- end
24
+ end
@@ -1,4 +1,4 @@
1
- module RailsStringEnum
1
+ module ActiveRecordStringEnum
2
2
 
3
3
  # product.rb
4
4
  # string_enum :color, %w(red green yellow)
@@ -142,4 +142,4 @@ module RailsStringEnum
142
142
  const_set name_s, name_s.split('__').map { |i| const_get(i) }
143
143
  end
144
144
 
145
- end
145
+ end
@@ -0,0 +1,27 @@
1
+ module MixinStringEnum
2
+
3
+ # this is a simplified version ActiveRecordStringEnum, for any Class or Module, support only constants
4
+
5
+ def string_enum(name, enums)
6
+
7
+ const_name_all_values = name.to_s.pluralize.upcase
8
+ const_set const_name_all_values, enums.map(&:to_s)
9
+
10
+ klass = self
11
+ enums.each do |value|
12
+ const_set value.to_s.upcase, value.to_s
13
+ end
14
+
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def const_missing(name)
21
+ name_s = name.to_s
22
+ return super unless name_s.include?('__')
23
+
24
+ const_set name_s, name_s.split('__').map { |i| const_get(i) }
25
+ end
26
+
27
+ end
@@ -2,7 +2,7 @@ module PgEnumMigrations
2
2
 
3
3
  # create_enum :color, %w(red green blue) # default schema is 'public'
4
4
  # create_enum :color, %w(red green blue), schema: 'cmyk'
5
- def create_enum(enum_name, values, schema: nil)
5
+ def create_enum(enum_name, values, schema: 'public')
6
6
  execute "CREATE TYPE #{enum_name(enum_name, schema)} AS ENUM (#{escape_enum_values(values)})"
7
7
  end
8
8
 
@@ -11,12 +11,13 @@ module PgEnumMigrations
11
11
  # add_enum_value :color, 'purple', after: 'red'
12
12
  # add_enum_value :color, 'pink', before: 'purple'
13
13
  # add_enum_value :color, 'white', schema: 'public'
14
- def add_enum_value(enum_name, value, before: nil, after: nil, schema: nil)
14
+ # **WARN** cannot run inside a transaction block
15
+ def add_enum_value(enum_name, value, before: nil, after: nil, schema: 'public')
15
16
  opts = if before then "BEFORE #{escape_enum_value(before)}"
16
17
  elsif after then "AFTER #{escape_enum_value(after)}"
17
18
  else ''
18
19
  end
19
- execute "ALTER TYPE #{enum_name(enum_name, schema)} ADD VALUE #{escape_enum_value(value)} #{opts}"
20
+ execute "ALTER TYPE #{enum_name(enum_name, schema)} ADD VALUE IF NOT EXISTS #{escape_enum_value(value)} #{opts}"
20
21
  end
21
22
 
22
23
  # drop_enum :color
@@ -27,15 +28,15 @@ module PgEnumMigrations
27
28
 
28
29
 
29
30
  # you should delete record with deleting value
30
- # Order.back_picking.delete_all or Order.back_picking.update_all(state: nil)
31
+ # Product.only_purple.delete_all or Product.purple.update_all(color: nil)
31
32
  #
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
33
+ # if exists index with condition - add_index :products, :color, where: "color NOT IN ('white', 'black')"
34
+ # this method show exeption ERROR: operator does not exist: color <> color_new
34
35
  # you must first remove and then create an index
35
36
  #
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")
37
+ # delete_enum_value :color, 'black'
38
+ def delete_enum_value(enum_name, value_name, scheme: 'public')
39
+ old_values = select_values("SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid = '#{scheme}.#{enum_name}'::regtype::oid")
39
40
  new_values = old_values - Array(value_name)
40
41
 
41
42
  execute <<-SQL
@@ -43,8 +44,11 @@ module PgEnumMigrations
43
44
  CREATE TYPE #{enum_name} AS enum (#{escape_enum_values(new_values)});
44
45
  SQL
45
46
 
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|
47
+ cols_using_enum = select_rows("SELECT table_name, column_name, column_default FROM information_schema.columns WHERE udt_name = '#{enum_name}_old'")
48
+ cols_using_enum.each do |table_name, column_name, column_default|
49
+ unless column_default.nil?
50
+ raise "column #{table_name}.#{column_name} has default value #{column_default}, you must manually drop default"
51
+ end
48
52
  execute <<-SQL
49
53
  ALTER TABLE #{table_name}
50
54
  ALTER COLUMN #{column_name} TYPE #{enum_name} USING #{column_name}::text::#{enum_name};
@@ -58,7 +62,7 @@ module PgEnumMigrations
58
62
 
59
63
 
60
64
 
61
- # rename_enum_value :order_state_enum, 'accept', 'init'
65
+ # rename_enum_value :color, 'white', 'pale'
62
66
  def rename_enum_value(enum_name, old_value_name, new_value_name, scheme: 'public')
63
67
  execute <<-SQL
64
68
  UPDATE pg_catalog.pg_enum
@@ -69,8 +73,8 @@ module PgEnumMigrations
69
73
 
70
74
 
71
75
 
72
- # reorder_enum_values :order_state_enum, %w(lost returning obtain accept)
73
- def reorder_enum_values(enum_name, ordered_values, scheme: nil)
76
+ # reorder_enum_values :color, %w(green pale red blue)
77
+ def reorder_enum_values(enum_name, ordered_values, scheme: 'public')
74
78
  all_values = select_values("SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid = '#{scheme}.#{enum_name}'::regtype::oid")
75
79
  max_order = select_value("SELECT max(enumsortorder) FROM pg_catalog.pg_enum WHERE enumtypid = '#{scheme}.#{enum_name}'::regtype::oid").to_i + 1
76
80
 
@@ -79,7 +83,7 @@ module PgEnumMigrations
79
83
  execute <<-SQL
80
84
  UPDATE pg_catalog.pg_enum
81
85
  SET enumsortorder = CASE enumlabel #{ordered_sql} END
82
- WHERE enumtypid = #{enum_name_as_srt(enum_name, scheme)}::regtype::oid
86
+ WHERE enumtypid = '#{scheme}.#{enum_name}'::regtype::oid
83
87
  SQL
84
88
  end
85
89
 
@@ -110,12 +114,6 @@ module PgEnumMigrations
110
114
  }.join('.')
111
115
  end
112
116
 
113
- def enum_name_as_srt(name, schema)
114
- [schema || 'public', name].map { |s|
115
- %Q{'#{s}'}
116
- }.join('.')
117
- end
118
-
119
117
  def escape_enum_value(value)
120
118
  escaped_value = value.to_s.sub("'", "''")
121
119
  "'#{escaped_value}'"
@@ -140,4 +138,4 @@ module PgEnumMigrations
140
138
  SQL
141
139
  end
142
140
 
143
- end
141
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsStringEnum
2
- VERSION = "0.4.1"
3
- end
2
+ VERSION = "0.5.0"
3
+ end
@@ -20,9 +20,6 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
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
23
 
27
24
  spec.required_ruby_version = '~> 2.0'
28
- end
25
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_string_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ermolaev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-02 00:00:00.000000000 Z
11
+ date: 2016-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,34 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
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
27
  description: migration methods for postgresql enum, internationalization, simple_form
56
28
  email:
57
29
  - andrey@ermolaev.me
@@ -65,10 +37,11 @@ files:
65
37
  - README.md
66
38
  - Rakefile
67
39
  - lib/rails_string_enum.rb
40
+ - lib/rails_string_enum/active_record_string_enum.rb
41
+ - lib/rails_string_enum/mixin_string_enum.rb
68
42
  - lib/rails_string_enum/patch_enum_null.rb
69
43
  - lib/rails_string_enum/pg_enum_migration.rb
70
44
  - lib/rails_string_enum/simple_form.rb
71
- - lib/rails_string_enum/string_enum.rb
72
45
  - lib/rails_string_enum/version.rb
73
46
  - rails_string_enum.gemspec
74
47
  homepage: https://github.com/ermolaev/rails_string_enum
@@ -91,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
64
  version: '0'
92
65
  requirements: []
93
66
  rubyforge_project:
94
- rubygems_version: 2.4.7
67
+ rubygems_version: 2.4.8
95
68
  signing_key:
96
69
  specification_version: 4
97
70
  summary: support in rails db enums or string (using as flexible enum)