brainstem 1.0.0.pre.1 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +1 -1
- data/README.md +383 -32
- data/bin/brainstem +6 -0
- data/brainstem.gemspec +2 -0
- data/docs/api_doc_generator.markdown +175 -0
- data/docs/brainstem_executable.markdown +32 -0
- data/docs/docgen.png +0 -0
- data/docs/docgen_ascii.txt +63 -0
- data/docs/executable.png +0 -0
- data/docs/executable_ascii.txt +10 -0
- data/lib/brainstem/api_docs.rb +146 -0
- data/lib/brainstem/api_docs/abstract_collection.rb +116 -0
- data/lib/brainstem/api_docs/atlas.rb +158 -0
- data/lib/brainstem/api_docs/builder.rb +167 -0
- data/lib/brainstem/api_docs/controller.rb +122 -0
- data/lib/brainstem/api_docs/controller_collection.rb +40 -0
- data/lib/brainstem/api_docs/endpoint.rb +234 -0
- data/lib/brainstem/api_docs/endpoint_collection.rb +58 -0
- data/lib/brainstem/api_docs/exceptions.rb +8 -0
- data/lib/brainstem/api_docs/formatters/abstract_formatter.rb +64 -0
- data/lib/brainstem/api_docs/formatters/markdown/controller_formatter.rb +76 -0
- data/lib/brainstem/api_docs/formatters/markdown/endpoint_collection_formatter.rb +73 -0
- data/lib/brainstem/api_docs/formatters/markdown/endpoint_formatter.rb +169 -0
- data/lib/brainstem/api_docs/formatters/markdown/helper.rb +76 -0
- data/lib/brainstem/api_docs/formatters/markdown/presenter_formatter.rb +200 -0
- data/lib/brainstem/api_docs/introspectors/abstract_introspector.rb +100 -0
- data/lib/brainstem/api_docs/introspectors/rails_introspector.rb +232 -0
- data/lib/brainstem/api_docs/presenter.rb +225 -0
- data/lib/brainstem/api_docs/presenter_collection.rb +97 -0
- data/lib/brainstem/api_docs/resolver.rb +73 -0
- data/lib/brainstem/api_docs/sinks/abstract_sink.rb +37 -0
- data/lib/brainstem/api_docs/sinks/controller_presenter_multifile_sink.rb +93 -0
- data/lib/brainstem/api_docs/sinks/stdout_sink.rb +44 -0
- data/lib/brainstem/cli.rb +146 -0
- data/lib/brainstem/cli/abstract_command.rb +97 -0
- data/lib/brainstem/cli/generate_api_docs_command.rb +169 -0
- data/lib/brainstem/concerns/controller_dsl.rb +300 -0
- data/lib/brainstem/concerns/controller_param_management.rb +30 -9
- data/lib/brainstem/concerns/formattable.rb +38 -0
- data/lib/brainstem/concerns/inheritable_configuration.rb +3 -2
- data/lib/brainstem/concerns/optional.rb +43 -0
- data/lib/brainstem/concerns/presenter_dsl.rb +76 -15
- data/lib/brainstem/controller_methods.rb +6 -3
- data/lib/brainstem/dsl/association.rb +6 -3
- data/lib/brainstem/dsl/associations_block.rb +6 -3
- data/lib/brainstem/dsl/base_block.rb +2 -4
- data/lib/brainstem/dsl/conditional.rb +7 -3
- data/lib/brainstem/dsl/conditionals_block.rb +4 -4
- data/lib/brainstem/dsl/configuration.rb +184 -8
- data/lib/brainstem/dsl/field.rb +6 -3
- data/lib/brainstem/dsl/fields_block.rb +2 -3
- data/lib/brainstem/help_text.txt +8 -0
- data/lib/brainstem/presenter.rb +27 -6
- data/lib/brainstem/presenter_validator.rb +5 -2
- data/lib/brainstem/time_classes.rb +1 -1
- data/lib/brainstem/version.rb +1 -1
- data/spec/brainstem/api_docs/abstract_collection_spec.rb +156 -0
- data/spec/brainstem/api_docs/atlas_spec.rb +353 -0
- data/spec/brainstem/api_docs/builder_spec.rb +100 -0
- data/spec/brainstem/api_docs/controller_collection_spec.rb +92 -0
- data/spec/brainstem/api_docs/controller_spec.rb +225 -0
- data/spec/brainstem/api_docs/endpoint_collection_spec.rb +144 -0
- data/spec/brainstem/api_docs/endpoint_spec.rb +346 -0
- data/spec/brainstem/api_docs/formatters/abstract_formatter_spec.rb +30 -0
- data/spec/brainstem/api_docs/formatters/markdown/controller_formatter_spec.rb +126 -0
- data/spec/brainstem/api_docs/formatters/markdown/endpoint_collection_formatter_spec.rb +85 -0
- data/spec/brainstem/api_docs/formatters/markdown/endpoint_formatter_spec.rb +261 -0
- data/spec/brainstem/api_docs/formatters/markdown/helper_spec.rb +100 -0
- data/spec/brainstem/api_docs/formatters/markdown/presenter_formatter_spec.rb +485 -0
- data/spec/brainstem/api_docs/introspectors/abstract_introspector_spec.rb +192 -0
- data/spec/brainstem/api_docs/introspectors/rails_introspector_spec.rb +170 -0
- data/spec/brainstem/api_docs/presenter_collection_spec.rb +84 -0
- data/spec/brainstem/api_docs/presenter_spec.rb +519 -0
- data/spec/brainstem/api_docs/resolver_spec.rb +72 -0
- data/spec/brainstem/api_docs/sinks/abstract_sink_spec.rb +16 -0
- data/spec/brainstem/api_docs/sinks/controller_presenter_multifile_sink_spec.rb +56 -0
- data/spec/brainstem/api_docs/sinks/stdout_sink_spec.rb +22 -0
- data/spec/brainstem/api_docs_spec.rb +58 -0
- data/spec/brainstem/cli/abstract_command_spec.rb +91 -0
- data/spec/brainstem/cli/generate_api_docs_command_spec.rb +125 -0
- data/spec/brainstem/cli_spec.rb +67 -0
- data/spec/brainstem/concerns/controller_dsl_spec.rb +471 -0
- data/spec/brainstem/concerns/controller_param_management_spec.rb +36 -16
- data/spec/brainstem/concerns/formattable_spec.rb +30 -0
- data/spec/brainstem/concerns/inheritable_configuration_spec.rb +104 -4
- data/spec/brainstem/concerns/optional_spec.rb +48 -0
- data/spec/brainstem/concerns/presenter_dsl_spec.rb +202 -31
- data/spec/brainstem/dsl/association_spec.rb +18 -2
- data/spec/brainstem/dsl/conditional_spec.rb +25 -2
- data/spec/brainstem/dsl/configuration_spec.rb +1 -1
- data/spec/brainstem/dsl/field_spec.rb +18 -2
- data/spec/brainstem/presenter_collection_spec.rb +10 -2
- data/spec/brainstem/presenter_spec.rb +32 -0
- data/spec/brainstem/presenter_validator_spec.rb +12 -7
- data/spec/dummy/rails.rb +49 -0
- data/spec/shared/atlas_taker.rb +18 -0
- data/spec/shared/formattable.rb +14 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_helpers/db.rb +1 -1
- data/spec/spec_helpers/presenters.rb +20 -14
- metadata +106 -6
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'brainstem/api_docs/resolver'
|
|
3
|
+
|
|
4
|
+
class ActiveRecord::Base
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module Brainstem
|
|
8
|
+
module ApiDocs
|
|
9
|
+
describe Resolver do
|
|
10
|
+
let(:atlas) { Object.new }
|
|
11
|
+
let(:options) { { } }
|
|
12
|
+
|
|
13
|
+
subject { described_class.new(atlas, options) }
|
|
14
|
+
|
|
15
|
+
describe "#initialize" do
|
|
16
|
+
it "requires an atlas" do
|
|
17
|
+
expect { described_class.new }.to raise_error ArgumentError
|
|
18
|
+
expect { described_class.new(atlas) }.not_to raise_error
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "#find_by_class" do
|
|
23
|
+
let(:klass) { Class.new }
|
|
24
|
+
let(:result) { Object.new }
|
|
25
|
+
|
|
26
|
+
context "when activerecord" do
|
|
27
|
+
let(:klass) { Class.new(ActiveRecord::Base) }
|
|
28
|
+
|
|
29
|
+
it "finds the presenter from the target class" do
|
|
30
|
+
mock(subject).find_presenter_from_target_class(klass) { result }
|
|
31
|
+
expect(subject.find_by_class(klass)).to eq result
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "when symbol" do
|
|
36
|
+
context "when polymorphic" do
|
|
37
|
+
let(:klass) { :polymorphic }
|
|
38
|
+
|
|
39
|
+
it "returns nil" do
|
|
40
|
+
expect(subject.find_by_class(klass)).to be_nil
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context "when not found" do
|
|
46
|
+
it "returns nil" do
|
|
47
|
+
expect(subject.find_by_class(klass)).to be_nil
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
describe "#find_presenter_from_target_class" do
|
|
54
|
+
let(:klass) { Class.new }
|
|
55
|
+
let(:presenter_const) { Class.new }
|
|
56
|
+
let(:pclm) { Object.new }
|
|
57
|
+
let(:presenter_wrapper) { OpenStruct.new(const: presenter_const) }
|
|
58
|
+
let(:options) { { presenter_constant_lookup_method: pclm } }
|
|
59
|
+
|
|
60
|
+
before do
|
|
61
|
+
stub(klass).to_s { "Klass" }
|
|
62
|
+
mock(pclm).call("Klass") { presenter_const }
|
|
63
|
+
stub(atlas).presenters { [ presenter_wrapper ] }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "returns the presenter" do
|
|
67
|
+
expect(subject.send(:find_presenter_from_target_class, klass)).to eq presenter_wrapper
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'brainstem/api_docs/sinks/abstract_sink'
|
|
3
|
+
|
|
4
|
+
module Brainstem
|
|
5
|
+
module ApiDocs
|
|
6
|
+
module Sinks
|
|
7
|
+
describe AbstractSink do
|
|
8
|
+
describe "#<<" do
|
|
9
|
+
it "is not implemented" do
|
|
10
|
+
expect { subject << Object.new }.to raise_error NotImplementedError
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'brainstem/api_docs/sinks/controller_presenter_multifile_sink'
|
|
3
|
+
|
|
4
|
+
module Brainstem
|
|
5
|
+
module ApiDocs
|
|
6
|
+
module Sinks
|
|
7
|
+
describe ControllerPresenterMultifileSink do
|
|
8
|
+
let(:write_method) { Object.new }
|
|
9
|
+
let(:atlas) { Object.new }
|
|
10
|
+
let(:options) {
|
|
11
|
+
{
|
|
12
|
+
format: :markdown,
|
|
13
|
+
write_method: write_method,
|
|
14
|
+
write_path: './'
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
subject { described_class.new(options) }
|
|
19
|
+
|
|
20
|
+
context "controllers" do
|
|
21
|
+
before do
|
|
22
|
+
stub(subject).write_presenter_files
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "writes each controller to its own file" do
|
|
26
|
+
stub(atlas).controllers
|
|
27
|
+
.stub!
|
|
28
|
+
.each_formatted_with_filename(:markdown, include_actions: true)
|
|
29
|
+
.yields('it has info', 'test.markdown')
|
|
30
|
+
|
|
31
|
+
mock(write_method).call("./test.markdown", "it has info")
|
|
32
|
+
subject << atlas
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
context "presenters" do
|
|
38
|
+
before do
|
|
39
|
+
stub(subject).write_controller_files
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
it "writes each presenter to its own file" do
|
|
44
|
+
stub(atlas).presenters
|
|
45
|
+
.stub!
|
|
46
|
+
.each_formatted_with_filename(:markdown)
|
|
47
|
+
.yields('it has info', 'test.markdown')
|
|
48
|
+
|
|
49
|
+
mock(write_method).call("./test.markdown", "it has info")
|
|
50
|
+
subject << atlas
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'brainstem/api_docs/sinks/stdout_sink'
|
|
3
|
+
|
|
4
|
+
module Brainstem
|
|
5
|
+
module ApiDocs
|
|
6
|
+
module Sinks
|
|
7
|
+
describe StdoutSink do
|
|
8
|
+
let(:output) { "Zadok the Priest and Nathan the Prophet" }
|
|
9
|
+
let(:dummy_puts) { Object.new }
|
|
10
|
+
|
|
11
|
+
subject { described_class.new(puts_method: dummy_puts) }
|
|
12
|
+
|
|
13
|
+
describe "#<<" do
|
|
14
|
+
it "calls the putting method" do
|
|
15
|
+
mock(dummy_puts).call(output)
|
|
16
|
+
subject << output
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'brainstem/api_docs'
|
|
3
|
+
|
|
4
|
+
module Brainstem
|
|
5
|
+
describe ApiDocs do
|
|
6
|
+
let(:lorem) { "lorem ipsum dolor sit amet" }
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
describe "configuration" do
|
|
10
|
+
describe "formatters" do
|
|
11
|
+
it "has a formatters constant" do
|
|
12
|
+
expect(Brainstem::ApiDocs::FORMATTERS).to be_a(Hash)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
%w(
|
|
18
|
+
controller_filename_pattern
|
|
19
|
+
presenter_filename_pattern
|
|
20
|
+
controller_filename_link_pattern
|
|
21
|
+
presenter_filename_link_pattern
|
|
22
|
+
write_path
|
|
23
|
+
output_extension
|
|
24
|
+
base_presenter_class
|
|
25
|
+
base_controller_class
|
|
26
|
+
document_empty_presenter_associations
|
|
27
|
+
document_empty_presenter_filters
|
|
28
|
+
).each do |meth|
|
|
29
|
+
describe meth do
|
|
30
|
+
before do
|
|
31
|
+
@original = Brainstem::ApiDocs.public_send(meth)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
after do
|
|
35
|
+
Brainstem::ApiDocs.public_send("#{meth}=", @original)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "can be set and read" do
|
|
39
|
+
Brainstem::ApiDocs.public_send("#{meth}=", lorem)
|
|
40
|
+
expect(Brainstem::ApiDocs.public_send(meth)).to eq lorem
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "filename link patterns" do
|
|
47
|
+
it 'defaults to the filename pattern' do
|
|
48
|
+
expect(Brainstem::ApiDocs.public_send("controller_filename_link_pattern")).
|
|
49
|
+
to eq(Brainstem::ApiDocs.public_send("controller_filename_pattern"))
|
|
50
|
+
|
|
51
|
+
expect(Brainstem::ApiDocs.public_send("presenter_filename_link_pattern")).
|
|
52
|
+
to eq(Brainstem::ApiDocs.public_send("presenter_filename_pattern"))
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'brainstem/cli/abstract_command'
|
|
3
|
+
|
|
4
|
+
module Brainstem
|
|
5
|
+
module CLI
|
|
6
|
+
describe AbstractCommand do
|
|
7
|
+
let(:options) { { } }
|
|
8
|
+
subject { AbstractCommand.new(options) }
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
describe ".call" do
|
|
12
|
+
before do
|
|
13
|
+
any_instance_of(AbstractCommand) do |instance|
|
|
14
|
+
stub(instance) do |obj|
|
|
15
|
+
obj.call
|
|
16
|
+
obj.extract_options!
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "creates a new instance" do
|
|
22
|
+
mock.proxy(AbstractCommand).new([])
|
|
23
|
+
AbstractCommand.call([])
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "passes its args to the instance" do
|
|
27
|
+
mock.proxy(AbstractCommand).new(%w(--silent))
|
|
28
|
+
AbstractCommand.call(%w(--silent))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "calls the new instance" do
|
|
32
|
+
any_instance_of(AbstractCommand) do |instance|
|
|
33
|
+
mock(instance).call
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
AbstractCommand.call([])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "it returns the new instance" do
|
|
40
|
+
expect(AbstractCommand.call).to be_an AbstractCommand
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
describe "#extract_options!" do
|
|
46
|
+
let(:option_parser) { Object.new }
|
|
47
|
+
let(:args) { %w(--silent --pretend) }
|
|
48
|
+
|
|
49
|
+
it "feeds the args to the class's option parser" do
|
|
50
|
+
mock(option_parser).order!(args)
|
|
51
|
+
|
|
52
|
+
any_instance_of(AbstractCommand) do |instance|
|
|
53
|
+
mock(instance).option_parser { option_parser }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
AbstractCommand.new(args)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
describe "#option_parser" do
|
|
62
|
+
it "is not implemented" do
|
|
63
|
+
expect { AbstractCommand.new }.to raise_error NotImplementedError
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
describe "#initialize" do
|
|
69
|
+
it "extracts options from args" do
|
|
70
|
+
any_instance_of(AbstractCommand) do |instance|
|
|
71
|
+
mock(instance).extract_options!
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
AbstractCommand.new
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "#call" do
|
|
79
|
+
before do
|
|
80
|
+
any_instance_of(AbstractCommand) do |instance|
|
|
81
|
+
stub(instance).extract_options!
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "is not implemented" do
|
|
86
|
+
expect { subject.call }.to raise_error NotImplementedError
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'brainstem/cli/generate_api_docs_command'
|
|
3
|
+
|
|
4
|
+
module Brainstem
|
|
5
|
+
module CLI
|
|
6
|
+
describe GenerateApiDocsCommand do
|
|
7
|
+
let(:args) { [ ] }
|
|
8
|
+
|
|
9
|
+
subject { GenerateApiDocsCommand.new(args) }
|
|
10
|
+
|
|
11
|
+
describe "options" do
|
|
12
|
+
xcontext "when --markdown" do
|
|
13
|
+
let(:args) { %w(--markdown) }
|
|
14
|
+
|
|
15
|
+
it "sets sink options method to the MarkdownFormatter instantiation" do
|
|
16
|
+
expect(subject.options[:builder]).to have_key :formatter_method
|
|
17
|
+
expect(subject.options[:builder][:formatter_method]).to be_a Method
|
|
18
|
+
|
|
19
|
+
# TODO: If we need to go further here, we can implement .call on
|
|
20
|
+
# the formatter:
|
|
21
|
+
# expect(subject.options[:builder][:formatter_method].owner).to \
|
|
22
|
+
# eq Brainstem::ApiDocs::Formatters::AbstractFormatter
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context "when --multifile-presenters-and-controllers" do
|
|
27
|
+
let(:args) { %w(--multifile-presenters-and-controllers) }
|
|
28
|
+
|
|
29
|
+
it "sets sink to a ControllerPresenterMultifileSink" do
|
|
30
|
+
expect(subject.options).to have_key :sink
|
|
31
|
+
expect(subject.options[:sink][:method].call).to be_a \
|
|
32
|
+
Brainstem::ApiDocs::Sinks::ControllerPresenterMultifileSink
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "when --output-dir" do
|
|
37
|
+
let(:args) { %w(--output-dir=./blah) }
|
|
38
|
+
|
|
39
|
+
it "sets the write_path option of the sink" do
|
|
40
|
+
expect(subject.options[:sink][:options][:write_path]).to eq "./blah"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context "when --controller-matches" do
|
|
45
|
+
let(:matches) { subject.options[:builder][:args_for_atlas][:controller_matches] }
|
|
46
|
+
|
|
47
|
+
context "when just one match specified" do
|
|
48
|
+
let(:args) { %w(--controller-matches=/workspaces/) }
|
|
49
|
+
it "creates a case-insensitive regexp from the in-between-slash info" do
|
|
50
|
+
mock.proxy(Regexp).new('workspaces', 'i')
|
|
51
|
+
subject
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "appends to the match terms" do
|
|
55
|
+
expect(matches).to include Regexp.new('workspaces', 'i')
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "when multiple matches specified" do
|
|
60
|
+
let(:args) { %w(--controller-matches=/workspaces/ --controller-matches=/extra/) }
|
|
61
|
+
|
|
62
|
+
it "allows additional specification and merges the arguments" do
|
|
63
|
+
expect(matches).to include Regexp.new('workspaces', 'i')
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
describe "execution" do
|
|
71
|
+
context "when no sink provided" do
|
|
72
|
+
before do
|
|
73
|
+
any_instance_of(described_class) do |instance|
|
|
74
|
+
stub(instance).default_sink_method { nil }
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "raises an error" do
|
|
79
|
+
expect { subject.call }.to raise_error \
|
|
80
|
+
Brainstem::ApiDocs::NoSinkSpecifiedException
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
context "when sink specified" do
|
|
85
|
+
before do
|
|
86
|
+
stub(subject).ensure_sink_specified!
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
describe "builder" do
|
|
90
|
+
let(:builder_options) { { builder: { test: 123 } } }
|
|
91
|
+
|
|
92
|
+
before do
|
|
93
|
+
stub(subject).present_atlas!
|
|
94
|
+
stub(subject).builder_options { builder_options }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "creates a new builder with builder options passed" do
|
|
98
|
+
mock(Brainstem::ApiDocs::Builder).new(builder_options)
|
|
99
|
+
subject.call
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe "presentation" do
|
|
104
|
+
it "sends the atlas to the sink" do
|
|
105
|
+
atlas = Object.new
|
|
106
|
+
builder = mock!.atlas.returns(atlas).subject
|
|
107
|
+
sink = mock!.<<(atlas).subject
|
|
108
|
+
sink_method = mock!.call({ test: 123 }).returns(sink).subject
|
|
109
|
+
|
|
110
|
+
stub(subject) do |sub|
|
|
111
|
+
sub.construct_builder!
|
|
112
|
+
sub.builder { builder }
|
|
113
|
+
sub.sink_options { { test: 123 } }
|
|
114
|
+
sub.sink_method { sink_method }
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
subject.call
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|