flow 0.3.0 → 0.9.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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/lib/flow.rb +3 -3
  3. data/lib/flow/concerns/transaction_wrapper.rb +27 -0
  4. data/lib/flow/custom_matchers.rb +5 -0
  5. data/lib/flow/custom_matchers/define_argument.rb +19 -0
  6. data/lib/flow/custom_matchers/define_option.rb +26 -0
  7. data/lib/flow/custom_matchers/use_operations.rb +23 -0
  8. data/lib/flow/flow/callbacks.rb +13 -0
  9. data/lib/flow/flow/core.rb +24 -0
  10. data/lib/flow/flow/ebb.rb +28 -0
  11. data/lib/flow/flow/errors/state_invalid.rb +7 -0
  12. data/lib/flow/flow/flux.rb +55 -0
  13. data/lib/flow/flow/operations.rb +27 -0
  14. data/lib/flow/flow/revert.rb +18 -0
  15. data/lib/flow/flow/status.rb +28 -0
  16. data/lib/flow/flow/transactions.rb +14 -0
  17. data/lib/flow/flow/trigger.rb +38 -0
  18. data/lib/flow/flow_base.rb +23 -37
  19. data/lib/flow/operation/callbacks.rb +19 -0
  20. data/lib/flow/operation/error_handler.rb +24 -0
  21. data/lib/flow/operation/execute.rb +25 -12
  22. data/lib/flow/operation/failures.rb +65 -0
  23. data/lib/flow/operation/rewind.rb +24 -0
  24. data/lib/flow/operation/status.rb +28 -0
  25. data/lib/flow/operation/transactions.rb +14 -0
  26. data/lib/flow/operation_base.rb +17 -0
  27. data/lib/flow/shoulda_matcher_helper.rb +7 -0
  28. data/lib/flow/spec_helper.rb +4 -0
  29. data/lib/flow/state/arguments.rb +1 -1
  30. data/lib/flow/state/attributes.rb +1 -2
  31. data/lib/flow/state/callbacks.rb +1 -1
  32. data/lib/flow/state/core.rb +1 -1
  33. data/lib/flow/state/options.rb +4 -2
  34. data/lib/flow/state/string.rb +2 -6
  35. data/lib/flow/state_base.rb +2 -0
  36. data/lib/flow/version.rb +1 -1
  37. data/lib/generators/flow/USAGE +11 -0
  38. data/lib/generators/flow/application_flow/USAGE +9 -0
  39. data/lib/generators/flow/application_flow/application_flow_generator.rb +15 -0
  40. data/lib/generators/flow/application_flow/templates/application_flow.rb +3 -0
  41. data/lib/generators/flow/application_operation/USAGE +9 -0
  42. data/lib/generators/flow/application_operation/application_operation_generator.rb +15 -0
  43. data/lib/generators/flow/application_operation/templates/application_operation.rb +3 -0
  44. data/lib/generators/flow/application_state/USAGE +9 -0
  45. data/lib/generators/flow/application_state/application_state_generator.rb +15 -0
  46. data/lib/generators/flow/application_state/templates/application_state.rb +3 -0
  47. data/lib/generators/flow/flow_generator.rb +18 -0
  48. data/lib/generators/flow/install/USAGE +13 -0
  49. data/lib/generators/flow/install/install_generator.rb +13 -0
  50. data/lib/generators/flow/operation/USAGE +9 -0
  51. data/lib/generators/flow/operation/operation_generator.rb +15 -0
  52. data/lib/generators/flow/operation/templates/operation.rb.erb +7 -0
  53. data/lib/generators/flow/state/USAGE +9 -0
  54. data/lib/generators/flow/state/state_generator.rb +15 -0
  55. data/lib/generators/flow/state/templates/state.rb.erb +8 -0
  56. data/lib/generators/flow/templates/flow.rb.erb +5 -0
  57. data/lib/generators/rspec/application_flow/USAGE +8 -0
  58. data/lib/generators/rspec/application_flow/application_flow_generator.rb +13 -0
  59. data/lib/generators/rspec/application_flow/templates/application_flow_spec.rb +7 -0
  60. data/lib/generators/rspec/application_operation/USAGE +8 -0
  61. data/lib/generators/rspec/application_operation/application_operation_generator.rb +13 -0
  62. data/lib/generators/rspec/application_operation/templates/application_operation_spec.rb +11 -0
  63. data/lib/generators/rspec/application_state/USAGE +8 -0
  64. data/lib/generators/rspec/application_state/application_state_generator.rb +13 -0
  65. data/lib/generators/rspec/application_state/templates/application_state_spec.rb +7 -0
  66. data/lib/generators/rspec/flow/USAGE +8 -0
  67. data/lib/generators/rspec/flow/flow_generator.rb +13 -0
  68. data/lib/generators/rspec/flow/templates/flow_spec.rb.erb +14 -0
  69. data/lib/generators/rspec/operation/USAGE +8 -0
  70. data/lib/generators/rspec/operation/operation_generator.rb +13 -0
  71. data/lib/generators/rspec/operation/templates/operation_spec.rb.erb +24 -0
  72. data/lib/generators/rspec/state/USAGE +8 -0
  73. data/lib/generators/rspec/state/state_generator.rb +13 -0
  74. data/lib/generators/rspec/state/templates/state_spec.rb.erb +18 -0
  75. metadata +93 -4
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flow
4
+ module Generators
5
+ class ApplicationOperationGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ hook_for :test_framework
9
+
10
+ def create_application_operation
11
+ template "application_operation.rb", File.join("app/operations/application_operation.rb")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationOperation < OperationBase; end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Create the ApplicationState and test.
3
+
4
+ Example:
5
+ `rails generate flow:application_state`
6
+
7
+ Generates:
8
+ State: app/states/application_state.rb
9
+ Test: spec/states/application_state_spec.rb
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flow
4
+ module Generators
5
+ class ApplicationStateGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ hook_for :test_framework
9
+
10
+ def create_application_state
11
+ template "application_state.rb", File.join("app/states/application_state.rb")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationState < StateBase; end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flow
4
+ module Generators
5
+ class FlowGenerator < Rails::Generators::NamedBase
6
+ class_option :state, type: :boolean, default: true
7
+
8
+ source_root File.expand_path("templates", __dir__)
9
+
10
+ hook_for :state, as: "flow:state"
11
+ hook_for :test_framework
12
+
13
+ def create_application_flow
14
+ template "flow.rb.erb", File.join("app/flows/", class_path, "#{file_name}_flow.rb")
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ Description:
2
+ Creates ApplicationFlow, ApplicationOperation, and ApplicationState with tests.
3
+
4
+ Example:
5
+ `rails generate flow:install`
6
+
7
+ Generates:
8
+ Flow: app/flows/application_flow.rb
9
+ Operation: app/operations/application_operation.rb
10
+ State: app/states/application_state.rb
11
+ Test: spec/flows/application_flow_spec.rb
12
+ Test: spec/operations/application_operation_spec.rb
13
+ Test: spec/states/application_state_spec.rb
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flow
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ def run_other_generators
7
+ generate "flow:application_flow"
8
+ generate "flow:application_operation"
9
+ generate "flow:application_state"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Stub a Operation with test.
3
+
4
+ Example:
5
+ `rails generate operation foo`
6
+
7
+ Generates:
8
+ Operation: app/operations/foo.rb
9
+ Test: spec/operations/foo_spec.rb
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flow
4
+ module Generators
5
+ class OperationGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ hook_for :test_framework
9
+
10
+ def create_application_state
11
+ template "operation.rb.erb", File.join("app/operations/", class_path, "#{file_name}.rb")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_name %> < ApplicationOperation
4
+ def execute
5
+ # state.foo.blah!
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Stub a State with test.
3
+
4
+ Example:
5
+ `rails generate state foo`
6
+
7
+ Generates:
8
+ State: app/states/foo_state.rb
9
+ Test: spec/states/foo_state_spec.rb
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flow
4
+ module Generators
5
+ class StateGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ hook_for :test_framework
9
+
10
+ def create_application_state
11
+ template "state.rb.erb", File.join("app/states/", class_path, "#{file_name}_state.rb")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_name %>State < ApplicationState
4
+ # argument :required_input
5
+ # option :optional_input
6
+ # option :option_with_default, default: :default_static_value
7
+ # option(:option_with_default_from_block) { required_input.default_dynamic_value }
8
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_name %>Flow < ApplicationFlow
4
+ # operations SomeOperation, SomeOtherOperation
5
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Create ApplicationFlow test.
3
+
4
+ Example:
5
+ `rails generate rspec:application_flow`
6
+
7
+ Generates:
8
+ Test: spec/flows/application_flow_spec.rb
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Generators
5
+ class ApplicationFlowGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def create_spec_file
9
+ template "application_flow_spec.rb", File.join("spec/flows/application_flow_spec.rb")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe ApplicationFlow, type: :flow do
6
+ it { is_expected.to inherit_from FlowBase }
7
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Create ApplicationOperation test.
3
+
4
+ Example:
5
+ `rails generate rspec:application_operation`
6
+
7
+ Generates:
8
+ Test: spec/operations/application_operation_spec.rb
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Generators
5
+ class ApplicationOperationGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def create_spec_file
9
+ template "application_operation_spec.rb", File.join("spec/operations/application_operation_spec.rb")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe ApplicationOperation, type: :operation do
6
+ subject { described_class.new(state) }
7
+
8
+ let(:state) { double }
9
+
10
+ it { is_expected.to inherit_from OperationBase }
11
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Create ApplicationState test.
3
+
4
+ Example:
5
+ `rails generate rspec:application_state`
6
+
7
+ Generates:
8
+ Test: spec/states/application_state_spec.rb
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Generators
5
+ class ApplicationStateGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def create_spec_file
9
+ template "application_state_spec.rb", File.join("spec/states/application_state_spec.rb")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe ApplicationState, type: :state do
6
+ it { is_expected.to inherit_from StateBase }
7
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Stub a Flow test.
3
+
4
+ Example:
5
+ `rails generate rspec:flow foo`
6
+
7
+ Generates:
8
+ Test: spec/flows/foo_flow_spec.rb
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Generators
5
+ class FlowGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def create_spec_file
9
+ template "flow_spec.rb.erb", File.join("spec/flows/", class_path, "#{file_name}_flow_spec.rb")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe <%= class_name %>Flow, type: :flow do
6
+ subject(:flow) { described_class.new(**input) }
7
+
8
+ let(:input) do
9
+ {}
10
+ end
11
+
12
+ it { is_expected.to inherit_from ApplicationFlow }
13
+ # it { is_expected.to use_operations ExampleOperation }
14
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Stub an Operation test.
3
+
4
+ Example:
5
+ `rails generate rspec:operation foo`
6
+
7
+ Generates:
8
+ Test: spec/operations/foo_spec.rb
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Generators
5
+ class OperationGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def create_spec_file
9
+ template "operation_spec.rb.erb", File.join("spec/operations/", class_path, "#{file_name}_spec.rb")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe <%= class_name %>, type: :operation do
6
+ subject(:operation) { described_class.new(state) }
7
+
8
+ let(:state) { example_state_class.new(**state_input) }
9
+ let(:example_state_class) do
10
+ Class.new(ApplicationState) do
11
+ # argument :foo
12
+ # option :bar
13
+ end
14
+ end
15
+ let(:state_input) do
16
+ {}
17
+ end
18
+
19
+ it { is_expected.to inherit_from ApplicationOperation }
20
+
21
+ describe "#execute" do
22
+ pending "add some examples to (or delete) #{__FILE__}"
23
+ end
24
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Stub a State test.
3
+
4
+ Example:
5
+ `rails generate rspec:state foo`
6
+
7
+ Generates:
8
+ Test: spec/states/foo_state_spec.rb
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Generators
5
+ class StateGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def create_spec_file
9
+ template "state_spec.rb.erb", File.join("spec/states/", class_path, "#{file_name}_state_spec.rb")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe <%= class_name %>State, type: :state do
6
+ subject(:state) { described_class.new(**input) }
7
+
8
+ let(:input) do
9
+ {}
10
+ end
11
+
12
+ it { is_expected.to inherit_from ApplicationState }
13
+ # it { is_expected.to define_argument :foo }
14
+ # it { is_expected.to define_option(:foo) }
15
+ # it { is_expected.to define_option(:foo).with_default_value(:bar) }
16
+ # it { is_expected.to define_option(:foo).with_default_value_block }
17
+ # it { is_expected.to validate_presence_of ... }
18
+ end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Garside
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-10 00:00:00.000000000 Z
11
+ date: 2019-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activesupport
14
+ name: activemodel
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
@@ -25,7 +25,21 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.2.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: activemodel
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 5.2.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 5.2.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
@@ -164,6 +178,20 @@ dependencies:
164
178
  - - ">="
165
179
  - !ruby/object:Gem::Version
166
180
  version: 0.11.3
181
+ - !ruby/object:Gem::Dependency
182
+ name: sqlite3
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 1.3.6
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 1.3.6
167
195
  - !ruby/object:Gem::Dependency
168
196
  name: rspice
169
197
  requirement: !ruby/object:Gem::Requirement
@@ -203,10 +231,33 @@ files:
203
231
  - LICENSE.txt
204
232
  - README.md
205
233
  - lib/flow.rb
234
+ - lib/flow/concerns/transaction_wrapper.rb
235
+ - lib/flow/custom_matchers.rb
236
+ - lib/flow/custom_matchers/define_argument.rb
237
+ - lib/flow/custom_matchers/define_option.rb
238
+ - lib/flow/custom_matchers/use_operations.rb
239
+ - lib/flow/flow/callbacks.rb
240
+ - lib/flow/flow/core.rb
241
+ - lib/flow/flow/ebb.rb
242
+ - lib/flow/flow/errors/state_invalid.rb
243
+ - lib/flow/flow/flux.rb
244
+ - lib/flow/flow/operations.rb
245
+ - lib/flow/flow/revert.rb
246
+ - lib/flow/flow/status.rb
247
+ - lib/flow/flow/transactions.rb
248
+ - lib/flow/flow/trigger.rb
206
249
  - lib/flow/flow_base.rb
250
+ - lib/flow/operation/callbacks.rb
207
251
  - lib/flow/operation/core.rb
252
+ - lib/flow/operation/error_handler.rb
208
253
  - lib/flow/operation/execute.rb
254
+ - lib/flow/operation/failures.rb
255
+ - lib/flow/operation/rewind.rb
256
+ - lib/flow/operation/status.rb
257
+ - lib/flow/operation/transactions.rb
209
258
  - lib/flow/operation_base.rb
259
+ - lib/flow/shoulda_matcher_helper.rb
260
+ - lib/flow/spec_helper.rb
210
261
  - lib/flow/state/arguments.rb
211
262
  - lib/flow/state/attributes.rb
212
263
  - lib/flow/state/callbacks.rb
@@ -215,6 +266,44 @@ files:
215
266
  - lib/flow/state/string.rb
216
267
  - lib/flow/state_base.rb
217
268
  - lib/flow/version.rb
269
+ - lib/generators/flow/USAGE
270
+ - lib/generators/flow/application_flow/USAGE
271
+ - lib/generators/flow/application_flow/application_flow_generator.rb
272
+ - lib/generators/flow/application_flow/templates/application_flow.rb
273
+ - lib/generators/flow/application_operation/USAGE
274
+ - lib/generators/flow/application_operation/application_operation_generator.rb
275
+ - lib/generators/flow/application_operation/templates/application_operation.rb
276
+ - lib/generators/flow/application_state/USAGE
277
+ - lib/generators/flow/application_state/application_state_generator.rb
278
+ - lib/generators/flow/application_state/templates/application_state.rb
279
+ - lib/generators/flow/flow_generator.rb
280
+ - lib/generators/flow/install/USAGE
281
+ - lib/generators/flow/install/install_generator.rb
282
+ - lib/generators/flow/operation/USAGE
283
+ - lib/generators/flow/operation/operation_generator.rb
284
+ - lib/generators/flow/operation/templates/operation.rb.erb
285
+ - lib/generators/flow/state/USAGE
286
+ - lib/generators/flow/state/state_generator.rb
287
+ - lib/generators/flow/state/templates/state.rb.erb
288
+ - lib/generators/flow/templates/flow.rb.erb
289
+ - lib/generators/rspec/application_flow/USAGE
290
+ - lib/generators/rspec/application_flow/application_flow_generator.rb
291
+ - lib/generators/rspec/application_flow/templates/application_flow_spec.rb
292
+ - lib/generators/rspec/application_operation/USAGE
293
+ - lib/generators/rspec/application_operation/application_operation_generator.rb
294
+ - lib/generators/rspec/application_operation/templates/application_operation_spec.rb
295
+ - lib/generators/rspec/application_state/USAGE
296
+ - lib/generators/rspec/application_state/application_state_generator.rb
297
+ - lib/generators/rspec/application_state/templates/application_state_spec.rb
298
+ - lib/generators/rspec/flow/USAGE
299
+ - lib/generators/rspec/flow/flow_generator.rb
300
+ - lib/generators/rspec/flow/templates/flow_spec.rb.erb
301
+ - lib/generators/rspec/operation/USAGE
302
+ - lib/generators/rspec/operation/operation_generator.rb
303
+ - lib/generators/rspec/operation/templates/operation_spec.rb.erb
304
+ - lib/generators/rspec/state/USAGE
305
+ - lib/generators/rspec/state/state_generator.rb
306
+ - lib/generators/rspec/state/templates/state_spec.rb.erb
218
307
  homepage: http://www.freshly.com
219
308
  licenses:
220
309
  - MIT