finishing_moves 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 +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +12 -0
- data/Gemfile.lock +58 -58
- data/LICENSE +1 -1
- data/README.md +659 -110
- data/Rakefile +10 -0
- data/finishing_moves.gemspec +15 -0
- data/lib/finishing_moves/array.rb +30 -0
- data/lib/finishing_moves/date_and_time.rb +25 -0
- data/lib/finishing_moves/enumerable.rb +18 -0
- data/lib/finishing_moves/fixnum.rb +4 -7
- data/lib/finishing_moves/kernel.rb +35 -0
- data/lib/finishing_moves/object.rb +7 -30
- data/lib/finishing_moves/string.rb +127 -0
- data/lib/finishing_moves/version.rb +1 -1
- data/provision.sh +1 -2
- data/spec/array_spec.rb +127 -0
- data/spec/enumerable_spec.rb +37 -0
- data/spec/fixnum_spec.rb +8 -0
- data/spec/kernel_spec.rb +117 -0
- data/spec/object_spec.rb +1 -103
- data/spec/spec_helper.rb +5 -0
- data/spec/string_spec.rb +159 -0
- metadata +30 -3
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
desc "Open an irb session preloaded with this library"
|
2
|
+
task :console do
|
3
|
+
sh "irb -rubygems -I lib -r finishing_moves.rb"
|
4
|
+
end
|
5
|
+
task :c => :console
|
6
|
+
|
7
|
+
desc "Build the gem according to gemspec"
|
8
|
+
task :buildgem do
|
9
|
+
sh "gem build finishing_moves.gemspec"
|
10
|
+
end
|
data/finishing_moves.gemspec
CHANGED
@@ -26,4 +26,19 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_development_dependency 'fuubar', '>= 0'
|
27
27
|
|
28
28
|
s.required_ruby_version = '>= 2.0'
|
29
|
+
|
30
|
+
s.post_install_message = <<EOS
|
31
|
+
********************************************************************************
|
32
|
+
|
33
|
+
Thank you for installing Finishing Moves!
|
34
|
+
|
35
|
+
Built and maintained by Forge Software
|
36
|
+
www.forgecrafted.com
|
37
|
+
|
38
|
+
Does your project or organization use this gem? Add it to the showcase page.
|
39
|
+
https://github.com/forgecrafted/finishing_moves/wiki/showcase
|
40
|
+
|
41
|
+
********************************************************************************
|
42
|
+
EOS
|
43
|
+
|
29
44
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Array
|
2
|
+
|
3
|
+
def to_hash_values(starting_key = 0, &block)
|
4
|
+
key = starting_key
|
5
|
+
block = proc { |key| key + 1 } unless block_given?
|
6
|
+
t = {}
|
7
|
+
each do |entry|
|
8
|
+
t[key] = entry
|
9
|
+
key = block.call key
|
10
|
+
end
|
11
|
+
t
|
12
|
+
end
|
13
|
+
alias_method :to_hash_as_values, :to_hash_values
|
14
|
+
|
15
|
+
def to_indexed_hash(starting_key = 0)
|
16
|
+
raise ArgumentError, "#{starting_key.inspect} is not an integer" unless starting_key.is_a? Integer
|
17
|
+
to_hash_values(starting_key) { |i| i + 1 }
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_hash_keys(starting_value = 0, &block)
|
21
|
+
t = {}
|
22
|
+
block = proc { default_value } unless block_given?
|
23
|
+
each do |entry|
|
24
|
+
t[entry] = block.call entry
|
25
|
+
end
|
26
|
+
t
|
27
|
+
end
|
28
|
+
alias_method :to_hash_as_keys, :to_hash_keys
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module FinishingMovesFiscalLogic
|
2
|
+
|
3
|
+
def fiscal_quarter
|
4
|
+
((self.month - 1) / 3) + 1
|
5
|
+
end
|
6
|
+
|
7
|
+
# return array of month integers correspond to appropriate quarter interger
|
8
|
+
def quarter_months
|
9
|
+
quarters = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
|
10
|
+
quarters[self.month - 1]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class Time
|
16
|
+
include FinishingMovesFiscalLogic
|
17
|
+
end
|
18
|
+
|
19
|
+
class Date
|
20
|
+
include FinishingMovesFiscalLogic
|
21
|
+
end
|
22
|
+
|
23
|
+
class DateTime
|
24
|
+
include FinishingMovesFiscalLogic
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Enumerable
|
2
|
+
|
3
|
+
def key_map(key)
|
4
|
+
map { |h| h[key] }
|
5
|
+
end
|
6
|
+
|
7
|
+
def key_map_reduce(key, arg = :+, &block)
|
8
|
+
if block_given?
|
9
|
+
# arg is the initial value of memo
|
10
|
+
key_map(key).reduce(arg, &block)
|
11
|
+
else
|
12
|
+
# arg is a named method
|
13
|
+
raise ArgumentError.new "arg must be a method symbol" unless arg.is_a? Symbol
|
14
|
+
key_map(key).reduce(arg)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -1,23 +1,20 @@
|
|
1
|
-
class
|
2
|
-
def length
|
3
|
-
Math.log10(self.abs).to_i + 1
|
4
|
-
end
|
5
|
-
end
|
6
|
-
|
7
|
-
class Bignum
|
1
|
+
class Integer
|
8
2
|
def length
|
9
3
|
Math.log10(self.abs).to_i + 1
|
10
4
|
end
|
5
|
+
alias_method :digits, :length
|
11
6
|
end
|
12
7
|
|
13
8
|
class Float
|
14
9
|
def length
|
15
10
|
raise ArgumentError.new("Cannot get length: \"#{self}\" is not an integer")
|
16
11
|
end
|
12
|
+
alias_method :digits, :length
|
17
13
|
end
|
18
14
|
|
19
15
|
class BigDecimal
|
20
16
|
def length
|
21
17
|
raise ArgumentError.new("Cannot get length: \"#{self}\" is not an integer")
|
22
18
|
end
|
19
|
+
alias_method :digits, :length
|
23
20
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Kernel
|
2
|
+
|
3
|
+
def nil_chain(ret_val = nil, &block)
|
4
|
+
begin
|
5
|
+
result = yield
|
6
|
+
return ret_val if result.nil?
|
7
|
+
result
|
8
|
+
rescue NoMethodError
|
9
|
+
rescue NameError
|
10
|
+
return ret_val
|
11
|
+
end
|
12
|
+
end
|
13
|
+
alias_method :method_chain, :nil_chain
|
14
|
+
|
15
|
+
def bool_chain(&block)
|
16
|
+
result = nil_chain(&block)
|
17
|
+
return false if result.nil?
|
18
|
+
result
|
19
|
+
end
|
20
|
+
|
21
|
+
def class_exists?(class_name)
|
22
|
+
klass = Module.const_get(class_name.to_s)
|
23
|
+
return klass.is_a?(Class)
|
24
|
+
rescue NameError
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
|
28
|
+
def cascade(&block)
|
29
|
+
loop do
|
30
|
+
yield
|
31
|
+
break
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -1,34 +1,11 @@
|
|
1
1
|
class Object
|
2
2
|
|
3
|
-
def nil_chain(ret_val = nil, &block)
|
4
|
-
begin
|
5
|
-
result = yield
|
6
|
-
return ret_val if result.nil?
|
7
|
-
result
|
8
|
-
rescue NoMethodError
|
9
|
-
rescue NameError
|
10
|
-
return ret_val
|
11
|
-
end
|
12
|
-
end
|
13
|
-
alias_method :method_chain, :nil_chain
|
14
|
-
|
15
|
-
def bool_chain(&block)
|
16
|
-
result = nil_chain(&block)
|
17
|
-
return false if result.nil?
|
18
|
-
result
|
19
|
-
end
|
20
|
-
|
21
|
-
def class_exists?(class_name)
|
22
|
-
klass = Module.const_get(class_name.to_s)
|
23
|
-
return klass.is_a?(Class)
|
24
|
-
rescue NameError
|
25
|
-
return false
|
26
|
-
end
|
27
|
-
|
28
3
|
def not_nil?
|
29
4
|
!self.nil?
|
30
5
|
end
|
31
6
|
|
7
|
+
alias_method :is_an?, :is_a?
|
8
|
+
|
32
9
|
def same_as(compare)
|
33
10
|
if compare.respond_to? :to_s
|
34
11
|
self.to_s == compare.to_s
|
@@ -36,12 +13,12 @@ class Object
|
|
36
13
|
raise ArgumentError.new("Cannot compare \"#{self.class.name}\" to \"#{compare.class.name}\", no string conversion")
|
37
14
|
end
|
38
15
|
end
|
16
|
+
alias_method :same_as?, :same_as
|
39
17
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
18
|
+
# Allows us to call keyify directly on a class name.
|
19
|
+
# See keyify() in string.rb for details.
|
20
|
+
def self.keyify
|
21
|
+
name.keyify
|
45
22
|
end
|
46
23
|
|
47
24
|
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
def nl2br
|
4
|
+
self.gsub(/(?:\n\r?|\r\n?)/, "<br />\n")
|
5
|
+
end
|
6
|
+
|
7
|
+
def keyify
|
8
|
+
result = nil_chain do
|
9
|
+
the_key = self.clone
|
10
|
+
|
11
|
+
# strip all non-alphanumerics
|
12
|
+
the_key.gsub!(/[^0-9a-z]+/i, '_')
|
13
|
+
|
14
|
+
# borrowing some logic from Rails method underscore
|
15
|
+
# http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-underscore
|
16
|
+
if the_key =~ /[A-Z-]|::/
|
17
|
+
the_key.gsub!(/::/, '_')
|
18
|
+
the_key.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
19
|
+
the_key.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
20
|
+
end
|
21
|
+
|
22
|
+
# Strip any leading numbers and underscores
|
23
|
+
the_key.lstrip_all!('0-9_')
|
24
|
+
# Strip trailing underscores
|
25
|
+
the_key.rstrip_all!('_')
|
26
|
+
# Combine multiple concurrent underscores
|
27
|
+
the_key.dedupe!('_')
|
28
|
+
# lowercase
|
29
|
+
the_key.downcase!
|
30
|
+
next the_key
|
31
|
+
end
|
32
|
+
return nil if result.nil? || result == ''
|
33
|
+
result.to_sym
|
34
|
+
end
|
35
|
+
|
36
|
+
def keyify!
|
37
|
+
result = self.keyify
|
38
|
+
raise ArgumentError, "#{self.inspect} cannot be keyified, no valid characters" if result.nil?
|
39
|
+
result
|
40
|
+
end
|
41
|
+
|
42
|
+
def strip_all(chars = nil)
|
43
|
+
expr = _strip_all_prep(chars)
|
44
|
+
gsub Regexp.union(_lstrip_all_regex(expr), _rstrip_all_regex(expr)), ''
|
45
|
+
end
|
46
|
+
|
47
|
+
def strip_all!(chars = nil)
|
48
|
+
expr = _strip_all_prep(chars)
|
49
|
+
gsub! Regexp.union(_lstrip_all_regex(expr), _rstrip_all_regex(expr)), ''
|
50
|
+
end
|
51
|
+
|
52
|
+
def lstrip_all(chars = nil)
|
53
|
+
gsub _lstrip_all_regex(_strip_all_prep(chars)), ''
|
54
|
+
end
|
55
|
+
|
56
|
+
def lstrip_all!(chars = nil)
|
57
|
+
gsub! _lstrip_all_regex(_strip_all_prep(chars)), ''
|
58
|
+
end
|
59
|
+
|
60
|
+
def rstrip_all(chars = nil)
|
61
|
+
gsub _rstrip_all_regex(_strip_all_prep(chars)), ''
|
62
|
+
end
|
63
|
+
|
64
|
+
def rstrip_all!(chars = nil)
|
65
|
+
gsub! _rstrip_all_regex(_strip_all_prep(chars)), ''
|
66
|
+
end
|
67
|
+
|
68
|
+
# strip multiple concurrent characters
|
69
|
+
def dedupe(str)
|
70
|
+
raise ArgumentError, "#{str.inspect} is not a string" unless str.is_a? String
|
71
|
+
# Yes, this is inefficient. We welcome optimizations from the regex ninjas out there.
|
72
|
+
ret = String.new self
|
73
|
+
str.each_char { |c| ret.gsub! /#{Regexp.escape c}{2,}/, c }
|
74
|
+
ret
|
75
|
+
end
|
76
|
+
|
77
|
+
def dedupe!(str)
|
78
|
+
raise ArgumentError, "#{str.inspect} is not a string" unless str.is_a? String
|
79
|
+
# Yes, this is inefficient. We welcome optimizations from the regex ninjas out there.
|
80
|
+
str.each_char { |c| gsub! /#{Regexp.escape c}{2,}/, c }
|
81
|
+
end
|
82
|
+
|
83
|
+
def remove_whitespace(replace = '')
|
84
|
+
gsub /[ ]/, replace
|
85
|
+
end
|
86
|
+
|
87
|
+
def remove_whitespace!(replace = '')
|
88
|
+
gsub! /[ ]/, replace
|
89
|
+
end
|
90
|
+
|
91
|
+
# return true/false on regex match
|
92
|
+
def match?(pattern, pos = 0)
|
93
|
+
match(pattern, pos).not_nil?
|
94
|
+
end
|
95
|
+
|
96
|
+
protected
|
97
|
+
|
98
|
+
def _lstrip_all_regex(expr)
|
99
|
+
/\A[#{expr}]+/
|
100
|
+
end
|
101
|
+
|
102
|
+
def _rstrip_all_regex(expr)
|
103
|
+
/[#{expr}]+\Z/
|
104
|
+
end
|
105
|
+
|
106
|
+
def _strip_all_prep(chars)
|
107
|
+
chars = '-_' if chars.nil?
|
108
|
+
raise ArgumentError, "#{chars.inspect} is not a string" unless chars.is_a? String
|
109
|
+
|
110
|
+
expr = Regexp.escape( chars.gsub(/(0-9)+|(a-z)+|(A-Z)+|\s+/, '').strip )
|
111
|
+
['0-9', 'a-z', 'A-Z'].each do |range|
|
112
|
+
expr << range if chars.include? range
|
113
|
+
end
|
114
|
+
expr << ' '
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
# We aren't reopening Symbol class for anything else yet, so we'll just define
|
120
|
+
# it in this file.
|
121
|
+
class Symbol
|
122
|
+
|
123
|
+
def keyify
|
124
|
+
to_s.keyify
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
data/provision.sh
CHANGED
@@ -18,7 +18,6 @@ as_user() {
|
|
18
18
|
install_ruby() {
|
19
19
|
as_user "rbenv install -s $1"
|
20
20
|
as_user "RBENV_VERSION=$1 gem install bundler"
|
21
|
-
as_user "rbenv rehash"
|
22
21
|
}
|
23
22
|
|
24
23
|
###############################################################################
|
@@ -47,7 +46,6 @@ apt-get install -yfV \
|
|
47
46
|
libyaml-dev \
|
48
47
|
python-software-properties \
|
49
48
|
sqlite3 \
|
50
|
-
wget \
|
51
49
|
zlib1g-dev \
|
52
50
|
|
53
51
|
# Install rbenv and ruby-build.
|
@@ -55,6 +53,7 @@ as_user "git clone https://github.com/sstephenson/rbenv.git $USER_HOME/.rbenv"
|
|
55
53
|
as_user "git clone https://github.com/sstephenson/ruby-build.git $USER_HOME/.rbenv/plugins/ruby-build"
|
56
54
|
|
57
55
|
# Setup bash to use rbenv for $USER_NAME.
|
56
|
+
truncate -s 0 $USER_HOME/.bashrc
|
58
57
|
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $USER_HOME/.bashrc
|
59
58
|
echo 'eval "$(rbenv init -)"' >> $USER_HOME/.bashrc
|
60
59
|
echo 'cd /vagrant' >> $USER_HOME/.bashrc
|
data/spec/array_spec.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Array do
|
4
|
+
|
5
|
+
let :sages do
|
6
|
+
['Rauru', 'Saria', 'Darunia', 'Princess Ruto', 'Impa', 'Nabooru', 'Zelda']
|
7
|
+
end
|
8
|
+
|
9
|
+
it '#to_indexed_hash' do
|
10
|
+
expect { sages.to_indexed_hash("e") }.to raise_error(ArgumentError)
|
11
|
+
sages_hash = sages.to_indexed_hash
|
12
|
+
i = 0
|
13
|
+
sages.each do |sage|
|
14
|
+
expect(sages_hash[i]).to eq sage
|
15
|
+
i += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
sages_hash = sages.to_indexed_hash(22)
|
19
|
+
i = 22
|
20
|
+
sages.each do |sage|
|
21
|
+
expect(sages_hash[i]).to eq sage
|
22
|
+
i += 1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it '#to_hash_values <#to_indexed_hash behaviour>' do
|
27
|
+
sages_hash = sages.to_hash_values
|
28
|
+
i = 0
|
29
|
+
sages.each do |sage|
|
30
|
+
expect(sages_hash[i]).to eq sage
|
31
|
+
i += 1
|
32
|
+
end
|
33
|
+
|
34
|
+
block = proc { |key| key + 1 }
|
35
|
+
sages_hash = sages.to_hash_values 0, &block
|
36
|
+
i = 0
|
37
|
+
sages.each do |sage|
|
38
|
+
expect(sages_hash[i]).to eq sage
|
39
|
+
i += 1
|
40
|
+
end
|
41
|
+
|
42
|
+
sages_hash = sages.to_hash_values(22)
|
43
|
+
i = 22
|
44
|
+
sages.each do |sage|
|
45
|
+
expect(sages_hash[i]).to eq sage
|
46
|
+
i += 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it '#to_hash_values' do
|
51
|
+
block = proc { |key| key + 3 }
|
52
|
+
sages_hash = sages.to_hash_values 0, &block
|
53
|
+
i = 0
|
54
|
+
sages.each do |sage|
|
55
|
+
expect(sages_hash[i]).to eq sage
|
56
|
+
i += 3
|
57
|
+
end
|
58
|
+
|
59
|
+
sages_hash = sages.to_hash_values 22, &block
|
60
|
+
i = 22
|
61
|
+
sages.each do |sage|
|
62
|
+
expect(sages_hash[i]).to eq sage
|
63
|
+
i += 3
|
64
|
+
end
|
65
|
+
|
66
|
+
# alias check
|
67
|
+
expect(sages.to_hash_as_values(22, &block)).to eq sages_hash
|
68
|
+
|
69
|
+
elements = SageElements.new
|
70
|
+
sages_hash = sages.to_hash_values(elements.first_key) do |key|
|
71
|
+
elements.next_key(key)
|
72
|
+
end
|
73
|
+
expect(sages_hash[:light]).to eq sages[0]
|
74
|
+
expect(sages_hash[:forest]).to eq sages[1]
|
75
|
+
expect(sages_hash[:fire]).to eq sages[2]
|
76
|
+
expect(sages_hash[:water]).to eq sages[3]
|
77
|
+
expect(sages_hash[:shadow]).to eq sages[4]
|
78
|
+
expect(sages_hash[:spirit]).to eq sages[5]
|
79
|
+
expect(sages_hash[:time]).to eq sages[6]
|
80
|
+
end
|
81
|
+
|
82
|
+
it '#to_hash_keys' do
|
83
|
+
sages_hash = sages.to_hash_keys
|
84
|
+
# alias check
|
85
|
+
expect(sages.to_hash_as_keys).to eq sages_hash
|
86
|
+
|
87
|
+
sages.each do |sage|
|
88
|
+
expect(sages_hash[sage]).to eq 0
|
89
|
+
end
|
90
|
+
|
91
|
+
sages_hash = sages.to_hash_keys('foobar')
|
92
|
+
sages.each do |sage|
|
93
|
+
expect(sages_hash[sage]).to eq 'foobar'
|
94
|
+
end
|
95
|
+
|
96
|
+
sages_hash = sages.to_hash_keys { |key| key + "1" }
|
97
|
+
sages.each do |sage|
|
98
|
+
expect(sages_hash[sage]).to eq sage + "1"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
class SageElements
|
105
|
+
|
106
|
+
def initialize
|
107
|
+
@keys = {
|
108
|
+
:first => :light,
|
109
|
+
:light => :forest,
|
110
|
+
:forest => :fire,
|
111
|
+
:fire => :water,
|
112
|
+
:water => :shadow,
|
113
|
+
:shadow => :spirit,
|
114
|
+
:spirit => :time,
|
115
|
+
:time => :first,
|
116
|
+
}
|
117
|
+
end
|
118
|
+
|
119
|
+
def first_key
|
120
|
+
@keys[:first]
|
121
|
+
end
|
122
|
+
|
123
|
+
def next_key(pointer)
|
124
|
+
@keys[pointer]
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Enumerable do
|
4
|
+
|
5
|
+
let :test_array do
|
6
|
+
[
|
7
|
+
{:foo => 1, :bar => 5, :baz => 9},
|
8
|
+
{:foo => 2, :bar => 6, :baz => 10},
|
9
|
+
{:foo => 3, :bar => 7, :baz => 11},
|
10
|
+
{:foo => 4, :bar => 8, :baz => 12},
|
11
|
+
]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "#key_map" do
|
15
|
+
expect(test_array.key_map :foo).to eq([1, 2, 3, 4])
|
16
|
+
expect(test_array.key_map :bar).to eq([5, 6, 7, 8])
|
17
|
+
expect(test_array.key_map :baz).to eq([9, 10, 11, 12])
|
18
|
+
end
|
19
|
+
|
20
|
+
context "#key_map_reduce" do
|
21
|
+
it "default behavior" do
|
22
|
+
expect(test_array.key_map_reduce :foo).to eq(10)
|
23
|
+
expect(test_array.key_map_reduce :bar).to eq(26)
|
24
|
+
expect(test_array.key_map_reduce :baz).to eq(42)
|
25
|
+
end
|
26
|
+
it "with method override" do
|
27
|
+
expect(test_array.key_map_reduce :foo, :*).to eq(24)
|
28
|
+
expect(test_array.key_map_reduce :bar, :*).to eq(1680)
|
29
|
+
expect(test_array.key_map_reduce :baz, :*).to eq(11880)
|
30
|
+
end
|
31
|
+
it "with block" do
|
32
|
+
actual = test_array.key_map_reduce(:bar, "") { |memo,x| memo + "#{x**2}," }
|
33
|
+
expect(actual).to eq("25,36,49,64,")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/spec/fixnum_spec.rb
CHANGED
@@ -10,11 +10,15 @@ describe "Count number length" do
|
|
10
10
|
expect(900.length).to eq 3
|
11
11
|
expect(9000.length).to eq 4
|
12
12
|
expect(-9000.length).to eq 4
|
13
|
+
# alias
|
14
|
+
expect(-9000.digits).to eq 4
|
13
15
|
end
|
14
16
|
|
15
17
|
it "Bignum#length" do
|
16
18
|
expect(12356469787881584554556.length).to eq 23
|
17
19
|
expect(-12356469787881584554556.length).to eq 23
|
20
|
+
# alias
|
21
|
+
expect(-12356469787881584554556.digits).to eq 23
|
18
22
|
end
|
19
23
|
|
20
24
|
it "Float#length" do
|
@@ -23,6 +27,8 @@ describe "Count number length" do
|
|
23
27
|
expect{ -1.0.length }.to raise_error(ArgumentError)
|
24
28
|
expect{ 3.14.length }.to raise_error(ArgumentError)
|
25
29
|
expect{ 12356469.987.length }.to raise_error(ArgumentError)
|
30
|
+
# alias
|
31
|
+
expect{ 12356469.987.digits }.to raise_error(ArgumentError)
|
26
32
|
end
|
27
33
|
|
28
34
|
it "BigDecimal#length" do
|
@@ -30,6 +36,8 @@ describe "Count number length" do
|
|
30
36
|
expect{ -1265437718438866624512.123.length }.to raise_error(ArgumentError)
|
31
37
|
expect{ 0.9999999999999062.length }.to raise_error(ArgumentError)
|
32
38
|
expect{ -0.9999999999999062.length }.to raise_error(ArgumentError)
|
39
|
+
# alias
|
40
|
+
expect{ -0.9999999999999062.digits }.to raise_error(ArgumentError)
|
33
41
|
end
|
34
42
|
|
35
43
|
end
|
data/spec/kernel_spec.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Kernel do
|
4
|
+
|
5
|
+
it "#nil_chain" do
|
6
|
+
expect(nil_chain{bogus_variable}).to eq nil
|
7
|
+
expect(nil_chain{bogus_hash[:foo]}).to eq nil
|
8
|
+
params = { :foo => 'bar' }
|
9
|
+
expect(nil_chain{ params[:bogus_key] }).to eq nil
|
10
|
+
expect(nil_chain{ params[:foo] }).to eq 'bar'
|
11
|
+
var = 'a simple string'
|
12
|
+
expect(nil_chain{ var.transmogrify }).to eq nil
|
13
|
+
|
14
|
+
c = C.new
|
15
|
+
b = B.new c
|
16
|
+
a = A.new b
|
17
|
+
expect(a.b.c.hello).to eq "Hello, world!"
|
18
|
+
b.c = nil
|
19
|
+
expect(nil_chain{a.b.c.hello}).to eq nil
|
20
|
+
a = nil
|
21
|
+
expect(nil_chain{a.b.c.hello}).to eq nil
|
22
|
+
|
23
|
+
expect( nil_chain(true) { bogus_variable } ).to equal true
|
24
|
+
expect( nil_chain(false) { bogus_variable } ).to equal false
|
25
|
+
expect( nil_chain('gotcha!') { bogus_variable } ).to eq 'gotcha!'
|
26
|
+
expect( nil_chain('gotcha!') { params[:bogus_key] } ).to eq 'gotcha!'
|
27
|
+
expect( nil_chain('gotcha!') { params[:foo] } ).to eq 'bar'
|
28
|
+
|
29
|
+
# alias
|
30
|
+
expect(method_chain{bogus_variable}).to eq nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it "#bool_chain" do
|
34
|
+
expect(bool_chain{bogus_variable}).to equal false
|
35
|
+
var = true
|
36
|
+
expect(bool_chain{var}).to equal true
|
37
|
+
var = 'foo'
|
38
|
+
expect(bool_chain{var}).to eq 'foo'
|
39
|
+
result = bool_chain{ var.transmogrify }
|
40
|
+
expect(result).to equal false
|
41
|
+
end
|
42
|
+
|
43
|
+
it "#class_exists?" do
|
44
|
+
expect(class_exists? :Symbol).to eq true
|
45
|
+
expect(class_exists? :Symbology).to eq false
|
46
|
+
expect(class_exists? 'Symbol').to eq true
|
47
|
+
expect(class_exists? 'Symbology').to eq false
|
48
|
+
expect(class_exists? :Array).to eq true
|
49
|
+
expect(class_exists? :aRRay).to eq false
|
50
|
+
expect(class_exists? :ARRAY).to eq false
|
51
|
+
expect(class_exists? 'SomeModule::ClassInModule').to eq true
|
52
|
+
end
|
53
|
+
|
54
|
+
it "#cascade" do
|
55
|
+
expect(test_cascade).to be_nil
|
56
|
+
expect(test_cascade('step1')).to eq 1
|
57
|
+
expect(test_cascade('step2')).to eq 2
|
58
|
+
expect(test_cascade('step3')).to eq 3
|
59
|
+
expect(test_cascade('foobar')).to eq 4
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
# some small test fixtures
|
65
|
+
|
66
|
+
class A
|
67
|
+
attr_accessor :b
|
68
|
+
def initialize(b)
|
69
|
+
@b = b
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class B
|
74
|
+
attr_accessor :c
|
75
|
+
def initialize(c)
|
76
|
+
@c = c
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class C
|
81
|
+
def hello
|
82
|
+
"Hello, world!"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class User
|
87
|
+
attr_writer :handle
|
88
|
+
|
89
|
+
def handle
|
90
|
+
@handle || "faceless_one"
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_s
|
94
|
+
handle.to_s
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_cascade(trigger = nil)
|
99
|
+
ultimate_value = nil
|
100
|
+
cascade do
|
101
|
+
break if trigger.nil?
|
102
|
+
ultimate_value = 1
|
103
|
+
break if trigger == 'step1'
|
104
|
+
ultimate_value = 2
|
105
|
+
break if trigger == 'step2'
|
106
|
+
ultimate_value = 3
|
107
|
+
break if trigger == 'step3'
|
108
|
+
ultimate_value = 4
|
109
|
+
end
|
110
|
+
return ultimate_value
|
111
|
+
end
|
112
|
+
|
113
|
+
module SomeModule
|
114
|
+
class ClassInModule
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|