small 0.3 → 0.4
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/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: []
|