activerecord-postgres_enum 0.6.0 → 1.4.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
  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.