slab 1.0.0 → 1.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.
data/lib/slab.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'active_support/all'
2
+
1
3
  module Slab
2
4
 
3
5
  end
@@ -1,5 +1,5 @@
1
- class Object
1
+ module Kernel
2
2
  def returning(value, &block)
3
3
  value.tap(&block)
4
4
  end
5
- end
5
+ end
data/lib/slab/string.rb CHANGED
@@ -5,7 +5,9 @@ class String
5
5
  encode('iso-8859-1', :invalid => :replace, :undef => :replace)
6
6
  end
7
7
 
8
- def self.random(length = 12)
9
- SecureRandom.base64(length)[0..(length - 1)]
8
+ def self.random(length = 12, set = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
9
+ set_size, string = set.size, ''
10
+ length.times { string << set[SecureRandom.random_number(set_size)] }
11
+ string
10
12
  end
11
13
  end
data/lib/slab/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Slab
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -0,0 +1,181 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
4
+
5
+ require 'slab/all'
6
+
7
+ class SlabTest < ActiveSupport::TestCase
8
+
9
+ test 'enumerable extension: hmap' do
10
+ assert_equal Hash['a' => 'b', 'b' => 'c'], ['a', 'b'].hmap(&:succ)
11
+ end
12
+
13
+ test 'hash extension: hmap' do
14
+ block_args = []
15
+ block = ->(k, v) { block_args << [k, v]; v**2 }
16
+ assert_equal({ a: 1, b: 4, c: 9 }, { a: 1, b: 2, c: 3 }.hmap(&block))
17
+ assert_equal [[:a, 1], [:b, 2], [:c, 3]], block_args
18
+ end
19
+
20
+ test 'hash extension: hmap_pair' do
21
+ assert_equal Hash['aaa' => 3, 'bbb' => 6], { :a => 1, :b => 2 }.hmap_pair { |k, v| [k.to_s * 3, v * 3] }
22
+ end
23
+
24
+ test 'enumerable extension: hmap_pair' do
25
+ assert_equal Hash['a' => 'c', 'b' => 'd'], %w(a b).hmap_pair { |k, v| [k, k.succ.succ] }
26
+ end
27
+
28
+ test 'hash extension: extract' do
29
+ assert_equal({ a: 1, b: 2 }, { :a => 1, :aa => 1.5, :b => 2, 'c' => 3, :c => '4' }.extract(:a, :b))
30
+ end
31
+
32
+ test 'numeric extension: percent' do
33
+ assert_float_equal 0.123, 12.3.percent
34
+ assert_float_equal 2, 200.percent
35
+ assert_float_equal 999.9, BigDecimal.new('99990.0000').percent
36
+ end
37
+
38
+ test 'numeric extension: discount' do
39
+ assert_float_equal 0.8, 1.0.discount(20.percent)
40
+ assert_float_equal 200, BigDecimal.new('400.0').discount(50.percent)
41
+ assert_raise(Numeric::DiscountTooBig) { 10.discount(101.percent) }
42
+ end
43
+
44
+ test 'numeric extension: net' do
45
+ assert_float_equal 1.0, 1.19.net(19.percent)
46
+ assert_float_equal 100, BigDecimal.new('107.0').net(7.percent)
47
+ end
48
+
49
+ test 'numeric extension: gross' do
50
+ assert_float_equal 1.19, 1.0.gross(19.percent)
51
+ assert_float_equal 10.7, BigDecimal.new('10').gross(7.percent)
52
+ end
53
+
54
+ test 'numeric extension: tax' do
55
+ assert_float_equal 0.19, 1.0.tax(19.percent)
56
+ assert_float_equal 70, BigDecimal.new('1000').tax(7.percent)
57
+ end
58
+
59
+ test 'numeric extension: sgn' do
60
+ assert_equal 1, 1.sgn
61
+ assert_equal 0, 0.0000000.sgn
62
+ assert_equal -1, BigDecimal.new('-345345345.45345345').sgn
63
+ end
64
+
65
+ test 'numeric extension: commercial round' do
66
+ assert_equal 1.23, 1.234999.commercial_round
67
+ assert_equal -34.44, -34.44223.commercial_round
68
+ end
69
+
70
+ test 'methodphitamine' do
71
+ assert_equal [1, 4, 9], (1..3).map(&it ** 2)
72
+ assert_equal [true, true, false], [-4, 0, 4].map(&its <= 0)
73
+ assert_equal [false, false, true, false], %w(a aaa aaaa aaaaa).map(&its.size.even?)
74
+ assert_equal ['F', 'O', 'U'], %w(af bo cu) .map(&its[1].upcase)
75
+ end
76
+
77
+ test 'methodphitamine captures the equality operator' do
78
+ assert_equal [true, false, true], ['1', :f, 'F'].map(&its.class.name == 'String')
79
+ end
80
+
81
+ test 'date extension: epoch' do
82
+ assert_equal '1000-01-01'.to_date, Date.epoch(:db)
83
+ assert_equal '1970-01-01'.to_date, Date.epoch
84
+ end
85
+
86
+ test 'date extension: end of month' do
87
+ assert_equal true, '2012-02-29'.to_date.end_of_month?
88
+ assert_equal false, '2012-02-28'.to_date.end_of_month?
89
+ assert_equal true, '1999-12-31'.to_date.end_of_month?
90
+ assert_nothing_raised do
91
+ '2012-02-28'.to_date.on_end_of_month do
92
+ raise
93
+ end
94
+ end
95
+ dummy_error = Class.new(Exception)
96
+ assert_raise(dummy_error) do
97
+ '2012-03-31'.to_date.on_end_of_month do
98
+ raise dummy_error
99
+ end
100
+ end
101
+ end
102
+
103
+ test 'enumerable extension: any not?' do
104
+ klass = callable_class
105
+ array = (1..5).map { |n| klass.new(n) }
106
+ assert_equal true, array.any_not? { |obj| obj.value < 3 }
107
+ assert_equal [true, true, true, false, false], array.map(&:touched?)
108
+ end
109
+
110
+ test 'enumerable extension: none?' do
111
+ klass = callable_class
112
+ array = (1..5).map { |n| klass.new(n) }
113
+ assert_equal false, array.none? { |obj| obj.value > 3 }
114
+ assert_equal [true, true, true, true, false], array.map(&:touched?)
115
+ end
116
+
117
+ test 'enumerable extension: map with index' do
118
+ assert_equal [0, 1, 2], (3..5).map_with_index { |obj, idx| idx }
119
+ end
120
+
121
+ test 'enumerable extension: inject with index' do
122
+ assert_equal 'a0b1c2', ['a', 'b', 'c'].inject_with_index('') { |memo, object, index| memo << "#{object}#{index}" }
123
+ end
124
+
125
+ test 'big decimal extension: readable inspect' do
126
+ number = '1030345345345.34534535'
127
+ assert BigDecimal.new(number).inspect.match(/#{Regexp.escape(number)}>\z/)
128
+ end
129
+
130
+ test 'module extension: basename' do
131
+ assert_equal 'Testing', ActiveSupport::Testing.basename
132
+ assert_equal 'Assertions', ActiveSupport::Testing::Assertions.basename
133
+ end
134
+
135
+ test 'string extension: to_iso' do
136
+ assert_equal "f\xF6\xF6b\xE4r".force_encoding('iso-8859-1'), 'fööbär'.to_iso
137
+ assert_equal '50 ?'.force_encoding('iso-8859-1'), "50 €".to_iso
138
+ end
139
+
140
+ test 'string extension: random' do
141
+ assert_match /\A\w+\z/, String.random(200)
142
+ assert_equal 12, String.random.size
143
+ assert_match /\A[f0b4r]+\z/, String.random(1234, 'f0b4r')
144
+ end
145
+
146
+ test 'kernel extension: returning' do
147
+ s = ''
148
+ object_id = s.object_id
149
+ result = returning(s) { |arg| assert_equal object_id, arg.object_id; arg << 'foo'; false }
150
+ assert_equal 'foo', result
151
+ assert_equal 'foo', s
152
+ end
153
+
154
+ test 'object extension: metaclass' do
155
+ mc = class << self; self; end
156
+ assert_equal mc, self.metaclass
157
+ obj = Object.new
158
+ obj.meta_eval do
159
+ define_method(:foo) { 'foo!' }
160
+ end
161
+ assert_equal 'foo!', obj.foo
162
+ end
163
+
164
+ private
165
+
166
+ def callable_class
167
+ Class.new(Object) do
168
+ define_method 'initialize' do |value|
169
+ @value = value
170
+ end
171
+ define_method 'value' do
172
+ @touched = true
173
+ @value
174
+ end
175
+ define_method 'touched?' do
176
+ !!@touched
177
+ end
178
+ end
179
+ end
180
+
181
+ end
@@ -0,0 +1,61 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+
3
+ require 'pathname'
4
+
5
+ if RUBY_VERSION >= '1.9'
6
+ require 'simplecov'
7
+ SimpleCov.start do
8
+ if artifacts_dir = ENV['CC_BUILD_ARTIFACTS']
9
+ coverage_dir Pathname.new(artifacts_dir).relative_path_from(Pathname.new(SimpleCov.root)).to_s
10
+ end
11
+ add_filter '/test/'
12
+ add_filter 'vendor'
13
+ end
14
+
15
+ SimpleCov.at_exit do
16
+ SimpleCov.result.format!
17
+ if result = SimpleCov.result
18
+ File.open(File.join(SimpleCov.coverage_path, 'coverage_percent.txt'), 'w') { |f| f << result.covered_percent.to_s }
19
+ end
20
+ end
21
+ end
22
+
23
+ require 'rubygems'
24
+ require 'bundler/setup'
25
+ Bundler.require(:default)
26
+ require 'test/unit'
27
+
28
+ require 'slab'
29
+
30
+ require 'irb'
31
+
32
+ module IRB # :nodoc:
33
+ def self.start_session(binding)
34
+ unless @__initialized
35
+ args = ARGV
36
+ ARGV.replace(ARGV.dup)
37
+ IRB.setup(nil)
38
+ ARGV.replace(args)
39
+ @__initialized = true
40
+ end
41
+
42
+ workspace = WorkSpace.new(binding)
43
+
44
+ irb = Irb.new(workspace)
45
+
46
+ @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
47
+ @CONF[:MAIN_CONTEXT] = irb.context
48
+
49
+ catch(:IRB_EXIT) do
50
+ irb.eval_input
51
+ end
52
+ end
53
+ end
54
+
55
+ class ActiveSupport::TestCase
56
+
57
+ def assert_float_equal(expected, actual, order = 1)
58
+ assert_in_delta expected, actual, Float::EPSILON * 10**order
59
+ end
60
+
61
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slab
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-28 00:00:00.000000000 Z
12
+ date: 2012-07-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &2151918800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,12 +21,7 @@ dependencies:
21
21
  version: 3.2.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 3.2.3
24
+ version_requirements: *2151918800
30
25
  description: Extensions for Ruby base classes
31
26
  email:
32
27
  - mtgrosser@gmx.net
@@ -34,21 +29,23 @@ executables: []
34
29
  extensions: []
35
30
  extra_rdoc_files: []
36
31
  files:
32
+ - lib/slab/all.rb
37
33
  - lib/slab/big_decimal.rb
38
- - lib/slab/numeric.rb
39
- - lib/slab/methodphitamine.rb
34
+ - lib/slab/date.rb
35
+ - lib/slab/enumerable.rb
40
36
  - lib/slab/hash.rb
41
- - lib/slab/version.rb
42
- - lib/slab/string.rb
43
- - lib/slab/object.rb
44
37
  - lib/slab/metaclass.rb
45
- - lib/slab/enumerable.rb
46
- - lib/slab/date.rb
38
+ - lib/slab/methodphitamine.rb
47
39
  - lib/slab/module.rb
48
- - lib/slab/all.rb
40
+ - lib/slab/numeric.rb
41
+ - lib/slab/returning.rb
42
+ - lib/slab/string.rb
43
+ - lib/slab/version.rb
49
44
  - lib/slab.rb
50
45
  - MIT-LICENSE
51
46
  - README.md
47
+ - test/cases/slab_test.rb
48
+ - test/test_helper.rb
52
49
  homepage: http://rubygems.org/gems/slab
53
50
  licenses: []
54
51
  post_install_message:
@@ -69,8 +66,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
66
  version: '0'
70
67
  requirements: []
71
68
  rubyforge_project:
72
- rubygems_version: 1.8.23
69
+ rubygems_version: 1.8.11
73
70
  signing_key:
74
71
  specification_version: 3
75
72
  summary: Core extensions to build Rails upon
76
- test_files: []
73
+ test_files:
74
+ - test/cases/slab_test.rb
75
+ - test/test_helper.rb