Specs and checks

Predicates

The phone-number provides many predicate functions that can be used to check for certain properties of phone numbers. These include:

Function Name Description
core/valid-input? Checks if a value can possibly be used as a phone number
core/valid? Checks if a phone numer is valid
core/invalid? Checks if a phone numer is invalid
core/possible? Checks if a phone numer is a possible number
core/impossible? Checks if a phone numer is an impossible number
core/native? Checks if a phone numer is in a native format (PhoneNumber)
core/has-raw-input? Checks if a phone numer contains the retained raw input
core/geographical? Checks if a phone numer identifies a line with some geographical location
core/short-possible? Checks if a phone numer is in a possible short number
core/short-valid? Checks if a phone numer is in a valid short number
core/short-emergency? Checks if a phone numer is in an emergency number
core/short-to-emergency? Checks if a phone numer can be used to connect to an emergency
core/short-to-emergency? Checks if a phone numer can be used to connect to an emergency

Specs

Clojure Spec is used in the phone-number library to validate data and generate property-based tests. Most of the defined specs have generators attached.

There are 3 groups of specs:

  • Input specs, created for easy data validation.
    (ns-prefix: phone-number.input)

  • Generic specs used to describe the output data.
    (ns-prefix: phone-number)

  • Specs that are used internally to test the library for corner cases and make sure that new features or other changes won’t break anything.
    (ns-prefixes: phone-number.arg, phone-number.args, phone-number.props)

This page lists the input and some of the generic specs. To use them just require phone-number.spec, clojure.spec.alpha and optionally clojure.spec.gen.alpha:

(require [phone-number.spec       :as spec]
         [clojure.spec.alpha      :as    s]
         [clojure.spec.gen.alpha  :as  gen])
Spec Name Data description
:phone-number.input/region region code
:phone-number.input/type phone number type
:phone-number.input/leniency phone number leniency
:phone-number.input/format phone number format
:phone-number.input/format-global phone number format
(with calling code prefix)
:phone-number.input/format-regional phone number format
(without calling code prefix)
:phone-number.input/tz-format time zone format
:phone-number.input/net-code global network calling code
:phone-number.input/country-code country calling code
:phone-number.input/calling-code calling code (either global or country)
:phone-number.input/cost cost class of short numbers
:phone-number.input/native phone number in native format
(PhoneNumber object)
:phone-number.input/native-valid native phone number which is valid
:phone-number.input/string phone number as a string
:phone-number.input/string-global phone number as a string with a calling code
:phone-number.input/string-regional phone number as a string without a calling code
:phone-number.input/string-valid valid phone number as a string
:phone-number.input/string-invalid invalid phone number as a string
:phone-number.input/numeric phone number as natural number without calling code
:phone-number/info phone number as a map
:phone-number/info-valid valid phone number as a map
:phone-number/info-invalid invalid phone number as a map
:phone-number.input/possible possible phone number
:phone-number.input/impossible impossible phone number
:phone-number.input/unknown phone number of unknown type
:phone-number.input/has-region phone number with region code information
:phone-number.input/has-calling-code phone number with calling code
:phone-number.input/has-location phone number having geographical location
:phone-number.input/has-time-zone phone number having time zone information
:phone-number.input/has-known-type phone number of known type
:phone-number.input/mobile mobile phone number
:phone-number.input/fixed-line fixed-line phone number
:phone-number.input/toll-free toll-free phone number
:phone-number.input/premium-rate premium-rate phone number
:phone-number.input/shared-cost shared-cost phone number
:phone-number.input/voip VoIP phone number
:phone-number.input/personal personal phone number
:phone-number.input/pager pager number
:phone-number.input/uan UAN number
:phone-number.input/voicemail voicemail number
:phone-number.input/fixed-line-or-mobile fixed-line or mobile number (incl. uncertain)
:phone-number.input/uncertain-fixed-line-or-mobile uncertain number (fixed line or mobile)
:phone-number.input/maybe-mobile uncertain number (fixed line or mobile) or mobile
:phone-number.input/maybe-fixed-line uncertain number (fixed line or mobile) or fixed-line
:phone-number.input/short valid short number
:phone-number.input/maybe-short possible short number
:phone-number.input.short/valid valid short number
:phone-number.input.short/invalid invalid short number
:phone-number.input.short/possible possible short number
:phone-number.input.short/carrier-specific carrier-specific short number
:phone-number.input.short/info short number properties as a map
:phone-number.input/number phone number (with calling code or without)

Phone-number also contains specs for functions, however they are intended for testing and it is NOT RECOMMENDED to enable the instrumentation in production.

Please note that if you intend to use phone-number’s specs in a program (not in phone-number’s REPL) you should add proper dependencies since production profile of phone-number does not depend on spec nor test library. Example, minimal deps.edn:

{:paths ["src" "resources"]

 :deps {io.randomseed/phone-number {:mvn/version "8.12.16-1"}}

 :aliases {
           :dev {
                 :extra-deps {org.clojure/spec.alpha  {:mvn/version "0.2.194"}
                              org.clojure/test.check  {:mvn/version "1.1.0"}}
                 :extra-paths ["dev/src" "test"]
                 :jvm-opts ["-Dclojure.spec.compile-asserts=true"]}

           :test {
                  :extra-paths ["test"]
                  :extra-deps {org.clojure/test.check {:mvn/version "1.1.0"}}}}