ucasy 0.1.0 → 0.2.0

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: 527b41741e56f37168fedca4c4a8f715d0028442c683a0307d663a66674e21d7
4
- data.tar.gz: 1add4fd86b293082a53b227b637c8d67ec3d43272971700ef489c0cf6f5c1634
3
+ metadata.gz: 36d451f98af67ec26170e55b1ad2799192ae80d852b5cf1436f3858b8d4718ad
4
+ data.tar.gz: 06e1bf635c4d2fa3a7a31b7d304f13029a37bab989e6bc32429d264cd324d2dc
5
5
  SHA512:
6
- metadata.gz: aa60ed7eb4a8974bff5b00f8edc0fdd4108ba01da21244015bafbc463323c3e5efa20480c6512dadac7029cf2c3daa15205931b0aa5f9a71999cf36d3d03e4be
7
- data.tar.gz: c59dbe9298d800901cc4a24cfccc444bb032a98addd36209da4d5c1aa654d1096de5d42aeaf41a5e2ad9a0c05a97283e08d428c094563e8c64ee265aafff3376
6
+ metadata.gz: 43cdad21e2a991eaa28285905828ba6bec0fe52ef5a1a22bdf8b3969490af67945c56bbfd2b3ba29bf640f170fa5fdb03ba3781fdcff08fbee060602af296aaa
7
+ data.tar.gz: 6e7fd420a5b4f4d46fbf79afd9797f24ee590025b3dc84830740ada4d2b8fd7c14a27beb05119a32841115817e1d238ee29d1293b36885db0de229493542811e
data/README.md CHANGED
@@ -7,7 +7,7 @@ Description soon!
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ru
10
- gem "ucasy", "~> 0.0.1"
10
+ gem "ucasy", "~> 0.2.0"
11
11
  ```
12
12
 
13
13
  And then execute:
@@ -22,14 +22,117 @@ Or install it yourself as:
22
22
  bundle add ucasy
23
23
  ```
24
24
 
25
- ## Usage
25
+ ## Create base file
26
26
 
27
- You can use a Rails generator to create setup files:
27
+ You can use a Rails generator to create setup `UseCaseBase` file:
28
28
 
29
29
  ```sh
30
30
  rails g ucasy:install
31
31
  ```
32
32
 
33
+ This will create `app/use_cases/use_case_base.rb`
34
+
35
+ ```rb
36
+ class UseCaseBase < Ucasy::Base
37
+ class Flow < Ucasy::Flow
38
+ end
39
+ end
40
+ ```
41
+
42
+ ## Basic usage
43
+
44
+ You can create a simple use case to `app/use_cases/authenticate_user.rb`:
45
+
46
+ ```rb
47
+ class AuthenticateUser < UseCaseBase
48
+ def before
49
+ context.user = User.find_by(login: context.login)
50
+ end
51
+
52
+ def call
53
+ return if context.user.valid_password?(context.password)
54
+
55
+ context.fail!(
56
+ status: :unprocessable_entity,
57
+ message: "User not found",
58
+ errors: context.user.errors
59
+ )
60
+ end
61
+
62
+ def after
63
+ UserMailer.with(user: context.user).login_warning.perform_later
64
+ end
65
+ end
66
+ ```
67
+
68
+ ## Using methods
69
+
70
+ There is some methods to ensure arguments for each use case:
71
+
72
+ ### required_attributes
73
+
74
+ ```rb
75
+ class AuthenticateUser < UseCaseBase
76
+ required_attributes(:login, :password)
77
+
78
+ def call
79
+ context.login
80
+ context.password
81
+ end
82
+ end
83
+ ```
84
+
85
+ The method `required_attributes` raises an error if `login` or `password` is blank
86
+
87
+
88
+ ### validate
89
+
90
+ You can use ActiveModel or any class that respond to `valid?`, `errors`, `present?` and accepts a hash as arguments to validate you payload.
91
+
92
+ Create a class
93
+
94
+ ```rb
95
+ class AuthenticateUser < UseCaseBase
96
+ validate(AuthenticateUserValidation)
97
+
98
+ def call
99
+ context.login
100
+ context.password
101
+ end
102
+ end
103
+ ```
104
+
105
+ Adds a validation
106
+
107
+ ```rb
108
+ class AuthenticateUserValidation
109
+ include ActiveModel::Model
110
+
111
+ attr_accessor :login, :password
112
+
113
+ validates :login, presence: true
114
+ validates :password, presence: true
115
+
116
+ def to_context
117
+ {login:, :password} # this hash will be injected in use cases context
118
+ end
119
+ end
120
+ ```
121
+
122
+ ## Using Flow
123
+
124
+ You can also create a flow to organize your use cases:
125
+
126
+ ```rb
127
+ class PlaceOrder < UseCaseBase::Flow
128
+ transactional # if any use case fails ActiveRecord will rollback transaction
129
+
130
+ validate(PlaceOrderValidation)
131
+
132
+ flow(ChargeCard, SendThankYou, FulfillOrder)
133
+ end
134
+ ```
135
+
33
136
  ## Contributing
34
137
 
35
138
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/ucasy.
data/lib/ucasy/flow.rb CHANGED
@@ -1,22 +1,43 @@
1
1
  module Ucasy
2
2
  class Flow < Base
3
3
  class << self
4
- def service_classes(*service_classes)
5
- @service_classes = service_classes
4
+ def flow(*ucases)
5
+ @ucases = ucases
6
6
  end
7
- alias_method :flow, :service_classes
8
7
 
9
- def _service_classes
10
- @service_classes || []
8
+ def ucases
9
+ @ucases || []
10
+ end
11
+
12
+ def transactional
13
+ @transactional = true
14
+ end
15
+
16
+ def transactional?
17
+ @transactional || false
11
18
  end
12
19
  end
13
20
 
14
21
  def call
15
- self.class._service_classes.each do |service_class|
16
- service_class.call(context)
22
+ if self.class.transactional?
23
+ ActiveRecord::Base.transaction { execute }
24
+ else
25
+ execute
17
26
  end
18
27
 
19
28
  self
20
29
  end
30
+
31
+ private
32
+
33
+ def execute
34
+ self.class.ucases.each do |ucase|
35
+ service_class.call(context)
36
+
37
+ next unless self.class.transactional?
38
+
39
+ raise ActiveRecord::Rollback if failure?
40
+ end
41
+ end
21
42
  end
22
43
  end
data/lib/ucasy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ucasy
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ucasy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lavenda Software
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-07 00:00:00.000000000 Z
11
+ date: 2024-10-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -60,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  requirements: []
63
- rubygems_version: 3.5.15
63
+ rubygems_version: 3.5.21
64
64
  signing_key:
65
65
  specification_version: 4
66
66
  summary: Ucasy is just a quick test suite setup for Rails application