activerecord-postgres_enum 0.5.2 → 1.3.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: 4fd9c6d97f0434ff36fd04e33b64cd039ea6fc10afcc0dfb0d90728e4317e5ee
4
- data.tar.gz: 731183b8229e9c84d4bbefff1010e9825c274f93a06d0d26c5b53753ef187a54
3
+ metadata.gz: 2e453014b2e32bcb23b20fd8c1f2dbb628690f303a61368bfad37564868244e4
4
+ data.tar.gz: 55b98925e297a91892c5c284e53564a6012cdb82e2494b93505974207e8d7de2
5
5
  SHA512:
6
- metadata.gz: e12752bf700f712f6e82a473992a84a0a6d86b8d2c8931dd993bc24e80fe7251c5ef2a98e6af2094e0fe294e1562e32dde3954df3277d3eb4c11cec08bfc8fd8
7
- data.tar.gz: dc34f7be14cecd03afcea23fb279a57383296b673d7ed3721d837e394b22ac5e69e1d1944e48519099b3f56d587eddf2ceffdd0283e559b1641b261851a4932f
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, "crazy"
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, "crazy", "nutty"
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
 
@@ -24,7 +24,11 @@ module ActiveRecord
24
24
  end
25
25
 
26
26
  DEFINED_ENUMS_QUERY = <<~SQL
27
- SELECT t.OID, t.typname, t.typtype, array_agg(e.enumlabel) as enumlabels
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'].gsub(/[{}]/, '').gsub('NULL', '').split(',').sort
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
- values = values.map { |v| "'#{v}'" }
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
- execute "DROP TYPE #{name}"
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
- execute "ALTER TYPE #{name} ADD VALUE '#{value}'"
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 '#{existing_value}' TO '#{new_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(&:inspect).join(', ')
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")
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ActiveRecord
4
4
  module PostgresEnum
5
- VERSION = "0.5.2"
5
+ VERSION = "1.3.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.5.2
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: 2019-03-19 00:00:00.000000000 Z
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: 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: '10.0'
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: '10.0'
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
- 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.