better_record 0.11.5 → 0.12.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 +4 -4
- data/app/models/better_record/base.rb +1 -1
- data/config/initializers/active_record/money_integer_type.rb +3 -0
- data/db/migrate/20180518042060_create_better_record_custom_types.rb +29 -0
- data/lib/better_record.rb +1 -0
- data/lib/better_record/concerns/active_record_extensions/connection_adapter_extensions.rb +22 -9
- data/lib/better_record/money_integer.rb +43 -0
- data/lib/better_record/version.rb +1 -1
- data/lib/core_ext/array.rb +12 -0
- metadata +5 -4
- data/config/initializers/active_record/money_type.rb +0 -33
- data/db/migrate/20180518042060_create_better_record_enum_types.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9dc9a42cf9a09d230c0793e2d6561c8bb827d7d41e606223300596109ffdc709
|
4
|
+
data.tar.gz: 57fea38332475bba21425a7abf25727795e445cb1ebdb595f21e1918f8309b58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b299259b22e7fa34cac8cffc35cffbb66ba28da90c9252b83ba1d2437bd33beed80b5036d4c64dbc6f587aeab088475d317f8dc536e6aaeadfe4a763c9f4f89
|
7
|
+
data.tar.gz: 0c5e23a2aaec21d11dbbf10eaf1db5691d053340438c63541e7cb24825a2d2f25b353bb6c89ae8c1b31cd77a9568dda81e4ca87878161e1fa6fc3627d0b43f07
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class CreateBetterRecordCustomTypes < 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
|
+
execute <<-SQL
|
14
|
+
DO $$
|
15
|
+
BEGIN
|
16
|
+
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'money_integer') THEN
|
17
|
+
CREATE DOMAIN money_integer AS INTEGER NOT NULL DEFAULT 0;
|
18
|
+
END IF;
|
19
|
+
END
|
20
|
+
$$;
|
21
|
+
SQL
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def down
|
26
|
+
execute "DROP DOMAIN IF EXISTS money_integer;"
|
27
|
+
execute "DROP TYPE IF EXISTS gender;"
|
28
|
+
end
|
29
|
+
end
|
data/lib/better_record.rb
CHANGED
@@ -27,23 +27,36 @@ module ActiveRecord
|
|
27
27
|
|
28
28
|
class TypeMapInitializer # :nodoc:
|
29
29
|
private
|
30
|
+
def register_domain_type(row)
|
31
|
+
if (in_reg = check_registry(row['typname']))
|
32
|
+
register row['oid'], ActiveRecord::Type.registry.lookup(in_reg.send :name)
|
33
|
+
elsif base_type = @store.lookup(row["typbasetype"].to_i)
|
34
|
+
register row["oid"], base_type
|
35
|
+
else
|
36
|
+
warn "unknown base type (OID: #{row["typbasetype"]}) for domain #{row["typname"]}."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
30
40
|
def register_enum_type(row)
|
31
|
-
use_sym = true
|
32
41
|
enum_val = OID::Enum.new
|
33
42
|
enum_val.value_array = row['enumlabel'][1..-2].split(',').presence
|
34
43
|
enum_val.value_array.map!(&:to_i) if enum_val.value_array.all? {|v| v =~ /^[0-9]+$/}
|
35
44
|
|
36
|
-
enum_val.type_override =
|
37
|
-
|
45
|
+
enum_val.type_override = (val = check_registry(row['typname'])) && val.__send__(:name)
|
46
|
+
|
47
|
+
register row["oid"], enum_val
|
48
|
+
end
|
49
|
+
|
50
|
+
def check_registry(name)
|
51
|
+
ActiveRecord::Type.registry.__send__(:registrations).find do |type|
|
52
|
+
if type.matches?(name.to_sym)
|
38
53
|
true
|
39
|
-
elsif type.matches?(
|
40
|
-
use_sym = false
|
54
|
+
elsif type.matches?(name)
|
41
55
|
true
|
42
56
|
end
|
43
|
-
end
|
44
|
-
|
45
|
-
register row["oid"], enum_val
|
57
|
+
end
|
46
58
|
end
|
59
|
+
|
47
60
|
end
|
48
61
|
end
|
49
62
|
end
|
@@ -75,7 +88,7 @@ module ActiveRecord
|
|
75
88
|
end
|
76
89
|
|
77
90
|
if supports_ranges?
|
78
|
-
query += "GROUP BY 1,2,3,4,5,6,7,8"
|
91
|
+
query += " GROUP BY 1,2,3,4,5,6,7,8"
|
79
92
|
end
|
80
93
|
|
81
94
|
execute_and_clear(query, "SCHEMA", []) do |records|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'store_as_int'
|
3
|
+
|
4
|
+
module BetterRecord
|
5
|
+
module MoneyInteger
|
6
|
+
module TableDefinition
|
7
|
+
def money_integer(*args, **opts)
|
8
|
+
args.each do |name|
|
9
|
+
column name, :money_integer, **opts
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Type < ActiveRecord::Type::Value
|
15
|
+
def cast(value)
|
16
|
+
convert_to_money(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
def deserialize(value)
|
20
|
+
super(convert_to_money(value))
|
21
|
+
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 * 100
|
33
|
+
StoreAsInt.money(dollars_to_cents.to_i)
|
34
|
+
rescue
|
35
|
+
StoreAsInt::Money.new
|
36
|
+
end
|
37
|
+
else
|
38
|
+
StoreAsInt.money(value)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/core_ext/array.rb
CHANGED
@@ -6,4 +6,16 @@ class Array
|
|
6
6
|
each {|v| hashed[v] = v.to_s}
|
7
7
|
hashed
|
8
8
|
end
|
9
|
+
|
10
|
+
def extract!
|
11
|
+
return to_enum(:extract!) { size } unless block_given?
|
12
|
+
|
13
|
+
extracted_elements = []
|
14
|
+
|
15
|
+
reject! do |element|
|
16
|
+
extracted_elements << element if yield(element)
|
17
|
+
end
|
18
|
+
|
19
|
+
extracted_elements
|
20
|
+
end
|
9
21
|
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.12.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-09-
|
11
|
+
date: 2018-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -246,7 +246,7 @@ files:
|
|
246
246
|
- app/views/better_record/table_sizes/show.html.erb
|
247
247
|
- app/views/layouts/better_record/application.html.erb
|
248
248
|
- config/initializers/active_record/gender_type.rb
|
249
|
-
- config/initializers/active_record/
|
249
|
+
- config/initializers/active_record/money_integer_type.rb
|
250
250
|
- config/initializers/concerns.rb
|
251
251
|
- config/initializers/core_ext/date.rb
|
252
252
|
- config/initializers/core_ext/integer.rb
|
@@ -259,7 +259,7 @@ files:
|
|
259
259
|
- config/initializers/redis_store.rb
|
260
260
|
- config/routes.rb
|
261
261
|
- db/migrate/20180518042050_create_better_record_db_functions.rb
|
262
|
-
- db/migrate/
|
262
|
+
- db/migrate/20180518042060_create_better_record_custom_types.rb
|
263
263
|
- db/migrate/20180518042070_create_better_record_table_sizes.rb
|
264
264
|
- db/postgres-audit-trigger.psql
|
265
265
|
- lib/better_record.rb
|
@@ -282,6 +282,7 @@ files:
|
|
282
282
|
- lib/better_record/inject_methods.rb
|
283
283
|
- lib/better_record/jwt.rb
|
284
284
|
- lib/better_record/migration.rb
|
285
|
+
- lib/better_record/money_integer.rb
|
285
286
|
- lib/better_record/polymorphic_override.rb
|
286
287
|
- lib/better_record/railtie.rb
|
287
288
|
- lib/better_record/relation.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class MoneyType < ActiveRecord::Type::Value
|
4
|
-
def cast(value)
|
5
|
-
convert_to_money(value)
|
6
|
-
end
|
7
|
-
|
8
|
-
def deserialize(value)
|
9
|
-
super(convert_to_money(value))
|
10
|
-
end
|
11
|
-
|
12
|
-
def serialize(value)
|
13
|
-
new_val = convert_to_money(value)
|
14
|
-
super(new_val ? new_val.value : nil)
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
def convert_to_money(value)
|
19
|
-
return nil unless value
|
20
|
-
if (!value.kind_of?(Numeric))
|
21
|
-
begin
|
22
|
-
dollars_to_cents = (value.gsub(/\$/, '').presence || 0).to_d * 100
|
23
|
-
StoreAsInt.money(dollars_to_cents.to_i)
|
24
|
-
rescue
|
25
|
-
StoreAsInt::Money.new
|
26
|
-
end
|
27
|
-
else
|
28
|
-
StoreAsInt.money(value)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
ActiveRecord::Type.register(:money_column, MoneyType)
|
@@ -1,18 +0,0 @@
|
|
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
|