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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d98e0b7f54bd71ded48d966277be30e39f485f598f0322ad7479d852a0ddb6c
4
- data.tar.gz: d6c108b373661e0513ef8fd3044a587ede56f38dea16cda8d135e132bb27f0ff
3
+ metadata.gz: a405b0c0c1a44d6f315d0c9f364f855b1702f8c476a1eb50d6987b97b318c1a9
4
+ data.tar.gz: f3bd70fccb3de3710f73529de507052f44d946662e7889426d1ae0ac3b13a2e1
5
5
  SHA512:
6
- metadata.gz: 74489d67ad1f0ffb4454d92dbc789883c74f9dcbeb4b4255c3b0cfd752a9a90624442c853eacad355252476ee5cdd661484a39f978056f01e4dd0ce347daa4a4
7
- data.tar.gz: ae840a61e2d9e697ecf2d130ad037fa569f75eee558a4b05013514b6055031b72bfbc82cbb03a0b6825bf0eb2f50058774310161a05985cc61c47eda2b70d6cf
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
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Type.register(:gender, BetterRecord::Gender::Type)
@@ -2,7 +2,6 @@
2
2
 
3
3
  class MoneyType < ActiveRecord::Type::Value
4
4
  def cast(value)
5
- return nil unless value
6
5
  convert_to_money(value)
7
6
  end
8
7
 
@@ -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
data/lib/better_record.rb CHANGED
@@ -82,5 +82,10 @@ ActiveSupport.on_load(:active_record) do
82
82
  class Migration
83
83
  include BetterRecord::Migration
84
84
  end
85
+ module ConnectionAdapters
86
+ class TableDefinition
87
+ include BetterRecord::Gender::TableDefinition
88
+ end
89
+ end
85
90
  end
86
91
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BetterRecord
4
- VERSION = '0.10.0'
4
+ VERSION = '0.10.1'
5
5
  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.0
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-08-30 00:00:00.000000000 Z
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/20180725160802_create_better_record_db_functions.rb
261
- - db/migrate/20180725201614_create_better_record_table_sizes.rb
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