hotstepper 0.1.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.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +36 -0
  4. data/Rakefile +8 -0
  5. data/app/validators/unique_items_validator.rb +40 -0
  6. data/config/locales/custom-predicates.en.yml +70 -0
  7. data/config/locales/dry-validation-errors.en.yml +113 -0
  8. data/config/locales/en.yml +14 -0
  9. data/config/routes.rb +4 -0
  10. data/lib/boot/setup.rb +151 -0
  11. data/lib/generators/hotstepper/service/USAGE +17 -0
  12. data/lib/generators/hotstepper/service/service_generator.rb +137 -0
  13. data/lib/generators/hotstepper/service/templates/operation.rb.tt +10 -0
  14. data/lib/generators/hotstepper/service/templates/service.rb.tt +39 -0
  15. data/lib/generators/hotstepper/typespace/USAGE +8 -0
  16. data/lib/generators/hotstepper/typespace/templates/types.rb.tt +5 -0
  17. data/lib/generators/hotstepper/typespace/typespace_generator.rb +25 -0
  18. data/lib/hotstepper/arel_ext/array_encoding.rb +66 -0
  19. data/lib/hotstepper/arel_ext/base_helpers.rb +220 -0
  20. data/lib/hotstepper/arel_ext/helpers.rb +17 -0
  21. data/lib/hotstepper/arel_ext/json_encoding.rb +49 -0
  22. data/lib/hotstepper/arel_ext/ltree_encoding.rb +52 -0
  23. data/lib/hotstepper/arel_ext/postgres_helpers.rb +34 -0
  24. data/lib/hotstepper/arel_ext/types.rb +37 -0
  25. data/lib/hotstepper/arel_ext/value_select_query.rb +142 -0
  26. data/lib/hotstepper/common.rb +52 -0
  27. data/lib/hotstepper/engine.rb +38 -0
  28. data/lib/hotstepper/models/association_helpers.rb +141 -0
  29. data/lib/hotstepper/models/checks_before_destruction.rb +35 -0
  30. data/lib/hotstepper/models/id_quoting.rb +23 -0
  31. data/lib/hotstepper/models/lazy_ordering.rb +57 -0
  32. data/lib/hotstepper/models/limit_to_one.rb +35 -0
  33. data/lib/hotstepper/models/lookup_helpers.rb +21 -0
  34. data/lib/hotstepper/models/materialized_view.rb +39 -0
  35. data/lib/hotstepper/models/model.rb +40 -0
  36. data/lib/hotstepper/models/querying.rb +55 -0
  37. data/lib/hotstepper/models/timestamp_scopes.rb +26 -0
  38. data/lib/hotstepper/models/view.rb +14 -0
  39. data/lib/hotstepper/models/where_matches.rb +67 -0
  40. data/lib/hotstepper/monadic/coercion.rb +111 -0
  41. data/lib/hotstepper/monadic/decorators.rb +61 -0
  42. data/lib/hotstepper/monadic/do_for.rb +22 -0
  43. data/lib/hotstepper/monadic.rb +8 -0
  44. data/lib/hotstepper/operation.rb +41 -0
  45. data/lib/hotstepper/patterns.rb +20 -0
  46. data/lib/hotstepper/query_building.rb +142 -0
  47. data/lib/hotstepper/service.rb +84 -0
  48. data/lib/hotstepper/steps/abstract_module.rb +21 -0
  49. data/lib/hotstepper/steps/implementation.rb +39 -0
  50. data/lib/hotstepper/steps/step.rb +26 -0
  51. data/lib/hotstepper/steps/watcher.rb +23 -0
  52. data/lib/hotstepper/steps/wrapper.rb +16 -0
  53. data/lib/hotstepper/struct.rb +30 -0
  54. data/lib/hotstepper/support/file_wrapper.rb +75 -0
  55. data/lib/hotstepper/support/generators/common.rb +39 -0
  56. data/lib/hotstepper/support/generators/namespaced.rb +23 -0
  57. data/lib/hotstepper/support/generators/service_operations.rb +14 -0
  58. data/lib/hotstepper/support/generators/step_definition.rb +45 -0
  59. data/lib/hotstepper/support/namespace_wrapper.rb +73 -0
  60. data/lib/hotstepper/support/null_service.rb +14 -0
  61. data/lib/hotstepper/support/types.rb +26 -0
  62. data/lib/hotstepper/testing/do_for.rb +23 -0
  63. data/lib/hotstepper/testing/operations.rb +88 -0
  64. data/lib/hotstepper/testing/typing.rb +18 -0
  65. data/lib/hotstepper/testing.rb +24 -0
  66. data/lib/hotstepper/typespace.rb +108 -0
  67. data/lib/hotstepper/typing.rb +69 -0
  68. data/lib/hotstepper/version.rb +5 -0
  69. data/lib/hotstepper.rb +56 -0
  70. data/lib/tasks/hotstepper_tasks.rake +6 -0
  71. data/lib/testing/contexts/operations.rb +13 -0
  72. data/lib/testing/matchers/00_disable_with.rb +22 -0
  73. data/lib/testing/matchers/dry_validation.rb +94 -0
  74. data/lib/testing/matchers/monadic.rb +107 -0
  75. data/lib/testing/matchers/negated.rb +8 -0
  76. metadata +377 -0
data/lib/hotstepper.rb ADDED
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "boot/setup"
4
+
5
+ module Hotstepper
6
+ extend Dry::Configurable
7
+
8
+ # @abstract
9
+ class Error < StandardError; end
10
+
11
+ class MissingDatabaseConnectionClassError < Error
12
+ def initialize
13
+ super("Database connection class not configured. Please set `Hotstepper.config.db.connection_class` to your application's database connection class, e.g. `ActiveRecord::Base`.")
14
+ end
15
+ end
16
+
17
+ # Raised when the common container is not configured.
18
+ class MissingCommonContainerError < Error
19
+ def initialize
20
+ super("Container not configured. Please set `Hotstepper.config.common.container` to your application's container.")
21
+ end
22
+ end
23
+
24
+ class << self
25
+ def loader
26
+ @loader ||= Zeitwerk::Loader.for_gem.tap do |loader|
27
+ loader.ignore("#{__dir__}/boot")
28
+ loader.ignore("#{__dir__}/generators")
29
+ loader.ignore("#{__dir__}/tasks")
30
+ loader.ignore("#{__dir__}/testing")
31
+ loader.do_not_eager_load("#{__dir__}/hotstepper/testing")
32
+ end
33
+ end
34
+ end
35
+
36
+ loader.setup
37
+
38
+ setting :common do
39
+ setting :container
40
+ end
41
+
42
+ setting :db do
43
+ setting :connection_class, default: ActiveRecord::Base, constructor: ->(klass) { ::Hotstepper::Support::Types::DatabaseConnectionClass[klass] }
44
+ end
45
+ end
46
+
47
+ require_relative "../app/validators/unique_items_validator"
48
+ require "hotstepper/typespace"
49
+ require "hotstepper/monadic"
50
+ require "hotstepper/support/types"
51
+ require "hotstepper/operation"
52
+ require "hotstepper/service"
53
+ require "hotstepper/struct"
54
+ require "hotstepper/typing"
55
+ require "hotstepper/version"
56
+ require "hotstepper/engine"
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # desc "Explaining what the task does"
4
+ # task :hotstepper do
5
+ # # Task goes here
6
+ # end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hotstepper/testing/operations"
4
+
5
+ RSpec.shared_context "an operation" do
6
+ subject(:operation) { described_class.new }
7
+ end
8
+
9
+ RSpec.configure do |config|
10
+ config.include Hotstepper::Testing::Operations::ExampleHelpers, type: :operation
11
+
12
+ config.include_context "an operation", type: :operation
13
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ActiveSupport 7.1 introduces an aggrsessively annoying new monkeypatch
4
+ # on Object called `with`. This conflicts with methods that we use.
5
+
6
+ begin
7
+ RSpec::Matchers::MatcherDelegator.undef_method(:with)
8
+ rescue StandardError
9
+ nil
10
+ end
11
+
12
+ begin
13
+ RSpec::Matchers::DSL::Matcher.undef_method(:with)
14
+ rescue StandardError
15
+ nil
16
+ end
17
+
18
+ begin
19
+ RSpec::Matchers::BuiltIn::BaseMatcher.undef_method(:with)
20
+ rescue StandardError
21
+ nil
22
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec::Matchers.define :have_validation_error do
4
+ match do |actual|
5
+ next false unless actual.kind_of?(Dry::Validation::Result)
6
+
7
+ @actual = @result = actual
8
+
9
+ @errors = actual.errors.to_h
10
+
11
+ failure? && error_on_path? && message_matches?
12
+ end
13
+
14
+ chain :on do |*path|
15
+ case path
16
+ in [String]
17
+ @path = Dry::Schema::Path[path.first]
18
+ else
19
+ @path = Dry::Schema::Path[path]
20
+ end
21
+ end
22
+
23
+ chain :with_message, :message
24
+
25
+ chain :with_scope, :scope
26
+
27
+ def failure? = @result.kind_of?(Dry::Validation::Result) && @result.failure?
28
+
29
+ def error_on_path? = @path.blank? || @result.error?(@path)
30
+
31
+ def message_matches?
32
+ # :nocov:
33
+ return true if @message.blank?
34
+ # :nocov:
35
+
36
+ @matcher = derive_message_matcher
37
+
38
+ @messages = derive_messages
39
+
40
+ @messages.any?(&@matcher)
41
+ end
42
+
43
+ def derive_messages
44
+ if @path.blank?
45
+ # :nocov:
46
+ @result.errors.to_h.values.flatten
47
+ # :nocov:
48
+ else
49
+ @result.errors.to_h.dig(*@path.to_a) || []
50
+ end
51
+ end
52
+
53
+ def derive_message_matcher
54
+ @scope ||= "dry_validation.errors"
55
+
56
+ case @message
57
+ when Symbol
58
+ transliterated = I18n.t(@message, scope: @scope, raise: true)
59
+
60
+ ->(msg) { msg == transliterated }
61
+ when Regexp
62
+ # :nocov:
63
+ ->(msg) { msg.match?(@message) }
64
+ # :nocov:
65
+ else
66
+ # :nocov:
67
+ ->(msg) { msg == @message }
68
+ # :nocov:
69
+ end
70
+ end
71
+
72
+ failure_message do |actual|
73
+ [].tap do |parts|
74
+ case @result
75
+ when Dry::Validation::Result
76
+ parts << "expected the result to be a failure"
77
+
78
+ if @result.failure?
79
+ # :nocov:
80
+ parts << " with an error at #{@path.keys.inspect}" if @path.present?
81
+
82
+ parts << " with a message matching #{message.inspect}" if message.present?
83
+ # :nocov:
84
+
85
+ parts << ", errors were: #{@errors.inspect}"
86
+ else
87
+ parts << ", but it was a success."
88
+ end
89
+ else
90
+ parts << "expected a Dry::Validation::Result, got #{@result.class}"
91
+ end
92
+ end.join
93
+ end
94
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec::Matchers.define :be_a_monadic_success do
4
+ match do |actual|
5
+ # Handle dry-validation, dry-types pseudo-monads.
6
+ actual.then do |v|
7
+ # :nocov:
8
+ monadic_result = v.to_monad.try(:to_result)
9
+
10
+ @actual = monadic_result if monadic_result.kind_of?(Dry::Monads::Result)
11
+ # :nocov:
12
+ end if actual.respond_to?(:to_monad)
13
+
14
+ @actual ||= actual
15
+
16
+ next false unless @actual.kind_of?(Dry::Monads::Result)
17
+
18
+ if @actual.success? && instance_variable_defined?(:@expected_value)
19
+ values_match? @expected_value, @actual.value!
20
+ else
21
+ @actual.success?
22
+ end
23
+ end
24
+
25
+ chain :with do |value|
26
+ @expected_value = value
27
+ end
28
+
29
+ description do
30
+ "be a monadic success".then do |desc|
31
+ if instance_variable_defined?(:@expected_value)
32
+ "#{desc}, with a value matching #{@expected_value.inspect}"
33
+ else
34
+ desc
35
+ end
36
+ end
37
+ end
38
+
39
+ failure_message do |actual|
40
+ if !actual.kind_of?(Dry::Monads::Result)
41
+ "expected that #{actual.inspect} would be a monadic result"
42
+ elsif actual.success? && instance_variable_defined?(:@expected_value)
43
+ "expected that the successful result (#{actual.value!.inspect}) would match #{@expected_value.inspect}"
44
+ else
45
+ "expected that the result would be a success: #{actual.inspect}"
46
+ end
47
+ end
48
+ end
49
+
50
+ RSpec::Matchers.alias_matcher :succeed, :be_a_monadic_success
51
+
52
+ RSpec::Matchers.define :be_a_monadic_failure do
53
+ match do |actual|
54
+ # Handle dry-validation, dry-types pseudo-monads.
55
+ actual.then do |v|
56
+ # :nocov:
57
+ monadic_result = v.to_monad.try(:to_result)
58
+
59
+ @actual = monadic_result if monadic_result.kind_of?(Dry::Monads::Result)
60
+ # :nocov:
61
+ end if actual.respond_to?(:to_monad)
62
+
63
+ @actual ||= actual
64
+
65
+ next false unless @actual.kind_of?(Dry::Monads::Result)
66
+
67
+ if @actual.failure?
68
+ if instance_variable_defined?(:@key)
69
+ @matched_actual = Array(@actual.failure).first
70
+
71
+ values_match? @key, @matched_actual
72
+ elsif instance_variable_defined?(:@value)
73
+ @matched_actual = @actual.failure
74
+
75
+ values_match? @value, @matched_actual
76
+ else
77
+ true
78
+ end
79
+ else
80
+ false
81
+ end
82
+ end
83
+
84
+ chain :with_key do |key|
85
+ @key = key
86
+ end
87
+
88
+ chain :with do |value|
89
+ @value = value
90
+ end
91
+
92
+ failure_message do |actual|
93
+ if !actual.kind_of?(Dry::Monads::Result)
94
+ "expected that #{actual.inspect} would be a monadic result"
95
+ elsif actual.failure? && instance_variable_defined?(:@key)
96
+ "expected that the failed result (#{@matched_actual.inspect}) would have a key matching #{@key.inspect}"
97
+ elsif actual.failure? && instance_variable_defined?(:@value)
98
+ "expected that the failed result (#{@matched_actual.inspect}) would match #{@value.inspect}"
99
+ else
100
+ "expected that the result would be a failure: #{actual.inspect}"
101
+ end
102
+ end
103
+
104
+ diffable
105
+ end
106
+
107
+ RSpec::Matchers.alias_matcher :monad_fail, :be_a_monadic_failure
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Common negated matchers that I always want defined.
4
+
5
+ RSpec::Matchers.define_negated_matcher :keep_the_same, :change
6
+ RSpec::Matchers.define_negated_matcher :execute_safely, :raise_error
7
+ RSpec::Matchers.define_negated_matcher :exclude, :include
8
+ RSpec::Matchers.define_negated_matcher :have_enqueued_no_jobs, :have_enqueued_job
metadata ADDED
@@ -0,0 +1,377 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hotstepper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexa Grey
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: dry-auto_inject
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: dry-configurable
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: dry-container
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0.8'
47
+ - - "<"
48
+ - !ruby/object:Gem::Version
49
+ version: '2'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0.8'
57
+ - - "<"
58
+ - !ruby/object:Gem::Version
59
+ version: '2'
60
+ - !ruby/object:Gem::Dependency
61
+ name: dry-core
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '1.2'
67
+ - - "<"
68
+ - !ruby/object:Gem::Version
69
+ version: '2'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '1.2'
77
+ - - "<"
78
+ - !ruby/object:Gem::Version
79
+ version: '2'
80
+ - !ruby/object:Gem::Dependency
81
+ name: dry-initializer
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '3.2'
87
+ - - "<"
88
+ - !ruby/object:Gem::Version
89
+ version: '4'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '3.2'
97
+ - - "<"
98
+ - !ruby/object:Gem::Version
99
+ version: '4'
100
+ - !ruby/object:Gem::Dependency
101
+ name: dry-logic
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '1.6'
107
+ - - "<"
108
+ - !ruby/object:Gem::Version
109
+ version: '2'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '1.6'
117
+ - - "<"
118
+ - !ruby/object:Gem::Version
119
+ version: '2'
120
+ - !ruby/object:Gem::Dependency
121
+ name: dry-matcher
122
+ requirement: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '1.0'
127
+ - - "<"
128
+ - !ruby/object:Gem::Version
129
+ version: '2'
130
+ type: :runtime
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '1.0'
137
+ - - "<"
138
+ - !ruby/object:Gem::Version
139
+ version: '2'
140
+ - !ruby/object:Gem::Dependency
141
+ name: dry-monads
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '1.9'
147
+ - - "<"
148
+ - !ruby/object:Gem::Version
149
+ version: '2'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '1.9'
157
+ - - "<"
158
+ - !ruby/object:Gem::Version
159
+ version: '2'
160
+ - !ruby/object:Gem::Dependency
161
+ name: dry-struct
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '1.8'
167
+ - - "<"
168
+ - !ruby/object:Gem::Version
169
+ version: '2'
170
+ type: :runtime
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '1.8'
177
+ - - "<"
178
+ - !ruby/object:Gem::Version
179
+ version: '2'
180
+ - !ruby/object:Gem::Dependency
181
+ name: dry-types
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '1.8'
187
+ - - "<"
188
+ - !ruby/object:Gem::Version
189
+ version: '2'
190
+ type: :runtime
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '1.8'
197
+ - - "<"
198
+ - !ruby/object:Gem::Version
199
+ version: '2'
200
+ - !ruby/object:Gem::Dependency
201
+ name: dry-validation
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ type: :runtime
208
+ prerelease: false
209
+ version_requirements: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ - !ruby/object:Gem::Dependency
215
+ name: pathname
216
+ requirement: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ type: :runtime
222
+ prerelease: false
223
+ version_requirements: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ - !ruby/object:Gem::Dependency
229
+ name: rails
230
+ requirement: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '7.2'
235
+ type: :runtime
236
+ prerelease: false
237
+ version_requirements: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: '7.2'
242
+ - !ruby/object:Gem::Dependency
243
+ name: uri
244
+ requirement: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - ">="
247
+ - !ruby/object:Gem::Version
248
+ version: '0'
249
+ type: :runtime
250
+ prerelease: false
251
+ version_requirements: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ version: '0'
256
+ - !ruby/object:Gem::Dependency
257
+ name: zeitwerk
258
+ requirement: !ruby/object:Gem::Requirement
259
+ requirements:
260
+ - - ">="
261
+ - !ruby/object:Gem::Version
262
+ version: '2.0'
263
+ type: :runtime
264
+ prerelease: false
265
+ version_requirements: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: '2.0'
270
+ description: Hotstepper is a somewhat opinionated service object framework that connects
271
+ dry-initializer with dry-system operations for use in Rails.
272
+ email:
273
+ - devel@mouse.vc
274
+ executables: []
275
+ extensions: []
276
+ extra_rdoc_files: []
277
+ files:
278
+ - MIT-LICENSE
279
+ - README.md
280
+ - Rakefile
281
+ - app/validators/unique_items_validator.rb
282
+ - config/locales/custom-predicates.en.yml
283
+ - config/locales/dry-validation-errors.en.yml
284
+ - config/locales/en.yml
285
+ - config/routes.rb
286
+ - lib/boot/setup.rb
287
+ - lib/generators/hotstepper/service/USAGE
288
+ - lib/generators/hotstepper/service/service_generator.rb
289
+ - lib/generators/hotstepper/service/templates/operation.rb.tt
290
+ - lib/generators/hotstepper/service/templates/service.rb.tt
291
+ - lib/generators/hotstepper/typespace/USAGE
292
+ - lib/generators/hotstepper/typespace/templates/types.rb.tt
293
+ - lib/generators/hotstepper/typespace/typespace_generator.rb
294
+ - lib/hotstepper.rb
295
+ - lib/hotstepper/arel_ext/array_encoding.rb
296
+ - lib/hotstepper/arel_ext/base_helpers.rb
297
+ - lib/hotstepper/arel_ext/helpers.rb
298
+ - lib/hotstepper/arel_ext/json_encoding.rb
299
+ - lib/hotstepper/arel_ext/ltree_encoding.rb
300
+ - lib/hotstepper/arel_ext/postgres_helpers.rb
301
+ - lib/hotstepper/arel_ext/types.rb
302
+ - lib/hotstepper/arel_ext/value_select_query.rb
303
+ - lib/hotstepper/common.rb
304
+ - lib/hotstepper/engine.rb
305
+ - lib/hotstepper/models/association_helpers.rb
306
+ - lib/hotstepper/models/checks_before_destruction.rb
307
+ - lib/hotstepper/models/id_quoting.rb
308
+ - lib/hotstepper/models/lazy_ordering.rb
309
+ - lib/hotstepper/models/limit_to_one.rb
310
+ - lib/hotstepper/models/lookup_helpers.rb
311
+ - lib/hotstepper/models/materialized_view.rb
312
+ - lib/hotstepper/models/model.rb
313
+ - lib/hotstepper/models/querying.rb
314
+ - lib/hotstepper/models/timestamp_scopes.rb
315
+ - lib/hotstepper/models/view.rb
316
+ - lib/hotstepper/models/where_matches.rb
317
+ - lib/hotstepper/monadic.rb
318
+ - lib/hotstepper/monadic/coercion.rb
319
+ - lib/hotstepper/monadic/decorators.rb
320
+ - lib/hotstepper/monadic/do_for.rb
321
+ - lib/hotstepper/operation.rb
322
+ - lib/hotstepper/patterns.rb
323
+ - lib/hotstepper/query_building.rb
324
+ - lib/hotstepper/service.rb
325
+ - lib/hotstepper/steps/abstract_module.rb
326
+ - lib/hotstepper/steps/implementation.rb
327
+ - lib/hotstepper/steps/step.rb
328
+ - lib/hotstepper/steps/watcher.rb
329
+ - lib/hotstepper/steps/wrapper.rb
330
+ - lib/hotstepper/struct.rb
331
+ - lib/hotstepper/support/file_wrapper.rb
332
+ - lib/hotstepper/support/generators/common.rb
333
+ - lib/hotstepper/support/generators/namespaced.rb
334
+ - lib/hotstepper/support/generators/service_operations.rb
335
+ - lib/hotstepper/support/generators/step_definition.rb
336
+ - lib/hotstepper/support/namespace_wrapper.rb
337
+ - lib/hotstepper/support/null_service.rb
338
+ - lib/hotstepper/support/types.rb
339
+ - lib/hotstepper/testing.rb
340
+ - lib/hotstepper/testing/do_for.rb
341
+ - lib/hotstepper/testing/operations.rb
342
+ - lib/hotstepper/testing/typing.rb
343
+ - lib/hotstepper/typespace.rb
344
+ - lib/hotstepper/typing.rb
345
+ - lib/hotstepper/version.rb
346
+ - lib/tasks/hotstepper_tasks.rake
347
+ - lib/testing/contexts/operations.rb
348
+ - lib/testing/matchers/00_disable_with.rb
349
+ - lib/testing/matchers/dry_validation.rb
350
+ - lib/testing/matchers/monadic.rb
351
+ - lib/testing/matchers/negated.rb
352
+ homepage: https://github.com/scryptmouse/hotstepper
353
+ licenses:
354
+ - MIT
355
+ metadata:
356
+ homepage_uri: https://github.com/scryptmouse/hotstepper
357
+ source_code_uri: https://github.com/scryptmouse/hotstepper
358
+ changelog_uri: https://github.com/scryptmouse/hotstepper/CHANGELOG.md
359
+ rubygems_mfa_required: 'true'
360
+ rdoc_options: []
361
+ require_paths:
362
+ - lib
363
+ required_ruby_version: !ruby/object:Gem::Requirement
364
+ requirements:
365
+ - - ">="
366
+ - !ruby/object:Gem::Version
367
+ version: '3.4'
368
+ required_rubygems_version: !ruby/object:Gem::Requirement
369
+ requirements:
370
+ - - ">="
371
+ - !ruby/object:Gem::Version
372
+ version: '0'
373
+ requirements: []
374
+ rubygems_version: 4.0.23
375
+ specification_version: 4
376
+ summary: A simple™ service object framework built atop dry.rb & Rails
377
+ test_files: []