rails_use_case 0.0.11 → 0.0.13

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: 7ede9e2243fddfc8ed59a395ca97b7f14062c4180e27d1f956f793a435559e90
4
- data.tar.gz: 3f56c4fe1f24f74af0226aa5adacbb1341ac042e52b0caf767d61005c8d04b9a
3
+ metadata.gz: 0eb1a5ed5601e1c4e070962f4d19c2e35a4ea23980151fa35ec02c6328a2fd0d
4
+ data.tar.gz: 20821b8d657c535ee16ae2c920e1e93a8d0b21c384d99b25e5c986ff0914b0eb
5
5
  SHA512:
6
- metadata.gz: e21f3ab1cc85466ec37bccfcc1dae363c478bb4d49a15bdcd5b1e093e5d63d270d5be3befccd66f41f0b81cd79015cdcf41f124f9321fa3d968f17300d7ba1a8
7
- data.tar.gz: 34ec8bbeb3e95a0ffce45ef6945d859e71b3122b53c1a01b7d7ad122b9c2d884f681c67a47a355bd0905b4e19ca482defcd7ba572b2aaf209f29920911a53862
6
+ metadata.gz: 64c64c919a75d87bdea7a339fd9322c33b97a30b46bfa668a3eb970b3e542af9416176e5cc9783a0f133349648beb022983d66cafd30473f77708eb0de6a9963
7
+ data.tar.gz: 9f26874c317b868bd84c6232a2af3562bf54feddb4851552fbbccdc8294e38bdd2a89b420cdf387f623d1f5e361de9d24232a46b77d1dec13fb885a8bb1ab99d
data/README.md CHANGED
@@ -1,11 +1,13 @@
1
1
  # Rails Use Case gem
2
2
 
3
- Opinionated gem for UseCases and Services in Rails to keep your Models and Controllers slim.
3
+ This gem introduces UseCases and Services to Rails which allow you to keep your Models and Controllers slim.
4
4
 
5
5
  Read more: https://dev.to/phortx/pimp-your-rails-application-32d0
6
6
 
7
- The purpose of a UseCase is to contain reusable high level business logic which would normally be
8
- located in the controller. Examples are: Place an item in the cart, create a new user or delete a comment.
7
+ Clean Architecture suggests to put the business logic in UseCases which are classes, that contain reusable high
8
+ level business logic which otherwise would normally be located in the controller. UseCases are easy to read,
9
+ clean, reusable, testable and extendable.
10
+ Examples are: Place an item in the cart, create a new user or delete a comment.
9
11
 
10
12
  The purpose of a Service is to contain low level non-domain code like communication with a API,
11
13
  generating an export, upload via FTP or generating a PDF.
@@ -67,8 +69,19 @@ The error_code can also passed as first argument to the `failure` step definitio
67
69
 
68
70
  ### Record
69
71
 
70
- The UseCase should assign the main record to `@record`. Calling `save!` without argument will try to
71
- save that record or raises an exception. Also the `@record` will automatically passed into the outcome.
72
+ The UseCase should assign the main record to `@record`. Calling `save!` without
73
+ argument will try to save that record or raises an exception. Also the
74
+ `@record` will automatically passed into the outcome.
75
+
76
+ You can either set the `@record` manually or via the `record` method. This comes
77
+ in two flavors:
78
+
79
+ Either passing the name of a param as symbol. Let's assume the UseCase
80
+ has a parameter called `user` (defined via `attr_accessor`), then you can assign
81
+ the user to `@record` by adding `record :user` to your use case.
82
+
83
+ The alternative way is to pass a block which returns the value for `@record`
84
+ like in the example UseCase below.
72
85
 
73
86
 
74
87
  ### Example UseCase
@@ -81,16 +94,18 @@ class BlogPosts::Create < Rails::UseCase
81
94
  validates :content, presence: true
82
95
  validates :author, presence: true
83
96
 
97
+ record { BlogPost.new }
98
+
84
99
  failure :access_denied, message: 'No permission', unless: -> { author.can_publish_blog_posts? }
85
- step :build_post
100
+ step :assign_attributes
86
101
  step :save!
87
102
  succeed unless: -> { publish }
88
103
  step :publish, do: -> { record.publish! }
89
104
  step :notify_subscribers, unless: -> { skip_notifications }
90
105
 
91
106
 
92
- private def build_post
93
- @record = BlogPost.new(
107
+ private def assign_attributes
108
+ @record.assign_attributes(
94
109
  title: title,
95
110
  content: content,
96
111
  created_by: author,
@@ -154,7 +169,9 @@ class BlogPostsController < ApplicationController
154
169
  author: current_user
155
170
  }
156
171
 
157
- case BlogPosts::Create.perform(parameters).code
172
+ outcome = BlogPosts::Create.perform(parameters).code
173
+
174
+ case outcome.code
158
175
  when :success then redirect_to(outcome.record)
159
176
  when :access_denied then render(:new, flash: { error: "Access Denied!" })
160
177
  when :foo then redirect_to('/')
data/lib/rails/service.rb CHANGED
@@ -38,7 +38,7 @@ module Rails
38
38
  #
39
39
  # @raise [RuntimeError] When no service_name is given
40
40
  def initialize(service_name = nil)
41
- raise NotImplementedError if self.class == Service
41
+ raise NotImplementedError if instance_of?(Service)
42
42
  raise 'Please provide a service name!' if service_name.nil?
43
43
 
44
44
  @service_name = service_name
@@ -67,7 +67,7 @@ module Rails
67
67
  # Will setup the logger for logging to STDOUT. This can be useful for
68
68
  # Heroku for example.
69
69
  private def setup_stdout_logger
70
- @logger = Logger.new(STDOUT)
70
+ @logger = Logger.new($stdout)
71
71
 
72
72
  @logger.formatter = proc do |severity, datetime, progname, msg|
73
73
  "[#{@service_name}] #{msg}"
@@ -67,8 +67,24 @@ module Rails
67
67
  end
68
68
 
69
69
 
70
+ # DSL to set the record source.
71
+ # @param [Symbol|nil] Name of the param.
72
+ # @yields
73
+ def self.record(param = nil, &block)
74
+ block = -> { send(param.to_sym) } unless block_given?
75
+
76
+ define_method(:determine_record, &block)
77
+ end
78
+
79
+
70
80
  # Will run the steps of the use case.
71
81
  def process
82
+ @record = determine_record if respond_to?(:determine_record)
83
+ run_steps
84
+ end
85
+
86
+
87
+ def run_steps
72
88
  self.class.steps.each do |step|
73
89
  # Check wether to skip when :if or :unless are set.
74
90
  next if skip_step?(step)
@@ -82,7 +98,7 @@ module Rails
82
98
  fail!(code: opts[:code], message: opts[:message]) if name == :failure
83
99
 
84
100
  # Run the lambda, when :do is set. Otherwise call the method.
85
- next if opts[:do] ? instance_eval(&opts[:do]) : send(name)
101
+ next if opts[:do] ? instance_exec(&opts[:do]) : send(name)
86
102
 
87
103
  # result is false, so we have a failure.
88
104
  fail! code: :step_false, message: "Step '#{name}' returned false"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_use_case
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Klein
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-05 00:00:00.000000000 Z
11
+ date: 2022-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -195,7 +195,7 @@ homepage: https://github.com/phortx/rails-use-case
195
195
  licenses:
196
196
  - MIT
197
197
  metadata: {}
198
- post_install_message:
198
+ post_install_message:
199
199
  rdoc_options: []
200
200
  require_paths:
201
201
  - lib
@@ -211,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
211
  version: '0'
212
212
  requirements: []
213
213
  rubygems_version: 3.1.2
214
- signing_key:
214
+ signing_key:
215
215
  specification_version: 4
216
216
  summary: Rails UseCase and Service classes
217
217
  test_files: []