clean-architecture 5.0.2 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +15 -19
  3. data/.gitignore +4 -0
  4. data/CHANGELOG.md +4 -0
  5. data/Gemfile +1 -0
  6. data/README.md +1 -585
  7. data/bin/tapioca +29 -0
  8. data/clean-architecture.gemspec +4 -4
  9. data/lib/clean-architecture.rb +4 -1
  10. data/lib/clean_architecture/adapters/all.rb +1 -1
  11. data/lib/clean_architecture/adapters/attribute_hash_base.rb +47 -20
  12. data/lib/clean_architecture/all.rb +1 -4
  13. data/lib/clean_architecture/builders/abstract_active_record_entity_builder.rb +43 -13
  14. data/lib/clean_architecture/builders/all.rb +1 -1
  15. data/lib/clean_architecture/checks/all.rb +1 -1
  16. data/lib/clean_architecture/checks/authorization.rb +11 -9
  17. data/lib/clean_architecture/entities/all.rb +1 -3
  18. data/lib/clean_architecture/entities/failure_details.rb +27 -17
  19. data/lib/clean_architecture/matchers/all.rb +1 -1
  20. data/lib/clean_architecture/matchers/use_case_result.rb +9 -3
  21. data/lib/clean_architecture/queries/all.rb +1 -1
  22. data/lib/clean_architecture/queries/http_failure_code.rb +8 -20
  23. data/lib/clean_architecture/queries/http_success_code.rb +14 -7
  24. data/lib/clean_architecture/serializers/all.rb +1 -1
  25. data/lib/clean_architecture/serializers/html_response_from_result.rb +7 -1
  26. data/lib/clean_architecture/serializers/json_response_from_result.rb +4 -4
  27. data/lib/clean_architecture/version.rb +1 -1
  28. data/nix/sources.json +14 -0
  29. data/nix/sources.nix +174 -0
  30. data/run_ci.sh +7 -0
  31. data/shell.nix +17 -12
  32. data/sorbet/config +4 -0
  33. data/sorbet/{rbi/gems → dry-monads-sorbet}/dry-monads.rbi +176 -94
  34. data/sorbet/rbi/gems/activemodel@6.1.4.1.rbi +1292 -0
  35. data/sorbet/rbi/gems/activerecord@6.1.4.1.rbi +8092 -0
  36. data/sorbet/rbi/gems/activesupport@6.1.4.1.rbi +3531 -0
  37. data/sorbet/rbi/gems/{ast.rbi → ast@2.4.2.rbi} +28 -22
  38. data/sorbet/rbi/gems/byebug@11.1.3.rbi +1568 -0
  39. data/sorbet/rbi/gems/coderay@1.1.3.rbi +1005 -0
  40. data/sorbet/rbi/gems/concurrent-ruby@1.1.9.rbi +915 -0
  41. data/sorbet/rbi/gems/diff-lcs@1.4.4.rbi +8 -0
  42. data/sorbet/rbi/gems/docile@1.4.0.rbi +54 -0
  43. data/sorbet/rbi/gems/dry-core@0.7.1.rbi +92 -0
  44. data/sorbet/rbi/gems/dry-equalizer@0.3.0.rbi +28 -0
  45. data/sorbet/rbi/gems/dry-matcher@0.9.0.rbi +56 -0
  46. data/sorbet/rbi/gems/dry-monads-sorbet@1.1.7.rbi +41 -0
  47. data/sorbet/rbi/gems/dry-monads@1.4.0.rbi +697 -0
  48. data/sorbet/rbi/gems/em-websocket@0.5.2.rbi +8 -0
  49. data/sorbet/rbi/gems/eventmachine@1.2.7.rbi +45 -0
  50. data/sorbet/rbi/gems/ffi@1.15.4.rbi +8 -0
  51. data/sorbet/rbi/gems/formatador@0.3.0.rbi +8 -0
  52. data/sorbet/rbi/gems/guard-compat@1.2.1.rbi +31 -0
  53. data/sorbet/rbi/gems/guard-livereload@2.5.2.rbi +8 -0
  54. data/sorbet/rbi/gems/guard-rspec@4.7.3.rbi +211 -0
  55. data/sorbet/rbi/gems/guard@2.18.0.rbi +8 -0
  56. data/sorbet/rbi/gems/http_parser.rb@0.6.0.rbi +8 -0
  57. data/sorbet/rbi/gems/i18n@1.8.10.rbi +8 -0
  58. data/sorbet/rbi/gems/listen@3.7.0.rbi +8 -0
  59. data/sorbet/rbi/gems/lumberjack@1.2.8.rbi +8 -0
  60. data/sorbet/rbi/gems/method_source@1.0.0.rbi +72 -0
  61. data/sorbet/rbi/gems/minitest@5.14.4.rbi +344 -0
  62. data/sorbet/rbi/gems/multi_json@1.15.0.rbi +8 -0
  63. data/sorbet/rbi/gems/nenv@0.3.0.rbi +8 -0
  64. data/sorbet/rbi/gems/notiffany@0.1.3.rbi +8 -0
  65. data/sorbet/rbi/gems/parallel@1.21.0.rbi +113 -0
  66. data/sorbet/rbi/gems/{parser.rbi → parser@3.0.2.0.rbi} +966 -699
  67. data/sorbet/rbi/gems/pry-byebug@3.9.0.rbi +461 -0
  68. data/sorbet/rbi/gems/{pry.rbi → pry@0.13.1.rbi} +2191 -1605
  69. data/sorbet/rbi/gems/{rainbow.rbi → rainbow@3.0.0.rbi} +90 -55
  70. data/sorbet/rbi/gems/{rake.rbi → rake@13.0.6.rbi} +578 -427
  71. data/sorbet/rbi/gems/rb-fsevent@0.11.0.rbi +8 -0
  72. data/sorbet/rbi/gems/rb-inotify@0.10.1.rbi +8 -0
  73. data/sorbet/rbi/gems/rb-readline@0.5.5.rbi +884 -0
  74. data/sorbet/rbi/gems/rbi@0.0.6.rbi +1405 -0
  75. data/sorbet/rbi/gems/regexp_parser@2.1.1.rbi +1120 -0
  76. data/sorbet/rbi/gems/{rexml.rbi → rexml@3.2.5.rbi} +562 -479
  77. data/sorbet/rbi/gems/{rspec-core.rbi → rspec-core@3.10.1.rbi} +2317 -1533
  78. data/sorbet/rbi/gems/rspec-expectations@3.10.1.rbi +1574 -0
  79. data/sorbet/rbi/gems/rspec-mocks@3.10.2.rbi +1462 -0
  80. data/sorbet/rbi/gems/rspec-support@3.10.2.rbi +509 -0
  81. data/sorbet/rbi/gems/rspec@3.10.0.rbi +38 -0
  82. data/sorbet/rbi/gems/rubocop-ast@1.12.0.rbi +1938 -0
  83. data/sorbet/rbi/gems/rubocop-rspec@2.5.0.rbi +1786 -0
  84. data/sorbet/rbi/gems/rubocop@1.22.1.rbi +13252 -0
  85. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +405 -0
  86. data/sorbet/rbi/gems/shellany@0.0.1.rbi +8 -0
  87. data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +89 -0
  88. data/sorbet/rbi/gems/simplecov@0.21.2.rbi +577 -0
  89. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.3.rbi +8 -0
  90. data/sorbet/rbi/gems/sorbet-struct-comparable@1.1.0.rbi +17 -0
  91. data/sorbet/rbi/gems/spoom@1.1.5.rbi +1241 -0
  92. data/sorbet/rbi/gems/stackprof@0.2.17.rbi +98 -0
  93. data/sorbet/rbi/gems/tapioca@0.5.2.rbi +949 -0
  94. data/sorbet/rbi/gems/thor@1.1.0.rbi +839 -0
  95. data/sorbet/rbi/gems/tzinfo@2.0.4.rbi +8 -0
  96. data/sorbet/rbi/gems/unicode-display_width@2.1.0.rbi +26 -0
  97. data/sorbet/rbi/gems/unparser@0.6.0.rbi +8 -0
  98. data/sorbet/rbi/gems/zeitwerk@2.4.2.rbi +8 -0
  99. data/sorbet/tapioca/require.rb +9 -0
  100. metadata +88 -91
  101. data/.ruby-version +0 -1
  102. data/lib/clean_architecture/entities/targeted_parameters.rb +0 -24
  103. data/lib/clean_architecture/entities/untargeted_parameters.rb +0 -21
  104. data/lib/clean_architecture/interfaces/all.rb +0 -12
  105. data/lib/clean_architecture/interfaces/authorization_parameters.rb +0 -19
  106. data/lib/clean_architecture/interfaces/base_parameters.rb +0 -24
  107. data/lib/clean_architecture/interfaces/jsonable.rb +0 -16
  108. data/lib/clean_architecture/interfaces/targeted_parameters.rb +0 -19
  109. data/lib/clean_architecture/interfaces/use_case.rb +0 -20
  110. data/lib/clean_architecture/interfaces/use_case_actor.rb +0 -20
  111. data/lib/clean_architecture/interfaces/use_case_target.rb +0 -24
  112. data/lib/clean_architecture/types.rb +0 -8
  113. data/lib/clean_architecture/use_cases/abstract_use_case.rb +0 -63
  114. data/lib/clean_architecture/use_cases/all.rb +0 -10
  115. data/lib/clean_architecture/use_cases/contract.rb +0 -9
  116. data/lib/clean_architecture/use_cases/errors.rb +0 -58
  117. data/lib/clean_architecture/use_cases/form.rb +0 -116
  118. data/lib/clean_architecture/use_cases/parameters.rb +0 -43
  119. data/sorbet/rbi/gems/activemodel.rbi +0 -75
  120. data/sorbet/rbi/gems/activesupport.rbi +0 -440
  121. data/sorbet/rbi/gems/byebug.rbi +0 -1040
  122. data/sorbet/rbi/gems/coderay.rbi +0 -92
  123. data/sorbet/rbi/gems/concurrent-ruby.rbi +0 -1586
  124. data/sorbet/rbi/gems/docile.rbi +0 -32
  125. data/sorbet/rbi/gems/dry-configurable.rbi +0 -139
  126. data/sorbet/rbi/gems/dry-container.rbi +0 -89
  127. data/sorbet/rbi/gems/dry-core.rbi +0 -80
  128. data/sorbet/rbi/gems/dry-equalizer.rbi +0 -26
  129. data/sorbet/rbi/gems/dry-inflector.rbi +0 -73
  130. data/sorbet/rbi/gems/dry-initializer.rbi +0 -209
  131. data/sorbet/rbi/gems/dry-logic.rbi +0 -305
  132. data/sorbet/rbi/gems/dry-matcher.rbi +0 -34
  133. data/sorbet/rbi/gems/dry-schema.rbi +0 -786
  134. data/sorbet/rbi/gems/dry-struct.rbi +0 -137
  135. data/sorbet/rbi/gems/dry-types.rbi +0 -709
  136. data/sorbet/rbi/gems/dry-validation.rbi +0 -288
  137. data/sorbet/rbi/gems/duckface-interfaces.rbi +0 -94
  138. data/sorbet/rbi/gems/i18n.rbi +0 -133
  139. data/sorbet/rbi/gems/jaro_winkler.rbi +0 -15
  140. data/sorbet/rbi/gems/method_source.rbi +0 -64
  141. data/sorbet/rbi/gems/parallel.rbi +0 -82
  142. data/sorbet/rbi/gems/pry-byebug.rbi +0 -155
  143. data/sorbet/rbi/gems/rb-readline.rbi +0 -767
  144. data/sorbet/rbi/gems/rspec-expectations.rbi +0 -398
  145. data/sorbet/rbi/gems/rspec-mocks.rbi +0 -816
  146. data/sorbet/rbi/gems/rspec-support.rbi +0 -271
  147. data/sorbet/rbi/gems/rspec.rbi +0 -15
  148. data/sorbet/rbi/gems/rubocop-rspec.rbi +0 -922
  149. data/sorbet/rbi/gems/rubocop.rbi +0 -7319
  150. data/sorbet/rbi/gems/ruby-progressbar.rbi +0 -305
  151. data/sorbet/rbi/gems/simplecov-html.rbi +0 -35
  152. data/sorbet/rbi/gems/simplecov.rbi +0 -361
  153. data/sorbet/rbi/gems/stackprof.rbi +0 -52
  154. data/sorbet/rbi/gems/unicode-display_width.rbi +0 -17
  155. data/sorbet/rbi/hidden-definitions/errors.txt +0 -8580
  156. data/sorbet/rbi/hidden-definitions/hidden.rbi +0 -17036
  157. data/sorbet/rbi/sorbet-typed/lib/activemodel/all/activemodel.rbi +0 -452
  158. data/sorbet/rbi/sorbet-typed/lib/activesupport/>=6.0.0.rc1/activesupport.rbi +0 -23
  159. data/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +0 -979
  160. data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +0 -8684
  161. data/sorbet/rbi/sorbet-typed/lib/minitest/all/minitest.rbi +0 -108
  162. data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +0 -276
  163. data/sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi +0 -4222
  164. data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +0 -111
  165. data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +0 -543
  166. data/sorbet/rbi/todo.rbi +0 -10
@@ -1,58 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- require 'active_model'
5
- require 'active_support/core_ext/string/inflections'
6
- require 'forwardable'
7
-
8
- module CleanArchitecture
9
- module UseCases
10
- # Acts as a facade in front of ActiveModel::Errors implementing the bare minimum of the API
11
- # It also implements the same interface as a FailureDetails so as to be interchangeable if
12
- # passed back to code expecting a FailureDetails
13
- class Errors
14
- extend Forwardable
15
- include ActiveModel::Translation
16
-
17
- DEFAULT_FAILURE_DETAILS_TYPE = 'error'
18
-
19
- def initialize(base, type = DEFAULT_FAILURE_DETAILS_TYPE)
20
- @active_model_errors = ActiveModel::Errors.new(base)
21
- @type = type
22
- end
23
-
24
- attr_reader :type
25
-
26
- def message
27
- full_messages.join(', ')
28
- end
29
-
30
- def other_properties
31
- {}
32
- end
33
-
34
- def_delegators :@active_model_errors,
35
- :count,
36
- :each,
37
- :size,
38
- :clear,
39
- :blank?,
40
- :empty?,
41
- :add
42
-
43
- ATTRIBUTE_NAME_HUMANIZE_OPTIONS = { capitalize: true, keep_id_suffix: false }
44
- BASE_NAME = :base
45
-
46
- def full_messages
47
- @active_model_errors.messages.map do |attribute, messages|
48
- attribute_name = if attribute == BASE_NAME
49
- nil
50
- else
51
- ActiveSupport::Inflector.humanize(attribute, ATTRIBUTE_NAME_HUMANIZE_OPTIONS)
52
- end
53
- messages.map { |message| [attribute_name, message].compact.join(' ') }
54
- end.flatten
55
- end
56
- end
57
- end
58
- end
@@ -1,116 +0,0 @@
1
- # typed: false
2
- # frozen_string_literal: true
3
-
4
- require 'active_model'
5
- require 'clean_architecture/use_cases/errors'
6
- require 'clean_architecture/entities/failure_details'
7
- require 'dry/struct'
8
- require 'dry/monads/try'
9
- require 'dry/matcher/result_matcher'
10
-
11
- module CleanArchitecture
12
- module UseCases
13
- class Form
14
- include ActiveModel::Conversion
15
- include Dry::Monads::Try::Mixin
16
- extend ActiveModel::Naming
17
-
18
- attr_reader :errors, :context
19
-
20
- def initialize(params: {}, context: {}, errors: UseCases::Errors.new(nil))
21
- @params = params.to_h.symbolize_keys
22
- @context = context
23
- @errors = errors
24
- end
25
-
26
- def persisted?
27
- false
28
- end
29
-
30
- # Attempts to create the parameter object returning a Dry::Monads::Result with either
31
- # the parameter object or an exception
32
- def to_parameter_object
33
- @to_parameter_object ||= begin
34
- use_case_class.parameters(parameter_object_hash.merge(context: context))
35
- end
36
- end
37
-
38
- def with_errors(new_errors, override_params: nil)
39
- self.class.new(
40
- params: override_params || @params,
41
- context: @context,
42
- errors: ErrorsFactory.new(new_errors).manufacture
43
- )
44
- end
45
-
46
- def with_error_message(message, override_params: nil)
47
- new_errors = UseCases::Errors.new(nil)
48
- new_errors.add(:base, message)
49
- with_errors(new_errors, override_params: override_params)
50
- end
51
-
52
- def self.acts_as_form_for(use_case_class)
53
- attribute_names = use_case_class.contract.__schema__.rules.keys
54
-
55
- attribute_names.each do |attribute_name|
56
- define_method attribute_name do
57
- to_parameter_object[attribute_name]
58
- end
59
- end
60
-
61
- define_method :use_case_class do
62
- use_case_class
63
- end
64
- end
65
-
66
- def self.prepopulate_with(_object, _context)
67
- raise NotImplementedError, 'This form does not support prepopulation'
68
- end
69
-
70
- private
71
-
72
- def attempt_parameter_object_hash_creation
73
- errors.clear
74
- parameter_object_hash
75
- end
76
-
77
- # This can be overridden for forms where the params don't map perfectly
78
- # to the parameter object
79
- def parameter_object_hash
80
- @params
81
- end
82
-
83
- class ErrorsFactory
84
- def initialize(errors)
85
- @errors = errors
86
- end
87
-
88
- def manufacture
89
- if @errors.is_a?(UseCases::Errors)
90
- return @errors
91
- elsif @errors.is_a?(Entities::FailureDetails)
92
- return errors_from_failure_details
93
- elsif @errors.is_a?(String)
94
- return errors_from_string
95
- end
96
-
97
- raise ArgumentError, "Unable to handle errors of type: #{@errors.class}"
98
- end
99
-
100
- private
101
-
102
- def errors_from_failure_details
103
- errors = UseCases::Errors.new(nil)
104
- errors.add(:base, @errors.message)
105
- errors
106
- end
107
-
108
- def errors_from_string
109
- errors = UseCases::Errors.new(nil)
110
- errors.add(:base, @errors)
111
- errors
112
- end
113
- end
114
- end
115
- end
116
- end
@@ -1,43 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- require 'dry/monads/result'
5
- require 'clean_architecture/use_cases/errors'
6
- require 'forwardable'
7
-
8
- module CleanArchitecture
9
- module UseCases
10
- class Parameters
11
- include Dry::Monads::Result::Mixin
12
- extend Forwardable
13
-
14
- def initialize(context, dry_validation_result)
15
- @context = context
16
- @dry_validation_result = dry_validation_result
17
- end
18
-
19
- def context(key)
20
- @context.fetch(key)
21
- end
22
-
23
- def_delegators :@dry_validation_result,
24
- :[]
25
-
26
- def to_monad
27
- @dry_validation_result.success? ? Success(@dry_validation_result.to_h) : Failure(errors)
28
- end
29
-
30
- INVALID_PARAMS_FAILURE_TYPE = 'expectation_failed'
31
-
32
- def errors
33
- new_errors = Errors.new(nil, INVALID_PARAMS_FAILURE_TYPE)
34
- @dry_validation_result.errors.to_h.each_pair do |invalid_attribute_key, error_messages|
35
- error_messages.each do |error_message|
36
- new_errors.add(invalid_attribute_key, error_message)
37
- end
38
- end
39
- new_errors
40
- end
41
- end
42
- end
43
- end
@@ -1,75 +0,0 @@
1
- # This file is autogenerated. Do not edit it by hand. Regenerate it with:
2
- # srb rbi gems
3
-
4
- # typed: strong
5
- #
6
- # If you would like to make changes to this file, great! Please create the gem's shim here:
7
- #
8
- # https://github.com/sorbet/sorbet-typed/new/master?filename=lib/activemodel/all/activemodel.rbi
9
- #
10
- # activemodel-6.0.2.1
11
-
12
- module ActiveModel
13
- def self.eager_load!; end
14
- def self.gem_version; end
15
- def self.version; end
16
- extend ActiveSupport::Autoload
17
- end
18
- module ActiveModel::VERSION
19
- end
20
- module ActiveModel::Serializers
21
- extend ActiveSupport::Autoload
22
- end
23
- class ActiveModel::Name
24
- def !~(*args, &block); end
25
- def <=>(*args, &block); end
26
- def ==(arg); end
27
- def ===(arg); end
28
- def =~(*args, &block); end
29
- def _singularize(string); end
30
- def as_json(*args, &block); end
31
- def cache_key; end
32
- def collection; end
33
- def element; end
34
- def eql?(*args, &block); end
35
- def human(options = nil); end
36
- def i18n_key; end
37
- def initialize(klass, namespace = nil, name = nil); end
38
- def match?(*args, &block); end
39
- def name; end
40
- def param_key; end
41
- def plural; end
42
- def route_key; end
43
- def singular; end
44
- def singular_route_key; end
45
- def to_s(*args, &block); end
46
- def to_str(*args, &block); end
47
- include Comparable
48
- end
49
- module ActiveModel::Naming
50
- def model_name; end
51
- def self.extended(base); end
52
- def self.model_name_from_record_or_class(record_or_class); end
53
- def self.param_key(record_or_class); end
54
- def self.plural(record_or_class); end
55
- def self.route_key(record_or_class); end
56
- def self.singular(record_or_class); end
57
- def self.singular_route_key(record_or_class); end
58
- def self.uncountable?(record_or_class); end
59
- end
60
- module ActiveModel::Translation
61
- def human_attribute_name(attribute, options = nil); end
62
- def i18n_scope; end
63
- def lookup_ancestors; end
64
- include ActiveModel::Naming
65
- end
66
- module ActiveModel::Conversion
67
- def to_key; end
68
- def to_model; end
69
- def to_param; end
70
- def to_partial_path; end
71
- extend ActiveSupport::Concern
72
- end
73
- module ActiveModel::Conversion::ClassMethods
74
- def _to_partial_path; end
75
- end