action_logic 0.2.4 → 0.2.5
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +122 -0
- data/lib/action_logic.rb +2 -1
- data/lib/action_logic/action_benchmark.rb +8 -21
- data/lib/action_logic/action_benchmark/default_benchmark_block.rb +11 -0
- data/lib/action_logic/action_benchmark/default_formatter.rb +5 -5
- data/lib/action_logic/action_coordinator.rb +1 -1
- data/lib/action_logic/action_task.rb +1 -1
- data/lib/action_logic/action_use_case.rb +1 -1
- data/lib/action_logic/configuration.rb +44 -0
- data/lib/action_logic/version.rb +1 -1
- data/spec/action_logic/action_benchmark/default_formatter_spec.rb +6 -6
- data/spec/action_logic/action_coordinator_spec.rb +1 -1
- data/spec/action_logic/action_task_spec.rb +1 -1
- data/spec/action_logic/active_use_case_spec.rb +1 -1
- data/spec/action_logic/configuration_spec.rb +75 -0
- data/spec/spec_helper.rb +24 -1
- metadata +5 -4
- data/lib/action_logic/action_configuration.rb +0 -40
- data/spec/action_logic/action_configuration_spec.rb +0 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c66d180782e1862be0377d7fe898882aa0ade055
|
4
|
+
data.tar.gz: 888830e3f75532ca8f4478d408a50c44598b0f06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a74659bc15c3f9d9269954cdf222f03bf33d10a0164ca11a76494e4d94ea508b8659d0c89f9fc344b374b56dd05de4b96e5377894f67644c0cc20a8530745cc2
|
7
|
+
data.tar.gz: 8178b2136a5c4855fb3f50318f97c1645f551d269e129b7b147d57a4c37919cd077edd9187c70bf85148969ae277d7e1e4d70b9e83db1b4356bbf50c78523509
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -32,6 +32,11 @@ Why another business logic abstraction gem? `ActionLogic` provides teams of vari
|
|
32
32
|
* [Before Validations](#before-validations)
|
33
33
|
* [After Validations](#after-validations)
|
34
34
|
* [Around Validations](#around-validations)
|
35
|
+
* [Benchmarking](#benchmarking)
|
36
|
+
* [Enable Benchmarking](#enable-benchmarking)
|
37
|
+
* [Benchmark Logging](#benchmark-logging)
|
38
|
+
* [Benchark Log Formatting](#benchmark-log-formatting)
|
39
|
+
* [Custom Benchmark Handling](#custom-benchmark-handling)
|
35
40
|
|
36
41
|
### Backstory
|
37
42
|
|
@@ -925,3 +930,120 @@ result = ActionTaskExample.execute(:example_attribute => [1, 2, 3], :example_att
|
|
925
930
|
|
926
931
|
result # => #<ActionLogic::ActionContext example_attribute=[1, 2, 3], example_attribute2=1, status=:success>
|
927
932
|
```
|
933
|
+
|
934
|
+
### Benchmarking
|
935
|
+
|
936
|
+
At some point you may want to benchmark and profile the performance of your code. `ActionLogic` allows for benchmarking that
|
937
|
+
range from simple defaults to highly customizable options depending on your use case and needs.
|
938
|
+
|
939
|
+
### Enable Benchmarking
|
940
|
+
|
941
|
+
Because benchmarking negatively impacts performance, we must explicitly tell `ActionLogic` that we want to benchmark (otherwise
|
942
|
+
it defaults to ignore benchmarking). To do this, we configure `ActionLogic` using the `configure` method. With the provided
|
943
|
+
`config` object, we explicitly enable benchmarking by setting `config.benchmark = true`:
|
944
|
+
|
945
|
+
```ruby
|
946
|
+
ActionLogic.configure do |config|
|
947
|
+
config.benchmark = true
|
948
|
+
end
|
949
|
+
```
|
950
|
+
|
951
|
+
### Benchmark Logging
|
952
|
+
|
953
|
+
Additionally, `ActionLogic` writes a benchmark log to `$stdout` by default, or you can override this default configuration
|
954
|
+
by specifying a log file. To do this, you configure `ActionLogic` to use a `File` object for logging benchmark results via the
|
955
|
+
`ActionLogic.configure` method:
|
956
|
+
|
957
|
+
```ruby
|
958
|
+
ActionLogic.configure do |config|
|
959
|
+
config.benchmark = true
|
960
|
+
config.benchmark_log = File.open("benchmark.log", "w")
|
961
|
+
end
|
962
|
+
```
|
963
|
+
|
964
|
+
### Benchmark Log Formatting
|
965
|
+
|
966
|
+
By default, `ActionLogic` formats benchmark logs in the following format:
|
967
|
+
|
968
|
+
```
|
969
|
+
context:ValidateAroundPresenceTestUseCase user_time:0.000000 system_time:0.000000 total_time:0.000000 real_time:0.000135
|
970
|
+
...
|
971
|
+
```
|
972
|
+
|
973
|
+
The default format is intended to be machine readable for easy parsing and is not intended to be used for human reading.
|
974
|
+
However, if you wish to change the format of the log output, `ActionLogic` allows you to override the default formatter by
|
975
|
+
allowing you to provide your own formatter:
|
976
|
+
|
977
|
+
```ruby
|
978
|
+
ActionLogic.configure do |config|
|
979
|
+
config.benchmark = true
|
980
|
+
config.benchmark_log = File.open("benchmark.log", "w")
|
981
|
+
config.benchmark_formatter = YourCustomFormatter
|
982
|
+
end
|
983
|
+
```
|
984
|
+
|
985
|
+
Where `YourCustomFormatter` subclasses `ActionLogic::ActionBenchmark::DefaultFormatter`:
|
986
|
+
|
987
|
+
```ruby
|
988
|
+
class CustomFormatter < ActionLogic::ActionBenchmark::DefaultFormatter
|
989
|
+
|
990
|
+
def log_coordinator(benchmark_result, execution_context_name)
|
991
|
+
benchmark_log.puts("The ActionCoordinator #{execution_context_name} took #{benchmark_result.real} to complete.")
|
992
|
+
end
|
993
|
+
|
994
|
+
def log_use_case(benchmark_result, execution_context_name)
|
995
|
+
benchmark_log.puts("The ActionUseCase #{execution_context_name} took #{benchmark_result.real} to complete.")
|
996
|
+
end
|
997
|
+
|
998
|
+
def log_task(benchmark_result, execution_context_name)
|
999
|
+
benchmark_log.puts("The ActionTask #{execution_context_name} took #{benchmark_result.real} to complete.")
|
1000
|
+
end
|
1001
|
+
|
1002
|
+
end
|
1003
|
+
```
|
1004
|
+
|
1005
|
+
From the example above, you can see that a custom formatter is required to define three methods: `log_coordinator`, `log_use_case` and `log_task`. The `log_t cqcoordinator`
|
1006
|
+
method is called when a `ActionCoordinator` context is benchmarked. The `use_case` and `task` methods are invoked when `ActionUseCase` and `ActionTask`
|
1007
|
+
contexts are benchmarked, respectively.
|
1008
|
+
|
1009
|
+
Each of the three log methods receives two input parameters: `benchmark_result` and `execution_context_name` where `benchmark_result` is a Ruby
|
1010
|
+
standard library `Benchmark` result object, and `execution_context_name` is the class name of the `ActionLogic` context.
|
1011
|
+
|
1012
|
+
Once configured, you can verify that the formatter outputs to the specified log file by executing your `ActionLogic` contexts
|
1013
|
+
and verifying that the log file is written to with the correct format:
|
1014
|
+
|
1015
|
+
```
|
1016
|
+
The ActionUseCase TestUseCase2 took 0.00011722202179953456 to complete.
|
1017
|
+
The ActionTask TestTask3 took 4.570698365569115e-05 to complete.
|
1018
|
+
...
|
1019
|
+
```
|
1020
|
+
|
1021
|
+
### Custom Benchmark Handling
|
1022
|
+
|
1023
|
+
By default, `ActionLogic` benchmarks execution contexts using Ruby's `Benchmark` module. If you are content with a `Benchmark` result object, then
|
1024
|
+
you do not need to specify a custom benchmark handler. However, if you wish to have maximum control, or you require something different than Ruby's
|
1025
|
+
`Benchmark` module, you can define a custom handler like so:
|
1026
|
+
|
1027
|
+
```ruby
|
1028
|
+
class CustomHandler
|
1029
|
+
def call
|
1030
|
+
# custom logic
|
1031
|
+
yield
|
1032
|
+
# custom logic
|
1033
|
+
end
|
1034
|
+
end
|
1035
|
+
```
|
1036
|
+
|
1037
|
+
Your custom handler is free to define any custom logic, but you must yield during the body of the `call` method. This is what triggers the execution
|
1038
|
+
context and will allow your custom handler to measure the length of execution. If you do not yield, the relevant `ActionCoordinator`, `ActionUseCase`
|
1039
|
+
or `ActionTask` will not be executed and will result in no execution to benchmark.
|
1040
|
+
|
1041
|
+
Additionally, you must register your custom handler with `ActionLogic` using `ActionLogic.configure`:
|
1042
|
+
|
1043
|
+
```ruby
|
1044
|
+
ActionLogic.configure do |config|
|
1045
|
+
config.benchmark = true
|
1046
|
+
config.benchmark_log = File.open("benchmark.log", "w")
|
1047
|
+
config.benchmark_handler = CustomHandler.new
|
1048
|
+
end
|
1049
|
+
```
|
data/lib/action_logic.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'action_logic/action_configuration'
|
2
1
|
require 'action_logic/action_context'
|
3
2
|
require 'action_logic/action_coordinator'
|
4
3
|
require 'action_logic/action_core'
|
@@ -7,6 +6,8 @@ require 'action_logic/action_use_case'
|
|
7
6
|
require 'action_logic/action_validation'
|
8
7
|
require 'action_logic/action_benchmark'
|
9
8
|
require 'action_logic/action_benchmark/default_formatter'
|
9
|
+
require 'action_logic/action_benchmark/default_benchmark_block'
|
10
10
|
|
11
|
+
require 'action_logic/configuration'
|
11
12
|
require 'action_logic/errors'
|
12
13
|
require 'action_logic/version'
|
@@ -1,38 +1,25 @@
|
|
1
|
-
require 'benchmark'
|
2
|
-
|
3
1
|
module ActionLogic
|
4
2
|
module ActionBenchmark
|
5
|
-
|
6
3
|
module ClassMethods
|
7
4
|
def with_benchmark(execution_context, &block)
|
8
|
-
|
9
|
-
benchmark_result, context = benchmark!(&block)
|
10
|
-
log!(benchmark_result, execution_context)
|
11
|
-
context
|
12
|
-
else
|
13
|
-
block.call
|
14
|
-
end
|
5
|
+
ActionLogic.benchmark? ? benchmark!(execution_context, &block) : block.call
|
15
6
|
end
|
16
7
|
|
17
8
|
private
|
18
9
|
|
19
|
-
def benchmark
|
20
|
-
ActionConfiguration.benchmark?
|
21
|
-
end
|
22
|
-
|
23
|
-
def benchmark!(&block)
|
10
|
+
def benchmark!(execution_context, &block)
|
24
11
|
context = nil
|
25
|
-
benchmark_result =
|
26
|
-
|
12
|
+
benchmark_result = ActionLogic.benchmark_handler.call { context = block.call }
|
13
|
+
log!(benchmark_result, execution_context)
|
14
|
+
context
|
27
15
|
end
|
28
16
|
|
29
17
|
def log!(benchmark_result, execution_context)
|
30
|
-
benchmark_formatter.send(execution_context.__private__type,
|
18
|
+
ActionLogic.benchmark_formatter.send("log_#{execution_context.__private__type}".to_sym,
|
19
|
+
benchmark_result,
|
20
|
+
execution_context.name)
|
31
21
|
end
|
32
22
|
|
33
|
-
def benchmark_formatter
|
34
|
-
ActionConfiguration.benchmark_formatter
|
35
|
-
end
|
36
23
|
end
|
37
24
|
end
|
38
25
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module ActionLogic
|
2
2
|
module ActionBenchmark
|
3
3
|
class DefaultFormatter
|
4
|
-
def initialize(benchmark_log:
|
4
|
+
def initialize(benchmark_log: ActionLogic.benchmark_log)
|
5
5
|
@benchmark_log = benchmark_log
|
6
6
|
end
|
7
7
|
|
8
8
|
def format(benchmark_result, context_name)
|
9
|
-
benchmark_log.printf("
|
9
|
+
benchmark_log.printf("%s%s %s%f %s%f %s%f %s%f\n",
|
10
10
|
"context:",
|
11
11
|
context_name,
|
12
12
|
"user_time:",
|
@@ -19,9 +19,9 @@ module ActionLogic
|
|
19
19
|
benchmark_result.real)
|
20
20
|
end
|
21
21
|
|
22
|
-
alias_method :
|
23
|
-
alias_method :
|
24
|
-
alias_method :
|
22
|
+
alias_method :log_coordinator, :format
|
23
|
+
alias_method :log_use_case, :format
|
24
|
+
alias_method :log_task, :format
|
25
25
|
|
26
26
|
private
|
27
27
|
attr_reader :benchmark_log
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module ActionLogic
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def self.configure(&block)
|
7
|
+
block.call(configuration_options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.configuration_options
|
11
|
+
@configuration_options ||= OpenStruct.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.benchmark?
|
15
|
+
configuration_options.benchmark || false
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.benchmark_log
|
19
|
+
configuration_options.benchmark_log || $stdout
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.benchmark_formatter
|
23
|
+
custom_benchmark_formatter || default_formatter
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.benchmark_handler
|
27
|
+
configuration_options.benchmark_handler || ActionBenchmark::DefaultBenchmarkHandler.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.reset!
|
31
|
+
@configuration_options = OpenStruct.new
|
32
|
+
@custom_benchmark_formatter = nil
|
33
|
+
@default_formatter = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.custom_benchmark_formatter
|
37
|
+
@custom_benchmark_formatter ||= configuration_options.benchmark_formatter &&
|
38
|
+
configuration_options.benchmark_formatter.new
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.default_formatter
|
42
|
+
@default_formatter ||= ActionBenchmark::DefaultFormatter.new
|
43
|
+
end
|
44
|
+
end
|
data/lib/action_logic/version.rb
CHANGED
@@ -9,21 +9,21 @@ module ActionLogic::ActionBenchmark
|
|
9
9
|
subject { described_class.new(benchmark_log: benchmark_log) }
|
10
10
|
|
11
11
|
it "writes the benchmark result to the log for an ActionCoordinator" do
|
12
|
-
subject.
|
12
|
+
subject.log_coordinator(benchmark_result, "CoordinatorContext")
|
13
13
|
expect(benchmark_log.string).to\
|
14
|
-
eq "context:
|
14
|
+
eq "context:CoordinatorContext user_time:0.000030 system_time:0.000020 total_time:0.000010 real_time:0.000300\n"
|
15
15
|
end
|
16
16
|
|
17
17
|
it "writes the benchmark result to the log for an ActionUseCase" do
|
18
|
-
subject.
|
18
|
+
subject.log_use_case(benchmark_result, "UseCaseContext")
|
19
19
|
expect(benchmark_log.string).to\
|
20
|
-
eq "context:
|
20
|
+
eq "context:UseCaseContext user_time:0.000030 system_time:0.000020 total_time:0.000010 real_time:0.000300\n"
|
21
21
|
end
|
22
22
|
|
23
23
|
it "writes the benchmark result to the log for an ActionTask" do
|
24
|
-
subject.
|
24
|
+
subject.log_task(benchmark_result, "TaskContext")
|
25
25
|
expect(benchmark_log.string).to\
|
26
|
-
eq "context:
|
26
|
+
eq "context:TaskContext user_time:0.000030 system_time:0.000020 total_time:0.000010 real_time:0.000300\n"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -6,7 +6,7 @@ require 'fixtures/custom_types'
|
|
6
6
|
module ActionLogic
|
7
7
|
describe ActionCoordinator do
|
8
8
|
it "knows its type" do
|
9
|
-
expect(TestCoordinator1.__private__type).to eq(
|
9
|
+
expect(TestCoordinator1.__private__type).to eq("coordinator")
|
10
10
|
end
|
11
11
|
|
12
12
|
context "no failures and no halts" do
|
@@ -6,7 +6,7 @@ require 'fixtures/custom_types'
|
|
6
6
|
module ActionLogic
|
7
7
|
describe ActionUseCase do
|
8
8
|
it "knows its type" do
|
9
|
-
expect(SimpleTestUseCase.__private__type).to eq(
|
9
|
+
expect(SimpleTestUseCase.__private__type).to eq("use_case")
|
10
10
|
end
|
11
11
|
|
12
12
|
it "returns an instance of ActionContext" do
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'action_logic'
|
3
|
+
|
4
|
+
describe ActionLogic do
|
5
|
+
|
6
|
+
subject { described_class }
|
7
|
+
|
8
|
+
around do |example|
|
9
|
+
described_class.reset!
|
10
|
+
example.run
|
11
|
+
described_class.reset!
|
12
|
+
end
|
13
|
+
|
14
|
+
context "benchmark" do
|
15
|
+
it "defaults the benchmark configuration option to false" do
|
16
|
+
expect(described_class.benchmark?).to be_falsey
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns true when the benchmark configuration option is set to true" do
|
20
|
+
described_class.configure do |config|
|
21
|
+
config.benchmark = true
|
22
|
+
end
|
23
|
+
|
24
|
+
expect(described_class.benchmark?).to be_truthy
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "benchmark_log" do
|
29
|
+
it "defaults benchmark log file to stdout" do
|
30
|
+
expect(described_class.benchmark_log).to eq($stdout)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns the log file when the benchmark log configuration option is set" do
|
34
|
+
temp_file = Object.new
|
35
|
+
|
36
|
+
described_class.configure do |config|
|
37
|
+
config.benchmark_log = temp_file
|
38
|
+
end
|
39
|
+
|
40
|
+
expect(described_class.benchmark_log).to eq(temp_file)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "benchmark_formatter" do
|
45
|
+
it "uses default formatter if a custom formatter is not provided" do
|
46
|
+
expect(described_class.benchmark_formatter).to be_a(ActionLogic::ActionBenchmark::DefaultFormatter)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "uses a custom formatter if one is provided" do
|
50
|
+
class CustomFormatter; end
|
51
|
+
|
52
|
+
described_class.configure do |config|
|
53
|
+
config.benchmark_formatter = CustomFormatter
|
54
|
+
end
|
55
|
+
|
56
|
+
expect(described_class.benchmark_formatter).to be_a(CustomFormatter)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "benchmark_handler" do
|
61
|
+
it "uses a default benchmark handler if a custom benchmark handler is not provided" do
|
62
|
+
expect(described_class.benchmark_handler).to be_a(ActionLogic::ActionBenchmark::DefaultBenchmarkHandler)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "uses a custom benchmark handler if one is provided" do
|
66
|
+
custom_benchmark_handler = -> { yield }
|
67
|
+
|
68
|
+
described_class.configure do |config|
|
69
|
+
config.benchmark_handler = custom_benchmark_handler
|
70
|
+
end
|
71
|
+
|
72
|
+
expect(described_class.benchmark_handler).to eq(custom_benchmark_handler)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,10 +9,33 @@ $LOAD_PATH << File.join(File.dirname(__FILE__))
|
|
9
9
|
|
10
10
|
require 'action_logic'
|
11
11
|
|
12
|
+
class CustomFormatter < ActionLogic::ActionBenchmark::DefaultFormatter
|
13
|
+
def log_coordinator(benchmark_result, execution_context_name)
|
14
|
+
benchmark_log.puts("The ActionCoordinator #{execution_context_name} took #{benchmark_result} to complete.")
|
15
|
+
end
|
16
|
+
|
17
|
+
def log_use_case(benchmark_result, execution_context_name)
|
18
|
+
benchmark_log.puts("The ActionUseCase #{execution_context_name} took #{benchmark_result} to complete.")
|
19
|
+
end
|
20
|
+
|
21
|
+
def log_task(benchmark_result, execution_context_name)
|
22
|
+
benchmark_log.puts("The ActionTask #{execution_context_name} took #{benchmark_result} to complete.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class CustomHandler
|
27
|
+
def call
|
28
|
+
yield
|
29
|
+
"this is the custom handler"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
12
33
|
if ENV['BENCHMARK']
|
13
|
-
ActionLogic
|
34
|
+
ActionLogic.configure do |config|
|
14
35
|
config.benchmark = true
|
15
36
|
config.benchmark_log = File.open("benchmark.log", "w")
|
37
|
+
config.benchmark_formatter = CustomFormatter
|
38
|
+
config.benchmark_handler = CustomHandler.new
|
16
39
|
end
|
17
40
|
end
|
18
41
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_logic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rick Winfrey
|
@@ -80,8 +80,8 @@ files:
|
|
80
80
|
- action_logic.gemspec
|
81
81
|
- lib/action_logic.rb
|
82
82
|
- lib/action_logic/action_benchmark.rb
|
83
|
+
- lib/action_logic/action_benchmark/default_benchmark_block.rb
|
83
84
|
- lib/action_logic/action_benchmark/default_formatter.rb
|
84
|
-
- lib/action_logic/action_configuration.rb
|
85
85
|
- lib/action_logic/action_context.rb
|
86
86
|
- lib/action_logic/action_coordinator.rb
|
87
87
|
- lib/action_logic/action_core.rb
|
@@ -93,6 +93,7 @@ files:
|
|
93
93
|
- lib/action_logic/action_validation/base_validation.rb
|
94
94
|
- lib/action_logic/action_validation/presence_validation.rb
|
95
95
|
- lib/action_logic/action_validation/type_validation.rb
|
96
|
+
- lib/action_logic/configuration.rb
|
96
97
|
- lib/action_logic/errors.rb
|
97
98
|
- lib/action_logic/version.rb
|
98
99
|
- resources/action_coordinator_diagram.png
|
@@ -101,11 +102,11 @@ files:
|
|
101
102
|
- resources/diagrams.sketch
|
102
103
|
- resources/overview_diagram.png
|
103
104
|
- spec/action_logic/action_benchmark/default_formatter_spec.rb
|
104
|
-
- spec/action_logic/action_configuration_spec.rb
|
105
105
|
- spec/action_logic/action_context_spec.rb
|
106
106
|
- spec/action_logic/action_coordinator_spec.rb
|
107
107
|
- spec/action_logic/action_task_spec.rb
|
108
108
|
- spec/action_logic/active_use_case_spec.rb
|
109
|
+
- spec/action_logic/configuration_spec.rb
|
109
110
|
- spec/fixtures/constants.rb
|
110
111
|
- spec/fixtures/coordinators.rb
|
111
112
|
- spec/fixtures/custom_types.rb
|
@@ -138,11 +139,11 @@ specification_version: 4
|
|
138
139
|
summary: Business logic abstraction
|
139
140
|
test_files:
|
140
141
|
- spec/action_logic/action_benchmark/default_formatter_spec.rb
|
141
|
-
- spec/action_logic/action_configuration_spec.rb
|
142
142
|
- spec/action_logic/action_context_spec.rb
|
143
143
|
- spec/action_logic/action_coordinator_spec.rb
|
144
144
|
- spec/action_logic/action_task_spec.rb
|
145
145
|
- spec/action_logic/active_use_case_spec.rb
|
146
|
+
- spec/action_logic/configuration_spec.rb
|
146
147
|
- spec/fixtures/constants.rb
|
147
148
|
- spec/fixtures/coordinators.rb
|
148
149
|
- spec/fixtures/custom_types.rb
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
|
3
|
-
module ActionLogic
|
4
|
-
class ActionConfiguration
|
5
|
-
def self.configure(&block)
|
6
|
-
block.call(configuration_options)
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.configuration_options
|
10
|
-
@configuration_options ||= OpenStruct.new
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.benchmark?
|
14
|
-
configuration_options.benchmark || false
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.benchmark_log
|
18
|
-
configuration_options.benchmark_log || $stdout
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.benchmark_formatter
|
22
|
-
custom_benchmark_formatter || default_formatter
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.reset!
|
26
|
-
@configuration_options = OpenStruct.new
|
27
|
-
@custom_benchmark_formatter = nil
|
28
|
-
@default_formatter = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.custom_benchmark_formatter
|
32
|
-
@custom_benchmark_formatter ||= configuration_options.benchmark_formatter &&
|
33
|
-
configuration_options.benchmark_formatter.new
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.default_formatter
|
37
|
-
@default_formatter ||= ::ActionLogic::ActionBenchmark::DefaultFormatter.new
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'action_logic'
|
3
|
-
|
4
|
-
module ActionLogic
|
5
|
-
describe ActionConfiguration do
|
6
|
-
subject { described_class }
|
7
|
-
|
8
|
-
before do
|
9
|
-
described_class.reset!
|
10
|
-
end
|
11
|
-
|
12
|
-
after do
|
13
|
-
described_class.reset!
|
14
|
-
end
|
15
|
-
|
16
|
-
context "benchmark" do
|
17
|
-
it "defaults the benchmark configuration option to false" do
|
18
|
-
expect(described_class.benchmark?).to be_falsey
|
19
|
-
end
|
20
|
-
|
21
|
-
it "returns true when the benchmark configuration option is set to true" do
|
22
|
-
described_class.configure do |config|
|
23
|
-
config.benchmark = true
|
24
|
-
end
|
25
|
-
|
26
|
-
expect(described_class.benchmark?).to be_truthy
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context "benchmark_log" do
|
31
|
-
it "defaults benchmark log file to stdout" do
|
32
|
-
expect(described_class.benchmark_log).to eq($stdout)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "returns the log file when the benchmark log configuration option is set" do
|
36
|
-
temp_file = Object.new
|
37
|
-
|
38
|
-
described_class.configure do |config|
|
39
|
-
config.benchmark_log = temp_file
|
40
|
-
end
|
41
|
-
|
42
|
-
expect(described_class.benchmark_log).to eq(temp_file)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
context "benchmark_formatter" do
|
47
|
-
it "uses default formatter if a custom formatter is not provided" do
|
48
|
-
expect(described_class.benchmark_formatter).to be_a(ActionLogic::ActionBenchmark::DefaultFormatter)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "uses a custom formatter if one is provided" do
|
52
|
-
class CustomFormatter; end
|
53
|
-
|
54
|
-
described_class.configure do |config|
|
55
|
-
config.benchmark_formatter = CustomFormatter
|
56
|
-
end
|
57
|
-
|
58
|
-
expect(described_class.benchmark_formatter).to be_a(CustomFormatter)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|