Module: AIXM::Refinements
- Defined in:
- lib/aixm/refinements.rb
Constant Summary collapse
- UPTRANS_FILTER =
%r( [^A-Z0-9, !"&#$%'\(\)\*\+\-\./:;<=>\[email protected]\[\\\]\^_\|\{\}] )x.freeze
- UPTRANS_MAP =
{ 'Ä' => 'AE', 'Ö' => 'OE', 'Ü' => 'UE', 'Æ' => 'AE', 'Œ' => 'OE', "Å" => "Aa", "Ø" => "Oe" }.freeze
Instance Method Summary collapse
-
#decapture ⇒ Object
Replace all groups with non-caputuring groups.
-
#indent(number) ⇒ String
Indent every line of a string with
number
spaces. -
#inflect ⇒ Object
Apply inflections from the
dry-inflector
gem. -
#lookup(key_or_value, fallback = omitted=true) ⇒ Object
Fetch a value from the hash, but unlike Hash#fetch, if
key_or_value
is no hash key, check whetherkey_or_value
is a hash value and if so return it. -
#then_if ⇒ Object
Same as Object#then but only applied if the condition is true.
-
#to_class ⇒ Object
Convert string to class.
-
#to_dd ⇒ Float
Convert DMS angle to DD or
nil
if the notation is not recognized. -
#to_digest ⇒ String
Builds a 4 byte hex digest from the Array payload.
-
#to_dms(padding = 3) ⇒ String
Convert DD angle to DMS with the degrees zero padded to
padding
length. -
#to_rad ⇒ Float
Convert an angle from degree to radian.
-
#to_time ⇒ Time
Parse string to date and time.
-
#trim ⇒ Integer, Float
Convert whole numbers to Integer and leave all other untouched.
-
#uptrans ⇒ String
Upcase and transliterate to match the reduced character set for AIXM names and titles.
Instance Method Details
#decapture ⇒ Object
This is a refinement for Regexp
Replace all groups with non-caputuring groups
143 144 145 146 147 |
# File 'lib/aixm/refinements.rb', line 143 refine Regexp do def decapture Regexp.new(to_s.gsub(/\(\?<\w+>|(?<![^\\]\\)\((?!\?)/, '(?:')) end end |
#indent(number) ⇒ String
This is a refinement for String
Indent every line of a string with number
spaces.
191 192 193 194 195 196 |
# File 'lib/aixm/refinements.rb', line 191 refine String do def indent(number) whitespace = ' ' * number gsub(/^/, whitespace) end end |
#inflect ⇒ Object
This is a refinement for String
Apply inflections from the dry-inflector
gem
173 174 175 176 177 178 179 |
# File 'lib/aixm/refinements.rb', line 173 refine String do def inflect(*inflections) inflections.inject(self) do |memo, inflection| AIXM.config.inflector.send(inflection, memo) end end end |
#lookup(key_or_value, fallback = omitted=true) ⇒ Object
This is a refinement for Hash
Fetch a value from the hash, but unlike Hash#fetch, if key_or_value
is no hash key, check whether key_or_value
is a hash value and if so return it.
113 114 115 116 117 118 119 |
# File 'lib/aixm/refinements.rb', line 113 refine Hash do def lookup(key_or_value, fallback=omitted=true) self[key_or_value] || (key_or_value if has_value?(key_or_value)) || (omitted ? fail(KeyError, "key or value `#{key_or_value}' not found") : fallback) end end |
#then_if ⇒ Object
This is a refinement for Object
Same as Object#then but only applied if the condition is true.
130 131 132 133 134 |
# File 'lib/aixm/refinements.rb', line 130 refine Object do def then_if(condition, &block) condition ? self.then(&block) : self end end |
#to_class ⇒ Object
This is a refinement for String
Convert string to class
157 158 159 160 161 |
# File 'lib/aixm/refinements.rb', line 157 refine String do def to_class Object.const_get(self) end end |
#to_dd ⇒ Float
This is a refinement for String
Convert DMS angle to DD or nil
if the notation is not recognized.
Supported notations:
-
{-}{DD}D°MM'SS{.SS}“{[NESW]}
-
{-}{DD}D MM SS{.SS} {[NESW]}
Quite a number of typos are tolerated such as the wrong use of minute ' and second “ markers as well as the use of decimal comma , instead of dot .
.
220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/aixm/refinements.rb', line 220 refine String do def to_dd if match = self.match(DMS_RE) "#{match['sgn']}1".to_i * "#{:- if match['hem_sw']}1".to_i * ( match['deg'].to_f + match['min'].to_f/60 + match['sec'].tr(',', '.').to_f/3600 ) end end end |
#to_digest ⇒ String
This is a refinement for Array
Builds a 4 byte hex digest from the Array payload.
27 28 29 30 31 |
# File 'lib/aixm/refinements.rb', line 27 refine Array do def to_digest ::Digest::SHA512.hexdigest(flatten.map(&:to_s).join('|'))[0, 8] end end |
#to_dms(padding = 3) ⇒ String
This is a refinement for Float
Convert DD angle to DMS with the degrees zero padded to padding
length.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/aixm/refinements.rb', line 46 refine Float do def to_dms(padding=3) degrees = self.abs.floor minutes = ((self.abs - degrees) * 60).floor seconds = (self.abs - degrees - minutes.to_f / 60) * 3600 minutes, seconds = minutes + 1, 0 if seconds.round(2) == 60 degrees, minutes = degrees + 1, 0 if minutes == 60 %Q(%s%0#{padding}d°%02d'%05.2f") % [ ('-' if self.negative?), self.abs.truncate, minutes.abs.truncate, seconds.abs ] end end |
#to_rad ⇒ Float
This is a refinement for Float
Convert an angle from degree to radian.
71 72 73 74 75 |
# File 'lib/aixm/refinements.rb', line 71 refine Float do def to_rad self * Math::PI / 180 end end |
#to_time ⇒ Time
This is a refinement for String
Parse string to date and time.
241 242 243 244 245 |
# File 'lib/aixm/refinements.rb', line 241 refine String do def to_time Time.parse(self) end end |
#trim ⇒ Integer, Float
This is a refinement for Float
Convert whole numbers to Integer and leave all other untouched.
88 89 90 91 92 |
# File 'lib/aixm/refinements.rb', line 88 refine Float do def trim (self % 1).zero? ? self.to_i : self end end |
#uptrans ⇒ String
This is a refinement for String
Upcase and transliterate to match the reduced character set for AIXM names and titles.
See UPTRANS_MAP for supported diacryts and UPTRANS_FILTER for the list of allowed characters in the returned value.
262 263 264 265 266 267 268 269 270 271 |
# File 'lib/aixm/refinements.rb', line 262 refine String do def uptrans self.dup.tap do |string| string.upcase! string.gsub!(/(#{UPTRANS_MAP.keys.join('|')})/, UPTRANS_MAP) string.unicode_normalize!(:nfd) string.gsub!(UPTRANS_FILTER, '') end end end |