better_record 0.11.5 → 0.12.1

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