activerecord-postgres_enum 0.6.0 → 1.4.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
  SHA256:
3
- metadata.gz: 2e43929712c3569c4b839d4c3464681e4841faf269e669ecb87ce36866b079ac
4
- data.tar.gz: 25a312a9bab4f9af1c69b5e4ae39826053da9e0757be8cab4dbb96ce3549288a
3
+ metadata.gz: 27d16c338c8dcb14b9746be0e941981230c9a7eee7e4704755da15ed9869025a
4
+ data.tar.gz: 5077374a8566971f0236c67e4d52ae0467659f5fe14d384ec331bb58bbfb2df3
5
5
  SHA512:
6
- metadata.gz: af99b8890d255f425db4ad5b013c10ec88dac286b56286cd08a78ef519935032bf6b0ed53b65402e1cdc3fbaf7df73094f0febfca08d189a26ec6919b3ff9d78
7
- data.tar.gz: 066a1f40435ea2e4ecde9384bb6ef21cdf5e4175bc2fbe4f2a0b221f26a4a598b2cc7c9e2c7c1d2bce532263a9d39c9c5c7bf9564627450d65b6a5d20db4917a
6
+ metadata.gz: a58d412d08199ef784ec320d8534c39b58d150c7bc423aa493ac50602edbb9bd20e6cd176e989ec6629659ceb53117576ae98fb27ba0be9186d5c6bda6d11527
7
+ data.tar.gz: 39a6e9e9bb211cc7c3931f13459b83bf747398d0b0b94df3da0f9471565931b553beedb08b9e645c13654c5e1231f6c99b37c303133a454b80a5ce10c3e8b8ea
data/README.md CHANGED
@@ -56,12 +56,33 @@ To add a value into existing enum:
56
56
  add_enum_value :mood, "pensive"
57
57
  ```
58
58
 
59
+ To remove a value from existing enum:
60
+
61
+ > :warning: Make sure that value is not used anywhere in the database.
62
+
63
+ ```ruby
64
+ remove_enum_value :mood, "pensive"
65
+ ```
66
+
67
+ To add a new enum column to an existing table:
68
+
69
+ ```ruby
70
+ def change
71
+ create_enum :product_type, %w[one-off subscription]
72
+
73
+ add_column :products, :type, :product_type
74
+ end
75
+ ```
76
+
59
77
  To rename a value:
60
78
 
61
79
  ```ruby
62
80
  rename_enum_value :mood, "pensive", "wistful"
63
81
  ```
64
82
 
83
+ **NB:** To stop Postgres complaining about adding enum values inside a transaction, use [`disable_ddl_transaction!`](https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-c-disable_ddl_transaction-21) in your migration.
84
+
85
+
65
86
  ## Development
66
87
 
67
88
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -7,9 +7,9 @@ module ActiveRecord
7
7
  class Enum < Type::Value # :nodoc:
8
8
  attr_reader :enum_name
9
9
 
10
- def initialize(options = {})
11
- @enum_name = options.delete(:enum_name).to_sym
12
- super
10
+ def initialize(enum_name:, **kwargs)
11
+ @enum_name = enum_name.to_sym
12
+ super(**kwargs)
13
13
  end
14
14
  end
15
15
 
@@ -42,21 +42,31 @@ module ActiveRecord
42
42
  end
43
43
  end
44
44
 
45
- def create_enum(name, values)
45
+ def create_enum(name, values, force: false, if_not_exists: nil)
46
+ return if if_not_exists && enums.include?(name.to_sym)
47
+
48
+ drop_enum(name, cascade: force == :cascade, if_exists: true) if force
49
+
46
50
  values = values.map { |v| quote v }
47
51
  execute "CREATE TYPE #{name} AS ENUM (#{values.join(', ')})"
48
52
  end
49
53
 
50
- def drop_enum(name)
51
- execute "DROP TYPE #{name}"
54
+ def drop_enum(name, cascade: nil, if_exists: nil)
55
+ if_exists_statement = 'IF EXISTS' if if_exists
56
+ cascade_statement = 'CASCADE' if cascade
57
+
58
+ sql = "DROP TYPE #{if_exists_statement} #{name} #{cascade_statement}"
59
+ execute sql
52
60
  end
53
61
 
54
62
  def rename_enum(name, new_name)
55
63
  execute "ALTER TYPE #{name} RENAME TO #{new_name}"
56
64
  end
57
65
 
58
- def add_enum_value(name, value, after: nil, before: nil)
59
- sql = "ALTER TYPE #{name} ADD VALUE #{quote value}"
66
+ def add_enum_value(name, value, after: nil, before: nil, if_not_exists: nil)
67
+ if_not_exists_statement = 'IF NOT EXISTS' if if_not_exists
68
+
69
+ sql = "ALTER TYPE #{name} ADD VALUE #{if_not_exists_statement} #{quote value}"
60
70
  if after
61
71
  sql += " AFTER #{quote after}"
62
72
  elsif before
@@ -65,6 +75,15 @@ module ActiveRecord
65
75
  execute sql
66
76
  end
67
77
 
78
+ def remove_enum_value(name, value)
79
+ sql = %{
80
+ DELETE FROM pg_enum
81
+ WHERE enumlabel=#{quote value}
82
+ AND enumtypid=(SELECT oid FROM pg_type WHERE typname='#{name}')
83
+ }
84
+ execute sql
85
+ end
86
+
68
87
  def rename_enum_value(name, existing_value, new_value)
69
88
  raise "Renaming enum values is only supported in PostgreSQL 10.0+" unless rename_enum_value_supported?
70
89
 
@@ -17,10 +17,10 @@ module ActiveRecord
17
17
 
18
18
  @connection.enums.each do |name, values|
19
19
  values = values.map { |v| " #{v.inspect}," }.join("\n")
20
- statements << " create_enum #{name.inspect}, [\n#{values}\n ]"
20
+ statements << " create_enum #{name.inspect}, [\n#{values}\n ], force: :cascade"
21
21
  end
22
22
 
23
- stream.puts statements.join("\n")
23
+ stream.puts statements.join("\n\n")
24
24
  stream.puts
25
25
  end
26
26
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ActiveRecord
4
4
  module PostgresEnum
5
- VERSION = "0.6.0"
5
+ VERSION = "1.4.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-postgres_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Merkushin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-14 00:00:00.000000000 Z
11
+ date: 2020-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0
19
+ version: '5'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.1'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: 4.2.0
29
+ version: '5'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.1'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: pg
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +106,14 @@ dependencies:
100
106
  requirements:
101
107
  - - "~>"
102
108
  - !ruby/object:Gem::Version
103
- version: '12.3'
109
+ version: '13.0'
104
110
  type: :development
105
111
  prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
114
  - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: '12.3'
116
+ version: '13.0'
111
117
  - !ruby/object:Gem::Dependency
112
118
  name: rspec-rails
113
119
  requirement: !ruby/object:Gem::Requirement
@@ -166,15 +172,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
172
  requirements:
167
173
  - - ">="
168
174
  - !ruby/object:Gem::Version
169
- version: '0'
175
+ version: '2.5'
170
176
  required_rubygems_version: !ruby/object:Gem::Requirement
171
177
  requirements:
172
178
  - - ">="
173
179
  - !ruby/object:Gem::Version
174
180
  version: '0'
175
181
  requirements: []
176
- rubyforge_project:
177
- rubygems_version: 2.7.6
182
+ rubygems_version: 3.1.2
178
183
  signing_key:
179
184
  specification_version: 4
180
185
  summary: Integrate PostgreSQL's enum data type into ActiveRecord's schema and migrations.