flows 0.1.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +38 -0
  3. data/.gitignore +9 -1
  4. data/.mdlrc +1 -0
  5. data/.reek.yml +54 -0
  6. data/.rubocop.yml +44 -2
  7. data/.ruby-version +1 -1
  8. data/.yardopts +1 -0
  9. data/CHANGELOG.md +65 -0
  10. data/README.md +186 -256
  11. data/Rakefile +35 -1
  12. data/bin/.rubocop.yml +5 -0
  13. data/bin/all_the_errors +55 -0
  14. data/bin/benchmark +69 -78
  15. data/bin/benchmark_cli/compare.rb +118 -0
  16. data/bin/benchmark_cli/compare/a_plus_b.rb +22 -0
  17. data/bin/benchmark_cli/compare/base.rb +45 -0
  18. data/bin/benchmark_cli/compare/command.rb +47 -0
  19. data/bin/benchmark_cli/compare/ten_steps.rb +22 -0
  20. data/bin/benchmark_cli/examples.rb +23 -0
  21. data/bin/benchmark_cli/examples/.rubocop.yml +19 -0
  22. data/bin/benchmark_cli/examples/a_plus_b/dry_do.rb +23 -0
  23. data/bin/benchmark_cli/examples/a_plus_b/dry_transaction.rb +17 -0
  24. data/bin/benchmark_cli/examples/a_plus_b/flows_do.rb +22 -0
  25. data/bin/benchmark_cli/examples/a_plus_b/flows_railway.rb +13 -0
  26. data/bin/benchmark_cli/examples/a_plus_b/flows_scp.rb +13 -0
  27. data/bin/benchmark_cli/examples/a_plus_b/flows_scp_mut.rb +13 -0
  28. data/bin/benchmark_cli/examples/a_plus_b/flows_scp_oc.rb +21 -0
  29. data/bin/benchmark_cli/examples/a_plus_b/trailblazer.rb +15 -0
  30. data/bin/benchmark_cli/examples/ten_steps/dry_do.rb +70 -0
  31. data/bin/benchmark_cli/examples/ten_steps/dry_transaction.rb +64 -0
  32. data/bin/benchmark_cli/examples/ten_steps/flows_do.rb +69 -0
  33. data/bin/benchmark_cli/examples/ten_steps/flows_railway.rb +58 -0
  34. data/bin/benchmark_cli/examples/ten_steps/flows_scp.rb +58 -0
  35. data/bin/benchmark_cli/examples/ten_steps/flows_scp_mut.rb +58 -0
  36. data/bin/benchmark_cli/examples/ten_steps/flows_scp_oc.rb +66 -0
  37. data/bin/benchmark_cli/examples/ten_steps/trailblazer.rb +60 -0
  38. data/bin/benchmark_cli/helpers.rb +12 -0
  39. data/bin/benchmark_cli/ruby.rb +15 -0
  40. data/bin/benchmark_cli/ruby/command.rb +38 -0
  41. data/bin/benchmark_cli/ruby/method_exec.rb +71 -0
  42. data/bin/benchmark_cli/ruby/self_class.rb +69 -0
  43. data/bin/benchmark_cli/ruby/structs.rb +90 -0
  44. data/bin/console +1 -0
  45. data/bin/docserver +7 -0
  46. data/bin/errors +130 -0
  47. data/bin/errors_cli/contract_error_demo.rb +49 -0
  48. data/bin/errors_cli/di_error_demo.rb +38 -0
  49. data/bin/errors_cli/flow_error_demo.rb +22 -0
  50. data/bin/errors_cli/flows_router_error_demo.rb +15 -0
  51. data/bin/errors_cli/oc_error_demo.rb +40 -0
  52. data/bin/errors_cli/railway_error_demo.rb +10 -0
  53. data/bin/errors_cli/result_error_demo.rb +13 -0
  54. data/bin/errors_cli/scp_error_demo.rb +17 -0
  55. data/docs/.nojekyll +0 -0
  56. data/docs/README.md +13 -0
  57. data/docs/_sidebar.md +2 -0
  58. data/docs/index.html +30 -0
  59. data/flows.gemspec +27 -2
  60. data/forspell.dict +17 -0
  61. data/lefthook.yml +21 -0
  62. data/lib/flows.rb +13 -5
  63. data/lib/flows/contract.rb +402 -0
  64. data/lib/flows/contract/array.rb +55 -0
  65. data/lib/flows/contract/case_eq.rb +43 -0
  66. data/lib/flows/contract/compose.rb +77 -0
  67. data/lib/flows/contract/either.rb +53 -0
  68. data/lib/flows/contract/error.rb +25 -0
  69. data/lib/flows/contract/hash.rb +75 -0
  70. data/lib/flows/contract/hash_of.rb +70 -0
  71. data/lib/flows/contract/helpers.rb +22 -0
  72. data/lib/flows/contract/predicate.rb +34 -0
  73. data/lib/flows/contract/transformer.rb +50 -0
  74. data/lib/flows/contract/tuple.rb +70 -0
  75. data/lib/flows/flow.rb +96 -7
  76. data/lib/flows/flow/errors.rb +29 -0
  77. data/lib/flows/flow/node.rb +132 -0
  78. data/lib/flows/flow/router.rb +29 -0
  79. data/lib/flows/flow/router/custom.rb +59 -0
  80. data/lib/flows/flow/router/errors.rb +11 -0
  81. data/lib/flows/flow/router/simple.rb +25 -0
  82. data/lib/flows/plugin.rb +14 -0
  83. data/lib/flows/plugin/dependency_injector.rb +159 -0
  84. data/lib/flows/plugin/dependency_injector/dependency.rb +24 -0
  85. data/lib/flows/plugin/dependency_injector/dependency_definition.rb +16 -0
  86. data/lib/flows/plugin/dependency_injector/dependency_list.rb +57 -0
  87. data/lib/flows/plugin/dependency_injector/errors.rb +58 -0
  88. data/lib/flows/plugin/implicit_init.rb +45 -0
  89. data/lib/flows/plugin/output_contract.rb +85 -0
  90. data/lib/flows/plugin/output_contract/dsl.rb +48 -0
  91. data/lib/flows/plugin/output_contract/errors.rb +74 -0
  92. data/lib/flows/plugin/output_contract/wrapper.rb +55 -0
  93. data/lib/flows/plugin/profiler.rb +114 -0
  94. data/lib/flows/plugin/profiler/injector.rb +35 -0
  95. data/lib/flows/plugin/profiler/report.rb +48 -0
  96. data/lib/flows/plugin/profiler/report/events.rb +43 -0
  97. data/lib/flows/plugin/profiler/report/flat.rb +41 -0
  98. data/lib/flows/plugin/profiler/report/flat/method_report.rb +81 -0
  99. data/lib/flows/plugin/profiler/report/raw.rb +15 -0
  100. data/lib/flows/plugin/profiler/report/tree.rb +98 -0
  101. data/lib/flows/plugin/profiler/report/tree/calculated_node.rb +116 -0
  102. data/lib/flows/plugin/profiler/report/tree/node.rb +35 -0
  103. data/lib/flows/plugin/profiler/wrapper.rb +53 -0
  104. data/lib/flows/railway.rb +154 -0
  105. data/lib/flows/railway/dsl.rb +18 -0
  106. data/lib/flows/railway/errors.rb +17 -0
  107. data/lib/flows/railway/step.rb +24 -0
  108. data/lib/flows/railway/step_list.rb +38 -0
  109. data/lib/flows/result.rb +189 -2
  110. data/lib/flows/result/do.rb +172 -0
  111. data/lib/flows/result/err.rb +12 -6
  112. data/lib/flows/result/errors.rb +29 -17
  113. data/lib/flows/result/helpers.rb +25 -3
  114. data/lib/flows/result/ok.rb +12 -6
  115. data/lib/flows/shared_context_pipeline.rb +299 -0
  116. data/lib/flows/shared_context_pipeline/dsl.rb +12 -0
  117. data/lib/flows/shared_context_pipeline/dsl/callbacks.rb +38 -0
  118. data/lib/flows/shared_context_pipeline/dsl/tracks.rb +52 -0
  119. data/lib/flows/shared_context_pipeline/errors.rb +17 -0
  120. data/lib/flows/shared_context_pipeline/mutation_step.rb +29 -0
  121. data/lib/flows/shared_context_pipeline/router_definition.rb +21 -0
  122. data/lib/flows/shared_context_pipeline/step.rb +44 -0
  123. data/lib/flows/shared_context_pipeline/track.rb +54 -0
  124. data/lib/flows/shared_context_pipeline/track_list.rb +51 -0
  125. data/lib/flows/shared_context_pipeline/wrap.rb +74 -0
  126. data/lib/flows/util.rb +17 -0
  127. data/lib/flows/util/inheritable_singleton_vars.rb +86 -0
  128. data/lib/flows/util/inheritable_singleton_vars/dup_strategy.rb +98 -0
  129. data/lib/flows/util/inheritable_singleton_vars/isolation_strategy.rb +91 -0
  130. data/lib/flows/util/prepend_to_class.rb +179 -0
  131. data/lib/flows/version.rb +1 -1
  132. metadata +288 -20
  133. data/.travis.yml +0 -8
  134. data/Gemfile.lock +0 -119
  135. data/bin/demo +0 -66
  136. data/bin/examples.rb +0 -159
  137. data/bin/profile_10steps +0 -64
  138. data/bin/ruby_benchmarks +0 -26
  139. data/lib/flows/node.rb +0 -27
  140. data/lib/flows/operation.rb +0 -54
  141. data/lib/flows/operation/builder.rb +0 -130
  142. data/lib/flows/operation/builder/build_router.rb +0 -37
  143. data/lib/flows/operation/dsl.rb +0 -72
  144. data/lib/flows/operation/errors.rb +0 -75
  145. data/lib/flows/operation/executor.rb +0 -78
  146. data/lib/flows/result_router.rb +0 -14
  147. data/lib/flows/router.rb +0 -22
@@ -0,0 +1,98 @@
1
+ module Flows
2
+ module Util
3
+ module InheritableSingletonVars
4
+ # Strategy which uses `#dup` to copy variables to a child class.
5
+ #
6
+ # Can be applied several times to the same class.
7
+ #
8
+ # Can be applied in the middle of inheritance chain.
9
+ #
10
+ # When your value is a custom class you may need to adjust `#dup` behaviour.
11
+ # It can be done using `initialize_dup` method.
12
+ # Unfortunately it's not documented well in the standard library.
13
+ # So, [this will help you](https://blog.appsignal.com/2019/02/26/diving-into-dup-and-clone.html).
14
+ #
15
+ # @note If you change variables in a parent class after a child being defined
16
+ # it will have no effect on a child. Remember this when working in environments
17
+ # with tricky or experimental autoload mechanism.
18
+ #
19
+ # @see InheritableSingletonVars the parent module's documentation describes the problem this module solves.
20
+ #
21
+ # @since 0.4.0
22
+ module DupStrategy
23
+ VAR_LIST_VAR_NAME = :@inheritable_vars_with_dup
24
+
25
+ # @api private
26
+ module Migrator
27
+ def self.call(from, to)
28
+ parent_var_list = from.instance_variable_get(VAR_LIST_VAR_NAME)
29
+ child_var_list = to.instance_variable_get(VAR_LIST_VAR_NAME) || []
30
+
31
+ to.instance_variable_set(VAR_LIST_VAR_NAME, child_var_list + parent_var_list)
32
+
33
+ parent_var_list.each do |name|
34
+ to.instance_variable_set(name, from.instance_variable_get(name).dup)
35
+ end
36
+ end
37
+ end
38
+
39
+ # @api private
40
+ module Injector
41
+ def included(mod)
42
+ Migrator.call(self, mod)
43
+ mod.singleton_class.prepend Injector
44
+
45
+ super
46
+ end
47
+
48
+ def extended(mod)
49
+ Migrator.call(self, mod)
50
+ mod.singleton_class.prepend Injector
51
+
52
+ super
53
+ end
54
+
55
+ def inherited(mod)
56
+ Migrator.call(self, mod)
57
+ mod.singleton_class.prepend Injector
58
+
59
+ super
60
+ end
61
+ end
62
+
63
+ class << self
64
+ # Generates a module which applies behaviour and defaults for singleton variables.
65
+ #
66
+ # @example
67
+ # class MyClass
68
+ # SingletonVarsSetup = Flows::Util::InheritableSingletonVars::DupStrategy.make_module(
69
+ # :@my_list => []
70
+ # )
71
+ #
72
+ # include SingletonVarsSetup
73
+ # end
74
+ #
75
+ # @note Variable names should look like `:@var` or `'@var'`.
76
+ #
77
+ # @param vars_with_default [Hash<Symbol, String => Object>] keys are variable names,
78
+ # values are default values.
79
+ def make_module(vars_with_default = {})
80
+ Module.new.tap do |mod|
81
+ mod.instance_variable_set(VAR_LIST_VAR_NAME, vars_with_default.keys.map(&:to_sym))
82
+ init_vars(mod, vars_with_default)
83
+ mod.extend Injector
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ def init_vars(mod, vars_with_default)
90
+ vars_with_default.each do |name, value|
91
+ mod.instance_variable_set(name, value)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,91 @@
1
+ module Flows
2
+ module Util
3
+ module InheritableSingletonVars
4
+ # Strategy which uses procs to generate initial values in target class and children.
5
+ #
6
+ # This strategy designed to make fully isolated singleton variables between classes.
7
+ #
8
+ # Can be applied several times to the same class.
9
+ #
10
+ # Can be applied in the middle of inheritance chain.
11
+ #
12
+ # @see InheritableSingletonVars the parent module's documentation describes the problem this module solves.
13
+ #
14
+ # @since 0.4.0
15
+ module IsolationStrategy
16
+ VAR_MAP_VAR_NAME = :@inheritable_vars_with_isolation
17
+
18
+ # @api private
19
+ module Migrator
20
+ def self.call(from, to)
21
+ parent_var_map = from.instance_variable_get(VAR_MAP_VAR_NAME)
22
+ child_var_map = to.instance_variable_get(VAR_MAP_VAR_NAME) || {}
23
+
24
+ to.instance_variable_set(VAR_MAP_VAR_NAME, child_var_map.merge(parent_var_map))
25
+
26
+ parent_var_map.each do |name, value_proc|
27
+ to.instance_variable_set(name, value_proc.call)
28
+ end
29
+ end
30
+ end
31
+
32
+ # @api private
33
+ module Injector
34
+ def included(mod)
35
+ Migrator.call(self, mod)
36
+ mod.singleton_class.prepend Injector
37
+
38
+ super
39
+ end
40
+
41
+ def extended(mod)
42
+ Migrator.call(self, mod)
43
+ mod.singleton_class.prepend Injector
44
+
45
+ super
46
+ end
47
+
48
+ def inherited(mod)
49
+ Migrator.call(self, mod)
50
+ mod.singleton_class.prepend Injector
51
+
52
+ super
53
+ end
54
+ end
55
+
56
+ class << self
57
+ # Applies behaviour and defaults for singleton variables.
58
+ #
59
+ # @example
60
+ # class MyClass
61
+ # SingletonVarsSetup = Flows::Util::InheritableSingletonVars::IsolationStrategy.make_module(
62
+ # :@my_list => -> { [] }
63
+ # )
64
+ #
65
+ # include SingletonVarsSetup
66
+ # end
67
+ #
68
+ # @note Variable names should look like `:@var` or `'@var'`.
69
+ #
70
+ # @param vars_with_default [Hash<Symbol, String => Proc>] keys are variable names,
71
+ # values are procs or lambdas which return default values.
72
+ def make_module(vars_with_default = {})
73
+ Module.new.tap do |mod|
74
+ mod.instance_variable_set(VAR_MAP_VAR_NAME, vars_with_default.dup)
75
+ init_vars(mod, vars_with_default)
76
+ mod.extend Injector
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def init_vars(mod, vars_with_default)
83
+ vars_with_default.each do |name, value_proc|
84
+ mod.instance_variable_set(name, value_proc.call)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,179 @@
1
+ module Flows
2
+ module Util
3
+ # In the situation when a module is included into another module and only afterwards included into class,
4
+ # allows to force particular module to be prepended to a class only.
5
+ #
6
+ # When you write some module to abstract out some behaviour you may
7
+ # need a way to expand initializer behaviour of a target class.
8
+ # You can prepend a module with an initializer wrapper inside `.included(mod)`
9
+ # or `.extended(mod)` callbacks. But it will not work if you include your module into module
10
+ # and only after to a class. It's one of the cases when `PrependToClass` can help you.
11
+ #
12
+ # Let's show it on example: we need a module which expands initializer to accept `:data`
13
+ # keyword argument and sets its value:
14
+ #
15
+ # class MyClass
16
+ # prepend HasData
17
+ #
18
+ # attr_reader :greeting
19
+ #
20
+ # def initialize
21
+ # @greeting = 'Hello'
22
+ # end
23
+ # end
24
+ #
25
+ # module HasData
26
+ # attr_reader :data
27
+ #
28
+ # def initialize(*args, **kwargs, &block)
29
+ # @data = kwargs[:data]
30
+ #
31
+ # filtered_kwargs = kwargs.reject { |k, _| k == :data }
32
+ #
33
+ # if filtered_kwargs.empty? # https://bugs.ruby-lang.org/issues/14415
34
+ # super(*args, &block)
35
+ # else
36
+ # super(*args, **filtered_kwargs, &block)
37
+ # end
38
+ # end
39
+ #
40
+ # def big_data
41
+ # data.upcase
42
+ # end
43
+ # end
44
+ #
45
+ # x = MyClass.new(data: 'aaa')
46
+ #
47
+ # x.greeting
48
+ # # => 'Hello'
49
+ #
50
+ # x.data
51
+ # # => 'aaa'
52
+ #
53
+ # x.big_data
54
+ # # => 'aaa'
55
+ #
56
+ # This implementation works, but has a problem:
57
+ #
58
+ # class AnotherClass
59
+ # include Stuff
60
+ #
61
+ # attr_reader :greeting
62
+ #
63
+ # def initialize
64
+ # @greeting = 'Hello'
65
+ # end
66
+ # end
67
+ #
68
+ # module Stuff
69
+ # prepend HasData
70
+ # end
71
+ #
72
+ # x = AnotherClass.new(data: 'aaa')
73
+ # # ArgumentError: wrong number of arguments (given 1, expected 0)
74
+ #
75
+ # This happens because `prepend` prepends our patch to `Stuff` module, not class.
76
+ # {PrependToClass} solves this problem:
77
+ #
78
+ # module HasData
79
+ # attr_reader :data
80
+ #
81
+ # InitializePatch = Flows::Util::PrependToClass.make_module do
82
+ # def initialize(*args, **kwargs, &block)
83
+ # @data = kwargs[:data]
84
+ #
85
+ # filtered_kwargs = kwargs.reject { |k, _| k == :data }
86
+ #
87
+ # if filtered_kwargs.empty? # https://bugs.ruby-lang.org/issues/14415
88
+ # super(*args, &block)
89
+ # else
90
+ # super(*args, **filtered_kwargs, &block)
91
+ # end
92
+ # end
93
+ # end
94
+ #
95
+ # include InitializePatch
96
+ # end
97
+ #
98
+ # module Stuff
99
+ # include HasData
100
+ # end
101
+ #
102
+ # class MyClass
103
+ # include Stuff
104
+ #
105
+ # attr_reader :greeting
106
+ #
107
+ # def initialize
108
+ # @greeting = 'Hello'
109
+ # end
110
+ # end
111
+ #
112
+ # x = MyClass.new(data: 'data')
113
+ #
114
+ # x.data
115
+ # # => 'data'
116
+ #
117
+ # x.greeting
118
+ # # => 'hello'
119
+ #
120
+ # @note this solution is designed to patch `include` behaviour and
121
+ # has no effect on `extend`.
122
+ module PrependToClass
123
+ class << self
124
+ # Allows to prepend some module to class when
125
+ # host module included into class.
126
+ #
127
+ # Under the hood two modules are created:
128
+ #
129
+ # * "to prepend" module made from provided block
130
+ # * "container" module which will be returned by this method
131
+ #
132
+ # When you include "container" module into your module `Mod`
133
+ # you're enabling the following behaviour:
134
+ #
135
+ # * when `Mod` included into class - "to prepend" module will be prepended to class
136
+ # * when `Mod` is included into some module `Mod2` - `Mod2` also will
137
+ # prepend "to prepend" module when included into class.
138
+ # * you can include `Mod` into `Mod2`, then include `Mod2` into `Mod3` -
139
+ # desribed behavior works for include chain of any length.
140
+ #
141
+ # Moreover, this behaviour also works with `extend`, not only `include`.
142
+ #
143
+ # @yield body for module which will be prepended
144
+ # @return [Module] module to be included or extended into your module
145
+ def make_module(&module_body)
146
+ Module.new.tap do |mod|
147
+ to_prepend_mod = Module.new(&module_body)
148
+ mod.const_set(:ToPrepend, to_prepend_mod)
149
+
150
+ set_injector_mod(mod, to_prepend_mod)
151
+ end
152
+ end
153
+
154
+ private
155
+
156
+ def set_injector_mod(mod, module_to_prepend)
157
+ injector = make_injector_mod(module_to_prepend)
158
+
159
+ mod.const_set(:Injector, injector)
160
+ mod.singleton_class.prepend(injector)
161
+ end
162
+
163
+ def make_injector_mod(module_to_prepend)
164
+ Module.new.tap do |injector|
165
+ injector.define_method(:included) do |target_mod|
166
+ if target_mod.class == Class
167
+ target_mod.prepend(module_to_prepend)
168
+ else # Module
169
+ target_mod.singleton_class.prepend injector
170
+ end
171
+
172
+ super(target_mod)
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
@@ -1,3 +1,3 @@
1
1
  module Flows
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.5.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flows
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Kolesnev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-05 00:00:00.000000000 Z
11
+ date: 2020-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,76 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: forspell
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.0.8
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.0.8
83
+ - !ruby/object:Gem::Dependency
84
+ name: inch
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: mdl
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: reek
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
55
125
  - !ruby/object:Gem::Dependency
56
126
  name: rubocop
57
127
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +136,20 @@ dependencies:
66
136
  - - ">="
67
137
  - !ruby/object:Gem::Version
68
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-md
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
69
153
  - !ruby/object:Gem::Dependency
70
154
  name: rubocop-performance
71
155
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +178,20 @@ dependencies:
94
178
  - - ">="
95
179
  - !ruby/object:Gem::Version
96
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: awesome_print
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
97
195
  - !ruby/object:Gem::Dependency
98
196
  name: pry
99
197
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +248,20 @@ dependencies:
150
248
  - - ">="
151
249
  - !ruby/object:Gem::Version
152
250
  version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: kalibera
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
153
265
  - !ruby/object:Gem::Dependency
154
266
  name: ruby-prof
155
267
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +290,62 @@ dependencies:
178
290
  - - ">="
179
291
  - !ruby/object:Gem::Version
180
292
  version: '0'
293
+ - !ruby/object:Gem::Dependency
294
+ name: gli
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - ">="
305
+ - !ruby/object:Gem::Version
306
+ version: '0'
307
+ - !ruby/object:Gem::Dependency
308
+ name: rainbow
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - ">="
312
+ - !ruby/object:Gem::Version
313
+ version: '0'
314
+ type: :development
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ">="
319
+ - !ruby/object:Gem::Version
320
+ version: '0'
321
+ - !ruby/object:Gem::Dependency
322
+ name: warning
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
335
+ - !ruby/object:Gem::Dependency
336
+ name: dry-monads
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - "~>"
340
+ - !ruby/object:Gem::Version
341
+ version: '1.3'
342
+ type: :development
343
+ prerelease: false
344
+ version_requirements: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - "~>"
347
+ - !ruby/object:Gem::Version
348
+ version: '1.3'
181
349
  - !ruby/object:Gem::Dependency
182
350
  name: dry-transaction
183
351
  requirement: !ruby/object:Gem::Requirement
@@ -213,41 +381,140 @@ executables: []
213
381
  extensions: []
214
382
  extra_rdoc_files: []
215
383
  files:
384
+ - ".github/workflows/test.yml"
216
385
  - ".gitignore"
386
+ - ".mdlrc"
387
+ - ".reek.yml"
217
388
  - ".rspec"
218
389
  - ".rubocop.yml"
219
390
  - ".ruby-version"
220
- - ".travis.yml"
391
+ - ".yardopts"
392
+ - CHANGELOG.md
221
393
  - CODE_OF_CONDUCT.md
222
394
  - Gemfile
223
- - Gemfile.lock
224
395
  - LICENSE.txt
225
396
  - README.md
226
397
  - Rakefile
398
+ - bin/.rubocop.yml
399
+ - bin/all_the_errors
227
400
  - bin/benchmark
401
+ - bin/benchmark_cli/compare.rb
402
+ - bin/benchmark_cli/compare/a_plus_b.rb
403
+ - bin/benchmark_cli/compare/base.rb
404
+ - bin/benchmark_cli/compare/command.rb
405
+ - bin/benchmark_cli/compare/ten_steps.rb
406
+ - bin/benchmark_cli/examples.rb
407
+ - bin/benchmark_cli/examples/.rubocop.yml
408
+ - bin/benchmark_cli/examples/a_plus_b/dry_do.rb
409
+ - bin/benchmark_cli/examples/a_plus_b/dry_transaction.rb
410
+ - bin/benchmark_cli/examples/a_plus_b/flows_do.rb
411
+ - bin/benchmark_cli/examples/a_plus_b/flows_railway.rb
412
+ - bin/benchmark_cli/examples/a_plus_b/flows_scp.rb
413
+ - bin/benchmark_cli/examples/a_plus_b/flows_scp_mut.rb
414
+ - bin/benchmark_cli/examples/a_plus_b/flows_scp_oc.rb
415
+ - bin/benchmark_cli/examples/a_plus_b/trailblazer.rb
416
+ - bin/benchmark_cli/examples/ten_steps/dry_do.rb
417
+ - bin/benchmark_cli/examples/ten_steps/dry_transaction.rb
418
+ - bin/benchmark_cli/examples/ten_steps/flows_do.rb
419
+ - bin/benchmark_cli/examples/ten_steps/flows_railway.rb
420
+ - bin/benchmark_cli/examples/ten_steps/flows_scp.rb
421
+ - bin/benchmark_cli/examples/ten_steps/flows_scp_mut.rb
422
+ - bin/benchmark_cli/examples/ten_steps/flows_scp_oc.rb
423
+ - bin/benchmark_cli/examples/ten_steps/trailblazer.rb
424
+ - bin/benchmark_cli/helpers.rb
425
+ - bin/benchmark_cli/ruby.rb
426
+ - bin/benchmark_cli/ruby/command.rb
427
+ - bin/benchmark_cli/ruby/method_exec.rb
428
+ - bin/benchmark_cli/ruby/self_class.rb
429
+ - bin/benchmark_cli/ruby/structs.rb
228
430
  - bin/console
229
- - bin/demo
230
- - bin/examples.rb
231
- - bin/profile_10steps
232
- - bin/ruby_benchmarks
431
+ - bin/docserver
432
+ - bin/errors
433
+ - bin/errors_cli/contract_error_demo.rb
434
+ - bin/errors_cli/di_error_demo.rb
435
+ - bin/errors_cli/flow_error_demo.rb
436
+ - bin/errors_cli/flows_router_error_demo.rb
437
+ - bin/errors_cli/oc_error_demo.rb
438
+ - bin/errors_cli/railway_error_demo.rb
439
+ - bin/errors_cli/result_error_demo.rb
440
+ - bin/errors_cli/scp_error_demo.rb
233
441
  - bin/setup
442
+ - docs/.nojekyll
443
+ - docs/README.md
444
+ - docs/_sidebar.md
445
+ - docs/index.html
234
446
  - flows.gemspec
447
+ - forspell.dict
448
+ - lefthook.yml
235
449
  - lib/flows.rb
450
+ - lib/flows/contract.rb
451
+ - lib/flows/contract/array.rb
452
+ - lib/flows/contract/case_eq.rb
453
+ - lib/flows/contract/compose.rb
454
+ - lib/flows/contract/either.rb
455
+ - lib/flows/contract/error.rb
456
+ - lib/flows/contract/hash.rb
457
+ - lib/flows/contract/hash_of.rb
458
+ - lib/flows/contract/helpers.rb
459
+ - lib/flows/contract/predicate.rb
460
+ - lib/flows/contract/transformer.rb
461
+ - lib/flows/contract/tuple.rb
236
462
  - lib/flows/flow.rb
237
- - lib/flows/node.rb
238
- - lib/flows/operation.rb
239
- - lib/flows/operation/builder.rb
240
- - lib/flows/operation/builder/build_router.rb
241
- - lib/flows/operation/dsl.rb
242
- - lib/flows/operation/errors.rb
243
- - lib/flows/operation/executor.rb
463
+ - lib/flows/flow/errors.rb
464
+ - lib/flows/flow/node.rb
465
+ - lib/flows/flow/router.rb
466
+ - lib/flows/flow/router/custom.rb
467
+ - lib/flows/flow/router/errors.rb
468
+ - lib/flows/flow/router/simple.rb
469
+ - lib/flows/plugin.rb
470
+ - lib/flows/plugin/dependency_injector.rb
471
+ - lib/flows/plugin/dependency_injector/dependency.rb
472
+ - lib/flows/plugin/dependency_injector/dependency_definition.rb
473
+ - lib/flows/plugin/dependency_injector/dependency_list.rb
474
+ - lib/flows/plugin/dependency_injector/errors.rb
475
+ - lib/flows/plugin/implicit_init.rb
476
+ - lib/flows/plugin/output_contract.rb
477
+ - lib/flows/plugin/output_contract/dsl.rb
478
+ - lib/flows/plugin/output_contract/errors.rb
479
+ - lib/flows/plugin/output_contract/wrapper.rb
480
+ - lib/flows/plugin/profiler.rb
481
+ - lib/flows/plugin/profiler/injector.rb
482
+ - lib/flows/plugin/profiler/report.rb
483
+ - lib/flows/plugin/profiler/report/events.rb
484
+ - lib/flows/plugin/profiler/report/flat.rb
485
+ - lib/flows/plugin/profiler/report/flat/method_report.rb
486
+ - lib/flows/plugin/profiler/report/raw.rb
487
+ - lib/flows/plugin/profiler/report/tree.rb
488
+ - lib/flows/plugin/profiler/report/tree/calculated_node.rb
489
+ - lib/flows/plugin/profiler/report/tree/node.rb
490
+ - lib/flows/plugin/profiler/wrapper.rb
491
+ - lib/flows/railway.rb
492
+ - lib/flows/railway/dsl.rb
493
+ - lib/flows/railway/errors.rb
494
+ - lib/flows/railway/step.rb
495
+ - lib/flows/railway/step_list.rb
244
496
  - lib/flows/result.rb
497
+ - lib/flows/result/do.rb
245
498
  - lib/flows/result/err.rb
246
499
  - lib/flows/result/errors.rb
247
500
  - lib/flows/result/helpers.rb
248
501
  - lib/flows/result/ok.rb
249
- - lib/flows/result_router.rb
250
- - lib/flows/router.rb
502
+ - lib/flows/shared_context_pipeline.rb
503
+ - lib/flows/shared_context_pipeline/dsl.rb
504
+ - lib/flows/shared_context_pipeline/dsl/callbacks.rb
505
+ - lib/flows/shared_context_pipeline/dsl/tracks.rb
506
+ - lib/flows/shared_context_pipeline/errors.rb
507
+ - lib/flows/shared_context_pipeline/mutation_step.rb
508
+ - lib/flows/shared_context_pipeline/router_definition.rb
509
+ - lib/flows/shared_context_pipeline/step.rb
510
+ - lib/flows/shared_context_pipeline/track.rb
511
+ - lib/flows/shared_context_pipeline/track_list.rb
512
+ - lib/flows/shared_context_pipeline/wrap.rb
513
+ - lib/flows/util.rb
514
+ - lib/flows/util/inheritable_singleton_vars.rb
515
+ - lib/flows/util/inheritable_singleton_vars/dup_strategy.rb
516
+ - lib/flows/util/inheritable_singleton_vars/isolation_strategy.rb
517
+ - lib/flows/util/prepend_to_class.rb
251
518
  - lib/flows/version.rb
252
519
  - profile/.keep
253
520
  homepage: https://github.com/ffloyd/flows
@@ -272,5 +539,6 @@ requirements: []
272
539
  rubygems_version: 3.0.3
273
540
  signing_key:
274
541
  specification_version: 4
275
- summary: Ruby framework for building FSM-like data flows.
542
+ summary: Ruby framework for building your Business Logic Layer inside Rails and other
543
+ frameworks.
276
544
  test_files: []