richunits 0.2.0 → 0.5.0

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.
@@ -1,99 +0,0 @@
1
- # TITLE:
2
- #
3
- # Multipliers
4
- #
5
- # DESCRIPTION:
6
- #
7
- # Adds methods to Numeric to make working with
8
- # magnitudes (kilo, mega, giga, milli, micro, etc.)
9
- # as well as bits and bytes easier.
10
- #
11
- # COPYRIGHT:
12
- #
13
- # Copyright (c) 2005 Thomas Sawyer
14
- #
15
- # LICENSE:
16
- #
17
- # Ruby License
18
- #
19
- # This module is free software. You may use, modify, and/or redistribute this
20
- # software under the same terms as Ruby.
21
- #
22
- # This program is distributed in the hope that it will be useful, but WITHOUT
23
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
24
- # FOR A PARTICULAR PURPOSE.
25
- #
26
- # HISTORY:
27
- #
28
- # Thanks to Rich Kilmer and bytes.rb which inspired this library.
29
- #
30
- # AUTHORS:
31
- #
32
- # - Thomas Sawyer
33
- #
34
- # NOTES:
35
- #
36
- # - This library is not compatible with STICK's units.rb (an spin-off
37
- # of Facets old units.rb library). Do not attempt to use both at the same time.
38
-
39
-
40
- # = Multipliers
41
- #
42
- # Adds methods to Numeric to make working with
43
- # magnitudes (kilo, mega, giga, milli, micro, etc.)
44
- # as well as bits and bytes easier.
45
- #
46
- # 1.kilo #=> 1000
47
- # 1.milli #=> 0.001
48
- # 1.kibi #=> 1024
49
- #
50
- # To display a value in a certain denomination, simply
51
- # perform the inverse operation by placing the
52
- # multiplier called on unit (1) in the denominator.
53
- #
54
- # 1000 / 1.kilo #=> 1
55
- # 1024 / 1.kibi #=> 1
56
- #
57
-
58
- class Numeric
59
-
60
- # SI Multipliers
61
-
62
- def deka ; self * 10 ; end
63
- def hecto ; self * 100 ; end
64
- def kilo ; self * 1000 ; end
65
- def mega ; self * 1000000 ; end
66
- def giga ; self * 1000000000 ; end
67
- def tera ; self * 1000000000000 ; end
68
- def peta ; self * 1000000000000000 ; end
69
- def exa ; self * 1000000000000000000 ; end
70
-
71
- # SI Fractional
72
-
73
- def deci ; self.to_f / 10 ; end
74
- def centi ; self.to_f / 100 ; end
75
- def milli ; self.to_f / 1000 ; end
76
- def micro ; self.to_f / 1000000 ; end
77
- def nano ; self.to_f / 1000000000 ; end
78
- def pico ; self.to_f / 1000000000000 ; end
79
- def femto ; self.to_f / 1000000000000000 ; end
80
- def atto ; self.to_f / 1000000000000000000 ; end
81
-
82
- # SI Binary
83
-
84
- def kibi ; self * 1024 ; end
85
- def mebi ; self * 1024**2 ; end
86
- def gibi ; self * 1024**3 ; end
87
- def tebi ; self * 1024**4 ; end
88
- def pebi ; self * 1024**5 ; end
89
- def exbi ; self * 1024**6 ; end
90
-
91
- # Bits and Bytes
92
-
93
- def bit ; self ; end
94
- def bits ; self ; end
95
- def byte ; self * 8 ; end
96
- def bytes ; self * 8 ; end
97
-
98
- end
99
-
@@ -1,388 +0,0 @@
1
- # TITLE:
2
- #
3
- # Times
4
- #
5
- # DESCRIPTION:
6
- #
7
- # Plain-English convenience methods for dealing with dates and times.
8
- #
9
- # COPYRIGHT:
10
- #
11
- # Copyright (c) 2005 Rich Kilmer, Thomas Sawyer
12
- #
13
- # LICENSE:
14
- #
15
- # Ruby License
16
- #
17
- # This module is free software. You may use, modify, and/or redistribute this
18
- # software under the same terms as Ruby.
19
- #
20
- # This program is distributed in the hope that it will be useful, but WITHOUT
21
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22
- # FITNESS FOR A PARTICULAR PURPOSE.
23
- #
24
- # HISTORY:
25
- #
26
- # Thanks to Richard Kilmer for the orignal work and Alexander Kellett
27
- # for suggesting it for Facets.
28
- #
29
- # Thanks to Dave Hoover and Ryan Platte for the Weekdays implementation.
30
- #
31
- # AUTHORS:
32
- #
33
- # - Rich Kilmer
34
- # - Thomas Sawyer
35
- # - Dave Hoover
36
- # - Ryan Platte
37
- # - George Moschovitis
38
- #
39
- # NOTES:
40
- #
41
- # - This library is not compatible with STICK's units.rb (an spin-off
42
- # of Facets old units.rb library). Do not attempt to use both at the same time.
43
- #
44
- # TODOs:
45
- #
46
- # TODO Extra Add in_* methods, like in_days, in_hours, etc.
47
-
48
- require 'facets/time/change'
49
- require 'facets/time/set'
50
- require 'facets/time/ago'
51
- require 'facets/time/hence'
52
-
53
- require 'rich_units/weekdays'
54
-
55
- class Time
56
-
57
- NEVER = Time.mktime(2038)
58
- ZERO = Time.mktime(1972)
59
-
60
- # This method calculates the days extrema given two time objects.
61
- # start time is the given time1 at 00:00:00
62
- # end time is the given time2 at 23:59:59:999
63
- #
64
- # Input:
65
- # - the two times (if only time1 is provided then you get an extrema
66
- # of exactly one day extrema.
67
- #
68
- # Output:
69
- # - the time range. you can get the start/end times using
70
- # range methods.
71
- #
72
- # CREDIT George Moschovitis
73
-
74
- def self.days_extrema(time1, time2=nil)
75
- time2 = time1 if (not time2.valid? Time)
76
- time2 = NEVER if (time2 <= time1)
77
- start_time = Time.self.start_of_day(time1)
78
- end_time = self.end_of_day(time2)
79
- return (start_time..end_time)
80
- end
81
-
82
- # Seconds since midnight: Time.now.seconds_since_midnight
83
-
84
- def seconds_since_midnight
85
- self.hour.hours + self.min.minutes + self.sec + (self.usec/1.0e+6)
86
- end
87
-
88
- # Returns a new Time representing the time a number of seconds ago.
89
- # Do not use this method in combination with x.months, use months_ago instead!
90
- #def ago(seconds)
91
- # # This is basically a wrapper around the Numeric extension.
92
- # #seconds.until(self)
93
- # self - seconds
94
- #end
95
-
96
- # Returns a new Time representing the time
97
- # a number of minutes ago.
98
-
99
- def minutes_ago(minutes)
100
- self - (minutes * 60)
101
- end
102
-
103
- # Returns a new Time representing the time
104
- # a number of hours ago.
105
-
106
- def hours_ago(hours)
107
- self - (hours * 3600)
108
- end
109
-
110
- # Returns a new Time representing the time
111
- # a number of days ago.
112
-
113
- def days_ago(days)
114
- self - (days * 86400)
115
- end
116
-
117
- # Returns a new Time representing the time
118
- # a number of weeks ago.
119
-
120
- def weeks_ago(weeks)
121
- self - (weeks * 604800)
122
- end
123
-
124
- # Returns a new Time representing the time
125
- # a number of months ago.
126
-
127
- def months_ago(months)
128
- years = (month - months / 12).to_i
129
- set(:year=>(year - years), :month=>(month - months) % 12)
130
- end
131
-
132
- # Returns a new Time representing the time a number of specified
133
- # months ago.
134
- #def months_ago(months)
135
- # if months >= self.month
136
- # change(:year => self.year - 1, :month => 12).months_ago(months - self.month)
137
- # else
138
- # change(:year => self.year, :month => self.month - months)
139
- # end
140
- #end
141
-
142
- # Returns a new Time representing the time
143
- # a number of years ago.
144
-
145
- def years_ago(years)
146
- set(:year=>(year - years))
147
- end
148
-
149
- # Returns a new Time representing the time a number of specified
150
- # years ago.
151
- #def years_ago(years)
152
- # change(:year => self.year - years)
153
- #end
154
-
155
- # Returns a new Time representing the time
156
- # a number of minutes hence.
157
-
158
- def minutes_hence(minutes)
159
- self + (minutes * 60)
160
- end
161
-
162
- # Returns a new Time representing the time
163
- # a number of hours hence.
164
-
165
- def hours_hence(hours)
166
- self + (hours * 3600)
167
- end
168
-
169
- # Returns a new Time representing the time
170
- # a number of days hence.
171
-
172
- def days_hence(days)
173
- self + (days * 86400)
174
- end
175
-
176
- # Returns a new Time representing the time
177
- # a number of weeks hence.
178
-
179
- def weeks_hence(weeks)
180
- self + (weeks * 604800)
181
- end
182
-
183
- # Returns a new Time representing the time
184
- # a number of months hence.
185
-
186
- def months_hence(months)
187
- years = (month + months / 12).to_i
188
- set(:year=>(year + years), :month=>(month + months) % 12)
189
- end
190
-
191
- #def months_hence(months)
192
- # if months + self.month > 12
193
- # change(:year => self.year + 1, :month => 1).months_since(months - (self.month == 1 ? 12 : (self.month + 1)))
194
- # else
195
- # change(:year => self.year, :month => self.month + months)
196
- # end
197
- #end
198
-
199
- # Returns a new Time representing the time
200
- # a number of years hence.
201
-
202
- def years_hence(years)
203
- set(:year=>(year + years))
204
- end
205
-
206
- # Returns a new Time representing the time a number of seconds
207
- # since the instance time. Do not use this method in combination
208
- # with x.months, use months_since instead!
209
- alias_method :since, :hence
210
-
211
- alias_method :minutes_since, :minutes_hence
212
- alias_method :days_since, :days_hence
213
- alias_method :weeks_since, :weeks_hence
214
- alias_method :months_since, :months_hence
215
- alias_method :years_since, :years_hence
216
-
217
- #def years_since(years)
218
- # change(:year => self.year + years)
219
- #end
220
-
221
- # Short-hand for years_ago(1)
222
- def last_year
223
- years_ago(1)
224
- end
225
-
226
- # Short-hand for years_since(1)
227
- def next_year
228
- years_since(1)
229
- end
230
-
231
- # Short-hand for months_ago(1)
232
- def last_month
233
- months_ago(1)
234
- end
235
-
236
- # Short-hand for months_since(1)
237
- def next_month
238
- months_since(1)
239
- end
240
-
241
- # Returns a new Time representing the "start" of this week (Monday, 0:00)
242
- def beginning_of_week
243
- (self - self.wday.days).midnight + 1.day
244
- end
245
- alias :monday :beginning_of_week
246
- alias :at_beginning_of_week :beginning_of_week
247
-
248
- # Returns a new Time representing the start of the given
249
- # day in next week (default is Monday).
250
- def next_week(day = :monday)
251
- days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2,
252
- :thursday => 3, :friday => 4, :saturday => 5,
253
- :sunday => 6 }
254
- since(1.week).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
255
- end
256
-
257
- # Set time to end of day
258
- #def end_of_day
259
- # return Time.mktime(year, month, day, 23, 59, 59, 999)
260
- #end
261
-
262
- # Returns a new Time representing the start of the day (0:00)
263
- def beginning_of_day
264
- self - self.seconds_since_midnight
265
- end
266
- alias :midnight :beginning_of_day
267
- alias :at_midnight :beginning_of_day
268
- alias :at_beginning_of_day :beginning_of_day
269
- alias :start_of_day :beginning_of_day
270
-
271
- # Returns a new Time representing the start of the month
272
- # (1st of the month, 0:00)
273
- def beginning_of_month
274
- #self - ((self.mday-1).days + self.seconds_since_midnight)
275
- change(:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
276
- end
277
- alias_method :at_beginning_of_month, :beginning_of_month
278
-
279
- # Returns a new Time representing the start of the year (1st of january, 0:00)
280
- def beginning_of_year
281
- change(:month => 1,:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
282
- end
283
- alias :at_beginning_of_year :beginning_of_year
284
-
285
- # Convenience method which returns a new Time representing
286
- # the time 1 day ago
287
- def yesterday
288
- self.ago(1.day)
289
- end
290
-
291
- # Convenience method which returns a new Time representing
292
- # the time 1 day since the instance time
293
- def tomorrow
294
- self.since(1.day)
295
- end
296
-
297
- # Returns a new time at start of day
298
- def to_start_of_day
299
- return Time.mktime(year, month, day, 0, 0, 0, 0)
300
- end
301
-
302
- # Returns a new time at end of day
303
- def to_end_of_day
304
- Time.mktime(year, month, day, 23, 59, 59, 999)
305
- end
306
-
307
- # Returns true only if day of time is included in the
308
- # range (stime..etime). Only year days are checked.
309
- def in_day_range?(stime=ZERO, etime=NEVER)
310
- if (etime <= stime)
311
- warn "invalid end time (#{etime} < #{stime})" if $DEBUG
312
- etime = NEVER
313
- end
314
-
315
- stime = stime.to_start_of_day
316
- etime = etime.to_end_of_day
317
-
318
- return (stime..etime).include?(time)
319
- end
320
- end
321
-
322
-
323
- class Numeric
324
-
325
- # Enables the use of time calculations and declarations,
326
- # like 45.minutes + 2.hours + 4.years. The base unit for
327
- # all of these Numeric time methods is seconds.
328
- def seconds ; self ; end
329
- alias_method :second, :seconds
330
- #def as_seconds ; self ; end
331
-
332
- # Converts minutes into seconds.
333
- def minutes ; self * 60 ; end
334
- alias_method :minute, :minutes
335
- #def as_minutes ; self.to_f / 60 ; end
336
-
337
- # Converts hours into seconds.
338
- def hours ; self * 60.minutes ; end
339
- alias_method :hour, :hours
340
- #def as_hours ; self / 60.minutes ; end
341
-
342
- # Converts days into seconds.
343
- def days ; self * 24.hours ; end
344
- alias_method :day, :days
345
- #def as_days ; self / 24.hours ; end
346
-
347
- # Converts weeks into seconds.
348
- def weeks ; self * 7.days ; end
349
- alias_method :week, :weeks
350
- #def as_weeks ; self / 7.days ; end
351
-
352
- # Converts fortnights into seconds.
353
- # (A fortnight is 2 weeks)
354
- def fortnights ; self * 2.weeks ; end
355
- alias_method :fortnight, :fortnights
356
- #def as_fortnights ; self / 2.weeks ; end
357
-
358
- # Converts months into seconds.
359
- # WARNING: This is not exact as it assumes 30 days to a month.
360
- def months ; self * 30.days ; end
361
- alias_method :month, :months
362
- #def as_months ; self / 30.days ; end
363
-
364
- # Converts years into seconds.
365
- def years ; self * 365.days ; end
366
- alias_method :year, :years
367
- #def as_years ; self / 365.days ; end
368
-
369
- # Calculates time _before_ a given time. Default time is now.
370
- # Reads best with arguments: 10.days.before( Time.now - 1.day )
371
- def before(time = ::Time.now)
372
- time - self
373
- end
374
- alias_method :until, :before # Reads best with argument: 10.minutes.until(time)
375
- alias_method :ago, :before # Reads best without arguments: 10.minutes.ago
376
-
377
- # Calculates time _after_ a given time. Default time is now.
378
- # Reads best with argument: 10.minutes.after(time)
379
- def after(time = ::Time.now)
380
- time + self
381
- end
382
- alias_method :since, :after # Reads best with argument: 10.minutes.since(time)
383
- alias_method :hence, :after # Reads best with argument: 10.minutes.since(time)
384
- alias_method :from_now, :after # Reads best without arguments: 10.minutes.from_now
385
- alias_method :later, :after # Reads best without arguments: 10.minutes.later
386
-
387
- end
388
-