An assortment of useful functions.
The docs can be found at https://hexdocs.pm/moar
The package can be installed by adding moar to your list of dependencies in mix.exs:
def deps do
[
{:moar, "~> 1.49"}
]
endMoar.Assertions
assert_containsasserts that a list or map contains one or more elements.assert_eqis a pipeable equality assertion, with options such as the ability to ignore order when comparing lists, ignore space when comparing strings, consider only certain keys of a map, returning a different value than what was passed in, and asserting that a value is within some delta (which can be a number or time duration).assert_recentasserts that a datetime is pretty close to now.assert_thatasserts that a pre-condition and post-condition are true after performing an action.refute_thatasserts that a condition didn't change after performing an action.
Moar.Atom
atomizewhen given an atom, returns it; when given a string, converts it to an atom, replacing non-alphanumeric characters with underscores.from_stringandto_stringconvert between strings and atoms, and don't fail if you try to convert an atom to an atom or a string to a string.to_existing_atomis likeString.to_existing_atom/1but can accept an atom as a param.
Moar.DateTime and Moar.NaiveDateTime
addandsubtractcan add and subtract aMoar.Duration, which is a tuple with a time unit, like{27, :minute}.between?determines whether a datetime is between two other datetimes.from_iso8601!raises if the string is not in ISO 8601 format.recent?returns true if the given datetime was at most one minute ago.to_iso8601_roundedconverts to an ISO 8601 string, truncated to the second.utc_nowtakesplusandminusoptions to get the current time plus or minus some duration.within?determines whether a given datetime is within the given duration.
Moar.Difference
- a protocol that defines
diff(a, b)along with implementations for datetimes.
Moar.Duration
- is a
{time, unit}tuple (like{27, :minute}) and supports the regulart:System.time_unit/0values and also:minute,:hour, and:day. agoreturns the duration between a given datetime and now.approxshifts the duration to a simple approximate value.betweenreturns the duration between two datetimes.convertconverts a duration to a new time unit, returning only the value.formatformats a duration in long ("3 seconds") or short ("3s") format with optional transformers and suffix.from_nowreturns a duration between now and a given datetime.humanizeconverts the duration to the highest possible time unit.shift,shift_up, andshift_downconvert a duration to a new time unit.to_stringrenders a duration into a string like"27 minutes".
Moar.Enum
at!is likeEnum.atbut raises if the index is out of bounds.compactrejects nil values.find_indicesreturns the indices of matching elementsfind_indices!returns the indices of matching elements and raises if any element is not found.first!returns the first item or raises if there isn't a first item.index_byconverts an enum into a list of maps indexed by the given function.into!is likeEnum.intobut allowsnilas its first argument.is_map_or_keywordreturns true if the value is a map or a keyword list (unfortunately cannot be used as a guard).isortandisort_bysort case-insensitively.lists_to_mapsconverts a list of lists to a lists of maps using the provided list of keys.take_atreturns a list of elements at the given indices.test_idsis liketids(see below) with a slightly different spelling.tidsextractstidfields. (tidis short for "test id" and the authors of Moar use tids extensively for testing.)
Moar.File
new_tempfile_pathreturns a new path for a tempfile, without creating it.write_tempfilewrites some data to a new tempfile.
Moar.Integer
comparereturning:eq,:lt,:gt.
Moar.List
to_keywordconverts a list into a keyword list, using a default value or function to generate the valuesto_sentenceconverts a list into a string, with items separated by commas, and an "and" before the last itemunwrapreturns the argument if it's not a list, or returns the only item in the list, or raises.
Moar.Map
atomize_key,atomize_keys, anddeep_atomize_keysconvert keys in a map from strings to atoms, andstringify_keysdoes the opposite.deep_taketakes a list of keys and{key, nested_key}tuples to take from nested maps.index_byconverts a list of maps into a map of maps indexed by the values of one of the keys.mergeanddeep_mergemerge maps, converting enumerables into maps before merging.deep_mergealso accepts a function to resolve value conflicts.merge_if_blankmerge maps, retaining existing non-blank values.put_if_blankputs a key/value pair into a map if the key is missing or its value is blank (viaMoar.Term.blank?/1)put_new!is likeMap.put_new/3but raises if the key already exists in the map.rename_keyandrename_keysrename keys in a map.transformtransforms a key or multiple keys with a transformer function.validate_keys!validates that the keys in the map are equal to or a subset of a list of valid keys.
Moar.Opts
- is meant to be used with function options.
getextracts a value from opts, falling back to a default if the value is blank (viaMoar.Term.blank?/1)takeextracts multiple values from opts, falling back to defaults if the value is blank (viaMoar.Term.blank?/1)
Moar.Protocol
implements!raises if a struct does not implement the given protocol.implements?returns true if a struct implements the given protocol.
Moar.Random
floatreturns a random float.integerreturns a random integer.stringreturns random base64- or base32-encoded string.
Moar.Regex
named_capturegets a single named capture.named_capturesis likeRegex.named_captures/3but can take the first two args in any order.
Moar.Retry
rescue_untilandrescue_forrun the given function repeatedly until it does not raise.retry_untilandretry_forrun the given function repeatedly until it returns a truthy value.
Moar.String
append_unless_blankappends a suffix to a string, unless the string is blank.compareandcompare?compare two strings, optionally transforming the strings before comparison.count_leading_spaces/1returns the number of leading spaces in a string.inner_truncateremoves the middle of a string to make it the desired length.remove_marked_whitespaceremoves whitespacing following a special\vmarker.secure_comparecompares two strings in constant time.slugconverts a string into a slug with a custom joiner character;dasherizeandunderscoreare shortcuts for common slug formats.squishcollapses consecutive whitespace characters.surroundwraps a string with the given characters.to_caseconverts text to:camel_case,:lower_camel_case, or:snake_case.to_integerconverts a string to an integer with a few handy options.trimis likeString.trim/1but handlesnilvalues.truncate_attruncates a string at the last instance of a substring that results in the truncated string being shorter than a given length.unindent/1un-indents a multiline string by the smallest indentation size.unindent/2un-indents a multiline string by the given amount.
Moar.Sugar
error,noreply, andokcreate tuples ("foo" |> error()->{:error, "foo"}).error!andok!unwrap tuples ({:error, "foo"} |> error!()->"foo").returningtakes two arguments and returns the second one.
Moar.Term
blank?returns true if a term isnil, an empty string, a whitespace-only string, an empty list, or an empty map.present?is the opposite ofblank?.presencereturns a default if the argument is blank.
Moar.Tuple
from_list!converts a list of tuples like[{:ok, 1}, {:ok, 2}, {:ok, 3}]to a tuple like{:ok, [1, 2, 3]}reduceconverts a list of tuples like[{:ok, 1}, {:error, 2}]to a map like%{ok: [1], error: [2]}
Moar.URI
fixapplies some fixes to a URI string.formatformats a URI in various ways.valid?returns true if the URI has a host and scheme, and if it has a path, the path does not contain spaces.web_url?returns true if the scheme ishttporhttps.
Moar.Version
compareis likeVersion.compare/2but normalizes the versions first.normalizeappends as many ".0" strings as necessary to create a string with major, minor, and patch numbers.