sometimes 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +44 -13
- data/lib/sometimes.rb +42 -12
- data/lib/sometimes/version.rb +1 -1
- data/sometimes.gemspec +0 -1
- data/test/test_otherwise.rb +72 -0
- data/test/test_percent_of_the_time.rb +45 -0
- data/test/test_sometimes.rb +1 -44
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60c3688a8dd7b7b16bf79a3f1949e52b11b87331553d94189ad070297f042433
|
4
|
+
data.tar.gz: e07d362391db192f46557c5c2ce5328c770f9a1a442781aa8ccae2e29979cdbf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ae125a0a5c25cb46dfbfb2e54e086c061a28bce0bbda46b08fdcb073c612b84ee85a5461402a1fc6389583efc19f941640a48b05b2ef88632ed78a02744461b
|
7
|
+
data.tar.gz: 397b6f0b55bf1c340d88bcd93389179b87edd40c992ba56f474f3b3b470d805fa3ee0a95f724e80f9bbdb90ef164b1a629999173dd225dc15aef27fc779a1102
|
data/README.md
CHANGED
@@ -1,17 +1,11 @@
|
|
1
1
|
# Sometimes
|
2
2
|
|
3
|
-
[![Build Status](https://
|
4
|
-
|
3
|
+
[![Build Status](https://github.com/sudara/sometimes/workflows/rubyCI/badge.svg
|
4
|
+
)](https://github.com/sudara/sometimes/actions)
|
5
5
|
|
6
6
|
Stop being so black and white. Mix things up a bit and execute code *sometimes*.
|
7
7
|
|
8
|
-
A (very) simple collection of lil' helpers polluting namespaces because...why the hell not?
|
9
|
-
|
10
|
-
## Versions
|
11
|
-
|
12
|
-
Works with ruby 2.2 and up as of version 0.0.3.
|
13
|
-
|
14
|
-
Use version 0.0.2 if you want to support earlier rubies.
|
8
|
+
A (very) simple collection of lil' helpers polluting Object namespaces since 2013 because...why the hell not?
|
15
9
|
|
16
10
|
## Installation
|
17
11
|
|
@@ -38,24 +32,29 @@ require 'sometimes'
|
|
38
32
|
Say something every other time
|
39
33
|
|
40
34
|
```ruby
|
35
|
+
# executes warm fuzzies 50% of the time
|
41
36
|
sometimes do
|
42
|
-
puts "Hey, you are awesome. You really are."
|
37
|
+
puts "Hey, you are awesome. You really are."
|
43
38
|
end
|
44
39
|
```
|
45
40
|
|
41
|
+
|
46
42
|
Maybe you want to do something several times, but not always the exact same number of times
|
47
43
|
|
48
44
|
```ruby
|
45
|
+
# between 4 and 10 boogers made, it's unpredictable!
|
49
46
|
(4..10).times do
|
50
|
-
pick_nose
|
47
|
+
pick_nose
|
51
48
|
end
|
52
49
|
```
|
53
50
|
|
51
|
+
|
54
52
|
Maybe you want to remind someone of something, but not toooo often (It gets annoying!)
|
55
53
|
|
56
54
|
```ruby
|
55
|
+
# be annoying, but only 15% of the time
|
57
56
|
15.percent_of_the_time do
|
58
|
-
puts "Howdy, Don't forget to register!"
|
57
|
+
puts "Howdy, Don't forget to register!"
|
59
58
|
end
|
60
59
|
|
61
60
|
33.percent_of_the_time do
|
@@ -66,8 +65,9 @@ end
|
|
66
65
|
Share a rare moment with your user
|
67
66
|
|
68
67
|
```ruby
|
68
|
+
# be really annoying about 5% of the time
|
69
69
|
rarely do
|
70
|
-
puts "How would you like some spammy spam spam!"
|
70
|
+
puts "How would you like some spammy spam spam!"
|
71
71
|
end
|
72
72
|
|
73
73
|
1.percent_of_the_time do
|
@@ -90,12 +90,43 @@ always do
|
|
90
90
|
puts "Thanks for sharing!"
|
91
91
|
end
|
92
92
|
```
|
93
|
+
|
94
|
+
### Otherwise
|
95
|
+
|
96
|
+
Counting precisely is overrated.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
# Sometimes increment, sometimes don't
|
100
|
+
i += sometimes(1)
|
101
|
+
|
102
|
+
# 5% of the time add 10, otherwise increment
|
103
|
+
i += rarely(10, otherwise:1)
|
104
|
+
```
|
105
|
+
|
106
|
+
Model real life state, like your calendar
|
107
|
+
```ruby
|
108
|
+
# 95% of the time you are in meetings
|
109
|
+
status = mostly ? "busy" : "free"
|
110
|
+
|
111
|
+
# same as above
|
112
|
+
status = mostly("busy", otherwise: "free")
|
113
|
+
|
114
|
+
```
|
115
|
+
|
93
116
|
## Why?
|
94
117
|
|
95
118
|
This gem was made so [alonetone](http://github.com/sudara/alonetone) could bit more fun when displaying notices and communicating to our users.
|
96
119
|
|
97
120
|
We are human, and have personality. Shouldn't our applications reflect this? Be predictable where it counts. But toss in some spice here and there — it is always a good thing.
|
98
121
|
|
122
|
+
|
123
|
+
## Versions
|
124
|
+
|
125
|
+
Works with ruby 2.7 and higher.
|
126
|
+
|
127
|
+
Use version 1.0.0 to support ruby < 2.7
|
128
|
+
Use version 0.0.2 to support ruby < 2.2
|
129
|
+
|
99
130
|
## Updating and Releasing this gem
|
100
131
|
|
101
132
|
* Update lib/sometimes/version.rb
|
data/lib/sometimes.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "sometimes/version"
|
2
2
|
|
3
|
-
# -*- encoding : utf-8 -*-
|
4
3
|
# OH SO FUN HELPERS!
|
5
4
|
|
6
5
|
# RANDOMLY EXECUTES A BLOCK X percent OF THE TIME
|
@@ -17,14 +16,45 @@ require "sometimes/version"
|
|
17
16
|
#
|
18
17
|
#
|
19
18
|
# 40.percent_of_the_time do
|
19
|
+
# some_task
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# 40.percent_of_the_time(true, otherwise: false)
|
23
|
+
#
|
24
|
+
# 40.percent_of_the_time ? something : something_else
|
20
25
|
class Integer
|
21
|
-
def percent_of_the_time(
|
26
|
+
def percent_of_the_time(*arg, otherwise: nil)
|
22
27
|
return if self == 0
|
23
28
|
|
24
|
-
|
25
|
-
|
29
|
+
raise(ArgumentError, 'Integer should be between 0 and 100 to be used
|
30
|
+
with the percent_of_the_time method') if self < 0 || self > 100
|
31
|
+
|
32
|
+
if Kernel.rand(1..100) <= self
|
33
|
+
if block_given?
|
34
|
+
yield
|
35
|
+
elsif arg.empty?
|
36
|
+
true
|
37
|
+
else
|
38
|
+
arg.first
|
39
|
+
end
|
40
|
+
else
|
41
|
+
format_otherwise(arg, otherwise)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
def format_otherwise(arg, otherwise)
|
48
|
+
return false if arg.empty?
|
49
|
+
|
50
|
+
if arg.first.is_a? Integer
|
51
|
+
otherwise.to_i
|
52
|
+
elsif arg.first.is_a? Float
|
53
|
+
otherwise.to_f
|
54
|
+
elsif arg.first.respond_to? :to_str
|
55
|
+
otherwise.to_s
|
26
56
|
else
|
27
|
-
|
57
|
+
otherwise
|
28
58
|
end
|
29
59
|
end
|
30
60
|
end
|
@@ -39,20 +69,20 @@ end
|
|
39
69
|
# half_the_time do
|
40
70
|
# sometimes do
|
41
71
|
class Object
|
42
|
-
def half_the_time(
|
43
|
-
50.percent_of_the_time(
|
72
|
+
def half_the_time(...)
|
73
|
+
50.percent_of_the_time(...)
|
44
74
|
end
|
45
75
|
alias sometimes half_the_time
|
46
76
|
|
47
|
-
def rarely(
|
48
|
-
5.percent_of_the_time(
|
77
|
+
def rarely(...)
|
78
|
+
5.percent_of_the_time(...)
|
49
79
|
end
|
50
80
|
|
51
|
-
def mostly(
|
52
|
-
95.percent_of_the_time(
|
81
|
+
def mostly(...)
|
82
|
+
95.percent_of_the_time(...)
|
53
83
|
end
|
54
84
|
|
55
|
-
def never(
|
85
|
+
def never(...); end
|
56
86
|
|
57
87
|
def always
|
58
88
|
yield
|
data/lib/sometimes/version.rb
CHANGED
data/sometimes.gemspec
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'sometimes'
|
3
|
+
|
4
|
+
class OtherwiseTest < Test::Unit::TestCase
|
5
|
+
def test_percent_with_implicit_integer_otherwise
|
6
|
+
i = 0
|
7
|
+
100000.times do
|
8
|
+
i += 50.percent_of_the_time(1)
|
9
|
+
end
|
10
|
+
assert_in_delta(i, 50000, 500)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_sometimes_with_implicit_integer_otherwise
|
14
|
+
i = 0
|
15
|
+
100000.times do
|
16
|
+
i += sometimes(1)
|
17
|
+
end
|
18
|
+
assert_in_delta(i, 50000, 500)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_percent_with_explicit_integer_otherwise
|
22
|
+
i = 0
|
23
|
+
100000.times do
|
24
|
+
i += 50.percent_of_the_time(1, otherwise: 1)
|
25
|
+
end
|
26
|
+
assert_equal i, 100000
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_percent_with_explicit_integer_otherwise_2
|
30
|
+
options = []
|
31
|
+
10.times do
|
32
|
+
options << 50.percent_of_the_time(1, otherwise: 2)
|
33
|
+
end
|
34
|
+
assert_equal options.uniq.sort, [1, 2]
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_percent_with_implicit_string_otherwise
|
38
|
+
options = []
|
39
|
+
10.times do
|
40
|
+
options << 50.percent_of_the_time("1")
|
41
|
+
end
|
42
|
+
assert_equal options.uniq.sort, ["", "1"]
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_percent_with_explicit_string_otherwise
|
46
|
+
options = []
|
47
|
+
10.times do
|
48
|
+
options << 50.percent_of_the_time("1", otherwise: "2")
|
49
|
+
end
|
50
|
+
assert_equal options.uniq.sort, ["1", "2"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_percent_with_implicit_boolean_otherwise
|
54
|
+
options = []
|
55
|
+
10.times do
|
56
|
+
options << 50.percent_of_the_time
|
57
|
+
end
|
58
|
+
|
59
|
+
assert_equal options.uniq - [true], [false]
|
60
|
+
|
61
|
+
# only contains true and false values
|
62
|
+
assert options.uniq.difference([true, false]).empty?
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_sometimes_with_implicit_boolean
|
66
|
+
i = 0
|
67
|
+
100000.times do
|
68
|
+
i += sometimes ? 1 : 0
|
69
|
+
end
|
70
|
+
assert_in_delta(i, 50000, 500)
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'sometimes'
|
3
|
+
|
4
|
+
class PercentOfTheTimeTest < Test::Unit::TestCase
|
5
|
+
def test_percent
|
6
|
+
i = 0
|
7
|
+
100000.times do
|
8
|
+
75.percent_of_the_time do
|
9
|
+
i += 1
|
10
|
+
end
|
11
|
+
end
|
12
|
+
assert i > 73000
|
13
|
+
assert i < 76000
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_99
|
17
|
+
i = 0
|
18
|
+
100000.times do
|
19
|
+
99.percent_of_the_time do
|
20
|
+
i += 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
assert i > 97000
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_1
|
27
|
+
i = 0
|
28
|
+
100000.times do
|
29
|
+
1.percent_of_the_time do
|
30
|
+
i += 1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
assert i < 1100
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_0
|
37
|
+
bool = true
|
38
|
+
100000.times do
|
39
|
+
0.percent_of_the_time do
|
40
|
+
bool = false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
assert_equal true, bool
|
44
|
+
end
|
45
|
+
end
|
data/test/test_sometimes.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'sometimes'
|
3
|
-
require 'helper'
|
4
3
|
|
5
4
|
class SometimesTest < Test::Unit::TestCase
|
6
|
-
def
|
5
|
+
def test_sometimes_with_block
|
7
6
|
i = 0
|
8
7
|
100000.times do
|
9
8
|
sometimes do
|
10
9
|
i += 1
|
11
10
|
end
|
12
11
|
end
|
13
|
-
puts i
|
14
12
|
assert (i < 51000) && (i > 49000)
|
15
13
|
end
|
16
14
|
|
@@ -21,17 +19,6 @@ class SometimesTest < Test::Unit::TestCase
|
|
21
19
|
assert i < 51
|
22
20
|
end
|
23
21
|
|
24
|
-
def test_percent
|
25
|
-
i = 0
|
26
|
-
100000.times do
|
27
|
-
75.percent_of_the_time do
|
28
|
-
i += 1
|
29
|
-
end
|
30
|
-
end
|
31
|
-
assert i > 73000
|
32
|
-
assert i < 76000
|
33
|
-
end
|
34
|
-
|
35
22
|
def test_rarely
|
36
23
|
i = 0
|
37
24
|
100000.times do
|
@@ -52,36 +39,6 @@ class SometimesTest < Test::Unit::TestCase
|
|
52
39
|
assert i > 90000
|
53
40
|
end
|
54
41
|
|
55
|
-
def test_99
|
56
|
-
i = 0
|
57
|
-
100000.times do
|
58
|
-
99.percent_of_the_time do
|
59
|
-
i += 1
|
60
|
-
end
|
61
|
-
end
|
62
|
-
assert i > 97000
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_1
|
66
|
-
i = 0
|
67
|
-
100000.times do
|
68
|
-
1.percent_of_the_time do
|
69
|
-
i += 1
|
70
|
-
end
|
71
|
-
end
|
72
|
-
assert i < 1100
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_0
|
76
|
-
bool = true
|
77
|
-
100000.times do
|
78
|
-
0.percent_of_the_time do
|
79
|
-
bool = false
|
80
|
-
end
|
81
|
-
end
|
82
|
-
assert_equal true, bool
|
83
|
-
end
|
84
|
-
|
85
42
|
def test_never
|
86
43
|
bool = true
|
87
44
|
never do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sometimes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sudara
|
@@ -55,6 +55,8 @@ files:
|
|
55
55
|
- lib/sometimes/version.rb
|
56
56
|
- sometimes.gemspec
|
57
57
|
- test/helper.rb
|
58
|
+
- test/test_otherwise.rb
|
59
|
+
- test/test_percent_of_the_time.rb
|
58
60
|
- test/test_sometimes.rb
|
59
61
|
homepage: ''
|
60
62
|
licenses: []
|
@@ -80,4 +82,6 @@ specification_version: 4
|
|
80
82
|
summary: Be random. Be unpredictable. But only sometimes
|
81
83
|
test_files:
|
82
84
|
- test/helper.rb
|
85
|
+
- test/test_otherwise.rb
|
86
|
+
- test/test_percent_of_the_time.rb
|
83
87
|
- test/test_sometimes.rb
|