Thu Sep 27 22:38:03 BST 2012 Duncan Coutts <dun...@well-typed.com> * Step towards greater encapsulation and modularity of the feature modules Ignore-this: 2a79f6a60fdf42be6166a261d3a54de4 The Distribution.Server.Feature.* modules are the way we add functionality to the hackage server in a nice modular way. For this to be robust, these features need to properly encapsulate the state they manage, and provide APIs for other features to use that state in disciplined ways. Currently the AcidState stuff is global, rather than partitioned between features. This is primarily for historical reasons (the original happstack-state forced the state to be application global), and for ease of porting to the new acid-state package, we kept the same pattern of global shared state (in the Distribution.Server.Acid module). Obviously we want to split this up so that each feature encapsulates its own state. The first step to doing this more easily is to change the features to use a "first class module" style, where all the exported functions are part of a feature record. This will make things much easier since as we will not need to pass state tokens around to every query or update. e.g instead of: foo :: UsersFeature -> ... foo usersF ... = ... users <- queryGetUsersDb usersF it'll be simply foo :: UsersFeature -> foo UsersFeature{..} ... = users <- queryGetUsersDb And indeed, most functions don't need to take the feature arguments explicitly, just the top level initBlahFeature functions, with all other functions in the module defined in the where clause. This may seem a little odd, but in my experiments in trying to encapsulate the state properly, this seems like the best approach.
M ./Distribution/Server/Features.hs -10 +14 M ./Distribution/Server/Features/BuildReports.hs -91 +91 M ./Distribution/Server/Features/Check.hs -174 +185 M ./Distribution/Server/Features/Core.hs -209 +227 M ./Distribution/Server/Features/Distro.hs -53 +55 M ./Distribution/Server/Features/Documentation.hs -55 +56 M ./Distribution/Server/Features/DownloadCount.hs -31 +35 M ./Distribution/Server/Features/HaskellPlatform.hs -12 +22 M ./Distribution/Server/Features/Html.hs -762 +763 M ./Distribution/Server/Features/Mirror.hs -49 +72 M ./Distribution/Server/Features/NameSearch.hs -38 +42 M ./Distribution/Server/Features/PackageContents.hs -33 +34 M ./Distribution/Server/Features/PackageList.hs -51 +58 M ./Distribution/Server/Features/Packages.hs -5 +6 M ./Distribution/Server/Features/PreferredVersions.hs -131 +139 M ./Distribution/Server/Features/ReverseDependencies.hs +1 M ./Distribution/Server/Features/ServerApiDoc.hs -4 +4 M ./Distribution/Server/Features/Tags.hs -72 +89 M ./Distribution/Server/Features/Upload.hs -203 +241 M ./Distribution/Server/Features/Users.hs -316 +370 M ./Distribution/Server/Users/State.hs -11 +1 Thu Sep 27 23:17:08 BST 2012 Duncan Coutts <dun...@well-typed.com> * Add checkpoint and shutdown to feature interface Ignore-this: 85c45148ef67dc5bff42b65c389ac1e1 and start to use it in the server checkpoint and shutdown. Eventually the global startAcid/stopAcid will go away. M ./Distribution/Server.hs -2 +7 M ./Distribution/Server/Features.hs +6 M ./Distribution/Server/Framework/Feature.hs +4 Thu Sep 27 23:24:00 BST 2012 Duncan Coutts <dun...@well-typed.com> * Convert UserFeature to encapsulating its state Ignore-this: e95e7ec792edc773acb235b6f4e38146 It manages the set of users and the admin user group M ./Distribution/Server.hs -13 +17 M ./Distribution/Server/Acid.hs -25 +9 M ./Distribution/Server/Features.hs -2 +2 M ./Distribution/Server/Features/BuildReports.hs -5 +4 M ./Distribution/Server/Features/Check.hs -2 +1 M ./Distribution/Server/Features/Core.hs -10 +5 M ./Distribution/Server/Features/Html.hs -5 +4 M ./Distribution/Server/Features/Mirror.hs -4 +4 M ./Distribution/Server/Features/Packages.hs -3 +2 M ./Distribution/Server/Features/Upload.hs -7 +6 M ./Distribution/Server/Features/Users.hs -31 +67 M ./Distribution/Server/Users/Backup.hs -16 +14 Fri Sep 28 03:30:08 BST 2012 Duncan Coutts <dun...@well-typed.com> * Massage the feature modules to follow a common pattern Ignore-this: ca490df4714b9c892e14232f0d6d1d04 This is partly intended to clarify what mutable state each module owns. We separate the initBlahFeature which creates the state, from a pure blahFeature function which is the module functor, that is it defines the behaviour for the new BlahFeature record in terms of the records of the imported modules, and the local private state. Sometimes these two parts are mutually dependent, in which case we use recursive do. M ./Distribution/Server/Features/BuildReports.hs -33 +47 M ./Distribution/Server/Features/Check.hs -6 +8 M ./Distribution/Server/Features/Core.hs -3 +3 M ./Distribution/Server/Features/Distro.hs -11 +23 M ./Distribution/Server/Features/Documentation.hs -40 +49 M ./Distribution/Server/Features/DownloadCount.hs -39 +52 M ./Distribution/Server/Features/HaskellPlatform.hs -18 +20 M ./Distribution/Server/Features/Html.hs -42 +75 M ./Distribution/Server/Features/Mirror.hs -2 +4 M ./Distribution/Server/Features/NameSearch.hs -37 +51 M ./Distribution/Server/Features/PackageContents.hs -27 +38 M ./Distribution/Server/Features/PackageList.hs -57 +78 M ./Distribution/Server/Features/Packages.hs -21 +42 M ./Distribution/Server/Features/PreferredVersions.hs -33 +43 M ./Distribution/Server/Features/ReverseDependencies.hs -30 +46 M ./Distribution/Server/Features/Tags.hs -3 +3 M ./Distribution/Server/Features/Upload.hs -3 +3 M ./Distribution/Server/Features/Users.hs -3 +3 Fri Sep 28 10:16:26 BST 2012 Duncan Coutts <dun...@well-typed.com> * Make the TagsFeature encapsulate its state Ignore-this: 8e92f0f5d962aa2580a274a93b416d4c M ./Distribution/Server/Acid.hs -12 +1 M ./Distribution/Server/Features/Html.hs -3 +3 M ./Distribution/Server/Features/PackageList.hs -2 +2 M ./Distribution/Server/Features/Tags.hs -16 +45 M ./Distribution/Server/Packages/Backup/Tags.hs -7 +7 _______________________________________________ cabal-devel mailing list cabal-devel@haskell.org http://www.haskell.org/mailman/listinfo/cabal-devel