better_record 0.8.2 → 0.8.3

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: 20b9f20b5d31a8e1182dd09ca27d6c09551eafa48bb1a0a722681a9194ccf85a
4
- data.tar.gz: 8b4604c103762493e13a49b13c142b31e4da585a0b4d2932025e23a1b162d3c1
3
+ metadata.gz: a112c2583da52c9e168052c349be6a9ad0abc16c95f74be580fdcc57ddddf33a
4
+ data.tar.gz: f7b4575c6d436d2a1f2e69d5f24ed356027424cc2523c6871b1710bb362cdc18
5
5
  SHA512:
6
- metadata.gz: '08ac2e82687f68237f666a8f5c4e4768dbc043cfce5ce60960ee7710827334664128e37e88d30abe4b1202aed9fb9b6f78478fe33621f37897550cc70e56ec54'
7
- data.tar.gz: ca3e3094b2133e4750d3dc9bb08d12b357ae42e894dada66c3631d857d0a9625c0ee4cf0922da71f66212e1cff12e421e2fb6c9ce369abae9c2d0cd364b74461
6
+ metadata.gz: 4703f8f2b2881d9092f199af42454b88d83f001c354b6cf751fa81d6b59d08df02d22a73c17d733e7ad30b5e6bd67554ae65ed86a433fcdc57e37aea6971c705
7
+ data.tar.gz: e05e27899557daba3b3fdf9ee3016d51e3f15747bc2b4691881328fbb9d40273f50e045a17a5db2965764636782a8baa9af4e5545317c6dec973c3e079f67247
@@ -1,6 +1,8 @@
1
1
  module BetterRecord
2
2
  class Base < ActiveRecord::Base
3
3
  self.abstract_class = true
4
+ include ModelConcerns::HasValidatedAvatar
5
+ include ModelConcerns::HasProtectedPassword
4
6
 
5
7
  # == Constants ============================================================
6
8
 
@@ -23,11 +25,16 @@ module BetterRecord
23
25
 
24
26
  # == Callbacks ============================================================
25
27
 
28
+ # == Boolean Class Methods ================================================
29
+
26
30
  # == Class Methods ========================================================
27
31
 
32
+ # == Boolean Methods ======================================================
33
+
28
34
  # == Instance Methods =====================================================
29
35
  def indifferent_attributes
30
36
  attributes.with_indifferent_access
31
37
  end
38
+
32
39
  end
33
40
  end
@@ -2,10 +2,28 @@
2
2
 
3
3
  module BetterRecord
4
4
  class Current < ActiveSupport::CurrentAttributes
5
+ # == Constants ============================================================
6
+
7
+ # == Attributes ===========================================================
5
8
  attribute :user, :ip_address
6
9
 
7
- def self.user_type
8
- BetterRecord::PolymorphicOverride.polymorphic_value(self.user.class) if self.user
10
+ # == Extensions ===========================================================
11
+
12
+ # == Relationships ========================================================
13
+
14
+ # == Validations ==========================================================
15
+
16
+ # == Scopes ===============================================================
17
+
18
+ # == Callbacks ============================================================
19
+
20
+ # == Boolean Class Methods ================================================
21
+
22
+ # == Class Methods ========================================================
23
+ def self.drop_values
24
+ self.user = nil
25
+ self.ip_address = nil
26
+ self
9
27
  end
10
28
 
11
29
  def self.set(user, ip)
@@ -14,10 +32,13 @@ module BetterRecord
14
32
  self
15
33
  end
16
34
 
17
- def self.drop_values
18
- self.user = nil
19
- self.ip_address = nil
20
- self
35
+ def self.user_type
36
+ BetterRecord::PolymorphicOverride.polymorphic_value(self.user.class) if self.user
21
37
  end
38
+
39
+ # == Boolean Methods ======================================================
40
+
41
+ # == Instance Methods =====================================================
42
+
22
43
  end
23
44
  end
@@ -21,12 +21,15 @@ module BetterRecord
21
21
  primary_type: :table_name,
22
22
  foreign_key: :row_id,
23
23
  foreign_type: :table_name
24
+
24
25
  # == Validations ==========================================================
25
26
 
26
27
  # == Scopes ===============================================================
27
28
 
28
29
  # == Callbacks ============================================================
29
30
 
31
+ # == Boolean Class Methods ================================================
32
+
30
33
  # == Class Methods ========================================================
31
34
  def self.default_print
32
35
  [
@@ -40,6 +43,8 @@ module BetterRecord
40
43
  ]
41
44
  end
42
45
 
46
+ # == Boolean Methods ======================================================
47
+
43
48
  # == Instance Methods =====================================================
44
49
  def changed_columns
45
50
  (self.changed_fields || {}).keys.join(', ').presence || 'N/A'
@@ -48,5 +53,6 @@ module BetterRecord
48
53
  def action_type
49
54
  ACTIONS[action] || 'UNKNOWN'
50
55
  end
56
+
51
57
  end
52
58
  end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+ require 'active_support/number_helper'
5
+
6
+ module BetterRecord
7
+ module ModelConcerns
8
+ module HasProtectedPassword
9
+ extend ActiveSupport::Concern
10
+
11
+ module ClassMethods
12
+ def has_protected_password(
13
+ password_field: :password,
14
+ password_validator: nil,
15
+ min_image_size: nil,
16
+ max_image_size: 500.kilobytes,
17
+ **opts
18
+ )
19
+ # == Constants ============================================================
20
+
21
+ # == Attributes ===========================================================
22
+ attribute :"new_#{password_field}", :text
23
+ attribute :"new_#{password_field}_confirmation", :text
24
+
25
+ # == Extensions ===========================================================
26
+
27
+ # == Relationships ========================================================
28
+
29
+ # == Validations ==========================================================
30
+ validate :"new_#{password_field}", :"require_#{password_field}_confirmation", if: :"new_#{password_field}?"
31
+
32
+ if password_validator
33
+ validate password_validator if :"new_#{password_field}?"
34
+ end
35
+
36
+ # == Scopes ===============================================================
37
+
38
+ # == Callbacks ============================================================
39
+
40
+ # == Boolean Class Methods ================================================
41
+
42
+ # == Class Methods ========================================================
43
+
44
+ # == Boolean Methods ======================================================
45
+
46
+ # == Instance Methods =====================================================
47
+ define_method password_field do
48
+ self[password_field]
49
+ end
50
+ private password_field
51
+
52
+ define_method :"#{password_field}=" do |value|
53
+ write_attribute password_field, value
54
+ end
55
+ private :"#{password_field}="
56
+
57
+ define_method :"require_#{password_field}_confirmation" do
58
+ tmp_new_pwd = __send__ :"new_#{password_field}"
59
+ tmp_new_confirmation = __send__ :"new_#{password_field}_confirmation"
60
+
61
+ if tmp_new_pwd.present?
62
+ if tmp_new_pwd != tmp_new_confirmation
63
+ errors.add(:"new_#{password_field}", 'Password does not match confirmation')
64
+ else
65
+ self.password = new_password
66
+ end
67
+ end
68
+ end
69
+ private :"require_#{password_field}_confirmation"
70
+
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+ require 'active_support/number_helper'
5
+
6
+ module BetterRecord
7
+ module ModelConcerns
8
+ module HasValidatedAvatar
9
+ extend ActiveSupport::Concern
10
+
11
+ module ClassMethods
12
+ def has_validated_avatar(
13
+ avatar_name: :avatar,
14
+ image_validator: :valid_image,
15
+ min_image_size: nil,
16
+ max_image_size: 500.kilobytes,
17
+ **opts
18
+ )
19
+ # == Constants ============================================================
20
+
21
+ # == Attributes ===========================================================
22
+ attribute :"new_#{avatar_name}?", :boolean
23
+
24
+ # == Extensions ===========================================================
25
+
26
+ # == Relationships ========================================================
27
+ has_one_attached :"last_#{avatar_name}"
28
+ has_one_attached avatar_name
29
+
30
+ # == Validations ==========================================================
31
+ validate avatar_name, image_validator
32
+
33
+ # == Scopes ===============================================================
34
+
35
+ # == Callbacks ============================================================
36
+ after_save :"cache_current_#{avatar_name}", if: :"new_#{avatar_name}?"
37
+
38
+ # == Boolean Class Methods ================================================
39
+
40
+ # == Class Methods ========================================================
41
+
42
+ # == Boolean Methods ======================================================
43
+
44
+ # == Instance Methods =====================================================
45
+ define_method :"attach_#{avatar_name}" do |file, **options|
46
+ __send__(avatar_name).attach(file, **options)
47
+ __send__ image_validator
48
+ end
49
+
50
+ define_method :valid_image_format do
51
+ unless __send__(avatar_name).blob.content_type.start_with? 'image/'
52
+ errors.add(avatar_name, 'is not an image file')
53
+ return false
54
+ end
55
+ true
56
+ end
57
+
58
+ define_method :valid_image_size do
59
+ if max_image_size && __send__(avatar_name).blob.byte_size > max_image_size
60
+ errors.add(avatar_name, "is too large, maximum #{ActiveSupport::NumberHelper.number_to_human_size(max_image_size)}")
61
+ return false
62
+ elsif min_image_size && __send__(avatar_name).blob.byte_size < min_image_size
63
+ errors.add(avatar_name, "is too small, minimum #{ActiveSupport::NumberHelper.number_to_human_size(min_image_size)}")
64
+ return false
65
+ end
66
+ true
67
+ end
68
+
69
+ define_method :valid_image do
70
+ return unless __send__(avatar_name).attached?
71
+
72
+ if valid_image_format && valid_image_size
73
+ __send__(:"cache_current_#{avatar_name}")
74
+ else
75
+ purge(__send__(avatar_name))
76
+ __send__(:"load_last_#{avatar_name}") if __send__(:"last_#{avatar_name}").attached?
77
+ false
78
+ end
79
+ end
80
+
81
+ define_method :"cache_current_#{avatar_name}" do
82
+ __send__ :"copy_#{avatar_name}"
83
+ end
84
+
85
+ define_method :"load_last_#{avatar_name}" do
86
+ __send__ :"copy_#{avatar_name}", :"last_#{avatar_name}", avatar_name
87
+ end
88
+
89
+ define_method :"copy_#{avatar_name}" do |from = avatar_name, to = :"last_#{avatar_name}"|
90
+ from = __send__ from
91
+ to = __send__ to
92
+
93
+ purge(to) if to.attached?
94
+
95
+ tmp = Tempfile.new
96
+ tmp.binmode
97
+ tmp.write(from.download)
98
+ tmp.flush
99
+ tmp.rewind
100
+
101
+ to.attach(io: tmp, filename: from.filename, content_type: from.content_type)
102
+ tmp.close
103
+ true
104
+ end
105
+
106
+ end
107
+ end
108
+
109
+ end
110
+ end
111
+ end
@@ -48,6 +48,8 @@ module BetterRecord
48
48
  default_scope { where(schema: [ :public ]) }
49
49
  # == Callbacks ============================================================
50
50
 
51
+ # == Boolean Class Methods ================================================
52
+
51
53
  # == Class Methods ========================================================
52
54
  def self.find_by(*args)
53
55
  reload_data
@@ -72,6 +74,8 @@ module BetterRecord
72
74
  # ]
73
75
  # end
74
76
 
77
+ # == Boolean Methods ======================================================
78
+
75
79
  # == Instance Methods =====================================================
76
80
  def changed_columns
77
81
  (self.changed_fields || {}).keys.join(', ').presence || 'N/A'
@@ -118,8 +118,6 @@ module BetterRecord
118
118
  end
119
119
  end
120
120
 
121
-
122
- # == Instance Methods =====================================================
123
121
  def queue_adapter_inline?
124
122
  self.class.queue_adapter_inline?
125
123
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BetterRecord
4
- VERSION = '0.8.2'
4
+ VERSION = '0.8.3'
5
5
  end
@@ -15,6 +15,8 @@ module Current
15
15
 
16
16
  # == Callbacks ============================================================
17
17
 
18
+ # == Boolean Class Methods ================================================
19
+
18
20
  # == Class Methods ========================================================
19
21
 
20
22
  def self.user
@@ -45,6 +47,8 @@ module Current
45
47
  BetterRecord::Current.drop_values
46
48
  end
47
49
 
50
+ # == Boolean Methods ======================================================
51
+
48
52
  # == Instance Methods =====================================================
49
53
 
50
54
  end
@@ -25,8 +25,12 @@ class <%= class_name %> < <%= parent_class_name.classify %>
25
25
 
26
26
  # == Callbacks ============================================================
27
27
 
28
+ # == Boolean Class Methods ================================================
29
+
28
30
  # == Class Methods ========================================================
29
31
 
32
+ # == Boolean Methods ======================================================
33
+
30
34
  # == Instance Methods =====================================================
31
35
 
32
36
  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.8.2
4
+ version: 0.8.3
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-08-23 00:00:00.000000000 Z
11
+ date: 2018-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -239,6 +239,8 @@ files:
239
239
  - app/models/better_record/base.rb
240
240
  - app/models/better_record/current.rb
241
241
  - app/models/better_record/logged_action.rb
242
+ - app/models/better_record/model_concerns/has_protected_password.rb
243
+ - app/models/better_record/model_concerns/has_validated_avatar.rb
242
244
  - app/models/better_record/table_size.rb
243
245
  - app/views/better_record/table_sizes/index.html.erb
244
246
  - app/views/better_record/table_sizes/show.html.erb