better_record 0.10.0 → 0.10.1
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 +4 -4
- data/app/models/better_record/base.rb +7 -0
- data/config/initializers/active_record/gender_type.rb +3 -0
- data/config/initializers/active_record/money_type.rb +0 -1
- data/db/migrate/{20180725160802_create_better_record_db_functions.rb → 20180518042050_create_better_record_db_functions.rb} +0 -0
- data/db/migrate/20180518042060_create_better_record_enum_types.rb +18 -0
- data/db/migrate/{20180725201614_create_better_record_table_sizes.rb → 20180518042070_create_better_record_table_sizes.rb} +0 -0
- data/lib/better_record.rb +5 -0
- data/lib/better_record/concerns/active_record_extensions/connection_adapter_extensions.rb +87 -0
- data/lib/better_record/gender.rb +51 -0
- data/lib/better_record/version.rb +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a405b0c0c1a44d6f315d0c9f364f855b1702f8c476a1eb50d6987b97b318c1a9
|
4
|
+
data.tar.gz: f3bd70fccb3de3710f73529de507052f44d946662e7889426d1ae0ac3b13a2e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf1a31b4a42734e665b44d2cd9e40ac0a3023f99dc888bfb160982d7eabe22df3e892539e667c14d2a8b7c8d7df277c0728f02ef724de69c561fe9ecb21bfe7d
|
7
|
+
data.tar.gz: c133b0a2f00e425b146a7de7822269e0c73d4c28901804ad421441cb09b28d889b3da20525a2347f1fcdc99198e74ee9135057a1ae9dd05493345d0126950cb5
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BetterRecord
|
2
4
|
class Base < ActiveRecord::Base
|
3
5
|
self.abstract_class = true
|
@@ -28,6 +30,9 @@ module BetterRecord
|
|
28
30
|
# == Boolean Class Methods ================================================
|
29
31
|
|
30
32
|
# == Class Methods ========================================================
|
33
|
+
def self.gender_enum(col)
|
34
|
+
enum col, BetterRecord::Gender::ENUM
|
35
|
+
end
|
31
36
|
|
32
37
|
# == Boolean Methods ======================================================
|
33
38
|
|
@@ -45,5 +50,7 @@ module BetterRecord
|
|
45
50
|
super()
|
46
51
|
end
|
47
52
|
end
|
53
|
+
|
54
|
+
|
48
55
|
end
|
49
56
|
end
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateBetterRecordEnumTypes < ActiveRecord::Migration[5.2]
|
2
|
+
def up
|
3
|
+
execute <<-SQL
|
4
|
+
DO $$
|
5
|
+
BEGIN
|
6
|
+
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'gender') THEN
|
7
|
+
CREATE TYPE gender AS ENUM ('F', 'M');
|
8
|
+
END IF;
|
9
|
+
END
|
10
|
+
$$;
|
11
|
+
SQL
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
def down
|
16
|
+
execute "DROP TYPE IF EXISTS gender;"
|
17
|
+
end
|
18
|
+
end
|
File without changes
|
data/lib/better_record.rb
CHANGED
@@ -0,0 +1,87 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module PostgreSQL
|
4
|
+
module OID # :nodoc:
|
5
|
+
class Enum < Type::Value
|
6
|
+
attr_accessor :value_array, :type_override
|
7
|
+
|
8
|
+
def cast(value)
|
9
|
+
value_array ? value_array.find {|v| /^#{v}/i =~ value.to_s } : value.to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
def type
|
13
|
+
type_override || :enum
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def cast_value(value)
|
19
|
+
value_array ? value_array.find {|v| /^#{v}/i =~ value.to_s } : value.to_s
|
20
|
+
end
|
21
|
+
end
|
22
|
+
# This class uses the data from PostgreSQL pg_type table to build
|
23
|
+
# the OID -> Type mapping.
|
24
|
+
# - OID is an integer representing the type.
|
25
|
+
# - Type is an OID::Type object.
|
26
|
+
# This class has side effects on the +store+ passed during initialization.
|
27
|
+
|
28
|
+
class TypeMapInitializer # :nodoc:
|
29
|
+
private
|
30
|
+
def register_enum_type(row)
|
31
|
+
use_sym = true
|
32
|
+
enum_val = OID::Enum.new
|
33
|
+
enum_val.value_array = row['enumlabel'][1..-2].split(',').presence
|
34
|
+
enum_val.value_array.map!(&:to_i) if enum_val.value_array.all? {|v| v =~ /^[0-9]+$/}
|
35
|
+
|
36
|
+
enum_val.type_override = ActiveRecord::Type.registry.__send__(:registrations).find do |type|
|
37
|
+
if type.matches?(row['typname'].to_sym)
|
38
|
+
true
|
39
|
+
elsif type.matches?(row['typname'])
|
40
|
+
use_sym = false
|
41
|
+
true
|
42
|
+
end
|
43
|
+
end && (use_sym ? row['typname'].to_sym : row['typname'])
|
44
|
+
|
45
|
+
register row["oid"], enum_val
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class PostgreSQLAdapter
|
52
|
+
private
|
53
|
+
def load_additional_types(oids = nil)
|
54
|
+
initializer = OID::TypeMapInitializer.new(type_map)
|
55
|
+
|
56
|
+
if supports_ranges?
|
57
|
+
query = <<-SQL
|
58
|
+
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype,
|
59
|
+
array_agg(e.enumlabel) as enumlabel
|
60
|
+
FROM pg_type as t
|
61
|
+
LEFT JOIN pg_range as r ON t.oid = r.rngtypid
|
62
|
+
LEFT JOIN pg_catalog.pg_enum as e ON t.oid = e.enumtypid
|
63
|
+
SQL
|
64
|
+
else
|
65
|
+
query = <<-SQL
|
66
|
+
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype
|
67
|
+
FROM pg_type as t
|
68
|
+
SQL
|
69
|
+
end
|
70
|
+
|
71
|
+
if oids
|
72
|
+
query += "WHERE t.oid::integer IN (%s)" % oids.join(", ")
|
73
|
+
else
|
74
|
+
query += initializer.query_conditions_for_initial_load
|
75
|
+
end
|
76
|
+
|
77
|
+
if supports_ranges?
|
78
|
+
query += "GROUP BY 1,2,3,4,5,6,7,8"
|
79
|
+
end
|
80
|
+
|
81
|
+
execute_and_clear(query, "SCHEMA", []) do |records|
|
82
|
+
initializer.run(records)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BetterRecord
|
4
|
+
module Gender
|
5
|
+
ENUM = {
|
6
|
+
F: 'F',
|
7
|
+
M: 'M',
|
8
|
+
f: 'F',
|
9
|
+
m: 'M',
|
10
|
+
female: 'F',
|
11
|
+
Female: 'F',
|
12
|
+
male: 'M',
|
13
|
+
Male: 'M',
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
module TableDefinition
|
17
|
+
def gender(*args, **opts)
|
18
|
+
args.each do |name|
|
19
|
+
column name, :gender, **opts
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Type < ActiveRecord::Type::Value
|
25
|
+
|
26
|
+
def cast(value)
|
27
|
+
convert_to_gender(value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def deserialize(value)
|
31
|
+
super(convert_to_gender(value))
|
32
|
+
end
|
33
|
+
|
34
|
+
def serialize(value)
|
35
|
+
super(convert_to_gender(value))
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def convert_to_gender(value)
|
40
|
+
case value.to_s
|
41
|
+
when /^[Mm]/
|
42
|
+
'M'
|
43
|
+
when /^[Ff]/
|
44
|
+
'F'
|
45
|
+
else
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: better_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sampson Crowley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -245,6 +245,7 @@ files:
|
|
245
245
|
- app/views/better_record/table_sizes/index.html.erb
|
246
246
|
- app/views/better_record/table_sizes/show.html.erb
|
247
247
|
- app/views/layouts/better_record/application.html.erb
|
248
|
+
- config/initializers/active_record/gender_type.rb
|
248
249
|
- config/initializers/active_record/money_type.rb
|
249
250
|
- config/initializers/concerns.rb
|
250
251
|
- config/initializers/core_ext/date.rb
|
@@ -257,8 +258,9 @@ files:
|
|
257
258
|
- config/initializers/mime_types.rb
|
258
259
|
- config/initializers/redis_store.rb
|
259
260
|
- config/routes.rb
|
260
|
-
- db/migrate/
|
261
|
-
- db/migrate/
|
261
|
+
- db/migrate/20180518042050_create_better_record_db_functions.rb
|
262
|
+
- db/migrate/20180518042060_create_better_record_enum_types.rb
|
263
|
+
- db/migrate/20180518042070_create_better_record_table_sizes.rb
|
262
264
|
- db/postgres-audit-trigger.psql
|
263
265
|
- lib/better_record.rb
|
264
266
|
- lib/better_record/batches.rb
|
@@ -267,6 +269,7 @@ files:
|
|
267
269
|
- lib/better_record/concerns/active_record_extensions/associations_extensions/builder_extensions/association_extensions.rb
|
268
270
|
- lib/better_record/concerns/active_record_extensions/attribute_methods/write.rb
|
269
271
|
- lib/better_record/concerns/active_record_extensions/base_extensions.rb
|
272
|
+
- lib/better_record/concerns/active_record_extensions/connection_adapter_extensions.rb
|
270
273
|
- lib/better_record/concerns/active_record_extensions/reflection_extensions.rb
|
271
274
|
- lib/better_record/concerns/controllers/authenticatable.rb
|
272
275
|
- lib/better_record/concerns/controllers/sessionable.rb
|
@@ -274,6 +277,7 @@ files:
|
|
274
277
|
- lib/better_record/encoder.rb
|
275
278
|
- lib/better_record/engine.rb
|
276
279
|
- lib/better_record/fake_redis.rb
|
280
|
+
- lib/better_record/gender.rb
|
277
281
|
- lib/better_record/inject_methods.rb
|
278
282
|
- lib/better_record/jwt.rb
|
279
283
|
- lib/better_record/migration.rb
|