usable 2.1.3 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +1 -0
- data/bin/console +1 -0
- data/lib/usable/config.rb +27 -29
- data/lib/usable/config_multi.rb +19 -0
- data/lib/usable/config_register.rb +26 -0
- data/lib/usable/mod_extender.rb +3 -20
- data/lib/usable/version.rb +1 -1
- data/lib/usable.rb +15 -7
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3820825f72ea24881e17662498e419f3aba04e78
|
4
|
+
data.tar.gz: 7c5ae702b5d0e293ba188ea4362fe8d4ece9c935
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b235afa4781dbc735133ef2635d15924bd62ce2fe5e5821f697f11c27b44f2697ffc33497cbfba6bb7e7f6cfd9e98d94e45300c1148e5aee3060ad0f0dceefdd
|
7
|
+
data.tar.gz: 246d2b78ebc8fce4b396dec9eb5368e15951f4571cb1e29de0f90402296da40ba99fe967d7d45bd724d91fc7887715a3c6abccb19f388608dd73f957b79b49b0
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
data/bin/console
CHANGED
data/lib/usable/config.rb
CHANGED
@@ -1,24 +1,15 @@
|
|
1
|
+
require 'usable/config_multi'
|
2
|
+
require 'usable/config_register'
|
3
|
+
|
1
4
|
module Usable
|
5
|
+
# Store and manage configuration settings. Keep methods to a minimum since this class relies on method_missing to read
|
6
|
+
# and write to the underlying @spec object
|
2
7
|
class Config
|
3
|
-
|
4
|
-
|
5
|
-
# and write to the underlying @spec object
|
6
|
-
#
|
7
|
-
|
8
|
-
def available_methods
|
9
|
-
modules.each_with_object(Hash.new(Null.instance_method(:default_method))) do |mod, result|
|
10
|
-
mod.instance_methods.each do |method_name|
|
11
|
-
result[method_name] = mod.instance_method method_name
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
8
|
+
include ConfigRegister
|
9
|
+
include ConfigMulti
|
15
10
|
|
16
|
-
def
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def modules
|
21
|
-
@modules ||= []
|
11
|
+
def initialize
|
12
|
+
@spec = OpenStruct.new
|
22
13
|
end
|
23
14
|
|
24
15
|
def each(&block)
|
@@ -26,14 +17,18 @@ module Usable
|
|
26
17
|
end
|
27
18
|
|
28
19
|
def spec(key, value = nil)
|
29
|
-
@spec ||= OpenStruct.new
|
30
20
|
if value
|
31
21
|
@spec[key.to_s.tr('=', '')] = value
|
32
22
|
else
|
33
|
-
|
23
|
+
# Handle the case where the value may be defined with a block, in which case it's a method
|
24
|
+
@spec[key] ||= call_lazy_method(key)
|
34
25
|
end
|
35
26
|
end
|
36
27
|
|
28
|
+
def _spec
|
29
|
+
@spec
|
30
|
+
end
|
31
|
+
|
37
32
|
def [](key)
|
38
33
|
spec key
|
39
34
|
end
|
@@ -42,19 +37,22 @@ module Usable
|
|
42
37
|
spec key, val
|
43
38
|
end
|
44
39
|
|
45
|
-
def
|
46
|
-
spec
|
47
|
-
rescue
|
48
|
-
super
|
40
|
+
def call_lazy_method(key)
|
41
|
+
@spec.public_send(key.to_s.tr('=', ''))
|
49
42
|
end
|
50
43
|
|
51
|
-
def
|
52
|
-
|
44
|
+
def method_missing(method_name, *args, &block)
|
45
|
+
if block
|
46
|
+
_spec.define_singleton_method(method_name) { yield }
|
47
|
+
else
|
48
|
+
spec method_name, *args
|
49
|
+
end
|
50
|
+
rescue => e
|
51
|
+
super
|
53
52
|
end
|
54
53
|
|
55
|
-
|
56
|
-
|
57
|
-
end
|
54
|
+
def respond_to_missing?(method_name, _private = false)
|
55
|
+
method_name.to_s.end_with?('=') || _spec.respond_to?(method_name)
|
58
56
|
end
|
59
57
|
end
|
60
58
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Usable
|
2
|
+
module ConfigMulti
|
3
|
+
# It's important to define all block specs we need to lazy load
|
4
|
+
# Set block specs to nil values so it will fallback to calling the underlying singleton method defined by Config#method_missing
|
5
|
+
def +(other)
|
6
|
+
config = clone
|
7
|
+
specs = other._spec.to_h
|
8
|
+
specs.each { |key, val| config.spec key, val }
|
9
|
+
methods = other._spec.singleton_methods - specs.keys
|
10
|
+
methods.each do |name|
|
11
|
+
config._spec[name] = nil
|
12
|
+
config._spec.define_singleton_method(name) do
|
13
|
+
other._spec.public_method(name).call
|
14
|
+
end
|
15
|
+
end
|
16
|
+
config
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Usable
|
2
|
+
# Keep track of "used" modules and their "available" methods
|
3
|
+
# Mixin for Config
|
4
|
+
module ConfigRegister
|
5
|
+
def available_methods
|
6
|
+
modules.each_with_object(Hash.new(Null.instance_method(:default_method))) do |mod, result|
|
7
|
+
mod.instance_methods.each do |method_name|
|
8
|
+
result[method_name] = mod.instance_method method_name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_module(mod)
|
14
|
+
modules << mod
|
15
|
+
end
|
16
|
+
|
17
|
+
def modules
|
18
|
+
@modules ||= []
|
19
|
+
end
|
20
|
+
|
21
|
+
module Null
|
22
|
+
def default_method(*, &_block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/usable/mod_extender.rb
CHANGED
@@ -18,7 +18,9 @@ module Usable
|
|
18
18
|
# @description Directly include a module whose methods you want made available in +usables.available_methods+
|
19
19
|
# Gives the module a name when including so that it shows up properly in the list of ancestors
|
20
20
|
def call(target)
|
21
|
-
|
21
|
+
unwanted.each do |method_name|
|
22
|
+
copy.send :remove_method, method_name
|
23
|
+
end
|
22
24
|
if copy.name.nil?
|
23
25
|
const_name = "#{mod_name}Used"
|
24
26
|
target.send :remove_const, const_name if target.const_defined? const_name, false
|
@@ -28,25 +30,6 @@ module Usable
|
|
28
30
|
target.send options[:method], copy
|
29
31
|
end
|
30
32
|
|
31
|
-
# @note Destructive, as it changes @copy
|
32
|
-
def override
|
33
|
-
unwanted.each do |method_name|
|
34
|
-
copy.send :remove_method, method_name
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# @description Extends the target with the module's ClassMethod mod
|
39
|
-
def use_class_methods!(target)
|
40
|
-
return unless mod.const_defined? :ClassMethods
|
41
|
-
target.extend mod.const_get :ClassMethods
|
42
|
-
end
|
43
|
-
|
44
|
-
# @description Extends the target with the module's ClassMethod mod
|
45
|
-
def use_instance_methods!(target)
|
46
|
-
return unless mod.const_defined? :InstanceMethods
|
47
|
-
target.include mod.const_get :InstanceMethods
|
48
|
-
end
|
49
|
-
|
50
33
|
def mod_name
|
51
34
|
if name
|
52
35
|
name.split('::').last
|
data/lib/usable/version.rb
CHANGED
data/lib/usable.rb
CHANGED
@@ -61,15 +61,23 @@ module Usable
|
|
61
61
|
usables[scope_name] = scope
|
62
62
|
end
|
63
63
|
if mod.respond_to? :usables
|
64
|
-
mod.usables
|
65
|
-
|
66
|
-
|
64
|
+
scope += mod.usables
|
65
|
+
self.usables += mod.usables
|
66
|
+
end
|
67
|
+
# any left over -options- are considered "config" settings
|
68
|
+
if options
|
69
|
+
[scope, usables].each { |x| options.each { |k, v| x[k] = v } }
|
70
|
+
end
|
71
|
+
if block_given?
|
72
|
+
[scope, usables].each { |x| x.instance_eval &block }
|
73
|
+
end
|
74
|
+
if mod.const_defined?(:InstanceMethods)
|
75
|
+
send :include, mod.const_get(:InstanceMethods)
|
76
|
+
end
|
77
|
+
if mod.const_defined?(:ClassMethods)
|
78
|
+
send :extend, mod.const_get(:ClassMethods)
|
67
79
|
end
|
68
|
-
[scope, usables].each { |x| options.each { |k, v| x[k] = v } }
|
69
|
-
[scope, usables].each { |x| x.instance_eval &block } if block_given?
|
70
80
|
ModExtender.new(mod, usable_options).call self
|
71
|
-
send :include, mod.const_get(:InstanceMethods) if mod.const_defined?(:InstanceMethods)
|
72
|
-
send :extend, mod.const_get(:ClassMethods) if mod.const_defined?(:ClassMethods)
|
73
81
|
self
|
74
82
|
end
|
75
83
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Buckley
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- ".ruby-gemset"
|
71
71
|
- ".ruby-version"
|
72
72
|
- ".travis.yml"
|
73
|
+
- CHANGELOG.md
|
73
74
|
- Gemfile
|
74
75
|
- LICENSE.txt
|
75
76
|
- README.md
|
@@ -78,6 +79,8 @@ files:
|
|
78
79
|
- bin/setup
|
79
80
|
- lib/usable.rb
|
80
81
|
- lib/usable/config.rb
|
82
|
+
- lib/usable/config_multi.rb
|
83
|
+
- lib/usable/config_register.rb
|
81
84
|
- lib/usable/mod_extender.rb
|
82
85
|
- lib/usable/version.rb
|
83
86
|
- usable.gemspec
|