diff --git a/src/Nirum/Targets/Python.hs b/src/Nirum/Targets/Python.hs index 49f724c..7a76711 100644 --- a/src/Nirum/Targets/Python.hs +++ b/src/Nirum/Targets/Python.hs @@ -31,6 +31,7 @@ module Nirum.Targets.Python ( Code , insertStandardImport , insertThirdPartyImports , runCodeGen + , spreadModulePaths , stringLiteral , toAttributeName , toClassName @@ -840,6 +841,13 @@ compileModule pythonVersion' source = , ((3, 5), require "typing" "typing" $ standardImports context) ] +spreadModulePaths :: [ModulePath] -> [Code] +spreadModulePaths modulePaths = pathsToPackageNames $ map ancestors modulePaths + where + pathsToPackageNames :: [S.Set ModulePath] -> [Code] + pathsToPackageNames modulePaths' = S.toAscList $ S.map toImportPath $ + S.unions modulePaths' + compilePackageMetadata :: Package' -> InstallRequires -> Code compilePackageMetadata package@Package { metadata = metadata' } (InstallRequires deps optDeps) = @@ -919,7 +927,7 @@ setup( | Author { email = Just e } <- authors metadata' ] pPackages :: Code - pPackages = strings $ map toImportPath $ MS.keys $ modules package + pPackages = strings $ spreadModulePaths $ MS.keys $ modules package pInstallRequires :: Code pInstallRequires = strings $ S.toList deps pPolyfillRequires :: Code diff --git a/test/Nirum/Targets/PythonSpec.hs b/test/Nirum/Targets/PythonSpec.hs index 4a28b64..6f1d129 100644 --- a/test/Nirum/Targets/PythonSpec.hs +++ b/test/Nirum/Targets/PythonSpec.hs @@ -36,11 +36,12 @@ import Nirum.Constructs.TypeExpression ( TypeExpression ( ListModifier , TypeIdentifier ) ) -import Nirum.Package (Package, resolveBoundModule) +import Nirum.Package (Package(modules), resolveBoundModule) import Nirum.Package.Metadata ( Author (Author, email, name, uri) , Metadata (Metadata, authors, target, version) , Target (compilePackage) ) +import qualified Nirum.Package.ModuleSet as MS import Nirum.PackageSpec (createPackage) import qualified Nirum.Targets.Python as PY import Nirum.Targets.Python ( Source (Source) @@ -349,6 +350,15 @@ spec = parallel $ forM_ versions $ \ (ver, typing) -> do (3, 4) "ipaddress" (req4 `unionInstallRequires` req5) `shouldBe` req6 (req5 `unionInstallRequires` req4) `shouldBe` req6 + describe "Add ancestors of packages" $ do + let (Source pkg _) = makeDummySource $ Module [] Nothing + modulePaths = MS.keys $ modules pkg + specify "spreadModulePaths" $ + PY.spreadModulePaths modulePaths `shouldBe` [ "foo" + , "foo.bar" + , "qux" + ] + {-# ANN module ("HLint: ignore Functor law" :: String) #-} {-# ANN module ("HLint: ignore Monad law, left identity" :: String) #-}