activerecord-pg_enum 0.3.0 → 0.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
- SHA1:
3
- metadata.gz: 375facb22f785682bbc48ddd221c8fd2ccd7c1d5
4
- data.tar.gz: 61d7656a02c14feb0e6d591dbb3ecd15839a6154
2
+ SHA256:
3
+ metadata.gz: fff1e0a83e5de4507a70ca673c8dbe261715810cda9936430a4c73673b74c623
4
+ data.tar.gz: 4a02ec6d42efb7fdec11f5cd5ceeee2200b47d6e544202d6eef6fa7947bef69d
5
5
  SHA512:
6
- metadata.gz: dcd88c40ee6625cdf4120e06def40dcdbe5573ccebb77f710e62bfa037222d896a64762798a6ba8736bbbf7e89702633771f20671f92cd63c7a603a5c7cc6293
7
- data.tar.gz: be1393454674cd111816dc113902d4240cbd0ff0a10e5cd4441dbe87fa1daaf98920eaf20ece41e5a494802a2e0c33c6b79e766261320f4920334eb33be2d61e
6
+ metadata.gz: 61cdf54e236bb77fc2196779ff2c8300ef504a23a5d714a63ab9423d3d02bc3fef7f31c598dda827db950652f9eb680ce01e7c54ab0bb7b2d63b6fcd364a2844
7
+ data.tar.gz: f546fa5f64257640d9bc4889bea00fd23e52033928a7f7623e571be48f16ce8358904caffac975994404b73115bb0214e124e4f8f36be88b3beef55085d06caa
data/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.0] - 2019-06-19
10
+ ### Added
11
+ - `enum` method on `TableDefinition`
12
+
13
+ ### Changed
14
+ - Refactored init hook to be much more flexible
15
+ - Removed `ActiveRecord::PGEnum::Helper` in favor of `ActiveRecord::PGEnum()` module builder
16
+
9
17
  ## [0.3.0] - 2019-03-03
10
18
  - Support for 5.0 and 5.1
11
19
  - Change travis config to test against oldest supported version of ruby
data/README.md CHANGED
@@ -58,22 +58,30 @@ class AddSMSToContactMethodType < ActiveRecord::Migration[5.2]
58
58
  end
59
59
  ```
60
60
 
61
- ### Helper Methods
61
+ Adding an enum column to a table
62
62
 
63
63
  ```ruby
64
- class ContactInfo < ActiveRecord::Base
65
- include ActiveRecord::PGEnum::Helper
66
-
67
- pg_enum contact_method: %w[Email SMS Phone]
64
+ class AddStatusToOrder < ActiveRecord::Migration[5.2]
65
+ def change
66
+ change_table :orders do |t|
67
+ t.enum :status, as: "status_type"
68
+ end
69
+ end
68
70
  end
69
71
  ```
70
72
 
71
- `pg_enum` is a wrapper around the official `enum` method that converts array syntax into strings. The above example is equivalent to:
73
+ ### Module Builder
72
74
 
73
75
  ```ruby
74
76
  class ContactInfo < ActiveRecord::Base
75
- include ActiveRecord::PGEnum::Helper
77
+ include ActiveRecord::PGEnum(contact_method: %w[Email SMS Phone])
78
+ end
79
+ ```
80
+
81
+ The generated module calls the official `enum` method converting array syntax into strings. The above example is equivalent to:
76
82
 
83
+ ```ruby
84
+ class ContactInfo < ActiveRecord::Base
77
85
  enum contact_method: { Email: "Email", SMS: "SMS", Phone: "Phone" }
78
86
  end
79
87
  ```
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- activerecord-pg_enum (0.3.0)
4
+ activerecord-pg_enum (0.4.0)
5
5
  activerecord (>= 5.0.0)
6
6
  activesupport
7
7
  pg
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- activerecord-pg_enum (0.3.0)
4
+ activerecord-pg_enum (0.4.0)
5
5
  activerecord (>= 5.0.0)
6
6
  activesupport
7
7
  pg
@@ -68,4 +68,4 @@ DEPENDENCIES
68
68
  rspec (~> 3.0)
69
69
 
70
70
  BUNDLED WITH
71
- 1.16.2
71
+ 1.17.3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- activerecord-pg_enum (0.3.0)
4
+ activerecord-pg_enum (0.4.0)
5
5
  activerecord (>= 5.0.0)
6
6
  activesupport
7
7
  pg
@@ -68,4 +68,4 @@ DEPENDENCIES
68
68
  rspec (~> 3.0)
69
69
 
70
70
  BUNDLED WITH
71
- 1.16.2
71
+ 1.17.3
@@ -66,7 +66,7 @@ GIT
66
66
  PATH
67
67
  remote: ..
68
68
  specs:
69
- activerecord-pg_enum (0.3.0)
69
+ activerecord-pg_enum (0.4.0)
70
70
  activerecord (>= 5.0.0)
71
71
  activesupport
72
72
  pg
@@ -157,4 +157,4 @@ DEPENDENCIES
157
157
  rspec (~> 3.0)
158
158
 
159
159
  BUNDLED WITH
160
- 1.16.2
160
+ 1.17.3
@@ -0,0 +1,18 @@
1
+ module ActiveRecord
2
+ module PGEnum
3
+ def self.install_column_options
4
+ require "active_record/connection_adapters/postgresql/schema_dumper"
5
+ ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnDumper.prepend PrepareColumnOptions
6
+ end
7
+
8
+ module PrepareColumnOptions
9
+ def prepare_column_options(column)
10
+ super.tap do |spec|
11
+ if column.type == :enum
12
+ spec[:as] = column.sql_type
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,10 @@
1
1
  module ActiveRecord
2
2
  module PGEnum
3
+ def self.install_schema_dumper
4
+ require "active_record/schema_dumper"
5
+ ActiveRecord::SchemaDumper.prepend SchemaDumper
6
+ end
7
+
3
8
  module SchemaDumper
4
9
  private
5
10
 
@@ -19,18 +24,6 @@ module ActiveRecord
19
24
 
20
25
  stream.puts
21
26
  end
22
-
23
- # Takes a column specification in Object form and serializes it into a String.
24
- def format_colspec(colspec)
25
- case colspec
26
- when String
27
- colspec
28
- when Array
29
- colspec.map { |value| format_colspec(value) }.select(&:present?).join(", ")
30
- else
31
- super
32
- end
33
- end
34
27
  end
35
28
  end
36
29
  end
@@ -0,0 +1 @@
1
+ require "active_record/pg_enum/5.0/prepare_column_options"
@@ -0,0 +1 @@
1
+ require "active_record/pg_enum/5.0/schema_dumper"
@@ -0,0 +1,10 @@
1
+ require "active_record/pg_enum/5.0/prepare_column_options"
2
+
3
+ module ActiveRecord
4
+ module PGEnum
5
+ def self.install_column_options
6
+ require "active_record/connection_adapters/postgresql/schema_dumper"
7
+ ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaDumper.prepend PrepareColumnOptions
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require "active_record/pg_enum/5.0/schema_dumper"
2
+
3
+ module ActiveRecord
4
+ module PGEnum
5
+ def self.install_schema_dumper
6
+ require "active_record/connection_adapters/postgresql/schema_dumper"
7
+ ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaDumper.prepend SchemaDumper
8
+ end
9
+ end
10
+ end
@@ -0,0 +1 @@
1
+ require "active_record/pg_enum/5.2/prepare_column_options"
@@ -0,0 +1 @@
1
+ require "active_record/pg_enum/5.2/schema_dumper"
@@ -1,5 +1,10 @@
1
1
  module ActiveRecord
2
2
  module PGEnum
3
+ def self.install_command_recorder
4
+ require "active_record/migration/command_recorder"
5
+ ActiveRecord::Migration::CommandRecorder.include CommandRecorder
6
+ end
7
+
3
8
  # ActiveRecord::Migration::CommandRecorder is a class used by reversible migrations.
4
9
  # It captures the forward migration commands and translates them into their inverse
5
10
  # by way of some simple metaprogramming.
@@ -1,36 +1,30 @@
1
1
  module ActiveRecord
2
- module PGEnum
3
- module Helper
4
- def self.included(klass)
5
- klass.extend ClassMethods
6
- end
2
+ # Declare an enum attribute where the values map to strings enforced by PostgreSQL's
3
+ # enumerated types.
4
+ #
5
+ # class Conversation < ActiveRecord::Base
6
+ # include ActiveRecord::PGEnum(status: %i[active archived])
7
+ # end
8
+ #
9
+ # This is merely a wrapper over traditional enum syntax so that you can define
10
+ # string-based enums with an array of values.
11
+ def self.PGEnum(**definitions)
12
+ values = definitions.values.map do |value|
13
+ if value.is_a? Array
14
+ keys = value.map(&:to_sym)
15
+ values = value.map(&:to_s)
7
16
 
8
- module ClassMethods
9
- # Declare an enum attribute where the values map to strings enforced by PostgreSQL's
10
- # enumerated types.
11
- #
12
- # class Conversation < ActiveRecord::Base
13
- # include ActiveRecord::PGEnum::Helper
14
- #
15
- # pg_enum status: %i[active archived]
16
- # end
17
- #
18
- # This is merely a wrapper over traditional enum syntax so that you can define
19
- # string-based enums with an array of values.
20
- def pg_enum(definitions)
21
- values = definitions.values.map do |value|
22
- if value.is_a? Array
23
- keys = value.map(&:to_sym)
24
- values = value.map(&:to_s)
17
+ Hash[keys.zip(values)]
18
+ else
19
+ value
20
+ end
21
+ end
25
22
 
26
- Hash[keys.zip(values)]
27
- else
28
- value
29
- end
30
- end
23
+ Module.new do
24
+ define_singleton_method(:inspect) { %{ActiveRecord::PGEnum(#{definitions.keys.join(" ")})} }
31
25
 
32
- enum Hash[definitions.keys.zip(values)]
33
- end
26
+ define_singleton_method :included do |klass|
27
+ klass.enum Hash[definitions.keys.zip(values)]
34
28
  end
35
29
  end
36
30
  end
@@ -1,5 +1,11 @@
1
1
  module ActiveRecord
2
2
  module PGEnum
3
+ def self.install_postgresql_adapter
4
+ require "active_record/connection_adapters/postgresql_adapter"
5
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.include PostgreSQLAdapter
6
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES.merge!(enum: { name: "enum" })
7
+ end
8
+
3
9
  module PostgreSQLAdapter
4
10
  # Helper method used by the monkeypatch internals. Provides a hash of ENUM types as they exist currently.
5
11
  #
@@ -1,5 +1,10 @@
1
1
  module ActiveRecord
2
2
  module PGEnum
3
+ def self.install_schema_statements
4
+ require "active_record/connection_adapters/postgresql/schema_statements"
5
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.include SchemaStatements
6
+ end
7
+
3
8
  module SchemaStatements
4
9
  # Create a new ENUM type, with an arbitrary number of values.
5
10
  #
@@ -0,0 +1,21 @@
1
+ module ActiveRecord
2
+ module PGEnum
3
+ def self.install_table_definition
4
+ require "active_record/connection_adapters/postgresql_adapter"
5
+ ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.include TableDefinition
6
+ end
7
+
8
+ module TableDefinition
9
+ # Create an enum column inside a TableDefinition
10
+ #
11
+ # Example:
12
+ #
13
+ # create_table :orders do |t|
14
+ # t.enum :status, as: "status_type"
15
+ # end
16
+ def enum(name, as:, **options)
17
+ column(name, as, options)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module PGEnum
3
- VERSION = "0.3.0"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -1,30 +1,39 @@
1
- require "active_record"
2
- require "active_record/connection_adapters/postgresql/schema_dumper"
3
- require "active_record/connection_adapters/postgresql/schema_statements"
4
- require "active_record/connection_adapters/postgresql_adapter"
5
1
  require "active_support/lazy_load_hooks"
2
+ require "active_record"
6
3
 
7
4
  ActiveSupport.on_load(:active_record) do
8
- require "active_record/pg_enum/command_recorder"
9
- require "active_record/pg_enum/postgresql_adapter"
10
- require "active_record/pg_enum/schema_statements"
11
5
  require "active_record/pg_enum/helper"
6
+ ActiveRecord::PGEnum.install Gem.loaded_specs["activerecord"].version
7
+ end
12
8
 
13
- ar_version = Gem.loaded_specs["activerecord"].version
9
+ module ActiveRecord
10
+ module PGEnum
11
+ KNOWN_VERSIONS = %w[5.0 5.1 5.2 6.alpha].map { |v| Gem::Version.new(v) }
14
12
 
15
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES.merge!(enum: { name: "enum" })
13
+ def self.install(version)
14
+ major_minor = version.canonical_segments[0..1].join(".")
15
+ major_minor = Gem::Version.new(major_minor)
16
16
 
17
- if ar_version >= Gem::Version.new("5.2.0")
18
- require "active_record/pg_enum/schema_dumper"
19
- ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaDumper.prepend ActiveRecord::PGEnum::SchemaDumper
20
- else
21
- require "active_record/pg_enum/4.2/column_dumper"
22
- require "active_record/pg_enum/4.2/schema_dumper"
23
- ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnDumper.prepend ActiveRecord::PGEnum::ColumnDumper
24
- ActiveRecord::SchemaDumper.prepend ActiveRecord::PGEnum::SchemaDumper
25
- end
17
+ # Don't immediately fail if we don't yet support the current version.
18
+ # There's at least a chance it could work.
19
+ if !KNOWN_VERSIONS.include?(major_minor) && major_minor > KNOWN_VERSIONS.last
20
+ major_minor = KNOWN_VERSIONS.last
21
+ warn "[PGEnum] Current ActiveRecord version unsupported! Falling back to: #{major_minor}"
22
+ end
23
+
24
+ require "active_record/pg_enum/#{major_minor}/prepare_column_options"
25
+ require "active_record/pg_enum/#{major_minor}/schema_dumper"
26
+ require "active_record/pg_enum/postgresql_adapter"
27
+ require "active_record/pg_enum/schema_statements"
28
+ require "active_record/pg_enum/command_recorder"
29
+ require "active_record/pg_enum/table_definition"
26
30
 
27
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.include ActiveRecord::PGEnum::PostgreSQLAdapter
28
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.include ActiveRecord::PGEnum::SchemaStatements
29
- ActiveRecord::Migration::CommandRecorder.include ActiveRecord::PGEnum::CommandRecorder
31
+ install_column_options
32
+ install_schema_dumper
33
+ install_postgresql_adapter
34
+ install_schema_statements
35
+ install_command_recorder
36
+ install_table_definition
37
+ end
38
+ end
30
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-pg_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Lassek
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-04 00:00:00.000000000 Z
11
+ date: 2019-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -152,13 +152,19 @@ files:
152
152
  - gemfiles/edge.gemfile
153
153
  - gemfiles/edge.gemfile.lock
154
154
  - lib/active_record/pg_enum.rb
155
- - lib/active_record/pg_enum/4.2/column_dumper.rb
156
- - lib/active_record/pg_enum/4.2/schema_dumper.rb
155
+ - lib/active_record/pg_enum/5.0/prepare_column_options.rb
156
+ - lib/active_record/pg_enum/5.0/schema_dumper.rb
157
+ - lib/active_record/pg_enum/5.1/prepare_column_options.rb
158
+ - lib/active_record/pg_enum/5.1/schema_dumper.rb
159
+ - lib/active_record/pg_enum/5.2/prepare_column_options.rb
160
+ - lib/active_record/pg_enum/5.2/schema_dumper.rb
161
+ - lib/active_record/pg_enum/6.alpha/prepare_column_options.rb
162
+ - lib/active_record/pg_enum/6.alpha/schema_dumper.rb
157
163
  - lib/active_record/pg_enum/command_recorder.rb
158
164
  - lib/active_record/pg_enum/helper.rb
159
165
  - lib/active_record/pg_enum/postgresql_adapter.rb
160
- - lib/active_record/pg_enum/schema_dumper.rb
161
166
  - lib/active_record/pg_enum/schema_statements.rb
167
+ - lib/active_record/pg_enum/table_definition.rb
162
168
  - lib/active_record/pg_enum/version.rb
163
169
  - lib/activerecord/pg_enum.rb
164
170
  homepage: https://github.com/getflywheel/activerecord-pg_enum
@@ -180,8 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
186
  - !ruby/object:Gem::Version
181
187
  version: '0'
182
188
  requirements: []
183
- rubyforge_project:
184
- rubygems_version: 2.4.5
189
+ rubygems_version: 3.0.3
185
190
  signing_key:
186
191
  specification_version: 4
187
192
  summary: Integrate PostgreSQL's enumerated types with the Rails enum feature
@@ -1,13 +0,0 @@
1
- module ActiveRecord
2
- module PGEnum
3
- module ColumnDumper
4
- def column_spec(column)
5
- if column.type == :enum
6
- return ["column", [column.sql_type.inspect, prepare_column_options(column)]]
7
- end
8
-
9
- super
10
- end
11
- end
12
- end
13
- end
@@ -1,45 +0,0 @@
1
- module ActiveRecord
2
- module PGEnum
3
- module SchemaDumper
4
- private
5
-
6
- def extensions(stream)
7
- super
8
- enums(stream)
9
- end
10
-
11
- def enums(stream)
12
- return unless (enum_types = @connection.enum_types).any?
13
-
14
- stream.puts " # These are custom enum types that must be created before they can be used in the schema definition"
15
-
16
- enum_types.each do |name, definition|
17
- stream.puts %Q{ create_enum "#{name}", %w[#{definition.join(" ")}]}
18
- end
19
-
20
- stream.puts
21
- end
22
-
23
- # Gathers the arguments needed for the column line inside the create_table block.
24
- def column_spec(column)
25
- if column.type == :enum
26
- return ["column", [column.sql_type.inspect, prepare_column_options(column)]]
27
- end
28
-
29
- super
30
- end
31
-
32
- # Takes a column specification in Object form and serializes it into a String.
33
- def format_colspec(colspec)
34
- case colspec
35
- when String
36
- colspec
37
- when Array
38
- colspec.map { |value| format_colspec(value) }.select(&:present?).join(", ")
39
- else
40
- super
41
- end
42
- end
43
- end
44
- end
45
- end