on master help sign in
Move Elm.Constraint and Elm.Licenses
commita66a03fde6c077f3d073c06b467aa47d084e2667 authorEvan Czaplicki <evancz@users.noreply.github.com> dateThu 20 Dec 2018, 13:42 (8 years ago) parent23cd442
2 files changed+126−81
builder/src/Elm/Project/Constraint.hs → builder/src/Elm/Constraint.hs+90−68 builder/src/Elm/Project/Licenses.hs → builder/src/Elm/Licenses.hs+36−13
builder/src/Elm/Project/Constraint.hs → builder/src/Elm/Constraint.hsrenamed+90−68
@@ -1,12 +1,13 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
3−module Elm.Project.Constraint
3+module Elm.Constraint
44 ( Constraint
55 , exactly
66 , anything
7− , fromText
7+ , toChars
88 , toString
9− , toText
9+ , Error(..)
10+ , fromString
1011 , satisfies
1112 , check
1213 , intersect
@@ -15,18 +16,19 @@ module Elm.Project.Constraint
1516 , untilNextMajor
1617 , untilNextMinor
1718 , expand
19+ , decoder
20+ , encode
1821 )
1922 where
2023
2124
2225import Control.Monad (liftM4)
23−import Data.Binary
24−import qualified Data.Text as Text
25−import Data.Text (Text)
26+import Data.Binary (Binary, get, put, getWord8, putWord8)
27+import qualified Data.Utf8 as Utf8
2628
27−import qualified Elm.Compiler as Compiler
28−import qualified Elm.Package as Pkg
29−import Elm.Package (Version(..))
29+import qualified Elm.Version as V
30+import qualified Json.Decode as D
31+import qualified Json.Encode as E
3032
3133
3234
@@ -34,7 +36,7 @@ import Elm.Package (Version(..))
3436
3537
3638data Constraint
37− = Range Version Op Op Version
39+ = Range V.Version Op Op V.Version
3840 deriving (Eq)
3941
4042
@@ -48,96 +50,96 @@ data Op
4850-- COMMON CONSTRAINTS
4951
5052
51−exactly :: Version -> Constraint
53+exactly :: V.Version -> Constraint
5254exactly version =
5355 Range version LessOrEqual LessOrEqual version
5456
5557
5658anything :: Constraint
5759anything =
58− Range (Version 1 0 0) LessOrEqual LessOrEqual (Version maxBound 0 0)
60+ Range V.one LessOrEqual LessOrEqual V.max
5961
6062
6163
62−-- TEXT CONVERSION
64+-- TO STRING
6365
6466
65−toString :: Constraint -> String
66−toString constraint =
67− Text.unpack (toText constraint)
67+toChars :: Constraint -> String
68+toChars constraint =
69+ Utf8.toChars (toString constraint)
6870
6971
70−toText :: Constraint -> Text
71−toText constraint =
72+toString :: Constraint -> Utf8.String
73+toString constraint =
7274 case constraint of
7375 Range lower lowerOp upperOp upper ->
74− Text.intercalate " "
75− [ Pkg.versionToText lower
76− , opToText lowerOp
76+ Utf8.join 0x20 {- -}
77+ [ V.toString lower
78+ , toStringHelp lowerOp
7779 , "v"
78− , opToText upperOp
79− , Pkg.versionToText upper
80+ , toStringHelp upperOp
81+ , V.toString upper
8082 ]
8183
8284
83−opToText :: Op -> Text
84−opToText op =
85+toStringHelp :: Op -> Utf8.String
86+toStringHelp op =
8587 case op of
86− Less ->
87− "<"
88+ Less -> "<"
89+ LessOrEqual -> "<="
90+
8891
89− LessOrEqual ->
90− "<="
9192
93+-- FROM STRING
9294
93−fromText :: Text -> Either String Constraint
94−fromText text =
95− case Text.splitOn " " text of
95+
96+data Error
97+ = BadLower Utf8.String
98+ | BadUpper Utf8.String
99+ | BadFormat
100+ | InvalidOp
101+ | InvalidRange V.Version V.Version
102+
103+
104+fromString :: Utf8.String -> Either Error Constraint
105+fromString string =
106+ case Utf8.split 0x20 {- -} string of
96107 [lower, lowerOp, "v", upperOp, upper] ->
97− do lo <- versionFromText "lower" lower
98− lop <- opFromText lowerOp
99− hop <- opFromText upperOp
100− hi <- versionFromText "upper" upper
108+ do lo <- versionFromString lower BadLower
109+ lop <- opFromString lowerOp
110+ hop <- opFromString upperOp
111+ hi <- versionFromString upper BadUpper
101112 if lo < hi
102113 then Right (Range lo lop hop hi)
103− else
104− Left $
105− "The lower bound (" ++ Text.unpack lower
106− ++ ") must be less than the upper bound ("
107− ++ Text.unpack upper ++ ")"
114+ else Left (InvalidRange lo hi)
108115
109116 _ ->
110− Left "The standard format is \"1.0.0 <= v < 2.0.0\""
117+ Left BadFormat
111118
112119
113−versionFromText :: String -> Text -> Either String Version
114−versionFromText lowerOrUpper text =
115− case Pkg.versionFromText text of
120+versionFromString :: Utf8.String -> (Utf8.String -> Error) -> Either Error V.Version
121+versionFromString string toError =
122+ case V.fromString string of
116123 Just vsn ->
117124 Right vsn
118125
119126 Nothing ->
120− Left $ "The " ++ lowerOrUpper ++ " bound (" ++ Text.unpack text ++ ") is not a valid version number."
127+ Left (toError string)
121128
122129
123−opFromText :: Text -> Either String Op
124−opFromText text =
130+opFromString :: Utf8.String -> Either Error Op
131+opFromString text =
125132 case text of
126− "<=" ->
127− Right LessOrEqual
128−
129− "<" ->
130− Right Less
131−
132− _ ->
133− Left $ "The operator (" ++ Text.unpack text ++ ") is not valid. Must be (<=) or (<)."
133+ "<=" -> Right LessOrEqual
134+ "<" -> Right Less
135+ _ -> Left InvalidOp
134136
135137
136138
137139-- IS SATISFIED
138140
139141
140−satisfies :: Constraint -> Version -> Bool
142+satisfies :: Constraint -> V.Version -> Bool
141143satisfies constraint version =
142144 case constraint of
143145 Range lower lowerOp upperOp upper ->
@@ -156,7 +158,7 @@ isLess op =
156158 (<=)
157159
158160
159−check :: Constraint -> Version -> Ordering
161+check :: Constraint -> V.Version -> Ordering
160162check constraint version =
161163 case constraint of
162164 Range lower lowerOp upperOp upper ->
@@ -201,43 +203,63 @@ intersect (Range lo lop hop hi) (Range lo_ lop_ hop_ hi_) =
201203
202204goodElm :: Constraint -> Bool
203205goodElm constraint =
204− satisfies constraint Compiler.version
206+ satisfies constraint V.compiler
205207
206208
207209defaultElm :: Constraint
208210defaultElm =
209− if Pkg._major Compiler.version > 0
210− then untilNextMajor Compiler.version
211− else untilNextMinor Compiler.version
211+ if V._major V.compiler > 0
212+ then untilNextMajor V.compiler
213+ else untilNextMinor V.compiler
212214
213215
214216
215217-- CREATE CONSTRAINTS
216218
217219
218−untilNextMajor :: Version -> Constraint
220+untilNextMajor :: V.Version -> Constraint
219221untilNextMajor version =
220− Range version LessOrEqual Less (Pkg.bumpMajor version)
222+ Range version LessOrEqual Less (V.bumpMajor version)
221223
222224
223−untilNextMinor :: Version -> Constraint
225+untilNextMinor :: V.Version -> Constraint
224226untilNextMinor version =
225− Range version LessOrEqual Less (Pkg.bumpMinor version)
227+ Range version LessOrEqual Less (V.bumpMinor version)
226228
227229
228−expand :: Constraint -> Version -> Constraint
230+expand :: Constraint -> V.Version -> Constraint
229231expand constraint@(Range lower lowerOp upperOp upper) version
230232 | version < lower =
231233 Range version LessOrEqual upperOp upper
232234
233235 | version > upper =
234− Range lower lowerOp Less (Pkg.bumpMajor version)
236+ Range lower lowerOp Less (V.bumpMajor version)
235237
236238 | otherwise =
237239 constraint
238240
239241
240242
243+-- JSON
244+
245+
246+encode :: Constraint -> E.Value
247+encode constraint =
248+ E.string (toString constraint)
249+
250+
251+decoder :: D.Decoder Error Constraint
252+decoder =
253+ do str <- D.string
254+ case fromString str of
255+ Right constraint ->
256+ return constraint
257+
258+ Left err ->
259+ D.failure err
260+
261+
262+
241263-- BINARY
242264
243265
builder/src/Elm/Project/Licenses.hs → builder/src/Elm/Licenses.hsrenamed+36−13
@@ -1,19 +1,22 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
3−module Elm.Project.Licenses
3+module Elm.Licenses
44 ( License
5− , check
65 , bsd3
76 , encode
7+ , decoder
88 )
99 where
1010
1111
12+import Control.Monad (liftM2)
13+import Data.Binary (Binary, get, put)
1214import Data.Map ((!))
1315import qualified Data.Map as Map
14−import qualified Data.Text as Text
16+import qualified Data.Utf8 as Utf8
1517
16−import qualified Json.Encode as Encode
18+import qualified Json.Decode as D
19+import qualified Json.Encode as E
1720import qualified Reporting.Suggest as Suggest
1821
1922
@@ -23,8 +26,8 @@ import qualified Reporting.Suggest as Suggest
2326
2427data License =
2528 License
26− { _name :: Text.Text
27− , _code :: Text.Text
29+ { _name :: Utf8.String
30+ , _code :: Utf8.String
2831 }
2932 deriving (Eq, Ord)
3033
@@ -34,16 +37,27 @@ bsd3 =
3437 osiApprovedSpdxLicenses ! "BSD-3-Clause"
3538
3639
37−encode :: License -> Encode.Value
40+encode :: License -> E.Value
3841encode (License _ code) =
39− Encode.text code
42+ E.string code
43+
44+
45+decoder :: (Utf8.String -> [Utf8.String] -> e) -> D.Decoder e License
46+decoder toError =
47+ do str <- D.string
48+ case check str of
49+ Right license ->
50+ return license
51+
52+ Left suggestions ->
53+ D.failure (toError str suggestions)
4054
4155
4256
4357-- CHECK
4458
4559
46−check :: Text.Text -> Either [Text.Text] License
60+check :: Utf8.String -> Either [Utf8.String] License
4761check rawName =
4862 case Map.lookup rawName osiApprovedSpdxLicenses of
4963 Just license ->
@@ -52,20 +66,20 @@ check rawName =
5266 Nothing ->
5367 let
5468 toPairs (License name code) =
55− [ (Text.unpack code, code), (Text.unpack name, code) ]
69+ [ (Utf8.toChars code, code), (Utf8.toChars name, code) ]
5670
5771 pairs =
5872 concatMap toPairs (Map.elems osiApprovedSpdxLicenses)
5973 in
6074 Left $ map snd $
61− Suggest.sort (Text.unpack rawName) fst pairs
75+ Suggest.sort (Utf8.toChars rawName) fst pairs
6276
6377
6478
6579-- LIST OF LICENCES
6680
6781
68−(==>) :: Text.Text -> Text.Text -> (Text.Text, License)
82+(==>) :: Utf8.String -> Utf8.String -> (Utf8.String, License)
6983(==>) code name =
7084 ( code, License name code )
7185
@@ -74,7 +88,7 @@ check rawName =
7488-- OSI approved licenses in SPDX format.
7589-- <https://spdx.org/licenses/>
7690--
77−osiApprovedSpdxLicenses :: Map.Map Text.Text License
91+osiApprovedSpdxLicenses :: Map.Map Utf8.String License
7892osiApprovedSpdxLicenses =
7993 Map.fromList
8094 [ "AFL-1.1" ==> "Academic Free License v1.1"
@@ -177,3 +191,12 @@ osiApprovedSpdxLicenses =
177191 , "Zlib" ==> "zlib License"
178192 , "ZPL-2.0" ==> "Zope Public License 2.0"
179193 ]
194+
195+
196+
197+-- BINARY
198+
199+
200+instance Binary License where
201+ get = liftM2 License get get
202+ put (License a b) = put a >> put b