scorpion-ioc 0.6.2 → 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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +144 -30
  3. data/Gemfile +17 -13
  4. data/README.md +24 -69
  5. data/Rakefile +12 -0
  6. data/app/README +1 -0
  7. data/bin/rspec +2 -1
  8. data/config.ru +2 -2
  9. data/config/environment.rb +1 -0
  10. data/lib/scorpion-ioc.rb +3 -1
  11. data/lib/scorpion.rb +32 -45
  12. data/lib/scorpion/attribute.rb +14 -34
  13. data/lib/scorpion/attribute_set.rb +11 -13
  14. data/lib/scorpion/chain_hunter.rb +4 -4
  15. data/lib/scorpion/dependency.rb +22 -58
  16. data/lib/scorpion/dependency/argument_dependency.rb +4 -4
  17. data/lib/scorpion/dependency/builder_dependency.rb +5 -5
  18. data/lib/scorpion/dependency/captured_dependency.rb +4 -6
  19. data/lib/scorpion/dependency/class_dependency.rb +3 -17
  20. data/lib/scorpion/dependency/module_dependency.rb +1 -1
  21. data/lib/scorpion/dependency_map.rb +16 -16
  22. data/lib/scorpion/error.rb +12 -9
  23. data/lib/scorpion/hunt.rb +33 -34
  24. data/lib/scorpion/hunter.rb +6 -6
  25. data/lib/scorpion/locale/en.yml +2 -2
  26. data/lib/scorpion/method.rb +11 -1
  27. data/lib/scorpion/object.rb +16 -31
  28. data/lib/scorpion/rack.rb +1 -1
  29. data/lib/scorpion/rack/middleware.rb +2 -1
  30. data/lib/scorpion/rails.rb +6 -6
  31. data/lib/scorpion/rails/active_record.rb +4 -4
  32. data/lib/scorpion/rails/active_record/association.rb +3 -3
  33. data/lib/scorpion/rails/active_record/relation.rb +3 -2
  34. data/lib/scorpion/rails/controller.rb +2 -2
  35. data/lib/scorpion/rails/job.rb +1 -1
  36. data/lib/scorpion/rails/mailer.rb +1 -1
  37. data/lib/scorpion/rails/nest.rb +11 -11
  38. data/lib/scorpion/rails/railtie.rb +2 -2
  39. data/lib/scorpion/rspec.rb +2 -2
  40. data/lib/scorpion/rspec/helper.rb +3 -3
  41. data/lib/scorpion/stinger.rb +19 -18
  42. data/lib/scorpion/version.rb +3 -3
  43. data/scorpion.gemspec +13 -13
  44. data/spec/internal/db/schema.rb +1 -1
  45. data/spec/lib/scorpion/attribute_set_spec.rb +4 -22
  46. data/spec/lib/scorpion/attribute_spec.rb +3 -8
  47. data/spec/lib/scorpion/chain_hunter_spec.rb +1 -1
  48. data/spec/lib/scorpion/dependency/argument_dependency_spec.rb +3 -7
  49. data/spec/lib/scorpion/dependency/builder_dependency_spec.rb +7 -7
  50. data/spec/lib/scorpion/dependency/module_dependency_spec.rb +3 -3
  51. data/spec/lib/scorpion/dependency_map_spec.rb +4 -25
  52. data/spec/lib/scorpion/dependency_spec.rb +18 -45
  53. data/spec/lib/scorpion/error_spec.rb +1 -1
  54. data/spec/lib/scorpion/hunt_spec.rb +16 -28
  55. data/spec/lib/scorpion/hunter_spec.rb +29 -21
  56. data/spec/lib/scorpion/object_spec.rb +20 -19
  57. data/spec/lib/scorpion/rack/middleware_spec.rb +4 -4
  58. data/spec/lib/scorpion/rack_spec.rb +1 -1
  59. data/spec/lib/scorpion/rails/active_record/association_spec.rb +3 -3
  60. data/spec/lib/scorpion/rails/active_record/model_spec.rb +3 -3
  61. data/spec/lib/scorpion/rails/active_record/relation_spec.rb +3 -3
  62. data/spec/lib/scorpion/rails/controller_spec.rb +8 -8
  63. data/spec/lib/scorpion/rails/job_spec.rb +1 -1
  64. data/spec/lib/scorpion/rspec/helper_spec.rb +11 -11
  65. data/spec/lib/scorpion_spec.rb +1 -1
  66. data/spec/spec_helper.rb +8 -10
  67. metadata +6 -6
  68. data/lib/scorpion/object_constructor.rb +0 -79
  69. data/spec/lib/scorpion/object_constructor_spec.rb +0 -124
@@ -2,10 +2,10 @@ require "spec_helper"
2
2
  require "scorpion/rack/middleware"
3
3
 
4
4
  describe Scorpion::Rack::Middleware do
5
- let(:app) { proc{ [ 200, {}, [ 'Sting!' ] ] } }
5
+ let(:app) { proc { [ 200, {}, [ "Sting!" ] ] } }
6
6
  let(:stack) { Scorpion::Rack::Middleware.new( app ) }
7
7
  let(:request) { Rack::MockRequest.new( stack ) }
8
- let(:response) { request.get('/') }
8
+ let(:response) { request.get("/") }
9
9
 
10
10
  it "creates a scorpion" do
11
11
  expect( stack ).to receive( :prepare_scorpion ).and_call_original
@@ -19,8 +19,8 @@ describe Scorpion::Rack::Middleware do
19
19
  app.call( env )
20
20
  }
21
21
 
22
- request = Rack::MockRequest::new( Scorpion::Rack::Middleware.new( proc ) )
23
- request.get '/'
22
+ request = Rack::MockRequest.new( Scorpion::Rack::Middleware.new( proc ) )
23
+ request.get "/"
24
24
  end
25
25
 
26
26
  it "frees the scorpion on return" do
@@ -12,7 +12,7 @@ describe Scorpion::Rack do
12
12
  end
13
13
 
14
14
  expect do
15
- request = Rack::MockRequest.new( klass.new() )
15
+ request = Rack::MockRequest.new( klass.new )
16
16
  request.get "/"
17
17
  end.to raise_error Scorpion::Rack::MissingScorpionError
18
18
  end
@@ -1,11 +1,11 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Scorpion::Rails::ActiveRecord::Association, type: :model do
4
4
  include Scorpion::Rspec::Helper
5
5
 
6
6
  before( :each ) do
7
7
  author = Author.create! name: "Pitbull"
8
- todo = Todo.create! name: "Be even more awesome", author: author
8
+ Todo.create! name: "Be even more awesome", author: author
9
9
  end
10
10
 
11
11
  it "shares scorpion with associations" do
@@ -23,4 +23,4 @@ describe Scorpion::Rails::ActiveRecord::Association, type: :model do
23
23
  expect( todo.author.scorpion ).to be scorpion
24
24
  end
25
25
 
26
- end
26
+ end
@@ -1,11 +1,11 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Scorpion::Rails::ActiveRecord::Model, type: :model do
4
4
  include Scorpion::Rspec::Helper
5
5
 
6
6
  before( :each ) do
7
7
  author = Author.create! name: "Pitbull"
8
- todo = Todo.create! name: "Be even more awesome", author: author
8
+ Todo.create! name: "Be even more awesome", author: author
9
9
  end
10
10
 
11
11
  it "shares scorpion with associations" do
@@ -30,4 +30,4 @@ describe Scorpion::Rails::ActiveRecord::Model, type: :model do
30
30
  expect( Author.with_scorpion( scorpion ).named( "Pitbull" ).alphabetical.first.scorpion ).to be scorpion
31
31
  end
32
32
 
33
- end
33
+ end
@@ -1,5 +1,5 @@
1
- require 'spec_helper'
2
- require 'scorpion/rails'
1
+ require "spec_helper"
2
+ require "scorpion/rails"
3
3
 
4
4
  describe Scorpion::Rails::ActiveRecord::Relation, type: :model do
5
5
  include Scorpion::Rspec::Helper
@@ -48,7 +48,7 @@ describe Scorpion::Rails::ActiveRecord::Relation, type: :model do
48
48
  end
49
49
 
50
50
  context "find methods" do
51
- let!( :todo ){ Todo.create! name: "Bill" }
51
+ let!( :todo ) { Todo.create! name: "Bill" }
52
52
 
53
53
  it "shares scorpion with found records" do
54
54
  expect( criteria.find( todo.id ).scorpion ).to be scorpion
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  module Test
4
4
  module Nest
@@ -21,7 +21,7 @@ describe Scorpion::Rails::Controller, type: :controller do
21
21
  scorpion.new Test::Nest::Provided
22
22
  end
23
23
 
24
- hunt_for String do |scorpion|
24
+ hunt_for String do |_scorpion|
25
25
  instance_value
26
26
  end
27
27
 
@@ -45,7 +45,7 @@ describe Scorpion::Rails::Controller, type: :controller do
45
45
  capture Test::Nest::Service # Once per request
46
46
 
47
47
  share do
48
- capture Test::Nest::Cache # Once for all requests
48
+ capture Test::Nest::Cache # Once for all requests
49
49
  end
50
50
  end
51
51
 
@@ -70,9 +70,9 @@ describe Scorpion::Rails::Controller, type: :controller do
70
70
  it "stores the scorpion in `env`" do
71
71
  expect( subject ).to receive( :assign_scorpion ).and_wrap_original do |method, *args|
72
72
  expect( subject.request.env ).to receive( :[]= )
73
- .with( Scorpion::Rails::Controller::ENV_KEY, kind_of( Scorpion ) )
74
- .at_least( :once )
75
- .and_call_original
73
+ .with( Scorpion::Rails::Controller::ENV_KEY, kind_of( Scorpion ) )
74
+ .at_least( :once )
75
+ .and_call_original
76
76
 
77
77
  method.call( *args )
78
78
  end
@@ -114,7 +114,7 @@ describe Scorpion::Rails::Controller, type: :controller do
114
114
  it "spawns the same service during the same request" do
115
115
  allow( subject ).to receive( :index ) do
116
116
  service = subject.scorpion.fetch Test::Nest::Service
117
- expect( subject.scorpion.fetch Test::Nest::Service ).to be service
117
+ expect( subject.scorpion.fetch(Test::Nest::Service) ).to be service
118
118
  controller.render nothing: true
119
119
  end
120
120
 
@@ -125,7 +125,7 @@ describe Scorpion::Rails::Controller, type: :controller do
125
125
  service = subject.service
126
126
 
127
127
  allow( subject ).to receive( :index ) do
128
- expect( subject.scorpion.fetch Test::Nest::Service ).not_to be service
128
+ expect( subject.scorpion.fetch(Test::Nest::Service) ).not_to be service
129
129
  controller.render nothing: true
130
130
  end
131
131
 
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  module Test
4
4
  module Job
@@ -1,6 +1,6 @@
1
- require 'spec_helper'
2
- require 'scorpion/rspec'
3
- load 'scorpion/rspec/helper.rb'
1
+ require "spec_helper"
2
+ require "scorpion/rspec"
3
+ load "scorpion/rspec/helper.rb"
4
4
 
5
5
  Scorpion::Rspec.prepare do
6
6
  hunt_for Numeric, return: 42
@@ -24,11 +24,11 @@ describe Scorpion::Rspec::Helper do
24
24
  end
25
25
 
26
26
  it "is configurable" do
27
- expect( scorpion.fetch String ).to eq "Shazam!"
27
+ expect( scorpion.fetch(String) ).to eq "Shazam!"
28
28
  end
29
29
 
30
30
  it "inherits global config" do
31
- expect( scorpion.fetch Numeric ).to eq 42
31
+ expect( scorpion.fetch(Numeric) ).to eq 42
32
32
  end
33
33
 
34
34
  context "hunting" do
@@ -37,15 +37,15 @@ describe Scorpion::Rspec::Helper do
37
37
  hunt( :double, Regexp )
38
38
  capture( :food, ScorpionRspecHelperSpec::Food )
39
39
 
40
- specify{ expect( scorpion.fetch Numeric ).to eq 5 }
41
- specify{ expect( scorpion.fetch String ).to eq "hello" }
42
- specify{ expect( scorpion.fetch Regexp ).to be_a RSpec::Mocks::TestDouble }
43
- specify{ expect( scorpion.fetch ScorpionRspecHelperSpec::Food ).to be food }
40
+ specify { expect( scorpion.fetch(Numeric) ).to eq 5 }
41
+ specify { expect( scorpion.fetch(String) ).to eq "hello" }
42
+ specify { expect( scorpion.fetch(Regexp) ).to be_a RSpec::Mocks::TestDouble }
43
+ specify { expect( scorpion.fetch(ScorpionRspecHelperSpec::Food) ).to be food }
44
44
  end
45
45
 
46
46
  context "child context" do
47
47
  it "inherits" do
48
- expect( scorpion.fetch String ).to eq "Shazam!"
48
+ expect( scorpion.fetch(String) ).to eq "Shazam!"
49
49
  end
50
50
 
51
51
  context "overrides" do
@@ -55,7 +55,7 @@ describe Scorpion::Rspec::Helper do
55
55
  end
56
56
 
57
57
  it "overrides" do
58
- expect( scorpion.fetch String ).to eq "KaPow"
58
+ expect( scorpion.fetch(String) ).to eq "KaPow"
59
59
  end
60
60
  end
61
61
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
  describe Scorpion do
3
3
 
4
4
 
data/spec/spec_helper.rb CHANGED
@@ -1,15 +1,15 @@
1
- require 'simplecov'
1
+ require "simplecov"
2
2
  SimpleCov.start
3
3
 
4
- require 'pry'
5
- require 'bundler/setup'
6
- require 'combustion'
4
+ require "pry"
5
+ require "bundler/setup"
6
+ require "combustion"
7
7
 
8
8
  Combustion.initialize! :all
9
9
 
10
- require 'rspec/rails'
11
- require 'scorpion'
12
- require 'scorpion/rspec'
10
+ require "rspec/rails"
11
+ require "scorpion"
12
+ require "scorpion/rspec"
13
13
 
14
14
  root_path = File.expand_path( "../..", __FILE__ )
15
15
 
@@ -29,8 +29,6 @@ RSpec.configure do |config|
29
29
  config.after(:each) { GC.enable }
30
30
 
31
31
  config.before( :each, type: :model ) do
32
- [ Todo, Author ].each do |model|
33
- model.destroy_all
34
- end
32
+ [ Todo, Author ].each(&:destroy_all)
35
33
  end
36
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scorpion-ioc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Alexander
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-28 00:00:00.000000000 Z
11
+ date: 2017-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -125,13 +125,16 @@ files:
125
125
  - ".yardopts"
126
126
  - CHANGELOG.md
127
127
  - Gemfile
128
+ - Gemfile.lock
128
129
  - Guardfile
129
130
  - LICENSE
130
131
  - README.md
131
132
  - Rakefile
133
+ - app/README
132
134
  - bin/rspec
133
135
  - circle.yml
134
136
  - config.ru
137
+ - config/environment.rb
135
138
  - lib/scorpion-ioc.rb
136
139
  - lib/scorpion.rb
137
140
  - lib/scorpion/attribute.rb
@@ -151,7 +154,6 @@ files:
151
154
  - lib/scorpion/method.rb
152
155
  - lib/scorpion/nest.rb
153
156
  - lib/scorpion/object.rb
154
- - lib/scorpion/object_constructor.rb
155
157
  - lib/scorpion/rack.rb
156
158
  - lib/scorpion/rack/env.rb
157
159
  - lib/scorpion/rack/middleware.rb
@@ -190,7 +192,6 @@ files:
190
192
  - spec/lib/scorpion/error_spec.rb
191
193
  - spec/lib/scorpion/hunt_spec.rb
192
194
  - spec/lib/scorpion/hunter_spec.rb
193
- - spec/lib/scorpion/object_constructor_spec.rb
194
195
  - spec/lib/scorpion/object_spec.rb
195
196
  - spec/lib/scorpion/rack/middleware_spec.rb
196
197
  - spec/lib/scorpion/rack_spec.rb
@@ -222,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
223
  version: '0'
223
224
  requirements: []
224
225
  rubyforge_project:
225
- rubygems_version: 2.6.10
226
+ rubygems_version: 2.6.13
226
227
  signing_key:
227
228
  specification_version: 4
228
229
  summary: Add IoC to rails with minimal fuss and ceremony
@@ -246,7 +247,6 @@ test_files:
246
247
  - spec/lib/scorpion/error_spec.rb
247
248
  - spec/lib/scorpion/hunt_spec.rb
248
249
  - spec/lib/scorpion/hunter_spec.rb
249
- - spec/lib/scorpion/object_constructor_spec.rb
250
250
  - spec/lib/scorpion/object_spec.rb
251
251
  - spec/lib/scorpion/rack/middleware_spec.rb
252
252
  - spec/lib/scorpion/rack_spec.rb
@@ -1,79 +0,0 @@
1
- module Scorpion
2
- # Builds an injectable constructor for a Scorpion::Object.
3
- class ObjectConstructor
4
-
5
- def initialize( base, arguments, &block )
6
- @base = base
7
- @arguments = arguments
8
- @block = block
9
- end
10
-
11
- def define
12
- @signature = []
13
- @block_signature = []
14
- @body = []
15
-
16
- define_dependencies
17
- build_body
18
-
19
- add_initialize_block
20
- add_super
21
-
22
- assemble
23
- end
24
-
25
- private
26
- attr_reader :base, :arguments, :block, :body
27
-
28
- def define_dependencies
29
- # Override the inherited injections cause we're about to define a new
30
- # initializer.
31
- base.instance_variable_set :@initializer_injections, AttributeSet.new
32
-
33
- arguments.each do |key,expectation|
34
- base.initializer_injections.define_attribute key, *Array( expectation )
35
- base.attr_dependency key, *Array( expectation )
36
- end
37
- end
38
-
39
- def build_body
40
- if arguments.present?
41
- body << "injections = dependencies.slice( :#{ arguments.keys.join(', :') } )"
42
- body << "inject_from( dependencies )"
43
- else
44
- body << "injections = {}"
45
- end
46
- end
47
-
48
- def add_super
49
- body << "super" if base.superclass < Scorpion::Object
50
- end
51
-
52
- def add_initialize_block
53
- if block
54
- base_name = base.name || base.object_id.to_s
55
- base_name = base_name.gsub /::/, '_'
56
- name = "__initialize_with_block_#{ base_name }"
57
- if block.arity != 0 || block.parameters.any?
58
- body << "#{ name }( *args, **injections, &block )"
59
- else
60
- body << "#{ name }"
61
- end
62
- base.send :define_method, :"#{ name }", &block
63
- end
64
- end
65
-
66
- def assemble
67
- source = %Q|def initialize( *args, **dependencies, &block )\n\t#{ body.join( "\n\t" ) }\nend|
68
-
69
- # puts "=" * 50
70
- # puts base.name
71
- # puts source
72
- # puts "=" * 50
73
-
74
- base.class_eval <<-RUBY, __FILE__, __LINE__ + 1
75
- #{ source }
76
- RUBY
77
- end
78
- end
79
- end
@@ -1,124 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Scorpion::ObjectConstructor do
4
-
5
- it 'defines an initializer' do
6
- klass = Class.new do
7
- include Scorpion::Object
8
-
9
- initialize logger: String
10
- end
11
-
12
- expect( klass.instance_method(:initialize).arity ).to eq -1
13
- end
14
-
15
- it "executes initializer code" do
16
- expect do |b|
17
- klass = Class.new do
18
- include Scorpion::Object
19
-
20
- initialize label: String, &b
21
- end
22
-
23
- klass.new label: "home"
24
- end.to yield_control
25
- end
26
-
27
- it "creates an initializer that accepts a block" do
28
- klass = Class.new do
29
- include Scorpion::Object
30
-
31
- initialize label: String do |label, &block|
32
- block.call
33
- end
34
- end
35
-
36
- expect do |b|
37
- klass.new label: "apples", &b
38
- end.to yield_control
39
- end
40
-
41
- it "it defines matching attributes" do
42
- klass = Class.new do
43
- include Scorpion::Object
44
-
45
- initialize label: String
46
- end
47
-
48
- expect( klass.new( label: "apples" ).label ).to eq "apples"
49
- end
50
-
51
- it "invokes all initializers" do
52
- klass = Class.new do
53
- include Scorpion::Object
54
-
55
- initialize label: String do |label:|
56
- @label = label.reverse
57
- end
58
- end
59
-
60
- derived = Class.new( klass ) do
61
- initialize logger: Logger do |logger:|
62
- @logger = logger.to_s.reverse.to_sym
63
- end
64
- end
65
-
66
- expect( derived.new( logger: :unset, label: "Super" ).label ).to eq "repuS"
67
- expect( derived.new( logger: :unset, label: "Super" ).logger ).to eq :tesnu
68
- end
69
-
70
-
71
- context "inheritance" do
72
- let( :klass ) do
73
- Class.new do
74
- include Scorpion::Object
75
-
76
- initialize label: String do |label:|
77
- @label = label.reverse
78
- end
79
- end
80
- end
81
-
82
- let( :derived ) do
83
- Class.new( klass )
84
- end
85
-
86
- it "inherits super initializer block" do
87
- expect( derived.new( label: "Super" ).label ).to eq "repuS"
88
- end
89
-
90
- it "inherits initializer_injections" do
91
- expect( klass.initializer_injections.count ).to eq 1
92
- expect( klass.initializer_injections ).to eq derived.initializer_injections
93
- end
94
-
95
- it "can override initializer_injections" do
96
- more_derived = Class.new( derived ) do
97
- initialize do
98
- end
99
- end
100
-
101
- expect( more_derived.initializer_injections.count ).to eq 0
102
- end
103
-
104
- it "fails if changing attribute without changing initializer" do
105
- expect do
106
- overriden = Class.new( klass ) do
107
- attr_dependency :label, Integer
108
- end
109
- end.to raise_exception Scorpion::ContractMismatchError
110
- end
111
-
112
- it "works if changing attribute and changing initializer" do
113
- expect do
114
- overriden = Class.new( klass ) do
115
-
116
- initialize label: Integer
117
- attr_dependency :label, Integer
118
- end
119
- end.not_to raise_exception
120
- end
121
-
122
- end
123
-
124
- end