rails_string_enum 0.4.1 → 0.5.0

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 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)