small 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +132 -2
- data/lib/small.rb +3 -2
- data/lib/small/array.rb +1 -0
- data/lib/small/benchmark.rb +29 -0
- data/lib/small/integer.rb +9 -36
- data/lib/small/object.rb +9 -0
- data/lib/small/time.rb +155 -1
- data/lib/small/units.rb +14 -0
- metadata +4 -2
data/README.md
CHANGED
@@ -1,6 +1,136 @@
|
|
1
1
|
Small
|
2
2
|
======
|
3
3
|
|
4
|
-
Small collection of useful Ruby utilities
|
4
|
+
Small collection of useful Ruby utilities
|
5
5
|
|
6
|
-
|
6
|
+
## Classes
|
7
|
+
|
8
|
+
* **Math**
|
9
|
+
|
10
|
+
* fibanocci(n)
|
11
|
+
* factorial(n)
|
12
|
+
|
13
|
+
* **String**
|
14
|
+
|
15
|
+
* camelize
|
16
|
+
* dashize
|
17
|
+
* humanize
|
18
|
+
* underscore
|
19
|
+
* constantize
|
20
|
+
* encode64
|
21
|
+
* decode64
|
22
|
+
* to_sha1
|
23
|
+
* to_sha256(provider)
|
24
|
+
* to_md5
|
25
|
+
* escape
|
26
|
+
* unescape
|
27
|
+
|
28
|
+
* **Integer**
|
29
|
+
|
30
|
+
* year, years
|
31
|
+
* month, months
|
32
|
+
* week, weeks
|
33
|
+
* day, days
|
34
|
+
* hour, hours
|
35
|
+
* minute, minutes
|
36
|
+
* second, seconds
|
37
|
+
|
38
|
+
* **Array**
|
39
|
+
|
40
|
+
* extract_options
|
41
|
+
* sample
|
42
|
+
|
43
|
+
* **Hash**
|
44
|
+
|
45
|
+
* stringify_keys!
|
46
|
+
* symbolize_keys!
|
47
|
+
* to_params
|
48
|
+
|
49
|
+
* **Time**
|
50
|
+
|
51
|
+
* since(seconds)
|
52
|
+
* ago(seconds)
|
53
|
+
* advance(options)
|
54
|
+
* change(options)
|
55
|
+
* to_date
|
56
|
+
* to_datetime
|
57
|
+
* to_formatted_s(format)
|
58
|
+
* leap_year?
|
59
|
+
* weekend?
|
60
|
+
* today?
|
61
|
+
* future?
|
62
|
+
* past?
|
63
|
+
* days_in_month
|
64
|
+
* days_to_week_start(start_day)
|
65
|
+
* weekends
|
66
|
+
* business_week(start_day)
|
67
|
+
* beginning_of_business_week(start_day)
|
68
|
+
* end_of_business_week(start_day)
|
69
|
+
* beginning_of_day
|
70
|
+
* beginning_of_week(start_day)
|
71
|
+
* beginning_of_month
|
72
|
+
* beginning_of_year
|
73
|
+
* end_of_day
|
74
|
+
* end_of_week(start_day)
|
75
|
+
* end_of_month
|
76
|
+
* end_of_year
|
77
|
+
* tomorrow
|
78
|
+
* yesterday
|
79
|
+
* next_year
|
80
|
+
* last_year
|
81
|
+
* next_month
|
82
|
+
* last_month
|
83
|
+
* next_week
|
84
|
+
* last_week
|
85
|
+
|
86
|
+
* **Object**
|
87
|
+
|
88
|
+
* blank?
|
89
|
+
* present?
|
90
|
+
* presence
|
91
|
+
* try(method, &block)
|
92
|
+
|
93
|
+
* **Benchmark** - *small DSL for Benchmark class*
|
94
|
+
|
95
|
+
* benchmark(&block)
|
96
|
+
* measure(&block)
|
97
|
+
* realtime(&block)
|
98
|
+
* run(n, &block)
|
99
|
+
<br />
|
100
|
+
|
101
|
+
require 'small/benchmark'
|
102
|
+
|
103
|
+
benchmark do |b|
|
104
|
+
b.report("test") do
|
105
|
+
run 50_000 do
|
106
|
+
puts "hello world"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
**Notes:** + = some codes extracted from ActiveSupport, but some codes are modified
|
112
|
+
|
113
|
+
## Benchmark
|
114
|
+
|
115
|
+
Using a `time` command execution
|
116
|
+
|
117
|
+
|
118
|
+
**Small**: `time ruby -r small -e 'puts Time.now.end_of_week'`
|
119
|
+
|
120
|
+
2012-05-06 23:59:59 -0500
|
121
|
+
|
122
|
+
real 0m0.167s
|
123
|
+
user 0m0.113s
|
124
|
+
sys 0m0.048s
|
125
|
+
|
126
|
+
**ActiveSupport**: `time ruby -r active_support/all -e 'puts Time.now.end_of_week'`
|
127
|
+
|
128
|
+
2012-05-06 23:59:59 -0500
|
129
|
+
|
130
|
+
real 0m1.320s
|
131
|
+
user 0m1.240s
|
132
|
+
sys 0m0.074s
|
133
|
+
|
134
|
+
## License
|
135
|
+
|
136
|
+
**small** is licensed under the MIT license
|
data/lib/small.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
|
2
2
|
module Small
|
3
|
-
VERSION = "0.
|
3
|
+
VERSION = "0.4"
|
4
4
|
end
|
5
5
|
|
6
6
|
require 'small/object'
|
7
7
|
require 'small/string'
|
8
|
-
require 'small/integer'
|
9
8
|
require 'small/math'
|
10
9
|
require 'small/array'
|
11
10
|
require 'small/hash'
|
11
|
+
require 'small/units'
|
12
|
+
require 'small/integer'
|
12
13
|
require 'small/time'
|
data/lib/small/array.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
|
3
|
+
module Small
|
4
|
+
module Benchmark
|
5
|
+
|
6
|
+
def benchmark(tab = 25)
|
7
|
+
::Benchmark.bm(tab) do |b|
|
8
|
+
yield b
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def measure(name = nil)
|
13
|
+
::Benchmark.measure(name) { yield }
|
14
|
+
end
|
15
|
+
|
16
|
+
def realtime
|
17
|
+
::Benchmark.realtime { yield }
|
18
|
+
end
|
19
|
+
|
20
|
+
def run(n = 100_000)
|
21
|
+
n.to_i.times do |i|
|
22
|
+
yield i
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
include Small::Benchmark
|
data/lib/small/integer.rb
CHANGED
@@ -1,39 +1,12 @@
|
|
1
1
|
class Integer
|
2
|
+
extend Small::Units
|
3
|
+
|
4
|
+
unit :year, 31536000 # http://www.wolframalpha.com/input/?i=year
|
5
|
+
unit :month, 2592000
|
6
|
+
unit :week, 604800
|
7
|
+
unit :day, 86400
|
8
|
+
unit :hour, 3600
|
9
|
+
unit :minute, 60
|
10
|
+
unit :second, 1
|
2
11
|
|
3
|
-
def year
|
4
|
-
# http://www.wolframalpha.com/input/?i=year
|
5
|
-
self * 31536000
|
6
|
-
end
|
7
|
-
|
8
|
-
def month
|
9
|
-
self * 3600 * 24 * 30
|
10
|
-
end
|
11
|
-
|
12
|
-
def week
|
13
|
-
self * 3600 * 24 * 7
|
14
|
-
end
|
15
|
-
|
16
|
-
def day
|
17
|
-
self * 3600 * 24
|
18
|
-
end
|
19
|
-
|
20
|
-
def hour
|
21
|
-
self * 3600
|
22
|
-
end
|
23
|
-
|
24
|
-
def minute
|
25
|
-
self * 60
|
26
|
-
end
|
27
|
-
|
28
|
-
def second
|
29
|
-
self * 1
|
30
|
-
end
|
31
|
-
|
32
|
-
alias :years :year
|
33
|
-
alias :months :month
|
34
|
-
alias :weeks :week
|
35
|
-
alias :days :day
|
36
|
-
alias :hours :hour
|
37
|
-
alias :minutes :minute
|
38
|
-
alias :seconds :second
|
39
12
|
end
|
data/lib/small/object.rb
CHANGED
data/lib/small/time.rb
CHANGED
@@ -2,13 +2,55 @@ require 'time'
|
|
2
2
|
require 'date'
|
3
3
|
require 'datetime' unless defined?(DateTime)
|
4
4
|
|
5
|
-
# Some codes extracted from Rails
|
5
|
+
# Some codes extracted from Rails, but modified codes and additional codes
|
6
6
|
class Time
|
7
7
|
|
8
8
|
DATE_FORMATS = {
|
9
9
|
:default => "%Y-%m-%d %H:%M:%S"
|
10
10
|
}
|
11
11
|
|
12
|
+
DAYS_INTO_WEEK = {
|
13
|
+
:monday => 0,
|
14
|
+
:tuesday => 1,
|
15
|
+
:wednesday => 2,
|
16
|
+
:thursday => 3,
|
17
|
+
:friday => 4,
|
18
|
+
:saturday => 5,
|
19
|
+
:sunday => 6
|
20
|
+
}
|
21
|
+
|
22
|
+
def since(seconds)
|
23
|
+
self + seconds
|
24
|
+
end
|
25
|
+
|
26
|
+
def ago(seconds)
|
27
|
+
since(-seconds)
|
28
|
+
end
|
29
|
+
|
30
|
+
def advance(options)
|
31
|
+
seconds = (options[:years] || 0).years +
|
32
|
+
(options[:months] || 0).months +
|
33
|
+
(options[:weeks] || 0).weeks +
|
34
|
+
(options[:days] || 0).days +
|
35
|
+
(options[:hours] || 0).hours +
|
36
|
+
(options[:minutes] || 0).minutes +
|
37
|
+
(options[:seconds] || 0).seconds
|
38
|
+
since(seconds)
|
39
|
+
end
|
40
|
+
|
41
|
+
def change(options)
|
42
|
+
::Time.send(
|
43
|
+
utc? ? :utc : :local,
|
44
|
+
options[:year] || year,
|
45
|
+
options[:month] || month,
|
46
|
+
options[:day] || day,
|
47
|
+
options[:hour] || hour,
|
48
|
+
options[:min] || (options[:hour] ? 0 : min),
|
49
|
+
options[:sec] || ((options[:hour] || options[:min]) ? 0 : sec),
|
50
|
+
options[:usec] || ((options[:hour] || options[:min] || options[:sec]) ? 0 : usec)
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
12
54
|
def to_date
|
13
55
|
::Date.new(year, month, day)
|
14
56
|
end
|
@@ -25,8 +67,120 @@ class Time
|
|
25
67
|
end
|
26
68
|
end
|
27
69
|
|
70
|
+
def leap_year?
|
71
|
+
to_date.leap?
|
72
|
+
end
|
73
|
+
|
74
|
+
def weekend?
|
75
|
+
weekends.include?(self)
|
76
|
+
end
|
77
|
+
|
28
78
|
def today?
|
29
79
|
to_date == ::Time.now.to_date
|
30
80
|
end
|
31
81
|
|
82
|
+
def future?
|
83
|
+
self > ::Time.now
|
84
|
+
end
|
85
|
+
|
86
|
+
def past?
|
87
|
+
self < ::Time.now
|
88
|
+
end
|
89
|
+
|
90
|
+
def days_in_month
|
91
|
+
::Date.civil(year, month, -1).day
|
92
|
+
end
|
93
|
+
|
94
|
+
def days_to_week_start(start_day = :monday)
|
95
|
+
start_day_number = DAYS_INTO_WEEK[start_day]
|
96
|
+
current_day_number = wday != 0 ? wday - 1 : 6
|
97
|
+
days_span = current_day_number - start_day_number
|
98
|
+
days_span >= 0 ? days_span : 7 + days_span
|
99
|
+
end
|
100
|
+
|
101
|
+
def weekends
|
102
|
+
[end_of_week.ago(1.day), end_of_week]
|
103
|
+
end
|
104
|
+
|
105
|
+
def business_week(start_day = :monday)
|
106
|
+
days = []
|
107
|
+
5.times {|i| days << beginning_of_week(start_day).since(i.days) }
|
108
|
+
days
|
109
|
+
end
|
110
|
+
|
111
|
+
def beginning_of_business_week(start_day = :monday)
|
112
|
+
business_week(start_day).first
|
113
|
+
end
|
114
|
+
|
115
|
+
def end_of_business_week(start_day = :monday)
|
116
|
+
business_week(start_day).last
|
117
|
+
end
|
118
|
+
|
119
|
+
def beginning_of_day
|
120
|
+
change(:hour => 0)
|
121
|
+
end
|
122
|
+
alias :midnight :beginning_of_day
|
123
|
+
|
124
|
+
def beginning_of_week(start_day = :monday)
|
125
|
+
days_to_start = days_to_week_start(start_day)
|
126
|
+
(self - days_to_start.days).midnight
|
127
|
+
end
|
128
|
+
|
129
|
+
def beginning_of_month
|
130
|
+
change(:day => 1, :hour => 0)
|
131
|
+
end
|
132
|
+
|
133
|
+
def beginning_of_year
|
134
|
+
change(:month => 1, :day => 1, :hour => 0)
|
135
|
+
end
|
136
|
+
|
137
|
+
def end_of_day
|
138
|
+
change(:hour => 23, :min => 59, :sec => 59, :usec => 999999.99)
|
139
|
+
end
|
140
|
+
|
141
|
+
def end_of_week(start_day = :monday)
|
142
|
+
days_to_end = 6 - days_to_week_start(start_day)
|
143
|
+
(self + days_to_end.days).end_of_day
|
144
|
+
end
|
145
|
+
|
146
|
+
def end_of_month
|
147
|
+
change(:day => days_in_month, :hour => 23, :min => 59, :sec => 59, :usec => 999999.99)
|
148
|
+
end
|
149
|
+
|
150
|
+
def end_of_year
|
151
|
+
change(:month => 12, :day => 31, :hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
|
152
|
+
end
|
153
|
+
|
154
|
+
def tomorrow
|
155
|
+
advance(:days => 1)
|
156
|
+
end
|
157
|
+
|
158
|
+
def yesterday
|
159
|
+
advance(:days => -1)
|
160
|
+
end
|
161
|
+
|
162
|
+
def next_year
|
163
|
+
advance(:years => 1)
|
164
|
+
end
|
165
|
+
|
166
|
+
def last_year
|
167
|
+
advance(:years => -1)
|
168
|
+
end
|
169
|
+
|
170
|
+
def next_month
|
171
|
+
advance(:months => 1)
|
172
|
+
end
|
173
|
+
|
174
|
+
def last_month
|
175
|
+
advance(:months => -1)
|
176
|
+
end
|
177
|
+
|
178
|
+
def next_week
|
179
|
+
advance(:weeks => 1)
|
180
|
+
end
|
181
|
+
|
182
|
+
def last_week
|
183
|
+
advance(:weeks => -1)
|
184
|
+
end
|
185
|
+
|
32
186
|
end
|
data/lib/small/units.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: small
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
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-04
|
12
|
+
date: 2012-05-04 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email: bryann83@gmail.com
|
@@ -20,12 +20,14 @@ files:
|
|
20
20
|
- README.md
|
21
21
|
- LICENSE
|
22
22
|
- lib/small/array.rb
|
23
|
+
- lib/small/benchmark.rb
|
23
24
|
- lib/small/hash.rb
|
24
25
|
- lib/small/integer.rb
|
25
26
|
- lib/small/math.rb
|
26
27
|
- lib/small/object.rb
|
27
28
|
- lib/small/string.rb
|
28
29
|
- lib/small/time.rb
|
30
|
+
- lib/small/units.rb
|
29
31
|
- lib/small.rb
|
30
32
|
homepage: https://github.com/bry4n/small
|
31
33
|
licenses: []
|