s3_website_monadic 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92e9b4b0029ead9d9f441f2a5fdb2687f535a729
|
4
|
+
data.tar.gz: ea74c668aa1f6accc39a1541e56af5b16781f507
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 866b36966c21be8e2dd88748e9ca3955807668b3bd4efe9a33c70d1458c3d45ed4dc81d8a2b26b2399dfaf7c2a874ebd72006bc9324d7326a43f4457a2629415
|
7
|
+
data.tar.gz: 25613874bf0d7bc119f0307aabf6eecb70a958d010ab486a9ab931b2ae3b6183ebda195c888040f6a0c660b8c50be0cbf9aea5d22e90f3aa11dec2c7cf2a250a
|
data/s3_website.gemspec
CHANGED
@@ -3,11 +3,11 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "s3_website_monadic"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.9"
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ["Lauri Lehmijoki"]
|
9
9
|
s.email = ["lauri.lehmijoki@iki.fi"]
|
10
|
-
s.homepage = "https://github.com/laurilehmijoki/s3_website"
|
10
|
+
s.homepage = "https://github.com/laurilehmijoki/s3_website/tree/s3_website_monadic"
|
11
11
|
s.summary = %q{Manage your S3 website}
|
12
12
|
s.description = %q{
|
13
13
|
Sync website files, set redirects, use HTTP performance optimisations, deliver via
|
@@ -65,7 +65,14 @@ class S3(implicit s3Settings: S3Settings, executor: ExecutionContextExecutor) {
|
|
65
65
|
md setContentLength uploadBody.contentLength
|
66
66
|
md setContentType uploadBody.contentType
|
67
67
|
uploadBody.contentEncoding foreach md.setContentEncoding
|
68
|
-
uploadBody.maxAge foreach
|
68
|
+
uploadBody.maxAge foreach { seconds =>
|
69
|
+
md.setCacheControl(
|
70
|
+
if (seconds == 0)
|
71
|
+
s"no-cache; max-age=$seconds"
|
72
|
+
else
|
73
|
+
s"max-age=$seconds"
|
74
|
+
)
|
75
|
+
}
|
69
76
|
val req = new PutObjectRequest(config.s3_bucket, upload.s3Key, uploadBody.openInputStream(), md)
|
70
77
|
config.s3_reduced_redundancy.filter(_ == true) foreach (_ => req setStorageClass ReducedRedundancy)
|
71
78
|
req
|
@@ -76,17 +76,6 @@ object LocalFile {
|
|
76
76
|
val md5 = using(fis(sourceFile)) { inputStream =>
|
77
77
|
DigestUtils.md5Hex(inputStream)
|
78
78
|
}
|
79
|
-
val maxAge = config.max_age.flatMap { maxAgeIntOrGlob =>
|
80
|
-
maxAgeIntOrGlob.fold(
|
81
|
-
(seconds: Int) => Some(seconds),
|
82
|
-
(globs2Ints: Map[String, Int]) =>
|
83
|
-
globs2Ints.find { globAndInt =>
|
84
|
-
(rubyRuntime evalScriptlet s"File.fnmatch('${globAndInt._1}', '${localFile.s3Key}')")
|
85
|
-
.toJava(classOf[Boolean])
|
86
|
-
.asInstanceOf[Boolean]
|
87
|
-
} map (_._2)
|
88
|
-
)
|
89
|
-
}
|
90
79
|
|
91
80
|
Upload(
|
92
81
|
s3Key = localFile.s3Key,
|
@@ -95,8 +84,8 @@ object LocalFile {
|
|
95
84
|
md5 = md5,
|
96
85
|
contentEncoding = localFile.encodingOnS3.map(_ => "gzip"),
|
97
86
|
contentLength = sourceFile.length(),
|
98
|
-
maxAge =
|
99
|
-
contentType =
|
87
|
+
maxAge = resolveMaxAge(localFile),
|
88
|
+
contentType = resolveContentType(localFile.sourceFile),
|
100
89
|
openInputStream = () => new FileInputStream(sourceFile)
|
101
90
|
)
|
102
91
|
)
|
@@ -108,6 +97,33 @@ object LocalFile {
|
|
108
97
|
|
109
98
|
lazy val tika = new Tika()
|
110
99
|
|
100
|
+
def resolveContentType(file: File) = {
|
101
|
+
val mimeType = tika.detect(file)
|
102
|
+
if (mimeType.startsWith("text/") || mimeType == "application/json")
|
103
|
+
mimeType + "; charset=utf-8"
|
104
|
+
else
|
105
|
+
mimeType
|
106
|
+
}
|
107
|
+
|
108
|
+
def resolveMaxAge(localFile: LocalFile)(implicit config: Config): Option[Int] = {
|
109
|
+
type GlobsMap = Map[String, Int]
|
110
|
+
config.max_age.flatMap { (intOrGlobs: Either[Int, GlobsMap]) =>
|
111
|
+
type GlobsSeq = Seq[(String, Int)]
|
112
|
+
def respectMostSpecific(globs: GlobsMap): GlobsSeq = globs.toSeq.sortBy(_._1).reverse
|
113
|
+
intOrGlobs
|
114
|
+
.right.map(respectMostSpecific)
|
115
|
+
.fold(
|
116
|
+
(seconds: Int) => Some(seconds),
|
117
|
+
(globs: GlobsSeq) =>
|
118
|
+
globs.find { globAndInt =>
|
119
|
+
(rubyRuntime evalScriptlet s"File.fnmatch('${globAndInt._1}', '${localFile.s3Key}')")
|
120
|
+
.toJava(classOf[Boolean])
|
121
|
+
.asInstanceOf[Boolean]
|
122
|
+
} map (_._2)
|
123
|
+
)
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
111
127
|
def resolveLocalFiles(implicit site: Site): Either[ErrorReport, Seq[LocalFile]] = Try {
|
112
128
|
val files = recursiveListFiles(new File(site.rootDirectory)).filterNot(_.isDirectory)
|
113
129
|
files map { file =>
|
@@ -328,6 +328,27 @@ class S3WebsiteSpec extends Specification {
|
|
328
328
|
Push.pushSite
|
329
329
|
sentPutObjectRequest.getMetadata.getCacheControl must beNull
|
330
330
|
}
|
331
|
+
|
332
|
+
"be used to disable caching" in new SiteDirectory with MockAWS {
|
333
|
+
implicit val site = siteWithFiles(defaultConfig.copy(max_age = Some(Left(0))), localFiles = "index.html" :: Nil)
|
334
|
+
Push.pushSite
|
335
|
+
sentPutObjectRequest.getMetadata.getCacheControl must equalTo("no-cache; max-age=0")
|
336
|
+
}
|
337
|
+
}
|
338
|
+
|
339
|
+
"max-age in config" should {
|
340
|
+
"respect the more specific glob" in new SiteDirectory with MockAWS {
|
341
|
+
implicit val site = siteWithFiles(
|
342
|
+
defaultConfig.copy(max_age = Some(Right(Map(
|
343
|
+
"**" -> 150,
|
344
|
+
"assets/**" -> 86400
|
345
|
+
)))),
|
346
|
+
localFiles = "index.html" :: "assets/picture.gif" :: Nil
|
347
|
+
)
|
348
|
+
Push.pushSite
|
349
|
+
sentPutObjectRequests.find(_.getKey == "index.html").get.getMetadata.getCacheControl must equalTo("max-age=150")
|
350
|
+
sentPutObjectRequests.find(_.getKey == "assets/picture.gif").get.getMetadata.getCacheControl must equalTo("max-age=86400")
|
351
|
+
}
|
331
352
|
}
|
332
353
|
|
333
354
|
"s3_reduced_redundancy: true in config" should {
|
@@ -379,6 +400,32 @@ class S3WebsiteSpec extends Specification {
|
|
379
400
|
sentPutObjectRequest.getKey must equalTo(".vimrc")
|
380
401
|
}
|
381
402
|
}
|
403
|
+
|
404
|
+
"content type inference" should {
|
405
|
+
"add charset=utf-8 to all html documents" in new SiteDirectory with MockAWS {
|
406
|
+
implicit val site = siteWithFiles(localFiles = "file.html" :: Nil)
|
407
|
+
Push.pushSite
|
408
|
+
sentPutObjectRequest.getMetadata.getContentType must equalTo("text/html; charset=utf-8")
|
409
|
+
}
|
410
|
+
|
411
|
+
"add charset=utf-8 to all text documents" in new SiteDirectory with MockAWS {
|
412
|
+
implicit val site = siteWithFiles(localFiles = "file.txt" :: Nil)
|
413
|
+
Push.pushSite
|
414
|
+
sentPutObjectRequest.getMetadata.getContentType must equalTo("text/plain; charset=utf-8")
|
415
|
+
}
|
416
|
+
|
417
|
+
"add charset=utf-8 to all json documents" in new SiteDirectory with MockAWS {
|
418
|
+
implicit val site = siteWithFiles(localFiles = "file.json" :: Nil)
|
419
|
+
Push.pushSite
|
420
|
+
sentPutObjectRequest.getMetadata.getContentType must equalTo("application/json; charset=utf-8")
|
421
|
+
}
|
422
|
+
|
423
|
+
"resolve the content type from file contents" in new SiteDirectory with MockAWS {
|
424
|
+
implicit val site = siteWithFilesAndContent(localFilesWithContent = ("index", "<html><body><h1>hi</h1></body></html>") :: Nil)
|
425
|
+
Push.pushSite
|
426
|
+
sentPutObjectRequest.getMetadata.getContentType must equalTo("text/html; charset=utf-8")
|
427
|
+
}
|
428
|
+
}
|
382
429
|
|
383
430
|
trait MockAWS extends MockS3 with MockCloudFront with Scope
|
384
431
|
|
@@ -479,7 +526,7 @@ class S3WebsiteSpec extends Specification {
|
|
479
526
|
|
480
527
|
def sentPutObjectRequests: Seq[PutObjectRequest] = {
|
481
528
|
val req = ArgumentCaptor.forClass(classOf[PutObjectRequest])
|
482
|
-
verify(amazonS3Client).putObject(req.capture())
|
529
|
+
verify(amazonS3Client, Mockito.atLeast(1)).putObject(req.capture())
|
483
530
|
req.getAllValues
|
484
531
|
}
|
485
532
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3_website_monadic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lauri Lehmijoki
|
@@ -380,7 +380,7 @@ files:
|
|
380
380
|
- src/main/scala/s3/website/model/push.scala
|
381
381
|
- src/main/scala/s3/website/package.scala
|
382
382
|
- src/test/scala/s3/website/S3WebsiteSpec.scala
|
383
|
-
homepage: https://github.com/laurilehmijoki/s3_website
|
383
|
+
homepage: https://github.com/laurilehmijoki/s3_website/tree/s3_website_monadic
|
384
384
|
licenses:
|
385
385
|
- MIT
|
386
386
|
metadata: {}
|