mini_camel 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +4 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +4 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.md +22 -0
  9. data/README.md +300 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/examples/hello_world.rb +106 -0
  14. data/lib/mini_camel.rb +63 -0
  15. data/lib/mini_camel/context.rb +5 -0
  16. data/lib/mini_camel/default_error_handler.rb +37 -0
  17. data/lib/mini_camel/dto.rb +55 -0
  18. data/lib/mini_camel/environment.rb +66 -0
  19. data/lib/mini_camel/error.rb +57 -0
  20. data/lib/mini_camel/exchange.rb +80 -0
  21. data/lib/mini_camel/exchange_error.rb +36 -0
  22. data/lib/mini_camel/exchange_result.rb +5 -0
  23. data/lib/mini_camel/interactor.rb +13 -0
  24. data/lib/mini_camel/processor/base.rb +14 -0
  25. data/lib/mini_camel/processor/each.rb +28 -0
  26. data/lib/mini_camel/processor/expose_field.rb +29 -0
  27. data/lib/mini_camel/processor/expose_fields.rb +34 -0
  28. data/lib/mini_camel/processor/extract_result.rb +22 -0
  29. data/lib/mini_camel/processor/mutate.rb +18 -0
  30. data/lib/mini_camel/processor/mutate_each.rb +16 -0
  31. data/lib/mini_camel/processor/pipeline.rb +19 -0
  32. data/lib/mini_camel/processor/process.rb +22 -0
  33. data/lib/mini_camel/processor/process_each.rb +16 -0
  34. data/lib/mini_camel/processor/produce.rb +17 -0
  35. data/lib/mini_camel/processor/to.rb +15 -0
  36. data/lib/mini_camel/processor/transform.rb +15 -0
  37. data/lib/mini_camel/processor/transform_each.rb +15 -0
  38. data/lib/mini_camel/processor/validate.rb +21 -0
  39. data/lib/mini_camel/processor/wrap_in_dto.rb +19 -0
  40. data/lib/mini_camel/processor_definition/base.rb +13 -0
  41. data/lib/mini_camel/processor_definition/each.rb +20 -0
  42. data/lib/mini_camel/processor_definition/expose_field.rb +28 -0
  43. data/lib/mini_camel/processor_definition/expose_fields.rb +19 -0
  44. data/lib/mini_camel/processor_definition/extract_result.rb +17 -0
  45. data/lib/mini_camel/processor_definition/mutate.rb +21 -0
  46. data/lib/mini_camel/processor_definition/mutate_each.rb +15 -0
  47. data/lib/mini_camel/processor_definition/pipeline.rb +17 -0
  48. data/lib/mini_camel/processor_definition/process.rb +19 -0
  49. data/lib/mini_camel/processor_definition/process_each.rb +14 -0
  50. data/lib/mini_camel/processor_definition/produce.rb +20 -0
  51. data/lib/mini_camel/processor_definition/to.rb +17 -0
  52. data/lib/mini_camel/processor_definition/transform.rb +17 -0
  53. data/lib/mini_camel/processor_definition/transform_each.rb +20 -0
  54. data/lib/mini_camel/processor_definition/validate.rb +26 -0
  55. data/lib/mini_camel/processor_definition/wrap_in_dto.rb +21 -0
  56. data/lib/mini_camel/route.rb +21 -0
  57. data/lib/mini_camel/route_builder.rb +24 -0
  58. data/lib/mini_camel/route_collection.rb +16 -0
  59. data/lib/mini_camel/route_definition.rb +146 -0
  60. data/lib/mini_camel/route_dispatcher.rb +37 -0
  61. data/lib/mini_camel/route_finalizer.rb +38 -0
  62. data/lib/mini_camel/route_generator.rb +32 -0
  63. data/lib/mini_camel/strict_dto.rb +36 -0
  64. data/lib/mini_camel/version.rb +3 -0
  65. data/mini_camel.gemspec +30 -0
  66. metadata +237 -0
@@ -0,0 +1,29 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class ExposeField < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+ attribute :from, Symbol
8
+ attribute :as, Symbol
9
+ end
10
+
11
+ def call(exchange)
12
+ from_value = exchange.context_fetch(from)
13
+
14
+ if from_value.is_a?(Hash)
15
+ field_value = from_value[field]
16
+ else
17
+ if !from_value.respond_to?(field)
18
+ raise ArgumentError, "#{from} does not respond to #{field}"
19
+ end
20
+
21
+ field_value = from_value.public_send(field)
22
+ end
23
+
24
+ exchange.update_context(as => field_value)
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class ExposeFields < Base
4
+
5
+ values do
6
+ attribute :fields, [Symbol]
7
+ attribute :from, Symbol
8
+ end
9
+
10
+ def call(exchange)
11
+ from_value = exchange.context_fetch(from)
12
+
13
+ if from_value.is_a?(Hash)
14
+ field_values = map_hash(from_value)
15
+ else
16
+ field_values = map_object(from_value)
17
+ end
18
+
19
+ exchange.update_context(field_values || {})
20
+ end
21
+
22
+ private
23
+
24
+ def map_hash(from_value)
25
+ fields.map{|field| {field => from_value[field]}}.reduce(&:merge)
26
+ end
27
+
28
+ def map_object(from_value)
29
+ fields.map{|field| {field => from_value.public_send(field)}}.reduce(&:merge)
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class ExtractResult < Base
4
+
5
+ values do
6
+ attribute :from, Symbol
7
+ end
8
+
9
+ def call(exchange)
10
+ result = exchange.context_fetch(from)
11
+
12
+ unless result.kind_of?(MiniCamel::Dto) || result.kind_of?(Hash)
13
+ raise ArgumentError, "Extracted result is not a DTO or a hash!"
14
+ end
15
+
16
+ exchange_result = ExchangeResult.new(result)
17
+ exchange.set_result(exchange_result)
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class Mutate < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+ attribute :with_class, Class
8
+ end
9
+
10
+ def call(exchange)
11
+ mutation = with_class.new(field => exchange.context_fetch(field)).call
12
+ exchange.update_context(field => mutation)
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,16 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class MutateEach < ProcessEach
4
+
5
+ def call(exchange)
6
+ additional_data = fetch_additional_data(exchange)
7
+
8
+ fetch_collection(exchange).map! do |entry|
9
+ process(entry, additional_data)
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,19 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class Pipeline < Base
4
+
5
+ values do
6
+ attribute :routes, [Symbol]
7
+ end
8
+
9
+ def call(exchange)
10
+ routes.each do |route|
11
+ env.call_route(route, exchange)
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+
19
+
@@ -0,0 +1,22 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class Process < Base
4
+
5
+ values do
6
+ attribute :fields, [Symbol]
7
+ attribute :with_class, Class
8
+ end
9
+
10
+ def call(exchange)
11
+ with_class.new(visible_fields(exchange)).call
12
+ end
13
+
14
+ private
15
+
16
+ def visible_fields(exchange)
17
+ fields.map{|f| {f => exchange.context_fetch(f)}}.reduce(&:merge)
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class ProcessEach < Each
4
+
5
+ def call(exchange)
6
+ additional_data = fetch_additional_data(exchange)
7
+
8
+ # The use of map is no coincidence! (will be used as result in TransformEach)
9
+ fetch_collection(exchange).map do |entry|
10
+ process(entry, additional_data)
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class Produce < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+ attribute :with_class, Class
8
+ end
9
+
10
+ def call(exchange)
11
+ exchange.update_context(field => with_class.new.call)
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,15 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class To < Base
4
+
5
+ values do
6
+ attribute :route, Symbol
7
+ end
8
+
9
+ def call(exchange)
10
+ env.call_route(route, exchange)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class Transform < Process
4
+
5
+ values do
6
+ attribute :to, Symbol
7
+ end
8
+
9
+ def call(exchange)
10
+ exchange.update_context(to => super)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class TransformEach < ProcessEach
4
+
5
+ values do
6
+ attribute :to, Symbol
7
+ end
8
+
9
+ def call(exchange)
10
+ exchange.update_context(to => super)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class Validate < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+
8
+ attribute :message, String
9
+
10
+ attribute :raise_error, Class
11
+ end
12
+
13
+ def call(exchange)
14
+ value = exchange.context_fetch(field)
15
+ raise raise_error.new(message, value) if value.invalid?
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,19 @@
1
+ module MiniCamel
2
+ module Processor
3
+ class WrapInDto < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+ attribute :as, Symbol
8
+ end
9
+
10
+ def call(exchange)
11
+ exchange.update_context(as => MiniCamel::Dto.new(field => exchange.context_fetch(field)))
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+
18
+
19
+
@@ -0,0 +1,13 @@
1
+ module MiniCamel
2
+ module ProcessorDefinition
3
+ class Base
4
+ include Virtus.value_object
5
+ include ActiveModel::Validations
6
+
7
+ def generate_processor(env)
8
+ raise NotImplementedError
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ module MiniCamel
2
+ module ProcessorDefinition
3
+ class Each < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+ validates :field, presence: true
8
+
9
+ attribute :in_field, Symbol
10
+ validates :in_field, presence: true
11
+
12
+ attribute :additional_fields, [Symbol]
13
+
14
+ attribute :with_class, Class
15
+ validates :with_class, presence: true
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ module MiniCamel
2
+ module ProcessorDefinition
3
+ class ExposeField < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+ validates :field, presence: true
8
+
9
+ attribute :from, Symbol
10
+ validates :from, presence: true
11
+
12
+ attribute :as, Symbol, default: :default_as
13
+ validates :as, presence: true
14
+ end
15
+
16
+ def generate_processor(env)
17
+ Processor::ExposeField.new(env: env, field: field, from: from, as: as)
18
+ end
19
+
20
+ private
21
+
22
+ def default_as
23
+ field
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module MiniCamel
2
+ module ProcessorDefinition
3
+ class ExposeFields < Base
4
+
5
+ values do
6
+ attribute :fields, [Symbol]
7
+ validates :fields, presence: true
8
+
9
+ attribute :from, Symbol
10
+ validates :from, presence: true
11
+ end
12
+
13
+ def generate_processor(env)
14
+ Processor::ExposeFields.new(env: env, fields: fields, from: from)
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module MiniCamel
2
+ module ProcessorDefinition
3
+ class ExtractResult < Base
4
+
5
+ values do
6
+ attribute :from, Symbol
7
+ validates :from, presence: true
8
+ end
9
+
10
+ def generate_processor(env)
11
+ Processor::ExtractResult.new(env: env, from: from)
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,21 @@
1
+ module MiniCamel
2
+ module ProcessorDefinition
3
+ class Mutate < Base
4
+
5
+ values do
6
+ attribute :field, Symbol
7
+ validates :field, presence: true
8
+
9
+ attribute :with_class, Class
10
+ validates :with_class, presence: true
11
+ end
12
+
13
+
14
+ def generate_processor(env)
15
+ Processor::Mutate.new(env: env, field: field, with_class: with_class)
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,15 @@
1
+ module MiniCamel
2
+ module ProcessorDefinition
3
+ class MutateEach < Each
4
+
5
+ def generate_processor(env)
6
+ Processor::MutateEach.new(
7
+ env: env, field: field, in_field: in_field, with_class: with_class,
8
+ additional_fields: additional_fields
9
+ )
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+