s3_website 2.8.6 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -4
- data/changelog.md +4 -0
- data/lib/s3_website/version.rb +1 -1
- data/src/main/scala/s3/website/Logger.scala +4 -0
- data/src/main/scala/s3/website/S3.scala +14 -8
- data/src/main/scala/s3/website/model/Config.scala +1 -0
- data/src/main/scala/s3/website/model/Site.scala +2 -0
- data/src/test/scala/s3/website/S3WebsiteSpec.scala +40 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee583948eaac40a396bdd7dcce3ac0f17b026b53
|
4
|
+
data.tar.gz: fb3b7ff28372c6844d2c637f59b8fbc1a08a112e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a06324e37ab33faa10ca761537336020dc2c712b980facfad0aece7fc3c010fafb1c2782c4878a5b566a85d3f5ca357756abfe9f1207847f3cd1b93ec7b23336
|
7
|
+
data.tar.gz: b7db3637d2582366540f0938f8fe3608340b1b74ff6ba308db40da17f794061fd382dedcdde8af090ac1713f182e27c2c5161bd8c7333dd25c993e3a025556d4
|
data/README.md
CHANGED
@@ -91,8 +91,12 @@ incomprehensible or inconsistent.
|
|
91
91
|
|
92
92
|
### Cache Control
|
93
93
|
|
94
|
-
You can use the `max_age`
|
95
|
-
caching of your static assets.
|
94
|
+
You can use either the setting `max_age` or `cache_control`to enable more
|
95
|
+
effective browser caching of your static assets.
|
96
|
+
|
97
|
+
#### max_age
|
98
|
+
|
99
|
+
There are two possible ways to use the option:
|
96
100
|
you can specify a single age (in seconds) like so:
|
97
101
|
|
98
102
|
```yaml
|
@@ -108,11 +112,23 @@ max_age:
|
|
108
112
|
"*": 300
|
109
113
|
```
|
110
114
|
|
111
|
-
Place the configuration into the file `s3_website.yml`.
|
112
|
-
|
113
115
|
After changing the `max_age` setting, push with the `--force` option.
|
114
116
|
Force-pushing allows you to update the S3 object metadata of existing files.
|
115
117
|
|
118
|
+
#### cache_control
|
119
|
+
|
120
|
+
The `cache_control` setting allows you to define an arbitrary string that s3_website
|
121
|
+
will put on all the S3 objects of your website.
|
122
|
+
|
123
|
+
Here's an example:
|
124
|
+
|
125
|
+
```yaml
|
126
|
+
cache_control: public, no-transform, max-age=1200, s-maxage=1200
|
127
|
+
```
|
128
|
+
|
129
|
+
After changing the `cache_control` setting, push with the `--force` option.
|
130
|
+
Force-pushing allows you to update the S3 object metadata of existing files.
|
131
|
+
|
116
132
|
### Gzip Compression
|
117
133
|
|
118
134
|
If you choose, you can use compress certain file types before uploading them to
|
@@ -157,6 +173,8 @@ s3_endpoint: ap-northeast-1
|
|
157
173
|
The valid `s3_endpoint` values consist of the [S3 location constraint
|
158
174
|
values](http://docs.amazonwebservices.com/general/latest/gr/rande.html#s3_region).
|
159
175
|
|
176
|
+
Note that at the moment s3_website does not support the *eu-central-1* region.
|
177
|
+
|
160
178
|
### Ignoring files you want to keep on AWS
|
161
179
|
|
162
180
|
Sometimes there are files or directories you want to keep on S3, but not on
|
data/changelog.md
CHANGED
data/lib/s3_website/version.rb
CHANGED
@@ -4,6 +4,7 @@ class Logger(val verboseOutput: Boolean, onLog: Option[(String) => _] = None) {
|
|
4
4
|
def debug(msg: String) = if (verboseOutput) log(Debug, msg)
|
5
5
|
def info(msg: String) = log(Info, msg)
|
6
6
|
def fail(msg: String) = log(Failure, msg)
|
7
|
+
def warn(msg: String) = log(Warn, msg)
|
7
8
|
|
8
9
|
def info(report: SuccessReport) = log(Success, report.reportMessage)
|
9
10
|
def info(report: ErrorReport) = fail(report.reportMessage)
|
@@ -36,6 +37,9 @@ class Logger(val verboseOutput: Boolean, onLog: Option[(String) => _] = None) {
|
|
36
37
|
case object Wait extends LogType {
|
37
38
|
val prefix = "wait".yellow
|
38
39
|
}
|
40
|
+
case object Warn extends LogType {
|
41
|
+
val prefix = "warn".yellow
|
42
|
+
}
|
39
43
|
|
40
44
|
/**
|
41
45
|
* Idea copied from https://github.com/ktoso/scala-rainbow.
|
@@ -61,7 +61,7 @@ object S3 {
|
|
61
61
|
retryAction = newAttempt => this.delete(s3Key, newAttempt)
|
62
62
|
)
|
63
63
|
|
64
|
-
def toPutObjectRequest(source: Either[Upload, Redirect])(implicit config: Config): Try[PutObjectRequest] =
|
64
|
+
def toPutObjectRequest(source: Either[Upload, Redirect])(implicit config: Config, logger: Logger): Try[PutObjectRequest] =
|
65
65
|
source.fold(
|
66
66
|
upload =>
|
67
67
|
for {
|
@@ -72,14 +72,20 @@ object S3 {
|
|
72
72
|
md setContentLength uploadFile.length
|
73
73
|
md setContentType contentType
|
74
74
|
upload.encodingOnS3.map(_ => "gzip") foreach md.setContentEncoding
|
75
|
-
upload.maxAge
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
)
|
75
|
+
val cacheControl: Option[String] = (upload.maxAge, config.cache_control) match {
|
76
|
+
case (maxAge: Some[Int], cacheCtrl: Some[String]) =>
|
77
|
+
logger.warn("Overriding the max_age setting with the cache_control setting")
|
78
|
+
cacheCtrl
|
79
|
+
case (_, cacheCtrl: Some[String]) =>
|
80
|
+
cacheCtrl
|
81
|
+
case (maxAgeSeconds: Some[int], None) =>
|
82
|
+
maxAgeSeconds.map({
|
83
|
+
case seconds if seconds == 0 => s"no-cache; max-age=0"
|
84
|
+
case seconds => s"max-age=$seconds"
|
85
|
+
})
|
86
|
+
case (None, None) => None
|
82
87
|
}
|
88
|
+
cacheControl foreach { md.setCacheControl }
|
83
89
|
val req = new PutObjectRequest(config.s3_bucket, upload.s3Key, new FileInputStream(uploadFile), md)
|
84
90
|
config.s3_reduced_redundancy.filter(_ == true) foreach (_ => req setStorageClass ReducedRedundancy)
|
85
91
|
req
|
@@ -15,6 +15,7 @@ case class Config(
|
|
15
15
|
s3_endpoint: S3Endpoint,
|
16
16
|
site: Option[String],
|
17
17
|
max_age: Option[Either[Int, Map[String, Int]]],
|
18
|
+
cache_control: Option[String],
|
18
19
|
gzip: Option[Either[Boolean, Seq[String]]],
|
19
20
|
gzip_zopfli: Option[Boolean],
|
20
21
|
ignore_on_server: Option[Either[String, Seq[String]]],
|
@@ -40,6 +40,7 @@ object Site {
|
|
40
40
|
s3_endpoint <- loadEndpoint.right
|
41
41
|
site <- loadOptionalString("site").right
|
42
42
|
max_age <- loadMaxAge.right
|
43
|
+
cache_control <- loadOptionalString("cache_control").right
|
43
44
|
gzip <- loadOptionalBooleanOrStringSeq("gzip").right
|
44
45
|
gzip_zopfli <- loadOptionalBoolean("gzip_zopfli").right
|
45
46
|
extensionless_mime_type <- loadOptionalString("extensionless_mime_type").right
|
@@ -66,6 +67,7 @@ object Site {
|
|
66
67
|
s3_endpoint getOrElse S3Endpoint.defaultEndpoint,
|
67
68
|
site,
|
68
69
|
max_age,
|
70
|
+
cache_control,
|
69
71
|
gzip,
|
70
72
|
gzip_zopfli,
|
71
73
|
ignore_on_server = ignore_on_server,
|
@@ -477,6 +477,46 @@ class S3WebsiteSpec extends Specification {
|
|
477
477
|
}
|
478
478
|
}
|
479
479
|
|
480
|
+
"cache_control in config" should {
|
481
|
+
"be applied to all files" in new BasicSetup {
|
482
|
+
config = "cache_control: public, no-transform, max-age=1200, s-maxage=1200"
|
483
|
+
setLocalFile("index.html")
|
484
|
+
push()
|
485
|
+
sentPutObjectRequest.getMetadata.getCacheControl must equalTo("public, no-transform, max-age=1200, s-maxage=1200")
|
486
|
+
}
|
487
|
+
|
488
|
+
"should take precedence over max_age" in new BasicSetup {
|
489
|
+
config = """
|
490
|
+
|max_age: 120
|
491
|
+
|cache_control: public, max-age=90
|
492
|
+
""".stripMargin
|
493
|
+
setLocalFile("index.html")
|
494
|
+
push()
|
495
|
+
sentPutObjectRequest.getMetadata.getCacheControl must equalTo("public, max-age=90")
|
496
|
+
}
|
497
|
+
|
498
|
+
"log a warning if both cache_control and max_age are present" in new BasicSetup {
|
499
|
+
val logEntries = new mutable.MutableList[String]
|
500
|
+
config = """
|
501
|
+
|max_age: 120
|
502
|
+
|cache_control: public, max-age=90
|
503
|
+
""".stripMargin
|
504
|
+
setLocalFile("index.html")
|
505
|
+
push(logCapturer = Some((logEntry: String) =>
|
506
|
+
logEntries += logEntry
|
507
|
+
))
|
508
|
+
logEntries must contain("[\u001B[33mwarn\u001B[0m] Overriding the max_age setting with the cache_control settin")
|
509
|
+
}
|
510
|
+
}
|
511
|
+
|
512
|
+
"cache control" can {
|
513
|
+
"be undefined" in new BasicSetup {
|
514
|
+
setLocalFile("index.html")
|
515
|
+
push()
|
516
|
+
sentPutObjectRequest.getMetadata.getCacheControl must beNull
|
517
|
+
}
|
518
|
+
}
|
519
|
+
|
480
520
|
"max_age in config" can {
|
481
521
|
"be applied to all files" in new BasicSetup {
|
482
522
|
config = "max_age: 60"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3_website
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lauri Lehmijoki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|