better_record 0.10.0 → 0.10.1

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: 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