callable 0.0.1

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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1ef39ede893ce0a86d29f34da19b77b7b2850090
4
+ data.tar.gz: d05ad76db5f5914b825e8c23f2a4b6453c598c33
5
+ SHA512:
6
+ metadata.gz: 00df6afe990ba3facb4d54ac73fb9ee4057086db2546afaba496eec83181ef7147e89b84a9691873357fab4f30adaa6a18ee3db371353618017879be35d0bde6
7
+ data.tar.gz: 7ed99cd5b51200dbce8bd34192272af15bf7c7b9c627eb661f6647f6d8145a48ba31a6516c11e89bc3d1fb475a230a1517faeae890df41bf875a3be455c4f139
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+ gemspec
3
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Federico Iachetti
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,180 @@
1
+ # Callable
2
+
3
+ Create callable objects on the fly.
4
+
5
+ It's easy to create a calable object in Ruby (understandong callable
6
+ as an object that supports the call method), you just wrap it in a
7
+ lambda and that's it.
8
+
9
+ Although this approach is correct, it lucks some expresiveness. Wouldn't it
10
+ be better to just say:
11
+
12
+ ```ruby
13
+ Callable( :i_wasnt_callable_but_i_am_now )
14
+ ```
15
+
16
+ This line of code tells you exacly what it's doing.
17
+
18
+ This gem allows you to do exactly that (see Usage)
19
+
20
+
21
+ ## Usage
22
+
23
+ If you need to return a callable object for some reason, you can do it
24
+ in one of two ways (don't forget to install the gem first).
25
+
26
+ The first way is by invoking the callable method:
27
+
28
+ ```ruby
29
+ c = Callable( :ret_val )
30
+ c.call
31
+ => ret_val
32
+ ```
33
+
34
+ Take into account that if you pass a callable object (such as a
35
+ lambda), you'll get it back as the return value:
36
+
37
+ ```ruby
38
+ c = Callable( ->{ :ret_val } )
39
+ c.call
40
+ => ret_val
41
+ ```
42
+
43
+ The second way to use it is invoking the #callable directly on the object you
44
+ want to be callable:
45
+
46
+ ```ruby
47
+ c = :ret_val.callable
48
+ c.call
49
+ => ret_val
50
+ ```
51
+
52
+ Like the example before, lambda, you'll get it back as the return value:
53
+
54
+ ```ruby
55
+ c = ->{ :ret_val }.callable
56
+ c.call
57
+ => ret_val
58
+ ```
59
+
60
+ The gem also ships with a #callable? method thar returns true if the
61
+ object is callable and false if it's not.
62
+
63
+ ```ruby
64
+ :not_callable.callable?
65
+ => false
66
+ ->{ :not_callable }.callable?
67
+ => true
68
+ ```
69
+
70
+ This is the same as saying
71
+
72
+ ```ruby
73
+ xxx.respond_to? :call
74
+ ```
75
+
76
+ But I felt it would be more illustrative of it's purpose.
77
+
78
+ ## Where to use it?
79
+
80
+ Let me say where to use this gem (with a very
81
+ trivial example).
82
+
83
+ Imagine we have some class that admits an informer object that
84
+ responds to the get_info method and returns a some information on a
85
+ String.
86
+
87
+ ```ruby
88
+ class SomeClass
89
+ attr_writer :informer
90
+ def info
91
+ @informer.get_info
92
+ end
93
+ end
94
+ ```
95
+
96
+ If we want to use this "informer" object, we must define a new class
97
+ or module that responds to the "get_info" method.
98
+
99
+ When we have a case like this, is a common practice to name that
100
+ method "call", instead of "get_info", because we now can toss a simple
101
+ lambda to substitute it. We can rewrite the code above like this:
102
+
103
+ ```ruby
104
+ class SomeClass
105
+ attr_writer :informer
106
+ def info
107
+ @informer.call
108
+ end
109
+ end
110
+ ```
111
+
112
+ And now we can define a class or module that responds to the call
113
+ method. In that call method, we can get as fancy as we want:
114
+
115
+ ```ruby
116
+ module Informer
117
+ def call
118
+ # retrieve the information we need from wherever we want
119
+ # maybe a web service
120
+ # maybe a local file
121
+ end
122
+ end
123
+ ```
124
+
125
+ So, when we do:
126
+
127
+ ```ruby
128
+ something = SomeClass.new
129
+ something.informer = Informer
130
+ something.info
131
+ ```
132
+
133
+ We trigger some weird and complex logic.
134
+
135
+ But when we test our code (or in some special case), we need that
136
+ logic to be as simple (an decoupled) as it can get.
137
+
138
+ Say we now want info to return just a fixed string saying "No info
139
+ available". With a lambda is fairly easy to do it
140
+
141
+ ```ruby
142
+ something = SomeClass.new
143
+ something.informer = ->{ "No info available" }
144
+ something.info
145
+ ```
146
+
147
+ Here is where the Callable gem comes in handy, we could say the same
148
+ thing like this:
149
+
150
+ ```ruby
151
+ something = SomeClass.new
152
+ something.informer = Callable "No info available"
153
+ something.info
154
+ ```
155
+
156
+ And now is much more expressive.
157
+
158
+ ## Installation
159
+
160
+ Add this line to your application's Gemfile:
161
+
162
+ ```ruby
163
+ gem 'callable'
164
+ ```
165
+
166
+ And then execute:
167
+
168
+ $ bundle
169
+
170
+ Or install it yourself as:
171
+
172
+ $ gem install callable
173
+
174
+ ## Contributing
175
+
176
+ 1. Fork it ( https://github.com/[my-github-username]/callable/fork )
177
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
178
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
179
+ 4. Push to the branch (`git push origin my-new-feature`)
180
+ 5. Create a new Pull Request
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "matest/spec_tasks"
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'callable/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "callable"
8
+ spec.version = Callable::VERSION
9
+ spec.authors = ["Federico Iachetti"]
10
+ spec.email = ["iachetti.federico@gmail.com"]
11
+ spec.summary = %q{It allows you to define callable objects.}
12
+ spec.description = %q{It makes available the callable, Callable and callable? methods that allows you to make callable objects and know if an object can be called.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "matest", "~> 1.5"
24
+ end
@@ -0,0 +1,5 @@
1
+ require "callable/version"
2
+
3
+ module Callable
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,3 @@
1
+ module Callable
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: callable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Federico Iachetti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: matest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ description: It makes available the callable, Callable and callable? methods that
56
+ allows you to make callable objects and know if an object can be called.
57
+ email:
58
+ - iachetti.federico@gmail.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - callable.gemspec
69
+ - lib/callable.rb
70
+ - lib/callable/version.rb
71
+ homepage: ''
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.4.5
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: It allows you to define callable objects.
95
+ test_files: []