wireless 0.0.2 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +33 -24
- data/lib/wireless.rb +1 -1
- data/lib/wireless/registry.rb +11 -19
- data/lib/wireless/resolver.rb +1 -1
- data/lib/wireless/version.rb +1 -1
- metadata +16 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffbbea2456c108c04b1bcb959103f81a238ca8156b3d7e7390ea6c553b66dc1d
|
4
|
+
data.tar.gz: 6ef79cfcd3509264b9390764efbea408cfd17f098d1370808bb92eb220c65297
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: caf86c14536dd9ea51b3c516047f6c3c3f05d6f9dfc87e5f4c5b86d000836d5c51cc748cf2ab4771f158bdfed6413d3f580dd576b75e1a8acae75c3844360adc
|
7
|
+
data.tar.gz: 7508d42b402fa09f3f77c9bbed5a7c264259a536d4562746cd9e94fa666365714e38622fbe2cb22cd64b177a0da5d73c4fcd20a25a366f6f64d00377fdf049d3
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -3,8 +3,7 @@
|
|
3
3
|
[](https://travis-ci.org/chocolateboy/wireless)
|
4
4
|
[](https://rubygems.org/gems/wireless)
|
5
5
|
|
6
|
-
<!--
|
7
|
-
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
6
|
+
<!-- toc -->
|
8
7
|
|
9
8
|
- [NAME](#name)
|
10
9
|
- [INSTALLATION](#installation)
|
@@ -13,6 +12,7 @@
|
|
13
12
|
- [WHY?](#why)
|
14
13
|
- [Why Wireless?](#why-wireless)
|
15
14
|
- [Why Service Locators?](#why-service-locators)
|
15
|
+
- [COMPATIBILITY](#compatibility)
|
16
16
|
- [VERSION](#version)
|
17
17
|
- [SEE ALSO](#see-also)
|
18
18
|
- [Gems](#gems)
|
@@ -20,7 +20,7 @@
|
|
20
20
|
- [AUTHOR](#author)
|
21
21
|
- [COPYRIGHT AND LICENSE](#copyright-and-license)
|
22
22
|
|
23
|
-
<!--
|
23
|
+
<!-- tocstop -->
|
24
24
|
|
25
25
|
# NAME
|
26
26
|
|
@@ -87,51 +87,59 @@ which has the following features:
|
|
87
87
|
|
88
88
|
* Simplicity
|
89
89
|
|
90
|
-
It's just an object which dependencies can be added to and retrieved from.
|
91
|
-
be passed around and stored like any other object. No "injection",
|
92
|
-
|
90
|
+
It's just an object which dependencies can be added to and retrieved from.
|
91
|
+
It can be passed around and stored like any other object. No "injection",
|
92
|
+
containers, framework, or dependencies.
|
93
93
|
|
94
|
-
*
|
94
|
+
* Convenience
|
95
95
|
|
96
|
-
|
96
|
+
Include dependency getters into a class or module with control over their
|
97
|
+
visibility.
|
97
98
|
|
98
99
|
* Laziness
|
99
100
|
|
100
|
-
As well as
|
101
|
-
at the point of creation
|
101
|
+
As well as being resolved lazily, dependencies can also be *registered*
|
102
|
+
lazily, i.e. at the point of creation. There's no need to declare
|
103
|
+
everything up front.
|
102
104
|
|
103
105
|
* Safety
|
104
106
|
|
105
|
-
Dependency resolution is thread-safe. Dependency cycles are checked and
|
106
|
-
error as soon as they are detected.
|
107
|
+
Dependency resolution is thread-safe. Dependency cycles are checked and
|
108
|
+
raise a fatal error as soon as they are detected.
|
107
109
|
|
108
110
|
# WHY?
|
109
111
|
|
110
112
|
## Why Wireless?
|
111
113
|
|
112
|
-
I wanted a simple service locator like
|
113
|
-
|
114
|
+
I wanted a simple service locator like
|
115
|
+
[DiFtw](https://github.com/jhollinger/ruby-diftw), with cycle detection and
|
116
|
+
control over the [visibility of getters](https://github.com/jhollinger/ruby-diftw/issues/1).
|
114
117
|
|
115
118
|
## Why Service Locators?
|
116
119
|
|
117
120
|
Service locators make it easy to handle shared (AKA
|
118
|
-
[cross-cutting](https://en.wikipedia.org/wiki/Cross-cutting_concern))
|
119
|
-
values and services that are required by multiple
|
120
|
-
Examples include:
|
121
|
+
[cross-cutting](https://en.wikipedia.org/wiki/Cross-cutting_concern))
|
122
|
+
dependencies i.e. values and services that are required by multiple
|
123
|
+
otherwise-unrelated parts of a system. Examples include:
|
121
124
|
|
122
125
|
* logging
|
123
126
|
* configuration data
|
124
127
|
* storage backends
|
125
128
|
* authorisation
|
126
129
|
|
127
|
-
Rather than wiring these dependencies together manually, service locators allow
|
128
|
-
registered and retrieved in a declarative way. This is similar to
|
129
|
-
imperative build tools like Ant or Gulp and declarative
|
130
|
-
|
130
|
+
Rather than wiring these dependencies together manually, service locators allow
|
131
|
+
them to be registered and retrieved in a declarative way. This is similar to
|
132
|
+
the difference between imperative build tools like Ant or Gulp, and declarative
|
133
|
+
build tools like Make or Rake, which allow prerequisites to be acquired without
|
134
|
+
coordinating their construction.
|
135
|
+
|
136
|
+
# COMPATIBILITY
|
137
|
+
|
138
|
+
- [Maintained ruby versions](https://www.ruby-lang.org/en/downloads/branches/)
|
131
139
|
|
132
140
|
# VERSION
|
133
141
|
|
134
|
-
0.0
|
142
|
+
0.1.0
|
135
143
|
|
136
144
|
# SEE ALSO
|
137
145
|
|
@@ -139,6 +147,7 @@ allow prerequisites to be acquired on-demand, without micromanaging their constr
|
|
139
147
|
|
140
148
|
- [Canister](https://github.com/mlibrary/canister) - a simple service-locator inspired by Jim Weirich's [article](https://archive.li/shxeA) on Dependency Injection
|
141
149
|
- [DiFtw](https://github.com/jhollinger/ruby-diftw) - the original inspiration for this module: a similar API with a focus on testing/mocking
|
150
|
+
- [dry-container](https://github.com/dry-rb/dry-container) - a standalone service-locator which can also be paired with a [dependency injector](https://github.com/dry-rb/dry-auto_inject)
|
142
151
|
|
143
152
|
## Articles
|
144
153
|
|
@@ -151,7 +160,7 @@ allow prerequisites to be acquired on-demand, without micromanaging their constr
|
|
151
160
|
|
152
161
|
# COPYRIGHT AND LICENSE
|
153
162
|
|
154
|
-
Copyright © 2018 by chocolateboy.
|
163
|
+
Copyright © 2018-2020 by chocolateboy.
|
155
164
|
|
156
165
|
This is free software; you can redistribute it and/or modify it under the
|
157
|
-
terms of the [Artistic License 2.0](
|
166
|
+
terms of the [Artistic License 2.0](https://www.opensource.org/licenses/artistic-license-2.0.php).
|
data/lib/wireless.rb
CHANGED
@@ -12,7 +12,7 @@ module Wireless
|
|
12
12
|
# - retrieve a value from a key-indexed store when the key doesn't exist
|
13
13
|
# - write a value when the key exists and the store doesn't allow replacements
|
14
14
|
#
|
15
|
-
# Can be passed a message, the receiver the lookup failed on and the key. All
|
15
|
+
# Can be passed a message, the receiver the lookup failed on, and the key. All
|
16
16
|
# are optional and default to nil.
|
17
17
|
#
|
18
18
|
# XXX eventually (i.e. in ruby 2.6), this can be a subclass of (or replaced by)
|
data/lib/wireless/registry.rb
CHANGED
@@ -9,7 +9,7 @@ module Wireless
|
|
9
9
|
# which either resolve the dependency every time (factory) or once (singleton).
|
10
10
|
#
|
11
11
|
# A class can be supplied instead of the block, in which case it is equivalent to
|
12
|
-
# a block which calls +new+ on the class e.g.:
|
12
|
+
# a block which calls +new+ on the class, e.g.:
|
13
13
|
#
|
14
14
|
# WL = Wireless.new do
|
15
15
|
# on(:foo, Foo)
|
@@ -39,8 +39,8 @@ module Wireless
|
|
39
39
|
@registry[name.to_sym] = Resolver::Factory.new(block || klass)
|
40
40
|
end
|
41
41
|
|
42
|
-
# Returns true if a
|
43
|
-
# otherwise
|
42
|
+
# Returns true if a dependency with the specified name has been registered,
|
43
|
+
# false otherwise
|
44
44
|
def include?(key)
|
45
45
|
@registry.include?(key)
|
46
46
|
end
|
@@ -52,7 +52,7 @@ module Wireless
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# Takes an array or hash specifying the dependencies to export, and returns
|
55
|
-
# a module which
|
55
|
+
# a module which defines getters for those dependencies.
|
56
56
|
#
|
57
57
|
# class Test
|
58
58
|
# # hash (specify visibilities)
|
@@ -70,7 +70,7 @@ module Wireless
|
|
70
70
|
# with { visibility => imports } pairs, where imports is an array of import
|
71
71
|
# specifiers. An import specifier is a symbol (method name == dependency name)
|
72
72
|
# or a hash with { dependency_name => method_name } pairs (aliases). If
|
73
|
-
# there's only one import specifier, its enclosing array can be omitted e.g.:
|
73
|
+
# there's only one import specifier, its enclosing array can be omitted, e.g.:
|
74
74
|
#
|
75
75
|
# include Services.mixin(private: :foo, protected: { :baz => :quux })
|
76
76
|
#
|
@@ -88,8 +88,9 @@ module Wireless
|
|
88
88
|
raise ArgumentError, "invalid mixin argument: expected array or hash, got: #{args.class}"
|
89
89
|
end
|
90
90
|
|
91
|
-
# slurp each array of name (symbol) or name => alias (hash)
|
92
|
-
# a normalized hash of { dependency_name => method_name }
|
91
|
+
# slurp each array of name (symbol) or name => alias (hash) import
|
92
|
+
# specifiers into a normalized hash of { dependency_name => method_name }
|
93
|
+
# pairs, e.g.:
|
93
94
|
#
|
94
95
|
# before:
|
95
96
|
#
|
@@ -99,19 +100,10 @@ module Wireless
|
|
99
100
|
#
|
100
101
|
# { :foo => :foo, :bar => :baz, :quux => :quux }
|
101
102
|
|
102
|
-
# XXX transform_values
|
103
|
-
|
104
|
-
#
|
105
|
-
# args = DEFAULT_EXPORTS.merge(args).transform_values do |exports|
|
106
|
-
# exports = [exports] unless exports.is_a?(Array)
|
107
|
-
# exports.reduce({}) do |a, b|
|
108
|
-
# a.merge(b.is_a?(Hash) ? b : { b => b })
|
109
|
-
# end
|
110
|
-
# end
|
111
|
-
|
112
|
-
args = DEFAULT_EXPORTS.merge(args).each_with_object({}) do |(key, exports), merged|
|
103
|
+
# XXX transform_values requires ruby >= 2.5
|
104
|
+
args = DEFAULT_EXPORTS.merge(args).transform_values do |exports|
|
113
105
|
exports = [exports] unless exports.is_a?(Array)
|
114
|
-
|
106
|
+
exports.reduce({}) do |a, b|
|
115
107
|
a.merge(b.is_a?(Hash) ? b : { b => b })
|
116
108
|
end
|
117
109
|
end
|
data/lib/wireless/resolver.rb
CHANGED
@@ -4,7 +4,7 @@ module Wireless
|
|
4
4
|
# The registry is a key/value store (Hash) whose keys are symbols and whose values
|
5
5
|
# are instances of this class. Resolvers are responsible for returning their
|
6
6
|
# dependencies, which they do by calling their corresponding blocks. They can wrap
|
7
|
-
# additional behaviors around this call e.g. singletons (Wireless::Resolver::Singleton)
|
7
|
+
# additional behaviors around this call, e.g. singletons (Wireless::Resolver::Singleton)
|
8
8
|
# cache the result so that the block is only called once.
|
9
9
|
class Resolver
|
10
10
|
def initialize(block = nil)
|
data/lib/wireless/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wireless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- chocolateboy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,84 +16,84 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '2.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '5.
|
33
|
+
version: '5.14'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '5.
|
40
|
+
version: '5.14'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest-power_assert
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.3
|
47
|
+
version: '0.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.3
|
54
|
+
version: '0.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: minitest-reporters
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1.
|
61
|
+
version: '1.4'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1.
|
68
|
+
version: '1.4'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '13.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '13.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: '0.83'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
96
|
+
version: '0.83'
|
97
97
|
description:
|
98
98
|
email: chocolate@cpan.org
|
99
99
|
executables: []
|
@@ -128,15 +128,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
131
|
+
version: 2.5.0
|
132
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
133
|
requirements:
|
134
134
|
- - ">="
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: '0'
|
137
137
|
requirements: []
|
138
|
-
|
139
|
-
rubygems_version: 2.7.7
|
138
|
+
rubygems_version: 3.1.2
|
140
139
|
signing_key:
|
141
140
|
specification_version: 4
|
142
141
|
summary: A lightweight, declarative dependency-provider
|