its-it 1.0.1 → 1.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.
- data/README.rdoc +69 -6
- data/its-it.gemspec +10 -8
- data/lib/its-it/it.rb +5 -1
- data/lib/its-it/version.rb +1 -1
- data/spec/it_spec.rb +19 -0
- metadata +15 -11
data/README.rdoc
CHANGED
@@ -2,7 +2,14 @@
|
|
2
2
|
|
3
3
|
== Overview
|
4
4
|
|
5
|
-
This gem defines kernel methods <code>its</code> and <code>it</code> that
|
5
|
+
This gem defines kernel methods <code>its</code> and <code>it</code> that
|
6
|
+
queue and defer method calls. This is handy for list enumeration and case
|
7
|
+
statements.
|
8
|
+
|
9
|
+
== List Enumeration
|
10
|
+
|
11
|
+
<code>its</code> and <code>it</code> extend the Symbol#to_proc idiom to
|
12
|
+
support chaining multiple methods.
|
6
13
|
|
7
14
|
The pure Ruby way to chain methods when enumerating a list would be:
|
8
15
|
|
@@ -16,11 +23,66 @@ And using <code>its</code>, this becomes becomes simpler still:
|
|
16
23
|
|
17
24
|
users.collect(&its.contact.last_name.capitalize)
|
18
25
|
|
26
|
+
Note that <code>its</code> captures arguments and blocks, allowing constructs like this,
|
27
|
+
which will select users whose names include any non-hyphenated word that's more than 10
|
28
|
+
letters long:
|
29
|
+
users.select(&its.name.split(/ /).reject{|word| word =~ /-/}.collect(&:length).max > 10)
|
30
|
+
|
19
31
|
<code>it</code> is an alias for <code>its</code>, to use with methods that
|
20
32
|
describe actions rather than posessives. For example:
|
21
33
|
|
22
34
|
items.collect(&it.to_s.capitalize)
|
23
35
|
|
36
|
+
== Case statements
|
37
|
+
|
38
|
+
<code>its</code> and <code>it</code> likewise extend Ruby's
|
39
|
+
<code>code</code> statement to support testing arbitrary methods,
|
40
|
+
minimizing the need to create temporary variables and use
|
41
|
+
<code>if-elsif</code> constructs.
|
42
|
+
|
43
|
+
In pure Ruby, doing comparisons on computed values would be done something
|
44
|
+
like this:
|
45
|
+
|
46
|
+
maxlen = arrays.collect(&size).max
|
47
|
+
if maxlen > 10000
|
48
|
+
"too big"
|
49
|
+
elsif maxlen < 10
|
50
|
+
"too small"
|
51
|
+
else
|
52
|
+
"okay"
|
53
|
+
end
|
54
|
+
|
55
|
+
But using <code>it</code> this becomes:
|
56
|
+
|
57
|
+
case arrays.collect(&size).max
|
58
|
+
when it > 1000
|
59
|
+
"too big"
|
60
|
+
when it < 10
|
61
|
+
"too small"
|
62
|
+
else
|
63
|
+
"okay"
|
64
|
+
end
|
65
|
+
|
66
|
+
Of course method chanining can be used here too:
|
67
|
+
|
68
|
+
case users.first
|
69
|
+
when its.name == "Gimme Cookie" then ...
|
70
|
+
when its.name.length > 10 then ...
|
71
|
+
else ...
|
72
|
+
end
|
73
|
+
|
74
|
+
== Under the hood
|
75
|
+
|
76
|
+
The <code>ItsIt::It</code> class starts from <code>BlankSlate</code>, and
|
77
|
+
uses <code>method_missing</code> to capture and queue up all methods and
|
78
|
+
their arguments, with the exception of <code>:to_proc</code> and <code>:===</code>
|
79
|
+
(and also excepting <code>:respond_to? :to_proc</code> and
|
80
|
+
<code>:respond_to? :===</code>).
|
81
|
+
|
82
|
+
<code>:to_proc</code> returns a proc that will evaluate the method queue on
|
83
|
+
a given argument. <code>:===</code> takes an argument and evaluates that
|
84
|
+
proc, returning the result.
|
85
|
+
|
24
86
|
== Installation
|
25
87
|
|
26
88
|
Install from http://rubygems.org via
|
@@ -37,8 +99,9 @@ Tested with <b>ruby 1.8.7</b> and <b>ruby 1.9.2</b>
|
|
37
99
|
|
38
100
|
== History
|
39
101
|
|
40
|
-
This gem is
|
41
|
-
methodphitamine[https://github.com/jicksta/methodphitamine] gem
|
42
|
-
be compatible with ruby 1.9.2 and gemspec, renamed its-it,
|
43
|
-
rubygems.org[http://rubygems.org]. Unlike
|
44
|
-
<code>its</code> and
|
102
|
+
This gem is orignally based on Jay Philips'
|
103
|
+
methodphitamine[https://github.com/jicksta/methodphitamine] gem. It has
|
104
|
+
been updated to be compatible with ruby 1.9.2 and gemspec, renamed its-it,
|
105
|
+
and installed on rubygems.org[http://rubygems.org]. Unlike
|
106
|
+
methodphitamine, this gem includes only <code>its</code> and
|
107
|
+
<code>it</code>, not the "maybe" monad.
|
data/its-it.gemspec
CHANGED
@@ -5,19 +5,21 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.name = 'its-it'
|
6
6
|
s.version = ItsIt::VERSION
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
|
-
s.date = "2011-04-
|
8
|
+
s.date = "2011-04-26"
|
9
9
|
s.authors = ['Ronen Barzel']
|
10
10
|
s.email = 'ronen@barzel.org'
|
11
11
|
s.homepage = 'http://github.com/ronen/its-it'
|
12
|
-
s.summary = %q{Defines its() and it() method-chain
|
12
|
+
s.summary = %q{Defines its() and it() method-chain proxies.}
|
13
13
|
s.description = %q{
|
14
|
-
This gem defines the Kernel method "it"
|
15
|
-
idiom to support chaining multiple methods.
|
16
|
-
items.collect(&it.to_s.capitalize).
|
17
|
-
|
18
|
-
|
14
|
+
This gem defines the Kernel method "it" that queue and defer method calls.
|
15
|
+
This extends the Symbol#to_proc idiom to support chaining multiple methods.
|
16
|
+
For example, items.collect(&it.to_s.capitalize). This also allows
|
17
|
+
conditionals in case statements, such as: case ... when it > 3 then [etc.].
|
18
|
+
The method is also aliased as "its", for methods that describe possessives
|
19
|
+
rather than actions, such as items.collect(&its.name.capitalize)
|
19
20
|
|
20
|
-
[This gem is
|
21
|
+
[This gem is an extension of Jay Philips' "methodphitamine" gem, updated
|
22
|
+
for ruby 1.9 and gemspec compatibility and adding the case statement functionality.]
|
21
23
|
}
|
22
24
|
s.extra_rdoc_files = [
|
23
25
|
"LICENSE.txt",
|
data/lib/its-it/it.rb
CHANGED
@@ -17,7 +17,7 @@ module ItsIt
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def method_missing(*args, &block)
|
20
|
-
@methods << [args, block] unless args ==
|
20
|
+
@methods << [args, block] unless args.first == :respond_to? and [:to_proc, :===].include?(args[1])
|
21
21
|
self
|
22
22
|
end
|
23
23
|
|
@@ -29,6 +29,10 @@ module ItsIt
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
def ===(obj)
|
33
|
+
to_proc.call(obj)
|
34
|
+
end
|
35
|
+
|
32
36
|
# Used for testing. This method is hidden but can be revealed using
|
33
37
|
# ItsIt::It.reveal(:method_queue)
|
34
38
|
def method_queue
|
data/lib/its-it/version.rb
CHANGED
data/spec/it_spec.rb
CHANGED
@@ -47,10 +47,29 @@ describe "An It instance" do
|
|
47
47
|
it "should respond to to_proc()" do
|
48
48
|
@it.should respond_to(:to_proc)
|
49
49
|
end
|
50
|
+
|
51
|
+
it "should respond to ===" do
|
52
|
+
@it.should respond_to(:===)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should work in a case statement" do
|
56
|
+
[0,1,2].each do |i|
|
57
|
+
case i
|
58
|
+
when it < 1 then i.should == 0
|
59
|
+
when it == 1 then i.should == 1
|
60
|
+
else i.should == 2
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
50
64
|
|
51
65
|
it "should not queue the method respond_to? when given :to_proc as an arg" do
|
52
66
|
@it.respond_to? :to_proc
|
53
67
|
@it.method_queue.should be_empty
|
54
68
|
end
|
69
|
+
|
70
|
+
it "should not queue the method respond_to? when given :=== as an arg" do
|
71
|
+
@it.respond_to? :to_proc
|
72
|
+
@it.method_queue.should be_empty
|
73
|
+
end
|
55
74
|
|
56
75
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: its-it
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.0
|
5
|
+
version: 1.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ronen Barzel
|
@@ -10,7 +10,8 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-26 00:00:00 -07:00
|
14
|
+
default_executable:
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: blankslate
|
@@ -79,12 +80,14 @@ dependencies:
|
|
79
80
|
prerelease: false
|
80
81
|
version_requirements: *id006
|
81
82
|
description: "\n\
|
82
|
-
This gem defines the Kernel method \"it\"
|
83
|
-
idiom to support chaining multiple methods
|
84
|
-
items.collect(&it.to_s.capitalize).
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
This gem defines the Kernel method \"it\" that queue and defer method calls.\n\
|
84
|
+
This extends the Symbol#to_proc idiom to support chaining multiple methods.\n\
|
85
|
+
For example, items.collect(&it.to_s.capitalize). This also allows\n\
|
86
|
+
conditionals in case statements, such as: case ... when it > 3 then [etc.].\n\
|
87
|
+
The method is also aliased as \"its\", for methods that describe possessives\n\
|
88
|
+
rather than actions, such as items.collect(&its.name.capitalize)\n\n\
|
89
|
+
[This gem is an extension of Jay Philips' \"methodphitamine\" gem, updated\n\
|
90
|
+
for ruby 1.9 and gemspec compatibility and adding the case statement functionality.]\n"
|
88
91
|
email: ronen@barzel.org
|
89
92
|
executables: []
|
90
93
|
|
@@ -109,6 +112,7 @@ files:
|
|
109
112
|
- spec/it_spec.rb
|
110
113
|
- spec/rspec_compatibility_spec.rb
|
111
114
|
- spec/spec_helper.rb
|
115
|
+
has_rdoc: true
|
112
116
|
homepage: http://github.com/ronen/its-it
|
113
117
|
licenses: []
|
114
118
|
|
@@ -122,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
126
|
requirements:
|
123
127
|
- - ">="
|
124
128
|
- !ruby/object:Gem::Version
|
125
|
-
hash:
|
129
|
+
hash: -664830529632804485
|
126
130
|
segments:
|
127
131
|
- 0
|
128
132
|
version: "0"
|
@@ -135,10 +139,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
139
|
requirements: []
|
136
140
|
|
137
141
|
rubyforge_project:
|
138
|
-
rubygems_version: 1.
|
142
|
+
rubygems_version: 1.6.2
|
139
143
|
signing_key:
|
140
144
|
specification_version: 3
|
141
|
-
summary: Defines its() and it() method-chain
|
145
|
+
summary: Defines its() and it() method-chain proxies.
|
142
146
|
test_files:
|
143
147
|
- spec/it_spec.rb
|
144
148
|
- spec/rspec_compatibility_spec.rb
|