Skip to content

Commit 9c9d1bb

Browse files
Implement simple versions and ranges (#305)
1 parent 7f13131 commit 9c9d1bb

File tree

19 files changed

+627
-260
lines changed

19 files changed

+627
-260
lines changed

ci/src/Foreign/SemVer.js

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,4 @@
11
const semver = require("semver");
22

3-
exports.parseSemVerImpl = (input) => {
4-
try {
5-
return semver.parse(input);
6-
} catch (e) {
7-
return null;
8-
}
9-
};
10-
11-
exports.version = function (sv) { return sv.version; }
12-
exports.major = function (sv) { return sv.major; }
13-
exports.minor = function (sv) { return sv.minor; }
14-
exports.prerelease = function (sv) { return sv.prerelease; }
15-
exports.build = function (sv) { return sv.build; }
16-
exports.patch = function (sv) { return sv.patch; }
17-
exports.raw = function(sv) { return sv.raw; }
18-
19-
exports.compareSemVerImpl = semver.compare;
20-
21-
exports.parseRangeImpl = semver.validRange;
3+
exports.parseRangeImpl = (rangeString) =>
4+
semver.validRange(rangeString, { loose: true, includePrerelease: false });

ci/src/Foreign/SemVer.purs

Lines changed: 3 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,14 @@
11
module Foreign.SemVer
2-
( SemVer
3-
, parseSemVer
4-
, raw
5-
, version
6-
, major
7-
, minor
8-
, patch
9-
, prerelease
10-
, build
11-
, Range
12-
, parseRange
13-
, printRange
2+
( parseRange
143
) where
154

165
import Registry.Prelude
176

18-
import Data.Function.Uncurried (Fn2, runFn2)
197
import Data.String as String
20-
import Registry.Json as Json
21-
22-
data SemVer
23-
24-
instance eqSemVer :: Eq SemVer where
25-
eq v1 v2 = compare v1 v2 == EQ
26-
27-
instance ordSemVer :: Ord SemVer where
28-
compare = compareSemVer
29-
30-
instance showSemVer :: Show SemVer where
31-
show = raw
32-
33-
instance RegistryJson SemVer where
34-
encode = Json.encode <<< version
35-
decode json = do
36-
versionString <- Json.decode json
37-
note ("Expected version: " <> versionString) (parseSemVer versionString)
38-
39-
foreign import compareSemVerImpl :: Fn2 SemVer SemVer Int
40-
41-
compareSemVer :: SemVer -> SemVer -> Ordering
42-
compareSemVer v1 v2 = case runFn2 compareSemVerImpl v1 v2 of
43-
(-1) -> LT
44-
0 -> EQ
45-
1 -> GT
46-
other -> unsafeCrashWith $ "Unknown ordering: " <> show other
47-
48-
foreign import parseSemVerImpl :: String -> Nullable SemVer
49-
50-
parseSemVer :: String -> Maybe SemVer
51-
parseSemVer = toMaybe <<< parseSemVerImpl
52-
53-
foreign import major :: SemVer -> Int
54-
55-
foreign import minor :: SemVer -> Int
56-
57-
foreign import patch :: SemVer -> Int
58-
59-
foreign import prerelease :: SemVer -> Array String
60-
61-
foreign import build :: SemVer -> Array String
62-
63-
foreign import version :: SemVer -> String
64-
65-
foreign import raw :: SemVer -> String
66-
67-
newtype Range = Range String
68-
69-
derive newtype instance eqRange :: Eq Range
70-
71-
instance RegistryJson Range where
72-
encode = Json.encode <<< printRange
73-
decode json = do
74-
original <- Json.decode json
75-
note ("Expected SemVer range: " <> original) (parseRange original)
768

779
foreign import parseRangeImpl :: String -> Nullable String
7810

79-
parseRange :: String -> Maybe Range
11+
parseRange :: String -> Maybe String
8012
parseRange original = do
8113
converted <- case toMaybe (parseRangeImpl original) of
8214
Just c -> pure c
@@ -88,10 +20,4 @@ parseRange original = do
8820
Just c -> pure c
8921
_ -> Nothing
9022
_ -> Nothing
91-
pure $ Range converted
92-
93-
printRange :: Range -> String
94-
printRange (Range r) = r
95-
96-
instance Show Range where
97-
show = printRange
23+
pure converted

ci/src/Registry/API.purs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import Foreign.Dhall as Dhall
1515
import Foreign.GitHub (IssueNumber)
1616
import Foreign.GitHub as GitHub
1717
import Foreign.Object as Object
18-
import Foreign.SemVer (SemVer)
19-
import Foreign.SemVer as SemVer
2018
import Foreign.Tar as Tar
2119
import Foreign.Tmp as Tmp
2220
import Node.ChildProcess as NodeProcess
@@ -34,6 +32,8 @@ import Registry.Schema (Manifest(..), Metadata, Operation(..), Repo(..), Target(
3432
import Registry.Scripts.LegacyImport.Error (ImportError(..))
3533
import Registry.Scripts.LegacyImport.Manifest as Manifest
3634
import Registry.Types (RawPackageName(..), RawVersion(..))
35+
import Registry.Version (ParseMode(..), Version)
36+
import Registry.Version as Version
3737
import Sunde as Process
3838
import Text.Parsing.StringParser as StringParser
3939

@@ -166,9 +166,9 @@ addOrUpdate { ref, fromBower, packageName } metadata = do
166166
Git _ -> throwWithComment "Legacy packages can only come from GitHub. Aborting."
167167
GitHub { owner, repo } -> pure { owner, repo }
168168

169-
semVer <- case SemVer.parseSemVer ref of
170-
Nothing -> throwWithComment $ "Not a valid SemVer version: " <> ref
171-
Just result -> pure result
169+
version <- case Version.parseVersion Lenient ref of
170+
Left _ -> throwWithComment $ "Not a valid registry version: " <> ref
171+
Right result -> pure result
172172

173173
let
174174
liftError = map (lmap ManifestImportError)
@@ -179,7 +179,7 @@ addOrUpdate { ref, fromBower, packageName } metadata = do
179179
gatherManifest :: ExceptT ImportError Aff Manifest
180180
gatherManifest = do
181181
manifestFields <- Manifest.constructManifestFields (RawPackageName $ show packageName) (RawVersion ref) address
182-
Except.mapExceptT liftError $ Manifest.toManifest packageName metadata.location semVer manifestFields
182+
Except.mapExceptT liftError $ Manifest.toManifest packageName metadata.location version manifestFields
183183

184184
runManifest gatherManifest >>= case _ of
185185
Left err ->
@@ -204,7 +204,7 @@ addOrUpdate { ref, fromBower, packageName } metadata = do
204204
log "Packaging the tarball to upload..."
205205
-- We need the version number to upload the package
206206
let newVersion = manifestRecord.version
207-
let newDirname = PackageName.print packageName <> "-" <> SemVer.version newVersion
207+
let newDirname = PackageName.print packageName <> "-" <> Version.printVersion newVersion
208208
liftAff $ FS.rename absoluteFolderPath (tmpDir <> "/" <> newDirname)
209209
let tarballPath = tmpDir <> "/" <> newDirname <> ".tar.gz"
210210
liftEffect $ Tar.create { cwd: tmpDir, folderName: newDirname, archiveName: tarballPath }
@@ -218,7 +218,7 @@ addOrUpdate { ref, fromBower, packageName } metadata = do
218218
log "Uploading package to the storage backend..."
219219
let uploadPackageInfo = { name: packageName, version: newVersion }
220220
uploadPackage uploadPackageInfo tarballPath
221-
log $ "Adding the new version " <> SemVer.version newVersion <> " to the package metadata file (hashes, etc)"
221+
log $ "Adding the new version " <> Version.printVersion newVersion <> " to the package metadata file (hashes, etc)"
222222
log $ "Hash for ref " <> show ref <> " was " <> show hash
223223
let newMetadata = addVersionToMetadata newVersion { hash, ref, bytes } metadata
224224
let metadataFilePath = metadataFile packageName
@@ -260,15 +260,11 @@ runChecks metadata (Manifest manifest) = do
260260
throwWithComment "The `lib` target only allows the following `sources`: `src/**/*.purs`"
261261

262262
log "Check that version is unique"
263-
let prettyVersion = SemVer.version manifest.version
263+
let prettyVersion = Version.printVersion manifest.version
264264
case Object.lookup prettyVersion metadata.releases of
265265
Nothing -> pure unit
266266
Just info -> throwWithComment $ "You tried to upload a version that already exists: " <> show prettyVersion <> "\nIts metadata is: " <> show info
267267

268-
log "Check that the version does not contain any build metadata"
269-
when (SemVer.build manifest.version /= []) do
270-
throwWithComment "Package version should not contain any build-metadata."
271-
272268
log "Check that all dependencies are contained in the registry"
273269
packages <- readPackagesMetadata
274270
let lookupPackage = flip Map.lookup packages <=< (hush <<< PackageName.parse)
@@ -324,7 +320,7 @@ mkMetadataRef = do
324320
pure $ packageName /\ metadata
325321
liftEffect $ Ref.new $ Map.fromFoldable packagesArray
326322

327-
isPackageVersionInMetadata :: PackageName -> SemVer -> MetadataMap -> Boolean
323+
isPackageVersionInMetadata :: PackageName -> Version -> MetadataMap -> Boolean
328324
isPackageVersionInMetadata packageName version metadataMap =
329325
case Map.lookup packageName metadataMap of
330326
Nothing -> false

ci/src/Registry/Index.purs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import Data.Set as Set
1414
import Data.String as String
1515
import Data.String.Pattern (Pattern(..))
1616
import Foreign.Node.FS as Foreign.Node
17-
import Foreign.SemVer (SemVer)
1817
import Node.FS.Aff as FS
1918
import Node.FS.Stats as Stats
2019
import Node.Glob.Basic as Glob
@@ -23,8 +22,9 @@ import Registry.Json as Json
2322
import Registry.PackageName (PackageName)
2423
import Registry.PackageName as PackageName
2524
import Registry.Schema (Manifest(..))
25+
import Registry.Version (Version)
2626

27-
type RegistryIndex = Map PackageName (Map SemVer Manifest)
27+
type RegistryIndex = Map PackageName (Map Version Manifest)
2828

2929
-- | NOTE: Right now, this assumes that manifest files will parse
3030
readRegistryIndex :: FilePath -> Aff RegistryIndex
@@ -61,10 +61,10 @@ readRegistryIndex directory = do
6161
parsedPackages :: Array (Tuple PackageName (NonEmptyArray Manifest))
6262
parsedPackages = map normalizePackage parsed
6363

64-
goManifest :: Manifest -> Tuple SemVer Manifest
64+
goManifest :: Manifest -> Tuple Version Manifest
6565
goManifest manifest@(Manifest { version }) = Tuple version manifest
6666

67-
goPackage :: NonEmptyArray Manifest -> Map SemVer Manifest
67+
goPackage :: NonEmptyArray Manifest -> Map Version Manifest
6868
goPackage = map goManifest >>> Map.fromFoldable
6969

7070
pure

ci/src/Registry/PackageGraph.purs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,29 @@ import Data.Map as Map
1616
import Data.Monoid (guard)
1717
import Data.Set as Set
1818
import Foreign.Object as Object
19-
import Foreign.SemVer (Range, SemVer)
2019
import Registry.Index (RegistryIndex)
2120
import Registry.PackageName (PackageName)
2221
import Registry.PackageName as PackageName
2322
import Registry.Schema (Manifest(..), Target(..))
23+
import Registry.Version (Range, Version)
2424

25-
type PackageWithVersion = { package :: PackageName, version :: SemVer }
25+
type PackageWithVersion = { package :: PackageName, version :: Version }
2626

2727
type PackageWithDependencies = { package :: PackageWithVersion, dependencies :: Array PackageName }
2828

2929
type ConstraintArgs =
30-
{ satisfied :: Map PackageName (Array SemVer)
30+
{ satisfied :: Map PackageName (Array Version)
3131
, constraints :: Array PackageWithDependencies
3232
}
3333

3434
type ConstraintResult =
35-
{ satisfied :: Map PackageName (Array SemVer)
35+
{ satisfied :: Map PackageName (Array Version)
3636
, unsatisfied :: Array PackageWithDependencies
3737
}
3838

3939
type CheckResult =
4040
{ index :: RegistryIndex
41-
, unsatisfied :: Array { package :: PackageName, version :: SemVer, dependencies :: Array PackageName }
41+
, unsatisfied :: Array { package :: PackageName, version :: Version, dependencies :: Array PackageName }
4242
}
4343

4444
-- Produces a maximally self-contained RegistryIndex, recording any unsatisfied dependencies.
@@ -115,7 +115,7 @@ checkRegistryIndex original = do
115115
else
116116
{ satisfied, unsatisfied: constraints }
117117

118-
isSolved :: Map PackageName (Array SemVer) -> PackageName -> Boolean
118+
isSolved :: Map PackageName (Array Version) -> PackageName -> Boolean
119119
isSolved solved package = Map.member package solved
120120

121121
topologicalSort :: RegistryIndex -> Array Manifest
@@ -126,7 +126,7 @@ topologicalSort index = do
126126
$ List.mapMaybe (flip Graph.lookup graph)
127127
$ Graph.topologicalSort graph
128128

129-
type PackageGraph = Graph (Tuple PackageName SemVer) Manifest
129+
type PackageGraph = Graph (Tuple PackageName Version) Manifest
130130

131131
-- We will construct an edge to each version of each dependency PackageName.
132132
-- Note: This function only looks at the `lib` target of a `Manifest`.
@@ -137,19 +137,19 @@ toPackageGraph index =
137137
$ map (map resolveDependencies)
138138
$ foldMap flatten
139139
$ map (map Map.toUnfoldable)
140-
$ (Map.toUnfoldable index :: Array (Tuple PackageName (Map SemVer Manifest)))
140+
$ (Map.toUnfoldable index :: Array (Tuple PackageName (Map Version Manifest)))
141141
where
142-
allVersions :: Map PackageName (Array SemVer)
142+
allVersions :: Map PackageName (Array Version)
143143
allVersions = map (Map.keys >>> Set.toUnfoldable) index
144144

145145
flatten
146-
:: Tuple PackageName (Array (Tuple SemVer Manifest))
147-
-> Array (Tuple (Tuple PackageName SemVer) Manifest)
146+
:: Tuple PackageName (Array (Tuple Version Manifest))
147+
-> Array (Tuple (Tuple PackageName Version) Manifest)
148148
flatten (Tuple packageName versions) = do
149149
Tuple version manifest <- versions
150150
pure $ Tuple (Tuple packageName version) manifest
151151

152-
resolveDependencies :: Manifest -> Tuple Manifest (List (Tuple PackageName SemVer))
152+
resolveDependencies :: Manifest -> Tuple Manifest (List (Tuple PackageName Version))
153153
resolveDependencies manifest = do
154154
let
155155
deps =
@@ -161,7 +161,7 @@ toPackageGraph index =
161161

162162
Tuple manifest deps
163163

164-
resolveDependency :: Tuple PackageName Range -> Array (Tuple PackageName SemVer)
164+
resolveDependency :: Tuple PackageName Range -> Array (Tuple PackageName Version)
165165
resolveDependency (Tuple dependency _) = do
166166
depVersions <- maybe [] Array.singleton (Map.lookup dependency allVersions)
167167
version <- depVersions

ci/src/Registry/PackageUpload.purs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import Registry.Prelude
44

55
import Data.Array as Array
66
import Effect.Aff as Aff
7-
import Foreign.SemVer (SemVer)
8-
import Foreign.SemVer as SemVer
97
import Foreign.S3 as S3
108
import Node.FS.Aff as FS
119
import Registry.PackageName (PackageName)
1210
import Registry.PackageName as PackageName
11+
import Registry.Version (Version)
12+
import Registry.Version as Version
1313

1414
type PackageInfo =
1515
{ name :: PackageName
16-
, version :: SemVer
16+
, version :: Version
1717
}
1818

1919
upload :: PackageInfo -> FilePath -> Aff Unit
@@ -31,7 +31,7 @@ upload { name, version } path = do
3131
filename = Array.fold
3232
[ packageName
3333
, "/"
34-
, SemVer.version version
34+
, Version.printVersion version
3535
, ".tar.gz"
3636
]
3737

0 commit comments

Comments
 (0)