Skip to content

Commit e5e30a5

Browse files
committed
Add *mavenLocal and *ivyLocal shortcuts for
@repository annotation Fixes #86
1 parent b1ef738 commit e5e30a5

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ The following REPL commands are supported:
7878

7979
It is possible to add dynamic dependencies to the notebook using the following annotations:
8080
- `@file:DependsOn(<coordinates>)` - adds artifacts to classpath. Supports absolute and relative paths to class directories or jars, ivy and maven artifacts represented by colon separated string
81-
- `@file:Repository(<absolute-path>)` - adds a directory for relative path resolution or ivy/maven repository
81+
- `@file:Repository(<absolute-path>)` - adds a directory for relative path resolution or ivy/maven repository.
82+
To specify Maven local, use `@file:Repository("*mavenLocal")`.
8283

8384
### Default repositories
8485

src/main/kotlin/org/jetbrains/kotlin/jupyter/resolver.kt

+55-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ open class JupyterScriptDependenciesResolver(resolverConfig: ResolverConfig?) {
2020
private val resolver: ExternalDependenciesResolver
2121

2222
init {
23-
resolver = CompoundDependenciesResolver(FileSystemDependenciesResolver(), IvyResolver())
23+
resolver = CompoundDependenciesResolver(
24+
FileSystemDependenciesResolver(),
25+
RemoteResolverWrapper(IvyResolver())
26+
)
2427
resolverConfig?.repositories?.forEach { resolver.addRepository(it) }
2528
}
2629

@@ -73,3 +76,54 @@ open class JupyterScriptDependenciesResolver(resolverConfig: ResolverConfig?) {
7376
}
7477
}
7578

79+
class RemoteResolverWrapper(private val remoteResolver: ExternalDependenciesResolver):
80+
ExternalDependenciesResolver by remoteResolver {
81+
82+
override fun acceptsRepository(repositoryCoordinates: RepositoryCoordinates): Boolean {
83+
return hasRepository(repositoryCoordinates) ||
84+
remoteResolver.acceptsRepository(repositoryCoordinates)
85+
}
86+
87+
override fun addRepository(repositoryCoordinates: RepositoryCoordinates, options: ExternalDependenciesResolver.Options, sourceCodeLocation: SourceCode.LocationWithId?): ResultWithDiagnostics<Boolean> {
88+
val repository = getRepository(repositoryCoordinates) ?: repositoryCoordinates
89+
return remoteResolver.addRepository(repository, options, sourceCodeLocation)
90+
}
91+
92+
companion object {
93+
private class Shortcut(val shortcut: String, pathGetter: () -> String) {
94+
val path = pathGetter()
95+
}
96+
97+
private val HOME_PATH = System.getProperty("user.home") ?: "~"
98+
private const val PREFIX = "*"
99+
private val repositories: Map<String, Shortcut> =
100+
listOf(
101+
Shortcut("mavenLocal") {
102+
// Simplified version, without looking in XML files
103+
val path = System.getProperty("maven.repo.local")
104+
?: "$HOME_PATH/.m2/repository"
105+
path.toURLString()
106+
},
107+
Shortcut("ivyLocal") {
108+
val path = "$HOME_PATH/.ivy2/cache"
109+
path.toURLString()
110+
},
111+
)
112+
.map {
113+
"${PREFIX}${it.shortcut}" to it
114+
}
115+
.toMap()
116+
117+
fun hasRepository(repository: RepositoryCoordinates): Boolean {
118+
return repositories.containsKey(repository.string)
119+
}
120+
121+
fun getRepository(repository: RepositoryCoordinates): RepositoryCoordinates? {
122+
return repositories[repository.string]?.path?.let { RepositoryCoordinates(it) }
123+
}
124+
125+
private fun String.toURLString(): String {
126+
return File(this).toURI().toURL().toString()
127+
}
128+
}
129+
}

0 commit comments

Comments
 (0)