Refactor UploadEventLogger.statusWithBar(String,Long=>String,Long,Long,Long) (#128)
* [domain] UploadEventListener refactoring * [domain] UploadEventListener rewrite
This commit is contained in:
parent
4a54038933
commit
adbf8af2f3
9 changed files with 71 additions and 59 deletions
|
@ -33,10 +33,12 @@ case class UnversionedMirrorArchive(syncTotals: SyncTotals)
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
localFile: LocalFile
|
localFile: LocalFile
|
||||||
) =
|
) =
|
||||||
Storage.upload(
|
Storage.upload(localFile,
|
||||||
localFile,
|
bucket,
|
||||||
bucket,
|
UploadEventListener.Settings(localFile,
|
||||||
UploadEventListener(localFile, index, syncTotals, totalBytesSoFar))
|
index,
|
||||||
|
syncTotals,
|
||||||
|
totalBytesSoFar))
|
||||||
}
|
}
|
||||||
|
|
||||||
object UnversionedMirrorArchive {
|
object UnversionedMirrorArchive {
|
||||||
|
|
|
@ -23,7 +23,7 @@ case class DummyStorageService(s3ObjectData: S3ObjectsData,
|
||||||
override def upload(
|
override def upload(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener,
|
uploadEventListener: UploadEventListener.Settings,
|
||||||
): UIO[StorageQueueEvent] = {
|
): UIO[StorageQueueEvent] = {
|
||||||
val (remoteKey, md5Hash) = uploadFiles(localFile.file)
|
val (remoteKey, md5Hash) = uploadFiles(localFile.file)
|
||||||
UIO(StorageQueueEvent.UploadQueueEvent(remoteKey, md5Hash))
|
UIO(StorageQueueEvent.UploadQueueEvent(remoteKey, md5Hash))
|
||||||
|
|
|
@ -1,26 +1,32 @@
|
||||||
package net.kemitix.thorp.domain
|
package net.kemitix.thorp.domain
|
||||||
|
|
||||||
import net.kemitix.thorp.domain.UploadEvent.RequestEvent
|
import net.kemitix.thorp.domain.UploadEvent.RequestEvent
|
||||||
import net.kemitix.thorp.domain.UploadEventLogger.logRequestCycle
|
import net.kemitix.thorp.domain.UploadEventLogger.{
|
||||||
|
RequestCycle,
|
||||||
|
logRequestCycle
|
||||||
|
}
|
||||||
|
|
||||||
case class UploadEventListener(
|
object UploadEventListener {
|
||||||
localFile: LocalFile,
|
|
||||||
index: Int,
|
case class Settings(
|
||||||
syncTotals: SyncTotals,
|
localFile: LocalFile,
|
||||||
totalBytesSoFar: Long
|
index: Int,
|
||||||
) {
|
syncTotals: SyncTotals,
|
||||||
|
totalBytesSoFar: Long
|
||||||
|
)
|
||||||
|
|
||||||
var bytesTransferred = 0L
|
var bytesTransferred = 0L
|
||||||
|
|
||||||
def listener: UploadEvent => Unit = {
|
def listener(settings: Settings): UploadEvent => Unit = {
|
||||||
case e: RequestEvent =>
|
case e: RequestEvent =>
|
||||||
bytesTransferred += e.transferred
|
bytesTransferred += e.transferred
|
||||||
logRequestCycle(localFile,
|
logRequestCycle(
|
||||||
e,
|
RequestCycle(settings.localFile,
|
||||||
bytesTransferred,
|
bytesTransferred,
|
||||||
index,
|
settings.index,
|
||||||
syncTotals,
|
settings.syncTotals,
|
||||||
totalBytesSoFar)
|
settings.totalBytesSoFar))
|
||||||
case _ => ()
|
case _ => ()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,33 +1,39 @@
|
||||||
package net.kemitix.thorp.domain
|
package net.kemitix.thorp.domain
|
||||||
|
|
||||||
import net.kemitix.thorp.domain.SizeTranslation.sizeInEnglish
|
|
||||||
import net.kemitix.thorp.domain.Terminal._
|
import net.kemitix.thorp.domain.Terminal._
|
||||||
import net.kemitix.thorp.domain.UploadEvent.RequestEvent
|
|
||||||
|
|
||||||
import scala.io.AnsiColor._
|
import scala.io.AnsiColor._
|
||||||
|
|
||||||
trait UploadEventLogger {
|
object UploadEventLogger {
|
||||||
|
|
||||||
def logRequestCycle(
|
case class RequestCycle(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
event: RequestEvent,
|
|
||||||
bytesTransferred: Long,
|
bytesTransferred: Long,
|
||||||
index: Int,
|
index: Int,
|
||||||
syncTotals: SyncTotals,
|
syncTotals: SyncTotals,
|
||||||
totalBytesSoFar: Long
|
totalBytesSoFar: Long
|
||||||
): Unit = {
|
)
|
||||||
val remoteKey = localFile.remoteKey.key
|
|
||||||
val fileLength = localFile.file.length
|
def logRequestCycle(requestCycle: RequestCycle): Unit = {
|
||||||
|
val remoteKey = requestCycle.localFile.remoteKey.key
|
||||||
|
val fileLength = requestCycle.localFile.file.length
|
||||||
val statusHeight = 7
|
val statusHeight = 7
|
||||||
if (bytesTransferred < fileLength)
|
if (requestCycle.bytesTransferred < fileLength)
|
||||||
println(
|
println(
|
||||||
s"${GREEN}Uploading:$RESET $remoteKey$eraseToEndOfScreen\n" +
|
s"${GREEN}Uploading:$RESET $remoteKey$eraseToEndOfScreen\n" +
|
||||||
statusWithBar(" File", sizeInEnglish, bytesTransferred, fileLength) +
|
statusWithBar(" File",
|
||||||
statusWithBar("Files", l => l.toString, index, syncTotals.count) +
|
SizeTranslation.sizeInEnglish,
|
||||||
statusWithBar(" Size",
|
requestCycle.bytesTransferred,
|
||||||
sizeInEnglish,
|
fileLength) +
|
||||||
bytesTransferred + totalBytesSoFar,
|
statusWithBar("Files",
|
||||||
syncTotals.totalSizeBytes) +
|
l => l.toString,
|
||||||
|
requestCycle.index,
|
||||||
|
requestCycle.syncTotals.count) +
|
||||||
|
statusWithBar(
|
||||||
|
" Size",
|
||||||
|
SizeTranslation.sizeInEnglish,
|
||||||
|
requestCycle.bytesTransferred + requestCycle.totalBytesSoFar,
|
||||||
|
requestCycle.syncTotals.totalSizeBytes) +
|
||||||
s"${Terminal.cursorPrevLine(statusHeight)}")
|
s"${Terminal.cursorPrevLine(statusHeight)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,15 +41,11 @@ trait UploadEventLogger {
|
||||||
label: String,
|
label: String,
|
||||||
format: Long => String,
|
format: Long => String,
|
||||||
current: Long,
|
current: Long,
|
||||||
max: Long,
|
max: Long
|
||||||
pre: Long = 0
|
|
||||||
): String = {
|
): String = {
|
||||||
val percent = f"${(current * 100) / max}%2d"
|
val percent = f"${(current * 100) / max}%2d"
|
||||||
s"$GREEN$label:$RESET ($percent%) ${format(current)} of ${format(max)}" +
|
s"$GREEN$label:$RESET ($percent%) ${format(current)} of ${format(max)}" +
|
||||||
(if (pre > 0) s" (pre-synced ${format(pre)}"
|
s"$eraseLineForward\n" +
|
||||||
else "") + s"$eraseLineForward\n" +
|
|
||||||
progressBar(current, max, Terminal.width)
|
progressBar(current, max, Terminal.width)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object UploadEventLogger extends UploadEventLogger
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ object Storage {
|
||||||
def upload(
|
def upload(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener,
|
listenerSettings: UploadEventListener.Settings,
|
||||||
): ZIO[Storage with Config, Nothing, StorageQueueEvent]
|
): ZIO[Storage with Config, Nothing, StorageQueueEvent]
|
||||||
|
|
||||||
def copy(
|
def copy(
|
||||||
|
@ -56,7 +56,7 @@ object Storage {
|
||||||
override def upload(
|
override def upload(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener
|
listenerSettings: UploadEventListener.Settings
|
||||||
): ZIO[Storage, Nothing, StorageQueueEvent] =
|
): ZIO[Storage, Nothing, StorageQueueEvent] =
|
||||||
uploadResult
|
uploadResult
|
||||||
|
|
||||||
|
@ -98,9 +98,9 @@ object Storage {
|
||||||
final def upload(
|
final def upload(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener
|
listenerSettings: UploadEventListener.Settings
|
||||||
): ZIO[Storage with Config, Nothing, StorageQueueEvent] =
|
): ZIO[Storage with Config, Nothing, StorageQueueEvent] =
|
||||||
ZIO.accessM(_.storage upload (localFile, bucket, uploadEventListener))
|
ZIO.accessM(_.storage upload (localFile, bucket, listenerSettings))
|
||||||
|
|
||||||
final def copy(
|
final def copy(
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
|
|
|
@ -27,10 +27,10 @@ object S3Storage {
|
||||||
override def upload(
|
override def upload(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener,
|
listenerSettings: UploadEventListener.Settings,
|
||||||
): ZIO[Config, Nothing, StorageQueueEvent] =
|
): ZIO[Config, Nothing, StorageQueueEvent] =
|
||||||
Uploader.upload(transferManager)(
|
Uploader.upload(transferManager)(
|
||||||
Uploader.Request(localFile, bucket, uploadEventListener))
|
Uploader.Request(localFile, bucket, listenerSettings))
|
||||||
|
|
||||||
override def copy(bucket: Bucket,
|
override def copy(bucket: Bucket,
|
||||||
sourceKey: RemoteKey,
|
sourceKey: RemoteKey,
|
||||||
|
|
|
@ -21,7 +21,7 @@ trait Uploader {
|
||||||
case class Request(
|
case class Request(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener
|
uploadEventListener: UploadEventListener.Settings
|
||||||
)
|
)
|
||||||
|
|
||||||
def upload(transferManager: => AmazonTransferManager)(
|
def upload(transferManager: => AmazonTransferManager)(
|
||||||
|
@ -72,11 +72,13 @@ trait Uploader {
|
||||||
metadata
|
metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
private def progressListener: UploadEventListener => ProgressListener =
|
private def progressListener
|
||||||
uploadEventListener =>
|
: UploadEventListener.Settings => ProgressListener =
|
||||||
|
listenerSettings =>
|
||||||
new ProgressListener {
|
new ProgressListener {
|
||||||
override def progressChanged(progressEvent: ProgressEvent): Unit =
|
override def progressChanged(progressEvent: ProgressEvent): Unit =
|
||||||
uploadEventListener.listener(eventHandler(progressEvent))
|
UploadEventListener.listener(listenerSettings)(
|
||||||
|
eventHandler(progressEvent))
|
||||||
|
|
||||||
private def eventHandler: ProgressEvent => UploadEvent =
|
private def eventHandler: ProgressEvent => UploadEvent =
|
||||||
progressEvent => {
|
progressEvent => {
|
||||||
|
|
|
@ -32,10 +32,10 @@ trait AmazonS3ClientTestFixture extends MockFactory {
|
||||||
override def upload(
|
override def upload(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener,
|
listenerSettings: UploadEventListener.Settings,
|
||||||
): ZIO[Config, Nothing, StorageQueueEvent] =
|
): ZIO[Config, Nothing, StorageQueueEvent] =
|
||||||
Uploader.upload(transferManager)(
|
Uploader.upload(transferManager)(
|
||||||
Uploader.Request(localFile, bucket, uploadEventListener))
|
Uploader.Request(localFile, bucket, listenerSettings))
|
||||||
|
|
||||||
override def copy(
|
override def copy(
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
|
|
|
@ -33,8 +33,8 @@ class UploaderTest extends FreeSpec with MockFactory {
|
||||||
val inProgress = new AmazonUpload.InProgress {
|
val inProgress = new AmazonUpload.InProgress {
|
||||||
override def waitForUploadResult: UploadResult = uploadResult
|
override def waitForUploadResult: UploadResult = uploadResult
|
||||||
}
|
}
|
||||||
val uploadEventListener =
|
val listenerSettings =
|
||||||
UploadEventListener(localFile, 0, SyncTotals(1, 0, 0), 0)
|
UploadEventListener.Settings(localFile, 0, SyncTotals(1, 0, 0), 0)
|
||||||
"when no error" in {
|
"when no error" in {
|
||||||
val expected =
|
val expected =
|
||||||
Right(UploadQueueEvent(remoteKey, aHash))
|
Right(UploadQueueEvent(remoteKey, aHash))
|
||||||
|
@ -46,7 +46,7 @@ class UploaderTest extends FreeSpec with MockFactory {
|
||||||
invoke(fixture.amazonS3TransferManager)(
|
invoke(fixture.amazonS3TransferManager)(
|
||||||
localFile,
|
localFile,
|
||||||
bucket,
|
bucket,
|
||||||
uploadEventListener
|
listenerSettings
|
||||||
)
|
)
|
||||||
assertResult(expected)(result)
|
assertResult(expected)(result)
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ class UploaderTest extends FreeSpec with MockFactory {
|
||||||
invoke(fixture.amazonS3TransferManager)(
|
invoke(fixture.amazonS3TransferManager)(
|
||||||
localFile,
|
localFile,
|
||||||
bucket,
|
bucket,
|
||||||
uploadEventListener
|
listenerSettings
|
||||||
)
|
)
|
||||||
assertResult(expected)(result)
|
assertResult(expected)(result)
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ class UploaderTest extends FreeSpec with MockFactory {
|
||||||
invoke(fixture.amazonS3TransferManager)(
|
invoke(fixture.amazonS3TransferManager)(
|
||||||
localFile,
|
localFile,
|
||||||
bucket,
|
bucket,
|
||||||
uploadEventListener
|
listenerSettings
|
||||||
)
|
)
|
||||||
assertResult(expected)(result)
|
assertResult(expected)(result)
|
||||||
}
|
}
|
||||||
|
@ -90,14 +90,14 @@ class UploaderTest extends FreeSpec with MockFactory {
|
||||||
def invoke(transferManager: AmazonTransferManager)(
|
def invoke(transferManager: AmazonTransferManager)(
|
||||||
localFile: LocalFile,
|
localFile: LocalFile,
|
||||||
bucket: Bucket,
|
bucket: Bucket,
|
||||||
uploadEventListener: UploadEventListener
|
listenerSettings: UploadEventListener.Settings
|
||||||
) = {
|
) = {
|
||||||
type TestEnv = Config
|
type TestEnv = Config
|
||||||
val testEnv: TestEnv = Config.Live
|
val testEnv: TestEnv = Config.Live
|
||||||
new DefaultRuntime {}.unsafeRunSync {
|
new DefaultRuntime {}.unsafeRunSync {
|
||||||
Uploader
|
Uploader
|
||||||
.upload(transferManager)(
|
.upload(transferManager)(
|
||||||
Uploader.Request(localFile, bucket, uploadEventListener))
|
Uploader.Request(localFile, bucket, listenerSettings))
|
||||||
.provide(testEnv)
|
.provide(testEnv)
|
||||||
}.toEither
|
}.toEither
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue