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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7da95f65bf957254a5b66f62facc2ca0b10aabc0c3aba36e4441229330b565b
4
- data.tar.gz: 80b4a4ed2e0be8e67843a4056262adb65a7f66046524572e0b8cac16f8006e9e
3
+ metadata.gz: 5aec7e221e4fc870c2cd989203b23d977c361a55830d4f3ec54732254ef9d68c
4
+ data.tar.gz: 7ce392003f8f967ac35019e436dd29230a36d1b2232c5676b98f86820535fcb9
5
5
  SHA512:
6
- metadata.gz: 633b6143e63daf2672fccdebbd24f73238a16ec04d7faa248ad6c6cc26626f433dae771fef2ef7c7129f72d5dfcfe5a506225e81f80a75240e681fa60ebaf5b2
7
- data.tar.gz: 4f968293d35924ed6fddbe222c59fbb69ae7e538b36bdf71ee118598650bc16d9484dd219c27d2a183762ca04a00f2018aa58aa04f1ae7423ff2b25b04d082e3
6
+ metadata.gz: 3a1eb4b85d33c2e40060b1b4d9941f432a06ba034dc6f8dee696817969bb4da9b7456ceac7be5bce90ce090ffd02e995c593587f0894bfd0f7645017d777b496
7
+ data.tar.gz: 7f88d5b647058c03b70f0e95fb02df0b757ea11c2c5c2493a9da4346c876d81713e4c3a7576514c03a9471f5e27f31e1a9eb56febe3aeb5353cefa5e44132148
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- choron_support (0.1.2)
4
+ choron_support (0.1.4)
5
5
  activesupport
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -27,7 +27,50 @@ ChoronSupport.using :all
27
27
 
28
28
  ### AsProps
29
29
 
30
- * TODO
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クラスを直接指定することができます。デフォルトはnilです。
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
- if class_name.present?
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
- if model_name.present?
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 = "#{namespace}::#{class_symbol.to_s.camelize}".constantize
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
@@ -26,7 +26,7 @@ module ChoronSupport
26
26
  # @return [String]
27
27
  def like_sanitize(string)
28
28
  str = string.to_s
29
- return "" if str.blank?
29
+ return "" if str.empty?
30
30
 
31
31
  ApplicationRecord.sanitize_sql_like(str)
32
32
  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.present?
19
+ if !class_name.to_s.empty?
20
20
  query_class = class_name.to_s.constantize
21
21
  else
22
22
  namespace = "Queries"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ChoronSupport
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.4"
5
5
  end
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.2
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-08 00:00:00.000000000 Z
11
+ date: 2023-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport