activerecord-postgres_enum 0.5.2 → 1.3.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e453014b2e32bcb23b20fd8c1f2dbb628690f303a61368bfad37564868244e4
|
4
|
+
data.tar.gz: 55b98925e297a91892c5c284e53564a6012cdb82e2494b93505974207e8d7de2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45e0ba20aeaf52968c9022fca7aed356272ad2deb9883c98020d0bcdc17dfa73786fac4776f1f8cd02b45babe4a1344b5bcf9e516b8c3161275713910babc797
|
7
|
+
data.tar.gz: 66fd78a22198c3326b66ce410fac6782599164d3087473b1e3d5550e94801af37407d85786ca38c5f4c5c0503b5320dcde7c377a5d1ef3f94db72f4b236a73f2
|
data/README.md
CHANGED
@@ -53,15 +53,36 @@ rename_enum :mood, :emotions
|
|
53
53
|
To add a value into existing enum:
|
54
54
|
|
55
55
|
```ruby
|
56
|
-
add_enum_value :mood, "
|
56
|
+
add_enum_value :mood, "pensive"
|
57
|
+
```
|
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
|
57
75
|
```
|
58
76
|
|
59
77
|
To rename a value:
|
60
78
|
|
61
79
|
```ruby
|
62
|
-
rename_enum_value :mood, "
|
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(
|
11
|
-
@enum_name =
|
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
|
|
@@ -24,7 +24,11 @@ module ActiveRecord
|
|
24
24
|
end
|
25
25
|
|
26
26
|
DEFINED_ENUMS_QUERY = <<~SQL
|
27
|
-
SELECT
|
27
|
+
SELECT
|
28
|
+
t.OID,
|
29
|
+
t.typname,
|
30
|
+
t.typtype,
|
31
|
+
array_to_string(array_agg(e.enumlabel ORDER BY e.enumsortorder), '\t\t', '') as enumlabels
|
28
32
|
FROM pg_type t
|
29
33
|
LEFT JOIN pg_enum e ON e.enumtypid = t.oid
|
30
34
|
WHERE typtype = 'e'
|
@@ -34,31 +38,54 @@ module ActiveRecord
|
|
34
38
|
|
35
39
|
def enums
|
36
40
|
select_all(DEFINED_ENUMS_QUERY).each_with_object({}) do |row, memo|
|
37
|
-
memo[row["typname"].to_sym] = row['enumlabels'].
|
41
|
+
memo[row["typname"].to_sym] = row['enumlabels'].split("\t\t")
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
41
|
-
def create_enum(name, values)
|
42
|
-
|
45
|
+
def create_enum(name, values, if_not_exists: nil)
|
46
|
+
return if if_not_exists && enums.include?(name.to_sym)
|
47
|
+
|
48
|
+
values = values.map { |v| quote v }
|
43
49
|
execute "CREATE TYPE #{name} AS ENUM (#{values.join(', ')})"
|
44
50
|
end
|
45
51
|
|
46
|
-
def drop_enum(name)
|
47
|
-
|
52
|
+
def drop_enum(name, cascade: nil, if_exists: nil)
|
53
|
+
if_exists_statement = 'IF EXISTS' if if_exists
|
54
|
+
cascade_statement = 'CASCADE' if cascade
|
55
|
+
|
56
|
+
sql = "DROP TYPE #{if_exists_statement} #{name} #{cascade_statement}"
|
57
|
+
execute sql
|
48
58
|
end
|
49
59
|
|
50
60
|
def rename_enum(name, new_name)
|
51
61
|
execute "ALTER TYPE #{name} RENAME TO #{new_name}"
|
52
62
|
end
|
53
63
|
|
54
|
-
def add_enum_value(name, value)
|
55
|
-
|
64
|
+
def add_enum_value(name, value, after: nil, before: nil, if_not_exists: nil)
|
65
|
+
if_not_exists_statement = 'IF NOT EXISTS' if if_not_exists
|
66
|
+
|
67
|
+
sql = "ALTER TYPE #{name} ADD VALUE #{if_not_exists_statement} #{quote value}"
|
68
|
+
if after
|
69
|
+
sql += " AFTER #{quote after}"
|
70
|
+
elsif before
|
71
|
+
sql += " BEFORE #{quote before}"
|
72
|
+
end
|
73
|
+
execute sql
|
74
|
+
end
|
75
|
+
|
76
|
+
def remove_enum_value(name, value)
|
77
|
+
sql = %{
|
78
|
+
DELETE FROM pg_enum
|
79
|
+
WHERE enumlabel=#{quote value}
|
80
|
+
AND enumtypid=(SELECT oid FROM pg_type WHERE typname='#{name}')
|
81
|
+
}
|
82
|
+
execute sql
|
56
83
|
end
|
57
84
|
|
58
85
|
def rename_enum_value(name, existing_value, new_value)
|
59
86
|
raise "Renaming enum values is only supported in PostgreSQL 10.0+" unless rename_enum_value_supported?
|
60
87
|
|
61
|
-
execute "ALTER TYPE #{name} RENAME VALUE
|
88
|
+
execute "ALTER TYPE #{name} RENAME VALUE #{quote existing_value} TO #{quote new_value}"
|
62
89
|
end
|
63
90
|
|
64
91
|
def migration_keys
|
@@ -16,8 +16,8 @@ module ActiveRecord
|
|
16
16
|
statements = []
|
17
17
|
|
18
18
|
@connection.enums.each do |name, values|
|
19
|
-
values = values.map
|
20
|
-
statements << " create_enum #{name.inspect}, [#{values}]"
|
19
|
+
values = values.map { |v| " #{v.inspect}," }.join("\n")
|
20
|
+
statements << " create_enum #{name.inspect}, [\n#{values}\n ]"
|
21
21
|
end
|
22
22
|
|
23
23
|
stream.puts statements.join("\n")
|
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:
|
4
|
+
version: 1.3.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:
|
11
|
+
date: 2020-07-26 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:
|
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:
|
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: '
|
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: '
|
116
|
+
version: '13.0'
|
111
117
|
- !ruby/object:Gem::Dependency
|
112
118
|
name: rspec-rails
|
113
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -173,8 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
179
|
- !ruby/object:Gem::Version
|
174
180
|
version: '0'
|
175
181
|
requirements: []
|
176
|
-
|
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.
|