Dynamically check `FsPath` invariants
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 25/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Necesita aclaración
- Estado de actividad
- Estancado
- Stack tecnológico
- haskell
- Área
- operating-systems
Línea de trabajo
Empieza leyendo la definición de FsPath y el debate de diseño en el pull request 72. Compara las APIs propuestas invariant, unsafeFsPathFromList y fsPathFromList con el comportamiento existente de las rutas y considera la disyuntiva entre force y assert. Se considera terminado cuando se haya acordado si las comprobaciones dinámicas están justificadas y se haya definido un comportamiento de construcción validada y de escape hatch coherente en todos los sistemas operativos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
First suggested in https://github.com/input-output-hk/fs-sim/pull/72#issue-2337874221. FsPath has a number of invariants, and we currently rely on the user to satisfy them. It might be nice to check these invariants dynamically, while also providing an escape hatch for users in case they want to skip the check. For example:
newtype FsPath = UnsafeFsPath { fsPathToList :: [Strict.Text] }
deriving (Eq, Ord, Generic)
deriving newtype NFData
invariant :: FsPath -> Bool
invariant (UnsafeFsPath xs) = all p xs
where p x = -- Paths are monotonic
x /= ".."
&& -- Paths can not have empty directory/file names
not (any Strict.null xs)
&& -- There are no path separators in individual names
not (Text.any (`Text.elem` allPathSeparators) x)
allPathSeparators :: Text
allPathSeparators = Text.pack (Posix.pathSeparators ++ Windows.pathSeparators)
unsafeFsPathFromList :: [Strict.Text] -> FsPath
unsafeFsPathFromList xs = assert (invariant fsp) $ fsp
where fsp = UnsafeFsPath (force xs)
fsPathFromList :: [Strict.Text] -> Maybe FsPath
fsPathFromList xs
| invariant fsp = Just fsp
| otherwise = Nothing
where fsp = UnsafeFsPath (force xs)
Note two things in the example above:
- Both
unsafeFsPathFromListandfsPathFromListensure that the resultingFsPathcontains no thunks my usingforce. Maybe we want toassertinstead that theFsPathcontains no thunks inunsafeFsPathFromList, and have the user ensure that fact. - To ensure similar behaviour across OS distributions, invariant checks do not depend on the underlying OS distribution, hence
allPathSeparators.
We should also consider whether this design pattern is overkill: in practice, users are probably unlikely to use non-sensible path names
- Lenguaje dominante
- Haskell
- Estrellas
- 2
- Forks
- 6
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de IntersectMBO/fs-sim
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
IntersectMBO/fs-sim#137 ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 45/100
IntersectMBO/fs-sim#136 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
IntersectMBO/fs-sim#135 ·
-
No 0.4.1.0 tagAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 55/100
IntersectMBO/fs-sim#125 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 48/100
IntersectMBO/fs-sim#122 ·
Todos los issues de IntersectMBO/fs-sim
Issues similares
-
Allow QuickCheck 2.17Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 75/100
-
15-minutes 5-minutes algorithm any-language beginner-friendly c cpp csharp easy go good first issue hacktoberfest help wanted java javascript kotlin python rust swift typescript
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
Huerte/algo-solutions-python#260 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
IntersectMBO/cardano-ledger#6276 ·
Los mantenedores suelen responder en 1 día