choron_support 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +44 -1
- data/lib/choron_support/as_props.rb +10 -2
- data/lib/choron_support/domain_delegate.rb +74 -8
- data/lib/choron_support/helper.rb +9 -3
- data/lib/choron_support/queries/base.rb +1 -1
- data/lib/choron_support/scope_query.rb +1 -1
- data/lib/choron_support/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5aec7e221e4fc870c2cd989203b23d977c361a55830d4f3ec54732254ef9d68c
|
4
|
+
data.tar.gz: 7ce392003f8f967ac35019e436dd29230a36d1b2232c5676b98f86820535fcb9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a1eb4b85d33c2e40060b1b4d9941f432a06ba034dc6f8dee696817969bb4da9b7456ceac7be5bce90ce090ffd02e995c593587f0894bfd0f7645017d777b496
|
7
|
+
data.tar.gz: 7f88d5b647058c03b70f0e95fb02df0b757ea11c2c5c2493a9da4346c876d81713e4c3a7576514c03a9471f5e27f31e1a9eb56febe3aeb5353cefa5e44132148
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -27,7 +27,50 @@ ChoronSupport.using :all
|
|
27
27
|
|
28
28
|
### AsProps
|
29
29
|
|
30
|
-
|
30
|
+
`#as_props` はオブジェクトやモデルをhashに変換するものです。
|
31
|
+
|
32
|
+
名前の `props` の由来は `React` からきています。
|
33
|
+
由来の通り、RailsからJS側へ値を渡す際にオブジェクトをJSON化するために作られました。
|
34
|
+
|
35
|
+
#### 使い方
|
36
|
+
|
37
|
+
* ActiveRecord
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
class User < ApplicationRecord
|
41
|
+
include ChoronSupport::AsProps
|
42
|
+
# id: bigint
|
43
|
+
# name: string
|
44
|
+
end
|
45
|
+
|
46
|
+
# ActiveRecordから利用
|
47
|
+
User.new.as_props
|
48
|
+
#=> { id: nil, name: nil }
|
49
|
+
|
50
|
+
User.create(id: 1, name: "tarou")
|
51
|
+
|
52
|
+
User.find(1).as_props
|
53
|
+
#=> { id: 1, name: "tarou" }
|
54
|
+
|
55
|
+
# ActiveRecord::Relationからでも利用できます
|
56
|
+
users = User.all.as_props
|
57
|
+
#=> [
|
58
|
+
# { id: 1, name: "tarou" },
|
59
|
+
# ]
|
60
|
+
|
61
|
+
class Props::User < ChoronSupport::Props::Base
|
62
|
+
def as_props
|
63
|
+
model
|
64
|
+
.as_json
|
65
|
+
.merge(
|
66
|
+
name: "tanaka #{model.name}"
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
user = User.find(1).as_props
|
72
|
+
#=> { id: 1, name: "tanaka tarou" }
|
73
|
+
```
|
31
74
|
|
32
75
|
### Domain
|
33
76
|
|
@@ -7,7 +7,7 @@ module ChoronSupport
|
|
7
7
|
serializer = self.__get_props_class(type_symbol, **params)
|
8
8
|
|
9
9
|
if serializer.nil?
|
10
|
-
|
10
|
+
self.as_json
|
11
11
|
else
|
12
12
|
serializer.as_props(**params)
|
13
13
|
end
|
@@ -38,9 +38,17 @@ module ChoronSupport
|
|
38
38
|
props_class = props_class_name.constantize
|
39
39
|
|
40
40
|
props_class.new(self)
|
41
|
-
rescue
|
41
|
+
rescue *rescue_errors
|
42
42
|
return nil
|
43
43
|
end
|
44
44
|
end
|
45
|
+
|
46
|
+
def rescue_errors
|
47
|
+
if defined?(Zeitwerk)
|
48
|
+
[NameError, Zeitwerk::NameError]
|
49
|
+
else
|
50
|
+
[NameError]
|
51
|
+
end
|
52
|
+
end
|
45
53
|
end
|
46
54
|
end
|
@@ -9,7 +9,7 @@ module ChoronSupport
|
|
9
9
|
|
10
10
|
# QueryオブジェクトパターンをEasyに使うためのクラスメソッドです
|
11
11
|
# @param [Symbol] method_name Modelに定義されるメソッド名
|
12
|
-
# @param [Choron::Domains::Base] option domain Domain
|
12
|
+
# @param [Choron::Domains::Base] option domain Domainクラスを文字列で直接指定することができます。シンボルを渡すとクラス化を自動で行います。デフォルトはnilです。
|
13
13
|
# @param [Symbol] option domain_to_method 委譲先のDomainクラスの呼び出しメソッドを指定できます。デフォルトは :call です
|
14
14
|
# @exampl
|
15
15
|
# class User < ApplicationRecord
|
@@ -32,13 +32,7 @@ module ChoronSupport
|
|
32
32
|
# end
|
33
33
|
# end
|
34
34
|
def self.domain_delegate(method_symbol, specific: true, class_name: nil, to: :call)
|
35
|
-
|
36
|
-
domain_class = class_name.constantize
|
37
|
-
else
|
38
|
-
model_name = specific ? self.to_s : nil
|
39
|
-
# 例: Domains::Users::Purchase
|
40
|
-
domain_class = ChoronSupport::Helper.generate_choron_class("Domains", model_name, method_symbol)
|
41
|
-
end
|
35
|
+
domain_class = __generate_choron_domain_class(method_symbol, specific, class_name)
|
42
36
|
|
43
37
|
# 被ることがないようにど__をつけてメソッド名を定義します
|
44
38
|
# 例: :__domains_users_purchase_object__
|
@@ -57,6 +51,78 @@ module ChoronSupport
|
|
57
51
|
# purchase メソッドを __domains_xxx__ の call メソッドにデリゲートする
|
58
52
|
def_delegator domain_object_method_name, to, method_symbol
|
59
53
|
end
|
54
|
+
|
55
|
+
# domain_delegate とほぼ同じ動きですが、こちらはクラスメソッドをデリゲートするものです。
|
56
|
+
# パラメータも同じなのでここでは説明を省略します
|
57
|
+
# @example
|
58
|
+
# class User < ApplicationRecord
|
59
|
+
# class_domain_delegate :import_csv
|
60
|
+
# #=>
|
61
|
+
# def self.import_csv
|
62
|
+
# Domains::Users::ImportCsv.new(self).call
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# class_domain_delegate :import_csv, specfic: false
|
66
|
+
# #=>
|
67
|
+
# def self.import_csv(csv_strings)
|
68
|
+
# # 細かいことは省略しますが引数もちゃんとデリゲートできるようにしています
|
69
|
+
# Domains::ImportCsv.new(self).call(csv_strings)
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# class_domain_delegate :import_csv, class_name: :manage_csv, to: :import
|
73
|
+
# #=>
|
74
|
+
# def self.import_csv
|
75
|
+
# Domains::Users::ManageCsv.new(self).import
|
76
|
+
# end
|
77
|
+
def self.class_domain_delegate(method_symbol, specific: true, class_name: nil, to: :call)
|
78
|
+
domain_class = __generate_choron_domain_class(method_symbol, specific, class_name)
|
79
|
+
|
80
|
+
# どのような引数でもデリゲートできるようにしています
|
81
|
+
define_singleton_method(method_symbol) do |*params, **keyparams|
|
82
|
+
case [!params.empty?, !keyparams.empty?]
|
83
|
+
when [true, true]
|
84
|
+
domain_class.new(self).send(to, *params, **keyparams)
|
85
|
+
when [true, false]
|
86
|
+
domain_class.new(self).send(to, *params)
|
87
|
+
when [false, true]
|
88
|
+
domain_class.new(self).send(to, **keyparams)
|
89
|
+
else
|
90
|
+
domain_class.new(self).send(to)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def self.__generate_choron_domain_class(method_symbol, specific, class_name)
|
98
|
+
# クラス名指定なしのときはメソッド名からクラスを推測する
|
99
|
+
if class_name.to_s.empty?
|
100
|
+
model_name = specific ? self.to_s : nil
|
101
|
+
# @example
|
102
|
+
# xxx_delegate :purchase
|
103
|
+
# => Domains::Users::Purchase
|
104
|
+
# xxx_delegate :purchase, specfic: false
|
105
|
+
# => Domains::Purchase
|
106
|
+
return ChoronSupport::Helper.generate_choron_class("Domains", model_name, method_symbol)
|
107
|
+
end
|
108
|
+
|
109
|
+
if class_name.is_a?(Symbol)
|
110
|
+
# クラス名がシンボルで渡されているときは、シンボル値からクラス名を推測する
|
111
|
+
model_name = specific ? self.to_s : nil
|
112
|
+
# @example
|
113
|
+
# xxx_delegate :purchase, class_name: :paymanet
|
114
|
+
# => Domains::Users::Payment
|
115
|
+
# xxx_delegate :purchase, class_name: :payment, specifix: false
|
116
|
+
# => Domains::Payment
|
117
|
+
ChoronSupport::Helper.generate_choron_class("Domains", model_name, class_name)
|
118
|
+
else
|
119
|
+
# それ以外のときは直接クラスにする
|
120
|
+
# @example
|
121
|
+
# xxx_delegate :purchase, class_name: "Domains::Payment"
|
122
|
+
# => Domains::Payment
|
123
|
+
class_name.constantize
|
124
|
+
end
|
125
|
+
end
|
60
126
|
end
|
61
127
|
end
|
62
128
|
end
|
@@ -13,15 +13,21 @@ module ChoronSupport
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
unless model_name.to_s.empty?
|
17
17
|
namespace = "#{namespaces}::#{model_name.pluralize}"
|
18
18
|
end
|
19
19
|
|
20
|
+
target_class_name = "#{namespace}::#{class_symbol.to_s.camelize}"
|
21
|
+
# ? 終わりはクラスに変換できないため
|
22
|
+
if target_class_name.end_with?("?")
|
23
|
+
target_class_name.chop!
|
24
|
+
end
|
25
|
+
|
20
26
|
# 例: Queries::Users::NotLogined
|
21
27
|
target_class = nil
|
22
28
|
begin
|
23
|
-
target_class =
|
24
|
-
rescue => e
|
29
|
+
target_class = target_class_name.constantize
|
30
|
+
rescue NameError => e
|
25
31
|
if exception
|
26
32
|
raise e
|
27
33
|
end
|
@@ -16,7 +16,7 @@ module ChoronSupport
|
|
16
16
|
|
17
17
|
def self.scope_query(query, specific: true, class_name: nil)
|
18
18
|
# 直接Queryクラスを指定されていたらすぐにscopeにプロキシして返す
|
19
|
-
if class_name.
|
19
|
+
if !class_name.to_s.empty?
|
20
20
|
query_class = class_name.to_s.constantize
|
21
21
|
else
|
22
22
|
namespace = "Queries"
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mksava
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-01-
|
11
|
+
date: 2023-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|