Skip to content

Commit 4c506be

Browse files
authored
Fix PDM Parser when it encounters multiple OR lines (#1523)
* initial changes and testing * fix test file * identified the true failing cases * use the right foldl * fix formatting
1 parent d828dc7 commit 4c506be

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-9
lines changed

src/Strategy/Python/Util.hs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Control.Monad (join)
1515
import Control.Monad.Identity (Identity)
1616
import Data.Char qualified as C
1717
import Data.Foldable (asum, find, for_)
18+
import Data.List (foldl')
1819
import Data.Map.Strict qualified as Map
1920
import Data.String.Conversion (toText)
2021
import Data.Text (Text)
@@ -257,21 +258,23 @@ requirementParser = specification
257258
]
258259
marker_var :: Parser Text
259260
marker_var = label "marker_var" $ whitespace *> (env_var <|> fmap toText python_str)
261+
marker_expr :: Parser Marker
260262
marker_expr =
261263
label "marker_expr" $
262264
MarkerExpr <$> marker_var <*> marker_op <*> marker_var
263265
<|> whitespace *> char '(' *> marker_or <* char ')'
264266

265-
marker_and =
266-
label "marker_and" $
267-
try (MarkerAnd <$> marker_expr <* whitespace <* string "and" <*> marker_expr)
268-
<|> marker_expr
267+
marker_and :: Parser Marker
268+
marker_and = label "marker_and" $ do
269+
first <- marker_expr
270+
rest <- many (try $ whitespace *> string "and" *> whitespace *> marker_expr)
271+
pure $ foldl' MarkerAnd first rest
269272

270273
marker_or :: Parser Marker
271-
marker_or =
272-
label "marker_or" $
273-
try (MarkerOr <$> marker_and <* whitespace <* string "or" <*> marker_and)
274-
<|> marker_and
274+
marker_or = label "marker_or" $ do
275+
first <- marker_and
276+
rest <- many (try $ whitespace *> string "or" *> whitespace *> marker_and)
277+
pure $ foldl' MarkerOr first rest
275278

276279
marker = label "marker" marker_or
277280
quoted_marker = label "quoted_marker" $ char ';' *> whitespace *> marker

test/Pdm/PdmSpec.hs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ spec = do
7171
-- > └── pluggy 1.0.0 [ required: <2.0,>=0.12 ]
7272
-- > requests 2.25.1 [ required: ==2.25.1 ]
7373
-- > ├── certifi 2023.5.7 [ required: >=2017.4.17 ]
74+
-- > ├── greenlet 3.1.1 [ required: !=0.4.17 ]
7475
-- > ├── chardet 4.0.0 [ required: <5,>=3.0.2 ]
7576
-- > ├── idna 2.10 [ required: <3,>=2.5 ]
7677
-- > └── urllib3 1.26.16 [ required: <1.27,>=1.21.1 ]
@@ -92,6 +93,7 @@ spec = do
9293
, iniconfig
9394
, packaging
9495
, pluggy
96+
, greenlet
9597
, requests
9698
, certifi
9799
, chardet
@@ -104,8 +106,9 @@ spec = do
104106
, (pytest, iniconfig)
105107
, (pytest, packaging)
106108
, (pytest, pluggy)
107-
, (requests, certifi)
108109
, (requests, chardet)
110+
, (requests, greenlet)
111+
, (requests, certifi)
109112
, (requests, idna)
110113
, (requests, urllib3)
111114
]
@@ -176,3 +179,6 @@ urllib3 = mkPipProdDep "urllib3@1.26.16"
176179

177180
colorama :: Dependency
178181
colorama = mkPipDevDep "colorama@0.4.6"
182+
183+
greenlet :: Dependency
184+
greenlet = mkPipProdDep "greenlet@3.1.1"

test/Pdm/testdata/basic/pdm.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/Python/RequirementsSpec.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ examples =
3030
, "name; os_name=='a' or os_name=='b'"
3131
, "name; os_name=='a' and os_name=='b' or os_name=='c'"
3232
, "name; os_name=='a' and (os_name=='b' or os_name=='c')"
33+
, "name; os_name=='a' and (os_name=='b' or os_name=='c' and os_name=='d')"
34+
, "name; (os_name=='b' or os_name=='c' and os_name=='d') and os_name=='a'"
3335
, "name; os_name=='a' or os_name=='b' and os_name=='c'"
3436
, "name; (os_name=='a' or os_name=='b') and os_name=='c'"
3537
]

0 commit comments

Comments
 (0)