git.iko.soy/typeable/libphonenumber
on main help sign in
4 files changed+56−53
since splitsnapshots
unifiedsplit
.github/workflows/ci.yaml+12−8 libphonenumber.cabal+16−12 src/Data/PhoneNumber/Number.hs+4−10 test/Spec.hs+24−23
.github/workflows/ci.yaml+12−8
@@ -22,15 +22,19 @@ jobs:
2222 - "8.8.4"
2323 - "8.10.7"
2424 - "9.0.2"
25− - "9.2.7"
26− - "9.4.4"
27− - "9.6.1"
25+ - "9.2.8"
26+ - "9.4.8"
27+ - "9.6.7"
28+ - "9.8.4"
29+ - "9.10.3"
30+ - "9.12.2"
31+ - "9.14.1"
2832 fail-fast: false
2933 name: Build on Linux, GHC ${{ matrix.ghc_version }}
3034 runs-on: ${{ matrix.platform }}
3135 steps:
32− - uses: actions/checkout@v3
33− - uses: haskell/actions/setup@v2
36+ - uses: actions/checkout@v4
37+ - uses: haskell-actions/setup@v2
3438 with:
3539 ghc-version: ${{ matrix.ghc_version }}
3640 cabal-version: "3.10.1.0"
@@ -66,7 +70,7 @@ jobs:
6670 if: github.event_name == 'release'
6771 steps:
6872 - uses: actions/checkout@v3
69− - uses: haskell/actions/setup@v2
73+ - uses: haskell-actions/setup@v2
7074 with:
7175 cabal-version: "3.10.1.0"
7276 - name: Install C++ library
@@ -81,11 +85,11 @@ jobs:
8185 run: |
8286 cabal haddock --builddir "$GITHUB_WORKSPACE/doc" --haddock-for-hackage --enable-doc
8387 echo "docs=$(find "$GITHUB_WORKSPACE/doc" -maxdepth 1 -type f -name '*-docs.tar.gz')" >> "$GITHUB_ENV"
84− - uses: actions/upload-artifact@v2
88+ - uses: actions/upload-artifact@v6
8589 with:
8690 name: Source tarball
8791 path: ${{ env.dist }}
88− - uses: svenstaro/upload-release-action@2.2.1
92+ - uses: svenstaro/upload-release-action@2.11.3
8993 with:
9094 repo_token: ${{ secrets.GITHUB_TOKEN }}
9195 file: ${{ env.dist }}
libphonenumber.cabal+16−12
@@ -1,6 +1,6 @@
11cabal-version: 3.0
22name: libphonenumber
3−version: 0.1.1.0
3+version: 0.1.4.0
44category: Data
55synopsis: Parsing, formatting, and validating international phone
66 numbers
@@ -25,7 +25,7 @@ description:
2525 and to avoid a dependency on @text@, we use 'ByteString'
2626 throughout the library instead of 'Data.Text.Text'.
2727
28−copyright: 2023 Typeable
28+copyright: 2023-2025 Typeable
2929author: Typeable
3030maintainer: mniip@typeable.io
3131homepage: https://github.com/typeable/libphonenumber/
@@ -37,9 +37,13 @@ tested-with:
3737 , GHC == 8.8.4
3838 , GHC == 8.10.7
3939 , GHC == 9.0.2
40− , GHC == 9.2.7
41− , GHC == 9.4.4
42− , GHC == 9.6.1
40+ , GHC == 9.2.8
41+ , GHC == 9.4.8
42+ , GHC == 9.6.7
43+ , GHC == 9.8.4
44+ , GHC == 9.10.3
45+ , GHC == 9.12.2
46+ , GHC == 9.14.1
4347
4448build-type: Simple
4549
@@ -60,12 +64,13 @@ library
6064 , Data.PhoneNumber.Internal.Number
6165 , Data.PhoneNumber.Internal.Util
6266 build-depends:
63− , base >= 4.12 && < 4.19
64− , bytestring >= 0.10.8 && < 0.12
65− , containers >= 0.6.0 && < 0.7
66− , deepseq >= 1.4.4 && < 1.5
67+ , base >= 4.12 && < 4.23
68+ , bytestring >= 0.10.8 && < 0.13
69+ , containers >= 0.6.0 && < 0.9
70+ , deepseq >= 1.4.4 && < 1.6
6771 , transformers >= 0.5.5 && < 0.7
6872 build-tool-depends: c2hs:c2hs
73+ pkgconfig-depends: protobuf
6974 include-dirs: include
7075 includes:
7176 , c_phonenumber.h
@@ -75,7 +80,6 @@ library
7580 , cxxbits/c_phonenumberutil.cpp
7681 extra-libraries:
7782 , phonenumber
78− , protobuf
7983 if impl(ghc >= 9.4)
8084 build-depends: system-cxx-std-lib
8185 else
@@ -105,9 +109,9 @@ test-suite spec_test
105109 , base
106110 , bytestring
107111 , containers
108− , hspec >= 2.10.8 && < 2.11
112+ , hspec >= 2.10.8 && < 2.12
109113 , libphonenumber
110− , QuickCheck >= 2.13.1 && < 2.15
114+ , QuickCheck >= 2.13.1 && < 2.16
111115 main-is: Spec.hs
112116 hs-source-dirs: test
113117 default-language: Haskell2010
src/Data/PhoneNumber/Number.hs+4−10
@@ -21,16 +21,10 @@ module Data.PhoneNumber.Number
2121 ) where
2222
2323import Data.ByteString (ByteString)
24−import Data.PhoneNumber.Internal.Number hiding
25− ( pattern PhoneNumber
26− , extension
27− , rawInput
28− , preferredDomesticCarrierCode
29− , nationalNumber
30− , countryCode
31− , italianLeadingZero
32− , countryCodeSource
33− , numberOfLeadingZeros )
24+import Data.PhoneNumber.Internal.Number
25+ ( CPhoneNumber(CPhoneNumber), PhoneNumber, CountryCodeSource, toCPhoneNumber
26+ , fromCPhoneNumber
27+ )
3428import qualified Data.PhoneNumber.Internal.Number as I
3529
3630-- | A country calling code (International Subscriber Dialing code, ISD code),
test/Spec.hs+24−23
@@ -53,11 +53,13 @@ data ParsedNumber = ParsedNumber (ParseMode, Maybe Region, ParserInput) PhoneNum
5353 deriving stock (Show)
5454
5555instance Arbitrary ParsedNumber where
56− arbitrary = liftA3 (,,) (elements [Canonicalize, KeepRawInput]) arbitrary arbitrary
57− `suchThatMap` \(mode, MReg mRegion, ParserInput input) ->
58− case parseNumber mode mRegion input of
59− Right pn -> Just $ ParsedNumber (mode, mRegion, ParserInput input) pn
60− _ -> Nothing
56+ arbitrary = do
57+ mode <- elements [Canonicalize, KeepRawInput]
58+ liftA2 ((,,) mode) arbitrary arbitrary
59+ `suchThatMap` \(_, MReg mRegion, ParserInput input) ->
60+ case parseNumber mode mRegion input of
61+ Right pn -> Just $ ParsedNumber (mode, mRegion, ParserInput input) pn
62+ _ -> Nothing
6163 shrink (ParsedNumber (mode, region, input) _) = do
6264 ParserInput input' <- shrink input
6365 case parseNumber mode region input' of
@@ -113,7 +115,7 @@ main = hspec $ modifyMaxSuccess (* 10) $ do
113115 .&&. not (BS.null $ normalizeNumber Digits $ BS.pack str <> "0")
114116 describe "Dialable" $ do
115117 -- PhoneNumberUtil::NormalizeDiallableCharsOnly will error on any invalid UTF8
116− xprop "doesn't randomly fail" $ \str ->
118+ prop "doesn't randomly fail" $ \str ->
117119 not (BS.null $ normalizeNumber Digits $ "0" <> BS.pack str)
118120 .&&. not (BS.null $ normalizeNumber Digits $ BS.pack str <> "0")
119121
@@ -123,15 +125,9 @@ main = hspec $ modifyMaxSuccess (* 10) $ do
123125 prop "returns only ASCII digits" $ \(ParsedNumber _ pn) ->
124126 BSC.all (`elem` ['0'..'9']) $ nationalSignificantNumber pn
125127 modifyMaxDiscardRatio (* 10) $ do
126− prop "concatenated with country code parses to the original (if valid and not MX)" $
127− \(ParsedNumber (_, mReg, ParserInput input) pn) ->
128− -- Apparently "+52112210000000" makes the parser/formatter do weird
129− -- stuff as it tries to handle the deprecated (?) mobile token ("1"
130− -- after "+52")
131− if "5211" `BS.isPrefixOf` normalizeNumber Digits input ||
132− mReg == Just "MX" && "11" `BS.isPrefixOf` normalizeNumber Digits input
133− then discard
134− else isValidNumber Nothing pn ==>
128+ prop "concatenated with country code parses to the original (if valid)" $
129+ \(ParsedNumber _ pn) ->
130+ isValidNumber Nothing pn ==>
135131 let
136132 cc = countryCode pn
137133 nsn = nationalSignificantNumber pn
@@ -155,14 +151,19 @@ main = hspec $ modifyMaxSuccess (* 10) $ do
155151 extension pn == Nothing ==>
156152 isRight $ parseNumber Canonicalize Nothing
157153 $ formatNumber International pn
158− prop "with E164 produces a parseable result" $
159− \(ParsedNumber _ pn) -> possibleNumber Unknown pn == IsPossible ==>
160− isRight $ parseNumber Canonicalize Nothing
161− $ formatNumber E164 pn
162− prop "with RFC3966 produces a parseable result" $
163− \(ParsedNumber _ pn) -> possibleNumber Unknown pn == IsPossible ==>
164− isRight $ parseNumber Canonicalize Nothing
165− $ formatNumber RFC3966 pn
154+ modifyMaxDiscardRatio (* 10) $ do
155+ prop "with E164 produces a parseable result (if Canonicalize)" $
156+ \(ParsedNumber (mode, _, _) pn) ->
157+ -- KeepRawInput with pn == "0000" breaks E164 formatting
158+ possibleNumber Unknown pn == IsPossible && mode == Canonicalize ==>
159+ isRight $ parseNumber Canonicalize Nothing
160+ $ formatNumber E164 pn
161+ prop "with RFC3966 produces a parseable result (if Canonicalize)" $
162+ \(ParsedNumber (mode, _, _) pn) ->
163+ -- KeepRawInput with pn == "0000" breaks RFC3966 formatting
164+ possibleNumber Unknown pn == IsPossible && mode == Canonicalize ==>
165+ isRight $ parseNumber Canonicalize Nothing
166+ $ formatNumber RFC3966 pn
166167
167168 describe "truncateTooLongNumber" $ do
168169 pure ()