usable 0.2.0 → 0.3.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/.gitignore +2 -1
- data/Gemfile +3 -0
- data/lib/usable/config.rb +15 -0
- data/lib/usable/mod_extender.rb +28 -0
- data/lib/usable/version.rb +1 -1
- data/lib/usable.rb +29 -48
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 012d85e8c84454e2b546f05763299d4157d768ac
|
4
|
+
data.tar.gz: 44c5faec64db7d6dcc843c97dbf04601b6900039
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5b18af041a6be1df266076067657767c6dcdbb050c0a71e08cfcc348077966d0a86ffd6607d42ab6cab85e526b7fa1f23f65bc99925c49242f8d9031f39ae7d
|
7
|
+
data.tar.gz: 4297b9a8d18efe624a92a8a03859930f37a937a812f9cb2f662df7260c3036f385206431c28e322a753eb6dee34a26730beebe1ff7725d902937405267929218
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Usable
|
2
|
+
class Config < OpenStruct
|
3
|
+
def modules
|
4
|
+
@modules ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def available_methods
|
8
|
+
modules.each_with_object({}) do |mod, result|
|
9
|
+
mod.instance_methods.each do |method_name|
|
10
|
+
result[method_name] = mod.instance_method method_name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Usable
|
2
|
+
class ModExtender
|
3
|
+
attr_accessor :copy, :mod, :config
|
4
|
+
|
5
|
+
def initialize(mod, config = OpenStruct.new)
|
6
|
+
@mod = mod
|
7
|
+
@copy = has_spec? ? mod.const_get(:Spec).dup : mod.dup
|
8
|
+
@config = config
|
9
|
+
end
|
10
|
+
|
11
|
+
def call
|
12
|
+
copy.prepend override
|
13
|
+
end
|
14
|
+
|
15
|
+
def override
|
16
|
+
unwanted = config.only ? copy.instance_methods - Array(config.only) : []
|
17
|
+
Module.new do
|
18
|
+
unwanted.each do |method_name|
|
19
|
+
define_method(method_name) { |*| }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def has_spec?
|
25
|
+
mod.const_defined?(:Spec)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/usable/version.rb
CHANGED
data/lib/usable.rb
CHANGED
@@ -1,61 +1,42 @@
|
|
1
1
|
require "ostruct"
|
2
|
+
require "delegate"
|
2
3
|
require "usable/version"
|
3
4
|
|
4
5
|
module Usable
|
6
|
+
|
7
|
+
autoload :ModExtender, 'usable/mod_extender'
|
8
|
+
autoload :Config, 'usable/config'
|
9
|
+
|
5
10
|
def usable_config
|
6
11
|
@usable_config ||= Config.new
|
7
12
|
end
|
8
|
-
|
9
|
-
|
10
|
-
|
13
|
+
attr_writer :usable_config
|
14
|
+
|
15
|
+
# @description Configures the +available_methods+ of a module using the given options or block and then includes it on
|
16
|
+
# the target class. Checks if there is a module named Spec within the given mods namespace and uses the instance of
|
17
|
+
# methods of that as the +available_methods+
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
#
|
21
|
+
# class Example
|
22
|
+
# extend Usable
|
23
|
+
# usable VersionKit, only: :save_version
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# @note Hides methods
|
27
|
+
# @note We include the primary mod when there is a Spec set because any instance method defined on the mod are not
|
28
|
+
# configurable and should therefore takes precedence over those defined in the Spec
|
11
29
|
def usable(mod, options = {})
|
12
30
|
options.each { |k, v| usable_config.public_send "#{k}=", v }
|
13
|
-
if block_given?
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
wrapped_mod.prepend build_null_mod(wrapped_mod)
|
18
|
-
usable_config.modules[mod] = wrapped_mod
|
19
|
-
if has_spec?(mod)
|
20
|
-
send :include, mod
|
21
|
-
else
|
22
|
-
send :include, usable_config.modules[mod]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# @description Stub out any "unwanted" methods
|
27
|
-
def build_null_mod(mod)
|
28
|
-
unwanted = usable_config.only ? mod.instance_methods - Array(usable_config.only) : []
|
29
|
-
Module.new do
|
30
|
-
unwanted.each do |method_name|
|
31
|
-
define_method(method_name) { |*| }
|
32
|
-
end
|
33
|
-
end
|
31
|
+
yield usable_config if block_given?
|
32
|
+
mod_ext = ModExtender.new mod, usable_config
|
33
|
+
usable! mod_ext.call
|
34
|
+
usable! mod if mod_ext.has_spec?
|
34
35
|
end
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def spec(mod)
|
41
|
-
if has_spec?(mod)
|
42
|
-
mod.const_get(:Spec)
|
43
|
-
else
|
44
|
-
mod
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class Config < OpenStruct
|
49
|
-
def available_methods
|
50
|
-
modules.each_with_object({}) do |(_, mod_copy), result|
|
51
|
-
mod_copy.instance_methods.each do |method_name|
|
52
|
-
result[method_name] = mod_copy.instance_method method_name
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def modules
|
58
|
-
@modules ||= {}
|
59
|
-
end
|
37
|
+
# @description Directly include a module whose methods you want made available in +usable_config.available_methods+
|
38
|
+
def usable!(mod)
|
39
|
+
usable_config.modules << mod
|
40
|
+
send :include, mod
|
60
41
|
end
|
61
42
|
end
|
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: 0.
|
4
|
+
version: 0.3.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-02-
|
11
|
+
date: 2016-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -97,6 +97,8 @@ files:
|
|
97
97
|
- bin/console
|
98
98
|
- bin/setup
|
99
99
|
- lib/usable.rb
|
100
|
+
- lib/usable/config.rb
|
101
|
+
- lib/usable/mod_extender.rb
|
100
102
|
- lib/usable/scoped.rb
|
101
103
|
- lib/usable/version.rb
|
102
104
|
- usable.gemspec
|