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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ca398ddfa56296c0537b21aa7c83b003a74c507c59dcc1485746c9779f86102
4
- data.tar.gz: f74f6161b0289e13d2c3782da0c76f97dd3d133196d5d3f32d077dac303ac8af
3
+ metadata.gz: 521ff1e0cbdf88a48e82d12f5c2fa5f209f69713cac846119d04a8c251fc6395
4
+ data.tar.gz: 19a85f7f166cd00068d4798917223ec4780178a08bb7734d700d146e0742c193
5
5
  SHA512:
6
- metadata.gz: d3c8c042446cbd69db0e8bb546db34d813877141eb33159ad0db07304875ec48579848ad5fd32c829a6406c0c58014740c47987b76937a61785c0f43865b680f
7
- data.tar.gz: 77eee27b978463e0a80fee412c1ac2d2bca757fdab7c33c9fbcaa14d8de90b1a9f75da8af0873462e8f58a26047ad04a43ddb624ce9a44a42499ddd1d0a5398d
6
+ metadata.gz: f4d05dad7c7fb940210c0dd227de208376f56433aa7e9135979253c128307bc6a35b135f09df258299f7ddf31f550306c4f9747f6e48e336cf630b0bfe1725d0
7
+ data.tar.gz: 1fdfcac88985fc30d470377deed92feb8f696ca765cc6ec37ee330a1f45a4e34654ae7bfe0570439ddd90f5f343a57411b764102a709b176ae466f50a08d6464
@@ -187,10 +187,8 @@ module BetterRecord
187
187
  define_method :reloaded_record do
188
188
  self.class.find_by(id: self.id)
189
189
  end
190
-
191
190
  end
192
191
  end
193
-
194
192
  end
195
193
  end
196
194
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Type.register(:three_state, BetterRecord::ThreeState::Type)
@@ -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
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module BetterRecord
@@ -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'], ActiveRecord::Type.registry.lookup(in_reg.send :name)
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
- enum_val.type_override = (val = check_registry(row['typname'])) && val.__send__(:name)
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
- register row["oid"], enum_val
51
+ register row["oid"], enum_val
52
+ end
48
53
  end
49
54
 
50
55
  def check_registry(name)
51
- ActiveRecord::Type.registry.__send__(:registrations).find do |type|
52
- if type.matches?(name.to_sym)
53
- true
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
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module BetterRecord
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module BetterRecord
@@ -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 < ActiveRecord::Type::Value
15
- def cast(value)
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
- super(convert_to_exchange_rate(value).value)
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
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module BetterRecord
@@ -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: 'F'
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 < ActiveRecord::Type::Value
29
-
30
- def cast(value)
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
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'jwt'
@@ -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 < ActiveRecord::Type::Value
15
- def cast(value)
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 deserialize(value)
20
- super(convert_to_money(value))
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BetterRecord
4
- VERSION = '0.20.2'
4
+ VERSION = '0.21.2'
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.20.2
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-03 00:00:00.000000000 Z
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