Skip to content

Commit

Permalink
Merge pull request #109 from prof18/v5.0.2
Browse files Browse the repository at this point in the history
V5.0.2
  • Loading branch information
prof18 authored Feb 19, 2023
2 parents 3bd4bd9 + 3bb086b commit daeeb5f
Show file tree
Hide file tree
Showing 38 changed files with 1,109 additions and 3,604 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ POM_NAME=rssparser
POM_DESCRIPTION=An Android library to parse RSS Feed

GROUP=com.prof18.rssparser
VERSION_NAME=5.0.2-SNAPSHOT
VERSION_NAME=5.0.2

POM_INCEPTION_YEAR=2016
POM_URL=https://github.com/prof18/RSS-Parser.git
Expand Down
21 changes: 18 additions & 3 deletions rssparser/api/rssparser.api
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
public final class com/prof/rssparser/Article : java/io/Serializable {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof/rssparser/ItunesArticleData;)V
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof/rssparser/ItunesArticleData;Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun component10 ()Ljava/lang/String;
public final fun component11 ()Ljava/lang/String;
public final fun component12 ()Ljava/lang/String;
public final fun component13 ()Ljava/util/List;
public final fun component14 ()Lcom/prof/rssparser/ItunesArticleData;
public final fun component15 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
Expand All @@ -14,12 +15,13 @@ public final class com/prof/rssparser/Article : java/io/Serializable {
public final fun component7 ()Ljava/lang/String;
public final fun component8 ()Ljava/lang/String;
public final fun component9 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof/rssparser/ItunesArticleData;)Lcom/prof/rssparser/Article;
public static synthetic fun copy$default (Lcom/prof/rssparser/Article;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof/rssparser/ItunesArticleData;ILjava/lang/Object;)Lcom/prof/rssparser/Article;
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof/rssparser/ItunesArticleData;Ljava/lang/String;)Lcom/prof/rssparser/Article;
public static synthetic fun copy$default (Lcom/prof/rssparser/Article;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof/rssparser/ItunesArticleData;Ljava/lang/String;ILjava/lang/Object;)Lcom/prof/rssparser/Article;
public fun equals (Ljava/lang/Object;)Z
public final fun getAudio ()Ljava/lang/String;
public final fun getAuthor ()Ljava/lang/String;
public final fun getCategories ()Ljava/util/List;
public final fun getCommentsUrl ()Ljava/lang/String;
public final fun getContent ()Ljava/lang/String;
public final fun getDescription ()Ljava/lang/String;
public final fun getGuid ()Ljava/lang/String;
Expand Down Expand Up @@ -68,6 +70,19 @@ public final class com/prof/rssparser/Channel : java/io/Serializable {
public fun toString ()Ljava/lang/String;
}

public final class com/prof/rssparser/HTTPException : java/lang/Exception {
public fun <init> (ILjava/lang/String;)V
public final fun component1 ()I
public final fun component2 ()Ljava/lang/String;
public final fun copy (ILjava/lang/String;)Lcom/prof/rssparser/HTTPException;
public static synthetic fun copy$default (Lcom/prof/rssparser/HTTPException;ILjava/lang/String;ILjava/lang/Object;)Lcom/prof/rssparser/HTTPException;
public fun equals (Ljava/lang/Object;)Z
public final fun getCode ()I
public fun getMessage ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/prof/rssparser/Image : java/io/Serializable {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
Expand Down
11 changes: 8 additions & 3 deletions rssparser/src/main/java/com/prof/rssparser/Article.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ data class Article(
val sourceName: String?,
val sourceUrl: String?,
val categories: List<String>,
val itunesArticleData: ItunesArticleData?
val itunesArticleData: ItunesArticleData?,
val commentsUrl: String?,
) : Serializable {

internal data class Builder(
Expand All @@ -50,7 +51,8 @@ data class Article(
private var sourceName: String? = null,
private var sourceUrl: String? = null,
private val categories: MutableList<String> = mutableListOf(),
private var itunesArticleData: ItunesArticleData? = null
private var itunesArticleData: ItunesArticleData? = null,
private var commentUrl: String? = null,
) {
fun guid(guid: String?) = apply { this.guid = guid }
fun title(title: String?) = apply { this.title = title }
Expand Down Expand Up @@ -91,6 +93,8 @@ data class Article(
fun itunesArticleData(itunesArticleData: ItunesArticleData?) =
apply { this.itunesArticleData = itunesArticleData }

fun commentUrl(url: String?) = apply { this.commentUrl = url }

fun build() = Article(
guid,
title,
Expand All @@ -105,7 +109,8 @@ data class Article(
sourceName,
sourceUrl,
categories,
itunesArticleData
itunesArticleData,
commentUrl,
)
}
}
6 changes: 6 additions & 0 deletions rssparser/src/main/java/com/prof/rssparser/HTTPException.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.prof.rssparser

data class HTTPException(
val code: Int,
override val message: String?
) : Exception()
8 changes: 4 additions & 4 deletions rssparser/src/main/java/com/prof/rssparser/Parser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,11 @@ class Parser private constructor(
}
executorService!!.submit {
service = Executors.newFixedThreadPool(2)
val f1 = service.submit(XMLFetcher(url, callFactory))
val streamFuture = service.submit(XMLFetcher(url, callFactory))
try {
val rssFeed = f1.get()
val f2 = service.submit(XMLParser(rssFeed, charset))
onComplete?.onTaskCompleted(f2.get())
val rssStream = streamFuture.get()
val channelFuture = service.submit(XMLParser(rssStream, charset))
onComplete?.onTaskCompleted(channelFuture.get())
} catch (e: Exception) {
onComplete?.onError(e)
} finally {
Expand Down
26 changes: 21 additions & 5 deletions rssparser/src/main/java/com/prof/rssparser/core/CoreXMLFetcher.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.prof.rssparser.core

import com.prof.rssparser.HTTPException
import kotlinx.coroutines.suspendCancellableCoroutine
import okhttp3.Call
import okhttp3.Callback
Expand All @@ -16,9 +17,15 @@ internal object CoreXMLFetcher {
val request = createRequest(url)
val response = callFactory.newCall(request).execute()

val body = response.body
requireNotNull(body)
return body.byteStream()
if (response.isSuccessful) {
val body = requireNotNull(response.body)
return body.byteStream()
} else {
throw HTTPException(
code = response.code,
message = response.message,
)
}
}

suspend fun fetchXMLSuspendable(url: String, callFactory: Call.Factory): InputStream {
Expand All @@ -38,8 +45,17 @@ internal object CoreXMLFetcher {

enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
val body = requireNotNull(response.body)
continuation.resume(body.byteStream())
if (response.isSuccessful) {
val body = requireNotNull(response.body)
continuation.resume(body.byteStream())
} else {
val exception = HTTPException(
code = response.code,
message = response.message

)
continuation.resumeWithException(exception)
}
}

override fun onFailure(call: Call, e: IOException) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import com.prof.rssparser.utils.RSSKeyword
import com.prof.rssparser.utils.attributeValue
import com.prof.rssparser.utils.contains
import com.prof.rssparser.utils.nextTrimmedText
import okhttp3.internal.closeQuietly
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserFactory
import java.io.InputStream
Expand Down Expand Up @@ -227,6 +228,12 @@ internal object CoreXMLParser {
itunesArticleBuilder.season(xmlPullParser.nextTrimmedText())
}
}
xmlPullParser.contains(RSSKeyword.Item.Comments) -> {
if (insideItem) {
val url = xmlPullParser.nextTrimmedText()
articleBuilder.commentUrl(url)
}
}
//endregion

//region Itunes Owner tags
Expand Down Expand Up @@ -364,6 +371,7 @@ internal object CoreXMLParser {
}
channelBuilder.itunesChannelData(itunesChannelBuilder.build())

inputStream.closeQuietly()
return channelBuilder.build()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ internal sealed class RSSKeyword(val value: String) {
object Type: RSSKeyword("type")
object GUID: RSSKeyword("guid")
object Source: RSSKeyword("source")
object Comments: RSSKeyword("comments")

object News {
object Image: RSSKeyword("News:Image")
Expand Down
2 changes: 2 additions & 0 deletions rssparser/src/test/java/com/prof/rssparser/ParserTest.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.prof.rssparser

import androidx.test.core.app.ApplicationProvider
import com.prof.rssparser.testutils.ChannelFactory
import com.prof.rssparser.testutils.SameThreadExecutorService
import io.mockk.coVerify
import io.mockk.justRun
import io.mockk.mockk
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package com.prof.rssparser.caching

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.room.Database
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import com.prof.rssparser.ChannelFactory
import com.prof.rssparser.testutils.ChannelFactory
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.test.StandardTestDispatcher
Expand All @@ -21,7 +18,6 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import kotlin.Exception

@ExperimentalCoroutinesApi
@RunWith(RobolectricTestRunner::class)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.prof.rssparser.core

import com.prof.rssparser.HTTPException
import com.prof.rssparser.testutils.ChannelFactory
import kotlinx.coroutines.test.runTest
import org.junit.Test

class CoreXMLFetcherTest {

@Test(expected = HTTPException::class)
fun `fetchXML throws exception if a 2XX HTTP error code is not returned`() {
CoreXMLFetcher.fetchXML(
url = "https://example.com",
callFactory = ChannelFactory.getErrorOkHttpClientForTesting()
)
}

@Test(expected = HTTPException::class)
fun `fetchXMLSuspendable throws exception if a 2XX HTTP error code is not returned`() =
runTest {
CoreXMLFetcher.fetchXMLSuspendable(
url = "https://example.com",
callFactory = ChannelFactory.getErrorOkHttpClientForTesting()
)
}
}
Loading

0 comments on commit daeeb5f

Please sign in to comment.