nutella 0.8 → 0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,29 @@
1
+ module Enumerable
2
+ # Applies a method to the collection of various arguments.
3
+ #
4
+ # @example Requires multiple files
5
+ # # Without Nutella:
6
+ # %w[several libs to include].each { |r| require r }
7
+ # # With Nutella:
8
+ # %w[several libs to include].apply :require
9
+ #
10
+ # @example Passes in multiple arguments
11
+ # # Without Nutella:
12
+ # [1, 2, 3].each { |n| foo n, 5 }
13
+ # # With Nutella:
14
+ # [1, 2, 3].apply :foo, 5
15
+ #
16
+ # @example Uses a multi-dimensional array to get the extra arguments
17
+ # arr = [[1, 2], [3, 4], [5, 6]]
18
+ # # Without Nutella:
19
+ # arr.each { |a, b| foo a, b }
20
+ # # With Nutella:
21
+ # arr.apply :foo
22
+ #
23
+ # @param [Symbol] method the method to apply
24
+ # @param [*Object] args any extra arguments to use
25
+ # @return [Array] a list of the return values of the method calls
26
+ def apply(method, *args)
27
+ map { |elem| method(method).(*elem, *args) }
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ module Enumerable
2
+ # Groups an array into smaller arrays of +size+ elements. Remaining elements
3
+ # at the end will be put into a smaller group if necessary, unless
4
+ # +discard_excess+ is true, in which case they will be discarded.
5
+ #
6
+ # @example Groups numbers 1..4 into groups of 2
7
+ # (1..4).group(2) # => [[1, 2], [3, 4]]
8
+ # @example Groups numbers 1..8 into groups of 3
9
+ # (1..8).group(3) # => [[1, 2, 3], [4, 5, 6], [7, 8]]
10
+ # @example Groups numbers 1..8 into groups of 3, discarding excess elements
11
+ # (1..8).group(3, true) # => [[1, 2, 3], [4, 5, 6]]
12
+ #
13
+ # @param [Integer] size the size of the groups to create
14
+ # @param [Boolean] discard_excess whether or not to discard extra elements
15
+ # @return [Array] an array of the groups
16
+ def group(size, discard_excess = false)
17
+ groups = each_slice(size).to_a
18
+ groups[0..(discard_excess && groups.last.size < size ? -2 : -1)]
19
+ end
20
+
21
+ # Modifies the collection in place as described for
22
+ # <tt>Enumerable#group</tt>. Returns the modified collection, or nil if no
23
+ # modifications were made.
24
+ #
25
+ # @see Enumerable#group
26
+ def group!(size, discard_excess = false)
27
+ return nil if empty?
28
+ self.replace group(size, discard_excess)
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ module Enumerable
2
+ alias old_map map
3
+
4
+ # Allows mapping of a method with parameters across a collection.
5
+ #
6
+ # You no longer have to open up a block just because the method that you're
7
+ # mapping needs parameters. This method is still behaves just as it used to
8
+ # otherwise.
9
+ #
10
+ # @example Replaces all vowels with <tt>"x"</tt> in a list of strings
11
+ # %w[Ann Mary Paul].map :gsub, /[aeiou]/i, "x" # => ["xnn", "Mxry", "Pxul"]
12
+ def map(*args, &block)
13
+ block_given? ? old_map(&block) : old_map { |elem| elem.send *args }
14
+ end
15
+ end
16
+
17
+ # TODO: See if there is a DRYer way to make this work with Array also.
18
+ # Array doesn't inherit Enumerable's #map, so I'm forced to do this. Is there a
19
+ # better way to make Array inherit the modified #map?
20
+
21
+ class Array
22
+ alias old_map map
23
+
24
+ # Allows mapping of a method with parameters across an array.
25
+ #
26
+ # @see Enumerable#map
27
+ def map(*args, &block)
28
+ block_given? ? old_map(&block) : old_map { |elem| elem.send *args }
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+ module Enumerable
2
+ alias contains? include?
3
+ alias includes? include?
4
+
5
+ # The inverse of <tt>Enumerable#include?</tt>.
6
+ #
7
+ # @param [Object] object the object to test for exclusion
8
+ # @return [Boolean] whether or not the collection excludes +object+
9
+ def exclude?(object)
10
+ !include? object
11
+ end
12
+ alias excludes? exclude?
13
+ end
@@ -0,0 +1,24 @@
1
+ module Enumerable
2
+ # Add together all numeric elements in the collection. When using a block,
3
+ # adds together all numeric elements that pass the predicate in that block.
4
+ #
5
+ # @example Sums up the elements of an array
6
+ # [1, 2, 3].sum # => 6
7
+ # @example Sums up the elements of a 2-dimensional array
8
+ # [[1, 2], [3, 4]].sum # => 10
9
+ # @example Sums up the numeric elements of a hash
10
+ # { a: 4, b: 5 }.sum # => 9
11
+ # @example Ignores the non-numeric element in the array
12
+ # [2, "string", 9].sum # => 11
13
+ # @example Sums up the even numbers from 1 to 10
14
+ # (1..10).sum &:even?
15
+ # @example Sums up the numbers from 1 to 100 that are multiples of 3
16
+ # (1..100).sum { |n| n % 3 == 0 }
17
+ #
18
+ # @return [Numeric] the sum of all numeric elements in the collection
19
+ def sum(&block)
20
+ # TODO: Two selects in a row, how to DRY this up?
21
+ flat = respond_to?(:flatten) ? flatten : self
22
+ flat.select { |e| e.is_a? Numeric }.select(&block).inject(:+) || 0
23
+ end
24
+ end
@@ -1,65 +1 @@
1
- module Enumerable
2
- alias_method :contains?, :include?
3
- alias_method :includes?, :include?
4
-
5
- # The inverse of <tt>Enumerable#include?</tt>.
6
- #
7
- # @param [Object] object the object to test for exclusion
8
- # @return [Boolean] whether or not the collection excludes +object+
9
- def exclude?(object)
10
- !include? object
11
- end
12
- alias_method :excludes?, :exclude?
13
-
14
- # Groups an array into smaller arrays of +size+ elements. Remaining elements
15
- # at the end will be put into a smaller group if necessary, unless
16
- # +discard_excess+ is true, in which case they will be discarded.
17
- #
18
- # @example Groups numbers 1..4 into groups of 2
19
- # (1..4).group(2) # => [[1, 2], [3, 4]]
20
- # @example Groups numbers 1..8 into groups of 3
21
- # (1..8).group(3) # => [[1, 2, 3], [4, 5, 6], [7, 8]]
22
- # @example Groups numbers 1..8 into groups of 3, discarding excess elements
23
- # (1..8).group(3, true) # => [[1, 2, 3], [4, 5, 6]]
24
- #
25
- # @param [Integer] size the size of the groups to create
26
- # @param [Boolean] discard_excess whether or not to discard extra elements
27
- # @return [Array] an array of the groups
28
- def group(size, discard_excess = false)
29
- groups = each_slice(size).to_a
30
- groups[0..(discard_excess && groups.last.size < size ? -2 : -1)]
31
- end
32
-
33
- # Modifies the collection in place as described for
34
- # <tt>Enumerable#group</tt>. Returns the modified collection, or nil if no
35
- # modifications were made.
36
- #
37
- # @see Enumerable#group
38
- def group!(size, discard_excess = false)
39
- return nil if empty?
40
- self.replace group(size, discard_excess)
41
- end
42
-
43
- # Add together all numeric elements in the collection. When using a block,
44
- # adds together all numeric elements that pass the predicate in that block.
45
- #
46
- # @example Sums up the elements of an array
47
- # [1, 2, 3].sum # => 6
48
- # @example Sums up the elements of a 2-dimensional array
49
- # [[1, 2], [3, 4]].sum # => 10
50
- # @example Sums up the numeric elements of a hash
51
- # { a: 4, b: 5 }.sum # => 9
52
- # @example Ignores the non-numeric element in the array
53
- # [2, "string", 9].sum # => 11
54
- # @example Sums up the even numbers from 1 to 10
55
- # (1..10).sum &:even?
56
- # @example Sums up the numbers from 1 to 100 that are multiples of 3
57
- # (1..100).sum { |n| n % 3 == 0 }
58
- #
59
- # @return [Numeric] the sum of all numeric elements in the collection
60
- def sum(&block)
61
- # TODO: Two selects in a row, how to DRY this up?
62
- flat = respond_to?(:flatten) ? flatten : self
63
- flat.select { |e| e.is_a? Numeric }.select(&block).inject(:+) || 0
64
- end
65
- end
1
+ Dir[File.expand_path("../enumerable/**/*.rb", __FILE__)].each { |f| require f }
@@ -20,7 +20,7 @@ class Hash
20
20
  def slice(*keys)
21
21
  select { |k, v| keys.include? k }
22
22
  end
23
- alias_method :grab, :slice
23
+ alias grab slice
24
24
 
25
25
  # Acts on the hash as described in Hash#slice, but modifies the hash in
26
26
  # place.
@@ -38,5 +38,5 @@ class Hash
38
38
  end
39
39
  # #grab! doesn't sound quite semantically correct, but keeping it for the
40
40
  # sake of being consistent with #slice/#grab.
41
- alias_method :grab!, :slice!
41
+ alias grab! slice!
42
42
  end
@@ -8,12 +8,8 @@ class Integer
8
8
  #
9
9
  # @return [String] the ordinal form of the integer
10
10
  def ordinalize
11
- suffixes = { 1 => "st", 2 => "nd", 3 => "rd" }
12
-
13
- self.to_s + if (11..13).include?(self.abs % 100)
14
- "th"
15
- elsif suffixes.keys.include? (last_digit = self.abs % 10)
16
- suffixes[last_digit]
11
+ self.to_s + if abs % 100 / 10 != 1 && (1..3).include?(last = abs % 10)
12
+ {1 => "st", 2 => "nd", 3 => "rd"}[last]
17
13
  else
18
14
  "th"
19
15
  end
@@ -46,7 +46,7 @@ class Integer
46
46
  def multiple_of?(*nums)
47
47
  nums.all? { |n| (!n.zero? && self % n == 0) || zero? }
48
48
  end
49
- alias_method :divisible_by?, :multiple_of?
49
+ alias divisible_by? multiple_of?
50
50
 
51
51
  # Checks whether the integer is evenly divisible by any of the arguments.
52
52
  #
@@ -59,5 +59,5 @@ class Integer
59
59
  def multiple_of_any?(*nums)
60
60
  nums.any? { |n| multiple_of? n }
61
61
  end
62
- alias_method :divisible_by_any?, :multiple_of_any?
62
+ alias divisible_by_any? multiple_of_any?
63
63
  end
@@ -0,0 +1,43 @@
1
+ class Numeric
2
+ KILOBYTE = 1024
3
+ MEGABYTE = KILOBYTE * 1024
4
+ GIGABYTE = MEGABYTE * 1024
5
+ TERABYTE = GIGABYTE * 1024
6
+ PETABYTE = TERABYTE * 1024
7
+ EXABYTE = PETABYTE * 1024
8
+
9
+ def bytes
10
+ self
11
+ end
12
+ alias byte bytes
13
+
14
+ def kilobytes
15
+ self * KILOBYTE
16
+ end
17
+ alias kilobyte kilobytes
18
+
19
+ def megabytes
20
+ self * MEGABYTE
21
+ end
22
+ alias megabyte megabytes
23
+
24
+ def gigabytes
25
+ self * GIGABYTE
26
+ end
27
+ alias gigabyte gigabytes
28
+
29
+ def terabytes
30
+ self * TERABYTE
31
+ end
32
+ alias terabyte terabytes
33
+
34
+ def petabytes
35
+ self * PETABYTE
36
+ end
37
+ alias petabyte petabytes
38
+
39
+ def exabytes
40
+ self * EXABYTE
41
+ end
42
+ alias exabyte exabytes
43
+ end
@@ -0,0 +1,23 @@
1
+ class Numeric
2
+ # Checks that the number is at least a given minimum.
3
+ #
4
+ # @example Makes sure that a variable +num+ is a minimum of 5
5
+ # num = num.sanity_check_min 5
6
+ #
7
+ # @param [Numeric] minimum the minimum that the number can be
8
+ # @return [Numeric] what the number must be in order to satisfy the minimum
9
+ def sanity_check_min(minimum)
10
+ [self, minimum].max
11
+ end
12
+
13
+ # Checks that the number is at most a given maximum.
14
+ #
15
+ # @example Makes sure that a variable +num+ is a maximum of 5
16
+ # num = num.sanity_check_max 5
17
+ #
18
+ # @param [Numeric] maximum the maximum that the number can be
19
+ # @return [Numeric] what the number must be in order to satisfy the maximum
20
+ def sanity_check_max(maximum)
21
+ [self, maximum].min
22
+ end
23
+ end
@@ -1,43 +1 @@
1
- class Numeric
2
- KILOBYTE = 1024
3
- MEGABYTE = KILOBYTE * 1024
4
- GIGABYTE = MEGABYTE * 1024
5
- TERABYTE = GIGABYTE * 1024
6
- PETABYTE = TERABYTE * 1024
7
- EXABYTE = PETABYTE * 1024
8
-
9
- def bytes
10
- self
11
- end
12
- alias_method :byte, :bytes
13
-
14
- def kilobytes
15
- self * KILOBYTE
16
- end
17
- alias_method :kilobyte, :kilobytes
18
-
19
- def megabytes
20
- self * MEGABYTE
21
- end
22
- alias_method :megabyte, :megabytes
23
-
24
- def gigabytes
25
- self * GIGABYTE
26
- end
27
- alias_method :gigabyte, :gigabytes
28
-
29
- def terabytes
30
- self * TERABYTE
31
- end
32
- alias_method :terabyte, :terabytes
33
-
34
- def petabytes
35
- self * PETABYTE
36
- end
37
- alias_method :petabyte, :petabytes
38
-
39
- def exabytes
40
- self * EXABYTE
41
- end
42
- alias_method :exabyte, :exabytes
43
- end
1
+ Dir[File.expand_path("../numeric/**/*.rb", __FILE__)].each { |f| require f }
@@ -1,3 +1,3 @@
1
1
  class Object
2
- alias_method :is_an?, :is_a?
2
+ alias is_an? is_a?
3
3
  end
@@ -1,8 +1,8 @@
1
1
  class String
2
- alias_method :contains?, :include?
3
- alias_method :includes?, :include?
2
+ alias contains? include?
3
+ alias includes? include?
4
4
 
5
- alias_method :each, :each_char
5
+ alias each each_char
6
6
 
7
7
  # The inverse of <tt>String#include?</tt>.
8
8
  #
@@ -11,7 +11,7 @@ class String
11
11
  def exclude?(str)
12
12
  !include? str
13
13
  end
14
- alias_method :excludes?, :exclude?
14
+ alias excludes? exclude?
15
15
 
16
16
  # Left-aligns a heredoc by finding the least indented line in the string, and
17
17
  # removing that amount of leading whitespace from each line.
@@ -29,6 +29,6 @@ class String
29
29
  def heredoc
30
30
  gsub /^[ \t]{#{scan(/^[ \t]*(?=\S)/).min.size}}/, ""
31
31
  end
32
- alias_method :format_heredoc, :heredoc
33
- alias_method :strip_heredoc, :heredoc
32
+ alias format_heredoc heredoc
33
+ alias strip_heredoc heredoc
34
34
  end
@@ -1,4 +1,4 @@
1
1
  module Nutella
2
2
  # The current version of Nutella.
3
- VERSION = "0.8"
3
+ VERSION = "0.9"
4
4
  end
@@ -8,6 +8,49 @@ describe Enumerable do
8
8
  test_alias Enumerable, :excludes?, :exclude?
9
9
  end
10
10
 
11
+ describe "#apply" do
12
+ let(:testers) do
13
+ 5.times.map { ApplyTester.new(5) }
14
+ end
15
+
16
+ it "works for a function that takes one argument" do
17
+ testers.apply :increment_value
18
+ testers.map(&:value).should == [6] * 5
19
+ end
20
+
21
+ context "with a function that takes two arguments" do
22
+ it "allows multi-dimensional arrays" do
23
+ multi = testers.zip([2] * 5)
24
+ multi.apply :increment_value
25
+ multi.each { |arr| arr.first.value.should == 7 }
26
+ end
27
+
28
+ it "allows multiple arguments" do
29
+ testers.apply :increment_value, 2
30
+ testers.map(&:value).should == [7] * 5
31
+ end
32
+ end
33
+
34
+ context "with a function that takes many arguments" do
35
+ it "allows multi-dimensional arrays" do
36
+ multi = testers.map { |elem| [elem, 2, 2] }
37
+ multi.apply :increment_value
38
+ multi.each { |arr| arr.first.value.should == 9 }
39
+ end
40
+
41
+ it "allows multiple arguments" do
42
+ testers.apply :increment_value, 2, 2
43
+ testers.map(&:value).should == [9] * 5
44
+ end
45
+
46
+ it "allows multi-dimensional arrays with multiple arguments" do
47
+ multi = testers.zip([2] * 5)
48
+ multi.apply :increment_value, 2
49
+ multi.each { |arr| arr.first.value.should == 9 }
50
+ end
51
+ end
52
+ end
53
+
11
54
  describe "#exclude?" do
12
55
  it "returns true if the collection does not contain the input" do
13
56
  [1, 2, 3].exclude?(4).should be_true
@@ -51,18 +94,41 @@ describe Enumerable do
51
94
  let(:arr) { (1..10).to_a }
52
95
 
53
96
  it "modifies in place" do
54
- arr.group! 2
55
- arr.should == (1..10).group(2)
97
+ expect { arr.group! 2 }.to change { arr }.to (1..10).group(2)
56
98
  end
57
99
 
58
100
  it "returns the modified string" do
59
- return_catcher = arr.group! 2
60
- return_catcher.should == arr
101
+ arr.group!(2).should == arr
61
102
  end
62
103
 
63
104
  it "returns nil if nothing was modified" do
64
- return_catcher = [].group! 2
65
- return_catcher.should be_nil
105
+ [].group!(2).should be_nil
106
+ end
107
+ end
108
+
109
+ describe "#map" do
110
+ it "takes a symbol and maps that method" do
111
+ [1, 2, 3].map(:succ).should == [2, 3, 4]
112
+ (1..10).map(:succ).should == (2..11).to_a
113
+ end
114
+
115
+ it "passes additional arguments into the method in the first argument" do
116
+ arr = %w[Alice Bob Charlie Dennis]
117
+ alpha = ("a".."z")
118
+ args = [/[aeiou]/, "x"]
119
+
120
+ arr.map(:gsub, *args).should == arr.map { |e| e.gsub *args }
121
+ alpha.map(:gsub, *args).should == alpha.map { |e| e.gsub *args }
122
+ end
123
+
124
+ context "when using as the original #map" do
125
+ it "doesn't break passing in blocks" do
126
+ [1, 2, 3].map { |n| n + 1 }.should == [2, 3, 4]
127
+ end
128
+
129
+ it "doesn't break when passing in Proc" do
130
+ [1, 2, 3].map(&:succ).should == [2, 3, 4]
131
+ end
66
132
  end
67
133
  end
68
134
 
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "nutella/core_ext/hash"
3
3
 
4
4
  describe Hash do
5
- let(:hash) { { a: 1, b: 2, c: 3, d: 4 } }
5
+ let(:hash) { {a: 1, b: 2, c: 3, d: 4} }
6
6
 
7
7
  describe "aliases" do
8
8
  test_alias Hash, :slice, :grab
@@ -11,11 +11,11 @@ describe Hash do
11
11
 
12
12
  describe "#grab" do
13
13
  it "selects the given items from a hash" do
14
- hash.slice(:a, :c).should == { a: 1, c: 3 }
14
+ hash.slice(:a, :c).should == {a: 1, c: 3}
15
15
  end
16
16
 
17
17
  it "skips items that do not exist in the hash" do
18
- hash.slice(:a, :d, :f).should == { a: 1, d: 4 }
18
+ hash.slice(:a, :d, :f).should == {a: 1, d: 4}
19
19
  end
20
20
 
21
21
  it "does not modify in place" do
@@ -27,17 +27,15 @@ describe Hash do
27
27
 
28
28
  describe "#grab!" do
29
29
  it "modifies in place" do
30
- hash.slice! :a, :c
31
- hash.should == { a: 1, c: 3 }
30
+ expect { hash.slice! :a, :c }.to change { hash }.to({a: 1, c: 3})
32
31
  end
33
32
 
34
33
  it "returns the removed pairs" do
35
- hash.slice!(:a, :c).should == { b: 2, d: 4 }
34
+ hash.slice!(:a, :c).should == {b: 2, d: 4}
36
35
  end
37
36
 
38
- it "ignores pairs that did not affect the hash" do
39
- hash.slice!(:a, :c, :g).should == { b: 2, d: 4 }
40
- hash.should == { a: 1, c: 3 }
37
+ it "does not return pairs that did not affect the hash" do
38
+ hash.slice!(:a, :c, :g).should == {b: 2, d: 4}
41
39
  end
42
40
  end
43
41
  end
@@ -8,8 +8,8 @@ describe Integer do
8
8
  end
9
9
 
10
10
  describe "#ordinalize" do
11
- it "returns the ordinal form of the integer" do
12
- NUMBER_FORMATS.each do |cardinal, ordinal|
11
+ NUMBER_FORMATS.each do |cardinal, ordinal|
12
+ it "returns the ordinal #{ordinal} for the integer #{cardinal}" do
13
13
  cardinal.ordinalize.should == ordinal
14
14
  end
15
15
  end
@@ -76,66 +76,66 @@ describe Integer do
76
76
 
77
77
  describe "#multiple_of?" do
78
78
  it "returns true if the number is evenly divisible" do
79
- 5.multiple_of?(5).should be_true
80
- 15.multiple_of?(5).should be_true
81
- 10.multiple_of?(2).should be_true
82
- 6000.multiple_of?(6).should be_true
79
+ 5.should be_multiple_of(5)
80
+ 15.should be_multiple_of(5)
81
+ 10.should be_multiple_of(2)
82
+ 6000.should be_multiple_of(6)
83
83
  end
84
84
 
85
85
  it "returns false if the number is not evenly divisible" do
86
- 20.multiple_of?(7).should be_false
87
- 4.multiple_of?(3).should be_false
88
- 5.multiple_of?(15).should be_false
89
- 100.multiple_of?(3).should be_false
86
+ 20.should_not be_multiple_of(7)
87
+ 4.should_not be_multiple_of(3)
88
+ 5.should_not be_multiple_of(15)
89
+ 100.should_not be_multiple_of(3)
90
90
  end
91
91
 
92
92
  context "when passing in zero" do
93
93
  it "returns false if one tries to divide by zero" do
94
- 20.multiple_of?(0).should be_false
95
- 30.multiple_of?(0).should be_false
94
+ 20.should_not be_multiple_of(0)
95
+ 30.should_not be_multiple_of(0)
96
96
  end
97
97
 
98
98
  it "allows zero to go into zero" do
99
- 0.multiple_of?(0).should be_true
99
+ 0.should be_multiple_of(0)
100
100
  end
101
101
  end
102
102
 
103
103
  context "with multiple arguments" do
104
104
  it "returns true if evenly divisible by all arguments" do
105
- 15.multiple_of?(3, 15).should be_true
106
- 100.multiple_of?(2, 5, 25).should be_true
107
- 0.multiple_of?(0, 1, 2).should be_true
105
+ 15.should be_multiple_of(3, 15)
106
+ 100.should be_multiple_of(2, 5, 25)
107
+ 0.should be_multiple_of(0, 1, 2)
108
108
  end
109
109
 
110
110
  it "returns false if evenly divisible by only some arguments" do
111
- 15.multiple_of?(2, 3).should be_false
112
- 12.multiple_of?(3, 4, 6, 8).should be_false
113
- 10.multiple_of?(0, 5).should be_false
111
+ 15.should_not be_multiple_of(2, 3)
112
+ 12.should_not be_multiple_of(3, 4, 6, 8)
113
+ 10.should_not be_multiple_of(0, 5)
114
114
  end
115
115
 
116
116
  it "returns false if evenly divisible by none of the arguments" do
117
- 6.multiple_of?(4, 5).should be_false
118
- 17.multiple_of?(2, 4).should be_false
117
+ 6.should_not be_multiple_of(4, 5)
118
+ 17.should_not be_multiple_of(2, 4)
119
119
  end
120
120
  end
121
121
  end
122
122
 
123
123
  describe "#multiple_of_any?" do
124
124
  it "returns true if evenly divisible by all arguments" do
125
- 15.multiple_of_any?(3, 15).should be_true
126
- 100.multiple_of_any?(2, 5, 25).should be_true
127
- 0.multiple_of_any?(0, 1, 2).should be_true
125
+ 15.should be_multiple_of_any(3, 15)
126
+ 100.should be_multiple_of_any(2, 5, 25)
127
+ 0.should be_multiple_of_any(0, 1, 2)
128
128
  end
129
129
 
130
130
  it "returns true if evenly divisible by only some arguments" do
131
- 15.multiple_of_any?(2, 3).should be_true
132
- 12.multiple_of_any?(3, 4, 6, 8).should be_true
133
- 10.multiple_of_any?(0, 5).should be_true
131
+ 15.should be_multiple_of_any(2, 3)
132
+ 12.should be_multiple_of_any(3, 4, 6, 8)
133
+ 10.should be_multiple_of_any(0, 5)
134
134
  end
135
135
 
136
136
  it "returns false if evenly divisible by none of the arguments" do
137
- 6.multiple_of_any?(4, 5).should be_false
138
- 17.multiple_of_any?(2, 4).should be_false
137
+ 6.should_not be_multiple_of_any(4, 5)
138
+ 17.should_not be_multiple_of_any(2, 4)
139
139
  end
140
140
  end
141
141
  end
@@ -8,4 +8,32 @@ describe Numeric do
8
8
  test_alias Numeric, (name = "#{prefix}byte").to_sym, "#{name}s".to_sym
9
9
  end
10
10
  end
11
+
12
+ describe "#sanity_check_min" do
13
+ it "returns the parameter if the number is lower" do
14
+ 5.sanity_check_min(7).should == 7
15
+ end
16
+
17
+ it "doesn't change anything if the number is equal" do
18
+ 5.sanity_check_min(5).should == 5
19
+ end
20
+
21
+ it "returns the number if the number is higher" do
22
+ 5.sanity_check_min(2).should == 5
23
+ end
24
+ end
25
+
26
+ describe "#sanity_check_max" do
27
+ it "returns the parameter if the number is higher" do
28
+ 5.sanity_check_max(2).should == 2
29
+ end
30
+
31
+ it "doesn't change anything if the number is equal" do
32
+ 5.sanity_check_max(5).should == 5
33
+ end
34
+
35
+ it "returns the number if the number is lower" do
36
+ 5.sanity_check_max(7).should == 5
37
+ end
38
+ end
11
39
  end
@@ -8,44 +8,44 @@ describe Object do
8
8
 
9
9
  describe "#blank?" do
10
10
  it "is blank when nil" do
11
- nil.blank?.should be_true
11
+ nil.should be_blank
12
12
  end
13
13
 
14
14
  it "is blank when false" do
15
- false.blank?.should be_true
15
+ false.should be_blank
16
16
  end
17
17
 
18
18
  it "is not blank when true" do
19
- true.blank?.should be_false
19
+ true.should_not be_blank
20
20
  end
21
21
 
22
22
  it "is not blank when numeric" do
23
- [0, 1].each { |n| n.blank?.should be_false }
23
+ [0, 1].each { |n| n.should_not be_blank }
24
24
  end
25
25
 
26
26
  context "when a string" do
27
27
  it "is blank if the string is empty" do
28
- "".blank?.should be_true
28
+ "".should be_blank
29
29
  end
30
30
 
31
31
  it "is blank if only whitespace" do
32
- [" ", "\n \t"].each { |str| str.blank?.should be_true }
33
- " something here ".blank?.should be_false
32
+ [" ", "\n \t"].each { |str| str.should be_blank }
33
+ " something here ".should_not be_blank
34
34
  end
35
35
 
36
36
  it "is not blank if the string has content" do
37
- "string".blank?.should be_false
37
+ "string".should_not be_blank
38
38
  end
39
39
  end
40
40
 
41
41
  context "when a collection" do
42
42
  it "is blank if the collection is empty" do
43
- [[], {}].each { |collection| collection.blank?.should be_true }
43
+ [[], {}].each { |collection| collection.should be_blank }
44
44
  end
45
45
 
46
46
  it "is not blank if there are elements in the collection" do
47
47
  [[1, 2, 3], { 1 => 2, 3 => 4 }].each do |collection|
48
- collection.blank?.should be_false
48
+ collection.should_not be_blank
49
49
  end
50
50
  end
51
51
  end
@@ -53,10 +53,10 @@ describe Object do
53
53
 
54
54
  describe "#present?" do
55
55
  it "is the inverse of #blank?" do
56
- [0, 1].each { |n| n.present?.should be_true }
57
- [[], {}].each { |collection| collection.present?.should be_false }
58
- ["", " "].each { |str| str.present?.should be_false }
59
- ["str", " str "].each { |str| str.present?.should be_true }
56
+ [0, 1].each { |n| n.should be_present }
57
+ [[], {}].each { |collection| collection.should_not be_present }
58
+ ["", " "].each { |str| str.should_not be_present }
59
+ ["str", " str "].each { |str| str.should be_present }
60
60
  end
61
61
  end
62
62
 
@@ -24,9 +24,8 @@ describe Enumerable do
24
24
  end
25
25
 
26
26
  describe "#heredoc" do
27
- test = expected = ""
28
-
29
- let(:test) do <<-EOS.heredoc
27
+ it "strips all excess whitespace from the left" do
28
+ test = <<-EOS.heredoc
30
29
  This is a test of String#heredoc.
31
30
  This text should be left-aligned.
32
31
  This text is indented by four spaces.
@@ -35,9 +34,8 @@ describe Enumerable do
35
34
  now one space...
36
35
  Left-aligned again.
37
36
  EOS
38
- end
39
37
 
40
- let(:expected) do <<EOS
38
+ test.should == <<EOS
41
39
  This is a test of String#heredoc.
42
40
  This text should be left-aligned.
43
41
  This text is indented by four spaces.
@@ -47,9 +45,5 @@ This text should be left-aligned.
47
45
  Left-aligned again.
48
46
  EOS
49
47
  end
50
-
51
- it "strips all excess whitespace from the left" do
52
- test.should == expected
53
- end
54
48
  end
55
49
  end
@@ -0,0 +1,11 @@
1
+ class ApplyTester
2
+ attr_accessor :value
3
+
4
+ def initialize(start_value)
5
+ @value = start_value
6
+ end
7
+ end
8
+
9
+ def increment_value(tester, amount = 1, extra_arg = 0)
10
+ tester.value += amount + extra_arg
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nutella
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.8'
4
+ version: '0.9'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-27 00:00:00.000000000 Z
12
+ date: 2012-11-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fuubar
@@ -122,14 +122,22 @@ files:
122
122
  - lib/nutella/core_ext/object.rb
123
123
  - lib/nutella/core_ext/string.rb
124
124
  - lib/nutella/core_ext/file.rb
125
+ - lib/nutella/core_ext/enumerable/group.rb
126
+ - lib/nutella/core_ext/enumerable/sum.rb
127
+ - lib/nutella/core_ext/enumerable/apply.rb
128
+ - lib/nutella/core_ext/enumerable/map.rb
129
+ - lib/nutella/core_ext/enumerable/search.rb
125
130
  - lib/nutella/core_ext/integer.rb
126
131
  - lib/nutella/core_ext/hash.rb
127
132
  - lib/nutella/core_ext/object/blank.rb
128
133
  - lib/nutella/core_ext/object/aliases.rb
134
+ - lib/nutella/core_ext/numeric/sanity_check.rb
135
+ - lib/nutella/core_ext/numeric/bytes.rb
129
136
  - lib/nutella/core_ext/enumerable.rb
130
137
  - lib/nutella/core_ext.rb
131
138
  - spec/support/alias.rb
132
139
  - spec/support/number_formats.rb
140
+ - spec/support/apply_tester.rb
133
141
  - spec/nutella/core_ext/object_spec.rb
134
142
  - spec/nutella/core_ext/hash_spec.rb
135
143
  - spec/nutella/core_ext/numeric_spec.rb
@@ -164,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
172
  version: '0'
165
173
  segments:
166
174
  - 0
167
- hash: 2449410360859195033
175
+ hash: 830849630549550428
168
176
  requirements: []
169
177
  rubyforge_project:
170
178
  rubygems_version: 1.8.24
@@ -174,6 +182,7 @@ summary: Spread some Nutella on Ruby to sweeten up its functionality.
174
182
  test_files:
175
183
  - spec/support/alias.rb
176
184
  - spec/support/number_formats.rb
185
+ - spec/support/apply_tester.rb
177
186
  - spec/nutella/core_ext/object_spec.rb
178
187
  - spec/nutella/core_ext/hash_spec.rb
179
188
  - spec/nutella/core_ext/numeric_spec.rb