plumbum 0.1.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.
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'plumbum/rspec'
4
+
5
+ module Plumbum::RSpec
6
+ # Namespace for deferred example groups that assert on Plumbum objects.
7
+ module Deferred; end
8
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sleeping_king_studios/tools/toolbox/mixin'
4
+
5
+ require 'plumbum/rspec'
6
+
7
+ module Plumbum::RSpec
8
+ # Helper methods for stubbing the values of Plumbum providers in RSpec tests.
9
+ module StubProvider
10
+ extend SleepingKingStudios::Tools::Toolbox::Mixin
11
+
12
+ # Class methods to extend when including StubProvider.
13
+ module ClassMethods
14
+ # (see Plumbum::RSpec::StubProvider#stub_provider)
15
+ def stub_provider(provider, key, value)
16
+ before(:example) { stub_provider(provider, key, value) }
17
+ end
18
+ end
19
+
20
+ class << self
21
+ # Verifies the provider has the given key.
22
+ #
23
+ # @param provider [Plumbum::Provider] the provider to stub.
24
+ # @param key [String, Symbol] the key to verify.
25
+ #
26
+ # @return void
27
+ #
28
+ # @raise [ArgumentError] if the key is not a valid String or Symbol.
29
+ # @raise [Plumbum::Errors::InvalidKeyError] if the key is not supported
30
+ # by the provider.
31
+ def validate_key(provider, key)
32
+ SleepingKingStudios::Tools::Toolbelt
33
+ .instance
34
+ .assertions
35
+ .validate_name(key, as: :key)
36
+
37
+ return if provider.has?(key)
38
+
39
+ return if provider.send(:raw_value, key.to_s) == Plumbum::UNDEFINED
40
+
41
+ provider_name =
42
+ provider.respond_to?(:name) ? provider.name : provider.class.name
43
+
44
+ raise Plumbum::Errors::InvalidKeyError,
45
+ "invalid key #{key.inspect} for #{provider_name}"
46
+ end
47
+ end
48
+
49
+ # Stubs the value of a specific key for a provider for the current spec.
50
+ #
51
+ # @param provider [Plumbum::Provider] the provider to stub.
52
+ # @param key [String, Symbol] the key to stub.
53
+ # @param value [Object] the temporary value to assign for the key.
54
+ #
55
+ # @return [Symbol] the stubbed key.
56
+ #
57
+ # @raise [Plumbum::Errors::InvalidKeyError] if the key is not supported by
58
+ # the provider.
59
+ def stub_provider(provider, key, value) # rubocop:disable Metrics/AbcSize
60
+ StubProvider.validate_key(provider, key)
61
+
62
+ unless RSpec::Mocks.space.registered?(provider)
63
+ allow(provider).to receive(:get).and_call_original
64
+ allow(provider).to receive(:has?).and_call_original
65
+ end
66
+
67
+ presence = value != Plumbum::UNDEFINED
68
+
69
+ allow(provider).to receive(:get).with(key.to_s).and_return(value)
70
+ allow(provider).to receive(:get).with(key.to_sym).and_return(value)
71
+ allow(provider).to receive(:has?).with(key.to_s).and_return(presence)
72
+ allow(provider).to receive(:has?).with(key.to_sym).and_return(presence)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'plumbum'
4
+
5
+ module Plumbum
6
+ # Namespace for RSpec examples for testing Plumbum implementations.
7
+ module RSpec; end
8
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Plumbum
4
+ # @api private
5
+ #
6
+ # The current version of the gem.
7
+ #
8
+ # @see http://semver.org/
9
+ module Version
10
+ # Major version.
11
+ MAJOR = 0
12
+ # Minor version.
13
+ MINOR = 1
14
+ # Patch version.
15
+ PATCH = 0
16
+ # Prerelease version.
17
+ PRERELEASE = nil
18
+ # Build metadata.
19
+ BUILD = nil
20
+
21
+ class << self
22
+ # Generates the gem version string from the Version constants.
23
+ #
24
+ # Inlined here because dependencies may not be loaded when processing a
25
+ # gemspec, which results in the user being unable to install the gem for
26
+ # the first time.
27
+ #
28
+ # @see SleepingKingStudios::Tools::SemanticVersion#to_gem_version
29
+ def to_gem_version
30
+ str = "#{MAJOR}.#{MINOR}.#{PATCH}"
31
+
32
+ prerelease = value_of(:PRERELEASE)
33
+ str = "#{str}.#{prerelease}" if prerelease
34
+
35
+ build = value_of(:BUILD)
36
+ str = "#{str}.#{build}" if build
37
+
38
+ str
39
+ end
40
+
41
+ private
42
+
43
+ def value_of(constant)
44
+ return nil unless const_defined?(constant)
45
+
46
+ value = const_get(constant)
47
+
48
+ return nil if value.respond_to?(:empty?) && value.empty?
49
+
50
+ value
51
+ end
52
+ end
53
+ end
54
+
55
+ # The current version of the gem.
56
+ VERSION = Version.to_gem_version
57
+ end
data/lib/plumbum.rb ADDED
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Dependency injection and management library for Ruby.
4
+ module Plumbum
5
+ autoload :Consumer, 'plumbum/consumer'
6
+ autoload :Consumers, 'plumbum/consumers'
7
+ autoload :Errors, 'plumbum/errors'
8
+ autoload :ManyProvider, 'plumbum/many_provider'
9
+ autoload :OneProvider, 'plumbum/one_provider'
10
+ autoload :Parameters, 'plumbum/parameters'
11
+ autoload :Provider, 'plumbum/provider'
12
+ autoload :Providers, 'plumbum/providers'
13
+
14
+ # Object representing an undefined or uninitialized value.
15
+ UNDEFINED = Object.new.freeze
16
+
17
+ class << self
18
+ # @return [String] the current version of the gem.
19
+ def version
20
+ VERSION
21
+ end
22
+ end
23
+ end
24
+
25
+ require 'plumbum/version'
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: plumbum
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rob "Merlin" Smith
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: sleeping_king_studios-tools
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.3'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.3'
26
+ description: |-
27
+ A minimal dependency injection framework for Ruby, using vanilla Ruby
28
+ semantics to define and reference dependencies from different providers.
29
+ email:
30
+ - merlin@sleepingkingstudios.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - CHANGELOG.md
36
+ - CODE_OF_CONDUCT.md
37
+ - LICENSE
38
+ - README.md
39
+ - lib/plumbum.rb
40
+ - lib/plumbum/consumer.rb
41
+ - lib/plumbum/consumers.rb
42
+ - lib/plumbum/consumers/class_methods.rb
43
+ - lib/plumbum/consumers/instance_methods.rb
44
+ - lib/plumbum/consumers/scoped_consumer.rb
45
+ - lib/plumbum/errors.rb
46
+ - lib/plumbum/errors/immutable_error.rb
47
+ - lib/plumbum/errors/invalid_dependency_error.rb
48
+ - lib/plumbum/errors/invalid_key_error.rb
49
+ - lib/plumbum/errors/missing_dependency_error.rb
50
+ - lib/plumbum/many_provider.rb
51
+ - lib/plumbum/one_provider.rb
52
+ - lib/plumbum/parameters.rb
53
+ - lib/plumbum/provider.rb
54
+ - lib/plumbum/providers.rb
55
+ - lib/plumbum/providers/lazy.rb
56
+ - lib/plumbum/providers/plural.rb
57
+ - lib/plumbum/providers/singular.rb
58
+ - lib/plumbum/rspec.rb
59
+ - lib/plumbum/rspec/deferred.rb
60
+ - lib/plumbum/rspec/deferred/consumer_examples.rb
61
+ - lib/plumbum/rspec/deferred/provider_examples.rb
62
+ - lib/plumbum/rspec/stub_provider.rb
63
+ - lib/plumbum/version.rb
64
+ homepage: http://sleepingkingstudios.com
65
+ licenses:
66
+ - MIT
67
+ metadata:
68
+ bug_tracker_uri: https://github.com/sleepingkingstudios/plumbum/issues
69
+ source_code_uri: https://github.com/sleepingkingstudios/plumbum
70
+ rubygems_mfa_required: 'true'
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '3.2'
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: '5'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 4.0.10
89
+ specification_version: 4
90
+ summary: A dependency injection and management library for Ruby.
91
+ test_files: []