better_record 0.20.2 → 0.21.2

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