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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87be3ec376e667eade78445c2f216bd623e854a0b964cd8584e91dc0c3147daf
4
- data.tar.gz: dbdb4945a8dbcf3d98ca030c8b2e0310dc71a596c90289db79f17fc87b6bf33f
3
+ metadata.gz: 9dc9a42cf9a09d230c0793e2d6561c8bb827d7d41e606223300596109ffdc709
4
+ data.tar.gz: 57fea38332475bba21425a7abf25727795e445cb1ebdb595f21e1918f8309b58
5
5
  SHA512:
6
- metadata.gz: 04bf71457cc94a8b17528c73abca67fb7c3b0a89c15969f97d61bc371cb824572248698bbe743ae392ae9a60db4b272b1d8c47202e1c4d1f7f8eac15a65e86cf
7
- data.tar.gz: 65f90e4eba84826cbcb4066e5181862fe6b70330334a479b71d2c9cf7e9edef1182a1616e5bde9003fb9e2ab25997dda78baff1b900cc1a09b4077fda403164f
6
+ metadata.gz: 9b299259b22e7fa34cac8cffc35cffbb66ba28da90c9252b83ba1d2437bd33beed80b5036d4c64dbc6f587aeab088475d317f8dc536e6aaeadfe4a763c9f4f89
7
+ data.tar.gz: 0c5e23a2aaec21d11dbbf10eaf1db5691d053340438c63541e7cb24825a2d2f25b353bb6c89ae8c1b31cd77a9568dda81e4ca87878161e1fa6fc3627d0b43f07
@@ -46,7 +46,7 @@ module BetterRecord
46
46
  def get_hashed_string(str)
47
47
  self.class.get_hashed_string(str)
48
48
  end
49
-
49
+
50
50
  def indifferent_attributes
51
51
  attributes.with_indifferent_access
52
52
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Type.register(:money_integer, BetterRecord::MoneyInteger::Type)
@@ -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
@@ -89,6 +89,7 @@ ActiveSupport.on_load(:active_record) do
89
89
  module ConnectionAdapters
90
90
  class TableDefinition
91
91
  include BetterRecord::Gender::TableDefinition
92
+ include BetterRecord::MoneyInteger::TableDefinition
92
93
  end
93
94
  end
94
95
  end
@@ -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 = ActiveRecord::Type.registry.__send__(:registrations).find do |type|
37
- if type.matches?(row['typname'].to_sym)
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?(row['typname'])
40
- use_sym = false
54
+ elsif type.matches?(name)
41
55
  true
42
56
  end
43
- end && (use_sym ? row['typname'].to_sym : row['typname'])
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BetterRecord
4
- VERSION = '0.11.5'
4
+ VERSION = '0.12.1'
5
5
  end
@@ -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.11.5
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-13 00:00:00.000000000 Z
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/money_type.rb
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/20180518042060_create_better_record_enum_types.rb
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