Skip to content

Release/2.1.0 #128

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ jobs:
with:
java-version: 11

- name: Install sbt
uses: sbt/setup-sbt@v1

- name: Run tests
run: sbt coverage +test

Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ jobs:
- uses: actions/checkout@v2
- uses: coursier/cache-action@v6

- name: Install sbt
uses: sbt/setup-sbt@v1

- name: Make site
run: sbt makeSite

Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
Version 2.1.0 (2025-03-05)
--------------------------
Add chatbot medium (#127)
Add sbt installation step to CI (#127)

Version 2.0.0 (2022-03-07)
--------------------------
Migrate from travis to github actions (#120)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ The Scala implementation is a core component of [Snowplow][snowplow], the open-s
You can add the following to your SBT config:

```scala
val refererParser = "com.snowplowanalytics" %% "scala-referer-parser" % "2.0.0"
val refererParser = "com.snowplowanalytics" %% "scala-referer-parser" % "2.1.0"
```

### Usage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ object Medium {
case SocialMedium.value => Some(SocialMedium)
case EmailMedium.value => Some(EmailMedium)
case PaidMedium.value => Some(PaidMedium)
case ChatbotMedium.value => Some(ChatbotMedium)
case _ => None
}

Expand All @@ -38,6 +39,7 @@ object Medium {
val Social = SocialMedium
val Email = EmailMedium
val Paid = PaidMedium
val Chatbot = ChatbotMedium
}

case object UnknownMedium extends Medium("unknown")
Expand All @@ -46,3 +48,4 @@ case object InternalMedium extends Medium("internal")
case object SocialMedium extends Medium("social")
case object EmailMedium extends Medium("email")
case object PaidMedium extends Medium("paid")
case object ChatbotMedium extends Medium("chatbot")
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ class Parser private[refererparser] (referers: Map[String, RefererLookup]) {
case SocialMedium => SocialReferer(SocialMedium, lookup.source)
case EmailMedium => EmailReferer(EmailMedium, lookup.source)
case PaidMedium => PaidReferer(PaidMedium, lookup.source)
case ChatbotMedium => ChatbotReferer(ChatbotMedium, lookup.source)
}
}
.getOrElse(UnknownReferer(UnknownMedium))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ final case class InternalReferer(medium: Medium) extends Referer
final case class SocialReferer(medium: Medium, source: String) extends Referer
final case class EmailReferer(medium: Medium, source: String) extends Referer
final case class PaidReferer(medium: Medium, source: String) extends Referer
final case class ChatbotReferer(medium: Medium, source: String) extends Referer
34 changes: 33 additions & 1 deletion src/test/resources/referer-tests.json
Original file line number Diff line number Diff line change
Expand Up @@ -246,5 +246,37 @@
"source": null,
"term": null,
"known": false
}
},
{
"spec": "ChatGPT",
"uri": "https://www.chatgpt.com",
"medium": "chatbot",
"source": "ChatGPT",
"term": null,
"known": true
},
{
"spec": "Google Gemini",
"uri": "https://gemini.google.com",
"medium": "chatbot",
"source": "Google Gemini",
"term": null,
"known": true
},
{
"spec": "Microsoft Copilot",
"uri": "https://www.copilot.microsoft.com/account?u=1&id=1",
"medium": "chatbot",
"source": "Microsoft Copilot",
"term": null,
"known": true
},
{
"spec": "META.ai",
"uri": "https://meta.ai",
"medium": "chatbot",
"source": "META.ai",
"term": null,
"known": true
}
]
23 changes: 23 additions & 0 deletions src/test/resources/referers.json
Original file line number Diff line number Diff line change
Expand Up @@ -1100,5 +1100,28 @@
"odnoklassniki.ru"
]
}
},
"chatbot": {
"ChatGPT": {
"domains": [
"chatgpt.com",
"chat.openai.com"
]
},
"Google Gemini": {
"domains": [
"gemini.google.com"
]
},
"Microsoft Copilot": {
"domains": [
"copilot.microsoft.com"
]
},
"META.ai": {
"domains": [
"meta.ai"
]
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class JsonParseTest extends Specification {
case Some(SocialMedium) => Some(SocialReferer(SocialMedium, test.source.get))
case Some(EmailMedium) => Some(EmailReferer(EmailMedium, test.source.get))
case Some(PaidMedium) => Some(PaidReferer(PaidMedium, test.source.get))
case Some(ChatbotMedium) => Some(ChatbotReferer(ChatbotMedium, test.source.get))
case _ => throw new Exception(s"Bad medium: ${test.medium}")
}
val ioActual = ioParser.parse(new URI(test.uri), Some(pageHost), internalDomains)
Expand Down
37 changes: 37 additions & 0 deletions src/test/scala/com/snowplowanalytics/refererparser/ParseTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,42 @@ class ParseTest extends Specification with DataTables {
Some("keyword 1%")
)
)
test(
RefererSpec(
"ChatGPT",
"https://www.chatgpt.com",
Medium.Chatbot,
Some("ChatGPT"),
None
)
)
test(
RefererSpec(
"Google Gemini",
"https://gemini.google.com",
Medium.Chatbot,
Some("Google Gemini"),
None
)
)
test(
RefererSpec(
"Microsoft Copilot",
"https://www.copilot.microsoft.com/account?u=1&id=1",
Medium.Chatbot,
Some("Microsoft Copilot"),
None
)
)
test(
RefererSpec(
"META.ai",
"https://meta.ai",
Medium.Chatbot,
Some("META.ai"),
None
)
)
}

def genExpected(medium: Medium, source: Option[String], term: Option[String]) =
Expand All @@ -406,5 +442,6 @@ class ParseTest extends Specification with DataTables {
case SocialMedium => SocialReferer(SocialMedium, source.get)
case EmailMedium => EmailReferer(EmailMedium, source.get)
case PaidMedium => PaidReferer(PaidMedium, source.get)
case ChatbotMedium => ChatbotReferer(ChatbotMedium, source.get)
}
}
Loading