choron_support 0.1.6 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -1
- data/Gemfile.lock +1 -1
- data/README.md +7 -0
- data/lib/choron_support/as_props.rb +6 -1
- data/lib/choron_support/domain_delegate.rb +6 -26
- data/lib/choron_support/set_mask_for.rb +77 -0
- data/lib/choron_support/version.rb +1 -1
- data/lib/choron_support.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e930829f733348afe1938ef857477f85bcc15695e67a31a491e50cd65cb3cc42
|
4
|
+
data.tar.gz: 41287fc1cdd25345988f03b2ba780e777e8d478413e7f78a907b7931ad362535
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 426090be576fe116a04f6c939c89741868dd5b0b38e495d0fd6b1d613f02af280b8ac6046b0123504323fe2cbb6f7b938e6742863d7dc594626eb4436ccf38a4
|
7
|
+
data.tar.gz: fb03ba53c19263bffcb80b3aad9853c87cffd53410a8c3246b512625ca549fa7af15ec618ce2fca50d32a055a5fd92572b61fd8cc5e48008a51542b2ad71f476
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -72,6 +72,13 @@ user = User.find(1).as_props
|
|
72
72
|
#=> { id: 1, name: "tanaka tarou" }
|
73
73
|
```
|
74
74
|
|
75
|
+
### Mask
|
76
|
+
|
77
|
+
モデルに対してマスク処理をかけ、セキュリティを強くするための仕組みです。
|
78
|
+
|
79
|
+
* 詳細な使い方は [テストファイル](./spec/choron_support/set_mask_for_spec.rb) を参照ください。
|
80
|
+
* 詳細な実装は [こちら](./lib/choron_support/set_mask_for.rb) です。
|
81
|
+
|
75
82
|
### Domain
|
76
83
|
|
77
84
|
* TODO
|
@@ -45,8 +45,13 @@ module ChoronSupport
|
|
45
45
|
|
46
46
|
props_class.new(self)
|
47
47
|
rescue *rescue_errors
|
48
|
-
|
48
|
+
# もしmodelを指定しているときはnilを返し、as_jsonを利用させる
|
49
|
+
if type_symbol == :model
|
49
50
|
return nil
|
51
|
+
end
|
52
|
+
|
53
|
+
if type_symbol.blank?
|
54
|
+
raise ChoronSupport::AsProps::NameError, "Props class not found: #{props_class_name}. Please create props class."
|
50
55
|
else
|
51
56
|
raise ChoronSupport::AsProps::NameError, "Props class not found: #{props_class_name}. Got type symbol: #{type_symbol}."
|
52
57
|
end
|
@@ -6,19 +6,7 @@ module ChoronSupport
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
|
-
|
10
|
-
|
11
|
-
# Forwardable が ActiveSupport#delegate を上書きしてしまうため、間違って使ったときのためエラーをraiseするようにしています
|
12
|
-
def self.delegate(*params, **keyparams)
|
13
|
-
# delegate :hoge, to: :fuga という形で呼び出された場合は、エラーをraiseする
|
14
|
-
if keyparams[:to].present?
|
15
|
-
raise DelegationError, "ActiveSupport#delegate is not usable. Please use Forwardable#delegate.\n@example\n delegate size: :array"
|
16
|
-
else
|
17
|
-
super
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# QueryオブジェクトパターンをEasyに使うためのクラスメソッドです
|
9
|
+
# 処理を別クラスに委任する設定をEasyに使うためのクラスメソッドです
|
22
10
|
# @param [Symbol] method_name Modelに定義されるメソッド名
|
23
11
|
# @param [Choron::Domains::Base] option domain Domainクラスを文字列で直接指定することができます。シンボルを渡すとクラス化を自動で行います。デフォルトはnilです。
|
24
12
|
# @param [Symbol] option domain_to_method 委譲先のDomainクラスの呼び出しメソッドを指定できます。デフォルトは :call です
|
@@ -60,7 +48,9 @@ module ChoronSupport
|
|
60
48
|
# ドメインオブジェクトにデリゲートさせます
|
61
49
|
# 例: def_delegator :__domains_users_purchase_object__, :call, :purchase
|
62
50
|
# purchase メソッドを __domains_xxx__ の call メソッドにデリゲートする
|
63
|
-
|
51
|
+
define_method(method_symbol) do |*args, **keyparams, &block|
|
52
|
+
send(domain_object_method_name).send(to, *args, **keyparams, &block)
|
53
|
+
end
|
64
54
|
end
|
65
55
|
|
66
56
|
# domain_delegate とほぼ同じ動きですが、こちらはクラスメソッドをデリゲートするものです。
|
@@ -88,18 +78,8 @@ module ChoronSupport
|
|
88
78
|
def self.class_domain_delegate(method_symbol, specific: true, class_name: nil, to: :call)
|
89
79
|
domain_class = __generate_choron_domain_class(method_symbol, specific, class_name)
|
90
80
|
|
91
|
-
|
92
|
-
|
93
|
-
case [!params.empty?, !keyparams.empty?]
|
94
|
-
when [true, true]
|
95
|
-
domain_class.new(self).send(to, *params, **keyparams)
|
96
|
-
when [true, false]
|
97
|
-
domain_class.new(self).send(to, *params)
|
98
|
-
when [false, true]
|
99
|
-
domain_class.new(self).send(to, **keyparams)
|
100
|
-
else
|
101
|
-
domain_class.new(self).send(to)
|
102
|
-
end
|
81
|
+
define_singleton_method(method_symbol) do |*params, **keyparams, &block|
|
82
|
+
domain_class.new(self).send(to, *params, **keyparams, &block)
|
103
83
|
end
|
104
84
|
end
|
105
85
|
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module ChoronSupport
|
2
|
+
module SetMaskFor
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
class NameError < StandardError; end
|
6
|
+
class CanNotMaskError < StandardError; end
|
7
|
+
|
8
|
+
WITH_OUT_MASK_FLAG_VARIABLE_NAME = :__choron_with_out_mask_flag__
|
9
|
+
MASKING_VALUES = { string: "****", else: nil }.freeze
|
10
|
+
|
11
|
+
included do
|
12
|
+
def self.set_mask_for(*method_symbols, condition: nil)
|
13
|
+
method_symbols.each do |method_symbol|
|
14
|
+
self.instance_eval { private attr_accessor WITH_OUT_MASK_FLAG_VARIABLE_NAME }
|
15
|
+
define_method(method_symbol) do
|
16
|
+
origin = super()
|
17
|
+
|
18
|
+
# そもそも元の値がnilの場合はそのまま返し、validation等の妨げにならないようにしています
|
19
|
+
return nil if origin.nil?
|
20
|
+
|
21
|
+
type = :else
|
22
|
+
case origin
|
23
|
+
when String
|
24
|
+
type = :string
|
25
|
+
end
|
26
|
+
|
27
|
+
if without_mask?
|
28
|
+
origin
|
29
|
+
else
|
30
|
+
# 型によってマスクする値を変えています
|
31
|
+
MASKING_VALUES[type]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# マスクの値に関係なく元の値を取得するためのメソッドです。
|
36
|
+
define_method("danger_without_mask_#{method_symbol}") do
|
37
|
+
val = nil
|
38
|
+
self.without_mask do |model|
|
39
|
+
val = model.send(method_symbol)
|
40
|
+
end
|
41
|
+
val
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
unless method_defined?(:danger_without_mask!)
|
46
|
+
define_method(:danger_without_mask!) do
|
47
|
+
send("#{WITH_OUT_MASK_FLAG_VARIABLE_NAME}=", true)
|
48
|
+
|
49
|
+
self
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
unless method_defined?(:without_mask)
|
54
|
+
define_method(:without_mask) do |&block|
|
55
|
+
self.danger_without_mask!
|
56
|
+
block.call(self)
|
57
|
+
self.wear_mask
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
unless method_defined?(:wear_mask)
|
62
|
+
define_method(:wear_mask) do
|
63
|
+
send("#{WITH_OUT_MASK_FLAG_VARIABLE_NAME}=", false)
|
64
|
+
|
65
|
+
self
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
unless method_defined?(:without_mask?)
|
70
|
+
define_method(:without_mask?) do
|
71
|
+
!!send(WITH_OUT_MASK_FLAG_VARIABLE_NAME)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/lib/choron_support.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: choron_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mksava
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -211,6 +211,7 @@ files:
|
|
211
211
|
- lib/choron_support/props/ext/relation.rb
|
212
212
|
- lib/choron_support/queries/base.rb
|
213
213
|
- lib/choron_support/scope_query.rb
|
214
|
+
- lib/choron_support/set_mask_for.rb
|
214
215
|
- lib/choron_support/version.rb
|
215
216
|
- sig/choron_support.rbs
|
216
217
|
- tmp/.keep
|