dependency_bundle 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 44823d9bfdaf9b6c44a0608b7a13a0f6fcdec235adfa462b236c692c0727b99c
4
+ data.tar.gz: c827b37f403b10835d2904fbd8c975452a2abca50232c799fa8ac8c59131730f
5
+ SHA512:
6
+ metadata.gz: bee3954383ada6a2ec98b411e0cab0a761fe6b15ce01b2aa3adade10e54f20409e2903f60ab7e719ac652609f8005567ee23e358aeb9e931b1767a4d601987dc
7
+ data.tar.gz: 59ce7706fe7103af008f9c53e9cdd68da1ea7280dcc8d3501b149ea0b01268e9013b17d71623ae75f7a2a2ddee0fb9e036721b7cde4d6b6dbcb6727d7b40720d
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.5.1
5
+ before_install: gem install bundler -v 1.16.1
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## RELEASE 0.1.0
2
+
3
+ * FEATURE: It exists. See the README for instructions.
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, gender identity and expression, level of experience,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at choffman@optoro.com. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [http://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: http://contributor-covenant.org
74
+ [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in dependency_bundle.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,57 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dependency_bundle (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ byebug (9.1.0)
10
+ coderay (1.1.2)
11
+ diff-lcs (1.3)
12
+ docile (1.3.1)
13
+ git (1.5.0)
14
+ json (2.1.0)
15
+ method_source (0.9.0)
16
+ pry (0.11.3)
17
+ coderay (~> 1.1.0)
18
+ method_source (~> 0.9.0)
19
+ pry-byebug (3.5.1)
20
+ byebug (~> 9.1)
21
+ pry (~> 0.10)
22
+ rake (10.5.0)
23
+ rspec (3.7.0)
24
+ rspec-core (~> 3.7.0)
25
+ rspec-expectations (~> 3.7.0)
26
+ rspec-mocks (~> 3.7.0)
27
+ rspec-core (3.7.1)
28
+ rspec-support (~> 3.7.0)
29
+ rspec-expectations (3.7.0)
30
+ diff-lcs (>= 1.2.0, < 2.0)
31
+ rspec-support (~> 3.7.0)
32
+ rspec-mocks (3.7.0)
33
+ diff-lcs (>= 1.2.0, < 2.0)
34
+ rspec-support (~> 3.7.0)
35
+ rspec-support (3.7.1)
36
+ simplecov (0.16.1)
37
+ docile (~> 1.1)
38
+ json (>= 1.8, < 3)
39
+ simplecov-html (~> 0.10.0)
40
+ simplecov-html (0.10.2)
41
+ structured_changelog (0.11.0)
42
+ git
43
+
44
+ PLATFORMS
45
+ ruby
46
+
47
+ DEPENDENCIES
48
+ bundler (~> 1.16)
49
+ dependency_bundle!
50
+ pry-byebug
51
+ rake (~> 10.0)
52
+ rspec (~> 3.0)
53
+ simplecov
54
+ structured_changelog
55
+
56
+ BUNDLED WITH
57
+ 1.16.1
data/README.adoc ADDED
@@ -0,0 +1,222 @@
1
+ = DependencyBundle
2
+ :ext-relative: .adoc
3
+ :source-highlighter: coderay
4
+ :sectanchors:
5
+ :linkattrs:
6
+ :icons: font
7
+ :toc: macro
8
+ :toclevels: 3
9
+ ifdef::env-github[]
10
+ :tip-caption: :bulb:
11
+ :note-caption: :information_source:
12
+ :important-caption: :heavy_exclamation_mark:
13
+ :caution-caption: :fire:
14
+ :warning-caption: :warning:
15
+ endif::[]
16
+
17
+ https://badge.fury.io/rb/dependency_bundle[image:https://badge.fury.io/rb/dependency_bundle.png[Gem Version]]
18
+ https://travis-ci.org/yarmiganosca/dependency_bundle[image:https://secure.travis-ci.org/yarmiganosca/dependency_bundle.png[Build Status]]
19
+ https://coveralls.io/r/yarmiganosca/dependency_bundle[image:https://coveralls.io/repos/yarmiganosca/dependency_bundle/badge.png?branch=master[Test Coverage]]
20
+
21
+ toc::[]
22
+
23
+ == Overview
24
+
25
+ DependencyBundle helps you write Dependency Injected code without a Global Dependency Registry or a Dependency Injection Framework, because:
26
+
27
+ * Global Dependency Registries are bad for all the same reasons regular globals are bad (which we're trying to get away from with DI in the first place!).
28
+ * Dependency Injection Frameworks aren't bad, but they are heavy, and aren't necessary in all situations where you want DI.
29
+
30
+ Instead, DependencyBundle is a Depedency Registry that's designed to be injected. Using it is simple. Here's an a Dependency Bundle with just a logger:
31
+
32
+ [source,ruby]
33
+ ----
34
+ require 'dependency_bundle'
35
+
36
+ deps = DependencyBundle.new do
37
+ set :logger, Logger.new(self.stdout) # self is the DependencyBundle instance
38
+ # by default, DependencyBundle instances come with:
39
+ # :env -> the ENV global
40
+ # :stdin -> the STDIN global
41
+ # :stdout -> the STDOUT global
42
+ # :stderr -> the STDERR global
43
+ end
44
+ ----
45
+
46
+ But building your entire codebase around it is even better.
47
+
48
+ == Using DependencyBundle
49
+
50
+ Let's say you've got a report that gets run every morning. It:
51
+
52
+ . makes some HTTP API requests
53
+ . does some math on the results of those requests
54
+ . caches the result on a Memcache instance
55
+ . emails the attendees of a standing morning meeting
56
+
57
+ Assuming you don't need any dependencies for the computation itself, you've got these dependencies:
58
+
59
+ * HTTP Client
60
+ * Memcache Client
61
+ * Mailer
62
+ * Logger (not mentioned explicitly, but you always need one)
63
+
64
+ So your bundle would look something like this:
65
+
66
+ [source,ruby]
67
+ ----
68
+ require 'dependency_bundle'
69
+
70
+ deps = DependencyBundle.new do
71
+ set :logger, Logger.new(self.stdout) # each DependencyBundle has stdout by default
72
+ set :mailer, Mailer(deps: self) # which needs a logger
73
+ set :http_client, HTTPClient.new(deps: self) # also needs a logger
74
+ set :memcache_client, MemcacheClient.new(
75
+ host: "cache.example.com", # needs a host to connect to
76
+ deps: self # needs a logger
77
+ )
78
+ end
79
+ ----
80
+
81
+ and your report class might look like this:
82
+
83
+ [source,ruby]
84
+ ----
85
+ class MorningMeetingReport
86
+ def initialize(deps:, date: Date.today.prev_day)
87
+ # One of DependencyBundle's best features is dependency verification.
88
+ # It allows us to:
89
+ # * Discover during testing if we have unsatisfied class dependencies
90
+ # * Document the dependencies of our classes
91
+ deps.verify_dependencies!(:logger, :http_client, :memcache_client, :mailer)
92
+
93
+ @deps = deps
94
+ @date = date
95
+ end
96
+
97
+ def generate
98
+ # collect data with @deps.http_client
99
+ end
100
+
101
+ def store
102
+ # cache report with @deps.memcache_client
103
+ end
104
+
105
+ def notify
106
+ # email attendees with @deps.mailer
107
+ end
108
+ end
109
+ ----
110
+
111
+ If you design entire programs this way,
112
+
113
+ * adding new dependencies is easy
114
+ * testing your code's response to failures is simple
115
+
116
+ === Testing with DependencyBundle
117
+
118
+ Testing your code with Dependency Bundles is also easy! Build `DependencyBundle` instances in your setup steps, and instantiate your test subjects with them. As an example, if we use the above code and RSpec doubles, it'll look something like this:
119
+
120
+ [source,ruby]
121
+ ----
122
+ RSpec.describe MorningMeetingReport do
123
+ let(:deps) do
124
+ set :logger, Logger.new(StringIO.new)
125
+ set :mailer, instance_double('Mailer')
126
+ set :http_client, instance_double('HTTPClient')
127
+ set :memcache_client, instance_double('MemcacheClient')
128
+ end
129
+
130
+ context 'happy path' do
131
+ before do
132
+ allow(deps.http_client).to receive(:get).with(url).and_return(fixture)
133
+ allow(deps.memcache_client).to receive(:set).with(key, value).and_return(true)
134
+ allow(deps.mailer).to receive(:send_mail).and_return(true)
135
+ end
136
+
137
+ # ...
138
+ end
139
+
140
+ # ...
141
+ end
142
+ ----
143
+
144
+ == Installation
145
+
146
+ Add this line to your application's Gemfile:
147
+
148
+ [source,ruby]
149
+ ----
150
+ gem 'dependency_bundle'
151
+ ----
152
+
153
+ And then execute:
154
+
155
+ [subs=+macros]
156
+ ----
157
+ +++<span style="pointer-events:none;user-select:none;">$ </span>+++bundle install
158
+ ----
159
+
160
+ Or install it yourself as:
161
+
162
+ [subs=+macros]
163
+ ----
164
+ +++<span style="pointer-events:none;user-select:none;">$ </span>+++gem install dependency_bundle
165
+ ----
166
+
167
+ == Contributing
168
+
169
+ Bug reports and pull requests are welcome on GitHub at https://github.com/yarmiganosca/dependency_bundle
170
+
171
+ [IMPORTANT]
172
+ .Code of Conduct
173
+ ====
174
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the http://contributor-covenant.org[Contributor Convenant] code of conduct.
175
+ ====
176
+
177
+ === Development
178
+
179
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
180
+
181
+ To install this gem onto your local machine, run `bundle exec rake install`.
182
+
183
+ === Testing
184
+
185
+ To run all the tests, run `bundle exec rspec`.
186
+
187
+ === Pull Requests
188
+
189
+ Pull requests should be well-scoped and include tests appropriate to the changes.
190
+
191
+ When submitting a pull request that changes user-facing behavior, add release note lines to the commit message body http://github.com/yarmiganosca/structured_changelog#with-multiple-contributors[like this]. You can preview your release lines by running
192
+
193
+ [subs=+macros]
194
+ ----
195
+ +++<span style="pointer-events:none;user-select:none;">$ </span>+++bundle exec rake changelog:preview
196
+ ----
197
+
198
+ === Releases
199
+
200
+ Releasing a new version is a 2-step process.
201
+
202
+ First, run
203
+
204
+ [subs=+macros]
205
+ ----
206
+ +++<span style="pointer-events:none;user-select:none;">$ </span>+++bundle exec rake changelog:compile
207
+ ----
208
+
209
+ This will add a new release section before the other release sections. It will contain all the release notes in the commit messages since the last release, and will be prepopulated with the minimum possible version given those changes. Proof-read it and reorder the notes if you think doing so would be necessary or clearer. Feel free to increase the version if necessary (to force a major release, for example).
210
+
211
+ Once you're satisfied, run
212
+
213
+ [subs=+macros]
214
+ ----
215
+ +++<span style="pointer-events:none;user-select:none;">$ </span>+++bundle exec rake changelog:release
216
+ ----
217
+
218
+ This will create a git tag for the version, push git commits and tags, and push the `.gem` file to https://rubygems.org[rubygems.org].
219
+
220
+ == License
221
+
222
+ The gem is available as open source under the terms of the https://opensource.org/licenses/MIT[MIT License].
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require 'structured_changelog/tasks'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "dependency_bundle"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ require "pry"
10
+ Pry.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,29 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "dependency_bundle/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "dependency_bundle"
8
+ spec.version = DependencyBundle::VERSION
9
+ spec.authors = ["Chris Hoffman"]
10
+ spec.email = ["yarmiganosca@gmail.com"]
11
+
12
+ spec.summary = %q{An Injectable Dependency Container implementation for Ruby}
13
+ spec.description = spec.summary
14
+ spec.homepage = "https://github.com/yarmiganosca/dependency_bundle"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.16"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec", "~> 3.0"
26
+ spec.add_development_dependency "structured_changelog"
27
+ spec.add_development_dependency "pry-byebug"
28
+ spec.add_development_dependency "simplecov"
29
+ end
@@ -0,0 +1,33 @@
1
+ require "dependency_bundle/version"
2
+
3
+ class DependencyBundle
4
+ DependencyNotProvided = Class.new(StandardError)
5
+ OverrideAttempted = Class.new(StandardError)
6
+
7
+ def initialize(&blk)
8
+ set :env, ENV
9
+ set :stdin, STDIN
10
+ set :stdout, STDOUT
11
+ set :stderr, STDERR
12
+
13
+ instance_exec(&blk) if block_given?
14
+ end
15
+
16
+ def set(name, value)
17
+ if respond_to?(name)
18
+ raise(OverrideAttempted, "You can't override `:#{name}` on #{inspect}, since it already responds to `:#{name}`. If you're seeing this because you tried to override a dependency, please don't. DependencyBundle doesn't allow that because of the misery it would introduce into debugging (your logger or http client changing between constructors is just asking for trouble). If you didn't try to override a dependency, and there's just a pre-existing Ruby method that happens to be named the same as the key you're using, I'm sorry. Please register your dependency with a different key.")
19
+ else
20
+ define_singleton_method(name) { value }
21
+ end
22
+ end
23
+
24
+ def verify_dependencies!(*names)
25
+ raise(ArgumentError, "##{__method__} expects names of dependencies to be passed") if names.empty?
26
+
27
+ not_found_names = names.reject(&method(:respond_to?))
28
+
29
+ raise(DependencyNotProvided, "#{not_found_names} not set") if not_found_names.any?
30
+
31
+ true
32
+ end
33
+ end
@@ -0,0 +1,3 @@
1
+ class DependencyBundle
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dependency_bundle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Hoffman
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-12-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: structured_changelog
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: An Injectable Dependency Container implementation for Ruby
98
+ email:
99
+ - yarmiganosca@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - CHANGELOG.md
108
+ - CODE_OF_CONDUCT.md
109
+ - Gemfile
110
+ - Gemfile.lock
111
+ - README.adoc
112
+ - Rakefile
113
+ - bin/console
114
+ - bin/setup
115
+ - dependency_bundle.gemspec
116
+ - lib/dependency_bundle.rb
117
+ - lib/dependency_bundle/version.rb
118
+ homepage: https://github.com/yarmiganosca/dependency_bundle
119
+ licenses: []
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 2.7.6
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: An Injectable Dependency Container implementation for Ruby
141
+ test_files: []