[pycharm] PY-70535 initiated HF cards usage collector module

GitOrigin-RevId: 142c5c696ca52268db583a8fdfce8426d912ee20
This commit is contained in:
Bogdan Kirilenko
2024-02-19 18:40:07 +01:00
committed by intellij-monorepo-bot
parent 00e97f8fe5
commit 5ab36db4ae
5 changed files with 56 additions and 12 deletions

View File

@@ -28,5 +28,6 @@
<orderEntry type="module" module-name="intellij.driver.sdk" />
<orderEntry type="module" module-name="intellij.platform.ide" />
<orderEntry type="module" module-name="intellij.platform.markdown.utils" />
<orderEntry type="module" module-name="intellij.platform.statistics" />
</component>
</module>

View File

@@ -11,5 +11,6 @@
<platform.backend.documentation.psiTargetProvider id="HuggingFaceDocumentationProvider"
implementation="com.intellij.python.community.impl.huggingFace.documentation.HuggingFaceDocumentationTargetProvider"/>
<lang.inspectionSuppressor language="Python" implementationClass="com.intellij.python.community.impl.huggingFace.service.HuggingFaceTypoInspectionSuppressor"/>
<statistics.counterUsagesCollector implementationClass="com.intellij.python.community.impl.huggingFace.service.HuggingFaceCardsUsageCollector"/>
</extensions>
</idea-plugin>

View File

@@ -8,14 +8,15 @@ import com.intellij.python.community.impl.huggingFace.api.HuggingFaceURLProvider
import com.intellij.openapi.util.NlsSafe
import java.net.URL
import com.intellij.openapi.util.Key
import com.intellij.python.community.impl.huggingFace.HuggingFaceEntityKind
import com.intellij.python.community.impl.huggingFace.service.HuggingFaceCardsUsageCollector
val HUGGING_FACE_ENTITY_NAME_KEY = Key.create<Boolean>("HUGGING_FACE_ENTITY_NAME_KEY")
abstract class HuggingFaceEntityPsiElement(
private val parent: PsiElement,
private val entityName: String,
private val getEntityLink: (String) -> URL
private val entityName: String
) : FakePsiElement() {
init {
parent.putUserData(HUGGING_FACE_ENTITY_NAME_KEY, true)
@@ -23,16 +24,22 @@ abstract class HuggingFaceEntityPsiElement(
override fun getParent(): PsiElement = parent
override fun navigate(requestFocus: Boolean) {
BrowserUtil.browse(getEntityLink(entityName))
}
@NlsSafe
fun stringValue(): String = entityName
}
class HuggingFaceModelPsiElement(parent: PsiElement, modelName: String
) : HuggingFaceEntityPsiElement(parent, modelName, HuggingFaceURLProvider::getModelCardLink)
class HuggingFaceModelPsiElement(parent: PsiElement, private val modelName: String
) : HuggingFaceEntityPsiElement(parent, modelName) {
override fun navigate(requestFocus: Boolean) {
HuggingFaceCardsUsageCollector.NAVIGATION_LINK_IN_EDITOR_CLICKED.log(modelName, HuggingFaceEntityKind.MODEL)
BrowserUtil.browse(HuggingFaceURLProvider.getModelCardLink(modelName))
}
}
class HuggingFaceDatasetPsiElement(parent: PsiElement, datasetName: String
) : HuggingFaceEntityPsiElement(parent, datasetName, HuggingFaceURLProvider::getDatasetCardLink)
class HuggingFaceDatasetPsiElement(parent: PsiElement, private val datasetName: String
) : HuggingFaceEntityPsiElement(parent, datasetName) {
override fun navigate(requestFocus: Boolean) {
HuggingFaceCardsUsageCollector.NAVIGATION_LINK_IN_EDITOR_CLICKED.log(datasetName, HuggingFaceEntityKind.DATASET)
BrowserUtil.browse(HuggingFaceURLProvider.getDatasetCardLink(datasetName))
}
}

View File

@@ -3,6 +3,7 @@ package com.intellij.python.community.impl.huggingFace.documentation
import com.intellij.ide.IdeBundle
import com.intellij.model.Pointer
import com.intellij.openapi.application.readAction
import com.intellij.platform.backend.documentation.DocumentationResult
import com.intellij.platform.backend.documentation.DocumentationTarget
import com.intellij.platform.backend.presentation.TargetPresentation
@@ -19,6 +20,7 @@ import com.intellij.python.community.impl.huggingFace.cache.HuggingFaceDatasetsC
import com.intellij.python.community.impl.huggingFace.cache.HuggingFaceMdCacheEntry
import com.intellij.python.community.impl.huggingFace.cache.HuggingFaceMdCardsCache
import com.intellij.python.community.impl.huggingFace.cache.HuggingFaceModelsCache
import com.intellij.python.community.impl.huggingFace.service.HuggingFaceCardsUsageCollector
import com.intellij.python.community.impl.huggingFace.service.PyHuggingFaceBundle
import com.intellij.refactoring.suggested.createSmartPointer
import com.jetbrains.python.psi.*
@@ -71,11 +73,12 @@ internal class HuggingFaceDocumentationTarget(private val myElement : PsiElement
} else {
HuggingFaceDatasetsCache.getBasicData(entityId)
}
// shall we log failures?
if (entityDataApiContent == null) { return@asyncDocumentation DocumentationResult.documentation(PyHuggingFaceBundle.message("python.hugging.face.could.not.fetch")) }
val modelCardContent = fetchOrRetrieveModelCard(entityDataApiContent, entityId, entityKind)
val project = myElement.project
val project = readAction { myElement.project }
HuggingFaceCardsUsageCollector.CARD_SHOWN_ON_HOVER.log(entityId, entityKind)
val htmlContent = HuggingFaceHtmlBuilder(
project,
entityDataApiContent,

View File

@@ -0,0 +1,32 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.python.community.impl.huggingFace.service
import com.intellij.internal.statistic.eventLog.EventLogGroup
import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector
import com.intellij.internal.statistic.eventLog.events.EventFields
import com.intellij.python.community.impl.huggingFace.HuggingFaceEntityKind
object HuggingFaceCardsUsageCollector: CounterUsagesCollector() { // PY-70535
private val GROUP = EventLogGroup("python.hugging.face.cards", 1)
private val eventEntityKind = EventFields.Enum<HuggingFaceEntityKind>("entity_kind")
val CARD_SHOWN_ON_HOVER = GROUP.registerEvent(
"card.shown.on.hover",
EventFields.StringValidatedByInlineRegexp("entity-name", """[a-zA-Z0-9\.]+/[a-zA-Z0-9\.]+"""),
eventEntityKind
)
val NAVIGATION_LINK_IN_EDITOR_CLICKED = GROUP.registerEvent(
"navigation.link.clicked",
EventFields.StringValidatedByInlineRegexp("entity-name", """[a-zA-Z0-9\.]+/[a-zA-Z0-9\.]+"""),
eventEntityKind
)
// todo:
//card shown in Documentation toolwindow + card type (model, dataset)
// link clicked in the card + card type (model, dataset) + link type (signature 'powered by Hugging Face' or
// card name or any link in the description)
override fun getGroup(): EventLogGroup = GROUP
}