b001e 0.0.0a
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +21 -0
- data/README.rst +136 -0
- data/Rakefile.rb +12 -0
- data/b001e.gemspec +61 -0
- data/lib/b001e.rb +12 -0
- data/lib/b001e/extensions/core/false_class_extensions.rb +23 -0
- data/lib/b001e/extensions/core/nil_class_extensions.rb +23 -0
- data/lib/b001e/extensions/core/object_extensions.rb +23 -0
- data/lib/b001e/extensions/core/true_class_extensions.rb +23 -0
- data/lib/b001e/falsiness.rb +38 -0
- data/lib/b001e/truthiness.rb +38 -0
- data/spec/LICENSE.txt +26 -0
- data/spec/and_spec.rb +41 -0
- data/spec/b001e_suite.rb +12 -0
- data/spec/if_spec.rb +94 -0
- data/spec/not_spec.rb +27 -0
- data/spec/or_spec.rb +31 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/unless_spec.rb +31 -0
- data/tasks/_default_task.rb +9 -0
- data/tasks/gem_task.rb +20 -0
- data/tasks/spec_task.rb +12 -0
- metadata +92 -0
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.rst
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
=======
|
2
|
+
B001e
|
3
|
+
=======
|
4
|
+
---------------------------------------------------------------------------
|
5
|
+
A message-sending based re-implementation of Boolean operators in pure Ruby
|
6
|
+
---------------------------------------------------------------------------
|
7
|
+
|
8
|
+
.. admonition:: Abstract
|
9
|
+
|
10
|
+
B001e_ is a message-sending based re-implementation of the
|
11
|
+
Boolean operators ``and``, ``or`` and ``not`` and the Boolean
|
12
|
+
expressions ``if`` and ``unless`` in pure Ruby.
|
13
|
+
Lazy Evaluation / Short-circuiting is achieved through the use
|
14
|
+
of blocks and lambda expressions.
|
15
|
+
|
16
|
+
.. _B001e: https://JoergWMittag.GitHub.Com/b001e/
|
17
|
+
|
18
|
+
.. contents::
|
19
|
+
|
20
|
+
What
|
21
|
+
====
|
22
|
+
|
23
|
+
This library contains sample re-implementations of the Boolean
|
24
|
+
operators ``and``, ``or`` and ``not`` and the Boolean expressions
|
25
|
+
``if`` and ``unless``, in pure Ruby. The style is heavily
|
26
|
+
inspired by Smalltalk_ and its relatives: the operators become
|
27
|
+
messages that take block parameters and are sent to the
|
28
|
+
conditionals.
|
29
|
+
|
30
|
+
Operator / keyword style::
|
31
|
+
|
32
|
+
if c1 && c2
|
33
|
+
t
|
34
|
+
elsif c3
|
35
|
+
ei
|
36
|
+
else
|
37
|
+
e
|
38
|
+
end
|
39
|
+
|
40
|
+
becomes::
|
41
|
+
|
42
|
+
c1.and { c2 }.ifelse ->() { t }, ->() { c3.ifelse ->() { ei }, ->() { e } }
|
43
|
+
|
44
|
+
.. _Smalltalk: http://Smalltalk.Org/
|
45
|
+
|
46
|
+
Why
|
47
|
+
===
|
48
|
+
|
49
|
+
Every so often, there is a discussion on either the Ruby-Talk_ or
|
50
|
+
Ruby-Core_ mailinglists, whether the number of operators that are
|
51
|
+
not backed by methods should be reduced. In Ruby 1.9, ``!`` and
|
52
|
+
``!=`` have already become methods, but ``and`` and ``or`` are
|
53
|
+
still builtin operators and ``if`` and ``unless`` still builtin
|
54
|
+
keywords.
|
55
|
+
|
56
|
+
One argument that is sometimes brought up is that because of the
|
57
|
+
short-circuiting nature of those operators, implementing them as
|
58
|
+
methods is impossible or at least hard. I just wanted to see
|
59
|
+
*how* hard it really is!
|
60
|
+
|
61
|
+
.. _Ruby-Talk: http://Ruby-Forum.Com/forum/4/
|
62
|
+
.. _Ruby-Core: http://Ruby-Forum.Com/forum/14/
|
63
|
+
|
64
|
+
How
|
65
|
+
===
|
66
|
+
|
67
|
+
All the operators become methods. The logic is achieved through
|
68
|
+
polymorphism: basically, ``NilClass`` and ``FalseClass`` get one
|
69
|
+
set of implementations, ``Object`` gets the opposite set.
|
70
|
+
|
71
|
+
Lazy Evaluation is achieved with blocks: if a block is not
|
72
|
+
supposed to be evaluated, it is simply never ``yield``\ ed to.
|
73
|
+
|
74
|
+
Where
|
75
|
+
=====
|
76
|
+
|
77
|
+
At `GitHub <https://GitHub.Com/JoergWMittag/B001e/>`_, of course!
|
78
|
+
|
79
|
+
Installation
|
80
|
+
============
|
81
|
+
|
82
|
+
::
|
83
|
+
|
84
|
+
gem install JoergWMittag-b001e
|
85
|
+
|
86
|
+
Usage
|
87
|
+
=====
|
88
|
+
|
89
|
+
::
|
90
|
+
|
91
|
+
begin require 'rubygems'; rescue LoadError
|
92
|
+
else begin gem 'JoergWMittag-b001e', '~> 0.0.3'; rescue Gem::LoadError; end end
|
93
|
+
require 'b001e'
|
94
|
+
|
95
|
+
true.and { nil.or { 42 } }.if { puts "It's true!" }
|
96
|
+
# Equivalent to: if true && (nil || 42) then puts "It's true!" end
|
97
|
+
|
98
|
+
false.ifelse ->() { puts "You'll never see this." }, ->() { puts 'But this!' }
|
99
|
+
# Equivalent to: if false then puts "You'll never see this." else puts 'But this!' end
|
100
|
+
|
101
|
+
Acknowledgements
|
102
|
+
================
|
103
|
+
|
104
|
+
Style
|
105
|
+
-----
|
106
|
+
|
107
|
+
The API style is heavily influenced by Smalltalk_.
|
108
|
+
|
109
|
+
Implementation
|
110
|
+
--------------
|
111
|
+
|
112
|
+
The implementation is literally textbook: every introductory CS
|
113
|
+
text should have it.
|
114
|
+
|
115
|
+
Specs
|
116
|
+
-----
|
117
|
+
|
118
|
+
The Specs were directly lifted from the RubySpec_ project.
|
119
|
+
|
120
|
+
.. _RubySpec: http://RubySpec.Org/
|
121
|
+
|
122
|
+
License
|
123
|
+
=======
|
124
|
+
|
125
|
+
My original work is licensed under the `MIT X11 License`_.
|
126
|
+
|
127
|
+
.. include:: LICENSE.txt
|
128
|
+
:literal:
|
129
|
+
|
130
|
+
The `RubySpec license`_ is also MIT X11.
|
131
|
+
|
132
|
+
.. include:: spec/LICENSE.txt
|
133
|
+
:literal:
|
134
|
+
|
135
|
+
.. _MIT X11 License: https://GitHub.Com/JoergWMittag/B001e/tree/master/LICENSE.txt
|
136
|
+
.. _RubySpec license: https://GitHub.Com/RubySpec/RubySpec/tree/master/LICENSE
|
data/Rakefile.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
5
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
6
|
+
|
7
|
+
require 'rake'
|
8
|
+
|
9
|
+
taskdir = File.expand_path File.join(File.dirname(__FILE__), 'tasks')
|
10
|
+
$LOAD_PATH.unshift taskdir unless $LOAD_PATH.include? taskdir
|
11
|
+
|
12
|
+
FileList[File.join taskdir, '**', '*_task.rb'].each { |raketask| load raketask }
|
data/b001e.gemspec
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
5
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
6
|
+
|
7
|
+
filelist = %w[
|
8
|
+
b001e.gemspec
|
9
|
+
lib/b001e/extensions/core/false_class_extensions.rb
|
10
|
+
lib/b001e/extensions/core/nil_class_extensions.rb
|
11
|
+
lib/b001e/extensions/core/object_extensions.rb
|
12
|
+
lib/b001e/extensions/core/true_class_extensions.rb
|
13
|
+
lib/b001e/falsiness.rb
|
14
|
+
lib/b001e/truthiness.rb
|
15
|
+
lib/b001e.rb
|
16
|
+
LICENSE.txt
|
17
|
+
Rakefile.rb
|
18
|
+
README.rst
|
19
|
+
spec/and_spec.rb
|
20
|
+
spec/b001e_suite.rb
|
21
|
+
spec/if_spec.rb
|
22
|
+
spec/LICENSE.txt
|
23
|
+
spec/not_spec.rb
|
24
|
+
spec/or_spec.rb
|
25
|
+
spec/spec_helper.rb
|
26
|
+
spec/unless_spec.rb
|
27
|
+
tasks/gem_task.rb
|
28
|
+
tasks/spec_task.rb
|
29
|
+
tasks/_default_task.rb
|
30
|
+
]
|
31
|
+
|
32
|
+
speclist = filelist.grep /^spec/
|
33
|
+
|
34
|
+
$spec = Gem::Specification.new do |s|
|
35
|
+
s.name = 'b001e'
|
36
|
+
s.summary = 'Message-sending based re-implementation of the Boolean operators.'
|
37
|
+
s.version = Gem::Version.new '0.0.0a'
|
38
|
+
s.author = 'Jörg W Mittag'
|
39
|
+
s.email = 'JoergWMittag+B001e@GoogleMail.Com'
|
40
|
+
s.homepage = 'http://JoergWMittag.GitHub.Com/b001e/'
|
41
|
+
s.rubyforge_project = 'b001e'
|
42
|
+
s.license = 'MIT X11'
|
43
|
+
s.required_ruby_version = '~> 1.9.1'
|
44
|
+
s.required_rubygems_version = '~> 1.3.5'
|
45
|
+
s.has_rdoc = true
|
46
|
+
s.rdoc_options = %w[--all --charset=UTF-8 --line-numbers --webcvs=https://GitHub.Com/JoergWMittag/B001e/blob/master/%s]
|
47
|
+
s.extra_rdoc_files = %w[LICENSE.txt README.rst]
|
48
|
+
s.files = filelist
|
49
|
+
s.test_files = speclist
|
50
|
+
s.description = <<-'HERE'
|
51
|
+
B001e is a message-sending based re-implementation of the
|
52
|
+
Boolean operators 'if', 'unless', 'and', 'or' and 'not' in
|
53
|
+
pure Ruby. Lazy Evaluation / Short-circuiting is achieved
|
54
|
+
through the use of blocks and lambda expressions.
|
55
|
+
HERE
|
56
|
+
end
|
57
|
+
|
58
|
+
if __FILE__ == $0
|
59
|
+
Gem::manage_gems
|
60
|
+
Gem::Builder.new($spec).build
|
61
|
+
end
|
data/lib/b001e.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
libdir = File.expand_path(File.dirname __FILE__).gsub(/(.*lib).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
8
|
+
|
9
|
+
require 'b001e/extensions/core/object_extensions'
|
10
|
+
require 'b001e/extensions/core/true_class_extensions'
|
11
|
+
require 'b001e/extensions/core/false_class_extensions'
|
12
|
+
require 'b001e/extensions/core/nil_class_extensions'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
libdir = File.expand_path(File.dirname __FILE__).gsub(/(.*lib).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
8
|
+
|
9
|
+
require 'b001e/falsiness'
|
10
|
+
|
11
|
+
module B001e
|
12
|
+
module Extensions
|
13
|
+
module Core
|
14
|
+
module FalseClassExtensions
|
15
|
+
include B001e::Falsiness
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class FalseClass
|
22
|
+
include B001e::Extensions::Core::FalseClassExtensions
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
libdir = File.expand_path(File.dirname __FILE__).gsub(/(.*lib).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
8
|
+
|
9
|
+
require 'b001e/falsiness'
|
10
|
+
|
11
|
+
module B001e
|
12
|
+
module Extensions
|
13
|
+
module Core
|
14
|
+
module NilClassExtensions
|
15
|
+
include B001e::Falsiness
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class NilClass
|
22
|
+
include B001e::Extensions::Core::NilClassExtensions
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
libdir = File.expand_path(File.dirname __FILE__).gsub(/(.*lib).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
8
|
+
|
9
|
+
require 'b001e/truthiness'
|
10
|
+
|
11
|
+
module B001e
|
12
|
+
module Extensions
|
13
|
+
module Core
|
14
|
+
module ObjectExtensions
|
15
|
+
include B001e::Truthiness
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Object
|
22
|
+
include B001e::Extensions::Core::ObjectExtensions
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
libdir = File.expand_path(File.dirname __FILE__).gsub(/(.*lib).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
8
|
+
|
9
|
+
require 'b001e/truthiness'
|
10
|
+
|
11
|
+
module B001e
|
12
|
+
module Extensions
|
13
|
+
module Core
|
14
|
+
module TrueClassExtensions
|
15
|
+
include B001e::Truthiness
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class TrueClass
|
22
|
+
include B001e::Extensions::Core::TrueClassExtensions
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
libdir = File.expand_path(File.dirname __FILE__).gsub(/(.*lib).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
8
|
+
|
9
|
+
module B001e
|
10
|
+
module Falsiness
|
11
|
+
def if
|
12
|
+
end
|
13
|
+
|
14
|
+
def ifelse _ = nil, else_branch = ->() {}
|
15
|
+
else_branch.call
|
16
|
+
end
|
17
|
+
|
18
|
+
def unless
|
19
|
+
yield
|
20
|
+
end
|
21
|
+
|
22
|
+
def unlesselse unless_branch = ->() {}, _ = nil
|
23
|
+
ifelse _, unless_branch
|
24
|
+
end
|
25
|
+
|
26
|
+
def and
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def or
|
31
|
+
yield
|
32
|
+
end
|
33
|
+
|
34
|
+
def not
|
35
|
+
true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
libdir = File.expand_path(File.dirname __FILE__).gsub(/(.*lib).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
8
|
+
|
9
|
+
module B001e
|
10
|
+
module Truthiness
|
11
|
+
def if
|
12
|
+
yield
|
13
|
+
end
|
14
|
+
|
15
|
+
def ifelse then_branch = ->() {}, _ = nil
|
16
|
+
then_branch.call
|
17
|
+
end
|
18
|
+
|
19
|
+
def unless
|
20
|
+
end
|
21
|
+
|
22
|
+
def unlesselse _ = nil, else_branch = ->() {}
|
23
|
+
ifelse else_branch, _
|
24
|
+
end
|
25
|
+
|
26
|
+
def and
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
|
30
|
+
def or
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def not
|
35
|
+
false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/spec/LICENSE.txt
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
The specs were originally ported and heavily modified from the
|
2
|
+
RubySpec project <http://RubySpec.Org/>. This is the original
|
3
|
+
license:
|
4
|
+
|
5
|
+
Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person
|
8
|
+
obtaining a copy of this software and associated documentation
|
9
|
+
files (the "Software"), to deal in the Software without
|
10
|
+
restriction, including without limitation the rights to use,
|
11
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
+
copies of the Software, and to permit persons to whom the
|
13
|
+
Software is furnished to do so, subject to the following
|
14
|
+
conditions:
|
15
|
+
|
16
|
+
The above copyright notice and this permission notice shall be
|
17
|
+
included in all copies or substantial portions of the Software.
|
18
|
+
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
20
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
21
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
22
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
23
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
24
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
25
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
26
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/spec/and_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
|
5
|
+
#This code was directly ported from <https://GitHub.Com/RubySpec/RubySpec/tree/master/language/and_spec.rb>
|
6
|
+
|
7
|
+
require File.expand_path File.join(File.dirname(__FILE__), 'spec_helper')
|
8
|
+
|
9
|
+
require 'b001e'
|
10
|
+
|
11
|
+
describe "The 'and' operator" do
|
12
|
+
it 'short-circuits evaluation at the first condition to be false' do
|
13
|
+
x = nil
|
14
|
+
true.and { false.and { x = 1 } }
|
15
|
+
x.must_be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'evaluates to the first condition not to be true' do
|
19
|
+
(:yes.and { 1.and { nil.and { true } } }).must_be_nil
|
20
|
+
(:yes.and { 1.and { false.and { true } } }).must_equal false
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'evaluates to the last condition if all are true' do
|
24
|
+
(:yes.and { 1 }).must_equal 1
|
25
|
+
(1.and { :yes }).must_equal :yes
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'evaluates the full set of chained conditions during assignment' do
|
29
|
+
x, y = nil
|
30
|
+
x = 1.and { y = 2 }
|
31
|
+
# "1 && y = 2" is evaluated and then assigned to x
|
32
|
+
x.must_equal 2
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'when used in assignment, evaluates and assigns expressions individually' do
|
36
|
+
x, y = nil
|
37
|
+
(x = 1).and { y = 2 }
|
38
|
+
# evaluates (x=1) and (y=2)
|
39
|
+
x.must_equal 1
|
40
|
+
end
|
41
|
+
end
|
data/spec/b001e_suite.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
5
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
6
|
+
|
7
|
+
specdir = File.expand_path(File.dirname __FILE__).gsub(/(.*spec).*?/, '\1')
|
8
|
+
$LOAD_PATH.unshift specdir unless $LOAD_PATH.include? specdir
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
Dir[File.join specdir, '**', '*_spec.rb'].each { |spec| require spec }
|
data/spec/if_spec.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
|
5
|
+
#This code was directly ported from <https://GitHub.Com/RubySpec/RubySpec/tree/master/language/if_spec.rb>
|
6
|
+
|
7
|
+
require File.expand_path File.join(File.dirname(__FILE__), 'spec_helper')
|
8
|
+
|
9
|
+
require 'b001e'
|
10
|
+
|
11
|
+
describe 'The if expression' do
|
12
|
+
before do
|
13
|
+
@result = []
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'evaluates body if expression is true' do
|
17
|
+
true.if { @result << 123 }
|
18
|
+
@result.must_equal [123]
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'does not evaluate body if expression is false' do
|
22
|
+
false.if { @result << 123 }
|
23
|
+
@result.must_equal []
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'does not evaluate else-body if expression is true' do
|
27
|
+
true.ifelse ->() { @result << 123 }, ->() { @result << 456 }
|
28
|
+
@result.must_equal [123]
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'evaluates only else-body if expression is false' do
|
32
|
+
false.ifelse ->() { @result << 123 }, ->() { @result << 456 }
|
33
|
+
@result.must_equal [456]
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'returns result of then-body evaluation if expression is true' do
|
37
|
+
true.if { 123 }.must_equal 123
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'returns result of last statement in then-body if expression is true' do
|
41
|
+
true.if do
|
42
|
+
:foo
|
43
|
+
:bar
|
44
|
+
end.must_equal :bar
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'returns result of then-body evaluation if expression is true and else part is present' do
|
48
|
+
true.ifelse(->() { 123 }, ->() { 456 }).must_equal 123
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns result of else-body evaluation if expression is false' do
|
52
|
+
false.ifelse(->() { 123 }, ->() { 456 }).must_equal 456
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'returns nil if then-body is empty and expression is true' do
|
56
|
+
true.if{}.must_be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'returns nil if then-body is empty, expression is true and else part is present' do
|
60
|
+
true.ifelse(->() {}, ->() { 456 }).must_be_nil
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'returns nil if then-body is empty, expression is true and else part is empty' do
|
64
|
+
true.ifelse.must_be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'returns nil if else-body is empty and expression is false' do
|
68
|
+
false.ifelse(->() { 123 }).must_be_nil
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns nil if else-body is empty, expression is false and then-body is empty' do
|
72
|
+
false.ifelse.must_be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'considers an expression with nil result as false' do
|
76
|
+
nil.ifelse(->() { 123 }, ->() { 456 }).must_equal 456
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'considers a non-nil and non-boolean object in expression result as true' do
|
80
|
+
MiniTest::Mock.new.ifelse(->() { 123 }, ->() { 456 }).must_equal 123
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'considers a zero integer in expression result as true' do
|
84
|
+
0.ifelse(->() { 123 }, ->() { 456 }).must_equal 123
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'evaluates subsequent elsif statements and execute body of first matching' do
|
88
|
+
false.ifelse(->() { 123 }, ->() { false.ifelse ->() { 234 }, ->() { true.ifelse ->() { 345 }, ->() { true.if { 456 } } } }).must_equal 345
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'evaluates else-body if no if/elsif statements match' do
|
92
|
+
false.ifelse(->() { 123 }, ->() { false.ifelse ->() { 234 }, ->() { false.ifelse ->() { 345 }, ->() { 456 } } }).must_equal 456
|
93
|
+
end
|
94
|
+
end
|
data/spec/not_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
|
5
|
+
#This code was directly ported from <https://GitHub.Com/RubySpec/RubySpec/tree/master/language/not_spec.rb>
|
6
|
+
|
7
|
+
require File.expand_path File.join(File.dirname(__FILE__), 'spec_helper')
|
8
|
+
|
9
|
+
require 'b001e'
|
10
|
+
|
11
|
+
describe "The 'not' operator" do
|
12
|
+
it 'turns false to true' do
|
13
|
+
false.not.must_equal true
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'turns nil to true' do
|
17
|
+
nil.not.must_equal true
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'turns true to false' do
|
21
|
+
true.not.must_equal false
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'turns anything not nil to false' do
|
25
|
+
MiniTest::Mock.new.not.must_equal false
|
26
|
+
end
|
27
|
+
end
|
data/spec/or_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
|
5
|
+
#This code was directly ported from <https://GitHub.Com/RubySpec/RubySpec/tree/master/language/or_spec.rb>
|
6
|
+
|
7
|
+
require File.expand_path File.join(File.dirname(__FILE__), 'spec_helper')
|
8
|
+
|
9
|
+
require 'b001e'
|
10
|
+
|
11
|
+
describe "The 'or' operator" do
|
12
|
+
it 'evaluates to true if any of its operands are true' do
|
13
|
+
(false.or { true.or { nil } }).if { @result = true }
|
14
|
+
@result.must_equal true
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'evaluates to false if all of its operands are false' do
|
18
|
+
(false.or { nil }).if { @result = true }
|
19
|
+
@result.must_be_nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'is evaluated before assignment operators' do
|
23
|
+
x = nil.or { true }
|
24
|
+
x.must_equal true
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'is evaluated after variables are assigned' do
|
28
|
+
(x = nil).or { true }
|
29
|
+
x.must_be_nil
|
30
|
+
end
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
2
|
+
|
3
|
+
#Copyright (c) 2009 Jörg W Mittag <JoergWMittag+B001e@GoogleMail.Com>
|
4
|
+
#This code is licensed under the terms of the MIT License (see LICENSE.txt)
|
5
|
+
|
6
|
+
require 'minitest/spec'
|
7
|
+
require 'minitest/mock'
|
8
|
+
require 'minitest/autorun'
|
9
|
+
|
10
|
+
libdir = File.expand_path File.join(File.dirname(__FILE__), 'lib').gsub(/(.*)spec.*?/, '\1')
|
11
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include? libdir
|
12
|
+
|
13
|
+
specdir = File.expand_path(File.dirname __FILE__).gsub(/(.*spec).*?/, '\1')
|
14
|
+
$LOAD_PATH.unshift specdir unless $LOAD_PATH.include? specdir
|
data/spec/unless_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
#Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
|
5
|
+
#This code was directly ported from <https://GitHub.Com/RubySpec/RubySpec/tree/master/language/unless_spec.rb>
|
6
|
+
|
7
|
+
require File.expand_path File.join(File.dirname(__FILE__), 'spec_helper')
|
8
|
+
|
9
|
+
require 'b001e'
|
10
|
+
|
11
|
+
describe 'The unless expression' do
|
12
|
+
it 'evaluates the unless body when the expression is false' do
|
13
|
+
false.unlesselse ->() { @result = true }, ->() { @result = false }
|
14
|
+
@result.must_equal true
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns the last statement in the body' do
|
18
|
+
false.unless do
|
19
|
+
:foo
|
20
|
+
:bar
|
21
|
+
end.must_equal :bar
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'evaluates the else body when the expression is true' do
|
25
|
+
true.unlesselse(->() { :foo }, ->() { :bar }).must_equal :bar
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'does not return a value when the expression is true' do
|
29
|
+
true.unless.must_be_nil
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
|
6
|
+
taskdir = File.expand_path(File.dirname __FILE__).gsub(/(.*tasks).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift taskdir unless $LOAD_PATH.include? taskdir
|
8
|
+
|
9
|
+
task :default => :spec
|
data/tasks/gem_task.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
require 'rake/gempackagetask'
|
6
|
+
|
7
|
+
taskdir = File.expand_path(File.dirname __FILE__).gsub(/(.*tasks).*?/, '\1')
|
8
|
+
$LOAD_PATH.unshift taskdir unless $LOAD_PATH.include? taskdir
|
9
|
+
|
10
|
+
basedir = File.expand_path File.join(taskdir, '..')
|
11
|
+
$LOAD_PATH.unshift basedir unless $LOAD_PATH.include? basedir
|
12
|
+
|
13
|
+
load Dir[File.expand_path File.join(basedir, '*.gemspec')].first
|
14
|
+
|
15
|
+
Rake::GemPackageTask.new($spec) do |pkg|
|
16
|
+
pkg.need_tar = true
|
17
|
+
pkg.need_tar_gz = true
|
18
|
+
pkg.need_tar_bz2 = true
|
19
|
+
pkg.need_zip = true
|
20
|
+
end
|
data/tasks/spec_task.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9
|
2
|
+
# vim: filetype=ruby, fileencoding=UTF-8, tabsize=2, shiftwidth=2
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
|
6
|
+
taskdir = File.expand_path(File.dirname __FILE__).gsub(/(.*tasks).*?/, '\1')
|
7
|
+
$LOAD_PATH.unshift taskdir unless $LOAD_PATH.include? taskdir
|
8
|
+
|
9
|
+
desc 'Run the Specs'
|
10
|
+
task :spec do
|
11
|
+
FileList[File.join taskdir, '..', 'spec', '**', '*_suite.rb'].each { |specsuite| require specsuite }
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: b001e
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0a
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- "J\xC3\xB6rg W Mittag"
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-18 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: |
|
17
|
+
B001e is a message-sending based re-implementation of the
|
18
|
+
Boolean operators 'if', 'unless', 'and', 'or' and 'not' in
|
19
|
+
pure Ruby. Lazy Evaluation / Short-circuiting is achieved
|
20
|
+
through the use of blocks and lambda expressions.
|
21
|
+
|
22
|
+
email: JoergWMittag+B001e@GoogleMail.Com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- LICENSE.txt
|
29
|
+
- README.rst
|
30
|
+
files:
|
31
|
+
- b001e.gemspec
|
32
|
+
- lib/b001e/extensions/core/false_class_extensions.rb
|
33
|
+
- lib/b001e/extensions/core/nil_class_extensions.rb
|
34
|
+
- lib/b001e/extensions/core/object_extensions.rb
|
35
|
+
- lib/b001e/extensions/core/true_class_extensions.rb
|
36
|
+
- lib/b001e/falsiness.rb
|
37
|
+
- lib/b001e/truthiness.rb
|
38
|
+
- lib/b001e.rb
|
39
|
+
- LICENSE.txt
|
40
|
+
- Rakefile.rb
|
41
|
+
- README.rst
|
42
|
+
- spec/and_spec.rb
|
43
|
+
- spec/b001e_suite.rb
|
44
|
+
- spec/if_spec.rb
|
45
|
+
- spec/LICENSE.txt
|
46
|
+
- spec/not_spec.rb
|
47
|
+
- spec/or_spec.rb
|
48
|
+
- spec/spec_helper.rb
|
49
|
+
- spec/unless_spec.rb
|
50
|
+
- tasks/gem_task.rb
|
51
|
+
- tasks/spec_task.rb
|
52
|
+
- tasks/_default_task.rb
|
53
|
+
has_rdoc: true
|
54
|
+
homepage: http://JoergWMittag.GitHub.Com/b001e/
|
55
|
+
licenses:
|
56
|
+
- MIT X11
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options:
|
59
|
+
- --all
|
60
|
+
- --charset=UTF-8
|
61
|
+
- --line-numbers
|
62
|
+
- --webcvs=https://GitHub.Com/JoergWMittag/B001e/blob/master/%s
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.9.1
|
70
|
+
version:
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.3.5
|
76
|
+
version:
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project: b001e
|
80
|
+
rubygems_version: 1.3.5
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Message-sending based re-implementation of the Boolean operators.
|
84
|
+
test_files:
|
85
|
+
- spec/and_spec.rb
|
86
|
+
- spec/b001e_suite.rb
|
87
|
+
- spec/if_spec.rb
|
88
|
+
- spec/LICENSE.txt
|
89
|
+
- spec/not_spec.rb
|
90
|
+
- spec/or_spec.rb
|
91
|
+
- spec/spec_helper.rb
|
92
|
+
- spec/unless_spec.rb
|