choron_support 0.1.6 → 0.1.8

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: 40ef4a2eb00c8d0c4b5d5066eaa7e31cac622c334db5c5cb3d1e1148f911459a
4
- data.tar.gz: 16cc0ae3bebfd84c59c719b979ef64ded66576345252a33370ddb44f24216504
3
+ metadata.gz: e930829f733348afe1938ef857477f85bcc15695e67a31a491e50cd65cb3cc42
4
+ data.tar.gz: 41287fc1cdd25345988f03b2ba780e777e8d478413e7f78a907b7931ad362535
5
5
  SHA512:
6
- metadata.gz: e513dd0ba14ca1df5a4a845885e5b5e0125f47ca568c338ae4f38c6b39ff1e55a21be17ff4cdf8d57994224827ff91d40db8de37ab39e8ab902343188229f65f
7
- data.tar.gz: c3a527888d13b32efcff166c0af46352c3e57d604837ed86f2c09d5aa2db7482f45ade6004f923887181f31f12da9e3668ae8df648ad5117d7509fd8569c7f9d
6
+ metadata.gz: 426090be576fe116a04f6c939c89741868dd5b0b38e495d0fd6b1d613f02af280b8ac6046b0123504323fe2cbb6f7b938e6742863d7dc594626eb4436ccf38a4
7
+ data.tar.gz: fb03ba53c19263bffcb80b3aad9853c87cffd53410a8c3246b512625ca549fa7af15ec618ce2fca50d32a055a5fd92572b61fd8cc5e48008a51542b2ad71f476
data/CHANGELOG.md CHANGED
@@ -2,4 +2,14 @@
2
2
 
3
3
  ## [0.1.0] - 2022-12-04
4
4
 
5
- - Initial release
5
+ * Initial release
6
+
7
+ ## [0.1.8] - 2023-06-04
8
+
9
+ ### `as_props`
10
+
11
+ * もしPropsクラスが見つからなかった場合にエラーをraiseするように修正
12
+
13
+ ### `set_mask_for`
14
+
15
+ * マスク処理のAPIを提供開始
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- choron_support (0.1.6)
4
+ choron_support (0.1.8)
5
5
  activesupport
6
6
 
7
7
  GEM
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
- if type_symbol.blank?
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
- extend Forwardable
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
- def_delegator domain_object_method_name, to, method_symbol
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
- define_singleton_method(method_symbol) do |*params, **keyparams|
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ChoronSupport
4
- VERSION = "0.1.6"
4
+ VERSION = "0.1.8"
5
5
  end
@@ -6,6 +6,7 @@ module ChoronSupport
6
6
  queries: "choron_support/scope_query",
7
7
  forms: "choron_support/build_form",
8
8
  props: "choron_support/as_props",
9
+ masks: "choron_support/set_mask_for",
9
10
  }
10
11
  private_constant :SUPPORT_FILES
11
12
 
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.6
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-04-04 00:00:00.000000000 Z
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