alephant-publisher-queue 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 106e56c0d1e6eb36e2c9484d19d77a5dbb9a889c
4
- data.tar.gz: d427da6b366cb81c375e2eac89e11e3dacd660d5
3
+ metadata.gz: c504f07d7863ff3576e44fdab5fc636f6e605dff
4
+ data.tar.gz: 019473a699726070746e77b1afbdd856dc7a00c5
5
5
  SHA512:
6
- metadata.gz: 537e8cb7c69cbf7662cf32dcb7cbbcc4de6a8170c8119c2effd0f81612b0584de336efd8735b009ab6c7ec8b5cdb42b141688e18b2ecb959b0bea955d0541931
7
- data.tar.gz: e90751b235b73eb21a76721a4b10226204b00657293148fe8e9abf85beb9992c15768569197cdf8754b16de5fc82a88c9915d80c7532ebb07d8c29a776666b24
6
+ metadata.gz: 3a39e4ae36d770ad09eaa5def46d679c1b909d16479f69cfbad0299937479ab03346841a8f43c5a3f2c5ae2ef0c2049efd7793402a0f4a30fdd9127786509532
7
+ data.tar.gz: 01a491d6cc5b9208b8467c7d19b6ed4c53ae677c6bb7606a753d9e1aef4a39b0eed54a651329017ce08b376a5d1716a8bef841f125ca46fcb034e146bf50f8c7
data/README.md CHANGED
@@ -6,32 +6,53 @@ Static publishing to S3 based on SQS messages.
6
6
 
7
7
  ## Dependencies
8
8
 
9
- - JRuby 1.7.8
10
- - An AWS account (you'll need to create):
11
- - An S3 bucket
12
- - An SQS Queue (if no sequence id provided then `sequence_id` will be used)
13
- - A Dynamo DB table (optional, will attempt to create if can't be found)
9
+ - JRuby 1.7.8+
10
+ - An AWS account, with:
11
+ - S3 bucket.
12
+ - SQS Queue.
13
+ - Dynamo DB table.
14
14
 
15
15
  ## Migrating from [Alephant::Publisher](https://github.com/BBC-News/alephant-publisher)
16
16
 
17
- 1. Add the new gem in your Gemfile (`gem 'alephant-publisher-queue'`).
18
- 2. Run `bundle install`.
19
- 3. Require the new gem in your app (`require 'alephant/publisher/queue'`).
20
- 4. Note that the namespace has changed from `Alephant::Publisher` to `Alephant::Publisher::Queue`.
17
+ Add the new gem in your Gemfile:
18
+
19
+ ```
20
+ gem 'alephant-publisher-queue'
21
+ ```
22
+
23
+ Run:
24
+
25
+ ```
26
+ bundle install
27
+ ```
28
+
29
+ Require the new gem in your app:
30
+
31
+ ```
32
+ require 'alephant/publisher/queue'
33
+ ```
34
+
35
+ **Important** - note that the namespace has changed from `Alephant::Publisher` to `Alephant::Publisher::Queue`.
21
36
 
22
37
  ## Installation
23
38
 
24
39
  Add this line to your application's Gemfile:
25
40
 
26
- gem 'alephant-publisher-queue'
41
+ ```
42
+ gem 'alephant-publisher-queue'
43
+ ```
27
44
 
28
45
  And then execute:
29
46
 
30
- $ bundle
47
+ ```
48
+ bundle
49
+ ```
31
50
 
32
51
  Or install it yourself as:
33
52
 
34
- $ gem install alephant-publisher-queue
53
+ ```
54
+ gem install alephant-publisher-queue
55
+ ```
35
56
 
36
57
  ## Setup
37
58
 
@@ -42,185 +63,103 @@ access_key_id: ACCESS_KEY_ID
42
63
  secret_access_key: SECRET_ACCESS_KEY
43
64
  ```
44
65
 
45
- ## Usage
46
-
47
- **In your application:**
48
-
49
- ```rb
50
- require 'alephant'
51
-
52
- sequential_proc = Proc.new do |last_seen_id, data|
53
- last_seen_id < data['sequence_id'].to_i
54
- end
55
-
56
- set_last_seen_proc = Proc.new do |data|
57
- data['sequence_id'].to_i
58
- end
59
-
60
- opts = {
61
- :s3_bucket_id => 'bucket-id',
62
- :s3_object_path => 'path/to/object',
63
- :s3_object_id => 'object_id',
64
- :sequencer_table_name => 'your_dynamo_db_table',
65
- :sqs_queue_url => 'https://your_amazon_sqs_queue_url',
66
- :sequential_proc => sequential_proc,
67
- :set_last_seen_proc => set_last_seen_proc,
68
- :lookup_table_name => 'your_lookup_table'
69
- }
70
-
71
- logger = Logger.new
72
-
73
- thread = Alephant::Alephant.new(opts, logger).run!
74
- thread.join
75
- ```
76
-
77
- Publisher requires both queue options and writer options to be provided. To ensure a standard format you should use the `Options` class to generate your options before passing them onto the Publisher...
78
-
79
- ```ruby
80
- opts = Alephant::Publisher::Options.new
81
- # => #<Alephant::Publisher::Options:0x0602f958 @queue={}, @writer={}>
82
-
83
- opts.queue
84
- # => {}
85
- # empty to start with
86
-
87
- opts.writer
88
- # => {}
89
- # empty to start with
90
-
91
- opts.add_queue(:foo => "bar")
92
- # The key 'foo' is invalid
93
- # => nil
94
-
95
- opts.queue
96
- # => {}
97
- # still empty as the foo key was invalid
98
-
99
- opts.add_queue(:sqs_queue_url => "bar")
100
- # => {:sqs_queue_url=>"bar"}
101
-
102
- opts.queue
103
- # => {:sqs_queue_url=>"bar"}
104
-
105
- opts.add_writer(:sqs_queue_url => "bar")
106
- # The key 'sqs_queue_url' is invalid
107
- # => nil
108
- # the sqs_queue_url key was valid for the queue options,
109
- # but is invalid when trying to add it to the writer options
110
-
111
- opts.add_writer(:msg_vary_id_path => "bar")
112
- => {:msg_vary_id_path=>"bar"}
113
-
114
- opts.writer
115
- => {:msg_vary_id_path=>"bar"}
116
- ```
117
-
118
- logger is optional, and must confirm to the Ruby standard logger interface
66
+ ## Structure
119
67
 
120
- Provide a view in a folder (fixtures are optional):
68
+ Provide a view and template:
121
69
 
122
70
  ```
123
71
  └── views
124
72
  ├── models
125
-    └── foo.rb
126
- ├── fixtures
127
- │   └── foo.json
73
+ └── foo.rb
128
74
  └── templates
129
75
  └── foo.mustache
130
76
  ```
131
77
 
132
- **SQS Message Format**
133
-
134
- ```json
135
- {
136
- "content": "hello world",
137
- "sequential_id": 1
138
- }
139
- ```
140
-
141
78
  **foo.rb**
142
79
 
143
- ```rb
144
- module MyApp
145
- module Views
146
- class Foo < Alephant::Views::Base
147
- def content
148
- @data['content']
149
- end
150
- end
80
+ ```ruby
81
+ class Foo < Alephant::Views::Base
82
+ def content
83
+ @data['content']
151
84
  end
152
85
  end
153
86
  ```
154
87
 
155
88
  **foo.mustache**
156
89
 
157
- ```mustache
158
- {{content}}
159
- ```
160
-
161
- **S3 Output**
162
-
163
90
  ```
164
- hello world
91
+ {{ content }}
165
92
  ```
166
93
 
167
- ## Build the gem locally
168
-
169
- If you want to test a modified version of the gem within your application without publishing it then you can follow these steps...
170
-
171
- - `gem uninstall alephant-publisher-queue`
172
- - `gem build alephant-publisher-queue.gemspec` (this will report the file generated which you reference in the next command)
173
- - `gem install ./alephant-publisher-queue-0.0.1.gem`
174
-
175
- Now you can test the gem from within your application as you've installed the gem from the local version rather than your published version
176
-
177
- ## Preview Server
178
-
179
- `alephant preview`
180
-
181
- The included preview server allows you to see the html generated by your
182
- templates, both standalone and in the context of a page.
183
-
184
- **Standalone**
185
-
186
- `/component/:id/?:fixture?`
187
-
188
- ### Full page preview
189
-
190
- When viewing the component in the context of a page, you'll need to retrieve a
191
- mustache template to provide the page context.
94
+ ## Usage
192
95
 
193
- When performing an update a regex is applied to replace the static hostnames in
194
- the retrieved html.
96
+ ```ruby
97
+ require "alephant/logger"
98
+ require "alephant/publisher/queue"
195
99
 
196
- **Environment Variables**
100
+ module MyApp
101
+ def self.run!
102
+ loop do
103
+ Alephant::Publisher::Queue.create(options).run!
104
+ rescue => e
105
+ Alephant::Logger.get_logger.warn "Error: #{e.message}"
106
+ end
107
+ end
197
108
 
198
- ```sh
199
- STATIC_HOST_REGEX="static.(sandbox.dev|int|test|stage|live).yourapp(i)?.com\/"
200
- PREVIEW_TEMPLATE_URL="http://yourapp.com/template"
109
+ private
110
+
111
+ def self.options
112
+ Alephant::Publisher::Queue::Options.new.tap do |opts|
113
+ opts.add_queue(
114
+ :aws_account_id => 'example',
115
+ :sqs_queue_name => 'test_queue'
116
+ )
117
+ opts.add_writer(
118
+ :keep_all_messages => 'false',
119
+ :lookup_table_name => 'lookup-dynamo-table',
120
+ :renderer_id => 'renderer-id',
121
+ :s3_bucket_id => 'bucket-id',
122
+ :s3_object_path => 'example-s3-path',
123
+ :sequence_id_path => '$.sequential_id',
124
+ :sequencer_table_name => 'sequence-dynamo-table',
125
+ :view_path => 'path/to/views'
126
+ )
127
+ end
128
+ end
129
+ end
201
130
  ```
202
131
 
203
- **Example Remote Template**
132
+ Add a message to your SQS queue, with the following format:
204
133
 
205
- `id` is the component/folder name
134
+ ```json
135
+ {
136
+ "content": "Hello World!",
137
+ "sequential_id": 1
138
+ }
139
+ ```
206
140
 
207
- `template` is the mustache template file name
141
+ Output:
208
142
 
209
- `location_in_page` should be something like (for example) `page_head` (specified within a `preview.mustache` file that the consuming application needs to create).
143
+ ```
144
+ Hello World!
145
+ ```
210
146
 
211
- - `http://localhost:4567/component/id/template`
212
- - `http://localhost:4567/preview/id/template/location_in_page`
147
+ S3 Path:
213
148
 
214
- `alephant update`
149
+ ```
150
+ S3 / bucket-id / example-s3-path / renderer-id / foo / 7e0c33c476b1089500d5f172102ec03e / 1
151
+ ```
215
152
 
216
- **In page**
153
+ ## Preview Server
217
154
 
218
- `/preview/:id/:region/?:fixture?`
155
+ [Alephant Preview](https://github.com/BBC-News/alephant-preview) allows you to see the HTML generated by your templates, both standalone and in the context of a page.
219
156
 
220
157
  ## Contributing
221
158
 
222
159
  1. [Fork it!](http://github.com/BBC-News/alephant-publisher-queue/fork)
223
- 2. Create your feature branch (`git checkout -b my-new-feature`)
224
- 3. Commit your changes (`git commit -am 'Add some feature'`)
225
- 4. Push to the branch (`git push origin my-new-feature`)
226
- 5. Create new Pull Request
160
+ 2. Create your feature branch: `git checkout -b my-new-feature`
161
+ 3. Commit your changes: `git commit -am 'Add some feature'`
162
+ 4. Push to the branch: `git push origin my-new-feature`
163
+ 5. Create new [Pull Request](https://github.com/BBC-News/alephant-publisher-queue/compare).
164
+
165
+ Feel free to create an [issue](https://github.com/BBC-News/alephant-publisher-queue/issues/new) if you find a bug.
@@ -7,6 +7,8 @@ module Alephant
7
7
  class InvalidKeySpecifiedError < StandardError; end
8
8
 
9
9
  class Options
10
+ include Logger
11
+
10
12
  attr_reader :queue, :writer
11
13
 
12
14
  QUEUE_OPTS = [
@@ -47,6 +49,7 @@ module Alephant
47
49
  validate type, opts
48
50
  instance.merge! opts
49
51
  rescue Exception => e
52
+ logger.metric(:name => "PublisherQueueInvalidKeySpecifiedError", :unit => "Count", :value => 1)
50
53
  puts e.message
51
54
  end
52
55
  end
@@ -36,6 +36,7 @@ module Alephant
36
36
  def archive(m)
37
37
  archiver.see(m) unless archiver.nil?
38
38
  rescue StandardError => e
39
+ logger.metric(:name => "PublisherQueueSQSHelperArchiveFailed", :unit => "Count", :value => 1)
39
40
  logger.warn("Queue#archive: archive failed (#{e.message})");
40
41
  end
41
42
 
@@ -1,7 +1,7 @@
1
1
  module Alephant
2
2
  module Publisher
3
3
  module Queue
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,262 +1,262 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alephant-publisher-queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - revett
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-14 00:00:00.000000000 Z
11
+ date: 2014-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: bundler
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - ~>
17
18
  - !ruby/object:Gem::Version
18
19
  version: '1.5'
19
- name: bundler
20
- prerelease: false
21
20
  type: :development
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: rspec
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
- name: rspec
34
- prerelease: false
35
34
  type: :development
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
+ name: rspec-nc
42
43
  requirement: !ruby/object:Gem::Requirement
43
44
  requirements:
44
45
  - - '>='
45
46
  - !ruby/object:Gem::Version
46
47
  version: '0'
47
- name: rspec-nc
48
- prerelease: false
49
48
  type: :development
49
+ prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
+ name: guard
56
57
  requirement: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - '>='
59
60
  - !ruby/object:Gem::Version
60
61
  version: '0'
61
- name: guard
62
- prerelease: false
63
62
  type: :development
63
+ prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
70
71
  requirement: !ruby/object:Gem::Requirement
71
72
  requirements:
72
73
  - - '>='
73
74
  - !ruby/object:Gem::Version
74
75
  version: '0'
75
- name: guard-rspec
76
- prerelease: false
77
76
  type: :development
77
+ prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
+ name: pry
84
85
  requirement: !ruby/object:Gem::Requirement
85
86
  requirements:
86
87
  - - '>='
87
88
  - !ruby/object:Gem::Version
88
89
  version: '0'
89
- name: pry
90
- prerelease: false
91
90
  type: :development
91
+ prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
+ name: pry-remote
98
99
  requirement: !ruby/object:Gem::Requirement
99
100
  requirements:
100
101
  - - '>='
101
102
  - !ruby/object:Gem::Version
102
103
  version: '0'
103
- name: pry-remote
104
- prerelease: false
105
104
  type: :development
105
+ prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
+ name: pry-nav
112
113
  requirement: !ruby/object:Gem::Requirement
113
114
  requirements:
114
115
  - - '>='
115
116
  - !ruby/object:Gem::Version
116
117
  version: '0'
117
- name: pry-nav
118
- prerelease: false
119
118
  type: :development
119
+ prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
+ name: rake-rspec
126
127
  requirement: !ruby/object:Gem::Requirement
127
128
  requirements:
128
129
  - - '>='
129
130
  - !ruby/object:Gem::Version
130
131
  version: '0'
131
- name: rake-rspec
132
- prerelease: false
133
132
  type: :development
133
+ prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '>='
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
+ name: rake
140
141
  requirement: !ruby/object:Gem::Requirement
141
142
  requirements:
142
143
  - - '>='
143
144
  - !ruby/object:Gem::Version
144
145
  version: '0'
145
- name: rake
146
- prerelease: false
147
146
  type: :runtime
147
+ prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - '>='
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
+ name: aws-sdk
154
155
  requirement: !ruby/object:Gem::Requirement
155
156
  requirements:
156
157
  - - ~>
157
158
  - !ruby/object:Gem::Version
158
159
  version: '1.0'
159
- name: aws-sdk
160
- prerelease: false
161
160
  type: :runtime
161
+ prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - ~>
165
165
  - !ruby/object:Gem::Version
166
166
  version: '1.0'
167
167
  - !ruby/object:Gem::Dependency
168
+ name: crimp
168
169
  requirement: !ruby/object:Gem::Requirement
169
170
  requirements:
170
171
  - - '>='
171
172
  - !ruby/object:Gem::Version
172
173
  version: '0'
173
- name: crimp
174
- prerelease: false
175
174
  type: :runtime
175
+ prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - '>='
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  - !ruby/object:Gem::Dependency
182
+ name: alephant-support
182
183
  requirement: !ruby/object:Gem::Requirement
183
184
  requirements:
184
185
  - - '>='
185
186
  - !ruby/object:Gem::Version
186
187
  version: '0'
187
- name: alephant-support
188
- prerelease: false
189
188
  type: :runtime
189
+ prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - '>='
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  - !ruby/object:Gem::Dependency
196
+ name: alephant-sequencer
196
197
  requirement: !ruby/object:Gem::Requirement
197
198
  requirements:
198
199
  - - '>='
199
200
  - !ruby/object:Gem::Version
200
201
  version: '0'
201
- name: alephant-sequencer
202
- prerelease: false
203
202
  type: :runtime
203
+ prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - '>='
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
209
  - !ruby/object:Gem::Dependency
210
+ name: alephant-cache
210
211
  requirement: !ruby/object:Gem::Requirement
211
212
  requirements:
212
213
  - - '>='
213
214
  - !ruby/object:Gem::Version
214
215
  version: '0'
215
- name: alephant-cache
216
- prerelease: false
217
216
  type: :runtime
217
+ prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
220
  - - '>='
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  - !ruby/object:Gem::Dependency
224
+ name: alephant-logger
224
225
  requirement: !ruby/object:Gem::Requirement
225
226
  requirements:
226
227
  - - '>='
227
228
  - !ruby/object:Gem::Version
228
229
  version: '0'
229
- name: alephant-logger
230
- prerelease: false
231
230
  type: :runtime
231
+ prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - '>='
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
+ name: alephant-lookup
238
239
  requirement: !ruby/object:Gem::Requirement
239
240
  requirements:
240
241
  - - '>='
241
242
  - !ruby/object:Gem::Version
242
243
  version: '0'
243
- name: alephant-lookup
244
- prerelease: false
245
244
  type: :runtime
245
+ prerelease: false
246
246
  version_requirements: !ruby/object:Gem::Requirement
247
247
  requirements:
248
248
  - - '>='
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
251
  - !ruby/object:Gem::Dependency
252
+ name: alephant-renderer
252
253
  requirement: !ruby/object:Gem::Requirement
253
254
  requirements:
254
255
  - - ~>
255
256
  - !ruby/object:Gem::Version
256
257
  version: 0.1.0
257
- name: alephant-renderer
258
- prerelease: false
259
258
  type: :runtime
259
+ prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
262
  - - ~>
@@ -296,7 +296,7 @@ homepage: https://github.com/BBC-News/alephant-publisher-queue
296
296
  licenses:
297
297
  - MIT
298
298
  metadata: {}
299
- post_install_message:
299
+ post_install_message:
300
300
  rdoc_options: []
301
301
  require_paths:
302
302
  - lib
@@ -311,9 +311,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
311
311
  - !ruby/object:Gem::Version
312
312
  version: '0'
313
313
  requirements: []
314
- rubyforge_project:
315
- rubygems_version: 2.1.9
316
- signing_key:
314
+ rubyforge_project:
315
+ rubygems_version: 2.0.14
316
+ signing_key:
317
317
  specification_version: 4
318
318
  summary: Static publishing to S3 based on SQS messages
319
319
  test_files: