payload 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,12 +13,13 @@ describe Payload::ExportedDefinition do
13
13
  end
14
14
 
15
15
  private_definition =
16
- Payload::ServiceDefinition.new(lambda { |config| 'private' })
16
+ Payload::ServiceResolver.new(lambda { |config| 'private' })
17
17
  private_definitions = Payload::DefinitionList.
18
18
  new.
19
19
  add(:private, private_definition)
20
20
  container = build_container.service(:container) { |config| 'container' }
21
- definition = Payload::ServiceDefinition.new(block)
21
+ definition =
22
+ Payload::Definition.new(Payload::ServiceResolver.new(block))
22
23
  exported_definition =
23
24
  Payload::ExportedDefinition.new(definition, private_definitions)
24
25
 
@@ -27,4 +28,26 @@ describe Payload::ExportedDefinition do
27
28
  expect(result).to eq('Ran with private and container')
28
29
  end
29
30
  end
31
+
32
+ describe '#==' do
33
+ it 'is true with the same definitions' do
34
+ expect(Payload::ExportedDefinition.new(:one, [:two, :three])).
35
+ to eq(Payload::ExportedDefinition.new(:one, [:two, :three]))
36
+ end
37
+
38
+ it 'is false with a different public definition' do
39
+ expect(Payload::ExportedDefinition.new(:one, [:two, :three])).
40
+ not_to eq(Payload::ExportedDefinition.new(:other, [:two, :three]))
41
+ end
42
+
43
+ it 'is false with different private definitions' do
44
+ expect(Payload::ExportedDefinition.new(:one, [:two, :three])).
45
+ not_to eq(Payload::ExportedDefinition.new(:one, [:two, :other]))
46
+ end
47
+
48
+ it 'is false with another type' do
49
+ expect(Payload::ExportedDefinition.new(:one, [:two, :three])).
50
+ not_to eq(:other)
51
+ end
52
+ end
30
53
  end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'payload/factory_resolver'
3
+
4
+ describe Payload::FactoryResolver do
5
+ describe '#resolve' do
6
+ it 'returns a new factory from the container, block, and decorators' do
7
+ block = double('block')
8
+ factory = double('factory')
9
+ container = double('container')
10
+ decorators = double('decorators')
11
+ definition = Payload::FactoryResolver.new(block)
12
+ Payload::Factory.
13
+ stub(:new).
14
+ with(container, block, decorators).
15
+ and_return(factory)
16
+
17
+ result = definition.resolve(container, decorators)
18
+
19
+ expect(result).to eq(factory)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'payload/service_resolver'
3
+
4
+ describe Payload::ServiceResolver do
5
+ describe '#resolve' do
6
+ it 'returns a new service using the block and decorators' do
7
+ dependency = double('dependency')
8
+ container = { dependency: dependency }
9
+ decorated = double('decorated')
10
+ decorators = double('decorators')
11
+ decorators.
12
+ stub(:decorate).
13
+ with(dependency, container).
14
+ and_return(decorated)
15
+ block = lambda { |yielded| yielded[:dependency] }
16
+ service = Payload::ServiceResolver.new(block)
17
+
18
+ result = service.resolve(container, decorators)
19
+
20
+ expect(result).to eq(decorated)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+ require 'payload/undefined_definition'
3
+
4
+ describe Payload::UndefinedDefinition do
5
+ describe '#==' do
6
+ context 'with the same name' do
7
+ it 'returns true' do
8
+ expect(Payload::UndefinedDefinition.new(:name)).
9
+ to eq(Payload::UndefinedDefinition.new(:name))
10
+ end
11
+ end
12
+
13
+ context 'with different names' do
14
+ it 'returns false' do
15
+ expect(Payload::UndefinedDefinition.new(:name)).
16
+ not_to eq(Payload::UndefinedDefinition.new(:other))
17
+ end
18
+ end
19
+
20
+ context 'with a different type' do
21
+ it 'returns false' do
22
+ expect(Payload::UndefinedDefinition.new(:name)).
23
+ not_to eq(:other)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe '#resolve' do
29
+ it 'raises an undefined dependency error' do
30
+ definition = Payload::UndefinedDefinition.new(:name)
31
+
32
+ expect { definition.resolve(double('conatainer')) }.
33
+ to raise_error(Payload::UndefinedDependencyError, /name/)
34
+ end
35
+ end
36
+
37
+ describe '#decorate' do
38
+ it 'saves decorators for its replacement' do
39
+ first = double('decorator_one')
40
+ second = double('decorator_two')
41
+ replacement = double('replacement')
42
+ replacement.stub(:decorate).and_return(replacement)
43
+ definition = Payload::UndefinedDefinition.new(:name)
44
+
45
+ defined = definition.
46
+ decorate(first).
47
+ decorate(second).
48
+ set(replacement)
49
+
50
+ expect(defined).to eq(replacement)
51
+ expect(replacement).to have_received(:decorate).with(first)
52
+ expect(replacement).to have_received(:decorate).with(second)
53
+ end
54
+ end
55
+
56
+ describe '#set' do
57
+ it 'returns the replacement dependency' do
58
+ replacement = double('replacement')
59
+ definition = Payload::UndefinedDefinition.new(:name)
60
+
61
+ expect(definition.set(replacement)).
62
+ to eq(replacement)
63
+ end
64
+ end
65
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: payload
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - thoughtbot
@@ -9,48 +9,48 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-22 00:00:00.000000000 Z
12
+ date: 2014-10-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ~>
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: 2.14.1
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ~>
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: 2.14.1
56
56
  description: Dependency configuration and injection for Ruby and Rails.
@@ -62,7 +62,7 @@ extra_rdoc_files:
62
62
  - README.md
63
63
  - CONTRIBUTING.md
64
64
  files:
65
- - .gitignore
65
+ - ".gitignore"
66
66
  - CONTRIBUTING.md
67
67
  - Gemfile
68
68
  - Gemfile.lock
@@ -72,16 +72,19 @@ files:
72
72
  - lib/payload/container.rb
73
73
  - lib/payload/controller.rb
74
74
  - lib/payload/decorator_chain.rb
75
+ - lib/payload/definition.rb
75
76
  - lib/payload/definition_list.rb
77
+ - lib/payload/dependency_already_defined_error.rb
76
78
  - lib/payload/exported_definition.rb
77
79
  - lib/payload/factory.rb
78
- - lib/payload/factory_definition.rb
80
+ - lib/payload/factory_resolver.rb
79
81
  - lib/payload/mutable_container.rb
80
82
  - lib/payload/rack_container.rb
81
83
  - lib/payload/rails_loader.rb
82
84
  - lib/payload/railtie.rb
83
- - lib/payload/service_definition.rb
85
+ - lib/payload/service_resolver.rb
84
86
  - lib/payload/testing.rb
87
+ - lib/payload/undefined_definition.rb
85
88
  - lib/payload/undefined_dependency_error.rb
86
89
  - lib/payload/version.rb
87
90
  - payload.gemspec
@@ -89,13 +92,15 @@ files:
89
92
  - spec/payload/controller_spec.rb
90
93
  - spec/payload/decorator_chain_spec.rb
91
94
  - spec/payload/definition_list_spec.rb
95
+ - spec/payload/definition_spec.rb
92
96
  - spec/payload/exported_definition_spec.rb
93
- - spec/payload/factory_definition_spec.rb
97
+ - spec/payload/factory_resolver_spec.rb
94
98
  - spec/payload/factory_spec.rb
95
99
  - spec/payload/mutable_container_spec.rb
96
100
  - spec/payload/rack_container_spec.rb
97
101
  - spec/payload/rails_loader_spec.rb
98
- - spec/payload/service_definition_spec.rb
102
+ - spec/payload/service_resolver_spec.rb
103
+ - spec/payload/undefined_definition_spec.rb
99
104
  - spec/spec_helper.rb
100
105
  homepage: http://github.com/thoughtbot/payload
101
106
  licenses:
@@ -103,22 +108,22 @@ licenses:
103
108
  metadata: {}
104
109
  post_install_message:
105
110
  rdoc_options:
106
- - --charset=UTF-8
111
+ - "--charset=UTF-8"
107
112
  require_paths:
108
113
  - lib
109
114
  required_ruby_version: !ruby/object:Gem::Requirement
110
115
  requirements:
111
- - - '>='
116
+ - - ">="
112
117
  - !ruby/object:Gem::Version
113
118
  version: 2.0.0
114
119
  required_rubygems_version: !ruby/object:Gem::Requirement
115
120
  requirements:
116
- - - '>='
121
+ - - ">="
117
122
  - !ruby/object:Gem::Version
118
123
  version: '0'
119
124
  requirements: []
120
125
  rubyforge_project:
121
- rubygems_version: 2.1.10
126
+ rubygems_version: 2.4.1
122
127
  signing_key:
123
128
  specification_version: 4
124
129
  summary: Dependency configuration and injection for Ruby and Rails.
@@ -127,11 +132,13 @@ test_files:
127
132
  - spec/payload/controller_spec.rb
128
133
  - spec/payload/decorator_chain_spec.rb
129
134
  - spec/payload/definition_list_spec.rb
135
+ - spec/payload/definition_spec.rb
130
136
  - spec/payload/exported_definition_spec.rb
131
- - spec/payload/factory_definition_spec.rb
137
+ - spec/payload/factory_resolver_spec.rb
132
138
  - spec/payload/factory_spec.rb
133
139
  - spec/payload/mutable_container_spec.rb
134
140
  - spec/payload/rack_container_spec.rb
135
141
  - spec/payload/rails_loader_spec.rb
136
- - spec/payload/service_definition_spec.rb
142
+ - spec/payload/service_resolver_spec.rb
143
+ - spec/payload/undefined_definition_spec.rb
137
144
  - spec/spec_helper.rb
@@ -1,24 +0,0 @@
1
- require 'payload/decorator_chain'
2
- require 'payload/factory'
3
-
4
- module Payload
5
- # Encapsulates logic for resolving factory definitions.
6
- #
7
- # Used internally by {Container}. Use {Container#factory}.
8
- #
9
- # @api private
10
- class FactoryDefinition
11
- def initialize(block, decorators = DecoratorChain.new)
12
- @block = block
13
- @decorators = decorators
14
- end
15
-
16
- def resolve(container)
17
- Factory.new(container, @block, @decorators)
18
- end
19
-
20
- def decorate(block)
21
- self.class.new(@block, @decorators.add(block))
22
- end
23
- end
24
- end
@@ -1,24 +0,0 @@
1
- require 'payload/decorator_chain'
2
-
3
- module Payload
4
- # Encapsulates logic for resolving service definitions.
5
- #
6
- # Used internally by {Container}. Use {Container#service}.
7
- #
8
- # @api private
9
- class ServiceDefinition
10
- def initialize(block, decorators = DecoratorChain.new)
11
- @block = block
12
- @decorators = decorators
13
- end
14
-
15
- def resolve(container)
16
- base = @block.call(container)
17
- @decorators.decorate(base, container)
18
- end
19
-
20
- def decorate(block)
21
- self.class.new(@block, @decorators.add(block))
22
- end
23
- end
24
- end
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
- require 'payload/factory_definition'
3
- require 'payload/testing'
4
-
5
- describe Payload::FactoryDefinition do
6
- include Payload::Testing
7
-
8
- describe '#resolve' do
9
- it 'returns an object that responds to new' do
10
- block = lambda do |config|
11
- "#{config[:from_new]} and #{config[:from_container]}"
12
- end
13
- container = build_container
14
- .service(:from_container) { 'From container' }
15
- definition = Payload::FactoryDefinition.new(block)
16
-
17
- result = definition.resolve(container).new(from_new: 'From new')
18
-
19
- expect(result).to eq('From new and From container')
20
- end
21
- end
22
-
23
- describe '#decorate' do
24
- it 'returns a decorated object' do
25
- block = lambda do |config|
26
- "#{config[:from_new]} and #{config[:from_container]}"
27
- end
28
- first = lambda do |component, config|
29
- "Decorated #{component.inspect} with #{config[:from_new]}"
30
- end
31
- second = lambda do |component, config|
32
- "#{component} and #{config[:other]}"
33
- end
34
- container = build_container
35
- .service(:from_container) { 'From container' }
36
- .service(:other) { 'Other' }
37
- definition = Payload::FactoryDefinition
38
- .new(block)
39
- .decorate(first)
40
- .decorate(second)
41
-
42
- result = definition.resolve(container).new(from_new: 'From new')
43
-
44
- expect(result).to eq(
45
- 'Decorated "From new and From container" with From new and Other'
46
- )
47
- end
48
- end
49
- end
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
- require 'payload/service_definition'
3
-
4
- describe Payload::ServiceDefinition do
5
- describe '#resolve' do
6
- it 'returns a new service using the block' do
7
- block = lambda { |container| "Ran with #{container[:dependency]}" }
8
- service = Payload::ServiceDefinition.new(block)
9
-
10
- result = service.resolve(dependency: 'expected service')
11
-
12
- expect(result).to eq('Ran with expected service')
13
- end
14
- end
15
-
16
- describe '#decorate' do
17
- it 'returns a new decorated service' do
18
- block = lambda { |container| "Ran with #{container[:dependency]}" }
19
- first = lambda do |component, container|
20
- "decorated #{component} with #{container[:dependency]}"
21
- end
22
- second = lambda do |component, container|
23
- "#{component} and #{container[:other_dependency]}"
24
- end
25
- service = Payload::ServiceDefinition
26
- .new(block)
27
- .decorate(first)
28
- .decorate(second)
29
-
30
- result = service.resolve(
31
- dependency: 'service',
32
- other_dependency: 'other service'
33
- )
34
-
35
- expect(result)
36
- .to eq('decorated Ran with service with service and other service')
37
- end
38
- end
39
- end