-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhenforcer.toml
More file actions
129 lines (106 loc) · 4.25 KB
/
henforcer.toml
File metadata and controls
129 lines (106 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
[forAnyModule]
# Require all module header fields
moduleHeaderDescriptionMustExistNonEmpty = true
moduleHeaderCopyrightMustExistNonEmpty = true
moduleHeaderLicenseMustExistNonEmpty = true
moduleHeaderMaintainerMustExistNonEmpty = true
# Documentation: all exports must be documented — zero tolerance
maximumExportsPlusHeaderUndocumented = 0
# @since annotations on every export
maximumExportsWithoutSince = 0
# ZERO open unaliased imports — every import must be explicit or qualified
allowedOpenUnaliasedImports = 0
# Import aliases must be unique across a module — no exceptions
allowedAliasUniqueness = { allAliasesUniqueExcept = [], note = "All import aliases must be unique — zero exceptions" }
# Standard qualified import conventions
[[forAnyModule.allowedQualifications]]
module = "Data.Text"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "T"
[[forAnyModule.allowedQualifications]]
module = "Data.Map"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "Map"
[[forAnyModule.allowedQualifications]]
module = "Data.Map.Strict"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "Map"
[[forAnyModule.allowedQualifications]]
module = "Data.ByteString.Lazy"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "BL"
[[forAnyModule.allowedQualifications]]
module = "Data.Aeson"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "Aeson"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true, unqualified = true }
[[forAnyModule.allowedQualifications]]
module = "Data.Aeson.TH"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "AesonTH"
[[forAnyModule.allowedQualifications]]
module = "Text.Parsec"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "Psc"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true, unqualified = true }
[[forAnyModule.allowedQualifications]]
module = "Network.URI"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "NURI"
[[forAnyModule.allowedQualifications]]
module = "Text.URI"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "URI"
[[forAnyModule.allowedQualifications]]
module = "Text.URI.Lens"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "UL"
[[forAnyModule.allowedQualifications]]
module = "Data.List.NonEmpty"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "NE"
[[forAnyModule.allowedQualifications]]
module = "Control.Lens"
[[forAnyModule.allowedQualifications.importScheme]]
qualified = { qualifiedPre = true, qualifiedPost = true }
alias = "Lens"
# Encapsulate Elem internals — users must go through Scrappy.Elem
encapsulatedTrees = ["Scrappy.Elem"]
# Module tree dependency enforcement — every module's allowed deps are explicit
[[forAnyModule.treeDependencies]]
moduleTree = "Scrappy.Types"
dependencies = []
note = "Types is a leaf — no Scrappy.* dependencies"
[[forAnyModule.treeDependencies]]
moduleTree = "Scrappy.Links"
dependencies = []
note = "Links is a leaf — no Scrappy.* dependencies"
[[forAnyModule.treeDependencies]]
moduleTree = "Scrappy.Find"
dependencies = ["Scrappy.Types"]
note = "Find depends only on Types"
[[forAnyModule.treeDependencies]]
moduleTree = "Scrappy.Scrape"
dependencies = ["Scrappy.Types", "Scrappy.Elem", "Scrappy.Find", "Scrappy.Links"]
note = "Scrape uses Elem parsers, Find, Links, and Types"
# Prelude-heavy modules get 1 open import allowance
[[forSpecifiedModules]]
module = "Scrappy.Elem.Types"
allowedOpenUnaliasedImports = 1
# Re-export module needs open imports for module re-exports
[[forSpecifiedModules]]
module = "Scrappy.Elem"
allowedOpenUnaliasedImports = 4