usable 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5dd9e5a4f0ef7f2d80c5e58c0465af4215842155
4
- data.tar.gz: 26c44236196a65f58ee95aaf5609f54c6f90017e
3
+ metadata.gz: 4838af9eb7ede803ba0bb91bcdde9f4500db8bf9
4
+ data.tar.gz: 68fb23ea8a2e2ad941f420aca9f797d7cba37e4c
5
5
  SHA512:
6
- metadata.gz: c479a93b7bea7ec97fe3bcff61cf5d9ca19ea6f07082b78f0c28e017193be670dcdabb5b48c1d5664a8e320d530028bf0436e14ff22ce2e3d334cc2b309cd645
7
- data.tar.gz: c0c5ef4f78fa3c6713b0f23baa3b6d1cc7e11209d61c3cb1c2c5b36127d372f9283d3c34dd421fc544e64d494a2fdd5a9758fca7a95c5dc043228efb3c887fb4
6
+ metadata.gz: da020287fc46e438e2c1dfad79eb90ae4e9aca2b8dcfe0c01bc01d1be91f4f661b1d88237c4765cb487d2a316e0f74350eeb535e93ca107bb21a6539127be752
7
+ data.tar.gz: 6d68fcda221aec13e6933e90612c344ec7a410b4bdeac1e59b8498d916734e2a9e55acd310566e8a4c36c66725b0205719b6e21a0fb84f856b642ac9c41de2fd
File without changes
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
- # Usable
1
+ # Usable [![Gem Version](https://badge.fury.io/rb/usable.svg)](http://badge.fury.io/rb/usable)
2
2
 
3
- Rack style mixins for Ruby objects. Mount your modules like you mean it!
3
+ A simple way to mount and configure your modules. Usable gives you control over which methods are included, and the class
4
+ level config provides a safe interface for calling them.
4
5
 
5
6
  ```ruby
6
7
  module VersionKit
@@ -26,11 +27,11 @@ end
26
27
  => "custom_versions"
27
28
  >> Model.new.save_version
28
29
  => "Saving up to 10 versions to custom_versions"
29
- >> Model.usable_config.available_methods[:save_version].bind(self).call
30
+ >> Model.usable_config.available_methods[:save_version].bind(Model.new).call
30
31
  => "Saving up to 10 versions to custom_versions"
31
32
  >> Model.new.respond_to? :destroy_version
32
33
  => false
33
- >> Model.usable_config.available_methods[:destroy_version].bind(self).call
34
+ >> Model.usable_config.available_methods[:destroy_version].bind(Model.new).call
34
35
  => nil
35
36
  ```
36
37
  What's going on here? Well `#save_versions` is now extended onto the `Model` class, but `#destroy_version` is not!
@@ -40,9 +41,9 @@ What's going on here? Well `#save_versions` is now extended onto the `Model` cla
40
41
  Yes. Well ... yes, at least on the copy of the module included in the target class. But, checking if an object responds
41
42
  to a method all time doesn't produce very [confident code](http://www.confidentruby.com/). That's why it is encouraged
42
43
  to reference methods through the `Model.usable_config.available_methods` hash. This way you can confidently call methods,
43
- just don't rely on the return value! Methods that are removed via `:only` will return `nil`.
44
+ just don't rely on the return value, because methods that are removed via `:only` will return `nil`.
44
45
 
45
- ## Seperate included module from configurable methods
46
+ ## Separate included module from configurable methods
46
47
 
47
48
  Sometimes you want to define methods on the module but not have them be configurable. Define a module within the usable
48
49
  module namespace and name it `UsableSpec`, and `Usable` will use that module to configure the available methods. Any naming
data/lib/usable.rb CHANGED
@@ -26,16 +26,24 @@ module Usable
26
26
  # @note Hides methods
27
27
  # @note We include the primary mod when there is a UsableSpec set because any instance method defined on the mod are not
28
28
  # configurable and should therefore takes precedence over those defined in the UsableSpec
29
+ # @return [ModExtender] containing the original and modified module
29
30
  def usable(mod, options = {})
30
31
  options.each { |k, v| usable_config.public_send "#{k}=", v }
31
32
  yield usable_config if block_given?
32
33
  mod_ext = ModExtender.new mod, usable_config
33
- usable! mod_ext.call
34
+ usable! mod_ext
34
35
  usable! mod if mod_ext.has_spec?
36
+ mod_ext
35
37
  end
36
38
 
37
39
  # @description Directly include a module whose methods you want made available in +usable_config.available_methods+
40
+ # Gives the module a name when including so that it shows up properly in the list of ancestors
38
41
  def usable!(mod)
42
+ mod_name = mod.name.nil? ? "UsableMod#{Time.now.strftime('%s')}" : mod.name.split('::').last
43
+ const_name = "#{mod_name}Used"
44
+ mod = mod.call if mod.respond_to? :call
45
+ remove_const const_name if const_defined? const_name
46
+ const_set const_name, mod
39
47
  usable_config.modules << mod
40
48
  send :include, mod
41
49
  end
data/lib/usable/config.rb CHANGED
@@ -4,6 +4,10 @@ module Usable
4
4
  @modules ||= []
5
5
  end
6
6
 
7
+ def add_module(mod)
8
+ modules << mod
9
+ end
10
+
7
11
  def available_methods
8
12
  modules.each_with_object(Hash.new(default_method)) do |mod, result|
9
13
  mod.instance_methods.each do |method_name|
@@ -13,11 +17,11 @@ module Usable
13
17
  end
14
18
 
15
19
  def default_method
16
- Null.instance_method(:null)
20
+ Null.instance_method(:default_method)
17
21
  end
18
22
 
19
23
  module Null
20
- def null(*, &block)
24
+ def default_method(*, &block)
21
25
  end
22
26
  end
23
27
  end
@@ -1,9 +1,11 @@
1
1
  module Usable
2
2
  class ModExtender
3
+ attr_reader :name
3
4
  attr_accessor :copy, :mod, :config
4
5
 
5
6
  def initialize(mod, config = OpenStruct.new)
6
7
  @mod = mod
8
+ @name = mod.name
7
9
  @copy = has_spec? ? mod.const_get(:UsableSpec).dup : mod.dup
8
10
  @config = config
9
11
  end
data/lib/usable/scoped.rb CHANGED
@@ -14,7 +14,7 @@ module Usable
14
14
  end
15
15
 
16
16
  def usable(mod, options = {})
17
- send :include, mod unless self < mod
17
+ send :include, mod
18
18
  if block_given?
19
19
  yield configs[mod]
20
20
  else
@@ -1,3 +1,3 @@
1
1
  module Usable
2
- VERSION = "1.0.0".freeze
2
+ VERSION = "1.1.0".freeze
3
3
  end
data/usable.gemspec CHANGED
@@ -9,9 +9,10 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Ryan Buckley"]
10
10
  spec.email = ["arebuckley@gmail.com"]
11
11
 
12
- spec.summary = %q{Rack style mixins}
13
- spec.description = %q{Rack style mixins which provide a convention for passing options to your modules.}
12
+ spec.summary = %q{Mounts and configures modules}
13
+ spec.description = %q{A simple way to mount and configure your modules. Usable gives you control over which methods are included.}
14
14
  spec.homepage = "https://github.com/ridiculous/usable"
15
+ spec.license = "MIT"
15
16
 
16
17
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
18
  spec.bindir = "exe"
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: 1.0.0
4
+ version: 1.1.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-03 00:00:00.000000000 Z
11
+ date: 2016-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -78,8 +78,8 @@ dependencies:
78
78
  - - "<"
79
79
  - !ruby/object:Gem::Version
80
80
  version: '2'
81
- description: Rack style mixins which provide a convention for passing options to your
82
- modules.
81
+ description: A simple way to mount and configure your modules. Usable gives you control
82
+ over which methods are included.
83
83
  email:
84
84
  - arebuckley@gmail.com
85
85
  executables: []
@@ -91,7 +91,7 @@ files:
91
91
  - ".ruby-version"
92
92
  - ".travis.yml"
93
93
  - Gemfile
94
- - LICENSE.md
94
+ - LICENSE.txt
95
95
  - README.md
96
96
  - Rakefile
97
97
  - bin/console
@@ -103,7 +103,8 @@ files:
103
103
  - lib/usable/version.rb
104
104
  - usable.gemspec
105
105
  homepage: https://github.com/ridiculous/usable
106
- licenses: []
106
+ licenses:
107
+ - MIT
107
108
  metadata: {}
108
109
  post_install_message:
109
110
  rdoc_options: []
@@ -124,5 +125,5 @@ rubyforge_project:
124
125
  rubygems_version: 2.5.1
125
126
  signing_key:
126
127
  specification_version: 4
127
- summary: Rack style mixins
128
+ summary: Mounts and configures modules
128
129
  test_files: []