1 /*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package androidx.build
18
19 import androidx.build.ArtifactsPredicate.All
20 import androidx.build.ArtifactsPredicate.Exact
21 import androidx.build.ArtifactsPredicate.Group
22 import androidx.build.Strategy.TipOfTree
23 import androidx.build.Strategy.Prebuilts
24 import androidx.build.Strategy.Ignore
25
<lambda>null26 val RELEASE_RULE = docsRules("public") {
27 val defaultVersion = "1.0.0-alpha3"
28 prebuilts(LibraryGroups.ANNOTATION, defaultVersion)
29 prebuilts(LibraryGroups.APPCOMPAT, defaultVersion)
30 prebuilts(LibraryGroups.ASYNCLAYOUTINFLATER, defaultVersion)
31 prebuilts(LibraryGroups.BROWSER, defaultVersion)
32 prebuilts(LibraryGroups.CAR, defaultVersion)
33 .addStubs("car/car-stubs/android.car.jar")
34 prebuilts(LibraryGroups.CARDVIEW, defaultVersion)
35 prebuilts(LibraryGroups.COLLECTION, defaultVersion)
36 prebuilts(LibraryGroups.CONTENTPAGER, defaultVersion)
37 prebuilts(LibraryGroups.COORDINATORLAYOUT, defaultVersion)
38 prebuilts(LibraryGroups.CORE, defaultVersion)
39 prebuilts(LibraryGroups.CURSORADAPTER, defaultVersion)
40 prebuilts(LibraryGroups.CUSTOMVIEW, defaultVersion)
41 prebuilts(LibraryGroups.DOCUMENTFILE, defaultVersion)
42 prebuilts(LibraryGroups.DRAWERLAYOUT, defaultVersion)
43 prebuilts(LibraryGroups.DYNAMICANIMATION, defaultVersion)
44 prebuilts(LibraryGroups.EMOJI, defaultVersion)
45 prebuilts(LibraryGroups.EXIFINTERFACE, defaultVersion)
46 prebuilts(LibraryGroups.FRAGMENT, defaultVersion)
47 prebuilts(LibraryGroups.GRIDLAYOUT, defaultVersion)
48 prebuilts(LibraryGroups.HEIFWRITER, defaultVersion)
49 prebuilts(LibraryGroups.INTERPOLATOR, defaultVersion)
50 prebuilts(LibraryGroups.LEANBACK, defaultVersion)
51 prebuilts(LibraryGroups.LEGACY, defaultVersion)
52 prebuilts(LibraryGroups.LOADER, defaultVersion)
53 prebuilts(LibraryGroups.LOCALBROADCASTMANAGER, defaultVersion)
54 prebuilts(LibraryGroups.MEDIA, defaultVersion)
55 prebuilts(LibraryGroups.MEDIAROUTER, defaultVersion)
56 prebuilts(LibraryGroups.PALETTE, defaultVersion)
57 prebuilts(LibraryGroups.PERCENTLAYOUT, defaultVersion)
58 prebuilts(LibraryGroups.PREFERENCE, defaultVersion)
59 prebuilts(LibraryGroups.PRINT, defaultVersion)
60 prebuilts(LibraryGroups.RECOMMENDATION, defaultVersion)
61 prebuilts(LibraryGroups.RECYCLERVIEW, defaultVersion)
62 prebuilts(LibraryGroups.SLICE, defaultVersion)
63 prebuilts(LibraryGroups.SLIDINGPANELAYOUT, defaultVersion)
64 prebuilts(LibraryGroups.SWIPEREFRESHLAYOUT, defaultVersion)
65 prebuilts(LibraryGroups.TEXTCLASSIFIER, defaultVersion)
66 prebuilts(LibraryGroups.TRANSITION, defaultVersion)
67 prebuilts(LibraryGroups.TVPROVIDER, defaultVersion)
68 prebuilts(LibraryGroups.VECTORDRAWABLE, defaultVersion)
69 prebuilts(LibraryGroups.VIEWPAGER, defaultVersion)
70 prebuilts(LibraryGroups.WEAR, defaultVersion)
71 .addStubs("wear/wear_stubs/com.google.android.wearable-stubs.jar")
72 prebuilts(LibraryGroups.WEBKIT, defaultVersion)
73 val flatfootVersion = "2.0.0-alpha1"
74 prebuilts(LibraryGroups.ROOM, flatfootVersion)
75 prebuilts(LibraryGroups.PERSISTENCE, flatfootVersion)
76 prebuilts(LibraryGroups.LIFECYCLE, flatfootVersion)
77 prebuilts(LibraryGroups.ARCH_CORE, flatfootVersion)
78 prebuilts(LibraryGroups.PAGING, flatfootVersion)
79 prebuilts(LibraryGroups.NAVIGATION, "1.0.0-alpha01")
80 prebuilts(LibraryGroups.WORKMANAGER, "1.0.0-alpha02")
81 default(Ignore)
82 }
83
<lambda>null84 val TIP_OF_TREE = docsRules("tipOfTree") {
85 default(TipOfTree)
86 }
87
88 /**
89 * Rules are resolved in addition order. So if you have two rules that specify how docs should be
90 * built for a module, first defined rule wins.
91 */
docsRulesnull92 fun docsRules(name: String, init: PublishDocsRulesBuilder.() -> Unit): PublishDocsRules {
93 val f = PublishDocsRulesBuilder(name)
94 f.init()
95 return f.build()
96 }
97
98 class PublishDocsRulesBuilder(private val name: String) {
99
100 private val rules: MutableList<DocsRule> = mutableListOf()
101 /**
102 * docs for projects within [groupName] will be built from sources.
103 */
tipOfTreenull104 fun tipOfTree(groupName: String) {
105 rules.add(DocsRule(Group(groupName), TipOfTree))
106 }
107
108 /**
109 * docs for a project with the given [groupName] and [name] will be built from sources.
110 */
tipOfTreenull111 fun tipOfTree(groupName: String, name: String) {
112 rules.add(DocsRule(Exact(groupName, name), TipOfTree))
113 }
114
115 /**
116 * docs for a project with the given [groupName] and [name] will be built from a prebuilt with
117 * the given [version].
118 */
prebuiltsnull119 fun prebuilts(groupName: String, moduleName: String, version: String) {
120 rules.add(DocsRule(Exact(groupName, moduleName), Prebuilts(Version(version))))
121 }
122
123 /**
124 * docs for projects within [groupName] will be built from prebuilts with the given [version]
125 */
prebuiltsnull126 fun prebuilts(groupName: String, version: String) = prebuilts(groupName, Version(version))
127
128 /**
129 * docs for projects within [groupName] will be built from prebuilts with the given [version]
130 */
131 fun prebuilts(groupName: String, version: Version): Prebuilts {
132 val strategy = Prebuilts(version)
133 rules.add(DocsRule(Group(groupName), strategy))
134 return strategy
135 }
136
137 /**
138 * defines a default strategy for building docs
139 */
defaultnull140 fun default(strategy: Strategy) {
141 rules.add(DocsRule(All, strategy))
142 }
143
144 /**
145 * docs for projects within [groupName] won't be built
146 */
ignorenull147 fun ignore(groupName: String) {
148 rules.add(DocsRule(Group(groupName), Ignore))
149 }
150
151 /**
152 * docs for a specified project won't be built
153 */
ignorenull154 fun ignore(groupName: String, name: String) {
155 rules.add(DocsRule(Exact(groupName, name), Ignore))
156 }
157
buildnull158 fun build() = PublishDocsRules(name, rules)
159 }
160
161 sealed class ArtifactsPredicate {
162 abstract fun apply(inGroup: String, inName: String): Boolean
163 object All : ArtifactsPredicate() {
164 override fun apply(inGroup: String, inName: String) = true
165 }
166 class Group(val group: String) : ArtifactsPredicate() {
167 override fun apply(inGroup: String, inName: String) = inGroup == group
168 override fun toString() = "\"$group\""
169 }
170 class Exact(val group: String, val name: String) : ArtifactsPredicate() {
171 override fun apply(inGroup: String, inName: String) = group == inGroup && name == inName
172 override fun toString() = "\"$group\", \"$name\""
173 }
174 }
175
176 data class DocsRule(val predicate: ArtifactsPredicate, val strategy: Strategy) {
toStringnull177 override fun toString(): String {
178 if (predicate is All) {
179 return "default($strategy)"
180 }
181 return when (strategy) {
182 is Prebuilts -> "prebuilts($predicate, \"${strategy.version}\")"
183 is Ignore -> "ignore($predicate)"
184 is TipOfTree -> "tipOfTree($predicate)"
185 }
186 }
187 }
188
189 sealed class Strategy {
190 object TipOfTree : Strategy()
191 object Ignore : Strategy()
192 class Prebuilts(val version: Version) : Strategy() {
193 var stubs: MutableList<String>? = null
addStubsnull194 fun addStubs(path: String) {
195 if (stubs == null) {
196 stubs = mutableListOf()
197 }
198 stubs!!.add(path)
199 }
200
toStringnull201 override fun toString() = "Prebuilts(\"$version\")"
202 }
203 }
204
205 class PublishDocsRules(val name: String, private val rules: List<DocsRule>) {
206 fun resolve(groupName: String, moduleName: String): DocsRule {
207 return rules.find { it.predicate.apply(groupName, moduleName) } ?: throw Error()
208 }
209 }