Class: SafeDb::KeyNow

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/keytools/key.now.rb

Overview

This stamp sits at the centre of a fundamental DevOps pattern concerned with infrastructure provisioning and configuraion management.

The central idea behind the pattern is to link every infrastructure object created during a session with a reference accurate to the nearest centi-second denoting the moment the software runtime (session) began.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeKeyNow

This singleton (one instance) class sets the time just once.



400
401
402
# File 'lib/keytools/key.now.rb', line 400

def initialize
  @time_now = Time.now;
end

Instance Attribute Details

#time_nowObject (readonly)

Returns the value of attribute time_now.



16
17
18
# File 'lib/keytools/key.now.rb', line 16

def time_now
  @time_now
end

Class Method Details

.dddObject

Return three character abbreviated day of week.

Examples:

tue => on Tuesday




38
39
40
# File 'lib/keytools/key.now.rb', line 38

def self.ddd
  return KeyNow.instance.time_now.strftime( "%a" ).downcase
end

.fetchString

Fetch the double barreled time stamp that is an amalgam of the human readable time now and a machine time representation from the moment this class was initialized.

See the yyjjj_hhmm_ss_nanosec method for documentation of the nanosecond accurate time stamp.

Returns:

  • (String)

    the double barreled time stamp containing a human readable (right this moment) time and a class initialized time representation with nanosecond accuracy.



339
340
341
# File 'lib/keytools/key.now.rb', line 339

def self.fetch
  return "#{Time.now.ctime} ( #{yyjjj_hhmm_ss_nanosec} )"
end

.grabString

Grab the double barreled time stamp that is an amalgam of the human readable time now and a machine time representation from the moment this class was initialized.

On Friday June the 8th at about 6:26 pm.
Fri Jun 8 18:26:17 2018 ( 18159.1826.138 )

See the yyjjj_hhmm_sst method for documentation of stamp that is accurate to the tenth of a second.

Returns:

  • (String)

    the double barreled time stamp containing a human readable (right this moment) time and a class initialized time representation with tenth of a second accuracy.



358
359
360
361
362
# File 'lib/keytools/key.now.rb', line 358

def self.grab
  time_with_consecutive_spaces = Time.now.ctime
  human_readable_str = time_with_consecutive_spaces.gsub( "  ", " " )
  return "#{human_readable_str} ( #{yyjjj_hhmm_sst} )"
end

.hhObject

Return two digit (character) hour of day from 00 to 23.

Examples:

22 => between 22.00.00 and 22.59.59 inclusive




47
48
49
# File 'lib/keytools/key.now.rb', line 47

def self.hh
  return KeyNow.instance.time_now.strftime "%H"
end

.hhmmObject

Return the 4 digit amalgam of the hour and minute using the 24 hour clock.

Examples:

=> 1525
=> 03:25 pm


224
225
226
# File 'lib/keytools/key.now.rb', line 224

def self.hhmm
  return "#{hh}#{mm}"
end

.hhmm_sstObject

Return the time of day to a TENTH of a second accuracy.

8

characters will always be returned with the 5th one

being the (period) separator.

The first (separated) segment delivers a hhmm 24 hour clock representation of the stamped time.

The 3 digits of the second segment comprise of

second of minute => 2 digits | [00] to [59]
tenth of second  => 1 digit from [0] to [9]

Examples:

=> The time at the 562nd millisecond  of the 49th
   second of the 23rd minute of the 17th hour of
   the day ( 17:23:49.562 )

=> 8 chars
=> 1723.495


250
251
252
# File 'lib/keytools/key.now.rb', line 250

def self.hhmm_sst
  return "#{hhmm}.#{sst}"
end

.human_readableString

Fetch the human readable time stamp.

Returns:

  • (String)

    the human readable timestamp



323
324
325
# File 'lib/keytools/key.now.rb', line 323

def self.human_readable
  return "#{Time.now.ctime} #{yyjjj_hhmm_sst}"
end

.jjjObject

————————————————- – # Return 3 digit julian day of year [001] to [366]. – # ————————————————- – #



122
123
124
# File 'lib/keytools/key.now.rb', line 122

def self.jjj
  return KeyNow.instance.time_now.strftime "%j"
end

.log_instance_timeObject

TODO:

move method contents into test class

Log segments of time pertaining to the time stamp.



374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
# File 'lib/keytools/key.now.rb', line 374

def self.log_instance_time

  log.info(x) { "[stamp] -------------- => -------------------------------- #" }
  log.info(x) { "[stamp] eco time stamp => [#{KeyNow.instance.time_now.ctime}]" }
  log.info(x) { "[stamp] -------------- => -------------------------------- #" }
  log.info(x) { "[stamp] Univ Time Zone => #{zone}"  }
  log.info(x) { "[stamp] Month Index is => #{mo}"    }
  log.info(x) { "[stamp] Month Name is  => #{mmm}"   }
  log.info(x) { "[stamp] Day Of Week is => #{ddd}"   }
  log.info(x) { "[stamp] -------------- => -------------------------------- #" }
  log.info(x) { "[stamp] Two Digit Year => #{yy}"    }
  log.info(x) { "[stamp] Julian Cal Day => #{jjj}"   }
  log.info(x) { "[stamp] Yr and Jul Day => #{yyjjj}" }
  log.info(x) { "[stamp] Hour of Theday => #{hh}"    }
  log.info(x) { "[stamp] Minute of Hour => #{mm}"    }
  log.info(x) { "[stamp] Hour + Minute  => #{hhmm}"  }
  log.info(x) { "[stamp] Second of Min  => #{ss}"    }
  log.info(x) { "[stamp] 600 Min Slices => #{sst}"   }
  log.info(x) { "[stamp] -------------- => -------------------------------- #" }
  log.info(x) { "[stamp] The Time Stamp => #{yyjjj_hhmm_sst}" }
  log.info(x) { "[stamp] -------------- => -------------------------------- #" }

end

.mmObject

Return two digit minute of hour from [00] to [59].



55
56
57
# File 'lib/keytools/key.now.rb', line 55

def self.mm
  return KeyNow.instance.time_now.strftime "%M"
end

.mmmObject

Return three character abbreviated month name.

Examples:

feb => in February




29
30
31
# File 'lib/keytools/key.now.rb', line 29

def self.mmm
  return KeyNow.instance.time_now.strftime( "%b" ).downcase
end

.moObject

Return two digit [mo] month index from 01 to 12.

Examples:

02 => in February




21
22
23
# File 'lib/keytools/key.now.rb', line 21

def self.mo
  return KeyNow.instance.time_now.strftime "%m"
end

.previous_month_chars(this_month_index, this_4digit_year) ⇒ Object

Given two integer parameters (month index and 4 digit year) representing the month in question this method returns the [PREVIOUS MONTHS] character amalgam in the format [yymo_mmm] where

=> yy  | previous month's two-digit year
=> mo  | previous month's two-digit month index
=> .   | a period (separator)
=> mmm | previous month's abbreviated month name

Example 1 (Simple)


returns char => 1907.jul
4 parameters => 8, 2019
representing => August, 2019

Example 2 (Last Year)


returns char => 1812.dec
4 parameters => 1, 2019
representing => January, 2019


169
170
171
172
173
174
175
176
177
178
179
# File 'lib/keytools/key.now.rb', line 169

def self.previous_month_chars this_month_index, this_4digit_year

  prev_month_index = this_month_index == 1 ? 12 : ( this_month_index - 1 )
  prev_2dig_mn_pad = sprintf '%02d', prev_month_index
  prev_4digit_year = this_month_index == 1 ? ( this_4digit_year - 1 ) : this_4digit_year
  prev_twodigit_yr = "#{prev_4digit_year.to_s}"[2..-1]
  prev_months_name = Date::ABBR_MONTHNAMES[prev_month_index].downcase

  return "#{prev_twodigit_yr}#{prev_2dig_mn_pad}.#{prev_months_name}"

end

.ssObject

Return two digit second of minute from [00] to [59].



63
64
65
# File 'lib/keytools/key.now.rb', line 63

def self.ss
  return KeyNow.instance.time_now.strftime "%S"
end

.sstObject

Return a [3 digit] second and tenth of second representation.

The final digit is derived from the 1000 sliced millisecond of second running from 000 to 999.

Truncation (Not Rounding)

The [final] digit is acquired by TRUNCATING (chopping off) the last 2 of the 3 millisecond digits. No rounding is applied.

The 3 returned digits comprise of the

  • second of minute => 2 digits | [00] to [59] (and)

  • tenth of second => 1 digit from [0] to [9]

Examples:


=> The time at the 562nd millisecond  of the 49th
   second of the minute.

=> 3 chars
=> 495


95
96
97
98
# File 'lib/keytools/key.now.rb', line 95

def self.sst
  millisec_string = KeyNow.instance.time_now.strftime "%L"
  return "#{ss}#{millisec_string[0]}"
end

.yyObject

Return the [two] digit year (eg 19 for 2019). that we are currently in.



105
106
107
# File 'lib/keytools/key.now.rb', line 105

def self.yy
  return KeyNow.instance.time_now.strftime("%Y")[2..-1]
end

.yyjjjObject

Return 5 digit amalgam of year and julian day.

eg [19003] for [January 3rd 2019]


212
213
214
# File 'lib/keytools/key.now.rb', line 212

def self.yyjjj
  return "#{yy}#{jjj}"
end

.yyjjj_hhmm_ss_nanosecString

Return a string timestampt that is a period separated amalgam of the 2 digit year, 3 digit julian day, 2 digit hour, 2 digit minute, 2 digit second and 9 digit nanosecond.

As per the above example, the time returned

  • is the 836592034 nanosecond

  • of the 42nd second

  • of the 25th minute

  • of the 17th hour

  • of the 3rd day

  • of the 20th year

  • of the 21st century

Examples:

return  => 19003.1725.42.836592034
4 time  => 17:25:42 am on January 3rd 2019

Returns:

  • (String)

    Return the time of day to nanosecond accuracy. 23 characters are always returned with three (3) period separators at the 6th, 11th and 14th positions.



313
314
315
316
# File 'lib/keytools/key.now.rb', line 313

def self.yyjjj_hhmm_ss_nanosec
  nanosec_str = KeyNow.instance.time_now.strftime "%9N"
  return "#{yyjjj}.#{hhmm}.#{ss}.#{nanosec_str}"
end

.yyjjj_hhmm_sstObject

Return a string timestampt that is a period separated amalgam of the 2 digit year, 3 digit julian day, 2 digit hour, 2 digit minute, 2 digit second and 1 digit rounded down tenth of second.

Return the time of day to a TENTH of a second accuracy.

8

characters will always be returned with the 5th one

being the (period) separator.

The first (separated) segment delivers a hhmm 24 hour clock representation of the stamped time.

The 3 digits of the second segment comprise of

  • second of minute => 2 digits | [00] to [59]

  • tenth of second => 1 digit from [0] to [9]

Examples:

=> 19003.1025
=> 10:25 am on January 3rd 2019
=> The time at the 562nd millisecond  of the 49th
   second of the 23rd minute of the 17th hour of
   the day ( 17:23:49.562 )

=> 8 chars
=> 1723.495


285
286
287
# File 'lib/keytools/key.now.rb', line 285

def self.yyjjj_hhmm_sst
  return "#{yyjjj}.#{hhmm}.#{sst}"
end

.yymo_mmmObject

yymo_mmm

returns an amalgam of

=> the two-digit year
=> the two-digit month index (starting at 01)
=> a period (separator)
=> the abbreviated month name

Examples:

=> 1908.aug
=> for August 2019


138
139
140
# File 'lib/keytools/key.now.rb', line 138

def self.yymo_mmm
  return "#{yy}#{mo}.#{mmm}"
end

.yymo_mmm_prevObject

Using the current class time this method returns the character amalgam for the [PREVIOUS MONTH] in the format [yymo_mmm] where

=> yy  | last month's two-digit year
=> mo  | last month's two-digit month index
=> .   | a period (separator)
=> mmm | last month's abbreviated month name

Example 1 (Simple)


returns => 1907.jul
if this month is => August 2019

Example 2 (Last Year)


returns => 1812.dec
if this month is => January 2019


205
206
207
# File 'lib/keytools/key.now.rb', line 205

def self.yymo_mmm_prev
  return previous_month_chars mo.to_i, yyyy.to_i
end

.yyyyObject

Return the [four] digit year (eg 2019) that we are currently in.



114
115
116
# File 'lib/keytools/key.now.rb', line 114

def self.yyyy
  return KeyNow.instance.time_now.strftime("%Y")
end

.zoneObject

Return the Rubyfied time zone being used.



366
367
368
# File 'lib/keytools/key.now.rb', line 366

def self.zone
  return KeyNow.instance.time_now.zone
end