better_record 0.20.2 → 0.21.2
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/model_concerns/has_validated_avatar.rb +0 -2
- data/config/initializers/active_record/three_state_type.rb +3 -0
- data/db/migrate/20190209033946_update_better_record_audit_functions.rb +5 -2
- data/db/migrate/20190416215152_add_three_state_boolean_type.rb +19 -0
- data/lib/better_record.rb +4 -1
- data/lib/better_record/batches.rb +1 -0
- data/lib/better_record/concerns/active_record_extensions/base_extensions/attribute_methods/write.rb +3 -1
- data/lib/better_record/concerns/active_record_extensions/connection_adapter_extensions.rb +14 -13
- data/lib/better_record/custom_type.rb +43 -0
- data/lib/better_record/encoder.rb +1 -0
- data/lib/better_record/engine.rb +1 -0
- data/lib/better_record/exchange_rate_integer.rb +22 -24
- data/lib/better_record/fake_redis.rb +1 -0
- data/lib/better_record/gender.rb +16 -25
- data/lib/better_record/jwt.rb +1 -0
- data/lib/better_record/money_integer.rb +19 -24
- data/lib/better_record/three_state.rb +66 -0
- data/lib/better_record/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 521ff1e0cbdf88a48e82d12f5c2fa5f209f69713cac846119d04a8c251fc6395
|
4
|
+
data.tar.gz: 19a85f7f166cd00068d4798917223ec4780178a08bb7734d700d146e0742c193
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4d05dad7c7fb940210c0dd227de208376f56433aa7e9135979253c128307bc6a35b135f09df258299f7ddf31f550306c4f9747f6e48e336cf630b0bfe1725d0
|
7
|
+
data.tar.gz: 1fdfcac88985fc30d470377deed92feb8f696ca765cc6ec37ee330a1f45a4e34654ae7bfe0570439ddd90f5f343a57411b764102a709b176ae466f50a08d6464
|
@@ -1,12 +1,15 @@
|
|
1
1
|
class UpdateBetterRecordAuditFunctions < ActiveRecord::Migration[5.2]
|
2
2
|
def up
|
3
|
-
last_event = BetterRecord::LoggedAction.count
|
4
|
-
|
5
3
|
execute <<-SQL
|
6
4
|
ALTER TABLE #{BetterRecord.db_audit_schema}.logged_actions
|
7
5
|
RENAME TO old_logged_actions
|
8
6
|
SQL
|
9
7
|
|
8
|
+
ola = Class.new(BetterRecord::LoggedAction)
|
9
|
+
ola.table_name = "#{BetterRecord.db_audit_schema}.old_logged_actions"
|
10
|
+
|
11
|
+
last_event = ola.count + 1
|
12
|
+
|
10
13
|
sql = ""
|
11
14
|
source = File.new(BetterRecord::Engine.root.join('db', 'postgres-audit-v2-table.psql'), "r")
|
12
15
|
while (line = source.gets)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class AddThreeStateBooleanType < ActiveRecord::Migration[5.2]
|
2
|
+
def up
|
3
|
+
end
|
4
|
+
def up
|
5
|
+
execute <<-SQL
|
6
|
+
DO $$
|
7
|
+
BEGIN
|
8
|
+
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'three_state') THEN
|
9
|
+
CREATE TYPE three_state AS ENUM ('Y', 'N', 'U');
|
10
|
+
END IF;
|
11
|
+
END
|
12
|
+
$$;
|
13
|
+
SQL
|
14
|
+
end
|
15
|
+
|
16
|
+
def down
|
17
|
+
execute "DROP TYPE IF EXISTS three_state;"
|
18
|
+
end
|
19
|
+
end
|
data/lib/better_record.rb
CHANGED
@@ -86,8 +86,10 @@ module BetterRecord
|
|
86
86
|
self.token_send_as_arg = Boolean.strict_parse(ENV.fetch('BR_TOKEN_AS_ARG') { false })
|
87
87
|
end
|
88
88
|
|
89
|
+
require "#{File.expand_path(__dir__)}/better_record/custom_type.rb"
|
90
|
+
|
89
91
|
Dir.glob("#{File.expand_path(__dir__)}/better_record/*.rb").each do |d|
|
90
|
-
require d unless (d =~ /fake/)
|
92
|
+
require d unless (d =~ /fake|custom_type/)
|
91
93
|
end
|
92
94
|
|
93
95
|
ActiveSupport.on_load(:active_record) do
|
@@ -103,6 +105,7 @@ ActiveSupport.on_load(:active_record) do
|
|
103
105
|
include BetterRecord::ExchangeRateInteger::TableDefinition
|
104
106
|
include BetterRecord::Gender::TableDefinition
|
105
107
|
include BetterRecord::MoneyInteger::TableDefinition
|
108
|
+
include BetterRecord::ThreeState::TableDefinition
|
106
109
|
end
|
107
110
|
end
|
108
111
|
end
|
data/lib/better_record/concerns/active_record_extensions/base_extensions/attribute_methods/write.rb
CHANGED
@@ -15,13 +15,15 @@ module BetterRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def normalize_attribute_value(attr_name, value)
|
18
|
-
case type_for_attribute(attr_name)
|
18
|
+
case t = type_for_attribute(attr_name)
|
19
19
|
when ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array
|
20
20
|
[value].flatten.select(&:present?)
|
21
21
|
when ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Jsonb
|
22
22
|
value.presence || {}
|
23
23
|
when ActiveRecord::Type::Boolean
|
24
24
|
BetterRecord.strict_booleans ? Boolean.strict_parse(value) : Boolean.parse(value)
|
25
|
+
when BetterRecord::CustomType
|
26
|
+
t.class.normalize_type_value(value)
|
25
27
|
else
|
26
28
|
value.presence
|
27
29
|
end
|
@@ -29,7 +29,7 @@ module ActiveRecord
|
|
29
29
|
private
|
30
30
|
def register_domain_type(row)
|
31
31
|
if (in_reg = check_registry(row['typname']))
|
32
|
-
register row['oid'],
|
32
|
+
register row['oid'], in_reg
|
33
33
|
elsif base_type = @store.lookup(row["typbasetype"].to_i)
|
34
34
|
register row["oid"], base_type
|
35
35
|
else
|
@@ -38,23 +38,24 @@ module ActiveRecord
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def register_enum_type(row)
|
41
|
-
enum_val = OID::Enum.new
|
42
|
-
enum_val.value_array = row['enumlabel'][1..-2].split(',').presence
|
43
|
-
enum_val.value_array.map!(&:to_i) if enum_val.value_array.all? {|v| v =~ /^[0-9]+$/}
|
44
41
|
|
45
|
-
|
42
|
+
if (reg_val = check_registry(row['typname'])).is_a?(BetterRecord::CustomType)
|
43
|
+
register row['oid'], reg_val
|
44
|
+
else
|
45
|
+
enum_val = OID::Enum.new
|
46
|
+
enum_val.value_array = row['enumlabel'][1..-2].split(',').presence
|
47
|
+
enum_val.value_array.map!(&:to_i) if enum_val.value_array.all? {|v| v =~ /^[0-9]+$/}
|
48
|
+
|
49
|
+
enum_val.type_override = (reg_val && row['typname'].to_sym).presence
|
46
50
|
|
47
|
-
|
51
|
+
register row["oid"], enum_val
|
52
|
+
end
|
48
53
|
end
|
49
54
|
|
50
55
|
def check_registry(name)
|
51
|
-
ActiveRecord::Type.registry.
|
52
|
-
|
53
|
-
|
54
|
-
elsif type.matches?(name)
|
55
|
-
true
|
56
|
-
end
|
57
|
-
end
|
56
|
+
ActiveRecord::Type.registry.lookup(name.to_sym)
|
57
|
+
rescue
|
58
|
+
nil
|
58
59
|
end
|
59
60
|
|
60
61
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module BetterRecord
|
5
|
+
class CustomType < ActiveRecord::Type::Value
|
6
|
+
def self.normalize_type_value(value)
|
7
|
+
raise "Method Not Implemented"
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.cast(value)
|
11
|
+
self.normalize_type_value(value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.deserialize(value)
|
15
|
+
self.normalize_type_value(value)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.serialize(value)
|
19
|
+
self.normalize_type_value(value)
|
20
|
+
end
|
21
|
+
|
22
|
+
alias :super_cast :cast
|
23
|
+
alias :super_deserialize :deserialize
|
24
|
+
alias :super_serialize :serialize
|
25
|
+
|
26
|
+
def cast(value)
|
27
|
+
super_cast(self.class.cast(value))
|
28
|
+
end
|
29
|
+
|
30
|
+
def deserialize(value)
|
31
|
+
super_deserialize(self.class.deserialize(value))
|
32
|
+
end
|
33
|
+
|
34
|
+
def serialize(value)
|
35
|
+
super_serialize(self.class.serialize(value))
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def normalize_type_value(value)
|
40
|
+
self.class.normalize_type_value(value)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/better_record/engine.rb
CHANGED
@@ -1,8 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require 'store_as_int'
|
3
5
|
|
4
6
|
module BetterRecord
|
5
7
|
module ExchangeRateInteger
|
8
|
+
|
9
|
+
def self.convert_to_exchange_rate(value)
|
10
|
+
return StoreAsInt::ExchangeRate.new(0) unless value
|
11
|
+
if (!value.kind_of?(Numeric))
|
12
|
+
begin
|
13
|
+
exchange_rate_to_i = (value.gsub(/\%/, '').presence || 0).to_d * StoreAsInt::ExchangeRate.base
|
14
|
+
StoreAsInt::ExchangeRate.new(exchange_rate_to_i.to_i)
|
15
|
+
rescue
|
16
|
+
StoreAsInt::ExchangeRate.new
|
17
|
+
end
|
18
|
+
else
|
19
|
+
StoreAsInt::ExchangeRate.new(value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
6
23
|
module TableDefinition
|
7
24
|
def exchange_rate_integer(*args, **opts)
|
8
25
|
args.each do |name|
|
@@ -11,33 +28,14 @@ module BetterRecord
|
|
11
28
|
end
|
12
29
|
end
|
13
30
|
|
14
|
-
class Type <
|
15
|
-
def
|
16
|
-
convert_to_exchange_rate(value)
|
17
|
-
end
|
18
|
-
|
19
|
-
def deserialize(value)
|
20
|
-
super(convert_to_exchange_rate(value))
|
31
|
+
class Type < BetterRecord::CustomType
|
32
|
+
def self.normalize_type_value(value)
|
33
|
+
BetterRecord::ExchangeRateInteger.convert_to_exchange_rate(value)
|
21
34
|
end
|
22
35
|
|
23
|
-
def serialize(value)
|
24
|
-
|
36
|
+
def self.serialize(value)
|
37
|
+
normalize_type_value(value).value
|
25
38
|
end
|
26
|
-
|
27
|
-
private
|
28
|
-
def convert_to_exchange_rate(value)
|
29
|
-
return StoreAsInt::ExchangeRate.new(0) unless value
|
30
|
-
if (!value.kind_of?(Numeric))
|
31
|
-
begin
|
32
|
-
exchange_rate_to_i = (value.gsub(/\%/, '').presence || 0).to_d * StoreAsInt::ExchangeRate.base
|
33
|
-
StoreAsInt::ExchangeRate.new(exchange_rate_to_i.to_i)
|
34
|
-
rescue
|
35
|
-
StoreAsInt::ExchangeRate.new
|
36
|
-
end
|
37
|
-
else
|
38
|
-
StoreAsInt::ExchangeRate.new(value)
|
39
|
-
end
|
40
|
-
end
|
41
39
|
end
|
42
40
|
end
|
43
41
|
end
|
data/lib/better_record/gender.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module BetterRecord
|
@@ -14,9 +15,20 @@ module BetterRecord
|
|
14
15
|
u: 'U',
|
15
16
|
U: 'U',
|
16
17
|
unknown: 'U',
|
17
|
-
Unknown: '
|
18
|
+
Unknown: 'U'
|
18
19
|
}.freeze
|
19
20
|
|
21
|
+
def self.convert_to_gender(value)
|
22
|
+
case value.to_s
|
23
|
+
when /^[Ff]/
|
24
|
+
'F'
|
25
|
+
when /^[Mm]/
|
26
|
+
'M'
|
27
|
+
else
|
28
|
+
'U'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
20
32
|
module TableDefinition
|
21
33
|
def gender(*args, **opts)
|
22
34
|
args.each do |name|
|
@@ -25,31 +37,10 @@ module BetterRecord
|
|
25
37
|
end
|
26
38
|
end
|
27
39
|
|
28
|
-
class Type <
|
29
|
-
|
30
|
-
|
31
|
-
convert_to_gender(value)
|
32
|
-
end
|
33
|
-
|
34
|
-
def deserialize(value)
|
35
|
-
super(convert_to_gender(value))
|
36
|
-
end
|
37
|
-
|
38
|
-
def serialize(value)
|
39
|
-
super(convert_to_gender(value))
|
40
|
+
class Type < BetterRecord::CustomType
|
41
|
+
def self.normalize_type_value(value)
|
42
|
+
BetterRecord::Gender.convert_to_gender(value)
|
40
43
|
end
|
41
|
-
|
42
|
-
private
|
43
|
-
def convert_to_gender(value)
|
44
|
-
case value.to_s
|
45
|
-
when /[Ff]/
|
46
|
-
'F'
|
47
|
-
when /[Mm]/
|
48
|
-
'M'
|
49
|
-
else
|
50
|
-
'U'
|
51
|
-
end
|
52
|
-
end
|
53
44
|
end
|
54
45
|
end
|
55
46
|
end
|
data/lib/better_record/jwt.rb
CHANGED
@@ -3,6 +3,20 @@ require 'store_as_int'
|
|
3
3
|
|
4
4
|
module BetterRecord
|
5
5
|
module MoneyInteger
|
6
|
+
def self.convert_to_money(value)
|
7
|
+
return StoreAsInt::Money.new(0) unless value
|
8
|
+
if (!value.kind_of?(Numeric))
|
9
|
+
begin
|
10
|
+
dollars_to_cents = (value.gsub(/\$/, '').presence || 0).to_d * StoreAsInt::Money.base
|
11
|
+
StoreAsInt::Money.new(dollars_to_cents.to_i)
|
12
|
+
rescue
|
13
|
+
StoreAsInt::Money.new
|
14
|
+
end
|
15
|
+
else
|
16
|
+
StoreAsInt::Money.new(value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
6
20
|
module TableDefinition
|
7
21
|
def money_integer(*args, **opts)
|
8
22
|
args.each do |name|
|
@@ -11,33 +25,14 @@ module BetterRecord
|
|
11
25
|
end
|
12
26
|
end
|
13
27
|
|
14
|
-
class Type <
|
15
|
-
def
|
16
|
-
convert_to_money(value)
|
28
|
+
class Type < BetterRecord::CustomType
|
29
|
+
def self.normalize_type_value(value)
|
30
|
+
BetterRecord::MoneyInteger.convert_to_money(value)
|
17
31
|
end
|
18
32
|
|
19
|
-
def
|
20
|
-
|
33
|
+
def self.serialize(value)
|
34
|
+
normalize_type_value(value).value
|
21
35
|
end
|
22
|
-
|
23
|
-
def serialize(value)
|
24
|
-
super(convert_to_money(value).value)
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
def convert_to_money(value)
|
29
|
-
return StoreAsInt::Money.new(0) unless value
|
30
|
-
if (!value.kind_of?(Numeric))
|
31
|
-
begin
|
32
|
-
dollars_to_cents = (value.gsub(/\$/, '').presence || 0).to_d * StoreAsInt::Money.base
|
33
|
-
StoreAsInt::Money.new(dollars_to_cents.to_i)
|
34
|
-
rescue
|
35
|
-
StoreAsInt::Money.new
|
36
|
-
end
|
37
|
-
else
|
38
|
-
StoreAsInt::Money.new(value)
|
39
|
-
end
|
40
|
-
end
|
41
36
|
end
|
42
37
|
end
|
43
38
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module BetterRecord
|
5
|
+
module ThreeState
|
6
|
+
ENUM = {
|
7
|
+
Y: 'Y',
|
8
|
+
y: 'Y',
|
9
|
+
Yes: 'Y',
|
10
|
+
yes: 'Y',
|
11
|
+
T: 'Y',
|
12
|
+
t: 'Y',
|
13
|
+
True: 'Y',
|
14
|
+
true: 'Y',
|
15
|
+
true => 'Y',
|
16
|
+
N: 'N',
|
17
|
+
n: 'N',
|
18
|
+
No: 'N',
|
19
|
+
no: 'N',
|
20
|
+
F: 'N',
|
21
|
+
f: 'N',
|
22
|
+
False: 'N',
|
23
|
+
false: 'N',
|
24
|
+
false => 'N',
|
25
|
+
U: 'U',
|
26
|
+
u: 'U',
|
27
|
+
Unknown: 'U',
|
28
|
+
unknown: 'U',
|
29
|
+
}.freeze
|
30
|
+
|
31
|
+
TITLECASE = {
|
32
|
+
'Y' => 'Yes',
|
33
|
+
'N' => 'No',
|
34
|
+
'U' => 'Unknown',
|
35
|
+
}.freeze
|
36
|
+
|
37
|
+
def self.titleize(category)
|
38
|
+
TITLECASE[convert_to_three_state(category) || 'U']
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.convert_to_three_state(value)
|
42
|
+
case value.to_s.downcase
|
43
|
+
when /^(?:y|t(rue)?$)/
|
44
|
+
'Y'
|
45
|
+
when /^(?:n|f(alse)?$)/
|
46
|
+
'N'
|
47
|
+
else
|
48
|
+
'U'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module TableDefinition
|
53
|
+
def three_state(*args, **opts)
|
54
|
+
args.each do |name|
|
55
|
+
column name, :three_state, **opts
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Type < BetterRecord::CustomType
|
61
|
+
def self.normalize_type_value(value)
|
62
|
+
BetterRecord::ThreeState.convert_to_three_state(value)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
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.
|
4
|
+
version: 0.21.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sampson Crowley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -251,6 +251,7 @@ files:
|
|
251
251
|
- config/initializers/active_record/exchange_rate_integer_type.rb
|
252
252
|
- config/initializers/active_record/gender_type.rb
|
253
253
|
- config/initializers/active_record/money_integer_type.rb
|
254
|
+
- config/initializers/active_record/three_state_type.rb
|
254
255
|
- config/initializers/active_support/time_with_zone.rb
|
255
256
|
- config/initializers/concerns.rb
|
256
257
|
- config/initializers/core_ext/date.rb
|
@@ -272,6 +273,7 @@ files:
|
|
272
273
|
- db/migrate/20190123225641_add_exchange_rate_integer_type.rb
|
273
274
|
- db/migrate/20190209033946_update_better_record_audit_functions.rb
|
274
275
|
- db/migrate/20190209195134_audit_trigger_v3.rb
|
276
|
+
- db/migrate/20190416215152_add_three_state_boolean_type.rb
|
275
277
|
- db/postgres-audit-trigger.psql
|
276
278
|
- db/postgres-audit-v2-table.psql
|
277
279
|
- db/postgres-audit-v2-trigger.psql
|
@@ -290,6 +292,7 @@ files:
|
|
290
292
|
- lib/better_record/concerns/controllers/authenticatable.rb
|
291
293
|
- lib/better_record/concerns/controllers/sessionable.rb
|
292
294
|
- lib/better_record/concerns/controllers/uploadable.rb
|
295
|
+
- lib/better_record/custom_type.rb
|
293
296
|
- lib/better_record/encoder.rb
|
294
297
|
- lib/better_record/engine.rb
|
295
298
|
- lib/better_record/exchange_rate_integer.rb
|
@@ -311,6 +314,7 @@ files:
|
|
311
314
|
- lib/better_record/rspec/extensions/required_column.rb
|
312
315
|
- lib/better_record/tasks/better_record/install.rake
|
313
316
|
- lib/better_record/tasks/spec/attributes.rake
|
317
|
+
- lib/better_record/three_state.rb
|
314
318
|
- lib/better_record/version.rb
|
315
319
|
- lib/core_ext/array.rb
|
316
320
|
- lib/core_ext/boolean.rb
|