Module: AIXM::Refinements
- Defined in:
- lib/aixm/refinements.rb
Constant Summary collapse
- UPTRANS_FILTER =
%r( [^A-Z0-9, !"&#$%'\(\)\*\+\-\./:;<=>\?@\[\\\]\^_\|\{\}] )x.freeze
- UPTRANS_MAP =
{ 'Ä' => 'AE', 'Ö' => 'OE', 'Ü' => 'UE', 'Æ' => 'AE', 'Œ' => 'OE', "Å" => "Aa", "Ø" => "Oe" }.freeze
- PRETTY_XSLT =
<<~END.then { Nokogiri::XSLT(_1) } <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet> END
Instance Method Summary collapse
-
#compact ⇒ String
Collapse whitespace to one space, but leave
\n
untouched, then strip what’s left. -
#decapture ⇒ Regexp
Replace all groups with non-caputuring groups.
-
#dress ⇒ String
Prepends and appends the given
string
after strippingself
. -
#indent(number) ⇒ String
Indent every line of a string with
number
spaces. -
#inflect ⇒ String
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. -
#singleton_class ⇒ Range
Returns a Range covering the given object.
-
#then_if ⇒ Object
Same as Object#then but only applied if the condition is true.
-
#to_class ⇒ Class
Convert string to class.
-
#to_dd ⇒ Float
Convert DMS angle to DD or
nil
if the notation is not recognized. -
#to_deg ⇒ Float
Convert an angle from radian to degrees.
-
#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_pretty_xml ⇒ String
Pretty printing alternative of
to_xml
. -
#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
#compact ⇒ String
This is a refinement for String
Collapse whitespace to one space, but leave \n
untouched, then strip what’s left.
286 287 288 289 290 |
# File 'lib/aixm/refinements.rb', line 286 refine String do def compact split("\n").map { _1.gsub(/\s+/, ' ') }.join("\n").strip end end |
#decapture ⇒ Regexp
This is a refinement for Regexp
Replace all groups with non-caputuring groups
221 222 223 224 225 |
# File 'lib/aixm/refinements.rb', line 221 refine Regexp do def decapture Regexp.new(to_s.gsub(/\(\?<\w+>|(?<![^\\]\\)\((?!\?)/, '(?:')) end end |
#dress ⇒ String
This is a refinement for String
Prepends and appends the given string
after stripping self
. Quite the contrary of strip
, hence the name.
237 238 239 240 241 |
# File 'lib/aixm/refinements.rb', line 237 refine String do def dress(padding=' ') [padding, strip, padding].join end end |
#indent(number) ⇒ String
This is a refinement for String
Indent every line of a string with number
spaces.
302 303 304 305 306 307 |
# File 'lib/aixm/refinements.rb', line 302 refine String do def indent(number) whitespace = ' ' * number gsub(/^/, whitespace) end end |
#inflect ⇒ String
This is a refinement for String
Apply inflections from the dry-inflector
gem
269 270 271 272 273 274 275 |
# File 'lib/aixm/refinements.rb', line 269 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.
139 140 141 142 143 144 145 |
# File 'lib/aixm/refinements.rb', line 139 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 |
#singleton_class ⇒ Range
This is a refinement for Range
Returns a Range covering the given object.
To ease coverage tests in mixed arrays of single objects and object ranges, this method assures you’re always dealing with objects. It returns self if it is already a Range, otherwise builds one with the given single object as both beginning and end.
207 208 209 210 211 |
# File 'lib/aixm/refinements.rb', line 207 refine Range.singleton_class do def from(object) object.is_a?(Range) ? object : (object..object) end end |
#then_if ⇒ Object
This is a refinement for Object
Same as Object#then but only applied if the condition is true.
185 186 187 188 189 |
# File 'lib/aixm/refinements.rb', line 185 refine Object do def then_if(condition, &block) # TODO: [ruby-3.1] use anonymous block "&" on this and next line condition ? self.then(&block) : self end end |
#to_class ⇒ Class
This is a refinement for String
Convert string to class
252 253 254 255 256 |
# File 'lib/aixm/refinements.rb', line 252 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 .
.
331 332 333 334 335 336 337 338 339 340 341 |
# File 'lib/aixm/refinements.rb', line 331 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_deg ⇒ Float
This is a refinement for Float
Convert an angle from radian to degrees.
81 82 83 84 85 |
# File 'lib/aixm/refinements.rb', line 81 refine Numeric do def to_deg 180 * self / Math::PI end end |
#to_digest ⇒ String
This is a refinement for Array
Builds a 4 byte hex digest from the Array payload.
37 38 39 40 41 |
# File 'lib/aixm/refinements.rb', line 37 refine Array do def to_digest ::Digest::SHA512.hexdigest(flatten.map(&:to_s).join('|'.freeze))[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.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/aixm/refinements.rb', line 56 refine Numeric 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_pretty_xml ⇒ String
This is a refinement for Nokogiri::XML::DocumentFragment
Pretty printing alternative of to_xml
168 169 170 171 172 173 174 |
# File 'lib/aixm/refinements.rb', line 168 refine Nokogiri::XML::DocumentFragment do def to_pretty_xml builder = Nokogiri::XML::Builder.new builder.DocumentFragment { _1 << self.to_html } AIXM::Refinements::PRETTY_XSLT.transform(builder.doc).at_css('DocumentFragment').children.map(&:to_xml).join("\n") end end |
#to_rad ⇒ Float
This is a refinement for Float
Convert an angle from degree to radian.
96 97 98 99 100 |
# File 'lib/aixm/refinements.rb', line 96 refine Numeric 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.
352 353 354 355 356 |
# File 'lib/aixm/refinements.rb', line 352 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.
113 114 115 116 117 |
# File 'lib/aixm/refinements.rb', line 113 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.
373 374 375 376 377 378 379 380 381 382 |
# File 'lib/aixm/refinements.rb', line 373 refine String do def uptrans self.dup.tap do |string| string.upcase! string.gsub!(/(#{UPTRANS_MAP.keys.join('|'.freeze)})/, UPTRANS_MAP) string.unicode_normalize!(:nfd) string.gsub!(UPTRANS_FILTER, '') end end end |